@astrojs/markdown-remark 0.6.2 → 0.6.3

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @astrojs/markdown-remark
2
2
 
3
+ ## 0.6.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [#2697](https://github.com/withastro/astro/pull/2697) [`91765d79`](https://github.com/withastro/astro/commit/91765d79b1ec1181417fb6a4604a9e20564bb10e) Thanks [@FredKSchott](https://github.com/FredKSchott)! - Improve performance by optimizing calls to `getHighlighter`
8
+
3
9
  ## 0.6.2
4
10
 
5
11
  ### Patch Changes
@@ -1,7 +1,13 @@
1
1
  import { getHighlighter } from "shiki";
2
2
  import { visit } from "unist-util-visit";
3
+ const highlighterCache = new Map();
3
4
  const remarkShiki = async ({ langs = [], theme = "github-dark", wrap = false }) => {
4
- const highlighter = await getHighlighter({ theme });
5
+ const cacheID = typeof theme === "string" ? theme : theme.name;
6
+ let highlighter = highlighterCache.get(cacheID);
7
+ if (!highlighter) {
8
+ highlighter = await getHighlighter({ theme });
9
+ highlighterCache.set(cacheID, highlighter);
10
+ }
5
11
  for (const lang of langs) {
6
12
  await highlighter.loadLanguage(lang);
7
13
  }
@@ -26,4 +32,4 @@ var remark_shiki_default = remarkShiki;
26
32
  export {
27
33
  remark_shiki_default as default
28
34
  };
29
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3JlbWFyay1zaGlraS50cyJdLAogICJtYXBwaW5ncyI6ICJBQUNBO0FBQ0E7QUE4QkEsTUFBTSxjQUFjLE9BQU8sRUFBRSxRQUFRLElBQUksUUFBUSxlQUFlLE9BQU8sWUFBeUI7QUFDL0YsUUFBTSxjQUFjLE1BQU0sZUFBZSxFQUFFO0FBRTNDLGFBQVcsUUFBUSxPQUFPO0FBQ3pCLFVBQU0sWUFBWSxhQUFhO0FBQUE7QUFHaEMsU0FBTyxNQUFNLENBQUMsU0FBYztBQUMzQixVQUFNLE1BQU0sUUFBUSxDQUFDLFNBQVM7QUF4Q2hDO0FBeUNHLFVBQUksT0FBTyxZQUFZLFdBQVcsS0FBSyxPQUFPLEVBQUUsTUFBTSxXQUFLLFNBQUwsWUFBYTtBQUduRSxhQUFPLEtBQUssUUFBUSxzQkFBc0I7QUFFMUMsYUFBTyxLQUFLLFFBQVEsOENBQThDO0FBR2xFLFVBQUksU0FBUyxPQUFPO0FBQ25CLGVBQU8sS0FBSyxRQUFRLGlCQUFpQjtBQUFBLGlCQUMzQixTQUFTLE1BQU07QUFDekIsZUFBTyxLQUFLLFFBQVEsaUJBQWlCO0FBQUE7QUFHdEMsV0FBSyxPQUFPO0FBQ1osV0FBSyxRQUFRO0FBQ2IsV0FBSyxXQUFXO0FBQUE7QUFBQTtBQUFBO0FBS25CLElBQU8sdUJBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
35
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL3JlbWFyay1zaGlraS50cyJdLAogICJtYXBwaW5ncyI6ICJBQUNBO0FBQ0E7QUFrQ0EsTUFBTSxtQkFBbUIsSUFBSTtBQUU3QixNQUFNLGNBQWMsT0FBTyxFQUFFLFFBQVEsSUFBSSxRQUFRLGVBQWUsT0FBTyxZQUF5QjtBQUMvRixRQUFNLFVBQWtCLE9BQU8sVUFBVSxXQUFXLFFBQVEsTUFBTTtBQUNsRSxNQUFJLGNBQWMsaUJBQWlCLElBQUk7QUFDdkMsTUFBSSxDQUFDLGFBQWE7QUFDakIsa0JBQWMsTUFBTSxlQUFlLEVBQUU7QUFDckMscUJBQWlCLElBQUksU0FBUztBQUFBO0FBRS9CLGFBQVcsUUFBUSxPQUFPO0FBQ3pCLFVBQU0sWUFBWSxhQUFhO0FBQUE7QUFFaEMsU0FBTyxNQUFNLENBQUMsU0FBYztBQUMzQixVQUFNLE1BQU0sUUFBUSxDQUFDLFNBQVM7QUFqRGhDO0FBa0RHLFVBQUksT0FBTyxZQUFhLFdBQVcsS0FBSyxPQUFPLEVBQUUsTUFBTSxXQUFLLFNBQUwsWUFBYTtBQUdwRSxhQUFPLEtBQUssUUFBUSxzQkFBc0I7QUFFMUMsYUFBTyxLQUFLLFFBQVEsOENBQThDO0FBR2xFLFVBQUksU0FBUyxPQUFPO0FBQ25CLGVBQU8sS0FBSyxRQUFRLGlCQUFpQjtBQUFBLGlCQUMzQixTQUFTLE1BQU07QUFDekIsZUFBTyxLQUFLLFFBQVEsaUJBQWlCO0FBQUE7QUFHdEMsV0FBSyxPQUFPO0FBQ1osV0FBSyxRQUFRO0FBQ2IsV0FBSyxXQUFXO0FBQUE7QUFBQTtBQUFBO0FBS25CLElBQU8sdUJBQVE7IiwKICAibmFtZXMiOiBbXQp9Cg==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astrojs/markdown-remark",
3
- "version": "0.6.2",
3
+ "version": "0.6.3",
4
4
  "type": "module",
5
5
  "author": "withastro",
6
6
  "license": "MIT",
@@ -30,16 +30,25 @@ export interface ShikiConfig {
30
30
  wrap?: boolean | null;
31
31
  }
32
32
 
33
- const remarkShiki = async ({ langs = [], theme = 'github-dark', wrap = false }: ShikiConfig) => {
34
- const highlighter = await getHighlighter({ theme });
33
+ /**
34
+ * getHighlighter() is the most expensive step of Shiki. Instead of calling it on every page,
35
+ * cache it here as much as possible. Make sure that your highlighters can be cached, state-free.
36
+ */
37
+ const highlighterCache = new Map<string, shiki.Highlighter>();
35
38
 
39
+ const remarkShiki = async ({ langs = [], theme = 'github-dark', wrap = false }: ShikiConfig) => {
40
+ const cacheID: string = typeof theme === 'string' ? theme : theme.name;
41
+ let highlighter = highlighterCache.get(cacheID);
42
+ if (!highlighter) {
43
+ highlighter = await getHighlighter({ theme });
44
+ highlighterCache.set(cacheID, highlighter);
45
+ }
36
46
  for (const lang of langs) {
37
47
  await highlighter.loadLanguage(lang);
38
48
  }
39
-
40
49
  return () => (tree: any) => {
41
50
  visit(tree, 'code', (node) => {
42
- let html = highlighter.codeToHtml(node.value, { lang: node.lang ?? 'plaintext' });
51
+ let html = highlighter!.codeToHtml(node.value, { lang: node.lang ?? 'plaintext' });
43
52
 
44
53
  // Replace "shiki" class naming with "astro" and add "data-astro-raw".
45
54
  html = html.replace('<pre class="shiki"', '<pre data-astro-raw class="astro-code"');