Radish alpha
r
Radicle web interface
Radicle
Git (anonymous pull)
Log in to clone via SSH
Replace @radicle/gray-matter with js-yaml frontmatter parser
Rūdolfs Ošiņš committed 13 days ago
commit 9391cd072f4d990980a22a8c9c3895eea627a906
parent 6fb702f886bcd15e1dd262ff25c6313ea88e57a3
4 files changed +34 -71
modified package-lock.json
@@ -9,7 +9,6 @@
      "version": "1.0.0",
      "hasInstallScript": true,
      "dependencies": {
-
        "@radicle/gray-matter": "4.1.0",
        "@wooorm/starry-night": "^3.9.0",
        "async-mutex": "^0.5.0",
        "baconjs": "^3.0.23",
@@ -20,6 +19,7 @@
        "fuzzysort": "^3.1.0",
        "hast-util-to-dom": "^4.0.1",
        "hast-util-to-html": "^9.0.5",
+
        "js-yaml": "^4.1.1",
        "linkify-it": "^5.0.0",
        "lodash": "^4.18.1",
        "lru-cache": "^11.3.5",
@@ -39,6 +39,7 @@
        "@playwright/test": "^1.59.1",
        "@sveltejs/vite-plugin-svelte": "^7.0.0",
        "@tsconfig/svelte": "^5.0.8",
+
        "@types/js-yaml": "^4.0.9",
        "@types/katex": "^0.16.8",
        "@types/linkify-it": "^5.0.0",
        "@types/lodash": "^4.17.24",
@@ -524,21 +525,6 @@
        "node": ">=18"
      }
    },
-
    "node_modules/@radicle/gray-matter": {
-
      "version": "4.1.0",
-
      "resolved": "https://registry.npmjs.org/@radicle/gray-matter/-/gray-matter-4.1.0.tgz",
-
      "integrity": "sha512-Cbdz8QMzIuZXxeGpJtvnNiMYF4YTOJn1EDsEZ0GsgCVWVL96LGPZIu30/bEtw2U8p7anZuQNqa4ugqB+qsEjqw==",
-
      "license": "MIT",
-
      "dependencies": {
-
        "js-yaml": "^4.1.0",
-
        "kind-of": "^6.0.2",
-
        "section-matter": "^1.0.0",
-
        "strip-bom-string": "^1.0.0"
-
      },
-
      "engines": {
-
        "node": ">=6.0"
-
      }
-
    },
    "node_modules/@rolldown/binding-android-arm64": {
      "version": "1.0.0-rc.16",
      "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.16.tgz",
@@ -1194,6 +1180,13 @@
        "@types/unist": "*"
      }
    },
+
    "node_modules/@types/js-yaml": {
+
      "version": "4.0.9",
+
      "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz",
+
      "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==",
+
      "dev": true,
+
      "license": "MIT"
+
    },
    "node_modules/@types/json-schema": {
      "version": "7.0.15",
      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -3080,18 +3073,6 @@
        "node": ">=12.0.0"
      }
    },
-
    "node_modules/extend-shallow": {
-
      "version": "2.0.1",
-
      "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
-
      "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==",
-
      "license": "MIT",
-
      "dependencies": {
-
        "is-extendable": "^0.1.0"
-
      },
-
      "engines": {
-
        "node": ">=0.10.0"
-
      }
-
    },
    "node_modules/fast-deep-equal": {
      "version": "3.1.3",
      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -3636,15 +3617,6 @@
      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
      "license": "MIT"
    },
-
    "node_modules/is-extendable": {
-
      "version": "0.1.1",
-
      "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
-
      "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
-
      "license": "MIT",
-
      "engines": {
-
        "node": ">=0.10.0"
-
      }
-
    },
    "node_modules/is-extglob": {
      "version": "2.1.1",
      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
@@ -3831,15 +3803,6 @@
      "resolved": "https://registry.npmjs.org/khroma/-/khroma-2.1.0.tgz",
      "integrity": "sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw=="
    },
-
    "node_modules/kind-of": {
-
      "version": "6.0.3",
-
      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-
      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
-
      "license": "MIT",
-
      "engines": {
-
        "node": ">=0.10.0"
-
      }
-
    },
    "node_modules/known-css-properties": {
      "version": "0.37.0",
      "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz",
@@ -5132,19 +5095,6 @@
      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
      "license": "MIT"
    },
-
    "node_modules/section-matter": {
-
      "version": "1.0.0",
-
      "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
-
      "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
-
      "license": "MIT",
-
      "dependencies": {
-
        "extend-shallow": "^2.0.1",
-
        "kind-of": "^6.0.0"
-
      },
-
      "engines": {
-
        "node": ">=4"
-
      }
-
    },
    "node_modules/semver": {
      "version": "7.7.4",
      "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
@@ -5249,15 +5199,6 @@
        "url": "https://github.com/sponsors/wooorm"
      }
    },
-
    "node_modules/strip-bom-string": {
-
      "version": "1.0.0",
-
      "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz",
-
      "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==",
-
      "license": "MIT",
-
      "engines": {
-
        "node": ">=0.10.0"
-
      }
-
    },
    "node_modules/strip-final-newline": {
      "version": "4.0.0",
      "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz",
modified package.json
@@ -31,6 +31,7 @@
    "@tsconfig/svelte": "^5.0.8",
    "@types/katex": "^0.16.8",
    "@types/linkify-it": "^5.0.0",
+
    "@types/js-yaml": "^4.0.9",
    "@types/lodash": "^4.17.24",
    "@types/md5": "^2.3.6",
    "@types/node": "^24",
@@ -57,7 +58,6 @@
    "wait-on": "^9.0.5"
  },
  "dependencies": {
-
    "@radicle/gray-matter": "4.1.0",
    "@wooorm/starry-night": "^3.9.0",
    "async-mutex": "^0.5.0",
    "baconjs": "^3.0.23",
@@ -68,6 +68,7 @@
    "fuzzysort": "^3.1.0",
    "hast-util-to-dom": "^4.0.1",
    "hast-util-to-html": "^9.0.5",
+
    "js-yaml": "^4.1.1",
    "linkify-it": "^5.0.0",
    "lodash": "^4.18.1",
    "lru-cache": "^11.3.5",
modified src/components/Markdown.svelte
@@ -23,7 +23,6 @@

<script lang="ts">
  import dompurify from "dompurify";
-
  import matter from "@radicle/gray-matter";
  import { afterUpdate } from "svelte";
  import { toDom } from "hast-util-to-dom";

@@ -41,6 +40,7 @@
    isCommit,
  } from "@app/lib/utils";
  import { Renderer, markdown, sanitizeConfig } from "@app/lib/markdown";
+
  import { parseFrontmatter } from "@app/lib/frontmatter";

  export let content: string;
  export let path: string = "/";
@@ -54,7 +54,7 @@

  $: {
    try {
-
      const doc = matter(content);
+
      const doc = parseFrontmatter(content);
      content = doc.content;
      frontMatter = Object.entries(doc.data).filter(
        ([, val]) => typeof val === "string" || typeof val === "number",
added src/lib/frontmatter.ts
@@ -0,0 +1,21 @@
+
import yaml from "js-yaml";
+

+
const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;
+

+
export interface ParsedFrontmatter {
+
  data: Record<string, unknown>;
+
  content: string;
+
}
+

+
export function parseFrontmatter(input: string): ParsedFrontmatter {
+
  const match = input.match(FRONTMATTER_RE);
+
  if (!match) {
+
    return { data: {}, content: input };
+
  }
+
  const parsed = yaml.load(match[1]);
+
  const data =
+
    parsed && typeof parsed === "object" && !Array.isArray(parsed)
+
      ? (parsed as Record<string, unknown>)
+
      : {};
+
  return { data, content: input.slice(match[0].length) };
+
}