@slidev/cli 0.48.8 → 0.48.9

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.
@@ -2,7 +2,7 @@ import {
2
2
  ViteSlidevPlugin,
3
3
  getIndexHtml,
4
4
  mergeViteConfigs
5
- } from "./chunk-D66Q4K5C.mjs";
5
+ } from "./chunk-STSW6326.mjs";
6
6
  import "./chunk-LOUKLO2C.mjs";
7
7
  import "./chunk-AQQIBD5X.mjs";
8
8
 
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ViteSlidevPlugin,
3
3
  mergeViteConfigs
4
- } from "./chunk-D66Q4K5C.mjs";
4
+ } from "./chunk-STSW6326.mjs";
5
5
  import {
6
6
  createResolver,
7
7
  getRoots,
@@ -48,7 +48,7 @@ async function createServer(options, viteConfig = {}, serverOptions = {}) {
48
48
  import * as parser from "@slidev/parser/fs";
49
49
 
50
50
  // package.json
51
- var version = "0.48.8";
51
+ var version = "0.48.9";
52
52
 
53
53
  // node/integrations/themes.ts
54
54
  import { join as join2 } from "node:path";
@@ -140,14 +140,14 @@ var dependencies = {
140
140
  "@iconify-json/carbon": "^1.1.31",
141
141
  "@iconify-json/ph": "^1.1.11",
142
142
  "@iconify-json/svg-spinners": "^1.1.2",
143
- "@shikijs/monaco": "^1.2.1",
144
- "@shikijs/vitepress-twoslash": "^1.2.1",
143
+ "@shikijs/monaco": "^1.2.3",
144
+ "@shikijs/vitepress-twoslash": "^1.2.3",
145
145
  "@slidev/parser": "workspace:*",
146
146
  "@slidev/rough-notation": "^0.1.0",
147
147
  "@slidev/types": "workspace:*",
148
148
  "@typescript/ata": "^0.9.4",
149
- "@unhead/vue": "^1.9.3",
150
- "@unocss/reset": "^0.58.8",
149
+ "@unhead/vue": "^1.9.4",
150
+ "@unocss/reset": "^0.58.9",
151
151
  "@vueuse/core": "^10.9.0",
152
152
  "@vueuse/math": "^10.9.0",
153
153
  "@vueuse/motion": "^2.1.0",
@@ -163,10 +163,10 @@ var dependencies = {
163
163
  "monaco-editor": "^0.47.0",
164
164
  prettier: "^3.2.5",
165
165
  recordrtc: "^5.6.2",
166
- shiki: "^1.2.1",
167
- "shiki-magic-move": "^0.3.4",
166
+ shiki: "^1.2.3",
167
+ "shiki-magic-move": "^0.3.5",
168
168
  typescript: "^5.4.3",
169
- unocss: "^0.58.8",
169
+ unocss: "^0.58.9",
170
170
  vue: "^3.4.21",
171
171
  "vue-demi": "^0.14.7",
172
172
  "vue-router": "^4.3.0"
@@ -476,38 +476,42 @@ import { uniq as uniq2 } from "@antfu/utils";
476
476
  // node/syntax/transform/monaco.ts
477
477
  import { isTruthy } from "@antfu/utils";
478
478
  import lz from "lz-string";
479
- function transformMonaco(md2, enabled = true) {
480
- if (!enabled)
481
- return truncateMancoMark(md2);
482
- md2 = md2.replace(
479
+ function transformMonaco(ctx, enabled = true) {
480
+ if (!enabled) {
481
+ ctx.s.replace(/{monaco([\w:,-]*)}/g, "");
482
+ return;
483
+ }
484
+ ctx.s.replace(
483
485
  /^```(\w+?)\s*{monaco-diff}\s*?({.*?})?\s*?\n([\s\S]+?)^~~~\s*?\n([\s\S]+?)^```/mg,
484
- (full, lang = "ts", options = "{}", code, diff) => {
486
+ (full, lang = "ts", options = "{}", code, diff, index) => {
485
487
  lang = lang.trim();
486
488
  options = options.trim() || "{}";
487
489
  const encoded = lz.compressToBase64(code);
488
490
  const encodedDiff = lz.compressToBase64(diff);
491
+ ctx.ignores.push([index, index + full.length]);
489
492
  return `<Monaco code-lz="${encoded}" diff-lz="${encodedDiff}" lang="${lang}" v-bind="${options}" />`;
490
493
  }
491
494
  );
492
- md2 = md2.replace(
495
+ ctx.s.replace(
493
496
  /^```(\w+?)\s*{monaco}\s*?({.*?})?\s*?\n([\s\S]+?)^```/mg,
494
- (full, lang = "ts", options = "{}", code) => {
497
+ (full, lang = "ts", options = "{}", code, index) => {
495
498
  lang = lang.trim();
496
499
  options = options.trim() || "{}";
497
500
  const encoded = lz.compressToBase64(code);
501
+ ctx.ignores.push([index, index + full.length]);
498
502
  return `<Monaco code-lz="${encoded}" lang="${lang}" v-bind="${options}" />`;
499
503
  }
500
504
  );
501
- md2 = md2.replace(
505
+ ctx.s.replace(
502
506
  /^```(\w+?)\s*{monaco-run}\s*?({.*?})?\s*?\n([\s\S]+?)^```/mg,
503
- (full, lang = "ts", options = "{}", code) => {
507
+ (full, lang = "ts", options = "{}", code, index) => {
504
508
  lang = lang.trim();
505
509
  options = options.trim() || "{}";
506
510
  const encoded = lz.compressToBase64(code);
511
+ ctx.ignores.push([index, index + full.length]);
507
512
  return `<Monaco runnable code-lz="${encoded}" lang="${lang}" v-bind="${options}" />`;
508
513
  }
509
514
  );
510
- return md2;
511
515
  }
512
516
  function scanMonacoModules(md2) {
513
517
  const typeModules = /* @__PURE__ */ new Set();
@@ -524,9 +528,6 @@ function scanMonacoModules(md2) {
524
528
  );
525
529
  return Array.from(typeModules);
526
530
  }
527
- function truncateMancoMark(md2) {
528
- return md2.replace(/{monaco([\w:,-]*)}/g, "");
529
- }
530
531
 
531
532
  // node/virtual/monaco-types.ts
532
533
  var templateMonacoTypes = {
@@ -919,6 +920,16 @@ function createSlidesLoader(options, pluginOptions, serverOptions) {
919
920
  }
920
921
  next();
921
922
  });
923
+ server.middlewares.use(async (req, res, next) => {
924
+ const match = req.url?.match(/^\/\@slidev\/resolve-id\/(.*)$/);
925
+ if (!match)
926
+ return next();
927
+ const [, specifier] = match;
928
+ const resolved = await server.pluginContainer.resolveId(specifier);
929
+ res.statusCode = 200;
930
+ res.write(resolved?.id ?? "");
931
+ return res.end();
932
+ });
922
933
  },
923
934
  async handleHotUpdate(ctx) {
924
935
  if (!data.watchFiles.includes(ctx.file))
@@ -1380,6 +1391,7 @@ function startsWithTodoMarkdown(token) {
1380
1391
 
1381
1392
  // node/vite/markdown.ts
1382
1393
  import MarkdownItMdc from "markdown-it-mdc";
1394
+ import MagicString from "magic-string";
1383
1395
  import MarkdownItAttrs from "markdown-it-link-attributes";
1384
1396
  import MarkdownItFootnote from "markdown-it-footnote";
1385
1397
 
@@ -1540,24 +1552,6 @@ import * as htmlparser2 from "htmlparser2";
1540
1552
  function normalizeRangeStr(rangeStr = "") {
1541
1553
  return !rangeStr.trim() ? [] : rangeStr.trim().split(/\|/g).map((i) => i.trim());
1542
1554
  }
1543
- function getCodeBlocks(md2) {
1544
- const codeblocks = Array.from(md2.matchAll(/^```[\s\S]*?^```/mg)).map((m) => {
1545
- const start = m.index;
1546
- const end = m.index + m[0].length;
1547
- const startLine = md2.slice(0, start).match(/\n/g)?.length || 0;
1548
- const endLine = md2.slice(0, end).match(/\n/g)?.length || 0;
1549
- return [start, end, startLine, endLine];
1550
- });
1551
- return {
1552
- codeblocks,
1553
- isInsideCodeblocks(idx) {
1554
- return codeblocks.some(([s, e]) => s <= idx && idx <= e);
1555
- },
1556
- isLineInsideCodeblocks(line) {
1557
- return codeblocks.some(([, , s, e]) => s <= line && line <= e);
1558
- }
1559
- };
1560
- }
1561
1555
  function escapeVueInCode(md2) {
1562
1556
  return md2.replace(/{{/g, "&lbrace;&lbrace;");
1563
1557
  }
@@ -1661,13 +1655,16 @@ function markdownItPrism(markdownit, useroptions) {
1661
1655
 
1662
1656
  // node/syntax/transform/code-wrapper.ts
1663
1657
  var reCodeBlock = /^```([\w'-]+?)(?:\s*{([\d\w*,\|-]+)}\s*?({.*?})?(.*?))?\n([\s\S]+?)^```$/mg;
1664
- function transformCodeWrapper(md2) {
1665
- return md2.replace(
1658
+ function transformCodeWrapper(ctx) {
1659
+ ctx.s.replace(
1666
1660
  reCodeBlock,
1667
- (full, lang = "", rangeStr = "", options = "", attrs = "", code) => {
1661
+ (full, lang = "", rangeStr = "", options = "", attrs = "", code, index) => {
1662
+ if (ctx.isIgnored(index))
1663
+ return full;
1668
1664
  const ranges = normalizeRangeStr(rangeStr);
1669
1665
  code = code.trimEnd();
1670
1666
  options = options.trim() || "{}";
1667
+ ctx.ignores.push([index, index + full.length]);
1671
1668
  return `
1672
1669
  <CodeBlockWrapper v-bind="${options}" :ranges='${JSON.stringify(ranges)}'>
1673
1670
 
@@ -1684,10 +1681,10 @@ ${code}
1684
1681
  import { codeToKeyedTokens } from "shiki-magic-move/core";
1685
1682
  import lz2 from "lz-string";
1686
1683
  var reMagicMoveBlock = /^````(?:md|markdown) magic-move(?:[ ]*(\{.*?\})?([^\n]*?))?\n([\s\S]+?)^````$/mg;
1687
- function transformMagicMove(md2, shiki2, shikiOptions2) {
1688
- return md2.replace(
1684
+ function transformMagicMove(ctx, shiki2, shikiOptions2) {
1685
+ ctx.s.replace(
1689
1686
  reMagicMoveBlock,
1690
- (full, options = "{}", _attrs = "", body) => {
1687
+ (full, options = "{}", _attrs = "", body, index) => {
1691
1688
  if (!shiki2 || !shikiOptions2)
1692
1689
  throw new Error("Shiki is required for Magic Move. You may need to set `highlighter: shiki` in your Slidev config.");
1693
1690
  const matches = Array.from(body.matchAll(reCodeBlock));
@@ -1701,6 +1698,7 @@ function transformMagicMove(md2, shiki2, shikiOptions2) {
1701
1698
  })
1702
1699
  );
1703
1700
  const compressed = lz2.compressToBase64(JSON.stringify(steps));
1701
+ ctx.ignores.push([index, index + full.length]);
1704
1702
  return `<ShikiMagicMove v-bind="${options}" steps-lz="${compressed}" :step-ranges='${JSON.stringify(ranges)}' />`;
1705
1703
  }
1706
1704
  );
@@ -1708,21 +1706,23 @@ function transformMagicMove(md2, shiki2, shikiOptions2) {
1708
1706
 
1709
1707
  // node/syntax/transform/mermaid.ts
1710
1708
  import lz3 from "lz-string";
1711
- function transformMermaid(md2) {
1712
- return md2.replace(/^```mermaid\s*?({.*?})?\n([\s\S]+?)\n```/mg, (full, options = "", code = "") => {
1709
+ function transformMermaid(ctx) {
1710
+ ctx.s.replace(/^```mermaid\s*?({.*?})?\n([\s\S]+?)\n```/mg, (full, options = "", code = "", index) => {
1713
1711
  code = code.trim();
1714
1712
  options = options.trim() || "{}";
1715
1713
  const encoded = lz3.compressToBase64(code);
1714
+ ctx.ignores.push([index, index + full.length]);
1716
1715
  return `<Mermaid code-lz="${encoded}" v-bind="${options}" />`;
1717
1716
  });
1718
1717
  }
1719
1718
 
1720
1719
  // node/syntax/transform/plant-uml.ts
1721
1720
  import { encode as encodePlantUml } from "plantuml-encoder";
1722
- function transformPlantUml(md2, server) {
1723
- return md2.replace(/^```plantuml\s*?({.*?})?\n([\s\S]+?)\n```/mg, (full, options = "", content = "") => {
1721
+ function transformPlantUml(ctx, server) {
1722
+ ctx.s.replace(/^```plantuml\s*?({.*?})?\n([\s\S]+?)\n```/mg, (full, options = "", content = "", index) => {
1724
1723
  const code = encodePlantUml(content.trim());
1725
1724
  options = options.trim() || "{}";
1725
+ ctx.ignores.push([index, index + full.length]);
1726
1726
  return `<PlantUml :code="'${code}'" :server="'${server}'" v-bind="${options}" />`;
1727
1727
  });
1728
1728
  }
@@ -1781,14 +1781,14 @@ function findRegion(lines, regionName) {
1781
1781
  }
1782
1782
  return null;
1783
1783
  }
1784
- function transformSnippet(md2, options, id) {
1784
+ function transformSnippet(ctx, options, id) {
1785
1785
  const slideId = id.match(/(\d+)\.md$/)?.[1];
1786
1786
  if (!slideId)
1787
- return md2;
1787
+ return;
1788
1788
  const data = options.data;
1789
1789
  const slideInfo = data.slides[+slideId - 1];
1790
1790
  const dir = path.dirname(slideInfo.source?.filepath ?? options.entry ?? options.userRoot);
1791
- return md2.replace(
1791
+ ctx.s.replace(
1792
1792
  /^<<< *(.+?)(#[\w-]+)? *(?: (\S+?))? *(\{.*)?$/mg,
1793
1793
  (full, filepath = "", regionName = "", lang = "", meta = "") => {
1794
1794
  const firstLine = `\`\`\`${lang || path.extname(filepath).slice(1)} ${meta}`;
@@ -1818,35 +1818,41 @@ ${content}
1818
1818
  }
1819
1819
 
1820
1820
  // node/syntax/transform/slot-sugar.ts
1821
- function transformSlotSugar(md2) {
1822
- const lines = md2.split(/\r?\n/g);
1821
+ function transformSlotSugar(ctx) {
1822
+ const linesWithNewline = ctx.s.original.split(/(\r?\n)/g);
1823
+ const lines = [];
1824
+ for (let i = 0; i < linesWithNewline.length; i += 2) {
1825
+ const line = linesWithNewline[i];
1826
+ const newline = linesWithNewline[i + 1] || "";
1827
+ lines.push(line + newline);
1828
+ }
1823
1829
  let prevSlot = false;
1824
- const { isLineInsideCodeblocks } = getCodeBlocks(md2);
1825
- lines.forEach((line, idx) => {
1826
- if (isLineInsideCodeblocks(idx))
1830
+ let offset = 0;
1831
+ lines.forEach((line) => {
1832
+ const start = offset;
1833
+ offset += line.length;
1834
+ if (ctx.isIgnored(start))
1827
1835
  return;
1828
- const match = line.trimEnd().match(/^::\s*([\w\.\-\:]+)\s*::$/);
1836
+ const match = line.match(/^::\s*([\w\.\-\:]+)\s*::(\s*)?$/);
1829
1837
  if (match) {
1830
- lines[idx] = `${prevSlot ? "\n\n</template>\n" : "\n"}<template v-slot:${match[1]}="slotProps">
1831
- `;
1838
+ ctx.s.overwrite(start, offset - match[2].length, `${prevSlot ? "\n\n</template>\n" : "\n"}<template v-slot:${match[1]}="slotProps">
1839
+ `);
1832
1840
  prevSlot = true;
1833
1841
  }
1834
1842
  });
1835
1843
  if (prevSlot)
1836
- lines[lines.length - 1] += "\n\n</template>";
1837
- return lines.join("\n");
1844
+ ctx.s.append("\n\n</template>");
1838
1845
  }
1839
1846
 
1840
1847
  // node/syntax/transform/in-page-css.ts
1841
- function transformPageCSS(md2, id) {
1848
+ function transformPageCSS(ctx, id) {
1842
1849
  const page = id.match(/(\d+)\.md$/)?.[1];
1843
1850
  if (!page)
1844
- return md2;
1845
- const { isInsideCodeblocks } = getCodeBlocks(md2);
1846
- const result = md2.replace(
1851
+ return;
1852
+ ctx.s.replace(
1847
1853
  /(\n<style[^>]*?>)([\s\S]+?)(<\/style>)/g,
1848
1854
  (full, start, css, end, index) => {
1849
- if (index < 0 || isInsideCodeblocks(index))
1855
+ if (ctx.isIgnored(index))
1850
1856
  return full;
1851
1857
  if (!start.includes("scoped"))
1852
1858
  start = start.replace("<style", "<style scoped");
@@ -1854,17 +1860,17 @@ function transformPageCSS(md2, id) {
1854
1860
  ${css}${end}`;
1855
1861
  }
1856
1862
  );
1857
- return result;
1858
1863
  }
1859
1864
 
1860
1865
  // node/syntax/transform/katex-wrapper.ts
1861
- function transformKaTexWrapper(md2) {
1862
- return md2.replace(
1866
+ function transformKaTexWrapper(ctx) {
1867
+ ctx.s.replace(
1863
1868
  /^\$\$(?:\s*{([\d\w*,\|-]+)}\s*?({.*?})?\s*?)?\n([\s\S]+?)^\$\$/mg,
1864
- (full, rangeStr = "", options = "", code) => {
1869
+ (full, rangeStr = "", options = "", code, index) => {
1865
1870
  const ranges = !rangeStr.trim() ? [] : rangeStr.trim().split(/\|/g).map((i) => i.trim());
1866
1871
  code = code.trimEnd();
1867
1872
  options = options.trim() || "{}";
1873
+ ctx.ignores.push([index, index + full.length]);
1868
1874
  return `<KaTexBlockWrapper v-bind="${options}" :ranges='${JSON.stringify(ranges)}'>
1869
1875
 
1870
1876
  $$
@@ -1965,17 +1971,24 @@ async function createMarkdownPlugin(options, { markdown: mdOptions }) {
1965
1971
  if (id === entryPath)
1966
1972
  return "";
1967
1973
  const monacoEnabled = config.monaco === true || config.monaco === mode;
1974
+ const ctx = {
1975
+ s: new MagicString(code),
1976
+ ignores: [],
1977
+ isIgnored(index) {
1978
+ return index < 0 || ctx.ignores.some(([start, end]) => start <= index && index < end);
1979
+ }
1980
+ };
1981
+ transformSnippet(ctx, options, id);
1968
1982
  if (config.highlighter === "shiki")
1969
- code = transformMagicMove(code, shiki, shikiOptions);
1970
- code = transformSlotSugar(code);
1971
- code = transformSnippet(code, options, id);
1972
- code = transformMermaid(code);
1973
- code = transformPlantUml(code, config.plantUmlServer);
1974
- code = transformMonaco(code, monacoEnabled);
1975
- code = transformCodeWrapper(code);
1976
- code = transformPageCSS(code, id);
1977
- code = transformKaTexWrapper(code);
1978
- return code;
1983
+ transformMagicMove(ctx, shiki, shikiOptions);
1984
+ transformMermaid(ctx);
1985
+ transformPlantUml(ctx, config.plantUmlServer);
1986
+ transformMonaco(ctx, monacoEnabled);
1987
+ transformCodeWrapper(ctx);
1988
+ transformKaTexWrapper(ctx);
1989
+ transformPageCSS(ctx, id);
1990
+ transformSlotSugar(ctx);
1991
+ return ctx.s.toString();
1979
1992
  }
1980
1993
  }
1981
1994
  });
package/dist/cli.mjs CHANGED
@@ -6,8 +6,8 @@ import {
6
6
  resolveOptions,
7
7
  resolveTheme,
8
8
  version
9
- } from "./chunk-4HC3TZOH.mjs";
10
- import "./chunk-D66Q4K5C.mjs";
9
+ } from "./chunk-JGRWIL55.mjs";
10
+ import "./chunk-STSW6326.mjs";
11
11
  import {
12
12
  loadSetups
13
13
  } from "./chunk-LOUKLO2C.mjs";
@@ -325,7 +325,7 @@ cli.command(
325
325
  }).strict().help(),
326
326
  async (args) => {
327
327
  const { entry, theme, watch, base, download, out, inspect } = args;
328
- const { build } = await import("./build-6U4JAACM.mjs");
328
+ const { build } = await import("./build-CPSFSDEL.mjs");
329
329
  for (const entryFile of entry) {
330
330
  const options = await resolveOptions({ entry: entryFile, theme, inspect }, "build");
331
331
  if (download && !options.data.config.download)
package/dist/index.mjs CHANGED
@@ -2,10 +2,10 @@ import {
2
2
  createServer,
3
3
  parser,
4
4
  resolveOptions
5
- } from "./chunk-4HC3TZOH.mjs";
5
+ } from "./chunk-JGRWIL55.mjs";
6
6
  import {
7
7
  ViteSlidevPlugin
8
- } from "./chunk-D66Q4K5C.mjs";
8
+ } from "./chunk-STSW6326.mjs";
9
9
  import "./chunk-LOUKLO2C.mjs";
10
10
  import "./chunk-AQQIBD5X.mjs";
11
11
  export {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slidev/cli",
3
- "version": "0.48.8",
3
+ "version": "0.48.9",
4
4
  "description": "Presentation slides for developers",
5
5
  "author": "antfu <anthonyfu117@hotmail.com>",
6
6
  "license": "MIT",
@@ -48,11 +48,11 @@
48
48
  "@iconify-json/ph": "^1.1.11",
49
49
  "@iconify-json/svg-spinners": "^1.1.2",
50
50
  "@lillallol/outline-pdf": "^4.0.0",
51
- "@shikijs/markdown-it": "^1.2.1",
52
- "@shikijs/twoslash": "^1.2.1",
53
- "@shikijs/vitepress-twoslash": "^1.2.1",
54
- "@unocss/extractor-mdc": "^0.58.8",
55
- "@unocss/reset": "^0.58.8",
51
+ "@shikijs/markdown-it": "^1.2.3",
52
+ "@shikijs/twoslash": "^1.2.3",
53
+ "@shikijs/vitepress-twoslash": "^1.2.3",
54
+ "@unocss/extractor-mdc": "^0.58.9",
55
+ "@unocss/reset": "^0.58.9",
56
56
  "@vitejs/plugin-vue": "^5.0.4",
57
57
  "@vitejs/plugin-vue-jsx": "^3.1.0",
58
58
  "chokidar": "^3.6.0",
@@ -72,6 +72,7 @@
72
72
  "kolorist": "^1.8.0",
73
73
  "local-pkg": "^0.5.0",
74
74
  "lz-string": "^1.5.0",
75
+ "magic-string": "^0.30.9",
75
76
  "markdown-it": "^14.1.0",
76
77
  "markdown-it-footnote": "^4.0.0",
77
78
  "markdown-it-link-attributes": "^4.0.1",
@@ -88,11 +89,11 @@
88
89
  "resolve-from": "^5.0.0",
89
90
  "resolve-global": "^2.0.0",
90
91
  "semver": "^7.6.0",
91
- "shiki": "^1.2.1",
92
- "shiki-magic-move": "^0.3.4",
92
+ "shiki": "^1.2.3",
93
+ "shiki-magic-move": "^0.3.5",
93
94
  "sirv": "^2.0.4",
94
95
  "typescript": "^5.4.3",
95
- "unocss": "^0.58.8",
96
+ "unocss": "^0.58.9",
96
97
  "unplugin-icons": "^0.18.5",
97
98
  "unplugin-vue-components": "^0.26.0",
98
99
  "unplugin-vue-markdown": "^0.26.0",
@@ -106,9 +107,9 @@
106
107
  "vitefu": "^0.2.5",
107
108
  "vue": "^3.4.21",
108
109
  "yargs": "^17.7.2",
109
- "@slidev/parser": "0.48.8",
110
- "@slidev/types": "0.48.8",
111
- "@slidev/client": "0.48.8"
110
+ "@slidev/client": "0.48.9",
111
+ "@slidev/parser": "0.48.9",
112
+ "@slidev/types": "0.48.9"
112
113
  },
113
114
  "devDependencies": {
114
115
  "@hedgedoc/markdown-it-plugins": "^2.1.4",