@arborium/arborium 0.0.7
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/dist/arborium.iife.js +115 -0
- package/dist/arborium.iife.js.map +1 -0
- package/dist/arborium.js +359 -0
- package/dist/arborium.js.map +1 -0
- package/dist/detect.d.ts +17 -0
- package/dist/iife.d.ts +11 -0
- package/dist/index.d.ts +8 -0
- package/dist/loader.d.ts +12 -0
- package/dist/themes/github-light.css +123 -0
- package/dist/themes/tokyo-night.css +122 -0
- package/dist/types.d.ts +51 -0
- package/dist/wasi-shims.d.ts +77 -0
- package/package.json +53 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { detectLanguage as C, highlight as y, loadGrammar as k, getConfig as b, normalizeLanguage as h, extractLanguageFromClass as A } from "./arborium.js";
|
|
2
|
+
const u = document.currentScript;
|
|
3
|
+
function B() {
|
|
4
|
+
if (!u) return {};
|
|
5
|
+
const t = {};
|
|
6
|
+
u.hasAttribute("data-manual") && (t.manual = !0);
|
|
7
|
+
const n = u.getAttribute("data-theme");
|
|
8
|
+
n && (t.theme = n);
|
|
9
|
+
const r = u.getAttribute("data-selector");
|
|
10
|
+
r && (t.selector = r);
|
|
11
|
+
const o = u.getAttribute("data-cdn");
|
|
12
|
+
o && (t.cdn = o);
|
|
13
|
+
const e = u.getAttribute("data-version");
|
|
14
|
+
return e && (t.version = e), t;
|
|
15
|
+
}
|
|
16
|
+
function d() {
|
|
17
|
+
const t = window.Arborium || {}, n = B();
|
|
18
|
+
return b({ ...t, ...n });
|
|
19
|
+
}
|
|
20
|
+
function x(t) {
|
|
21
|
+
return Array.from(document.querySelectorAll(t));
|
|
22
|
+
}
|
|
23
|
+
function L(t) {
|
|
24
|
+
const n = t.getAttribute("data-lang");
|
|
25
|
+
if (n) return h(n);
|
|
26
|
+
const r = t.className, o = A(r);
|
|
27
|
+
if (o) return h(o);
|
|
28
|
+
const e = t.parentElement;
|
|
29
|
+
if (e) {
|
|
30
|
+
const g = e.getAttribute("data-lang");
|
|
31
|
+
if (g) return h(g);
|
|
32
|
+
const c = A(e.className);
|
|
33
|
+
if (c) return h(c);
|
|
34
|
+
}
|
|
35
|
+
const i = t.textContent || "";
|
|
36
|
+
return C(i);
|
|
37
|
+
}
|
|
38
|
+
function E(t) {
|
|
39
|
+
const n = `arborium-theme-${t}`;
|
|
40
|
+
if (document.getElementById(n)) return;
|
|
41
|
+
const r = d(), o = r.cdn, e = r.version;
|
|
42
|
+
let i;
|
|
43
|
+
o === "jsdelivr" ? i = "https://cdn.jsdelivr.net/npm" : o === "unpkg" ? i = "https://unpkg.com" : i = o;
|
|
44
|
+
const g = e === "latest" ? "" : `@${e}`, c = `${i}/@arborium/arborium${g}/dist/themes/${t}.css`, l = document.createElement("link");
|
|
45
|
+
l.id = n, l.rel = "stylesheet", l.href = c, document.head.appendChild(l);
|
|
46
|
+
}
|
|
47
|
+
async function $(t, n, r) {
|
|
48
|
+
const o = t.textContent || "";
|
|
49
|
+
if (o.trim())
|
|
50
|
+
try {
|
|
51
|
+
const e = await y(n, o, r);
|
|
52
|
+
t.innerHTML = e, t.setAttribute("data-highlighted", "true"), t.setAttribute("data-lang", n);
|
|
53
|
+
} catch (e) {
|
|
54
|
+
console.warn(`[arborium] Failed to highlight ${n}:`, e);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
async function p() {
|
|
58
|
+
const t = d();
|
|
59
|
+
E(t.theme);
|
|
60
|
+
const n = x(t.selector);
|
|
61
|
+
if (n.length === 0) return;
|
|
62
|
+
const r = /* @__PURE__ */ new Map(), o = [];
|
|
63
|
+
for (const a of n) {
|
|
64
|
+
if (a.hasAttribute("data-highlighted")) continue;
|
|
65
|
+
const s = L(a);
|
|
66
|
+
if (s) {
|
|
67
|
+
const f = r.get(s) || [];
|
|
68
|
+
f.push(a), r.set(s, f);
|
|
69
|
+
} else
|
|
70
|
+
o.push(a);
|
|
71
|
+
}
|
|
72
|
+
const e = Array.from(r.keys()), i = e.map(
|
|
73
|
+
(a) => k(a, t).catch((s) => (console.warn(`[arborium] Failed to load grammar for ${a}:`, s), null))
|
|
74
|
+
), g = await Promise.all(i), c = [];
|
|
75
|
+
for (let a = 0; a < e.length; a++) {
|
|
76
|
+
const s = e[a];
|
|
77
|
+
if (!g[a]) continue;
|
|
78
|
+
const v = r.get(s) || [];
|
|
79
|
+
for (const S of v)
|
|
80
|
+
c.push($(S, s, t));
|
|
81
|
+
}
|
|
82
|
+
await Promise.all(c);
|
|
83
|
+
const l = n.length, w = n.filter(
|
|
84
|
+
(a) => a.hasAttribute("data-highlighted")
|
|
85
|
+
).length, m = o.length;
|
|
86
|
+
(w > 0 || m > 0) && console.debug(
|
|
87
|
+
`[arborium] Highlighted ${w}/${l} blocks` + (m > 0 ? ` (${m} unknown language)` : "")
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
async function F(t) {
|
|
91
|
+
b({ ...d(), ...t }), await p();
|
|
92
|
+
}
|
|
93
|
+
async function M(t, n, r) {
|
|
94
|
+
const o = b({ ...d(), ...r }), e = n || L(t);
|
|
95
|
+
if (!e) {
|
|
96
|
+
console.warn("[arborium] Could not detect language for element");
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
await $(t, e, o);
|
|
100
|
+
}
|
|
101
|
+
window.arborium = {
|
|
102
|
+
highlightAll: F,
|
|
103
|
+
highlightElement: M,
|
|
104
|
+
loadGrammar: k,
|
|
105
|
+
highlight: y,
|
|
106
|
+
detectLanguage: C,
|
|
107
|
+
config: d()
|
|
108
|
+
};
|
|
109
|
+
const P = d();
|
|
110
|
+
P.manual || (document.readyState === "loading" ? document.addEventListener("DOMContentLoaded", () => p()) : p());
|
|
111
|
+
export {
|
|
112
|
+
F as highlightAll,
|
|
113
|
+
M as highlightElement
|
|
114
|
+
};
|
|
115
|
+
//# sourceMappingURL=arborium.iife.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arborium.iife.js","sources":["../src/iife.ts"],"sourcesContent":["/**\n * @arborium/arborium IIFE bundle\n *\n * Drop-in auto-highlighter that runs on page load.\n * Configuration via data attributes or window.Arborium object.\n */\n\nimport { loadGrammar, highlight, getConfig, defaultConfig } from './loader.js';\nimport {\n detectLanguage,\n extractLanguageFromClass,\n normalizeLanguage,\n} from './detect.js';\nimport type { ArboriumConfig } from './types.js';\n\n// Capture current script immediately (before any async operations)\nconst currentScript = document.currentScript as HTMLScriptElement | null;\n\n/** Parse configuration from script data attributes */\nfunction getConfigFromScript(): Partial<ArboriumConfig> {\n if (!currentScript) return {};\n\n const config: Partial<ArboriumConfig> = {};\n\n if (currentScript.hasAttribute('data-manual')) {\n config.manual = true;\n }\n\n const theme = currentScript.getAttribute('data-theme');\n if (theme) config.theme = theme;\n\n const selector = currentScript.getAttribute('data-selector');\n if (selector) config.selector = selector;\n\n const cdn = currentScript.getAttribute('data-cdn');\n if (cdn) config.cdn = cdn;\n\n const version = currentScript.getAttribute('data-version');\n if (version) config.version = version;\n\n return config;\n}\n\n/** Get merged configuration from all sources */\nfunction getMergedConfig(): Required<ArboriumConfig> {\n // Priority: data attributes > window.Arborium > defaults\n const windowConfig = window.Arborium || {};\n const scriptConfig = getConfigFromScript();\n return getConfig({ ...windowConfig, ...scriptConfig });\n}\n\n/** Find all code blocks that need highlighting */\nfunction findCodeBlocks(selector: string): HTMLElement[] {\n return Array.from(document.querySelectorAll(selector));\n}\n\n/** Get the language for a code block */\nfunction getLanguageForBlock(block: HTMLElement): string | null {\n // Check data-lang attribute\n const dataLang = block.getAttribute('data-lang');\n if (dataLang) return normalizeLanguage(dataLang);\n\n // Check class=\"language-*\"\n const className = block.className;\n const classLang = extractLanguageFromClass(className);\n if (classLang) return normalizeLanguage(classLang);\n\n // Check parent element (often <pre> wraps <code>)\n const parent = block.parentElement;\n if (parent) {\n const parentDataLang = parent.getAttribute('data-lang');\n if (parentDataLang) return normalizeLanguage(parentDataLang);\n\n const parentClassLang = extractLanguageFromClass(parent.className);\n if (parentClassLang) return normalizeLanguage(parentClassLang);\n }\n\n // Try auto-detection\n const source = block.textContent || '';\n return detectLanguage(source);\n}\n\n/** Inject theme CSS if not already present */\nfunction injectThemeCSS(theme: string): void {\n const themeId = `arborium-theme-${theme}`;\n if (document.getElementById(themeId)) return;\n\n // Get the base URL for CSS\n const config = getMergedConfig();\n const cdn = config.cdn;\n const version = config.version;\n\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\n const versionSuffix = version === 'latest' ? '' : `@${version}`;\n const cssUrl = `${baseUrl}/@arborium/arborium${versionSuffix}/dist/themes/${theme}.css`;\n\n const link = document.createElement('link');\n link.id = themeId;\n link.rel = 'stylesheet';\n link.href = cssUrl;\n document.head.appendChild(link);\n}\n\n/** Highlight a single code block */\nasync function highlightBlock(\n block: HTMLElement,\n language: string,\n config: ArboriumConfig\n): Promise<void> {\n const source = block.textContent || '';\n if (!source.trim()) return;\n\n try {\n const html = await highlight(language, source, config);\n block.innerHTML = html;\n block.setAttribute('data-highlighted', 'true');\n block.setAttribute('data-lang', language);\n } catch (err) {\n console.warn(`[arborium] Failed to highlight ${language}:`, err);\n // Don't modify the block on error\n }\n}\n\n/** Main auto-highlight function */\nasync function autoHighlight(): Promise<void> {\n const config = getMergedConfig();\n\n // Inject theme CSS\n injectThemeCSS(config.theme);\n\n // Find all code blocks\n const blocks = findCodeBlocks(config.selector);\n if (blocks.length === 0) return;\n\n // Group blocks by language\n const blocksByLanguage = new Map<string, HTMLElement[]>();\n const unknownBlocks: HTMLElement[] = [];\n\n for (const block of blocks) {\n // Skip already highlighted blocks\n if (block.hasAttribute('data-highlighted')) continue;\n\n const language = getLanguageForBlock(block);\n if (language) {\n const existing = blocksByLanguage.get(language) || [];\n existing.push(block);\n blocksByLanguage.set(language, existing);\n } else {\n unknownBlocks.push(block);\n }\n }\n\n // Load grammars in parallel for all detected languages\n const languages = Array.from(blocksByLanguage.keys());\n const loadPromises = languages.map((lang) =>\n loadGrammar(lang, config).catch((err) => {\n console.warn(`[arborium] Failed to load grammar for ${lang}:`, err);\n return null;\n })\n );\n\n // Wait for all grammars to load\n const grammars = await Promise.all(loadPromises);\n\n // Highlight blocks for each loaded grammar\n const highlightPromises: Promise<void>[] = [];\n\n for (let i = 0; i < languages.length; i++) {\n const language = languages[i];\n const grammar = grammars[i];\n if (!grammar) continue;\n\n const languageBlocks = blocksByLanguage.get(language) || [];\n for (const block of languageBlocks) {\n highlightPromises.push(highlightBlock(block, language, config));\n }\n }\n\n // Wait for all highlighting to complete\n await Promise.all(highlightPromises);\n\n // Log summary\n const total = blocks.length;\n const highlighted = blocks.filter((b) =>\n b.hasAttribute('data-highlighted')\n ).length;\n const skipped = unknownBlocks.length;\n\n if (highlighted > 0 || skipped > 0) {\n console.debug(\n `[arborium] Highlighted ${highlighted}/${total} blocks` +\n (skipped > 0 ? ` (${skipped} unknown language)` : '')\n );\n }\n}\n\n/** Public API for manual highlighting */\nexport async function highlightAll(config?: ArboriumConfig): Promise<void> {\n const mergedConfig = getConfig({ ...getMergedConfig(), ...config });\n await autoHighlight();\n}\n\n/** Public API for highlighting a specific element */\nexport async function highlightElement(\n element: HTMLElement,\n language?: string,\n config?: ArboriumConfig\n): Promise<void> {\n const mergedConfig = getConfig({ ...getMergedConfig(), ...config });\n const lang = language || getLanguageForBlock(element);\n\n if (!lang) {\n console.warn('[arborium] Could not detect language for element');\n return;\n }\n\n await highlightBlock(element, lang, mergedConfig);\n}\n\n// Expose public API on window\n(window as any).arborium = {\n highlightAll,\n highlightElement,\n loadGrammar,\n highlight,\n detectLanguage,\n config: getMergedConfig(),\n};\n\n// Auto-highlight on DOMContentLoaded (unless manual mode)\nconst config = getMergedConfig();\nif (!config.manual) {\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', () => autoHighlight());\n } else {\n // DOM already loaded\n autoHighlight();\n }\n}\n"],"names":["currentScript","getConfigFromScript","config","theme","selector","cdn","version","getMergedConfig","windowConfig","scriptConfig","getConfig","findCodeBlocks","getLanguageForBlock","block","dataLang","normalizeLanguage","className","classLang","extractLanguageFromClass","parent","parentDataLang","parentClassLang","source","detectLanguage","injectThemeCSS","themeId","baseUrl","versionSuffix","cssUrl","link","highlightBlock","language","html","highlight","err","autoHighlight","blocks","blocksByLanguage","unknownBlocks","existing","languages","loadPromises","lang","loadGrammar","grammars","highlightPromises","i","languageBlocks","total","highlighted","b","skipped","highlightAll","highlightElement","element","mergedConfig"],"mappings":"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"}
|
package/dist/arborium.js
ADDED
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
class m extends Error {
|
|
2
|
+
constructor(t) {
|
|
3
|
+
super(t), this.name = "WasiError";
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
class l {
|
|
7
|
+
write(t) {
|
|
8
|
+
return BigInt(0);
|
|
9
|
+
}
|
|
10
|
+
blockingWriteAndFlush(t) {
|
|
11
|
+
}
|
|
12
|
+
blockingFlush() {
|
|
13
|
+
}
|
|
14
|
+
checkWrite() {
|
|
15
|
+
return BigInt(1024 * 1024);
|
|
16
|
+
}
|
|
17
|
+
subscribe() {
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
class w {
|
|
21
|
+
read(t) {
|
|
22
|
+
return new Uint8Array(0);
|
|
23
|
+
}
|
|
24
|
+
blockingRead(t) {
|
|
25
|
+
return new Uint8Array(0);
|
|
26
|
+
}
|
|
27
|
+
subscribe() {
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function k() {
|
|
31
|
+
const s = new l(), t = new l(), n = new w();
|
|
32
|
+
return {
|
|
33
|
+
"wasi:cli/environment@0.2.3": {
|
|
34
|
+
getEnvironment() {
|
|
35
|
+
return [];
|
|
36
|
+
},
|
|
37
|
+
getArguments() {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"wasi:cli/exit@0.2.3": {
|
|
42
|
+
exit(e) {
|
|
43
|
+
if (e.tag === "err")
|
|
44
|
+
throw new m(`WASI exit with error: ${e.val}`);
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
"wasi:cli/stdin@0.2.3": {
|
|
48
|
+
getStdin() {
|
|
49
|
+
return n;
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
"wasi:cli/stdout@0.2.3": {
|
|
53
|
+
getStdout() {
|
|
54
|
+
return s;
|
|
55
|
+
}
|
|
56
|
+
},
|
|
57
|
+
"wasi:cli/stderr@0.2.3": {
|
|
58
|
+
getStderr() {
|
|
59
|
+
return t;
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"wasi:clocks/wall-clock@0.2.3": {
|
|
63
|
+
now() {
|
|
64
|
+
const e = Date.now();
|
|
65
|
+
return {
|
|
66
|
+
seconds: BigInt(Math.floor(e / 1e3)),
|
|
67
|
+
nanoseconds: e % 1e3 * 1e6
|
|
68
|
+
};
|
|
69
|
+
},
|
|
70
|
+
resolution() {
|
|
71
|
+
return { seconds: BigInt(0), nanoseconds: 1e6 };
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
"wasi:filesystem/types@0.2.3": {
|
|
75
|
+
// Stub - grammar plugins shouldn't use filesystem
|
|
76
|
+
Descriptor: class {
|
|
77
|
+
},
|
|
78
|
+
DirectoryEntryStream: class {
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
"wasi:filesystem/preopens@0.2.3": {
|
|
82
|
+
getDirectories() {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
"wasi:io/error@0.2.3": {
|
|
87
|
+
Error: m
|
|
88
|
+
},
|
|
89
|
+
"wasi:io/streams@0.2.3": {
|
|
90
|
+
InputStream: w,
|
|
91
|
+
OutputStream: l
|
|
92
|
+
},
|
|
93
|
+
"wasi:random/random@0.2.3": {
|
|
94
|
+
getRandomBytes(e) {
|
|
95
|
+
const r = new Uint8Array(Number(e));
|
|
96
|
+
return crypto.getRandomValues(r), r;
|
|
97
|
+
},
|
|
98
|
+
getRandomU64() {
|
|
99
|
+
const e = new Uint8Array(8);
|
|
100
|
+
return crypto.getRandomValues(e), new DataView(e.buffer).getBigUint64(0, !0);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const x = {
|
|
106
|
+
"arborium:grammar/types@0.1.0": {
|
|
107
|
+
// Types are just interfaces, nothing to export
|
|
108
|
+
}
|
|
109
|
+
}, d = {
|
|
110
|
+
jsdelivr: "https://cdn.jsdelivr.net/npm",
|
|
111
|
+
unpkg: "https://unpkg.com"
|
|
112
|
+
}, f = /* @__PURE__ */ new Map(), u = /* @__PURE__ */ new Map(), p = {
|
|
113
|
+
manual: !1,
|
|
114
|
+
theme: "tokyo-night",
|
|
115
|
+
selector: "pre code, code[data-lang]",
|
|
116
|
+
cdn: "jsdelivr",
|
|
117
|
+
version: "latest"
|
|
118
|
+
};
|
|
119
|
+
function E(s) {
|
|
120
|
+
return s in d ? d[s] : s;
|
|
121
|
+
}
|
|
122
|
+
function g(s, t, n) {
|
|
123
|
+
const e = n.cdn || p.cdn, r = n.version || p.version, a = E(e), i = r === "latest" ? "" : `@${r}`;
|
|
124
|
+
return `${a}/@arborium/${s}${i}/${t}`;
|
|
125
|
+
}
|
|
126
|
+
class S {
|
|
127
|
+
plugin;
|
|
128
|
+
session = null;
|
|
129
|
+
constructor(t) {
|
|
130
|
+
this.plugin = t;
|
|
131
|
+
}
|
|
132
|
+
languageId() {
|
|
133
|
+
return this.plugin.languageId();
|
|
134
|
+
}
|
|
135
|
+
injectionLanguages() {
|
|
136
|
+
return this.plugin.injectionLanguages();
|
|
137
|
+
}
|
|
138
|
+
parse(t) {
|
|
139
|
+
const n = this.plugin.createSession();
|
|
140
|
+
try {
|
|
141
|
+
return this.plugin.setText(n, t), this.plugin.parse(n);
|
|
142
|
+
} finally {
|
|
143
|
+
this.plugin.freeSession(n);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
highlight(t) {
|
|
147
|
+
const n = this.parse(t);
|
|
148
|
+
return j(t, n.spans);
|
|
149
|
+
}
|
|
150
|
+
dispose() {
|
|
151
|
+
this.session !== null && (this.plugin.freeSession(this.session), this.session = null);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
async function I(s, t = {}) {
|
|
155
|
+
const n = f.get(s);
|
|
156
|
+
if (n)
|
|
157
|
+
return n;
|
|
158
|
+
const e = u.get(s);
|
|
159
|
+
if (e)
|
|
160
|
+
return e;
|
|
161
|
+
const r = T(s, t);
|
|
162
|
+
u.set(s, r);
|
|
163
|
+
try {
|
|
164
|
+
const a = await r;
|
|
165
|
+
return f.set(s, a), a;
|
|
166
|
+
} finally {
|
|
167
|
+
u.delete(s);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async function T(s, t) {
|
|
171
|
+
const n = g(s, "grammar.js", t), e = g(s, "grammar.core.wasm", t), r = await import(
|
|
172
|
+
/* @vite-ignore */
|
|
173
|
+
n
|
|
174
|
+
), a = async (b) => {
|
|
175
|
+
const y = b.includes("://") ? b : e, v = await (await fetch(y)).arrayBuffer();
|
|
176
|
+
return WebAssembly.compile(v);
|
|
177
|
+
}, o = {
|
|
178
|
+
...k(),
|
|
179
|
+
...x
|
|
180
|
+
}, h = (await r.instantiate(a, o)).plugin;
|
|
181
|
+
return new S(h);
|
|
182
|
+
}
|
|
183
|
+
function j(s, t) {
|
|
184
|
+
if (t.length === 0)
|
|
185
|
+
return c(s);
|
|
186
|
+
const n = [...t].sort((a, i) => a.start - i.start), e = [];
|
|
187
|
+
let r = 0;
|
|
188
|
+
for (const a of n) {
|
|
189
|
+
a.start > r && e.push(c(s.slice(r, a.start)));
|
|
190
|
+
const i = s.slice(a.start, a.end), o = R(a.capture);
|
|
191
|
+
e.push(`<${o}>${c(i)}</${o}>`), r = a.end;
|
|
192
|
+
}
|
|
193
|
+
return r < s.length && e.push(c(s.slice(r))), e.join("");
|
|
194
|
+
}
|
|
195
|
+
function R(s) {
|
|
196
|
+
const t = {
|
|
197
|
+
keyword: "a-k",
|
|
198
|
+
string: "a-s",
|
|
199
|
+
comment: "a-c",
|
|
200
|
+
function: "a-f",
|
|
201
|
+
"function.call": "a-f",
|
|
202
|
+
"function.method": "a-f",
|
|
203
|
+
type: "a-t",
|
|
204
|
+
variable: "a-v",
|
|
205
|
+
"variable.parameter": "a-v",
|
|
206
|
+
"variable.builtin": "a-vb",
|
|
207
|
+
number: "a-n",
|
|
208
|
+
operator: "a-o",
|
|
209
|
+
punctuation: "a-p",
|
|
210
|
+
"punctuation.bracket": "a-p",
|
|
211
|
+
"punctuation.delimiter": "a-p",
|
|
212
|
+
constant: "a-ct",
|
|
213
|
+
"constant.builtin": "a-cb",
|
|
214
|
+
property: "a-pr",
|
|
215
|
+
attribute: "a-at",
|
|
216
|
+
tag: "a-tg",
|
|
217
|
+
namespace: "a-ns",
|
|
218
|
+
label: "a-lb",
|
|
219
|
+
escape: "a-e",
|
|
220
|
+
embedded: "a-em"
|
|
221
|
+
};
|
|
222
|
+
if (s in t)
|
|
223
|
+
return t[s];
|
|
224
|
+
for (const [n, e] of Object.entries(t))
|
|
225
|
+
if (s.startsWith(n + "."))
|
|
226
|
+
return e;
|
|
227
|
+
return "a-x";
|
|
228
|
+
}
|
|
229
|
+
function c(s) {
|
|
230
|
+
return s.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
231
|
+
}
|
|
232
|
+
async function N(s, t, n = {}) {
|
|
233
|
+
return (await I(s, n)).highlight(t);
|
|
234
|
+
}
|
|
235
|
+
function $(s) {
|
|
236
|
+
return { ...p, ...s };
|
|
237
|
+
}
|
|
238
|
+
const A = [
|
|
239
|
+
[/^#!.*\bpython[23]?\b/, "python"],
|
|
240
|
+
[/^#!.*\bnode\b/, "javascript"],
|
|
241
|
+
[/^#!.*\bdeno\b/, "typescript"],
|
|
242
|
+
[/^#!.*\bbun\b/, "typescript"],
|
|
243
|
+
[/^#!.*\bruby\b/, "ruby"],
|
|
244
|
+
[/^#!.*\bperl\b/, "perl"],
|
|
245
|
+
[/^#!.*\bphp\b/, "php"],
|
|
246
|
+
[/^#!.*\bbash\b/, "bash"],
|
|
247
|
+
[/^#!.*\bzsh\b/, "zsh"],
|
|
248
|
+
[/^#!.*\bsh\b/, "bash"],
|
|
249
|
+
[/^#!.*\blua\b/, "lua"],
|
|
250
|
+
[/^#!.*\bawk\b/, "awk"]
|
|
251
|
+
], C = [
|
|
252
|
+
// Rust - distinctive keywords
|
|
253
|
+
[/\b(fn|impl|trait|pub\s+fn|let\s+mut|&mut|->)\b/, "rust"],
|
|
254
|
+
// Go - distinctive keywords
|
|
255
|
+
[/\b(func|package\s+\w+|import\s+\(|go\s+func|chan\s+\w+)\b/, "go"],
|
|
256
|
+
// Python - distinctive patterns
|
|
257
|
+
[/\b(def\s+\w+\s*\(|import\s+\w+|from\s+\w+\s+import|class\s+\w+:)\b/, "python"],
|
|
258
|
+
// TypeScript - distinctive type annotations
|
|
259
|
+
[/:\s*(string|number|boolean|void)\b|\binterface\s+\w+\s*\{/, "typescript"],
|
|
260
|
+
// JavaScript - distinctive patterns (after TS check)
|
|
261
|
+
[/\b(const|let|var)\s+\w+\s*=|function\s+\w+\s*\(|=>\s*\{/, "javascript"],
|
|
262
|
+
// Ruby - distinctive keywords
|
|
263
|
+
[/\b(def\s+\w+|end\b|do\s*\|.*\||puts\s+|require\s+['"])\b/, "ruby"],
|
|
264
|
+
// Java - distinctive patterns
|
|
265
|
+
[/\b(public\s+class|private\s+\w+|System\.out\.println)\b/, "java"],
|
|
266
|
+
// C++ - distinctive patterns
|
|
267
|
+
[/\b(#include\s*<|std::|template\s*<|nullptr|cout\s*<<)\b/, "cpp"],
|
|
268
|
+
// C - distinctive patterns (after C++ check)
|
|
269
|
+
[/\b(#include\s*[<"]|printf\s*\(|int\s+main\s*\(|void\s+\w+\s*\()\b/, "c"],
|
|
270
|
+
// C# - distinctive patterns
|
|
271
|
+
[/\b(namespace\s+\w+|using\s+System|public\s+static\s+void)\b/, "c-sharp"],
|
|
272
|
+
// PHP - distinctive patterns
|
|
273
|
+
[/<\?php|\$\w+\s*=/, "php"],
|
|
274
|
+
// Swift - distinctive patterns
|
|
275
|
+
[/\b(func\s+\w+|var\s+\w+:\s*\w+|let\s+\w+:\s*\w+|@objc)\b/, "swift"],
|
|
276
|
+
// Kotlin - distinctive patterns
|
|
277
|
+
[/\b(fun\s+\w+|val\s+\w+|var\s+\w+:|data\s+class)\b/, "kotlin"],
|
|
278
|
+
// Scala - distinctive patterns
|
|
279
|
+
[/\b(def\s+\w+|val\s+\w+|var\s+\w+|object\s+\w+|case\s+class)\b/, "scala"],
|
|
280
|
+
// Haskell - distinctive patterns
|
|
281
|
+
[/\b(module\s+\w+|import\s+qualified|data\s+\w+\s*=|::\s*\w+\s*->)\b/, "haskell"],
|
|
282
|
+
// Elixir - distinctive patterns
|
|
283
|
+
[/\b(defmodule\s+\w+|def\s+\w+|defp\s+\w+|\|>)\b/, "elixir"],
|
|
284
|
+
// Lua - distinctive patterns
|
|
285
|
+
[/\b(local\s+\w+\s*=|function\s+\w+\.\w+|require\s*\()\b/, "lua"],
|
|
286
|
+
// SQL - distinctive patterns
|
|
287
|
+
[/\b(SELECT\s+.*\s+FROM|INSERT\s+INTO|CREATE\s+TABLE|ALTER\s+TABLE)\b/i, "sql"],
|
|
288
|
+
// Shell/Bash - distinctive patterns
|
|
289
|
+
[/\b(if\s+\[\s*|then\b|fi\b|echo\s+["']|export\s+\w+=)\b/, "bash"],
|
|
290
|
+
// YAML - distinctive patterns
|
|
291
|
+
[/^\s*[\w-]+:\s*[\w\-"'[{]|^---\s*$/, "yaml"],
|
|
292
|
+
// JSON - distinctive patterns
|
|
293
|
+
[/^\s*\{[\s\S]*"[\w-]+":\s*/, "json"],
|
|
294
|
+
// TOML - distinctive patterns
|
|
295
|
+
[/^\s*\[[\w.-]+\]\s*$|^\s*\w+\s*=\s*["'\d\[]/, "toml"],
|
|
296
|
+
// HTML - distinctive patterns
|
|
297
|
+
[/<(!DOCTYPE|html|head|body|div|span|p|a\s)/i, "html"],
|
|
298
|
+
// CSS - distinctive patterns
|
|
299
|
+
[/^\s*[\w.#@][\w\s,#.:>+~-]*\{[^}]*\}|@media\s|@import\s/, "css"],
|
|
300
|
+
// Markdown - distinctive patterns
|
|
301
|
+
[/^#{1,6}\s+\w|^\s*[-*+]\s+\w|^\s*\d+\.\s+\w|```\w*\n/, "markdown"],
|
|
302
|
+
// XML - distinctive patterns
|
|
303
|
+
[/<\?xml|<[\w:-]+\s+xmlns/, "xml"],
|
|
304
|
+
// Dockerfile
|
|
305
|
+
[/^FROM\s+\w+|^RUN\s+|^COPY\s+|^ENTRYPOINT\s+/m, "dockerfile"],
|
|
306
|
+
// Nginx config
|
|
307
|
+
[/\b(server\s*\{|location\s+[\/~]|proxy_pass\s+)\b/, "nginx"],
|
|
308
|
+
// Zig
|
|
309
|
+
[/\b(pub\s+fn|const\s+\w+\s*=|@import\(|comptime)\b/, "zig"]
|
|
310
|
+
];
|
|
311
|
+
function B(s) {
|
|
312
|
+
const t = s.split(`
|
|
313
|
+
`)[0];
|
|
314
|
+
for (const [n, e] of A)
|
|
315
|
+
if (n.test(t))
|
|
316
|
+
return e;
|
|
317
|
+
for (const [n, e] of C)
|
|
318
|
+
if (n.test(s))
|
|
319
|
+
return e;
|
|
320
|
+
return null;
|
|
321
|
+
}
|
|
322
|
+
function O(s) {
|
|
323
|
+
const t = s.match(/\blanguage-(\w+)\b/);
|
|
324
|
+
return t ? t[1] : null;
|
|
325
|
+
}
|
|
326
|
+
function W(s) {
|
|
327
|
+
const t = {
|
|
328
|
+
js: "javascript",
|
|
329
|
+
ts: "typescript",
|
|
330
|
+
py: "python",
|
|
331
|
+
rb: "ruby",
|
|
332
|
+
rs: "rust",
|
|
333
|
+
sh: "bash",
|
|
334
|
+
shell: "bash",
|
|
335
|
+
yml: "yaml",
|
|
336
|
+
cs: "c-sharp",
|
|
337
|
+
csharp: "c-sharp",
|
|
338
|
+
"c++": "cpp",
|
|
339
|
+
"c#": "c-sharp",
|
|
340
|
+
"f#": "fsharp",
|
|
341
|
+
dockerfile: "dockerfile",
|
|
342
|
+
docker: "dockerfile",
|
|
343
|
+
makefile: "make",
|
|
344
|
+
plaintext: "text",
|
|
345
|
+
plain: "text",
|
|
346
|
+
txt: "text"
|
|
347
|
+
}, n = s.toLowerCase();
|
|
348
|
+
return t[n] || n;
|
|
349
|
+
}
|
|
350
|
+
export {
|
|
351
|
+
B as detectLanguage,
|
|
352
|
+
O as extractLanguageFromClass,
|
|
353
|
+
$ as getConfig,
|
|
354
|
+
N as highlight,
|
|
355
|
+
I as loadGrammar,
|
|
356
|
+
W as normalizeLanguage,
|
|
357
|
+
j as spansToHtml
|
|
358
|
+
};
|
|
359
|
+
//# sourceMappingURL=arborium.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arborium.js","sources":["../src/wasi-shims.ts","../src/loader.ts","../src/detect.ts"],"sourcesContent":["/**\n * Minimal WASI shims for browser environment.\n * These provide stub implementations for WASI interfaces that\n * the grammar plugins require but don't actually use.\n */\n\n// Error type for WASI I/O\nclass WasiError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'WasiError';\n }\n}\n\n// Minimal stream implementation\nclass OutputStream {\n write(_contents: Uint8Array): bigint {\n // Silently discard output\n return BigInt(0);\n }\n\n blockingWriteAndFlush(_contents: Uint8Array): void {\n // No-op\n }\n\n blockingFlush(): void {\n // No-op\n }\n\n checkWrite(): bigint {\n return BigInt(1024 * 1024); // Allow large writes\n }\n\n subscribe(): void {\n // No-op\n }\n}\n\nclass InputStream {\n read(_len: bigint): Uint8Array {\n return new Uint8Array(0);\n }\n\n blockingRead(_len: bigint): Uint8Array {\n return new Uint8Array(0);\n }\n\n subscribe(): void {\n // No-op\n }\n}\n\n// Create the WASI import object expected by jco-generated modules\nexport function createWasiImports() {\n const stdout = new OutputStream();\n const stderr = new OutputStream();\n const stdin = new InputStream();\n\n return {\n 'wasi:cli/environment@0.2.3': {\n getEnvironment(): Array<[string, string]> {\n return [];\n },\n getArguments(): string[] {\n return [];\n },\n },\n\n 'wasi:cli/exit@0.2.3': {\n exit(status: { tag: string; val?: number }): void {\n if (status.tag === 'err') {\n throw new WasiError(`WASI exit with error: ${status.val}`);\n }\n },\n },\n\n 'wasi:cli/stdin@0.2.3': {\n getStdin(): InputStream {\n return stdin;\n },\n },\n\n 'wasi:cli/stdout@0.2.3': {\n getStdout(): OutputStream {\n return stdout;\n },\n },\n\n 'wasi:cli/stderr@0.2.3': {\n getStderr(): OutputStream {\n return stderr;\n },\n },\n\n 'wasi:clocks/wall-clock@0.2.3': {\n now(): { seconds: bigint; nanoseconds: number } {\n const ms = Date.now();\n return {\n seconds: BigInt(Math.floor(ms / 1000)),\n nanoseconds: (ms % 1000) * 1_000_000,\n };\n },\n resolution(): { seconds: bigint; nanoseconds: number } {\n return { seconds: BigInt(0), nanoseconds: 1_000_000 };\n },\n },\n\n 'wasi:filesystem/types@0.2.3': {\n // Stub - grammar plugins shouldn't use filesystem\n Descriptor: class {},\n DirectoryEntryStream: class {},\n },\n\n 'wasi:filesystem/preopens@0.2.3': {\n getDirectories(): Array<[unknown, string]> {\n return [];\n },\n },\n\n 'wasi:io/error@0.2.3': {\n Error: WasiError,\n },\n\n 'wasi:io/streams@0.2.3': {\n InputStream,\n OutputStream,\n },\n\n 'wasi:random/random@0.2.3': {\n getRandomBytes(len: bigint): Uint8Array {\n const bytes = new Uint8Array(Number(len));\n crypto.getRandomValues(bytes);\n return bytes;\n },\n getRandomU64(): bigint {\n const bytes = new Uint8Array(8);\n crypto.getRandomValues(bytes);\n const view = new DataView(bytes.buffer);\n return view.getBigUint64(0, true);\n },\n },\n };\n}\n\n// Grammar types import (the plugin exports these)\nexport const grammarTypesImport = {\n 'arborium:grammar/types@0.1.0': {\n // Types are just interfaces, nothing to export\n },\n};\n","import { createWasiImports, grammarTypesImport } from './wasi-shims.js';\nimport type { Grammar, ParseResult, Span, ArboriumConfig } from './types.js';\n\n/** CDN base URLs */\nconst CDN_URLS: Record<string, string> = {\n jsdelivr: 'https://cdn.jsdelivr.net/npm',\n unpkg: 'https://unpkg.com',\n};\n\n/** Cache of loaded grammars */\nconst grammarCache = new Map<string, Grammar>();\n\n/** Cache of in-flight loads */\nconst loadingCache = new Map<string, Promise<Grammar>>();\n\n/** Default configuration */\nconst defaultConfig: Required<ArboriumConfig> = {\n manual: false,\n theme: 'tokyo-night',\n selector: 'pre code, code[data-lang]',\n cdn: 'jsdelivr',\n version: 'latest',\n};\n\n/** Get the CDN base URL */\nfunction getCdnUrl(cdn: string): string {\n // If it's a known CDN name, use the preset\n if (cdn in CDN_URLS) {\n return CDN_URLS[cdn];\n }\n // Otherwise treat it as a custom base URL\n return cdn;\n}\n\n/** Get the full URL for a grammar package file */\nfunction getGrammarUrl(\n language: string,\n file: string,\n config: ArboriumConfig\n): string {\n const cdn = config.cdn || defaultConfig.cdn;\n const version = config.version || defaultConfig.version;\n const baseUrl = getCdnUrl(cdn);\n const versionSuffix = version === 'latest' ? '' : `@${version}`;\n return `${baseUrl}/@arborium/${language}${versionSuffix}/${file}`;\n}\n\n/** Wrapper around a loaded grammar plugin */\nclass GrammarImpl implements Grammar {\n private plugin: GrammarPlugin;\n private session: number | null = null;\n\n constructor(plugin: GrammarPlugin) {\n this.plugin = plugin;\n }\n\n languageId(): string {\n return this.plugin.languageId();\n }\n\n injectionLanguages(): string[] {\n return this.plugin.injectionLanguages();\n }\n\n parse(source: string): ParseResult {\n // Create a session, parse, then free it\n const session = this.plugin.createSession();\n try {\n this.plugin.setText(session, source);\n return this.plugin.parse(session);\n } finally {\n this.plugin.freeSession(session);\n }\n }\n\n highlight(source: string): string {\n const result = this.parse(source);\n return spansToHtml(source, result.spans);\n }\n\n dispose(): void {\n if (this.session !== null) {\n this.plugin.freeSession(this.session);\n this.session = null;\n }\n }\n}\n\n/** Plugin interface as exported by jco */\ninterface GrammarPlugin {\n languageId(): string;\n injectionLanguages(): string[];\n createSession(): number;\n freeSession(session: number): void;\n setText(session: number, text: string): void;\n parse(session: number): ParseResult;\n}\n\n/** Load a grammar from CDN */\nexport async function loadGrammar(\n language: string,\n config: ArboriumConfig = {}\n): Promise<Grammar> {\n // Check cache first\n const cached = grammarCache.get(language);\n if (cached) {\n return cached;\n }\n\n // Check if already loading\n const loading = loadingCache.get(language);\n if (loading) {\n return loading;\n }\n\n // Start loading\n const loadPromise = doLoadGrammar(language, config);\n loadingCache.set(language, loadPromise);\n\n try {\n const grammar = await loadPromise;\n grammarCache.set(language, grammar);\n return grammar;\n } finally {\n loadingCache.delete(language);\n }\n}\n\nasync function doLoadGrammar(\n language: string,\n config: ArboriumConfig\n): Promise<Grammar> {\n // Fetch the grammar.js module\n const jsUrl = getGrammarUrl(language, 'grammar.js', config);\n const wasmUrl = getGrammarUrl(language, 'grammar.core.wasm', config);\n\n // Dynamic import the JS module\n const module = await import(/* @vite-ignore */ jsUrl);\n\n // Create a getCoreModule function that fetches the WASM\n const getCoreModule = async (path: string): Promise<WebAssembly.Module> => {\n // The path will be something like \"grammar.core.wasm\"\n // We need to fetch it from CDN\n const url = path.includes('://') ? path : wasmUrl;\n const response = await fetch(url);\n const bytes = await response.arrayBuffer();\n return WebAssembly.compile(bytes);\n };\n\n // Create WASI imports\n const wasiImports = createWasiImports();\n const imports = {\n ...wasiImports,\n ...grammarTypesImport,\n };\n\n // Instantiate the component\n const instance = await module.instantiate(getCoreModule, imports);\n\n // Get the plugin interface\n const plugin = instance.plugin as GrammarPlugin;\n\n return new GrammarImpl(plugin);\n}\n\n/** Convert spans to HTML with custom elements */\nexport function spansToHtml(source: string, spans: Span[]): string {\n if (spans.length === 0) {\n return escapeHtml(source);\n }\n\n // Sort spans by start position\n const sorted = [...spans].sort((a, b) => a.start - b.start);\n\n const parts: string[] = [];\n let pos = 0;\n\n for (const span of sorted) {\n // Add unhighlighted text before this span\n if (span.start > pos) {\n parts.push(escapeHtml(source.slice(pos, span.start)));\n }\n\n // Add highlighted span\n const text = source.slice(span.start, span.end);\n const tag = captureToTag(span.capture);\n parts.push(`<${tag}>${escapeHtml(text)}</${tag}>`);\n\n pos = span.end;\n }\n\n // Add remaining text\n if (pos < source.length) {\n parts.push(escapeHtml(source.slice(pos)));\n }\n\n return parts.join('');\n}\n\n/** Map capture names to custom element tags */\nfunction captureToTag(capture: string): string {\n // Use short custom element names: a-k for keyword, a-s for string, etc.\n const shortNames: Record<string, string> = {\n keyword: 'a-k',\n string: 'a-s',\n comment: 'a-c',\n function: 'a-f',\n 'function.call': 'a-f',\n 'function.method': 'a-f',\n type: 'a-t',\n variable: 'a-v',\n 'variable.parameter': 'a-v',\n 'variable.builtin': 'a-vb',\n number: 'a-n',\n operator: 'a-o',\n punctuation: 'a-p',\n 'punctuation.bracket': 'a-p',\n 'punctuation.delimiter': 'a-p',\n constant: 'a-ct',\n 'constant.builtin': 'a-cb',\n property: 'a-pr',\n attribute: 'a-at',\n tag: 'a-tg',\n namespace: 'a-ns',\n label: 'a-lb',\n escape: 'a-e',\n embedded: 'a-em',\n };\n\n // Check for exact match or prefix match\n if (capture in shortNames) {\n return shortNames[capture];\n }\n\n // Try prefix match\n for (const [prefix, tag] of Object.entries(shortNames)) {\n if (capture.startsWith(prefix + '.')) {\n return tag;\n }\n }\n\n // Fallback: use a-x with data attribute for unknown captures\n return 'a-x';\n}\n\n/** Escape HTML special characters */\nfunction escapeHtml(text: string): string {\n return text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\n/** Highlight code with a loaded grammar */\nexport async function highlight(\n language: string,\n source: string,\n config: ArboriumConfig = {}\n): Promise<string> {\n const grammar = await loadGrammar(language, config);\n return grammar.highlight(source);\n}\n\n/** Get the default config merged with user config */\nexport function getConfig(userConfig?: ArboriumConfig): Required<ArboriumConfig> {\n return { ...defaultConfig, ...userConfig };\n}\n\nexport { defaultConfig };\n","/**\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 (e.g., \"language-rust\" -> \"rust\")\n */\nexport function extractLanguageFromClass(className: string): string | null {\n const match = className.match(/\\blanguage-(\\w+)\\b/);\n return match ? match[1] : 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"],"names":["WasiError","message","OutputStream","_contents","InputStream","_len","createWasiImports","stdout","stderr","stdin","status","ms","len","bytes","grammarTypesImport","CDN_URLS","grammarCache","loadingCache","defaultConfig","getCdnUrl","cdn","getGrammarUrl","language","file","config","version","baseUrl","versionSuffix","GrammarImpl","plugin","source","session","result","spansToHtml","loadGrammar","cached","loading","loadPromise","doLoadGrammar","grammar","jsUrl","wasmUrl","module","getCoreModule","path","url","imports","spans","escapeHtml","sorted","b","parts","pos","span","text","tag","captureToTag","capture","shortNames","prefix","highlight","getConfig","userConfig","SHEBANG_PATTERNS","KEYWORD_FINGERPRINTS","detectLanguage","firstLine","pattern","extractLanguageFromClass","className","match","normalizeLanguage","lang","aliases","lower"],"mappings":"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"}
|
package/dist/detect.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple language detection heuristics.
|
|
3
|
+
* Not meant to be comprehensive - just catches common cases.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Detect the language of a code snippet.
|
|
7
|
+
* Returns null if detection fails.
|
|
8
|
+
*/
|
|
9
|
+
export declare function detectLanguage(source: string): string | null;
|
|
10
|
+
/**
|
|
11
|
+
* Extract language from class name (e.g., "language-rust" -> "rust")
|
|
12
|
+
*/
|
|
13
|
+
export declare function extractLanguageFromClass(className: string): string | null;
|
|
14
|
+
/**
|
|
15
|
+
* Normalize language identifier (handle aliases)
|
|
16
|
+
*/
|
|
17
|
+
export declare function normalizeLanguage(lang: string): string;
|
package/dist/iife.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @arborium/arborium IIFE bundle
|
|
3
|
+
*
|
|
4
|
+
* Drop-in auto-highlighter that runs on page load.
|
|
5
|
+
* Configuration via data attributes or window.Arborium object.
|
|
6
|
+
*/
|
|
7
|
+
import type { ArboriumConfig } from './types.js';
|
|
8
|
+
/** Public API for manual highlighting */
|
|
9
|
+
export declare function highlightAll(config?: ArboriumConfig): Promise<void>;
|
|
10
|
+
/** Public API for highlighting a specific element */
|
|
11
|
+
export declare function highlightElement(element: HTMLElement, language?: string, config?: ArboriumConfig): Promise<void>;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @arborium/arborium - High-performance syntax highlighting
|
|
3
|
+
*
|
|
4
|
+
* ESM entry point for programmatic usage.
|
|
5
|
+
*/
|
|
6
|
+
export { loadGrammar, highlight, spansToHtml, getConfig } from './loader.js';
|
|
7
|
+
export { detectLanguage, extractLanguageFromClass, normalizeLanguage } from './detect.js';
|
|
8
|
+
export type { Grammar, Span, Injection, ParseResult, ArboriumConfig, } from './types.js';
|
package/dist/loader.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Grammar, Span, ArboriumConfig } from './types.js';
|
|
2
|
+
/** Default configuration */
|
|
3
|
+
declare const defaultConfig: Required<ArboriumConfig>;
|
|
4
|
+
/** Load a grammar from CDN */
|
|
5
|
+
export declare function loadGrammar(language: string, config?: ArboriumConfig): Promise<Grammar>;
|
|
6
|
+
/** Convert spans to HTML with custom elements */
|
|
7
|
+
export declare function spansToHtml(source: string, spans: Span[]): string;
|
|
8
|
+
/** Highlight code with a loaded grammar */
|
|
9
|
+
export declare function highlight(language: string, source: string, config?: ArboriumConfig): Promise<string>;
|
|
10
|
+
/** Get the default config merged with user config */
|
|
11
|
+
export declare function getConfig(userConfig?: ArboriumConfig): Required<ArboriumConfig>;
|
|
12
|
+
export { defaultConfig };
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitHub Light theme for Arborium
|
|
3
|
+
* Based on https://github.com/primer/github-syntax-light
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* Code block styling */
|
|
7
|
+
pre:has(code[data-highlighted]) {
|
|
8
|
+
background-color: #f6f8fa;
|
|
9
|
+
color: #24292e;
|
|
10
|
+
padding: 1em;
|
|
11
|
+
border-radius: 6px;
|
|
12
|
+
overflow-x: auto;
|
|
13
|
+
font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
|
|
14
|
+
font-size: 0.9em;
|
|
15
|
+
line-height: 1.5;
|
|
16
|
+
border: 1px solid #e1e4e8;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
code[data-highlighted] {
|
|
20
|
+
background: transparent;
|
|
21
|
+
font-family: inherit;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* Keywords: if, else, for, while, fn, let, const, etc. */
|
|
25
|
+
a-k {
|
|
26
|
+
color: #d73a49;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/* Strings */
|
|
30
|
+
a-s {
|
|
31
|
+
color: #032f62;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/* Comments */
|
|
35
|
+
a-c {
|
|
36
|
+
color: #6a737d;
|
|
37
|
+
font-style: italic;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* Functions */
|
|
41
|
+
a-f {
|
|
42
|
+
color: #6f42c1;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/* Types */
|
|
46
|
+
a-t {
|
|
47
|
+
color: #6f42c1;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Variables */
|
|
51
|
+
a-v {
|
|
52
|
+
color: #24292e;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* Built-in variables (self, this, etc.) */
|
|
56
|
+
a-vb {
|
|
57
|
+
color: #005cc5;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/* Numbers */
|
|
61
|
+
a-n {
|
|
62
|
+
color: #005cc5;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/* Operators */
|
|
66
|
+
a-o {
|
|
67
|
+
color: #d73a49;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/* Punctuation (brackets, delimiters) */
|
|
71
|
+
a-p {
|
|
72
|
+
color: #24292e;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/* Constants */
|
|
76
|
+
a-ct {
|
|
77
|
+
color: #005cc5;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/* Built-in constants (true, false, null, etc.) */
|
|
81
|
+
a-cb {
|
|
82
|
+
color: #005cc5;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* Properties */
|
|
86
|
+
a-pr {
|
|
87
|
+
color: #005cc5;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* Attributes (HTML/XML attributes, decorators) */
|
|
91
|
+
a-at {
|
|
92
|
+
color: #6f42c1;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* Tags (HTML/XML tags) */
|
|
96
|
+
a-tg {
|
|
97
|
+
color: #22863a;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/* Namespaces */
|
|
101
|
+
a-ns {
|
|
102
|
+
color: #6f42c1;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/* Labels */
|
|
106
|
+
a-lb {
|
|
107
|
+
color: #e36209;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/* Escape sequences */
|
|
111
|
+
a-e {
|
|
112
|
+
color: #005cc5;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/* Embedded code */
|
|
116
|
+
a-em {
|
|
117
|
+
color: #24292e;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/* Unknown/fallback */
|
|
121
|
+
a-x {
|
|
122
|
+
color: #24292e;
|
|
123
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tokyo Night theme for Arborium
|
|
3
|
+
* Based on https://github.com/tokyo-night/tokyo-night-vscode-theme
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/* Code block styling */
|
|
7
|
+
pre:has(code[data-highlighted]) {
|
|
8
|
+
background-color: #1a1b26;
|
|
9
|
+
color: #a9b1d6;
|
|
10
|
+
padding: 1em;
|
|
11
|
+
border-radius: 6px;
|
|
12
|
+
overflow-x: auto;
|
|
13
|
+
font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
|
|
14
|
+
font-size: 0.9em;
|
|
15
|
+
line-height: 1.5;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
code[data-highlighted] {
|
|
19
|
+
background: transparent;
|
|
20
|
+
font-family: inherit;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/* Keywords: if, else, for, while, fn, let, const, etc. */
|
|
24
|
+
a-k {
|
|
25
|
+
color: #bb9af7;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* Strings */
|
|
29
|
+
a-s {
|
|
30
|
+
color: #9ece6a;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* Comments */
|
|
34
|
+
a-c {
|
|
35
|
+
color: #565f89;
|
|
36
|
+
font-style: italic;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* Functions */
|
|
40
|
+
a-f {
|
|
41
|
+
color: #7aa2f7;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/* Types */
|
|
45
|
+
a-t {
|
|
46
|
+
color: #2ac3de;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* Variables */
|
|
50
|
+
a-v {
|
|
51
|
+
color: #c0caf5;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/* Built-in variables (self, this, etc.) */
|
|
55
|
+
a-vb {
|
|
56
|
+
color: #f7768e;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/* Numbers */
|
|
60
|
+
a-n {
|
|
61
|
+
color: #ff9e64;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* Operators */
|
|
65
|
+
a-o {
|
|
66
|
+
color: #89ddff;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* Punctuation (brackets, delimiters) */
|
|
70
|
+
a-p {
|
|
71
|
+
color: #a9b1d6;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/* Constants */
|
|
75
|
+
a-ct {
|
|
76
|
+
color: #ff9e64;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/* Built-in constants (true, false, null, etc.) */
|
|
80
|
+
a-cb {
|
|
81
|
+
color: #ff9e64;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/* Properties */
|
|
85
|
+
a-pr {
|
|
86
|
+
color: #73daca;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/* Attributes (HTML/XML attributes, decorators) */
|
|
90
|
+
a-at {
|
|
91
|
+
color: #bb9af7;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/* Tags (HTML/XML tags) */
|
|
95
|
+
a-tg {
|
|
96
|
+
color: #f7768e;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/* Namespaces */
|
|
100
|
+
a-ns {
|
|
101
|
+
color: #7dcfff;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/* Labels */
|
|
105
|
+
a-lb {
|
|
106
|
+
color: #e0af68;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* Escape sequences */
|
|
110
|
+
a-e {
|
|
111
|
+
color: #89ddff;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* Embedded code */
|
|
115
|
+
a-em {
|
|
116
|
+
color: #c0caf5;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/* Unknown/fallback */
|
|
120
|
+
a-x {
|
|
121
|
+
color: #c0caf5;
|
|
122
|
+
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** A span of highlighted text */
|
|
2
|
+
export interface Span {
|
|
3
|
+
start: number;
|
|
4
|
+
end: number;
|
|
5
|
+
/** The capture name (e.g., "keyword", "string", "comment") */
|
|
6
|
+
capture: string;
|
|
7
|
+
}
|
|
8
|
+
/** A language injection (e.g., JS inside HTML) */
|
|
9
|
+
export interface Injection {
|
|
10
|
+
start: number;
|
|
11
|
+
end: number;
|
|
12
|
+
language: string;
|
|
13
|
+
includeChildren: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** Result of parsing source code */
|
|
16
|
+
export interface ParseResult {
|
|
17
|
+
spans: Span[];
|
|
18
|
+
injections: Injection[];
|
|
19
|
+
}
|
|
20
|
+
/** A loaded grammar plugin */
|
|
21
|
+
export interface Grammar {
|
|
22
|
+
/** The language identifier */
|
|
23
|
+
languageId(): string;
|
|
24
|
+
/** Languages this grammar may inject */
|
|
25
|
+
injectionLanguages(): string[];
|
|
26
|
+
/** Highlight source code, returning HTML string */
|
|
27
|
+
highlight(source: string): string;
|
|
28
|
+
/** Parse source code, returning raw spans */
|
|
29
|
+
parse(source: string): ParseResult;
|
|
30
|
+
/** Dispose of resources */
|
|
31
|
+
dispose(): void;
|
|
32
|
+
}
|
|
33
|
+
/** Configuration for the arborium runtime */
|
|
34
|
+
export interface ArboriumConfig {
|
|
35
|
+
/** Disable auto-highlighting on page load */
|
|
36
|
+
manual?: boolean;
|
|
37
|
+
/** Theme to use: "tokyo-night" | "github-light" | custom */
|
|
38
|
+
theme?: string;
|
|
39
|
+
/** CSS selector for code blocks */
|
|
40
|
+
selector?: string;
|
|
41
|
+
/** CDN to use: "jsdelivr" | "unpkg" | custom base URL */
|
|
42
|
+
cdn?: string;
|
|
43
|
+
/** Package version to load (default: "latest") */
|
|
44
|
+
version?: string;
|
|
45
|
+
}
|
|
46
|
+
/** Global config set before script loads */
|
|
47
|
+
declare global {
|
|
48
|
+
interface Window {
|
|
49
|
+
Arborium?: ArboriumConfig;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal WASI shims for browser environment.
|
|
3
|
+
* These provide stub implementations for WASI interfaces that
|
|
4
|
+
* the grammar plugins require but don't actually use.
|
|
5
|
+
*/
|
|
6
|
+
declare class WasiError extends Error {
|
|
7
|
+
constructor(message: string);
|
|
8
|
+
}
|
|
9
|
+
declare class OutputStream {
|
|
10
|
+
write(_contents: Uint8Array): bigint;
|
|
11
|
+
blockingWriteAndFlush(_contents: Uint8Array): void;
|
|
12
|
+
blockingFlush(): void;
|
|
13
|
+
checkWrite(): bigint;
|
|
14
|
+
subscribe(): void;
|
|
15
|
+
}
|
|
16
|
+
declare class InputStream {
|
|
17
|
+
read(_len: bigint): Uint8Array;
|
|
18
|
+
blockingRead(_len: bigint): Uint8Array;
|
|
19
|
+
subscribe(): void;
|
|
20
|
+
}
|
|
21
|
+
export declare function createWasiImports(): {
|
|
22
|
+
'wasi:cli/environment@0.2.3': {
|
|
23
|
+
getEnvironment(): Array<[string, string]>;
|
|
24
|
+
getArguments(): string[];
|
|
25
|
+
};
|
|
26
|
+
'wasi:cli/exit@0.2.3': {
|
|
27
|
+
exit(status: {
|
|
28
|
+
tag: string;
|
|
29
|
+
val?: number;
|
|
30
|
+
}): void;
|
|
31
|
+
};
|
|
32
|
+
'wasi:cli/stdin@0.2.3': {
|
|
33
|
+
getStdin(): InputStream;
|
|
34
|
+
};
|
|
35
|
+
'wasi:cli/stdout@0.2.3': {
|
|
36
|
+
getStdout(): OutputStream;
|
|
37
|
+
};
|
|
38
|
+
'wasi:cli/stderr@0.2.3': {
|
|
39
|
+
getStderr(): OutputStream;
|
|
40
|
+
};
|
|
41
|
+
'wasi:clocks/wall-clock@0.2.3': {
|
|
42
|
+
now(): {
|
|
43
|
+
seconds: bigint;
|
|
44
|
+
nanoseconds: number;
|
|
45
|
+
};
|
|
46
|
+
resolution(): {
|
|
47
|
+
seconds: bigint;
|
|
48
|
+
nanoseconds: number;
|
|
49
|
+
};
|
|
50
|
+
};
|
|
51
|
+
'wasi:filesystem/types@0.2.3': {
|
|
52
|
+
Descriptor: {
|
|
53
|
+
new (): {};
|
|
54
|
+
};
|
|
55
|
+
DirectoryEntryStream: {
|
|
56
|
+
new (): {};
|
|
57
|
+
};
|
|
58
|
+
};
|
|
59
|
+
'wasi:filesystem/preopens@0.2.3': {
|
|
60
|
+
getDirectories(): Array<[unknown, string]>;
|
|
61
|
+
};
|
|
62
|
+
'wasi:io/error@0.2.3': {
|
|
63
|
+
Error: typeof WasiError;
|
|
64
|
+
};
|
|
65
|
+
'wasi:io/streams@0.2.3': {
|
|
66
|
+
InputStream: typeof InputStream;
|
|
67
|
+
OutputStream: typeof OutputStream;
|
|
68
|
+
};
|
|
69
|
+
'wasi:random/random@0.2.3': {
|
|
70
|
+
getRandomBytes(len: bigint): Uint8Array;
|
|
71
|
+
getRandomU64(): bigint;
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
export declare const grammarTypesImport: {
|
|
75
|
+
'arborium:grammar/types@0.1.0': {};
|
|
76
|
+
};
|
|
77
|
+
export {};
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@arborium/arborium",
|
|
3
|
+
"version": "0.0.7",
|
|
4
|
+
"description": "High-performance syntax highlighting powered by tree-sitter and WebAssembly",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/arborium.js",
|
|
7
|
+
"module": "./dist/arborium.js",
|
|
8
|
+
"types": "./dist/arborium.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/arborium.js",
|
|
12
|
+
"types": "./dist/arborium.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./iife": {
|
|
15
|
+
"import": "./dist/arborium.iife.js"
|
|
16
|
+
},
|
|
17
|
+
"./themes/tokyo-night.css": "./dist/themes/tokyo-night.css",
|
|
18
|
+
"./themes/github-light.css": "./dist/themes/github-light.css"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist"
|
|
22
|
+
],
|
|
23
|
+
"scripts": {
|
|
24
|
+
"dev": "vite",
|
|
25
|
+
"build": "vite build && tsc --emitDeclarationOnly",
|
|
26
|
+
"preview": "vite preview",
|
|
27
|
+
"typecheck": "tsc --noEmit"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"syntax-highlighting",
|
|
31
|
+
"tree-sitter",
|
|
32
|
+
"wasm",
|
|
33
|
+
"webassembly",
|
|
34
|
+
"code",
|
|
35
|
+
"highlight"
|
|
36
|
+
],
|
|
37
|
+
"author": "Amos Wenger <amos@bearcove.net>",
|
|
38
|
+
"license": "MIT OR Apache-2.0",
|
|
39
|
+
"repository": {
|
|
40
|
+
"type": "git",
|
|
41
|
+
"url": "git+https://github.com/bearcove/arborium.git",
|
|
42
|
+
"directory": "packages/arborium"
|
|
43
|
+
},
|
|
44
|
+
"homepage": "https://github.com/bearcove/arborium",
|
|
45
|
+
"bugs": {
|
|
46
|
+
"url": "https://github.com/bearcove/arborium/issues"
|
|
47
|
+
},
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"typescript": "^5.7.2",
|
|
50
|
+
"vite": "^7.2.6",
|
|
51
|
+
"vite-plugin-dts": "^4.5.0"
|
|
52
|
+
}
|
|
53
|
+
}
|