@purestack/ts-highlight 1.1.32 → 1.1.33
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/ts-highlight.d.mts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
/*! @purestack/ts-highlight v1.1.
|
|
1
|
+
/*! @purestack/ts-highlight v1.1.33 | (c) 2026 Ahmed Yasin Koculu | MIT License */
|
|
2
2
|
|
|
3
3
|
import { MdxCodeHighlighter, SiteConfigResolution, SiteMdxConfig } from "@purestack/ts-common";
|
|
4
4
|
import { HLJSApi } from "highlight.js";
|
|
5
5
|
import { Highlighter, createHighlighter } from "shiki";
|
|
6
|
-
//#region packages/ts-highlight/src/shiki.d.ts
|
|
7
6
|
type MdxShikiFactory = (options: Parameters<typeof createHighlighter>[0]) => Highlighter | Promise<Highlighter>;
|
|
8
7
|
interface MdxCodeThemes {
|
|
9
8
|
light: string;
|
|
@@ -19,11 +18,7 @@ interface MdxHighlighterOptions {
|
|
|
19
18
|
cache?: boolean;
|
|
20
19
|
}
|
|
21
20
|
export declare function createMdxHighlighter(themes?: MdxCodeThemes, langs?: MdxCodeLangs, { create, cache: useCache }?: MdxHighlighterOptions): Promise<MdxCodeHighlighter>;
|
|
22
|
-
//#endregion
|
|
23
|
-
//#region packages/ts-highlight/src/highlightjs.d.ts
|
|
24
21
|
export declare function createHljsHighlighter(highlighter?: HLJSApi): MdxCodeHighlighter;
|
|
25
|
-
//#endregion
|
|
26
|
-
//#region packages/ts-highlight/src/index.d.ts
|
|
27
22
|
export interface HighlightPluginOptions {
|
|
28
23
|
createShiki?: MdxShikiFactory;
|
|
29
24
|
createHighlightJs?: () => HLJSApi | Promise<HLJSApi>;
|
|
@@ -46,6 +41,5 @@ export declare function highlightPlugin(options?: HighlightPluginOptions): {
|
|
|
46
41
|
}): Promise<import("@purestack/ts-common").MdxCodeHighlighter | undefined>;
|
|
47
42
|
};
|
|
48
43
|
};
|
|
49
|
-
//#endregion
|
|
50
44
|
export type { MdxCodeLangs, MdxCodeThemes, MdxHighlighterOptions, MdxShikiFactory };
|
|
51
45
|
//# sourceMappingURL=ts-highlight.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ts-highlight.d.mts","names":[],"sources":["../src/shiki.ts","../src/highlightjs.ts","../src/index.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"ts-highlight.d.mts","names":[],"sources":["../src/shiki.ts","../src/highlightjs.ts","../src/index.ts"],"mappings":";;;KAQY,mBACV,SAAS,kBAAkB,0BACxB,cAAc,QAAQ;UAEV;EACf;EACA;;KAGU;qBAEC,yBAAyB;qBAKzB,wBAAwB;UAIpB;;EAEf,SAAS;;EAET;;wBAGoB,qBACpB,SAAQ,eACR,QAAO,gBACL,QAAQ,OAAO,aAAmB,wBACnC,QAAQ;wBCzBK,sBACd,cAAa,UACZ;iBCAc;EACf,cAAc;EACd,0BAA0B,UAAU,QAAQ;;;wBAI9B,gBAAgB,UAAS;EAErC;EACA;EACA;IACE,YAAS,UAAa;MAElB;QAAO;;;;EAIb;IACQ,oBAAiB,KAAA;MAIrB,KAAK,QAAQ;MACb;QACD,uCAAA"}
|
package/dist/ts-highlight.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @purestack/ts-highlight v1.1.
|
|
1
|
+
/*! @purestack/ts-highlight v1.1.33 | (c) 2026 Ahmed Yasin Koculu | MIT License */
|
|
2
2
|
|
|
3
3
|
import { createRequire } from "node:module";
|
|
4
4
|
import { DEFAULT_CODE_LANGUAGES, normalizeCodeLanguage } from "@purestack/ts-common";
|
|
@@ -6,7 +6,7 @@ import hljs from "highlight.js";
|
|
|
6
6
|
import { createHighlighter } from "shiki";
|
|
7
7
|
import { PersistentCache } from "@purestack/ts-util-node";
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
// packages/ts-highlight/src/highlightjs.ts
|
|
10
10
|
const hljsLanguages = /* @__PURE__ */ new Map([
|
|
11
11
|
["jsonc", "json"],
|
|
12
12
|
["mdx", "markdown"],
|
|
@@ -32,8 +32,7 @@ function escapeHtml(value) {
|
|
|
32
32
|
return value.replaceAll("&", "&").replaceAll("<", "<").replaceAll(">", ">");
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
|
|
36
|
-
//#region packages/ts-highlight/src/shikiCache.ts
|
|
35
|
+
// packages/ts-highlight/src/shikiCache.ts
|
|
37
36
|
const CACHE_SCHEMA = 1;
|
|
38
37
|
const SHIKI_VERSION = createRequire(import.meta.url)("shiki/package.json").version;
|
|
39
38
|
function openShikiCache(themes, languages) {
|
|
@@ -52,8 +51,7 @@ function openShikiCache(themes, languages) {
|
|
|
52
51
|
});
|
|
53
52
|
}
|
|
54
53
|
|
|
55
|
-
|
|
56
|
-
//#region packages/ts-highlight/src/shiki.ts
|
|
54
|
+
// packages/ts-highlight/src/shiki.ts
|
|
57
55
|
const DEFAULT_MDX_CODE_THEMES = {
|
|
58
56
|
light: "github-light",
|
|
59
57
|
dark: "github-dark"
|
|
@@ -103,8 +101,7 @@ function dedupe(values) {
|
|
|
103
101
|
return Array.from(new Set(values.filter((value) => value.length > 0)));
|
|
104
102
|
}
|
|
105
103
|
|
|
106
|
-
|
|
107
|
-
//#region packages/ts-highlight/src/index.ts
|
|
104
|
+
// packages/ts-highlight/src/index.ts
|
|
108
105
|
/** The standard highlighter, replaceable through markdown.createHighlighter. */
|
|
109
106
|
function highlightPlugin(options = {}) {
|
|
110
107
|
return {
|
|
@@ -131,6 +128,5 @@ function backendIdentifier(value) {
|
|
|
131
128
|
return value.trim();
|
|
132
129
|
}
|
|
133
130
|
|
|
134
|
-
//#endregion
|
|
135
131
|
export { DEFAULT_MDX_CODE_LANGS, DEFAULT_MDX_CODE_THEMES, createHljsHighlighter, createMdxHighlighter, highlightPlugin };
|
|
136
132
|
//# sourceMappingURL=ts-highlight.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ts-highlight.mjs","names":[],"sources":["../src/highlightjs.ts","../src/shikiCache.ts","../src/shiki.ts","../src/index.ts"],"sourcesContent":["import {\n type MdxCodeHighlighter,\n normalizeCodeLanguage,\n} from '@purestack/ts-common'\nimport hljs, { type HLJSApi } from 'highlight.js'\n\n// Use highlight.js names, or the closest grammar for Shiki-only languages.\nconst hljsLanguages = new Map([\n ['jsonc', 'json'],\n ['mdx', 'markdown'],\n ['objective-c', 'objectivec'],\n ['ts-tags', 'typescript'],\n])\n\nexport function createHljsHighlighter(\n highlighter: HLJSApi = hljs,\n): MdxCodeHighlighter {\n return {\n codeToHtml: (code: string, lang?: string) => {\n const normalizedLang = normalizeCodeLanguage(lang ?? '')\n const highlightLang = hljsLanguages.get(normalizedLang) ?? normalizedLang\n if (highlightLang && highlighter.getLanguage(highlightLang)) {\n const highlighted = highlighter.highlight(code, {\n language: highlightLang,\n ignoreIllegals: true,\n })\n return `<pre class=\"hljs\"><code class=\"hljs language-${highlighted.language}\">${highlighted.value}</code></pre>`\n }\n\n const escaped = escapeHtml(code)\n const langClass = normalizedLang ? ` language-${normalizedLang}` : ''\n return `<pre class=\"hljs\"><code class=\"hljs${langClass}\">${escaped}</code></pre>`\n },\n }\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n}\n","import { createRequire } from 'node:module'\nimport { PersistentCache } from '@purestack/ts-util-node'\n\n// Bump when the highlighter's rendering options change cached output.\nconst CACHE_SCHEMA = 1\nconst SHIKI_VERSION: string = createRequire(import.meta.url)(\n 'shiki/package.json',\n).version\n\nexport function openShikiCache(\n themes: Record<'light' | 'dark', string>,\n languages: readonly string[],\n) {\n return new PersistentCache<string>({\n namespace: 'shiki',\n version: JSON.stringify([CACHE_SCHEMA, SHIKI_VERSION, themes, languages]),\n codec: {\n encode: (html) => html,\n decode: (data) => data.toString('utf8'),\n },\n })\n}\n","import {\n DEFAULT_CODE_LANGUAGES,\n type MdxCodeHighlighter,\n normalizeCodeLanguage,\n} from '@purestack/ts-common'\nimport { createHighlighter, type Highlighter } from 'shiki'\nimport { openShikiCache } from './shikiCache'\n\nexport type MdxShikiFactory = (\n options: Parameters<typeof createHighlighter>[0],\n) => Highlighter | Promise<Highlighter>\n\nexport interface MdxCodeThemes {\n light: string\n dark: string\n}\n\nexport type MdxCodeLangs = string[]\n\nexport const DEFAULT_MDX_CODE_THEMES: MdxCodeThemes = {\n light: 'github-light',\n dark: 'github-dark',\n}\n\nexport const DEFAULT_MDX_CODE_LANGS: MdxCodeLangs = DEFAULT_CODE_LANGUAGES\n\nconst TYPESCRIPT_WITH_TAGS_LANG = 'ts-tags'\n\nexport interface MdxHighlighterOptions {\n /** A custom factory; its grammars are unknown, so its output is never cached. */\n create?: MdxShikiFactory\n /** `false` disables the persistent cache for this run. Defaults to `true`. */\n cache?: boolean\n}\n\nexport async function createMdxHighlighter(\n themes: MdxCodeThemes = DEFAULT_MDX_CODE_THEMES,\n langs: MdxCodeLangs = DEFAULT_MDX_CODE_LANGS,\n { create, cache: useCache = true }: MdxHighlighterOptions = {},\n): Promise<MdxCodeHighlighter> {\n const options = {\n themes: dedupe([themes.light, themes.dark]),\n langs: resolveLoadedLanguages(langs),\n }\n const render = (highlighter: Highlighter, code: string, lang: string) =>\n highlighter.codeToHtml(code, {\n lang,\n themes: { light: themes.light, dark: themes.dark },\n defaultColor: false,\n })\n\n if (create || !useCache) {\n const highlighter = await (create ?? createHighlighter)(options)\n return {\n codeToHtml: (code: string, lang?: string) =>\n render(highlighter, code, resolveHighlightLanguage(lang)),\n }\n }\n\n // Bundled grammars and themes are identified by name and Shiki's version, so\n // their output is reused across builds. Shiki loads on the first cache miss.\n const cache = openShikiCache(themes, options.langs)\n let highlighter: Promise<Highlighter> | undefined\n return {\n flush: () => cache.flush(),\n async codeToHtml(code: string, lang?: string) {\n const resolved = resolveHighlightLanguage(lang)\n return cache.getOrSetAsync(`${resolved}\\0${code}`, async () => {\n highlighter ??= createHighlighter(options)\n return render(await highlighter, code, resolved)\n })\n },\n }\n}\n\nfunction resolveLoadedLanguages(langs: string[]) {\n const resolved = dedupe(langs.map(normalizeCodeLanguage))\n if (\n resolved.includes('typescript') &&\n !resolved.includes(TYPESCRIPT_WITH_TAGS_LANG)\n ) {\n resolved.push(TYPESCRIPT_WITH_TAGS_LANG)\n }\n return resolved\n}\n\nfunction resolveHighlightLanguage(lang: string | undefined) {\n const normalized = normalizeCodeLanguage(lang ?? 'text')\n return normalized === 'typescript'\n ? TYPESCRIPT_WITH_TAGS_LANG\n : normalized || 'text'\n}\n\nfunction dedupe(values: string[]) {\n return Array.from(new Set(values.filter((value) => value.length > 0)))\n}\n","import type { SiteConfigResolution, SiteMdxConfig } from '@purestack/ts-common'\nimport type { HLJSApi } from 'highlight.js'\nimport { createHljsHighlighter } from './highlightjs'\nimport { createMdxHighlighter, type MdxShikiFactory } from './shiki'\n\nexport { createHljsHighlighter } from './highlightjs'\nexport {\n createMdxHighlighter,\n DEFAULT_MDX_CODE_LANGS,\n DEFAULT_MDX_CODE_THEMES,\n type MdxCodeLangs,\n type MdxCodeThemes,\n type MdxHighlighterOptions,\n type MdxShikiFactory,\n} from './shiki'\n\nexport interface HighlightPluginOptions {\n createShiki?: MdxShikiFactory\n createHighlightJs?: () => HLJSApi | Promise<HLJSApi>\n}\n\n/** The standard highlighter, replaceable through markdown.createHighlighter. */\nexport function highlightPlugin(options: HighlightPluginOptions = {}) {\n return {\n name: 'purestack:highlight',\n defaults: true,\n config: {\n normalize({ config }: SiteConfigResolution) {\n return {\n mdx: { highlighter: backendIdentifier(config.mdx.highlighter) },\n }\n },\n },\n markdown: {\n async createHighlighter({\n mdx,\n cache,\n }: {\n mdx: Partial<SiteMdxConfig>\n cache: boolean\n }) {\n if (mdx.disableHighlighter) return undefined\n const backend = backendIdentifier(mdx.highlighter)\n if (backend === 'highlightjs')\n return createHljsHighlighter(await options.createHighlightJs?.())\n if (backend === 'shiki')\n return createMdxHighlighter(undefined, undefined, {\n create: options.createShiki,\n cache,\n })\n throw new Error(\n `The standard highlighting plugin does not support backend \"${backend}\". Supply a custom markdown.createHighlighter provider.`,\n )\n },\n },\n }\n}\n\nfunction backendIdentifier(value: unknown): string {\n if (value === undefined) return 'highlightjs'\n if (typeof value !== 'string' || !value.trim())\n throw new Error('mdx.highlighter must be a non-empty backend identifier.')\n return value.trim()\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ts-highlight.mjs","names":[],"sources":["../src/highlightjs.ts","../src/shikiCache.ts","../src/shiki.ts","../src/index.ts"],"sourcesContent":["import {\n type MdxCodeHighlighter,\n normalizeCodeLanguage,\n} from '@purestack/ts-common'\nimport hljs, { type HLJSApi } from 'highlight.js'\n\n// Use highlight.js names, or the closest grammar for Shiki-only languages.\nconst hljsLanguages = new Map([\n ['jsonc', 'json'],\n ['mdx', 'markdown'],\n ['objective-c', 'objectivec'],\n ['ts-tags', 'typescript'],\n])\n\nexport function createHljsHighlighter(\n highlighter: HLJSApi = hljs,\n): MdxCodeHighlighter {\n return {\n codeToHtml: (code: string, lang?: string) => {\n const normalizedLang = normalizeCodeLanguage(lang ?? '')\n const highlightLang = hljsLanguages.get(normalizedLang) ?? normalizedLang\n if (highlightLang && highlighter.getLanguage(highlightLang)) {\n const highlighted = highlighter.highlight(code, {\n language: highlightLang,\n ignoreIllegals: true,\n })\n return `<pre class=\"hljs\"><code class=\"hljs language-${highlighted.language}\">${highlighted.value}</code></pre>`\n }\n\n const escaped = escapeHtml(code)\n const langClass = normalizedLang ? ` language-${normalizedLang}` : ''\n return `<pre class=\"hljs\"><code class=\"hljs${langClass}\">${escaped}</code></pre>`\n },\n }\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n}\n","import { createRequire } from 'node:module'\nimport { PersistentCache } from '@purestack/ts-util-node'\n\n// Bump when the highlighter's rendering options change cached output.\nconst CACHE_SCHEMA = 1\nconst SHIKI_VERSION: string = createRequire(import.meta.url)(\n 'shiki/package.json',\n).version\n\nexport function openShikiCache(\n themes: Record<'light' | 'dark', string>,\n languages: readonly string[],\n) {\n return new PersistentCache<string>({\n namespace: 'shiki',\n version: JSON.stringify([CACHE_SCHEMA, SHIKI_VERSION, themes, languages]),\n codec: {\n encode: (html) => html,\n decode: (data) => data.toString('utf8'),\n },\n })\n}\n","import {\n DEFAULT_CODE_LANGUAGES,\n type MdxCodeHighlighter,\n normalizeCodeLanguage,\n} from '@purestack/ts-common'\nimport { createHighlighter, type Highlighter } from 'shiki'\nimport { openShikiCache } from './shikiCache'\n\nexport type MdxShikiFactory = (\n options: Parameters<typeof createHighlighter>[0],\n) => Highlighter | Promise<Highlighter>\n\nexport interface MdxCodeThemes {\n light: string\n dark: string\n}\n\nexport type MdxCodeLangs = string[]\n\nexport const DEFAULT_MDX_CODE_THEMES: MdxCodeThemes = {\n light: 'github-light',\n dark: 'github-dark',\n}\n\nexport const DEFAULT_MDX_CODE_LANGS: MdxCodeLangs = DEFAULT_CODE_LANGUAGES\n\nconst TYPESCRIPT_WITH_TAGS_LANG = 'ts-tags'\n\nexport interface MdxHighlighterOptions {\n /** A custom factory; its grammars are unknown, so its output is never cached. */\n create?: MdxShikiFactory\n /** `false` disables the persistent cache for this run. Defaults to `true`. */\n cache?: boolean\n}\n\nexport async function createMdxHighlighter(\n themes: MdxCodeThemes = DEFAULT_MDX_CODE_THEMES,\n langs: MdxCodeLangs = DEFAULT_MDX_CODE_LANGS,\n { create, cache: useCache = true }: MdxHighlighterOptions = {},\n): Promise<MdxCodeHighlighter> {\n const options = {\n themes: dedupe([themes.light, themes.dark]),\n langs: resolveLoadedLanguages(langs),\n }\n const render = (highlighter: Highlighter, code: string, lang: string) =>\n highlighter.codeToHtml(code, {\n lang,\n themes: { light: themes.light, dark: themes.dark },\n defaultColor: false,\n })\n\n if (create || !useCache) {\n const highlighter = await (create ?? createHighlighter)(options)\n return {\n codeToHtml: (code: string, lang?: string) =>\n render(highlighter, code, resolveHighlightLanguage(lang)),\n }\n }\n\n // Bundled grammars and themes are identified by name and Shiki's version, so\n // their output is reused across builds. Shiki loads on the first cache miss.\n const cache = openShikiCache(themes, options.langs)\n let highlighter: Promise<Highlighter> | undefined\n return {\n flush: () => cache.flush(),\n async codeToHtml(code: string, lang?: string) {\n const resolved = resolveHighlightLanguage(lang)\n return cache.getOrSetAsync(`${resolved}\\0${code}`, async () => {\n highlighter ??= createHighlighter(options)\n return render(await highlighter, code, resolved)\n })\n },\n }\n}\n\nfunction resolveLoadedLanguages(langs: string[]) {\n const resolved = dedupe(langs.map(normalizeCodeLanguage))\n if (\n resolved.includes('typescript') &&\n !resolved.includes(TYPESCRIPT_WITH_TAGS_LANG)\n ) {\n resolved.push(TYPESCRIPT_WITH_TAGS_LANG)\n }\n return resolved\n}\n\nfunction resolveHighlightLanguage(lang: string | undefined) {\n const normalized = normalizeCodeLanguage(lang ?? 'text')\n return normalized === 'typescript'\n ? TYPESCRIPT_WITH_TAGS_LANG\n : normalized || 'text'\n}\n\nfunction dedupe(values: string[]) {\n return Array.from(new Set(values.filter((value) => value.length > 0)))\n}\n","import type { SiteConfigResolution, SiteMdxConfig } from '@purestack/ts-common'\nimport type { HLJSApi } from 'highlight.js'\nimport { createHljsHighlighter } from './highlightjs'\nimport { createMdxHighlighter, type MdxShikiFactory } from './shiki'\n\nexport { createHljsHighlighter } from './highlightjs'\nexport {\n createMdxHighlighter,\n DEFAULT_MDX_CODE_LANGS,\n DEFAULT_MDX_CODE_THEMES,\n type MdxCodeLangs,\n type MdxCodeThemes,\n type MdxHighlighterOptions,\n type MdxShikiFactory,\n} from './shiki'\n\nexport interface HighlightPluginOptions {\n createShiki?: MdxShikiFactory\n createHighlightJs?: () => HLJSApi | Promise<HLJSApi>\n}\n\n/** The standard highlighter, replaceable through markdown.createHighlighter. */\nexport function highlightPlugin(options: HighlightPluginOptions = {}) {\n return {\n name: 'purestack:highlight',\n defaults: true,\n config: {\n normalize({ config }: SiteConfigResolution) {\n return {\n mdx: { highlighter: backendIdentifier(config.mdx.highlighter) },\n }\n },\n },\n markdown: {\n async createHighlighter({\n mdx,\n cache,\n }: {\n mdx: Partial<SiteMdxConfig>\n cache: boolean\n }) {\n if (mdx.disableHighlighter) return undefined\n const backend = backendIdentifier(mdx.highlighter)\n if (backend === 'highlightjs')\n return createHljsHighlighter(await options.createHighlightJs?.())\n if (backend === 'shiki')\n return createMdxHighlighter(undefined, undefined, {\n create: options.createShiki,\n cache,\n })\n throw new Error(\n `The standard highlighting plugin does not support backend \"${backend}\". Supply a custom markdown.createHighlighter provider.`,\n )\n },\n },\n }\n}\n\nfunction backendIdentifier(value: unknown): string {\n if (value === undefined) return 'highlightjs'\n if (typeof value !== 'string' || !value.trim())\n throw new Error('mdx.highlighter must be a non-empty backend identifier.')\n return value.trim()\n}\n"],"mappings":";;;;;;;AAOA,MAAM,gCAAgB,IAAI,IAAI;CAC5B,CAAC,SAAS,MAAM;CAChB,CAAC,OAAO,UAAU;CAClB,CAAC,eAAe,YAAY;CAC5B,CAAC,WAAW,YAAY;AAC1B,CAAC;AAED,SAAgB,sBACd,cAAuB,MACH;CACpB,OAAO,EACL,aAAa,MAAc,SAAkB;EAC3C,MAAM,iBAAiB,sBAAsB,QAAQ,EAAE;EACvD,MAAM,gBAAgB,cAAc,IAAI,cAAc,KAAK;EAC3D,IAAI,iBAAiB,YAAY,YAAY,aAAa,GAAG;GAC3D,MAAM,cAAc,YAAY,UAAU,MAAM;IAC9C,UAAU;IACV,gBAAgB;GAClB,CAAC;GACD,OAAO,gDAAgD,YAAY,SAAS,IAAI,YAAY,MAAM;EACpG;EAEA,MAAM,UAAU,WAAW,IAAI;EAE/B,OAAO,sCADW,iBAAiB,aAAa,mBAAmB,GACZ,IAAI,QAAQ;CACrE,EACF;AACF;AAEA,SAAS,WAAW,OAAuB;CACzC,OAAO,MACJ,WAAW,KAAK,OAAO,CAAC,CACxB,WAAW,KAAK,MAAM,CAAC,CACvB,WAAW,KAAK,MAAM;AAC3B;;;ACrCA,MAAM,eAAe;AACrB,MAAM,gBAAwB,cAAc,YAAY,GAAG,CAAC,CAC1D,oBACF,CAAC,CAAC;AAEF,SAAgB,eACd,QACA,WACA;CACA,OAAO,IAAI,gBAAwB;EACjC,WAAW;EACX,SAAS,KAAK,UAAU;GAAC;GAAc;GAAe;GAAQ;EAAS,CAAC;EACxE,OAAO;GACL,SAAS,SAAS;GAClB,SAAS,SAAS,KAAK,SAAS,MAAM;EACxC;CACF,CAAC;AACH;;;ACFA,MAAa,0BAAyC;CACpD,OAAO;CACP,MAAM;AACR;AAEA,MAAa,yBAAuC;AAEpD,MAAM,4BAA4B;AASlC,eAAsB,qBACpB,SAAwB,yBACxB,QAAsB,wBACtB,EAAE,QAAQ,OAAO,WAAW,SAAgC,CAAC,GAChC;CAC7B,MAAM,UAAU;EACd,QAAQ,OAAO,CAAC,OAAO,OAAO,OAAO,IAAI,CAAC;EAC1C,OAAO,uBAAuB,KAAK;CACrC;CACA,MAAM,UAAU,aAA0B,MAAc,SACtD,YAAY,WAAW,MAAM;EAC3B;EACA,QAAQ;GAAE,OAAO,OAAO;GAAO,MAAM,OAAO;EAAK;EACjD,cAAc;CAChB,CAAC;CAEH,IAAI,UAAU,CAAC,UAAU;EACvB,MAAM,cAAc,OAAO,UAAU,kBAAiB,CAAE,OAAO;EAC/D,OAAO,EACL,aAAa,MAAc,SACzB,OAAO,aAAa,MAAM,yBAAyB,IAAI,CAAC,EAC5D;CACF;CAIA,MAAM,QAAQ,eAAe,QAAQ,QAAQ,KAAK;CAClD,IAAI;CACJ,OAAO;EACL,aAAa,MAAM,MAAM;EACzB,MAAM,WAAW,MAAc,MAAe;GAC5C,MAAM,WAAW,yBAAyB,IAAI;GAC9C,OAAO,MAAM,cAAc,GAAG,SAAS,IAAI,QAAQ,YAAY;IAC7D,gBAAgB,kBAAkB,OAAO;IACzC,OAAO,OAAO,MAAM,aAAa,MAAM,QAAQ;GACjD,CAAC;EACH;CACF;AACF;AAEA,SAAS,uBAAuB,OAAiB;CAC/C,MAAM,WAAW,OAAO,MAAM,IAAI,qBAAqB,CAAC;CACxD,IACE,SAAS,SAAS,YAAY,KAC9B,CAAC,SAAS,SAAS,yBAAyB,GAE5C,SAAS,KAAK,yBAAyB;CAEzC,OAAO;AACT;AAEA,SAAS,yBAAyB,MAA0B;CAC1D,MAAM,aAAa,sBAAsB,QAAQ,MAAM;CACvD,OAAO,eAAe,eAClB,4BACA,cAAc;AACpB;AAEA,SAAS,OAAO,QAAkB;CAChC,OAAO,MAAM,KAAK,IAAI,IAAI,OAAO,QAAQ,UAAU,MAAM,SAAS,CAAC,CAAC,CAAC;AACvE;;;;ACzEA,SAAgB,gBAAgB,UAAkC,CAAC,GAAG;CACpE,OAAO;EACL,MAAM;EACN,UAAU;EACV,QAAQ,EACN,UAAU,EAAE,UAAgC;GAC1C,OAAO,EACL,KAAK,EAAE,aAAa,kBAAkB,OAAO,IAAI,WAAW,EAAE,EAChE;EACF,EACF;EACA,UAAU,EACR,MAAM,kBAAkB,EACtB,KACA,SAIC;GACD,IAAI,IAAI,oBAAoB,OAAO;GACnC,MAAM,UAAU,kBAAkB,IAAI,WAAW;GACjD,IAAI,YAAY,eACd,OAAO,sBAAsB,MAAM,QAAQ,oBAAoB,CAAC;GAClE,IAAI,YAAY,SACd,OAAO,qBAAqB,QAAW,QAAW;IAChD,QAAQ,QAAQ;IAChB;GACF,CAAC;GACH,MAAM,IAAI,MACR,8DAA8D,QAAQ,wDACxE;EACF,EACF;CACF;AACF;AAEA,SAAS,kBAAkB,OAAwB;CACjD,IAAI,UAAU,QAAW,OAAO;CAChC,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,KAAK,GAC3C,MAAM,IAAI,MAAM,yDAAyD;CAC3E,OAAO,MAAM,KAAK;AACpB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@purestack/ts-highlight",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.33",
|
|
4
4
|
"packageManager": "yarn@4.9.2",
|
|
5
5
|
"module": "./dist/ts-highlight.mjs",
|
|
6
6
|
"types": "./dist/ts-highlight.d.mts",
|
|
@@ -39,8 +39,8 @@
|
|
|
39
39
|
"test": "vitest"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@purestack/ts-common": "^1.1.
|
|
43
|
-
"@purestack/ts-util-node": "^1.1.
|
|
42
|
+
"@purestack/ts-common": "^1.1.33",
|
|
43
|
+
"@purestack/ts-util-node": "^1.1.33",
|
|
44
44
|
"highlight.js": "^11.11.1",
|
|
45
45
|
"shiki": "^3.22.0"
|
|
46
46
|
}
|