/*
Copyright 2024 New Vector Ltd.
Copyright 2023 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
*/
import fetchMock from "@fetch-mock/jest";
import getExportCSS from "../../../../src/utils/exportUtils/exportCSS";
describe("exportCSS", () => {
describe("getExportCSS", () => {
beforeEach(() => {
document.head.replaceChildren();
});
it("supports documents missing stylesheets", async () => {
const css = await getExportCSS(new Set());
expect(css).not.toContain("color-scheme: light");
});
it("fetches export stylesheets and filters unused css", async () => {
document.head.innerHTML = `
`;
fetchMock.get(
"end:/bundle.css",
`
@font-face { font-family: Inter; src: url(inter.woff2); }
body { margin: 0; }
.mx_Used { font-family: Inter; color: #111111; }
.mx_Code { font-family: Fira Code; }
.mx_Unused { color: #123456; }
.mx_Empty {}
.mx_Used, .mx_UnusedComma { color: #abcdef; }
@media screen {
.mx_Used { --cpd-font-family-sans: "Inter"; }
.mx_UnusedNested { color: #654321; }
}
@supports (display: grid) {
.mx_UnusedSupported { color: #fedcba; }
}
`,
);
fetchMock.get("end:/theme-light.css", ".mx_Theme { color: #222222; }");
const css = await getExportCSS(new Set(["mx_Used", "mx_Code", "mx_Theme"]));
expect(fetchMock).toHaveFetchedTimes(1, "end:/bundle.css");
expect(fetchMock).toHaveFetchedTimes(1, "end:/theme-light.css");
expect(fetchMock).not.toHaveFetched("end:/theme-dark.css");
expect(css).toContain("margin:0");
expect(css).toContain("#111");
expect(css).toContain("#222");
expect(css).toContain("#abcdef");
expect(css).not.toContain("@font-face");
expect(css).not.toContain("#123456");
expect(css).not.toContain("#654321");
expect(css).not.toContain("#fedcba");
expect(css).not.toContain("font-family:Inter");
expect(css).not.toContain("font-family:Fira Code");
expect(css).toContain("BlinkMacSystemFont");
expect(css).toContain("Menlo, Consolas");
});
it("keeps export-only css in the app cascade layer after layered font rules", async () => {
document.head.innerHTML = `
`;
fetchMock.get(
"end:/bundle.css",
`
@layer compound-tokens, compound-web, shared-components, app-web;
@layer compound-web {
.mx_Typography {
font: var(--cpd-font-heading-lg-regular);
}
}
@layer app-web {
body {
font: var(--cpd-font-body-md-regular) !important;
}
}
`,
);
const css = await getExportCSS(new Set(["mx_Typography"]));
expect(css).toContain("@layer compound-web{.mx_Typography{font:var(--cpd-font-heading-lg-regular)}}");
expect(css).toContain("@layer app-web{body{font:var(--cpd-font-body-md-regular)!important}}");
const exportCssLayerIndex = css.indexOf("@layer app-web {");
expect(exportCssLayerIndex).toBeGreaterThan(
css.indexOf("@layer app-web{body{font:var(--cpd-font-body-md-regular)!important}}"),
);
expect(css.slice(exportCssLayerIndex)).toBe("@layer app-web {css-file-stub}");
});
});
});