Radish alpha
r
Radicle desktop app
Radicle
Git (anonymous pull)
Log in to clone via SSH
Replace @radicle/gray-matter with js-yaml frontmatter parser
✓ CI success Rūdolfs Ošiņš committed 7 days ago
commit 15955af7fd0baef9c6f9ea7570151cae5d2701f1
parent 8c2c6703d38a4984b5d463c36ad1a24ce0bc4bc0
1 passed (1 total) View logs
4 files changed +34 -77
modified package-lock.json
@@ -26,11 +26,11 @@
      "devDependencies": {
        "@eslint/js": "^10.0.1",
        "@playwright/test": "1.60.0",
-
        "@radicle/gray-matter": "4.1.0",
        "@sveltejs/vite-plugin-svelte": "^7.1.2",
        "@tauri-apps/cli": "^2.11.1",
        "@tsconfig/svelte": "^5.0.8",
        "@types/hast": "^3.0.4",
+
        "@types/js-yaml": "^4.0.9",
        "@types/lodash": "^4.17.24",
        "@types/md5": "^2.3.6",
        "@types/node": "^24",
@@ -52,6 +52,7 @@
        "globals": "^17.6.0",
        "happy-dom": "^20.9.0",
        "hast-util-to-dom": "^4.0.1",
+
        "js-yaml": "^4.1.1",
        "katex": "^0.16.45",
        "keyux": "^0.11.5",
        "lodash": "^4.18.1",
@@ -478,22 +479,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==",
-
      "dev": true,
-
      "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",
      "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0.tgz",
@@ -1177,6 +1162,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",
@@ -2487,19 +2479,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==",
-
      "dev": true,
-
      "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",
@@ -3007,16 +2986,6 @@
      "dev": true,
      "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==",
-
      "dev": true,
-
      "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",
@@ -3204,16 +3173,6 @@
        "json-buffer": "3.0.1"
      }
    },
-
    "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==",
-
      "dev": true,
-
      "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",
@@ -4348,20 +4307,6 @@
        "node": ">=6"
      }
    },
-
    "node_modules/section-matter": {
-
      "version": "1.0.0",
-
      "resolved": "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz",
-
      "integrity": "sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==",
-
      "dev": true,
-
      "license": "MIT",
-
      "dependencies": {
-
        "extend-shallow": "^2.0.1",
-
        "kind-of": "^6.0.0"
-
      },
-
      "engines": {
-
        "node": ">=4"
-
      }
-
    },
    "node_modules/semver": {
      "version": "7.8.0",
      "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz",
@@ -4465,16 +4410,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==",
-
      "dev": true,
-
      "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
@@ -42,11 +42,11 @@
  "devDependencies": {
    "@eslint/js": "^10.0.1",
    "@playwright/test": "1.60.0",
-
    "@radicle/gray-matter": "4.1.0",
    "@sveltejs/vite-plugin-svelte": "^7.1.2",
    "@tauri-apps/cli": "^2.11.1",
    "@tsconfig/svelte": "^5.0.8",
    "@types/hast": "^3.0.4",
+
    "@types/js-yaml": "^4.0.9",
    "@types/lodash": "^4.17.24",
    "@types/md5": "^2.3.6",
    "@types/node": "^24",
@@ -68,6 +68,7 @@
    "globals": "^17.6.0",
    "happy-dom": "^20.9.0",
    "hast-util-to-dom": "^4.0.1",
+
    "js-yaml": "^4.1.1",
    "katex": "^0.16.45",
    "keyux": "^0.11.5",
    "lodash": "^4.18.1",
modified src/components/Markdown.svelte
@@ -1,11 +1,11 @@
<script lang="ts">
  import type { Embed } from "@bindings/cob/Embed";

-
  import matter from "@radicle/gray-matter";
  import dompurify from "dompurify";
  import { toDom } from "hast-util-to-dom";
  import { tick } from "svelte";

+
  import { parseFrontmatter } from "@app/lib/frontmatter";
  import { invoke } from "@app/lib/invoke";
  import { markdownWithExtensions, Renderer } from "@app/lib/markdown";
  import { highlight } from "@app/lib/syntax";
@@ -22,7 +22,7 @@

  let container: HTMLElement;

-
  const doc = $derived(matter(content));
+
  const doc = $derived(parseFrontmatter(content));
  const frontMatter = $derived.by(() => {
    try {
      return Object.entries(doc.data).filter(
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) };
+
}