diff --git a/shared/editor/lib/code.test.ts b/shared/editor/lib/code.test.ts index 1764ef4ac4..8d60da26e4 100644 --- a/shared/editor/lib/code.test.ts +++ b/shared/editor/lib/code.test.ts @@ -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"]); + }); +}); diff --git a/shared/editor/lib/code.ts b/shared/editor/lib/code.ts index 9e56ccca09..4e09076115 100644 --- a/shared/editor/lib/code.ts +++ b/shared/editor/lib/code.ts @@ -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);