@slidev/parser 52.16.0 → 52.17.1

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/core.d.mts CHANGED
@@ -1,6 +1,5 @@
1
- import { a as TimesplitOutput, i as TimesplitInput, n as parseRangeString, o as parseTimesplits, r as parseTimeString, t as parseAspectRatio } from "./utils-DpcPp-I0.mjs";
1
+ import { a as TimesplitInput, i as parseTimeString, n as parseAspectRatio, o as TimesplitOutput, r as parseRangeString, s as parseTimesplits, t as isPathInsideRoots } from "./utils-CmpEoa5K.mjs";
2
2
  import { FontOptions, ResolvedFontOptions, SlidevConfig, SlidevDetectedFeatures, SlidevMarkdown, SlidevPreparserExtension, SlidevThemeMeta, SourceSlideInfo } from "@slidev/types";
3
-
4
3
  //#region src/config.d.ts
5
4
  declare function getDefaultConfig(): SlidevConfig;
6
5
  declare function resolveConfig(headmatter: any, themeMeta?: SlidevThemeMeta, filepath?: string, verify?: boolean): SlidevConfig;
@@ -26,4 +25,4 @@ declare function parseSlide(raw: string, options?: SlidevParserOptions): Omit<So
26
25
  declare function parse(markdown: string, filepath: string, extensions?: SlidevPreparserExtension[], options?: SlidevParserOptions): Promise<SlidevMarkdown>;
27
26
  declare function parseSync(markdown: string, filepath: string, options?: SlidevParserOptions): SlidevMarkdown;
28
27
  //#endregion
29
- export { SlidevParserOptions, TimesplitInput, TimesplitOutput, detectFeatures, extractImagesUsage, getDefaultConfig, parse, parseAspectRatio, parseRangeString, parseSlide, parseSync, parseTimeString, parseTimesplits, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig };
28
+ export { SlidevParserOptions, TimesplitInput, TimesplitOutput, detectFeatures, extractImagesUsage, getDefaultConfig, isPathInsideRoots, parse, parseAspectRatio, parseRangeString, parseSlide, parseSync, parseTimeString, parseTimesplits, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig };
package/dist/core.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { parseAspectRatio, parseRangeString, parseTimeString, parseTimesplits } from "./utils.mjs";
1
+ import { isPathInsideRoots, parseAspectRatio, parseRangeString, parseTimeString, parseTimesplits } from "./utils.mjs";
2
2
  import { ensurePrefix, toArray, uniq } from "@antfu/utils";
3
3
  import YAML from "yaml";
4
4
  //#region src/config.ts
@@ -44,8 +44,10 @@ function getDefaultConfig() {
44
44
  htmlAttrs: {},
45
45
  transition: null,
46
46
  editor: true,
47
+ mcp: true,
47
48
  contextMenu: null,
48
49
  wakeLock: true,
50
+ pwa: false,
49
51
  remote: false,
50
52
  mdc: false,
51
53
  comark: false,
@@ -476,4 +478,4 @@ function hash(str) {
476
478
  return hash.toString(36).slice(0, 12);
477
479
  }
478
480
  //#endregion
479
- export { detectFeatures, extractImagesUsage, getDefaultConfig, parse, parseAspectRatio, parseRangeString, parseSlide, parseSync, parseTimeString, parseTimesplits, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig };
481
+ export { detectFeatures, extractImagesUsage, getDefaultConfig, isPathInsideRoots, parse, parseAspectRatio, parseRangeString, parseSlide, parseSync, parseTimeString, parseTimesplits, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig };
package/dist/fs.d.mts CHANGED
@@ -1,12 +1,17 @@
1
- import { a as TimesplitOutput, i as TimesplitInput, n as parseRangeString, o as parseTimesplits, r as parseTimeString, t as parseAspectRatio } from "./utils-DpcPp-I0.mjs";
1
+ import { a as TimesplitInput, i as parseTimeString, n as parseAspectRatio, o as TimesplitOutput, r as parseRangeString, s as parseTimesplits, t as isPathInsideRoots } from "./utils-CmpEoa5K.mjs";
2
2
  import { SlidevParserOptions, detectFeatures, extractImagesUsage, getDefaultConfig, parse, parseSlide, parseSync, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig } from "./core.mjs";
3
3
  import { PreparserExtensionLoader, SlidevData, SlidevMarkdown } from "@slidev/types";
4
-
5
4
  //#region src/fs.d.ts
6
5
  declare function injectPreparserExtensionLoader(fn: PreparserExtensionLoader): void;
7
6
  interface LoadRootsInfo {
8
7
  roots: string[];
9
8
  userRoot: string;
9
+ /**
10
+ * When provided, `src:` includes resolving outside these roots are
11
+ * rejected (recorded as an error) instead of being loaded. Optional for
12
+ * backward compatibility with other `@slidev/parser` consumers.
13
+ */
14
+ allowedRoots?: string[];
10
15
  }
11
16
  /**
12
17
  * Slidev data without config and themeMeta,
@@ -16,4 +21,4 @@ type LoadedSlidevData = Omit<SlidevData, 'config' | 'themeMeta'>;
16
21
  declare function load(options: LoadRootsInfo, filepath: string, sources?: Record<string, string> | ((path: string) => Promise<string>), mode?: string): Promise<LoadedSlidevData>;
17
22
  declare function save(markdown: SlidevMarkdown): Promise<string>;
18
23
  //#endregion
19
- export { LoadRootsInfo, LoadedSlidevData, SlidevParserOptions, TimesplitInput, TimesplitOutput, detectFeatures, extractImagesUsage, getDefaultConfig, injectPreparserExtensionLoader, load, parse, parseAspectRatio, parseRangeString, parseSlide, parseSync, parseTimeString, parseTimesplits, prettify, prettifySlide, resolveConfig, resolveFonts, save, stringify, stringifySlide, verifyConfig };
24
+ export { LoadRootsInfo, LoadedSlidevData, SlidevParserOptions, TimesplitInput, TimesplitOutput, detectFeatures, extractImagesUsage, getDefaultConfig, injectPreparserExtensionLoader, isPathInsideRoots, load, parse, parseAspectRatio, parseRangeString, parseSlide, parseSync, parseTimeString, parseTimesplits, prettify, prettifySlide, resolveConfig, resolveFonts, save, stringify, stringifySlide, verifyConfig };
package/dist/fs.mjs CHANGED
@@ -1,10 +1,10 @@
1
- import { parseAspectRatio, parseRangeString, parseTimeString, parseTimesplits } from "./utils.mjs";
1
+ import { isPathInsideRoots, parseAspectRatio, parseRangeString, parseTimeString, parseTimesplits } from "./utils.mjs";
2
2
  import { detectFeatures, extractImagesUsage, getDefaultConfig, parse, parseSlide, parseSync, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig } from "./core.mjs";
3
3
  import { slash } from "@antfu/utils";
4
4
  import YAML from "yaml";
5
+ import { dirname, resolve } from "node:path";
5
6
  import { existsSync } from "node:fs";
6
7
  import { readFile, writeFile } from "node:fs/promises";
7
- import { dirname, resolve } from "node:path";
8
8
  //#region src/fs.ts
9
9
  const RE_FRONTMATTER_START = /^---(?:[^-].*)?$/;
10
10
  const RE_BLANK_LINE = /^\s*$/;
@@ -66,7 +66,22 @@ async function load(options, filepath, sources = {}, mode) {
66
66
  ...frontmatterOverride
67
67
  };
68
68
  delete frontmatterOverride.src;
69
- if (!existsSync(path)) {
69
+ const ancestorPaths = new Set((importChain ?? []).map((s) => s.filepath));
70
+ if (path === slide.filepath || ancestorPaths.has(path)) {
71
+ md.errors ??= [];
72
+ md.errors.push({
73
+ row: slide.start,
74
+ message: `Circular import detected for "${slide.frontmatter.src}" (${path})`
75
+ });
76
+ return;
77
+ }
78
+ if (options.allowedRoots && !isPathInsideRoots(path, options.allowedRoots)) {
79
+ md.errors ??= [];
80
+ md.errors.push({
81
+ row: slide.start,
82
+ message: `Imported markdown escapes the project root: ${path}`
83
+ });
84
+ } else if (!existsSync(path)) {
70
85
  md.errors ??= [];
71
86
  md.errors.push({
72
87
  row: slide.start,
@@ -107,4 +122,4 @@ async function save(markdown) {
107
122
  return fileContent;
108
123
  }
109
124
  //#endregion
110
- export { detectFeatures, extractImagesUsage, getDefaultConfig, injectPreparserExtensionLoader, load, parse, parseAspectRatio, parseRangeString, parseSlide, parseSync, parseTimeString, parseTimesplits, prettify, prettifySlide, resolveConfig, resolveFonts, save, stringify, stringifySlide, verifyConfig };
125
+ export { detectFeatures, extractImagesUsage, getDefaultConfig, injectPreparserExtensionLoader, isPathInsideRoots, load, parse, parseAspectRatio, parseRangeString, parseSlide, parseSync, parseTimeString, parseTimesplits, prettify, prettifySlide, resolveConfig, resolveFonts, save, stringify, stringifySlide, verifyConfig };
package/dist/index.d.mts CHANGED
@@ -1,3 +1,3 @@
1
- import { a as TimesplitOutput, i as TimesplitInput, n as parseRangeString, o as parseTimesplits, r as parseTimeString, t as parseAspectRatio } from "./utils-DpcPp-I0.mjs";
1
+ import { a as TimesplitInput, i as parseTimeString, n as parseAspectRatio, o as TimesplitOutput, r as parseRangeString, s as parseTimesplits, t as isPathInsideRoots } from "./utils-CmpEoa5K.mjs";
2
2
  import { SlidevParserOptions, detectFeatures, extractImagesUsage, getDefaultConfig, parse, parseSlide, parseSync, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig } from "./core.mjs";
3
- export { SlidevParserOptions, TimesplitInput, TimesplitOutput, detectFeatures, extractImagesUsage, getDefaultConfig, parse, parseAspectRatio, parseRangeString, parseSlide, parseSync, parseTimeString, parseTimesplits, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig };
3
+ export { SlidevParserOptions, TimesplitInput, TimesplitOutput, detectFeatures, extractImagesUsage, getDefaultConfig, isPathInsideRoots, parse, parseAspectRatio, parseRangeString, parseSlide, parseSync, parseTimeString, parseTimesplits, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig };
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import { parseAspectRatio, parseRangeString, parseTimeString, parseTimesplits } from "./utils.mjs";
1
+ import { isPathInsideRoots, parseAspectRatio, parseRangeString, parseTimeString, parseTimesplits } from "./utils.mjs";
2
2
  import { detectFeatures, extractImagesUsage, getDefaultConfig, parse, parseSlide, parseSync, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig } from "./core.mjs";
3
- export { detectFeatures, extractImagesUsage, getDefaultConfig, parse, parseAspectRatio, parseRangeString, parseSlide, parseSync, parseTimeString, parseTimesplits, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig };
3
+ export { detectFeatures, extractImagesUsage, getDefaultConfig, isPathInsideRoots, parse, parseAspectRatio, parseRangeString, parseSlide, parseSync, parseTimeString, parseTimesplits, prettify, prettifySlide, resolveConfig, resolveFonts, stringify, stringifySlide, verifyConfig };
@@ -20,6 +20,12 @@ declare function parseTimeString(timestamp: string | number): {
20
20
  };
21
21
  //#endregion
22
22
  //#region src/utils.d.ts
23
+ /**
24
+ * Whether `filePath` resolves inside any of `roots` (no `..` escape).
25
+ * Inlined here (rather than imported from the `slidev` package) because
26
+ * `@slidev/parser` must stay independent of `@slidev/slidev`.
27
+ */
28
+ declare function isPathInsideRoots(filePath: string, roots: string[]): boolean;
23
29
  /**
24
30
  * 1,3-5,8 => [1, 3, 4, 5, 8]
25
31
  */
@@ -29,4 +35,4 @@ declare function parseRangeString(total: number, rangeStr?: string): number[];
29
35
  */
30
36
  declare function parseAspectRatio(str: string | number): number;
31
37
  //#endregion
32
- export { TimesplitOutput as a, TimesplitInput as i, parseRangeString as n, parseTimesplits as o, parseTimeString as r, parseAspectRatio as t };
38
+ export { TimesplitInput as a, parseTimeString as i, parseAspectRatio as n, TimesplitOutput as o, parseRangeString as r, parseTimesplits as s, isPathInsideRoots as t };
package/dist/utils.d.mts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as TimesplitOutput, i as TimesplitInput, n as parseRangeString, o as parseTimesplits, r as parseTimeString, t as parseAspectRatio } from "./utils-DpcPp-I0.mjs";
2
- export { TimesplitInput, TimesplitOutput, parseAspectRatio, parseRangeString, parseTimeString, parseTimesplits };
1
+ import { a as TimesplitInput, i as parseTimeString, n as parseAspectRatio, o as TimesplitOutput, r as parseRangeString, s as parseTimesplits, t as isPathInsideRoots } from "./utils-CmpEoa5K.mjs";
2
+ export { TimesplitInput, TimesplitOutput, isPathInsideRoots, parseAspectRatio, parseRangeString, parseTimeString, parseTimesplits };
package/dist/utils.mjs CHANGED
@@ -1,4 +1,5 @@
1
1
  import { isNumber, range, uniq } from "@antfu/utils";
2
+ import { isAbsolute, relative } from "node:path";
2
3
  //#region src/timesplit/timestring.ts
3
4
  /**
4
5
  * Parse timestamp into seconds
@@ -113,6 +114,17 @@ function parseTimesplits(inputs) {
113
114
  }
114
115
  //#endregion
115
116
  //#region src/utils.ts
117
+ /**
118
+ * Whether `filePath` resolves inside any of `roots` (no `..` escape).
119
+ * Inlined here (rather than imported from the `slidev` package) because
120
+ * `@slidev/parser` must stay independent of `@slidev/slidev`.
121
+ */
122
+ function isPathInsideRoots(filePath, roots) {
123
+ return roots.some((root) => {
124
+ const rel = relative(root, filePath);
125
+ return rel === "" || !!rel && !rel.startsWith("..") && !isAbsolute(rel);
126
+ });
127
+ }
116
128
  const RE_ASPECT_RATIO_SEPARATOR = /[:/x|]/;
117
129
  /**
118
130
  * 1,3-5,8 => [1, 3, 4, 5, 8]
@@ -141,4 +153,4 @@ function parseAspectRatio(str) {
141
153
  return w / h;
142
154
  }
143
155
  //#endregion
144
- export { parseAspectRatio, parseRangeString, parseTimeString, parseTimesplits };
156
+ export { isPathInsideRoots, parseAspectRatio, parseRangeString, parseTimeString, parseTimesplits };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slidev/parser",
3
- "version": "52.16.0",
3
+ "version": "52.17.1",
4
4
  "description": "Markdown parser for Slidev",
5
5
  "author": "Anthony Fu <anthonyfu117@hotmail.com>",
6
6
  "license": "MIT",
@@ -31,7 +31,7 @@
31
31
  "dependencies": {
32
32
  "@antfu/utils": "^9.3.0",
33
33
  "yaml": "^2.9.0",
34
- "@slidev/types": "52.16.0"
34
+ "@slidev/types": "52.17.1"
35
35
  },
36
36
  "devDependencies": {
37
37
  "tsdown-stale-guard": "^0.1.2"