vue-syntax-highlighter 0.0.0-stage → 1.0.0

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 (74) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/LICENSE +21 -0
  3. package/README.md +182 -3
  4. package/dist/aliases.d.ts +9 -0
  5. package/dist/chunks/define-theme-Bul1KkHG.js +74 -0
  6. package/dist/chunks/define-theme-Bul1KkHG.js.map +1 -0
  7. package/dist/chunks/index-a55czNwo.js +188 -0
  8. package/dist/chunks/index-a55czNwo.js.map +1 -0
  9. package/dist/chunks/source-DxBCRqJY.js +66 -0
  10. package/dist/chunks/source-DxBCRqJY.js.map +1 -0
  11. package/dist/chunks/token-types-B8veGO5e.js +131 -0
  12. package/dist/chunks/token-types-B8veGO5e.js.map +1 -0
  13. package/dist/chunks/types-DTo8JPWw.js +25 -0
  14. package/dist/chunks/types-DTo8JPWw.js.map +1 -0
  15. package/dist/component/SyntaxHighlighter.d.ts +266 -0
  16. package/dist/component/SyntaxHighlighterProvider.d.ts +137 -0
  17. package/dist/component/use-theme.d.ts +16 -0
  18. package/dist/composables/useSyntaxHighlighter.d.ts +27 -0
  19. package/dist/core/cache.d.ts +40 -0
  20. package/dist/core/context.d.ts +62 -0
  21. package/dist/core/controller.d.ts +35 -0
  22. package/dist/core/define-theme.d.ts +8 -0
  23. package/dist/core/engine.d.ts +28 -0
  24. package/dist/core/props.d.ts +189 -0
  25. package/dist/core/source.d.ts +11 -0
  26. package/dist/core/theme.d.ts +32 -0
  27. package/dist/core/token-types.d.ts +6 -0
  28. package/dist/core/virtual.d.ts +31 -0
  29. package/dist/core/warn.d.ts +12 -0
  30. package/dist/engines/highlightjs/index.d.ts +20 -0
  31. package/dist/engines/highlightjs/languages.d.ts +56 -0
  32. package/dist/engines/highlightjs.d.ts +1 -0
  33. package/dist/engines/highlightjs.js +5 -0
  34. package/dist/engines/highlightjs.js.map +1 -0
  35. package/dist/engines/lowlight.d.ts +2 -0
  36. package/dist/engines/lowlight.js +6 -0
  37. package/dist/engines/lowlight.js.map +1 -0
  38. package/dist/engines/prism/index.d.ts +19 -0
  39. package/dist/engines/prism/languages.d.ts +62 -0
  40. package/dist/engines/prism.d.ts +1 -0
  41. package/dist/engines/prism.js +205 -0
  42. package/dist/engines/prism.js.map +1 -0
  43. package/dist/engines/shiki/index.d.ts +19 -0
  44. package/dist/engines/shiki/languages.d.ts +72 -0
  45. package/dist/engines/shiki.d.ts +1 -0
  46. package/dist/engines/shiki.js +264 -0
  47. package/dist/engines/shiki.js.map +1 -0
  48. package/dist/index.d.ts +14 -0
  49. package/dist/index.js +1355 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/plugin.d.ts +11 -0
  52. package/dist/styles/fallback.css +352 -0
  53. package/dist/styles.css +1 -0
  54. package/dist/themes/default.d.ts +1 -0
  55. package/dist/themes/default.js +6 -0
  56. package/dist/themes/default.js.map +1 -0
  57. package/dist/themes/index.d.ts +4 -0
  58. package/dist/themes/vsh-dark.d.ts +5 -0
  59. package/dist/themes/vsh-dark.js +39 -0
  60. package/dist/themes/vsh-dark.js.map +1 -0
  61. package/dist/themes/vsh-light.d.ts +6 -0
  62. package/dist/themes/vsh-light.js +39 -0
  63. package/dist/themes/vsh-light.js.map +1 -0
  64. package/dist/themes/vsh-midnight.d.ts +5 -0
  65. package/dist/themes/vsh-midnight.js +39 -0
  66. package/dist/themes/vsh-midnight.js.map +1 -0
  67. package/dist/themes/vsh-paper.d.ts +5 -0
  68. package/dist/themes/vsh-paper.js +39 -0
  69. package/dist/themes/vsh-paper.js.map +1 -0
  70. package/dist/themes.d.ts +1 -0
  71. package/dist/themes.js +11 -0
  72. package/dist/themes.js.map +1 -0
  73. package/dist/types.d.ts +162 -0
  74. package/package.json +193 -6
package/CHANGELOG.md ADDED
@@ -0,0 +1,24 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project are documented here. The format follows Keep a Changelog and the project uses semantic versioning.
4
+
5
+ ## [1.0.0] - 2026-10-25
6
+
7
+ Initial stable release.
8
+
9
+ ### Added
10
+
11
+ - Vue 3 `SyntaxHighlighter` component with line numbers, highlighted ranges, wrapping, tag overrides, scoped slots, events, and exposed `refresh`, `highlight`, `copy`, and `getCopyPayload` operations.
12
+ - `SyntaxHighlighterProvider`, the `VueSyntaxHighlighter` plugin, and `useSyntaxHighlighter` composable with scoped defaults, preloaded languages, and lifecycle cleanup.
13
+ - Engine adapter contract and separate lazy entries for Shiki, highlight.js through lowlight, a lowlight entry, and Prism through refractor.
14
+ - Semantic 19-type token model, source normalization, result validation, and frozen results.
15
+ - Four built-in themes (`vsh-light`, `vsh-dark`, `vsh-paper`, `vsh-midnight`) as individual data entries, matched light/dark pairs, `defineTheme`, and CSS custom-property theme scopes.
16
+ - Provider-scoped LRU cache with character budget, in-flight request deduplication, theme-independent cache keys, microtask scheduling, and stale-result rejection.
17
+ - Offscreen deferral with `IntersectionObserver` and virtualized rendering for long documents with bounded DOM and full-source copying.
18
+ - Deterministic SSR and hydration behavior for synchronous, preloaded, and asynchronous engines without runtime style injection.
19
+ - Compatibility aliases `Light`, `LightAsync`, `PrismLight`, and `PrismAsync`, plus deprecated prop mapping with one-time warnings.
20
+ - Optional `styles/fallback.css` for browsers without `light-dark()`, wrapped in `@supports not` so it is a no-op in modern browsers.
21
+ - Strict ESM package exports, TypeScript declarations, size budgets, static graph assertions, publint/attw validation, packed-consumer browser and SSR fixtures.
22
+ - npm metadata with repository/homepage/bugs links, `publishConfig.access`, a tag-checked release workflow with provenance, and a `prepublishOnly` build/package gate.
23
+ - VitePress documentation with onboarding, basic and advanced usage guides, API reference, examples for every public export, live demo, and a GitHub Pages deployment workflow.
24
+ - Playwright and axe coverage for the demo, deferral, nested schemes, and accessibility.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 CoderMiner
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,182 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
1
+ # vue-syntax-highlighter
2
+
3
+ [![npm version](https://img.shields.io/npm/v/vue-syntax-highlighter.svg)](https://www.npmjs.com/package/vue-syntax-highlighter)
4
+ [![License: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/coderminer/vue-syntax-highlighter/blob/main/LICENSE)
5
+ [![Vue 3](https://img.shields.io/badge/vue-3.x-42b883.svg)](https://vuejs.org)
6
+ [![ESM only](https://img.shields.io/badge/module-ESM--only-blue.svg)](#install)
7
+ [![Documentation](https://img.shields.io/badge/docs-vue--syntax--highlighter-brightgreen.svg)](https://coderminer.github.io/vue-syntax-highlighter/)
8
+
9
+ A Vue 3 syntax highlighter with pluggable engines, semantic themes, and SSR-first performance.
10
+
11
+ [Documentation](https://coderminer.github.io/vue-syntax-highlighter/) · [API](https://coderminer.github.io/vue-syntax-highlighter/api) · [API Examples](https://coderminer.github.io/vue-syntax-highlighter/guide/api-examples)
12
+
13
+ - **Vue-idiomatic API** — component props, scoped slots, events, exposed methods, a plugin, a provider, and composables.
14
+ - **Pluggable engines** — Shiki by default; highlight.js through lowlight, a lowlight entry, and Prism through refractor as optional adapters.
15
+ - **Theme-independent tokens** — engines return text plus semantic token types only. Changing a theme never invokes the engine.
16
+ - **Deterministic SSR** — synchronous or preloaded engines render highlighted HTML; async engines render a plain busy shell and upgrade after hydration.
17
+ - **Bounded performance** — provider-scoped LRU cache, request deduplication, theme-free cache keys, offscreen deferral, and virtualization for very long files.
18
+
19
+ ## Install
20
+
21
+ ```bash
22
+ # npm
23
+ npm install vue-syntax-highlighter
24
+
25
+ # pnpm
26
+ pnpm add vue-syntax-highlighter
27
+
28
+ # yarn
29
+ yarn add vue-syntax-highlighter
30
+
31
+ # bun
32
+ bun add vue-syntax-highlighter
33
+ ```
34
+
35
+ Install the engine you plan to use:
36
+
37
+ ```bash
38
+ npm install shiki # default
39
+ npm install lowlight highlight.js # highlight.js / lowlight adapters
40
+ npm install refractor # Prism adapter
41
+ ```
42
+
43
+ Vue `>=3.4` is the only required peer and is provided by your existing Vue application, so the install commands above intentionally omit it. Engine peers are optional. The package is ESM-only and targets Node `>=20.19` for SSR/build tooling. Browsers without `light-dark()` can import the optional fallback stylesheet after the base stylesheet.
44
+
45
+ ```ts
46
+ import 'vue-syntax-highlighter/styles.css'
47
+ ```
48
+
49
+ ## Quick start
50
+
51
+ ```vue
52
+ <script setup lang="ts">
53
+ import { SyntaxHighlighter } from 'vue-syntax-highlighter'
54
+
55
+ const code = `const answer = 42
56
+ console.log(answer)`
57
+ </script>
58
+
59
+ <template>
60
+ <SyntaxHighlighter :code="code" language="javascript" line-numbers />
61
+ </template>
62
+ ```
63
+
64
+ ## Engines
65
+
66
+ ```vue
67
+ <SyntaxHighlighter :code="code" language="python" engine="shiki" />
68
+ <SyntaxHighlighter :code="code" language="python" engine="highlightjs" />
69
+ <SyntaxHighlighter :code="code" language="python" engine="lowlight" />
70
+ <SyntaxHighlighter :code="code" language="python" engine="prism" />
71
+ ```
72
+
73
+ Adapters are separate subpaths and lazy chunks. The core entry contains no static engine, grammar, or non-default theme data.
74
+
75
+ ```ts
76
+ import { createShikiEngine } from 'vue-syntax-highlighter/engines/shiki'
77
+ import { createLowlightEngine } from 'vue-syntax-highlighter/engines/lowlight'
78
+ import { createHighlightjsEngine } from 'vue-syntax-highlighter/engines/highlightjs'
79
+ import { createPrismEngine } from 'vue-syntax-highlighter/engines/prism'
80
+ ```
81
+
82
+ Preload a language to get synchronous highlighting (including SSR):
83
+
84
+ ```ts
85
+ const engine = await createShikiEngine({ preload: ['typescript'] })
86
+ ```
87
+
88
+ ## Themes
89
+
90
+ ```vue
91
+ <script setup lang="ts">
92
+ import { vshLight } from 'vue-syntax-highlighter/themes/vsh-light'
93
+ import { vshDark } from 'vue-syntax-highlighter/themes/vsh-dark'
94
+ const themes = { light: vshLight, dark: vshDark }
95
+ </script>
96
+
97
+ <template>
98
+ <SyntaxHighlighter :code="code" language="ts" :themes="themes" color-scheme="auto" />
99
+ </template>
100
+ ```
101
+
102
+ Four built-in themes ship as individual data entries: `vsh-light` (default), `vsh-dark`, `vsh-paper`, and `vsh-midnight`. They form two matched light/dark pairs. `defineTheme` creates validated, frozen custom themes.
103
+
104
+ Theme switching updates CSS custom properties and the scheme attribute only. The token output and engine invocation count do not change.
105
+
106
+ ## Performance
107
+
108
+ - Provider/application-scoped LRU cache (100 entries, 8 MiB character budget by default).
109
+ - Cache keys cover engine, options, language, and code, but never the theme.
110
+ - Concurrent identical requests share one engine call.
111
+ - `defer` waits for `IntersectionObserver` before loading.
112
+ - `virtualized` with `height`, fixed `lineHeight`, and `wrap=false` keeps only the visible window plus overscan in the DOM for long documents.
113
+ - `copy()` returns the complete source, not the virtualized window or gutter.
114
+
115
+ Run `pnpm bench` for cold highlight and initial SSR render timings on 1k/10k-line inputs.
116
+
117
+ ## Exports
118
+
119
+ ```
120
+ vue-syntax-highlighter
121
+ vue-syntax-highlighter/engines/shiki
122
+ vue-syntax-highlighter/engines/highlightjs
123
+ vue-syntax-highlighter/engines/lowlight
124
+ vue-syntax-highlighter/engines/prism
125
+ vue-syntax-highlighter/themes
126
+ vue-syntax-highlighter/themes/default
127
+ vue-syntax-highlighter/themes/vsh-light
128
+ vue-syntax-highlighter/themes/vsh-dark
129
+ vue-syntax-highlighter/themes/vsh-paper
130
+ vue-syntax-highlighter/themes/vsh-midnight
131
+ vue-syntax-highlighter/styles.css
132
+ vue-syntax-highlighter/styles/fallback.css
133
+ vue-syntax-highlighter/package.json
134
+ ```
135
+
136
+ Deep imports into `dist/` are blocked.
137
+
138
+ ## Development
139
+
140
+ ```bash
141
+ pnpm install
142
+ pnpm build
143
+ pnpm typecheck
144
+ pnpm test:run
145
+ pnpm lint
146
+ pnpm size
147
+ pnpm check:package
148
+ pnpm docs:build
149
+ pnpm test:e2e
150
+ ```
151
+
152
+ See the full gate with `pnpm verify`.
153
+
154
+ ### Publishing
155
+
156
+ Releases are published to npm by [`.github/workflows/release.yml`](https://github.com/coderminer/vue-syntax-highlighter/blob/main/.github/workflows/release.yml) when a `v*` tag is pushed. See [RELEASING.md](https://github.com/coderminer/vue-syntax-highlighter/blob/main/RELEASING.md) for the one-time npm and GitHub setup, the version/changelog checklist, provenance, and rollback steps.
157
+
158
+ ### Deploying the docs
159
+
160
+ The VitePress site builds to `docs/.vitepress/dist`. A GitHub Actions workflow in `.github/workflows/docs.yml` publishes it to GitHub Pages on pushes to `main`. In the repository's **Settings → Pages**, choose **GitHub Actions** as the source. Project pages use `/<repository>/` automatically; user/organization pages use `/`.
161
+
162
+ ## Documentation
163
+
164
+ - [Getting Started](https://coderminer.github.io/vue-syntax-highlighter/guide/getting-started)
165
+ - [Quick Start](https://coderminer.github.io/vue-syntax-highlighter/guide/quick-start)
166
+ - [Basic Usage](https://coderminer.github.io/vue-syntax-highlighter/guide/basic-usage)
167
+ - [Advanced Usage](https://coderminer.github.io/vue-syntax-highlighter/guide/advanced-usage)
168
+ - [Engines](https://coderminer.github.io/vue-syntax-highlighter/guide/engines)
169
+ - [Themes](https://coderminer.github.io/vue-syntax-highlighter/guide/themes)
170
+ - [Performance](https://coderminer.github.io/vue-syntax-highlighter/guide/performance)
171
+ - [Server Rendering](https://coderminer.github.io/vue-syntax-highlighter/guide/ssr)
172
+ - [API](https://coderminer.github.io/vue-syntax-highlighter/api)
173
+ - [API Examples](https://coderminer.github.io/vue-syntax-highlighter/guide/api-examples)
174
+ - [Limitations](https://coderminer.github.io/vue-syntax-highlighter/guide/limitations)
175
+
176
+ ## Attribution
177
+
178
+ The semantic token vocabulary is informed by common TextMate, Prism, and highlight.js scope categories. All four built-in palettes are authored for this library, not copied from third-party theme files. Runtime highlighting is provided by the optional peer packages Shiki, highlight.js/lowlight, and refractor, each under its own license. No grammar or theme assets are redistributed by this package.
179
+
180
+ ## License
181
+
182
+ MIT
@@ -0,0 +1,9 @@
1
+ import { Component } from 'vue';
2
+ /** Compatibility alias for react-syntax-highlighter's highlight.js light build. */
3
+ export declare const Light: Component;
4
+ /** Compatibility alias for the asynchronous highlight.js build. */
5
+ export declare const LightAsync: Component;
6
+ /** Compatibility alias for the Prism light build. */
7
+ export declare const PrismLight: Component;
8
+ /** Compatibility alias for the asynchronous Prism build. */
9
+ export declare const PrismAsync: Component;
@@ -0,0 +1,74 @@
1
+ import { T as f } from "./types-DTo8JPWw.js";
2
+ const g = new Set(f), y = ["color", "fontStyle", "fontWeight", "textDecoration"];
3
+ function c(e, o) {
4
+ if (typeof e != "string" || e.trim().length === 0)
5
+ throw new TypeError(
6
+ `[vue-syntax-highlighter] Invalid theme: "${o}" must be a non-empty string.`
7
+ );
8
+ return e;
9
+ }
10
+ function l(e, o) {
11
+ if (e !== void 0)
12
+ return c(e, o);
13
+ }
14
+ function d(e) {
15
+ if (e === void 0) return Object.freeze({});
16
+ if (!e || typeof e != "object" || Array.isArray(e))
17
+ throw new TypeError('[vue-syntax-highlighter] Invalid theme: "tokens" must be an object.');
18
+ const o = {};
19
+ for (const [t, r] of Object.entries(e)) {
20
+ if (!g.has(t))
21
+ throw new TypeError(
22
+ `[vue-syntax-highlighter] Invalid theme: unknown token type "${t}". Expected one of ${f.join(", ")}.`
23
+ );
24
+ if (r === void 0) continue;
25
+ if (!r || typeof r != "object" || Array.isArray(r))
26
+ throw new TypeError(
27
+ `[vue-syntax-highlighter] Invalid theme: tokens.${t} must be an object.`
28
+ );
29
+ const s = {};
30
+ for (const n of y) {
31
+ const i = r[n];
32
+ i !== void 0 && (s[n] = c(i, `tokens.${t}.${n}`));
33
+ }
34
+ o[t] = Object.freeze(s);
35
+ }
36
+ return Object.freeze(o);
37
+ }
38
+ function u(e) {
39
+ if (!e || typeof e != "object" || Array.isArray(e))
40
+ throw new TypeError("[vue-syntax-highlighter] Invalid theme: expected an object.");
41
+ const o = c(e.name, "name");
42
+ if (e.colorScheme !== "light" && e.colorScheme !== "dark")
43
+ throw new TypeError(
44
+ '[vue-syntax-highlighter] Invalid theme: "colorScheme" must be "light" or "dark".'
45
+ );
46
+ if (!e.colors || typeof e.colors != "object" || Array.isArray(e.colors))
47
+ throw new TypeError(
48
+ '[vue-syntax-highlighter] Invalid theme: "colors" must include background and foreground.'
49
+ );
50
+ const t = c(e.colors.background, "colors.background"), r = c(e.colors.foreground, "colors.foreground"), s = l(e.colors.gutter, "colors.gutter") ?? r, n = l(e.colors.lineHighlight, "colors.lineHighlight") ?? "transparent", i = l(e.colors.selection, "colors.selection") ?? "rgba(127, 127, 127, 0.28)", h = l(e.colors.fontFamily, "colors.fontFamily"), a = Object.freeze({
51
+ background: t,
52
+ foreground: r,
53
+ gutter: s,
54
+ lineHighlight: n,
55
+ selection: i,
56
+ ...h ? { fontFamily: h } : {}
57
+ });
58
+ return Object.freeze({
59
+ name: o,
60
+ colorScheme: e.colorScheme,
61
+ colors: a,
62
+ tokens: d(e.tokens)
63
+ });
64
+ }
65
+ function b(e) {
66
+ if (!e || typeof e != "object") return !1;
67
+ const o = e;
68
+ return typeof o.name == "string" && o.name.length > 0 && (o.colorScheme === "light" || o.colorScheme === "dark") && !!o.colors && typeof o.colors?.background == "string" && typeof o.colors?.foreground == "string" && typeof o.colors?.gutter == "string" && typeof o.colors?.lineHighlight == "string" && typeof o.colors?.selection == "string" && !!o.tokens && typeof o.tokens == "object";
69
+ }
70
+ export {
71
+ u as d,
72
+ b as i
73
+ };
74
+ //# sourceMappingURL=define-theme-Bul1KkHG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"define-theme-Bul1KkHG.js","sources":["../../src/core/define-theme.ts"],"sourcesContent":["import {\r\n TOKEN_TYPES,\r\n type ThemeDefinition,\r\n type ThemeInput,\r\n type TokenStyle,\r\n type TokenType,\r\n} from '../types.js'\r\n\r\nconst TOKEN_TYPE_SET = new Set<string>(TOKEN_TYPES)\r\nconst STYLE_KEYS = ['color', 'fontStyle', 'fontWeight', 'textDecoration'] as const\r\n\r\nfunction requiredString(value: unknown, path: string): string {\r\n if (typeof value !== 'string' || value.trim().length === 0) {\r\n throw new TypeError(\r\n `[vue-syntax-highlighter] Invalid theme: \"${path}\" must be a non-empty string.`,\r\n )\r\n }\r\n return value\r\n}\r\n\r\nfunction optionalString(value: unknown, path: string): string | undefined {\r\n if (value === undefined) return undefined\r\n return requiredString(value, path)\r\n}\r\n\r\nfunction freezeTokens(\r\n tokens: ThemeInput['tokens'],\r\n): Partial<Record<TokenType, TokenStyle>> {\r\n if (tokens === undefined) return Object.freeze({})\r\n if (!tokens || typeof tokens !== 'object' || Array.isArray(tokens)) {\r\n throw new TypeError('[vue-syntax-highlighter] Invalid theme: \"tokens\" must be an object.')\r\n }\r\n\r\n const result: Partial<Record<TokenType, TokenStyle>> = {}\r\n for (const [key, value] of Object.entries(tokens)) {\r\n if (!TOKEN_TYPE_SET.has(key)) {\r\n throw new TypeError(\r\n `[vue-syntax-highlighter] Invalid theme: unknown token type \"${key}\". ` +\r\n `Expected one of ${TOKEN_TYPES.join(', ')}.`,\r\n )\r\n }\r\n if (value === undefined) continue\r\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\r\n throw new TypeError(\r\n `[vue-syntax-highlighter] Invalid theme: tokens.${key} must be an object.`,\r\n )\r\n }\r\n const style: TokenStyle = {}\r\n for (const styleKey of STYLE_KEYS) {\r\n const styleValue = (value as Record<string, unknown>)[styleKey]\r\n if (styleValue === undefined) continue\r\n style[styleKey] = requiredString(styleValue, `tokens.${key}.${styleKey}`)\r\n }\r\n result[key as TokenType] = Object.freeze(style)\r\n }\r\n return Object.freeze(result)\r\n}\r\n\r\n/**\r\n * Validates and freezes a theme definition. Invalid input throws an actionable\r\n * error; callers that resolve themes during rendering catch it and keep the\r\n * previous valid theme instead.\r\n */\r\nexport function defineTheme(input: ThemeInput): ThemeDefinition {\r\n if (!input || typeof input !== 'object' || Array.isArray(input)) {\r\n throw new TypeError('[vue-syntax-highlighter] Invalid theme: expected an object.')\r\n }\r\n\r\n const name = requiredString(input.name, 'name')\r\n if (input.colorScheme !== 'light' && input.colorScheme !== 'dark') {\r\n throw new TypeError(\r\n '[vue-syntax-highlighter] Invalid theme: \"colorScheme\" must be \"light\" or \"dark\".',\r\n )\r\n }\r\n if (!input.colors || typeof input.colors !== 'object' || Array.isArray(input.colors)) {\r\n throw new TypeError(\r\n '[vue-syntax-highlighter] Invalid theme: \"colors\" must include background and foreground.',\r\n )\r\n }\r\n\r\n const background = requiredString(input.colors.background, 'colors.background')\r\n const foreground = requiredString(input.colors.foreground, 'colors.foreground')\r\n const gutter = optionalString(input.colors.gutter, 'colors.gutter') ?? foreground\r\n const lineHighlight =\r\n optionalString(input.colors.lineHighlight, 'colors.lineHighlight') ?? 'transparent'\r\n const selection =\r\n optionalString(input.colors.selection, 'colors.selection') ?? 'rgba(127, 127, 127, 0.28)'\r\n const fontFamily = optionalString(input.colors.fontFamily, 'colors.fontFamily')\r\n\r\n const colors = Object.freeze({\r\n background,\r\n foreground,\r\n gutter,\r\n lineHighlight,\r\n selection,\r\n ...(fontFamily ? { fontFamily } : {}),\r\n })\r\n\r\n return Object.freeze({\r\n name,\r\n colorScheme: input.colorScheme,\r\n colors,\r\n tokens: freezeTokens(input.tokens),\r\n })\r\n}\r\n\r\nexport function isThemeDefinition(value: unknown): value is ThemeDefinition {\r\n if (!value || typeof value !== 'object') return false\r\n const candidate = value as Partial<ThemeDefinition>\r\n return (\r\n typeof candidate.name === 'string' &&\r\n candidate.name.length > 0 &&\r\n (candidate.colorScheme === 'light' || candidate.colorScheme === 'dark') &&\r\n Boolean(candidate.colors) &&\r\n typeof candidate.colors?.background === 'string' &&\r\n typeof candidate.colors?.foreground === 'string' &&\r\n typeof candidate.colors?.gutter === 'string' &&\r\n typeof candidate.colors?.lineHighlight === 'string' &&\r\n typeof candidate.colors?.selection === 'string' &&\r\n Boolean(candidate.tokens) &&\r\n typeof candidate.tokens === 'object'\r\n )\r\n}\r\n"],"names":["TOKEN_TYPE_SET","TOKEN_TYPES","STYLE_KEYS","requiredString","value","path","optionalString","freezeTokens","tokens","result","key","style","styleKey","styleValue","defineTheme","input","name","background","foreground","gutter","lineHighlight","selection","fontFamily","colors","isThemeDefinition","candidate"],"mappings":"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"}
@@ -0,0 +1,188 @@
1
+ var w = Object.defineProperty;
2
+ var x = (r, t, i) => t in r ? w(r, t, { enumerable: !0, configurable: !0, writable: !0, value: i }) : r[t] = i;
3
+ var o = (r, t, i) => x(r, typeof t != "symbol" ? t + "" : t, i);
4
+ import { createLowlight as v } from "lowlight";
5
+ import { c as y, n as k, r as L } from "./source-DxBCRqJY.js";
6
+ import { m as b } from "./token-types-B8veGO5e.js";
7
+ const S = {
8
+ apache: () => import("highlight.js/lib/languages/apache"),
9
+ c: () => import("highlight.js/lib/languages/c"),
10
+ clojure: () => import("highlight.js/lib/languages/clojure"),
11
+ cpp: () => import("highlight.js/lib/languages/cpp"),
12
+ csharp: () => import("highlight.js/lib/languages/csharp"),
13
+ css: () => import("highlight.js/lib/languages/css"),
14
+ dart: () => import("highlight.js/lib/languages/dart"),
15
+ diff: () => import("highlight.js/lib/languages/diff"),
16
+ docker: () => import("highlight.js/lib/languages/dockerfile"),
17
+ elixir: () => import("highlight.js/lib/languages/elixir"),
18
+ erlang: () => import("highlight.js/lib/languages/erlang"),
19
+ fortran: () => import("highlight.js/lib/languages/fortran"),
20
+ fsharp: () => import("highlight.js/lib/languages/fsharp"),
21
+ go: () => import("highlight.js/lib/languages/go"),
22
+ graphql: () => import("highlight.js/lib/languages/graphql"),
23
+ groovy: () => import("highlight.js/lib/languages/groovy"),
24
+ haskell: () => import("highlight.js/lib/languages/haskell"),
25
+ html: () => import("highlight.js/lib/languages/xml"),
26
+ http: () => import("highlight.js/lib/languages/http"),
27
+ ini: () => import("highlight.js/lib/languages/ini"),
28
+ java: () => import("highlight.js/lib/languages/java"),
29
+ javascript: () => import("highlight.js/lib/languages/javascript"),
30
+ json: () => import("highlight.js/lib/languages/json"),
31
+ julia: () => import("highlight.js/lib/languages/julia"),
32
+ kotlin: () => import("highlight.js/lib/languages/kotlin"),
33
+ latex: () => import("highlight.js/lib/languages/latex"),
34
+ less: () => import("highlight.js/lib/languages/less"),
35
+ lua: () => import("highlight.js/lib/languages/lua"),
36
+ make: () => import("highlight.js/lib/languages/makefile"),
37
+ markdown: () => import("highlight.js/lib/languages/markdown"),
38
+ matlab: () => import("highlight.js/lib/languages/matlab"),
39
+ nginx: () => import("highlight.js/lib/languages/nginx"),
40
+ nix: () => import("highlight.js/lib/languages/nix"),
41
+ "objective-c": () => import("highlight.js/lib/languages/objectivec"),
42
+ ocaml: () => import("highlight.js/lib/languages/ocaml"),
43
+ perl: () => import("highlight.js/lib/languages/perl"),
44
+ php: () => import("highlight.js/lib/languages/php"),
45
+ powershell: () => import("highlight.js/lib/languages/powershell"),
46
+ python: () => import("highlight.js/lib/languages/python"),
47
+ r: () => import("highlight.js/lib/languages/r"),
48
+ ruby: () => import("highlight.js/lib/languages/ruby"),
49
+ rust: () => import("highlight.js/lib/languages/rust"),
50
+ scala: () => import("highlight.js/lib/languages/scala"),
51
+ scss: () => import("highlight.js/lib/languages/scss"),
52
+ shellscript: () => import("highlight.js/lib/languages/bash"),
53
+ sql: () => import("highlight.js/lib/languages/sql"),
54
+ stylus: () => import("highlight.js/lib/languages/stylus"),
55
+ swift: () => import("highlight.js/lib/languages/swift"),
56
+ typescript: () => import("highlight.js/lib/languages/typescript"),
57
+ wasm: () => import("highlight.js/lib/languages/wasm"),
58
+ xml: () => import("highlight.js/lib/languages/xml"),
59
+ yaml: () => import("highlight.js/lib/languages/yaml")
60
+ }, P = {
61
+ "c#": "csharp",
62
+ "c++": "cpp",
63
+ cjs: "javascript",
64
+ cs: "csharp",
65
+ cts: "typescript",
66
+ cxx: "cpp",
67
+ dockerfile: "docker",
68
+ htm: "html",
69
+ js: "javascript",
70
+ makefile: "make",
71
+ md: "markdown",
72
+ mjs: "javascript",
73
+ mts: "typescript",
74
+ objc: "objective-c",
75
+ py: "python",
76
+ rb: "ruby",
77
+ sh: "shellscript",
78
+ shell: "shellscript",
79
+ ts: "typescript",
80
+ yml: "yaml",
81
+ zsh: "shellscript"
82
+ }, A = ["apache", "c", "clojure", "cpp", "csharp", "css", "dart", "diff", "docker", "elixir", "erlang", "fortran", "fsharp", "go", "graphql", "groovy", "haskell", "html", "http", "ini", "java", "javascript", "json", "julia", "kotlin", "latex", "less", "lua", "make", "markdown", "matlab", "nginx", "nix", "objective-c", "ocaml", "perl", "php", "powershell", "python", "r", "ruby", "rust", "scala", "scss", "shellscript", "sql", "stylus", "swift", "typescript", "wasm", "xml", "yaml"], u = /* @__PURE__ */ new Set(["text", "plain", "plaintext", "txt"]);
83
+ async function _(r = {}) {
84
+ const t = new E(r);
85
+ return r.preload?.length && await Promise.allSettled(r.preload.map((i) => t.loadLanguage(i))), t;
86
+ }
87
+ class E {
88
+ constructor(t) {
89
+ o(this, "id", "highlightjs");
90
+ o(this, "capabilities", { sync: !0 });
91
+ o(this, "supportedLanguages", A);
92
+ o(this, "lowlight", v());
93
+ o(this, "loaders", new Map(
94
+ Object.entries(S)
95
+ ));
96
+ o(this, "loaded", /* @__PURE__ */ new Set());
97
+ o(this, "loading", /* @__PURE__ */ new Map());
98
+ o(this, "disposed", !1);
99
+ }
100
+ hasLanguage(t) {
101
+ const i = h(t);
102
+ return u.has(i) ? !0 : this.loaded.has(i);
103
+ }
104
+ registerLanguage(t, i) {
105
+ const e = h(t);
106
+ if (typeof i == "function" && i.length === 0) {
107
+ this.loaders.set(e, i), this.loaded.delete(e);
108
+ return;
109
+ }
110
+ const n = i;
111
+ this.lowlight.register(e, n), this.loaders.set(e, async () => n), this.loaded.add(e);
112
+ }
113
+ loadLanguage(t) {
114
+ if (this.disposed)
115
+ return Promise.reject(
116
+ new Error("[vue-syntax-highlighter] The highlight.js engine was disposed.")
117
+ );
118
+ const i = h(t);
119
+ if (u.has(i) || this.loaded.has(i)) return Promise.resolve();
120
+ const e = this.loading.get(i);
121
+ if (e) return e;
122
+ const n = this.loaders.get(i);
123
+ if (!n)
124
+ return Promise.reject(
125
+ new Error(
126
+ `[vue-syntax-highlighter] Language "${t}" is not available in the highlight.js adapter. Use a supported language or call engine.registerLanguage(name, grammar) first.`
127
+ )
128
+ );
129
+ const l = n().then((c) => {
130
+ const m = typeof c == "function" ? c : c.default;
131
+ this.lowlight.register(i, m), this.loaded.add(i);
132
+ }).finally(() => {
133
+ this.loading.delete(i);
134
+ });
135
+ return this.loading.set(i, l), l;
136
+ }
137
+ highlight(t, i) {
138
+ const e = h(t.language);
139
+ return u.has(e) ? y(t.code, t.language) : this.loaded.has(e) ? this.highlightSync(t) : this.loadLanguage(e).then(() => this.highlightSync(t));
140
+ }
141
+ highlightSync(t) {
142
+ if (this.disposed)
143
+ throw new Error("[vue-syntax-highlighter] The highlight.js engine was disposed.");
144
+ const i = k(t.code), e = h(t.language), n = this.lowlight.highlight(e, i), l = [[]], c = (s, p) => {
145
+ if (s.length === 0) return;
146
+ const g = s.split(`
147
+ `);
148
+ for (let a = 0; a < g.length; a += 1) {
149
+ a > 0 && l.push([]);
150
+ const d = g[a] ?? "";
151
+ d.length > 0 && l[l.length - 1].push({ text: d, type: p });
152
+ }
153
+ }, m = (s, p) => {
154
+ if (s.type === "text") {
155
+ c(s.value, b(p));
156
+ return;
157
+ }
158
+ const g = s;
159
+ for (const a of g.children ?? []) {
160
+ const d = a.type === "element" ? z(p, a.properties?.className) : p;
161
+ m(a, d);
162
+ }
163
+ };
164
+ for (const s of n.children ?? []) {
165
+ const p = s.type === "element" ? s.properties?.className : void 0;
166
+ m(s, p);
167
+ }
168
+ const f = { lines: l.map((s) => ({ tokens: s })), language: t.language };
169
+ return L(f) !== i ? y(i, t.language) : f;
170
+ }
171
+ dispose() {
172
+ this.disposed || (this.disposed = !0, this.loaded.clear(), this.loading.clear(), this.loaders.clear());
173
+ }
174
+ }
175
+ function z(r, t) {
176
+ return t === void 0 ? r : r === void 0 ? t : [...j(r), ...j(t)];
177
+ }
178
+ function j(r) {
179
+ return Array.isArray(r) ? r : typeof r == "string" ? r.split(/\s+/) : [];
180
+ }
181
+ function h(r) {
182
+ const t = r.trim().toLowerCase().replace(/^language-/, "");
183
+ return P[t] ?? t;
184
+ }
185
+ export {
186
+ _ as c
187
+ };
188
+ //# sourceMappingURL=index-a55czNwo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-a55czNwo.js","sources":["../../src/engines/highlightjs/languages.ts","../../src/engines/highlightjs/index.ts"],"sourcesContent":["// Generated by scripts/generate-languages.mjs. Do not edit by hand.\r\n// Language registry for the lowlight/highlight.js adapter.\r\nexport const languageLoaders = {\r\n \"apache\": () => import(\"highlight.js/lib/languages/apache\"),\r\n \"c\": () => import(\"highlight.js/lib/languages/c\"),\r\n \"clojure\": () => import(\"highlight.js/lib/languages/clojure\"),\r\n \"cpp\": () => import(\"highlight.js/lib/languages/cpp\"),\r\n \"csharp\": () => import(\"highlight.js/lib/languages/csharp\"),\r\n \"css\": () => import(\"highlight.js/lib/languages/css\"),\r\n \"dart\": () => import(\"highlight.js/lib/languages/dart\"),\r\n \"diff\": () => import(\"highlight.js/lib/languages/diff\"),\r\n \"docker\": () => import(\"highlight.js/lib/languages/dockerfile\"),\r\n \"elixir\": () => import(\"highlight.js/lib/languages/elixir\"),\r\n \"erlang\": () => import(\"highlight.js/lib/languages/erlang\"),\r\n \"fortran\": () => import(\"highlight.js/lib/languages/fortran\"),\r\n \"fsharp\": () => import(\"highlight.js/lib/languages/fsharp\"),\r\n \"go\": () => import(\"highlight.js/lib/languages/go\"),\r\n \"graphql\": () => import(\"highlight.js/lib/languages/graphql\"),\r\n \"groovy\": () => import(\"highlight.js/lib/languages/groovy\"),\r\n \"haskell\": () => import(\"highlight.js/lib/languages/haskell\"),\r\n \"html\": () => import(\"highlight.js/lib/languages/xml\"),\r\n \"http\": () => import(\"highlight.js/lib/languages/http\"),\r\n \"ini\": () => import(\"highlight.js/lib/languages/ini\"),\r\n \"java\": () => import(\"highlight.js/lib/languages/java\"),\r\n \"javascript\": () => import(\"highlight.js/lib/languages/javascript\"),\r\n \"json\": () => import(\"highlight.js/lib/languages/json\"),\r\n \"julia\": () => import(\"highlight.js/lib/languages/julia\"),\r\n \"kotlin\": () => import(\"highlight.js/lib/languages/kotlin\"),\r\n \"latex\": () => import(\"highlight.js/lib/languages/latex\"),\r\n \"less\": () => import(\"highlight.js/lib/languages/less\"),\r\n \"lua\": () => import(\"highlight.js/lib/languages/lua\"),\r\n \"make\": () => import(\"highlight.js/lib/languages/makefile\"),\r\n \"markdown\": () => import(\"highlight.js/lib/languages/markdown\"),\r\n \"matlab\": () => import(\"highlight.js/lib/languages/matlab\"),\r\n \"nginx\": () => import(\"highlight.js/lib/languages/nginx\"),\r\n \"nix\": () => import(\"highlight.js/lib/languages/nix\"),\r\n \"objective-c\": () => import(\"highlight.js/lib/languages/objectivec\"),\r\n \"ocaml\": () => import(\"highlight.js/lib/languages/ocaml\"),\r\n \"perl\": () => import(\"highlight.js/lib/languages/perl\"),\r\n \"php\": () => import(\"highlight.js/lib/languages/php\"),\r\n \"powershell\": () => import(\"highlight.js/lib/languages/powershell\"),\r\n \"python\": () => import(\"highlight.js/lib/languages/python\"),\r\n \"r\": () => import(\"highlight.js/lib/languages/r\"),\r\n \"ruby\": () => import(\"highlight.js/lib/languages/ruby\"),\r\n \"rust\": () => import(\"highlight.js/lib/languages/rust\"),\r\n \"scala\": () => import(\"highlight.js/lib/languages/scala\"),\r\n \"scss\": () => import(\"highlight.js/lib/languages/scss\"),\r\n \"shellscript\": () => import(\"highlight.js/lib/languages/bash\"),\r\n \"sql\": () => import(\"highlight.js/lib/languages/sql\"),\r\n \"stylus\": () => import(\"highlight.js/lib/languages/stylus\"),\r\n \"swift\": () => import(\"highlight.js/lib/languages/swift\"),\r\n \"typescript\": () => import(\"highlight.js/lib/languages/typescript\"),\r\n \"wasm\": () => import(\"highlight.js/lib/languages/wasm\"),\r\n \"xml\": () => import(\"highlight.js/lib/languages/xml\"),\r\n \"yaml\": () => import(\"highlight.js/lib/languages/yaml\"),\r\n} satisfies Record<string, () => Promise<unknown>>\r\n\r\nexport const languageAliases: Readonly<Record<string, string>> = {\r\n \"c#\": \"csharp\",\r\n \"c++\": \"cpp\",\r\n \"cjs\": \"javascript\",\r\n \"cs\": \"csharp\",\r\n \"cts\": \"typescript\",\r\n \"cxx\": \"cpp\",\r\n \"dockerfile\": \"docker\",\r\n \"htm\": \"html\",\r\n \"js\": \"javascript\",\r\n \"makefile\": \"make\",\r\n \"md\": \"markdown\",\r\n \"mjs\": \"javascript\",\r\n \"mts\": \"typescript\",\r\n \"objc\": \"objective-c\",\r\n \"py\": \"python\",\r\n \"rb\": \"ruby\",\r\n \"sh\": \"shellscript\",\r\n \"shell\": \"shellscript\",\r\n \"ts\": \"typescript\",\r\n \"yml\": \"yaml\",\r\n \"zsh\": \"shellscript\",\r\n}\r\n\r\nexport const supportedLanguages: readonly string[] = [\"apache\",\"c\",\"clojure\",\"cpp\",\"csharp\",\"css\",\"dart\",\"diff\",\"docker\",\"elixir\",\"erlang\",\"fortran\",\"fsharp\",\"go\",\"graphql\",\"groovy\",\"haskell\",\"html\",\"http\",\"ini\",\"java\",\"javascript\",\"json\",\"julia\",\"kotlin\",\"latex\",\"less\",\"lua\",\"make\",\"markdown\",\"matlab\",\"nginx\",\"nix\",\"objective-c\",\"ocaml\",\"perl\",\"php\",\"powershell\",\"python\",\"r\",\"ruby\",\"rust\",\"scala\",\"scss\",\"shellscript\",\"sql\",\"stylus\",\"swift\",\"typescript\",\"wasm\",\"xml\",\"yaml\"]\r\n","import { createLowlight } from 'lowlight'\r\nimport type { LanguageFn } from 'highlight.js'\r\nimport type {\r\n EngineOptions,\r\n HighlightEngine,\r\n HighlightRequest,\r\n HighlightResult,\r\n HighlightToken,\r\n} from '../../types.js'\r\nimport { createPlainResult, normalizeSource, resultToSource } from '../../core/source.js'\r\nimport { mapHljsClasses } from '../../core/token-types.js'\r\nimport { languageAliases, languageLoaders, supportedLanguages } from './languages.js'\r\n\r\nconst PLAIN_LANGUAGES = new Set(['text', 'plain', 'plaintext', 'txt'])\r\n\r\ninterface HastText {\r\n type: 'text'\r\n value: string\r\n}\r\n\r\ninterface HastElement {\r\n type: 'element'\r\n properties?: { className?: unknown }\r\n children?: HastNode[]\r\n}\r\n\r\ninterface HastRoot {\r\n type: 'root'\r\n children?: HastNode[]\r\n}\r\n\r\ntype HastNode = HastText | HastElement | { type: string; children?: HastNode[] }\r\n\r\nexport type HighlightjsLanguageRegistration = LanguageFn\r\nexport type HighlightjsLanguageLoader = () => Promise<{ default: LanguageFn } | LanguageFn>\r\n\r\nexport interface HighlightjsEngine extends HighlightEngine {\r\n readonly id: 'highlightjs'\r\n readonly capabilities: { sync: true }\r\n hasLanguage(language: string): boolean\r\n loadLanguage(language: string): Promise<void>\r\n registerLanguage(\r\n name: string,\r\n language: HighlightjsLanguageRegistration | HighlightjsLanguageLoader,\r\n ): void\r\n readonly supportedLanguages: readonly string[]\r\n}\r\n\r\nexport interface HighlightjsEngineOptions {\r\n preload?: readonly string[]\r\n}\r\n\r\nexport async function createHighlightjsEngine(\r\n options: HighlightjsEngineOptions = {},\r\n): Promise<HighlightjsEngine> {\r\n const engine = new HighlightjsEngineImpl(options)\r\n if (options.preload?.length) {\r\n await Promise.allSettled(options.preload.map((language) => engine.loadLanguage(language)))\r\n }\r\n return engine\r\n}\r\n\r\nclass HighlightjsEngineImpl implements HighlightjsEngine {\r\n readonly id = 'highlightjs' as const\r\n readonly capabilities = { sync: true } as const\r\n readonly supportedLanguages = supportedLanguages\r\n\r\n private readonly lowlight = createLowlight()\r\n private readonly loaders = new Map<string, HighlightjsLanguageLoader>(\r\n Object.entries(languageLoaders) as [string, HighlightjsLanguageLoader][],\r\n )\r\n private readonly loaded = new Set<string>()\r\n private readonly loading = new Map<string, Promise<void>>()\r\n private disposed = false\r\n\r\n constructor(_options: HighlightjsEngineOptions) {}\r\n\r\n hasLanguage(language: string): boolean {\r\n const canonical = canonicalLanguage(language)\r\n if (PLAIN_LANGUAGES.has(canonical)) return true\r\n return this.loaded.has(canonical)\r\n }\r\n\r\n registerLanguage(\r\n name: string,\r\n language: HighlightjsLanguageRegistration | HighlightjsLanguageLoader,\r\n ): void {\r\n const canonical = canonicalLanguage(name)\r\n // highlight.js grammars are functions too. A zero-argument function is\r\n // treated as a loader; a grammar receives the highlight.js instance.\r\n if (typeof language === 'function' && language.length === 0) {\r\n this.loaders.set(canonical, language as HighlightjsLanguageLoader)\r\n this.loaded.delete(canonical)\r\n return\r\n }\r\n const grammar = language as HighlightjsLanguageRegistration\r\n this.lowlight.register(canonical, grammar)\r\n this.loaders.set(canonical, async () => grammar)\r\n this.loaded.add(canonical)\r\n }\r\n\r\n loadLanguage(language: string): Promise<void> {\r\n if (this.disposed) {\r\n return Promise.reject(\r\n new Error('[vue-syntax-highlighter] The highlight.js engine was disposed.'),\r\n )\r\n }\r\n const canonical = canonicalLanguage(language)\r\n if (PLAIN_LANGUAGES.has(canonical)) return Promise.resolve()\r\n if (this.loaded.has(canonical)) return Promise.resolve()\r\n const existing = this.loading.get(canonical)\r\n if (existing) return existing\r\n\r\n const loader = this.loaders.get(canonical)\r\n if (!loader) {\r\n return Promise.reject(\r\n new Error(\r\n `[vue-syntax-highlighter] Language \"${language}\" is not available in the highlight.js adapter. ` +\r\n 'Use a supported language or call engine.registerLanguage(name, grammar) first.',\r\n ),\r\n )\r\n }\r\n\r\n const promise = loader()\r\n .then((module) => {\r\n const grammar =\r\n typeof module === 'function'\r\n ? module\r\n : (module as { default: LanguageFn }).default\r\n this.lowlight.register(canonical, grammar)\r\n this.loaded.add(canonical)\r\n })\r\n .finally(() => {\r\n this.loading.delete(canonical)\r\n })\r\n this.loading.set(canonical, promise)\r\n return promise\r\n }\r\n\r\n highlight(\r\n request: HighlightRequest,\r\n _options?: EngineOptions,\r\n ): HighlightResult | Promise<HighlightResult> {\r\n const lang = canonicalLanguage(request.language)\r\n if (PLAIN_LANGUAGES.has(lang)) {\r\n return createPlainResult(request.code, request.language)\r\n }\r\n if (this.loaded.has(lang)) return this.highlightSync(request)\r\n return this.loadLanguage(lang).then(() => this.highlightSync(request))\r\n }\r\n\r\n private highlightSync(request: HighlightRequest): HighlightResult {\r\n if (this.disposed) {\r\n throw new Error('[vue-syntax-highlighter] The highlight.js engine was disposed.')\r\n }\r\n const code = normalizeSource(request.code)\r\n const lang = canonicalLanguage(request.language)\r\n const tree = this.lowlight.highlight(lang, code) as HastRoot\r\n\r\n const lines: HighlightToken[][] = [[]]\r\n const push = (text: string, type: HighlightToken['type']): void => {\r\n if (text.length === 0) return\r\n const parts = text.split('\\n')\r\n for (let index = 0; index < parts.length; index += 1) {\r\n if (index > 0) lines.push([])\r\n const part = parts[index] ?? ''\r\n if (part.length > 0) lines[lines.length - 1]!.push({ text: part, type })\r\n }\r\n }\r\n\r\n const walk = (node: HastNode, classes: unknown): void => {\r\n if (node.type === 'text') {\r\n push((node as HastText).value, mapHljsClasses(classes))\r\n return\r\n }\r\n const element = node as HastElement\r\n for (const child of element.children ?? []) {\r\n const childClasses =\r\n child.type === 'element'\r\n ? combineClasses(classes, (child as HastElement).properties?.className)\r\n : classes\r\n walk(child, childClasses)\r\n }\r\n }\r\n\r\n for (const child of tree.children ?? []) {\r\n const classes =\r\n child.type === 'element' ? (child as HastElement).properties?.className : undefined\r\n walk(child, classes)\r\n }\r\n\r\n const normalized: HighlightResult = { lines: lines.map((tokens) => ({ tokens })), language: request.language }\r\n if (resultToSource(normalized) !== code) {\r\n return createPlainResult(code, request.language)\r\n }\r\n return normalized\r\n }\r\n\r\n dispose(): void {\r\n if (this.disposed) return\r\n this.disposed = true\r\n this.loaded.clear()\r\n this.loading.clear()\r\n this.loaders.clear()\r\n }\r\n}\r\n\r\nfunction combineClasses(parent: unknown, own: unknown): unknown {\r\n if (own === undefined) return parent\r\n if (parent === undefined) return own\r\n return [...normalize(parent), ...normalize(own)]\r\n}\r\n\r\nfunction normalize(value: unknown): unknown[] {\r\n if (Array.isArray(value)) return value\r\n if (typeof value === 'string') return value.split(/\\s+/)\r\n return []\r\n}\r\n\r\nfunction canonicalLanguage(language: string): string {\r\n const normalized = language.trim().toLowerCase().replace(/^language-/, '')\r\n return languageAliases[normalized] ?? normalized\r\n}\r\n"],"names":["languageLoaders","languageAliases","supportedLanguages","PLAIN_LANGUAGES","createHighlightjsEngine","options","engine","HighlightjsEngineImpl","language","_options","__publicField","createLowlight","canonical","canonicalLanguage","name","grammar","existing","loader","promise","module","request","lang","createPlainResult","code","normalizeSource","tree","lines","push","text","type","parts","index","part","walk","node","classes","mapHljsClasses","element","child","childClasses","combineClasses","normalized","tokens","resultToSource","parent","own","normalize","value"],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { T as s } from "./types-DTo8JPWw.js";
2
+ const i = new Set(s);
3
+ function f(e) {
4
+ return typeof e == "string" && i.has(e);
5
+ }
6
+ function a(e) {
7
+ return e.replace(/\r\n?/g, `
8
+ `);
9
+ }
10
+ function c(e) {
11
+ return a(e).split(`
12
+ `);
13
+ }
14
+ function p(e, t) {
15
+ return { lines: c(e).map((r) => ({
16
+ tokens: r.length > 0 ? [{ text: r, type: "plain" }] : []
17
+ })), language: t };
18
+ }
19
+ function g(e) {
20
+ return e.lines.map((t) => t.tokens.map((n) => n.text).join("")).join(`
21
+ `);
22
+ }
23
+ function y(e) {
24
+ let t = e.language.length;
25
+ for (const n of e.lines)
26
+ for (const r of n.tokens) t += r.text.length;
27
+ return t;
28
+ }
29
+ function l(e) {
30
+ if (!e || typeof e != "object") return !1;
31
+ const t = e;
32
+ if (typeof t.language != "string" || !Array.isArray(t.lines)) return !1;
33
+ for (const n of t.lines) {
34
+ if (!n || typeof n != "object" || !Array.isArray(n.tokens)) return !1;
35
+ for (const r of n.tokens)
36
+ if (!r || typeof r != "object" || typeof r.text != "string" || !f(r.type)) return !1;
37
+ }
38
+ return !0;
39
+ }
40
+ function h(e) {
41
+ const t = e.lines.map((n) => {
42
+ const r = n.tokens.map((o) => Object.freeze({ text: o.text, type: o.type }));
43
+ return Object.freeze({ tokens: Object.freeze(r) });
44
+ });
45
+ return Object.freeze({
46
+ lines: Object.freeze(t),
47
+ language: e.language,
48
+ ...e.meta ? { meta: Object.freeze({ ...e.meta }) } : {}
49
+ });
50
+ }
51
+ function j(e) {
52
+ if (!l(e))
53
+ throw new TypeError(
54
+ "Highlight engine returned an invalid result. Expected ordered lines of { text, type } tokens."
55
+ );
56
+ }
57
+ export {
58
+ y as a,
59
+ j as b,
60
+ p as c,
61
+ h as f,
62
+ a as n,
63
+ g as r,
64
+ c as s
65
+ };
66
+ //# sourceMappingURL=source-DxBCRqJY.js.map