', () => {
const $ = cheerio.load(html);
expect($('pre')).to.have.lengthOf(1);
expect($('pre').attr('class')).to.equal('astro-code css-variables');
+ // TODO: We can't specify CSS vars with shikiji
expect(
$('pre, pre span')
.map((i, f) => (f.attribs ? f.attribs.style : 'no style found'))
diff --git a/packages/astro/test/astro-markdown-shiki.test.js b/packages/astro/test/astro-markdown-shiki.test.js
index bf3e0724b..88927c4e7 100644
--- a/packages/astro/test/astro-markdown-shiki.test.js
+++ b/packages/astro/test/astro-markdown-shiki.test.js
@@ -20,7 +20,9 @@ describe('Astro Markdown Shiki', () => {
expect($('pre')).to.have.lengthOf(2);
expect($('pre').hasClass('astro-code')).to.equal(true);
- expect($('pre').attr().style).to.equal('background-color: #24292e; overflow-x: auto;');
+ expect($('pre').attr().style).to.equal(
+ 'background-color:#24292e;color:#e1e4e8; overflow-x: auto;'
+ );
});
it('Can render diff syntax with "user-select: none"', async () => {
@@ -47,7 +49,9 @@ describe('Astro Markdown Shiki', () => {
expect($('pre')).to.have.lengthOf(1);
expect($('pre').hasClass('astro-code')).to.equal(true);
- expect($('pre').attr().style).to.equal('background-color: #fff; overflow-x: auto;');
+ expect($('pre').attr().style).to.equal(
+ 'background-color:#fff;color:#24292e; overflow-x: auto;'
+ );
});
});
@@ -65,7 +69,9 @@ describe('Astro Markdown Shiki', () => {
expect($('pre')).to.have.lengthOf(1);
expect($('pre').hasClass('astro-code')).to.equal(true);
- expect($('pre').attr().style).to.equal('background-color: #FDFDFE; overflow-x: auto;');
+ expect($('pre').attr().style).to.equal(
+ 'background-color:#FDFDFE;color:#4E5377; overflow-x: auto;'
+ );
});
});
});
@@ -83,12 +89,12 @@ describe('Astro Markdown Shiki', () => {
const $ = cheerio.load(html);
const segments = $('.line').get(6).children;
- expect(segments).to.have.lengthOf(3);
- expect(segments[0].attribs.style).to.be.equal('color: #E1E4E8');
- expect(segments[1].attribs.style).to.be.equal('color: #79B8FF');
- expect(segments[2].attribs.style).to.be.equal('color: #E1E4E8');
+ expect(segments).to.have.lengthOf(2);
+ expect(segments[0].attribs.style).to.be.equal('color:#79B8FF');
+ expect(segments[1].attribs.style).to.be.equal('color:#E1E4E8');
const unknownLang = $('.line').last().html();
+ // TODO: There's a shikiji bug where it's style=""
expect(unknownLang).to.be.equal(
'This language does not exist'
);
@@ -98,7 +104,7 @@ describe('Astro Markdown Shiki', () => {
describe('Wrap', () => {
describe('wrap = true', () => {
const style =
- 'background-color: #24292e; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;';
+ 'background-color:#24292e;color:#e1e4e8; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;';
let fixture;
before(async () => {
@@ -117,7 +123,7 @@ describe('Astro Markdown Shiki', () => {
});
describe('wrap = false', () => {
- const style = 'background-color: #24292e; overflow-x: auto;';
+ const style = 'background-color:#24292e;color:#e1e4e8; overflow-x: auto;';
let fixture;
before(async () => {
@@ -135,7 +141,7 @@ describe('Astro Markdown Shiki', () => {
});
describe('wrap = null', () => {
- const style = 'background-color: #24292e';
+ const style = 'background-color:#24292e;color:#e1e4e8';
let fixture;
before(async () => {
diff --git a/packages/astro/test/units/shiki/shiki.test.js b/packages/astro/test/units/shiki/shiki.test.js
deleted file mode 100644
index d88f3c31e..000000000
--- a/packages/astro/test/units/shiki/shiki.test.js
+++ /dev/null
@@ -1,45 +0,0 @@
-import { expect } from 'chai';
-import { fileURLToPath } from 'node:url';
-import { createContainer } from '../../../dist/core/dev/index.js';
-import { createViteLoader } from '../../../dist/core/module-loader/index.js';
-import { createBasicSettings, defaultLogger } from '../test-utils.js';
-
-const root = new URL('../../fixtures/alias/', import.meta.url);
-
-describe('
', () => {
- describe('Shiki - getHighlighterOptions', () => {
- let container;
- let mod;
- before(async () => {
- const settings = await createBasicSettings({ root: fileURLToPath(root) });
- container = await createContainer({ settings, logger: defaultLogger });
- const loader = createViteLoader(container.viteServer);
- mod = await loader.import('astro/components/Shiki.js');
- });
-
- after(async () => {
- await container.close();
- });
-
- it('uses the bundles themes for built-in themes', async () => {
- const { resolveHighlighterOptions } = mod;
- // NOTE: pass empty `langs` to prevent Shiki from loading all langs by default, which slows down the test
- const opts = await resolveHighlighterOptions({ theme: 'css-variables', langs: [] });
- const themes = opts.themes;
-
- expect(themes).to.have.a.lengthOf(1);
- expect(themes[0]).to.be.an('object');
- });
-
- it('uses the string theme name for custom themes', async () => {
- const { resolveHighlighterOptions } = mod;
- // NOTE: pass empty `langs` to prevent Shiki from loading all langs by default, which slows down the test
- const opts = await resolveHighlighterOptions({ theme: 'some-custom-theme', langs: [] });
- const themes = opts.themes;
-
- expect(themes).to.have.a.lengthOf(1);
- expect(themes[0]).to.be.an('string');
- expect(themes[0]).to.equal('some-custom-theme');
- });
- });
-});
diff --git a/packages/integrations/markdoc/package.json b/packages/integrations/markdoc/package.json
index ec01e6efb..64ed9921c 100644
--- a/packages/integrations/markdoc/package.json
+++ b/packages/integrations/markdoc/package.json
@@ -71,7 +71,7 @@
"gray-matter": "^4.0.3",
"htmlparser2": "^9.0.0",
"kleur": "^4.1.5",
- "shiki": "^0.14.3",
+ "shikiji": "^0.6.8",
"zod": "3.21.1"
},
"peerDependencies": {
diff --git a/packages/integrations/markdoc/src/extensions/shiki.ts b/packages/integrations/markdoc/src/extensions/shiki.ts
index df3e79cf7..0326118fb 100644
--- a/packages/integrations/markdoc/src/extensions/shiki.ts
+++ b/packages/integrations/markdoc/src/extensions/shiki.ts
@@ -1,8 +1,7 @@
import Markdoc from '@markdoc/markdoc';
import type { ShikiConfig } from 'astro';
import { unescapeHTML } from 'astro/runtime/server/index.js';
-import type * as shikiTypes from 'shiki';
-import { getHighlighter } from 'shiki';
+import { bundledLanguages, getHighlighter, type Highlighter } from 'shikiji';
import type { AstroMarkdocConfig } from '../config.js';
const ASTRO_COLOR_REPLACEMENTS = {
@@ -17,7 +16,7 @@ const ASTRO_COLOR_REPLACEMENTS = {
'#000010': 'var(--astro-code-token-string-expression)',
'#000011': 'var(--astro-code-token-punctuation)',
'#000012': 'var(--astro-code-token-link)',
-};
+} as const;
const PRE_SELECTOR = /([\+|\-])/g;
@@ -27,28 +26,23 @@ const INLINE_STYLE_SELECTOR = /style="(.*?)"/;
* Note: cache only needed for dev server reloads, internal test suites, and manual calls to `Markdoc.transform` by the user.
* Otherwise, `shiki()` is only called once per build, NOT once per page, so a cache isn't needed!
*/
-const highlighterCache = new Map();
+const highlighterCache = new Map();
export default async function shiki({
langs = [],
theme = 'github-dark',
wrap = false,
}: ShikiConfig = {}): Promise {
- const cacheID: string = typeof theme === 'string' ? theme : theme.name;
- if (!highlighterCache.has(cacheID)) {
- highlighterCache.set(
- cacheID,
- await getHighlighter({ theme }).then((hl) => {
- hl.setColorReplacements(ASTRO_COLOR_REPLACEMENTS);
- return hl;
- })
- );
+ const cacheId = typeof theme === 'string' ? theme : theme.name || '';
+ let highlighter = highlighterCache.get(cacheId)!;
+ if (!highlighter) {
+ highlighter = await getHighlighter({
+ langs: langs.length ? langs : Object.keys(bundledLanguages),
+ themes: [theme],
+ });
+ highlighterCache.set(cacheId, highlighter);
}
- const highlighter = highlighterCache.get(cacheID)!;
- for (const lang of langs) {
- await highlighter.loadLanguage(lang);
- }
return {
nodes: {
fence: {
@@ -72,7 +66,7 @@ export default async function shiki({
lang = 'plaintext';
}
- let html = highlighter.codeToHtml(attributes.content, { lang });
+ let html = highlighter.codeToHtml(attributes.content, { lang, theme });
// Q: Could these regexes match on a user's inputted code blocks?
// A: Nope! All rendered HTML is properly escaped.
diff --git a/packages/integrations/markdoc/test/fixtures/render-with-components/package.json b/packages/integrations/markdoc/test/fixtures/render-with-components/package.json
index 2cacd2cfb..b81033473 100644
--- a/packages/integrations/markdoc/test/fixtures/render-with-components/package.json
+++ b/packages/integrations/markdoc/test/fixtures/render-with-components/package.json
@@ -5,8 +5,5 @@
"dependencies": {
"@astrojs/markdoc": "workspace:*",
"astro": "workspace:*"
- },
- "devDependencies": {
- "shiki": "^0.14.3"
}
}
diff --git a/packages/markdown/remark/package.json b/packages/markdown/remark/package.json
index 8710cce08..639a27cb5 100644
--- a/packages/markdown/remark/package.json
+++ b/packages/markdown/remark/package.json
@@ -40,7 +40,7 @@
"remark-parse": "^10.0.2",
"remark-rehype": "^10.1.0",
"remark-smartypants": "^2.0.0",
- "shiki": "^0.14.3",
+ "shikiji": "^0.6.8",
"unified": "^10.1.2",
"unist-util-visit": "^4.1.2",
"vfile": "^5.3.7"
diff --git a/packages/markdown/remark/src/remark-shiki.ts b/packages/markdown/remark/src/remark-shiki.ts
index 6cd3861e5..e1dbd865c 100644
--- a/packages/markdown/remark/src/remark-shiki.ts
+++ b/packages/markdown/remark/src/remark-shiki.ts
@@ -1,5 +1,4 @@
-import type * as shiki from 'shiki';
-import { getHighlighter } from 'shiki';
+import { bundledLanguages, getHighlighter, type Highlighter } from 'shikiji';
import { visit } from 'unist-util-visit';
import type { RemarkPlugin, ShikiConfig } from './types.js';
@@ -8,49 +7,28 @@ import type { RemarkPlugin, ShikiConfig } from './types.js';
* cache it here as much as possible. Make sure that your highlighters can be cached, state-free.
* We make this async, so that multiple calls to parse markdown still share the same highlighter.
*/
-const highlighterCacheAsync = new Map>();
+const highlighterCacheAsync = new Map>();
export function remarkShiki({
langs = [],
theme = 'github-dark',
wrap = false,
}: ShikiConfig = {}): ReturnType {
- const cacheID: string = typeof theme === 'string' ? theme : theme.name;
- let highlighterAsync = highlighterCacheAsync.get(cacheID);
+ const cacheId =
+ (typeof theme === 'string' ? theme : theme.name ?? '') +
+ langs.map((l) => l.name ?? (l as any).id).join(',');
+
+ let highlighterAsync = highlighterCacheAsync.get(cacheId);
if (!highlighterAsync) {
- highlighterAsync = getHighlighter({ theme }).then((hl) => {
- hl.setColorReplacements({
- '#000001': 'var(--astro-code-color-text)',
- '#000002': 'var(--astro-code-color-background)',
- '#000004': 'var(--astro-code-token-constant)',
- '#000005': 'var(--astro-code-token-string)',
- '#000006': 'var(--astro-code-token-comment)',
- '#000007': 'var(--astro-code-token-keyword)',
- '#000008': 'var(--astro-code-token-parameter)',
- '#000009': 'var(--astro-code-token-function)',
- '#000010': 'var(--astro-code-token-string-expression)',
- '#000011': 'var(--astro-code-token-punctuation)',
- '#000012': 'var(--astro-code-token-link)',
- });
- return hl;
+ highlighterAsync = getHighlighter({
+ langs: langs.length ? langs : Object.keys(bundledLanguages),
+ themes: [theme],
});
- highlighterCacheAsync.set(cacheID, highlighterAsync);
+ highlighterCacheAsync.set(cacheId, highlighterAsync);
}
- let highlighter: shiki.Highlighter;
-
return async (tree: any) => {
- // Lazily assign the highlighter as async can only happen within this function,
- // and not on `remarkShiki` directly.
- if (!highlighter) {
- highlighter = await highlighterAsync!;
-
- // NOTE: There may be a performance issue here for large sites that use `lang`.
- // Since this will be called on every page load. Unclear how to fix this.
- for (const lang of langs) {
- await highlighter.loadLanguage(lang);
- }
- }
+ const highlighter = await highlighterAsync!;
visit(tree, 'code', (node) => {
let lang: string;
@@ -68,7 +46,7 @@ export function remarkShiki({
lang = 'plaintext';
}
- let html = highlighter.codeToHtml(node.value, { lang });
+ let html = highlighter.codeToHtml(node.value, { lang, theme });
// Q: Couldn't these regexes match on a user's inputted code blocks?
// A: Nope! All rendered HTML is properly escaped.
diff --git a/packages/markdown/remark/src/types.ts b/packages/markdown/remark/src/types.ts
index caeebec93..84dd6545e 100644
--- a/packages/markdown/remark/src/types.ts
+++ b/packages/markdown/remark/src/types.ts
@@ -5,7 +5,12 @@ import type {
all as Handlers,
Options as RemarkRehypeOptions,
} from 'remark-rehype';
-import type { ILanguageRegistration, IThemeRegistration, Theme } from 'shiki';
+import type {
+ BuiltinTheme,
+ LanguageRegistration,
+ ThemeRegistration,
+ ThemeRegistrationRaw,
+} from 'shikiji';
import type * as unified from 'unified';
import type { VFile } from 'vfile';
@@ -35,8 +40,8 @@ export type RemarkRehype = Omit=12'}
- /ansi-sequence-parser@1.1.0:
- resolution: {integrity: sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ==}
-
/ansi-styles@3.2.1:
resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
engines: {node: '>=4'}
@@ -12071,6 +12068,19 @@ packages:
web-namespaces: 2.0.1
dev: false
+ /hast-util-from-parse5@8.0.1:
+ resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==}
+ dependencies:
+ '@types/hast': 3.0.0
+ '@types/unist': 3.0.0
+ devlop: 1.1.0
+ hastscript: 8.0.0
+ property-information: 6.2.0
+ vfile: 6.0.1
+ vfile-location: 5.0.2
+ web-namespaces: 2.0.1
+ dev: false
+
/hast-util-has-property@2.0.1:
resolution: {integrity: sha512-X2+RwZIMTMKpXUzlotatPzWj8bspCymtXH3cfG3iQKV+wPF53Vgaqxi/eLqGck0wKq1kS9nvoB1wchbCPEL8sg==}
@@ -12096,6 +12106,12 @@ packages:
dependencies:
'@types/hast': 2.3.5
+ /hast-util-parse-selector@4.0.0:
+ resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
+ dependencies:
+ '@types/hast': 3.0.0
+ dev: false
+
/hast-util-raw@7.2.3:
resolution: {integrity: sha512-RujVQfVsOrxzPOPSzZFiwofMArbQke6DJjnFfceiEbFh7S05CbPt0cYN+A5YeD3pso0JQk6O1aHBnx9+Pm2uqg==}
dependencies:
@@ -12112,6 +12128,24 @@ packages:
zwitch: 2.0.4
dev: false
+ /hast-util-raw@9.0.1:
+ resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==}
+ dependencies:
+ '@types/hast': 3.0.0
+ '@types/unist': 3.0.0
+ '@ungap/structured-clone': 1.2.0
+ hast-util-from-parse5: 8.0.1
+ hast-util-to-parse5: 8.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.0.2
+ parse5: 7.1.2
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.0.0
+ vfile: 6.0.1
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+ dev: false
+
/hast-util-select@5.0.5:
resolution: {integrity: sha512-QQhWMhgTFRhCaQdgTKzZ5g31GLQ9qRb1hZtDPMqQaOhpLBziWcshUS0uCR5IJ0U1jrK/mxg35fmcq+Dp/Cy2Aw==}
dependencies:
@@ -12191,6 +12225,23 @@ packages:
zwitch: 2.0.4
dev: false
+ /hast-util-to-html@9.0.0:
+ resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==}
+ dependencies:
+ '@types/hast': 3.0.0
+ '@types/unist': 3.0.0
+ ccount: 2.0.1
+ comma-separated-tokens: 2.0.3
+ hast-util-raw: 9.0.1
+ hast-util-whitespace: 3.0.0
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.0.2
+ property-information: 6.2.0
+ space-separated-tokens: 2.0.2
+ stringify-entities: 4.0.3
+ zwitch: 2.0.4
+ dev: false
+
/hast-util-to-parse5@7.1.0:
resolution: {integrity: sha512-YNRgAJkH2Jky5ySkIqFXTQiaqcAtJyVE+D5lkN6CdtOqrnkLfGYYrEcKuHOJZlp+MwjSwuD3fZuawI+sic/RBw==}
dependencies:
@@ -12202,6 +12253,18 @@ packages:
zwitch: 2.0.4
dev: false
+ /hast-util-to-parse5@8.0.0:
+ resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==}
+ dependencies:
+ '@types/hast': 3.0.0
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ property-information: 6.2.0
+ space-separated-tokens: 2.0.2
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+ dev: false
+
/hast-util-to-string@2.0.0:
resolution: {integrity: sha512-02AQ3vLhuH3FisaMM+i/9sm4OXGSq1UhOOCpTLLQtHdL3tZt7qil69r8M8iDkZYyC0HCFylcYoP+8IO7ddta1A==}
dependencies:
@@ -12235,6 +12298,16 @@ packages:
property-information: 6.2.0
space-separated-tokens: 2.0.2
+ /hastscript@8.0.0:
+ resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==}
+ dependencies:
+ '@types/hast': 3.0.0
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 4.0.0
+ property-information: 6.2.0
+ space-separated-tokens: 2.0.2
+ dev: false
+
/hdr-histogram-js@3.0.0:
resolution: {integrity: sha512-/EpvQI2/Z98mNFYEnlqJ8Ogful8OpArLG/6Tf2bPnkutBVLIeMVNHjk1ZDfshF2BUweipzbk+dB1hgSB7SIakw==}
engines: {node: '>=14'}
@@ -12293,6 +12366,10 @@ packages:
resolution: {integrity: sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==}
dev: false
+ /html-void-elements@3.0.0:
+ resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==}
+ dev: false
+
/htmlparser2@8.0.2:
resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==}
dependencies:
@@ -13442,6 +13519,19 @@ packages:
unist-util-position: 4.0.4
unist-util-visit: 4.1.2
+ /mdast-util-to-hast@13.0.2:
+ resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==}
+ dependencies:
+ '@types/hast': 3.0.0
+ '@types/mdast': 4.0.0
+ '@ungap/structured-clone': 1.2.0
+ devlop: 1.1.0
+ micromark-util-sanitize-uri: 2.0.0
+ trim-lines: 3.0.1
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.0.0
+ dev: false
+
/mdast-util-to-markdown@1.5.0:
resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==}
dependencies:
@@ -13776,6 +13866,13 @@ packages:
micromark-util-symbol: 1.1.0
micromark-util-types: 1.1.0
+ /micromark-util-character@2.0.1:
+ resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==}
+ dependencies:
+ micromark-util-symbol: 2.0.0
+ micromark-util-types: 2.0.0
+ dev: false
+
/micromark-util-chunked@1.0.0:
resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==}
dependencies:
@@ -13825,6 +13922,10 @@ packages:
/micromark-util-encode@1.0.1:
resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==}
+ /micromark-util-encode@2.0.0:
+ resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==}
+ dev: false
+
/micromark-util-events-to-acorn@1.2.3:
resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==}
dependencies:
@@ -13870,6 +13971,14 @@ packages:
micromark-util-encode: 1.0.1
micromark-util-symbol: 1.1.0
+ /micromark-util-sanitize-uri@2.0.0:
+ resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==}
+ dependencies:
+ micromark-util-character: 2.0.1
+ micromark-util-encode: 2.0.0
+ micromark-util-symbol: 2.0.0
+ dev: false
+
/micromark-util-subtokenize@1.0.2:
resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==}
dependencies:
@@ -13884,12 +13993,20 @@ packages:
/micromark-util-symbol@1.1.0:
resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==}
+ /micromark-util-symbol@2.0.0:
+ resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==}
+ dev: false
+
/micromark-util-types@1.0.2:
resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==}
/micromark-util-types@1.1.0:
resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==}
+ /micromark-util-types@2.0.0:
+ resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==}
+ dev: false
+
/micromark@3.1.0:
resolution: {integrity: sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==}
dependencies:
@@ -16092,13 +16209,11 @@ packages:
vscode-textmate: 5.2.0
dev: true
- /shiki@0.14.3:
- resolution: {integrity: sha512-U3S/a+b0KS+UkTyMjoNojvTgrBHjgp7L6ovhFVZsXmBGnVdQ4K4U9oK0z63w538S91ATngv1vXigHCSWOwnr+g==}
+ /shikiji@0.6.8:
+ resolution: {integrity: sha512-K0axxNAdB9KvLUflU7QoLC7p6i2p1R2MFG0eP+iclbjtuEZqng99jHcg3VJL0GWRO67yozTICnykjo1HjOzdkg==}
dependencies:
- ansi-sequence-parser: 1.1.0
- jsonc-parser: 3.2.0
- vscode-oniguruma: 1.7.0
- vscode-textmate: 8.0.0
+ hast-util-to-html: 9.0.0
+ dev: false
/side-channel@1.0.4:
resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
@@ -17222,6 +17337,12 @@ packages:
dependencies:
'@types/unist': 2.0.7
+ /unist-util-position@5.0.0:
+ resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+ dependencies:
+ '@types/unist': 3.0.0
+ dev: false
+
/unist-util-remove-position@4.0.2:
resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==}
dependencies:
@@ -17242,6 +17363,12 @@ packages:
dependencies:
'@types/unist': 2.0.7
+ /unist-util-stringify-position@4.0.0:
+ resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
+ dependencies:
+ '@types/unist': 3.0.0
+ dev: false
+
/unist-util-visit-children@2.0.2:
resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==}
dependencies:
@@ -17421,12 +17548,26 @@ packages:
vfile: 5.3.7
dev: false
+ /vfile-location@5.0.2:
+ resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==}
+ dependencies:
+ '@types/unist': 3.0.0
+ vfile: 6.0.1
+ dev: false
+
/vfile-message@3.1.4:
resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==}
dependencies:
'@types/unist': 2.0.7
unist-util-stringify-position: 3.0.3
+ /vfile-message@4.0.2:
+ resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==}
+ dependencies:
+ '@types/unist': 3.0.0
+ unist-util-stringify-position: 4.0.0
+ dev: false
+
/vfile@5.3.7:
resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==}
dependencies:
@@ -17435,6 +17576,14 @@ packages:
unist-util-stringify-position: 3.0.3
vfile-message: 3.1.4
+ /vfile@6.0.1:
+ resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==}
+ dependencies:
+ '@types/unist': 3.0.0
+ unist-util-stringify-position: 4.0.0
+ vfile-message: 4.0.2
+ dev: false
+
/vite-node@0.34.2(@types/node@20.5.3):
resolution: {integrity: sha512-JtW249Zm3FB+F7pQfH56uWSdlltCo1IOkZW5oHBzeQo0iX4jtC7o1t9aILMGd9kVekXBP2lfJBEQt9rBh07ebA==}
engines: {node: '>=v14.18.0'}
@@ -17787,14 +17936,12 @@ packages:
/vscode-oniguruma@1.7.0:
resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==}
+ dev: true
/vscode-textmate@5.2.0:
resolution: {integrity: sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==}
dev: true
- /vscode-textmate@8.0.0:
- resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==}
-
/vscode-uri@2.1.2:
resolution: {integrity: sha512-8TEXQxlldWAuIODdukIb+TR5s+9Ds40eSJrw+1iDDA9IFORPjMELarNQE3myz5XIkWWpdprmJjm1/SxMlWOC8A==}
dev: true