Update find-unused-settings script (#34252)
* Move more tests over to vitest * Add exception for test_setting * Update find-unused-settings script To not consider usage in tests as real usage * Remove legacy font settings They have been being migrated for over 2 years at this point and are flagged by the script as unused * Re-add test
This commit is contained in:
@@ -108,11 +108,6 @@ export enum Action {
|
|||||||
*/
|
*/
|
||||||
ToggleSpacePanel = "toggle_space_panel",
|
ToggleSpacePanel = "toggle_space_panel",
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the apps root font size. Should be used with UpdateFontSizePayload
|
|
||||||
*/
|
|
||||||
MigrateBaseFontSize = "migrate_base_font_size",
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the apps root font size delta. Should be used with UpdateFontSizeDeltaPayload
|
* Sets the apps root font size delta. Should be used with UpdateFontSizeDeltaPayload
|
||||||
* It will add the delta to the current font size.
|
* It will add the delta to the current font size.
|
||||||
|
|||||||
@@ -238,8 +238,6 @@ export interface Settings {
|
|||||||
"mjolnirPersonalRoom": IBaseSetting<string | null>;
|
"mjolnirPersonalRoom": IBaseSetting<string | null>;
|
||||||
"RoomList.backgroundImage": IBaseSetting<string | null>;
|
"RoomList.backgroundImage": IBaseSetting<string | null>;
|
||||||
"sendReadReceipts": IBaseSetting<boolean>;
|
"sendReadReceipts": IBaseSetting<boolean>;
|
||||||
"baseFontSize": IBaseSetting<"" | number>;
|
|
||||||
"baseFontSizeV2": IBaseSetting<"" | number>;
|
|
||||||
"fontSizeDelta": IBaseSetting<number>;
|
"fontSizeDelta": IBaseSetting<number>;
|
||||||
"useCustomFontSize": IBaseSetting<boolean>;
|
"useCustomFontSize": IBaseSetting<boolean>;
|
||||||
"MessageComposerInput.suggestEmoji": IBaseSetting<boolean>;
|
"MessageComposerInput.suggestEmoji": IBaseSetting<boolean>;
|
||||||
@@ -623,15 +621,6 @@ export const SETTINGS: Settings = {
|
|||||||
shouldWarn: true,
|
shouldWarn: true,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
/**
|
|
||||||
* @deprecated in favor of {@link fontSizeDelta}
|
|
||||||
*/
|
|
||||||
"baseFontSize": {
|
|
||||||
displayName: _td("settings|appearance|font_size"),
|
|
||||||
supportedLevels: LEVELS_ACCOUNT_SETTINGS,
|
|
||||||
default: "",
|
|
||||||
controller: new FontSizeController(),
|
|
||||||
},
|
|
||||||
"feature_render_reaction_images": {
|
"feature_render_reaction_images": {
|
||||||
isFeature: true,
|
isFeature: true,
|
||||||
labsGroup: LabGroup.Messaging,
|
labsGroup: LabGroup.Messaging,
|
||||||
@@ -658,21 +647,8 @@ export const SETTINGS: Settings = {
|
|||||||
isFeature: true,
|
isFeature: true,
|
||||||
default: false,
|
default: false,
|
||||||
},
|
},
|
||||||
/**
|
|
||||||
* With the transition to Compound we are moving to a base font size
|
|
||||||
* of 16px. We're taking the opportunity to move away from the `baseFontSize`
|
|
||||||
* setting that had a 5px offset.
|
|
||||||
* @deprecated in favor {@link fontSizeDelta}
|
|
||||||
*/
|
|
||||||
"baseFontSizeV2": {
|
|
||||||
displayName: _td("settings|appearance|font_size"),
|
|
||||||
supportedLevels: [SettingLevel.DEVICE],
|
|
||||||
default: "",
|
|
||||||
controller: new FontSizeController(),
|
|
||||||
},
|
|
||||||
/**
|
/**
|
||||||
* This delta is added to the browser default font size
|
* This delta is added to the browser default font size
|
||||||
* Moving from `baseFontSizeV2` to `fontSizeDelta` to replace the default 16px to --cpd-font-size-root (browser default font size) + fontSizeDelta
|
|
||||||
*/
|
*/
|
||||||
"fontSizeDelta": {
|
"fontSizeDelta": {
|
||||||
displayName: _td("settings|appearance|font_size"),
|
displayName: _td("settings|appearance|font_size"),
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import dis from "../../dispatcher/dispatcher";
|
|||||||
import FontSizeController from "./FontSizeController";
|
import FontSizeController from "./FontSizeController";
|
||||||
import { SettingLevel } from "../SettingLevel";
|
import { SettingLevel } from "../SettingLevel";
|
||||||
|
|
||||||
const dispatchSpy = vi.spyOn(dis, "fire");
|
const dispatchSpy = vi.spyOn(dis, "dispatch");
|
||||||
|
|
||||||
describe("FontSizeController", () => {
|
describe("FontSizeController", () => {
|
||||||
it("dispatches a font size action on change", () => {
|
it("dispatches a font size action on change", () => {
|
||||||
@@ -21,6 +21,6 @@ describe("FontSizeController", () => {
|
|||||||
|
|
||||||
controller.onChange(SettingLevel.ACCOUNT, "$room:server", 12);
|
controller.onChange(SettingLevel.ACCOUNT, "$room:server", 12);
|
||||||
|
|
||||||
expect(dispatchSpy).toHaveBeenCalledWith(Action.MigrateBaseFontSize);
|
expect(dispatchSpy).toHaveBeenCalledWith({ action: Action.UpdateFontSizeDelta, delta: 12 });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import SettingController from "./SettingController";
|
|||||||
import dis from "../../dispatcher/dispatcher";
|
import dis from "../../dispatcher/dispatcher";
|
||||||
import { type UpdateFontSizeDeltaPayload } from "../../dispatcher/payloads/UpdateFontSizeDeltaPayload";
|
import { type UpdateFontSizeDeltaPayload } from "../../dispatcher/payloads/UpdateFontSizeDeltaPayload";
|
||||||
import { Action } from "../../dispatcher/actions";
|
import { Action } from "../../dispatcher/actions";
|
||||||
import { SettingLevel } from "../SettingLevel";
|
import { type SettingLevel } from "../SettingLevel";
|
||||||
|
|
||||||
export default class FontSizeController extends SettingController {
|
export default class FontSizeController extends SettingController {
|
||||||
public constructor() {
|
public constructor() {
|
||||||
@@ -18,13 +18,7 @@ export default class FontSizeController extends SettingController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public onChange(level: SettingLevel, roomId: string, newValue: any): void {
|
public onChange(level: SettingLevel, roomId: string, newValue: any): void {
|
||||||
// In a distant past, `baseFontSize` was set on the account and config
|
if (newValue !== "") {
|
||||||
// level. This can be accessed only after the initial sync. If we end up
|
|
||||||
// discovering that a logged in user has this kind of setting, we want to
|
|
||||||
// trigger another migration of the base font size.
|
|
||||||
if (level === SettingLevel.ACCOUNT || level === SettingLevel.CONFIG) {
|
|
||||||
dis.fire(Action.MigrateBaseFontSize);
|
|
||||||
} else if (newValue !== "") {
|
|
||||||
// Dispatch font size change so that everything open responds to the change.
|
// Dispatch font size change so that everything open responds to the change.
|
||||||
dis.dispatch<UpdateFontSizeDeltaPayload>({
|
dis.dispatch<UpdateFontSizeDeltaPayload>({
|
||||||
action: Action.UpdateFontSizeDelta,
|
action: Action.UpdateFontSizeDelta,
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import SettingsStore from "../SettingsStore";
|
|||||||
import type IWatcher from "./Watcher";
|
import type IWatcher from "./Watcher";
|
||||||
import { toPx } from "../../utils/units";
|
import { toPx } from "../../utils/units";
|
||||||
import { Action } from "../../dispatcher/actions";
|
import { Action } from "../../dispatcher/actions";
|
||||||
import { SettingLevel } from "../SettingLevel";
|
|
||||||
import { type UpdateSystemFontPayload } from "../../dispatcher/payloads/UpdateSystemFontPayload";
|
import { type UpdateSystemFontPayload } from "../../dispatcher/payloads/UpdateSystemFontPayload";
|
||||||
import { type ActionPayload } from "../../dispatcher/payloads";
|
import { type ActionPayload } from "../../dispatcher/payloads";
|
||||||
|
|
||||||
@@ -33,97 +32,6 @@ export class FontWatcher implements IWatcher {
|
|||||||
public async start(): Promise<void> {
|
public async start(): Promise<void> {
|
||||||
this.updateFont();
|
this.updateFont();
|
||||||
this.dispatcherRef = dis.register(this.onAction);
|
this.dispatcherRef = dis.register(this.onAction);
|
||||||
/**
|
|
||||||
* baseFontSize is an account level setting which is loaded after the initial
|
|
||||||
* sync. Hence why we can't do that in the `constructor`
|
|
||||||
*/
|
|
||||||
await this.migrateBaseFontSize();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Migrate the base font size from the V1 and V2 version to the V3 version
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
private async migrateBaseFontSize(): Promise<void> {
|
|
||||||
await this.migrateBaseFontV1toFontSizeDelta();
|
|
||||||
await this.migrateBaseFontV2toFontSizeDelta();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Migrating from the V1 version of the base font size to the new delta system.
|
|
||||||
* The delta system is using the default browser font size as a base
|
|
||||||
* Everything will become slightly larger, and getting rid of the `SIZE_DIFF`
|
|
||||||
* weirdness for locally persisted values
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
private async migrateBaseFontV1toFontSizeDelta(): Promise<void> {
|
|
||||||
const legacyBaseFontSize = SettingsStore.getValue("baseFontSize");
|
|
||||||
// No baseFontV1 found, nothing to migrate
|
|
||||||
if (!legacyBaseFontSize) return;
|
|
||||||
|
|
||||||
console.log(
|
|
||||||
"Migrating base font size -> base font size V2 -> font size delta for Compound, current value",
|
|
||||||
legacyBaseFontSize,
|
|
||||||
);
|
|
||||||
|
|
||||||
// Compute the V1 to V2 version before migrating to fontSizeDelta
|
|
||||||
const baseFontSizeV2 = this.computeBaseFontSizeV1toV2(legacyBaseFontSize);
|
|
||||||
|
|
||||||
// Compute the difference between the V2 and the fontSizeDelta
|
|
||||||
const delta = this.computeFontSizeDeltaFromV2BaseFontSize(baseFontSizeV2);
|
|
||||||
|
|
||||||
await SettingsStore.setValue("fontSizeDelta", null, SettingLevel.DEVICE, delta);
|
|
||||||
await SettingsStore.setValue("baseFontSize", null, SettingLevel.DEVICE, 0);
|
|
||||||
console.log("Migration complete, deleting legacy `baseFontSize`");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Migrating from the V2 version of the base font size to the new delta system
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
private async migrateBaseFontV2toFontSizeDelta(): Promise<void> {
|
|
||||||
const legacyBaseFontV2Size = SettingsStore.getValue("baseFontSizeV2");
|
|
||||||
// No baseFontV2 found, nothing to migrate
|
|
||||||
if (!legacyBaseFontV2Size) return;
|
|
||||||
|
|
||||||
console.log("Migrating base font size V2 for Compound, current value", legacyBaseFontV2Size);
|
|
||||||
|
|
||||||
// Compute the difference between the V2 and the fontSizeDelta
|
|
||||||
const delta = this.computeFontSizeDeltaFromV2BaseFontSize(legacyBaseFontV2Size);
|
|
||||||
|
|
||||||
await SettingsStore.setValue("fontSizeDelta", null, SettingLevel.DEVICE, delta);
|
|
||||||
await SettingsStore.setValue("baseFontSizeV2", null, SettingLevel.DEVICE, 0);
|
|
||||||
console.log("Migration complete, deleting legacy `baseFontSizeV2`");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compute the V2 font size from the V1 font size
|
|
||||||
* @param legacyBaseFontSize
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
private computeBaseFontSizeV1toV2(legacyBaseFontSize: number): number {
|
|
||||||
// For some odd reason, the persisted value in user storage has an offset
|
|
||||||
// of 5 pixels for all values stored under `baseFontSize`
|
|
||||||
const LEGACY_SIZE_DIFF = 5;
|
|
||||||
|
|
||||||
// Compound uses a base font size of `16px`, whereas the old Element
|
|
||||||
// styles based their calculations off a `15px` root font size.
|
|
||||||
const ROOT_FONT_SIZE_INCREASE = 1;
|
|
||||||
|
|
||||||
// Compute the font size of the V2 version before migrating to V3
|
|
||||||
return legacyBaseFontSize + ROOT_FONT_SIZE_INCREASE + LEGACY_SIZE_DIFF;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compute the difference between the V2 font size and the default browser font size
|
|
||||||
* @param legacyBaseFontV2Size
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
private computeFontSizeDeltaFromV2BaseFontSize(legacyBaseFontV2Size: number): number {
|
|
||||||
const browserDefaultFontSize = FontWatcher.getRootFontSize();
|
|
||||||
|
|
||||||
// Compute the difference between the V2 font size and the default browser font size
|
|
||||||
return legacyBaseFontV2Size - browserDefaultFontSize;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -157,9 +65,7 @@ export class FontWatcher implements IWatcher {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private onAction = (payload: ActionPayload): void => {
|
private onAction = (payload: ActionPayload): void => {
|
||||||
if (payload.action === Action.MigrateBaseFontSize) {
|
if (payload.action === Action.UpdateFontSizeDelta) {
|
||||||
this.migrateBaseFontSize();
|
|
||||||
} else if (payload.action === Action.UpdateFontSizeDelta) {
|
|
||||||
this.setRootFontSize(payload.delta);
|
this.setRootFontSize(payload.delta);
|
||||||
} else if (payload.action === Action.UpdateSystemFont) {
|
} else if (payload.action === Action.UpdateSystemFont) {
|
||||||
this.setSystemFont(payload as UpdateSystemFontPayload);
|
this.setSystemFont(payload as UpdateSystemFontPayload);
|
||||||
|
|||||||
@@ -112,66 +112,6 @@ describe("FontWatcher", function () {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("Migrates baseFontSize", () => {
|
|
||||||
let watcher: FontWatcher | undefined;
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
document.documentElement.style.fontSize = "14px";
|
|
||||||
watcher = new FontWatcher();
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
watcher!.stop();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should not run the migration", async () => {
|
|
||||||
await watcher!.start();
|
|
||||||
expect(SettingsStore.getValue("fontSizeDelta")).toBe(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should migrate from V1 font size to V3", async () => {
|
|
||||||
await SettingsStore.setValue("baseFontSize", null, SettingLevel.DEVICE, 13);
|
|
||||||
await watcher!.start();
|
|
||||||
// 13px (V1 font size) + 5px (V1 offset) + 1px (root font size increase) - 16px (default browser font size) = 3px
|
|
||||||
expect(SettingsStore.getValue("fontSizeDelta")).toBe(3);
|
|
||||||
// baseFontSize should be cleared
|
|
||||||
expect(SettingsStore.getValue("baseFontSize")).toBe(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should migrate from V2 font size to V3 using browser font size", async () => {
|
|
||||||
await SettingsStore.setValue("baseFontSizeV2", null, SettingLevel.DEVICE, 18);
|
|
||||||
await watcher!.start();
|
|
||||||
// 18px - 16px (default browser font size) = 2px
|
|
||||||
expect(SettingsStore.getValue("fontSizeDelta")).toBe(2);
|
|
||||||
// baseFontSize should be cleared
|
|
||||||
expect(SettingsStore.getValue("baseFontSizeV2")).toBe(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should migrate from V2 font size to V3 using fallback font size", async () => {
|
|
||||||
document.documentElement.style.fontSize = "";
|
|
||||||
await SettingsStore.setValue("baseFontSizeV2", null, SettingLevel.DEVICE, 18);
|
|
||||||
await watcher!.start();
|
|
||||||
// 18px - 16px (fallback) = 2px
|
|
||||||
expect(SettingsStore.getValue("fontSizeDelta")).toBe(2);
|
|
||||||
// baseFontSize should be cleared
|
|
||||||
expect(SettingsStore.getValue("baseFontSizeV2")).toBe(0);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should trigger migration when dispatched", async () => {
|
|
||||||
await watcher!.start();
|
|
||||||
|
|
||||||
await SettingsStore.setValue("baseFontSizeV2", null, SettingLevel.DEVICE, 18);
|
|
||||||
defaultDispatcher.fire(Action.MigrateBaseFontSize);
|
|
||||||
|
|
||||||
await waitFor(() => {
|
|
||||||
// 18px - 16px (default browser font size) = 2px
|
|
||||||
expect(SettingsStore.getValue("fontSizeDelta")).toBe(2);
|
|
||||||
// baseFontSizeV2 should be cleared
|
|
||||||
expect(SettingsStore.getValue("baseFontSizeV2")).toBe(0);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it("should update root font size with positive delta", async () => {
|
it("should update root font size with positive delta", async () => {
|
||||||
await new FontWatcher().start();
|
await new FontWatcher().start();
|
||||||
|
|
||||||
|
|||||||
Regular → Executable
+12
-10
@@ -22,10 +22,15 @@ const ROOT = path.resolve(__dirname, "..");
|
|||||||
const SETTINGS_DIR = path.join(ROOT, "apps/web/src/settings");
|
const SETTINGS_DIR = path.join(ROOT, "apps/web/src/settings");
|
||||||
const SETTINGS_FILE = path.join(SETTINGS_DIR, "Settings.tsx");
|
const SETTINGS_FILE = path.join(SETTINGS_DIR, "Settings.tsx");
|
||||||
|
|
||||||
// Only the settings *definitions* directory should be excluded from the usage search -
|
const EXCLUDE_GLOBS = [
|
||||||
// there are plenty of other directories literally named "settings" (e.g.
|
// Only the settings *definitions* directory should be excluded from the usage search -
|
||||||
// apps/web/src/components/views/settings/) which hold real usages and must stay included.
|
// there are plenty of other directories literally named "settings" (e.g.
|
||||||
const SETTINGS_DIR_RELATIVE = path.relative(ROOT, SETTINGS_DIR);
|
// apps/web/src/components/views/settings/) which hold real usages and must stay included.
|
||||||
|
"apps/web/src/settings/**",
|
||||||
|
"*/*/test/**",
|
||||||
|
"*-test.*",
|
||||||
|
"*.test.*",
|
||||||
|
].map((pattern) => path.relative(ROOT, pattern));
|
||||||
|
|
||||||
// See https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-error-message
|
// See https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#setting-an-error-message
|
||||||
const SETTINGS_FILE_RELATIVE = path.relative(ROOT, SETTINGS_FILE);
|
const SETTINGS_FILE_RELATIVE = path.relative(ROOT, SETTINGS_FILE);
|
||||||
@@ -151,12 +156,9 @@ function findControllerText(settingValue: ts.Expression, sourceFile: ts.SourceFi
|
|||||||
*/
|
*/
|
||||||
function isUsedOutsideSettings(searchTerms: string[]): boolean {
|
function isUsedOutsideSettings(searchTerms: string[]): boolean {
|
||||||
const patternArgs = searchTerms.flatMap((term) => ["-e", term]);
|
const patternArgs = searchTerms.flatMap((term) => ["-e", term]);
|
||||||
|
const excludeArgs = EXCLUDE_GLOBS.map((term) => `:(exclude)${term}`);
|
||||||
try {
|
try {
|
||||||
execFileSync(
|
execFileSync("git", ["grep", "-F", "-q", ...patternArgs, "--", "apps", ...excludeArgs], { cwd: ROOT });
|
||||||
"git",
|
|
||||||
["grep", "-F", "-q", ...patternArgs, "--", "apps", `:(exclude)${SETTINGS_DIR_RELATIVE}/**`],
|
|
||||||
{ cwd: ROOT },
|
|
||||||
);
|
|
||||||
return true;
|
return true;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
if (typeof (e as { status?: number }).status === "number") return false;
|
if (typeof (e as { status?: number }).status === "number") return false;
|
||||||
@@ -205,7 +207,7 @@ function reportUnused(unused: DeclaredSetting[]): void {
|
|||||||
for (const { name, line } of unused) {
|
for (const { name, line } of unused) {
|
||||||
console.error(` Settings.tsx:${line}: "${name}"`);
|
console.error(` Settings.tsx:${line}: "${name}"`);
|
||||||
if (process.env.GITHUB_ACTIONS === "true") {
|
if (process.env.GITHUB_ACTIONS === "true") {
|
||||||
printAnnotation(line, `Setting "${name}" is declared but never used outside ${SETTINGS_DIR_RELATIVE}/`);
|
printAnnotation(line, `Setting "${name}" is declared but never used outside ${EXCLUDE_GLOBS}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user