fix: Mermaid persisted as last used language (#12601)

* fix: Mermaid persisted as last used language

* Suppress mermaid in getFrequentCodeLanguages too
This commit is contained in:
Tom Moor
2026-06-05 22:33:03 -04:00
committed by GitHub
parent 9ec6b8309d
commit b5465376ae
2 changed files with 77 additions and 9 deletions
+51 -1
View File
@@ -1,4 +1,11 @@
import { getRefractorLangForLanguage, getLabelForLanguage } from "./code";
import Storage from "../../utils/Storage";
import {
getRefractorLangForLanguage,
getLabelForLanguage,
setRecentlyUsedCodeLanguage,
getRecentlyUsedCodeLanguage,
getFrequentCodeLanguages,
} from "./code";
describe("getRefractorLangForLanguage", () => {
it("should return the correct lang identifier for a given language", () => {
@@ -26,3 +33,46 @@ describe("getLabelForLanguage", () => {
expect(getLabelForLanguage("")).toBe("Plain text");
});
});
describe("setRecentlyUsedCodeLanguage", () => {
beforeEach(() => {
Storage.clear();
});
it("should remember the last selected code language", () => {
setRecentlyUsedCodeLanguage("javascript");
expect(getRecentlyUsedCodeLanguage()).toBe("javascript");
});
it("should not remember mermaid as the last selected code language", () => {
setRecentlyUsedCodeLanguage("javascript");
setRecentlyUsedCodeLanguage("mermaid");
expect(getRecentlyUsedCodeLanguage()).toBe("javascript");
});
it("should not remember mermaidjs as the last selected code language", () => {
setRecentlyUsedCodeLanguage("javascript");
setRecentlyUsedCodeLanguage("mermaidjs");
expect(getRecentlyUsedCodeLanguage()).toBe("javascript");
});
it("should ignore mermaid that was already persisted", () => {
Storage.set("rme-code-language", "mermaid");
expect(getRecentlyUsedCodeLanguage()).toBeUndefined();
});
});
describe("getFrequentCodeLanguages", () => {
beforeEach(() => {
Storage.clear();
});
it("should exclude mermaid that was already persisted", () => {
Storage.set("frequent-code-languages", {
javascript: 3,
mermaid: 5,
mermaidjs: 2,
});
expect(getFrequentCodeLanguages()).toEqual(["javascript"]);
});
});
+26 -8
View File
@@ -374,12 +374,23 @@ export const getRefractorLangForLanguage = (
export const getLoaderForLanguage = (language: string) =>
codeLanguages[language as keyof typeof codeLanguages]?.loader;
// Mermaid diagrams have a separate insertion entry point, so they should never
// be remembered as a recently or frequently used code language.
const nonPersistableLanguages = ["mermaid", "mermaidjs"];
const isPersistableCodeLanguage = (language: string) =>
!nonPersistableLanguages.includes(language);
/**
* Set the most recent code language used.
*
* @param language The language identifier.
*/
export const setRecentlyUsedCodeLanguage = (language: string) => {
if (!isPersistableCodeLanguage(language)) {
return;
}
const frequentLangs = (Storage.get(StorageKey) ?? {}) as Record<
string,
number
@@ -416,8 +427,12 @@ export const setRecentlyUsedCodeLanguage = (language: string) => {
*
* @returns The most recent code language used, or undefined if none is set.
*/
export const getRecentlyUsedCodeLanguage = () =>
Storage.get(RecentlyUsedStorageKey) as keyof typeof codeLanguages | undefined;
export const getRecentlyUsedCodeLanguage = () => {
const language = Storage.get(RecentlyUsedStorageKey) as
| keyof typeof codeLanguages
| undefined;
return language && isPersistableCodeLanguage(language) ? language : undefined;
};
/**
* Get the most frequent code languages used.
@@ -425,17 +440,20 @@ export const getRecentlyUsedCodeLanguage = () =>
* @returns An array of the most frequent code languages used.
*/
export const getFrequentCodeLanguages = () => {
const recentLang = Storage.get(RecentlyUsedStorageKey);
const frequentLangEntries = Object.entries(Storage.get(StorageKey) ?? {}) as [
keyof typeof codeLanguages,
number,
][];
const recentLang = getRecentlyUsedCodeLanguage();
const frequentLangEntries = (
Object.entries(Storage.get(StorageKey) ?? {}) as [
keyof typeof codeLanguages,
number,
][]
).filter(([lang]) => isPersistableCodeLanguage(lang));
const frequentLangs = sortFrequencies(frequentLangEntries)
.slice(0, frequentLanguagesToGet)
.map(([lang]) => lang);
const isRecentLangPresent = frequentLangs.includes(recentLang);
const isRecentLangPresent =
!!recentLang && frequentLangs.includes(recentLang);
if (recentLang && !isRecentLangPresent) {
frequentLangs.pop();
frequentLangs.push(recentLang);