@slidev/parser 0.48.0-beta.2 → 0.48.0-beta.21

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.
@@ -30,11 +30,11 @@ var toString = (v) => Object.prototype.toString.call(v);
30
30
  function notNullish(v) {
31
31
  return v != null;
32
32
  }
33
- function isTruthy(v) {
34
- return Boolean(v);
35
- }
36
33
  var isNumber = (val) => typeof val === "number";
37
34
  var isObject = (val) => toString(val) === "[object Object]";
35
+ function slash(str) {
36
+ return str.replace(/\\/g, "/");
37
+ }
38
38
  function objectMap(obj, fn) {
39
39
  return Object.fromEntries(
40
40
  Object.entries(obj).map(([k, v]) => fn(k, v)).filter(notNullish)
@@ -83,6 +83,8 @@ function getDefaultConfig() {
83
83
  addons: [],
84
84
  remoteAssets: false,
85
85
  monaco: "dev",
86
+ monacoTypesSource: "local",
87
+ monacoTypesAdditionalPackages: [],
86
88
  download: false,
87
89
  export: {},
88
90
  info: false,
@@ -243,16 +245,10 @@ function resolveDrawings(options = {}, filepath) {
243
245
 
244
246
  // src/core.ts
245
247
  function stringify(data) {
246
- return `${data.slides.filter((slide) => slide.source === void 0 || slide.inline !== void 0).map((slide, idx) => stringifySlide(slide.inline || slide, idx)).join("\n").trim()}
248
+ return `${data.slides.map(stringifySlide).join("\n").trim()}
247
249
  `;
248
250
  }
249
- function filterDisabled(data) {
250
- data.slides = data.slides.filter((i) => !i.frontmatter?.disabled);
251
- return data;
252
- }
253
251
  function stringifySlide(data, idx = 0) {
254
- if (data.raw == null)
255
- prettifySlide(data);
256
252
  return data.raw.startsWith("---") || idx === 0 ? data.raw : `---
257
253
  ${data.raw.startsWith("\n") ? data.raw : `
258
254
  ${data.raw}`}`;
@@ -354,7 +350,7 @@ function parseSlide(raw) {
354
350
  note
355
351
  };
356
352
  }
357
- async function parse(markdown, filepath, themeMeta, extensions, onHeadmatter) {
353
+ async function parse(markdown, filepath, extensions) {
358
354
  const lines = markdown.split(/\r?\n/g);
359
355
  const slides = [];
360
356
  let start = 0;
@@ -364,6 +360,7 @@ async function parse(markdown, filepath, themeMeta, extensions, onHeadmatter) {
364
360
  const raw = lines.slice(start, end).join("\n");
365
361
  const slide = {
366
362
  ...parseSlide(raw),
363
+ filepath,
367
364
  index: slides.length,
368
365
  start,
369
366
  end
@@ -380,19 +377,6 @@ async function parse(markdown, filepath, themeMeta, extensions, onHeadmatter) {
380
377
  slides.push(slide);
381
378
  start = end + 1;
382
379
  }
383
- {
384
- let hm = "";
385
- if (lines[0].match(/^---([^-].*)?$/) && !lines[1]?.match(/^\s*$/)) {
386
- let hEnd = 1;
387
- while (hEnd < lines.length && !lines[hEnd].trimEnd().match(/^---$/))
388
- hEnd++;
389
- hm = lines.slice(1, hEnd).join("\n");
390
- }
391
- if (onHeadmatter) {
392
- const o = YAML.load(hm) ?? {};
393
- extensions = await onHeadmatter(o, extensions ?? [], filepath);
394
- }
395
- }
396
380
  if (extensions) {
397
381
  for (const e of extensions) {
398
382
  if (e.transformRawLines)
@@ -420,37 +404,18 @@ async function parse(markdown, filepath, themeMeta, extensions, onHeadmatter) {
420
404
  }
421
405
  if (start <= lines.length - 1)
422
406
  await slice(lines.length);
423
- const headmatter = slides[0]?.frontmatter || {};
424
- headmatter.title = headmatter.title || slides[0]?.title;
425
- const config = resolveConfig(headmatter, themeMeta, filepath);
426
- const features = detectFeatures(markdown);
427
407
  return {
428
- raw: markdown,
429
408
  filepath,
430
- slides,
431
- config,
432
- features,
433
- headmatter,
434
- themeMeta
409
+ raw: markdown,
410
+ slides
435
411
  };
436
412
  }
437
413
  function mergeFeatureFlags(a, b) {
438
414
  return objectMap(a, (k, v) => [k, v || b[k]]);
439
415
  }
440
- function scanMonacoModules(md) {
441
- const typeModules = /* @__PURE__ */ new Set();
442
- md.replace(/^```(\w+?)\s*{monaco([\w:,-]*)}[\s\n]*([\s\S]+?)^```/mg, (full, lang = "ts", options, code) => {
443
- options = options || "";
444
- lang = lang.trim();
445
- if (lang === "ts" || lang === "typescript") {
446
- Array.from(code.matchAll(/\s+from\s+(["'])([\/\w@-]+)\1/g)).map((i) => i[2]).filter(isTruthy).map((i) => typeModules.add(i));
447
- }
448
- return "";
449
- });
450
- return Array.from(typeModules);
451
- }
452
416
 
453
417
  export {
418
+ slash,
454
419
  parseRangeString,
455
420
  parseAspectRatio,
456
421
  getDefaultConfig,
@@ -458,13 +423,11 @@ export {
458
423
  verifyConfig,
459
424
  resolveFonts,
460
425
  stringify,
461
- filterDisabled,
462
426
  stringifySlide,
463
427
  prettifySlide,
464
428
  prettify,
465
429
  detectFeatures,
466
430
  parseSlide,
467
431
  parse,
468
- mergeFeatureFlags,
469
- scanMonacoModules
432
+ mergeFeatureFlags
470
433
  };
package/dist/core.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { SlidevConfig, SlidevThemeMeta, FontOptions, ResolvedFontOptions, SlidevMarkdown, SlideInfoBase, SlidevFeatureFlags, SlidevPreparserExtension, PreparserExtensionFromHeadmatter } from '@slidev/types';
1
+ import { SlidevConfig, SlidevThemeMeta, FontOptions, ResolvedFontOptions, SlidevMarkdown, SourceSlideInfo, SlidevFeatureFlags, SlidevPreparserExtension } from '@slidev/types';
2
2
 
3
3
  /**
4
4
  * 1,3-5,8 => [1, 3, 4, 5, 8]
@@ -15,14 +15,12 @@ declare function verifyConfig(config: SlidevConfig, themeMeta?: SlidevThemeMeta,
15
15
  declare function resolveFonts(fonts?: FontOptions): ResolvedFontOptions;
16
16
 
17
17
  declare function stringify(data: SlidevMarkdown): string;
18
- declare function filterDisabled(data: SlidevMarkdown): SlidevMarkdown;
19
- declare function stringifySlide(data: SlideInfoBase, idx?: number): string;
20
- declare function prettifySlide(data: SlideInfoBase): SlideInfoBase;
18
+ declare function stringifySlide(data: SourceSlideInfo, idx?: number): string;
19
+ declare function prettifySlide(data: SourceSlideInfo): SourceSlideInfo;
21
20
  declare function prettify(data: SlidevMarkdown): SlidevMarkdown;
22
21
  declare function detectFeatures(code: string): SlidevFeatureFlags;
23
- declare function parseSlide(raw: string): SlideInfoBase;
24
- declare function parse(markdown: string, filepath?: string, themeMeta?: SlidevThemeMeta, extensions?: SlidevPreparserExtension[], onHeadmatter?: PreparserExtensionFromHeadmatter): Promise<SlidevMarkdown>;
22
+ declare function parseSlide(raw: string): Omit<SourceSlideInfo, 'filepath' | 'index' | 'start' | 'end'>;
23
+ declare function parse(markdown: string, filepath: string, extensions?: SlidevPreparserExtension[]): Promise<SlidevMarkdown>;
25
24
  declare function mergeFeatureFlags(a: SlidevFeatureFlags, b: SlidevFeatureFlags): SlidevFeatureFlags;
26
- declare function scanMonacoModules(md: string): string[];
27
25
 
28
- export { detectFeatures, filterDisabled, getDefaultConfig, mergeFeatureFlags, parse, parseAspectRatio, parseRangeString, parseSlide, prettify, prettifySlide, resolveConfig, resolveFonts, scanMonacoModules, stringify, stringifySlide, verifyConfig };
26
+ export { detectFeatures, getDefaultConfig, mergeFeatureFlags, parse, parseAspectRatio, parseRangeString, parseSlide, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig };
package/dist/core.mjs CHANGED
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  detectFeatures,
3
- filterDisabled,
4
3
  getDefaultConfig,
5
4
  mergeFeatureFlags,
6
5
  parse,
@@ -11,14 +10,12 @@ import {
11
10
  prettifySlide,
12
11
  resolveConfig,
13
12
  resolveFonts,
14
- scanMonacoModules,
15
13
  stringify,
16
14
  stringifySlide,
17
15
  verifyConfig
18
- } from "./chunk-VLX5KDW3.mjs";
16
+ } from "./chunk-LDPCYGJA.mjs";
19
17
  export {
20
18
  detectFeatures,
21
- filterDisabled,
22
19
  getDefaultConfig,
23
20
  mergeFeatureFlags,
24
21
  parse,
@@ -29,7 +26,6 @@ export {
29
26
  prettifySlide,
30
27
  resolveConfig,
31
28
  resolveFonts,
32
- scanMonacoModules,
33
29
  stringify,
34
30
  stringifySlide,
35
31
  verifyConfig
package/dist/fs.d.mts CHANGED
@@ -1,9 +1,13 @@
1
- import { PreparserExtensionLoader, SlidevThemeMeta, SlidevMarkdown } from '@slidev/types';
2
- export { detectFeatures, filterDisabled, getDefaultConfig, mergeFeatureFlags, parse, parseAspectRatio, parseRangeString, parseSlide, prettify, prettifySlide, resolveConfig, resolveFonts, scanMonacoModules, stringify, stringifySlide, verifyConfig } from './core.mjs';
1
+ import { PreparserExtensionLoader, SlidevData, SlidevMarkdown } from '@slidev/types';
2
+ export { detectFeatures, getDefaultConfig, mergeFeatureFlags, parse, parseAspectRatio, parseRangeString, parseSlide, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig } from './core.mjs';
3
3
 
4
4
  declare function injectPreparserExtensionLoader(fn: PreparserExtensionLoader): void;
5
- declare function load(filepath: string, themeMeta?: SlidevThemeMeta, content?: string): Promise<SlidevMarkdown>;
6
- declare function save(data: SlidevMarkdown, filepath?: string): Promise<void>;
7
- declare function saveExternalSlide(data: SlidevMarkdown, filepath: string): Promise<void>;
5
+ /**
6
+ * Slidev data without config and themeMeta,
7
+ * because config and themeMeta depends on the theme to be loaded.
8
+ */
9
+ type LoadedSlidevData = Omit<SlidevData, 'config' | 'themeMeta'>;
10
+ declare function load(userRoot: string, filepath: string, content?: string, mode?: string): Promise<LoadedSlidevData>;
11
+ declare function save(markdown: SlidevMarkdown): Promise<void>;
8
12
 
9
- export { injectPreparserExtensionLoader, load, save, saveExternalSlide };
13
+ export { type LoadedSlidevData, injectPreparserExtensionLoader, load, save };
package/dist/fs.mjs CHANGED
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  detectFeatures,
3
- filterDisabled,
4
3
  getDefaultConfig,
5
4
  mergeFeatureFlags,
6
5
  parse,
@@ -11,99 +10,91 @@ import {
11
10
  prettifySlide,
12
11
  resolveConfig,
13
12
  resolveFonts,
14
- scanMonacoModules,
13
+ slash,
15
14
  stringify,
16
15
  stringifySlide,
17
16
  verifyConfig
18
- } from "./chunk-VLX5KDW3.mjs";
17
+ } from "./chunk-LDPCYGJA.mjs";
19
18
 
20
19
  // src/fs.ts
21
20
  import { promises as fs } from "node:fs";
22
21
  import { dirname, resolve } from "node:path";
22
+ import YAML from "js-yaml";
23
23
  var preparserExtensionLoader = null;
24
24
  function injectPreparserExtensionLoader(fn) {
25
25
  preparserExtensionLoader = fn;
26
26
  }
27
- async function load(filepath, themeMeta, content) {
28
- const dir = dirname(filepath);
27
+ async function load(userRoot, filepath, content, mode) {
29
28
  const markdown = content ?? await fs.readFile(filepath, "utf-8");
30
- const preparserExtensions = [];
31
- const data = await parse(markdown, filepath, themeMeta, [], async (headmatter, exts, filepath2) => {
32
- preparserExtensions.splice(
33
- 0,
34
- preparserExtensions.length,
35
- ...exts,
36
- ...preparserExtensionLoader ? await preparserExtensionLoader(headmatter, filepath2) : []
37
- );
38
- return preparserExtensions;
39
- });
40
- const entries = /* @__PURE__ */ new Set([
41
- filepath
42
- ]);
43
- for (let iSlide = 0; iSlide < data.slides.length; ) {
44
- const baseSlide = data.slides[iSlide];
45
- if (!baseSlide.frontmatter.src) {
46
- iSlide++;
47
- continue;
29
+ let extensions;
30
+ if (preparserExtensionLoader) {
31
+ const lines = markdown.split(/\r?\n/g);
32
+ let hm = "";
33
+ if (lines[0].match(/^---([^-].*)?$/) && !lines[1]?.match(/^\s*$/)) {
34
+ let hEnd = 1;
35
+ while (hEnd < lines.length && !lines[hEnd].trimEnd().match(/^---$/))
36
+ hEnd++;
37
+ hm = lines.slice(1, hEnd).join("\n");
48
38
  }
49
- if (baseSlide.frontmatter.hide)
50
- continue;
51
- const srcExpression = baseSlide.frontmatter.src;
52
- let path;
53
- if (srcExpression.startsWith("/"))
54
- path = resolve(dir, srcExpression.substring(1));
55
- else if (baseSlide.source?.filepath)
56
- path = resolve(dirname(baseSlide.source.filepath), srcExpression);
57
- else
58
- path = resolve(dir, srcExpression);
59
- entries.add(path);
60
- const raw = await fs.readFile(path, "utf-8");
61
- const subSlidesData = await parse(raw, path, themeMeta, preparserExtensions);
62
- delete subSlidesData.headmatter.title;
63
- delete subSlidesData.slides[0].frontmatter.title;
64
- data.features = mergeFeatureFlags(data.features, subSlidesData.features);
65
- data.subSlides ??= {};
66
- data.subSlides[path] = subSlidesData;
67
- const subSlides = subSlidesData.slides.map((subSlide, offset) => {
68
- const slide = { ...baseSlide };
69
- slide.source = {
70
- filepath: path,
71
- ...subSlide
72
- };
73
- if (offset === 0 && !baseSlide.frontmatter.srcSequence) {
74
- slide.inline = { ...baseSlide };
75
- delete slide.inline.frontmatter.src;
76
- Object.assign(slide, slide.source, { raw: null });
77
- } else {
78
- Object.assign(slide, slide.source);
79
- }
80
- const baseSlideFrontMatterWithoutSrc = { ...baseSlide.frontmatter };
81
- delete baseSlideFrontMatterWithoutSrc.src;
82
- slide.frontmatter = {
83
- ...subSlide.frontmatter,
84
- ...baseSlideFrontMatterWithoutSrc,
85
- srcSequence: `${baseSlide.frontmatter.srcSequence ? `${baseSlide.frontmatter.srcSequence},` : ""}${srcExpression}`
39
+ const o = YAML.load(hm) ?? {};
40
+ extensions = await preparserExtensionLoader(o, filepath, mode);
41
+ }
42
+ const markdownFiles = {};
43
+ const slides = [];
44
+ async function loadMarkdown(path, range, frontmatterOverride) {
45
+ let md = markdownFiles[path];
46
+ if (!md) {
47
+ const raw = await fs.readFile(path, "utf-8");
48
+ md = await parse(raw, path, extensions);
49
+ markdownFiles[path] = md;
50
+ }
51
+ for (const index of parseRangeString(md.slides.length, range))
52
+ await loadSlide(md.slides[index - 1], frontmatterOverride);
53
+ return md;
54
+ }
55
+ async function loadSlide(slide, frontmatterOverride) {
56
+ if (slide.frontmatter.disabled || slide.frontmatter.hide)
57
+ return;
58
+ if (slide.frontmatter.src) {
59
+ const [rawPath, rangeRaw] = slide.frontmatter.src.split("#");
60
+ const path = rawPath.startsWith("/") ? resolve(userRoot, rawPath.substring(1)) : resolve(dirname(slide.filepath), rawPath);
61
+ frontmatterOverride = {
62
+ ...slide.frontmatter,
63
+ ...frontmatterOverride
86
64
  };
87
- return slide;
88
- });
89
- subSlidesData.slides = subSlides.map((slide) => slide.source);
90
- data.slides.splice(iSlide, 1, ...subSlides);
65
+ delete frontmatterOverride.src;
66
+ await loadMarkdown(path, rangeRaw, frontmatterOverride);
67
+ } else {
68
+ slides.push({
69
+ index: slides.length,
70
+ source: slide,
71
+ frontmatter: { ...slide.frontmatter, ...frontmatterOverride },
72
+ content: slide.content,
73
+ note: slide.note,
74
+ title: slide.title,
75
+ level: slide.level
76
+ });
77
+ }
91
78
  }
92
- for (let iSlide = 0; iSlide < data.slides.length; iSlide++)
93
- data.slides[iSlide].index = iSlide === 0 ? 0 : 1 + data.slides[iSlide - 1].index;
94
- data.entries = Array.from(entries);
95
- return data;
96
- }
97
- async function save(data, filepath) {
98
- filepath = filepath || data.filepath;
99
- await fs.writeFile(filepath, stringify(data), "utf-8");
79
+ const entry = await loadMarkdown(filepath);
80
+ const headmatter = {
81
+ title: slides[0]?.title,
82
+ ...entry.slides[0]?.frontmatter
83
+ };
84
+ return {
85
+ slides,
86
+ entry,
87
+ headmatter,
88
+ features: detectFeatures(slides.map((s) => s.source.raw).join("")),
89
+ markdownFiles,
90
+ watchFiles: Object.keys(markdownFiles).map(slash)
91
+ };
100
92
  }
101
- async function saveExternalSlide(data, filepath) {
102
- await fs.writeFile(filepath, stringify(data.subSlides[filepath]), "utf-8");
93
+ async function save(markdown) {
94
+ await fs.writeFile(markdown.filepath, stringify(markdown), "utf-8");
103
95
  }
104
96
  export {
105
97
  detectFeatures,
106
- filterDisabled,
107
98
  getDefaultConfig,
108
99
  injectPreparserExtensionLoader,
109
100
  load,
@@ -117,8 +108,6 @@ export {
117
108
  resolveConfig,
118
109
  resolveFonts,
119
110
  save,
120
- saveExternalSlide,
121
- scanMonacoModules,
122
111
  stringify,
123
112
  stringifySlide,
124
113
  verifyConfig
package/dist/index.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- export { detectFeatures, filterDisabled, getDefaultConfig, mergeFeatureFlags, parse, parseAspectRatio, parseRangeString, parseSlide, prettify, prettifySlide, resolveConfig, resolveFonts, scanMonacoModules, stringify, stringifySlide, verifyConfig } from './core.mjs';
1
+ export { detectFeatures, getDefaultConfig, mergeFeatureFlags, parse, parseAspectRatio, parseRangeString, parseSlide, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig } from './core.mjs';
2
2
  import '@slidev/types';
package/dist/index.mjs CHANGED
@@ -1,6 +1,5 @@
1
1
  import {
2
2
  detectFeatures,
3
- filterDisabled,
4
3
  getDefaultConfig,
5
4
  mergeFeatureFlags,
6
5
  parse,
@@ -11,14 +10,12 @@ import {
11
10
  prettifySlide,
12
11
  resolveConfig,
13
12
  resolveFonts,
14
- scanMonacoModules,
15
13
  stringify,
16
14
  stringifySlide,
17
15
  verifyConfig
18
- } from "./chunk-VLX5KDW3.mjs";
16
+ } from "./chunk-LDPCYGJA.mjs";
19
17
  export {
20
18
  detectFeatures,
21
- filterDisabled,
22
19
  getDefaultConfig,
23
20
  mergeFeatureFlags,
24
21
  parse,
@@ -29,7 +26,6 @@ export {
29
26
  prettifySlide,
30
27
  resolveConfig,
31
28
  resolveFonts,
32
- scanMonacoModules,
33
29
  stringify,
34
30
  stringifySlide,
35
31
  verifyConfig
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slidev/parser",
3
- "version": "0.48.0-beta.2",
3
+ "version": "0.48.0-beta.21",
4
4
  "description": "Markdown parser for Slidev",
5
5
  "author": "antfu <anthonyfu117@hotmail.com>",
6
6
  "license": "MIT",
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "js-yaml": "^4.1.0",
43
- "@slidev/types": "0.48.0-beta.2"
43
+ "@slidev/types": "0.48.0-beta.21"
44
44
  },
45
45
  "scripts": {
46
46
  "build": "rimraf dist && tsup src/index.ts src/core.ts src/fs.ts",