From 4f07420c4a4b2ea5523452c6acb5999ae3b8a700 Mon Sep 17 00:00:00 2001 From: dragonwocky Date: Fri, 4 Aug 2023 13:13:06 +1000 Subject: [PATCH] feat(core): implement dev mode toggle in electron app + refactor: merge components/ into islands/ for consistency --- src/core/client.mjs | 67 +++++++++---------- src/core/components/mod.json | 33 --------- src/core/islands/MenuButton.mjs | 43 ++++++++++++ .../{components.mjs => islands/Modal.mjs} | 52 +++----------- src/core/islands/Panel.mjs | 12 ++++ src/core/menu/islands/Banner.mjs | 6 +- .../menu/{components => islands}/Button.mjs | 0 .../menu/{components => islands}/Checkbox.mjs | 0 .../{components => islands}/Description.mjs | 0 src/core/menu/islands/Footer.mjs | 2 +- .../menu/{components => islands}/Heading.mjs | 0 .../menu/{components => islands}/Input.mjs | 0 src/core/menu/islands/List.mjs | 4 +- src/core/menu/islands/Mod.mjs | 4 +- src/core/menu/islands/Onboarding.mjs | 10 +-- src/core/menu/islands/Options.mjs | 18 ++--- .../menu/{components => islands}/Popup.mjs | 0 src/core/menu/islands/Profiles.mjs | 12 ++-- .../menu/{components => islands}/Select.mjs | 0 src/core/menu/islands/Sidebar.mjs | 2 +- src/core/menu/islands/Telemetry.mjs | 2 +- .../menu/{components => islands}/Tile.mjs | 0 .../menu/{components => islands}/Toggle.mjs | 0 src/core/menu/menu.mjs | 2 +- src/core/mod.json | 11 +-- src/core/notionConfig.cjs | 9 +++ src/core/{telemetry.mjs => sendTelemetry.mjs} | 0 src/core/{update.mjs => updateCheck.mjs} | 0 28 files changed, 143 insertions(+), 146 deletions(-) delete mode 100644 src/core/components/mod.json create mode 100644 src/core/islands/MenuButton.mjs rename src/core/{components.mjs => islands/Modal.mjs} (57%) create mode 100644 src/core/islands/Panel.mjs rename src/core/menu/{components => islands}/Button.mjs (100%) rename src/core/menu/{components => islands}/Checkbox.mjs (100%) rename src/core/menu/{components => islands}/Description.mjs (100%) rename src/core/menu/{components => islands}/Heading.mjs (100%) rename src/core/menu/{components => islands}/Input.mjs (100%) rename src/core/menu/{components => islands}/Popup.mjs (100%) rename src/core/menu/{components => islands}/Select.mjs (100%) rename src/core/menu/{components => islands}/Tile.mjs (100%) rename src/core/menu/{components => islands}/Toggle.mjs (100%) create mode 100644 src/core/notionConfig.cjs rename src/core/{telemetry.mjs => sendTelemetry.mjs} (100%) rename src/core/{update.mjs => updateCheck.mjs} (100%) diff --git a/src/core/client.mjs b/src/core/client.mjs index c80b66c..1a1df39 100644 --- a/src/core/client.mjs +++ b/src/core/client.mjs @@ -4,25 +4,26 @@ * (https://notion-enhancer.github.io/) under the MIT license */ -import { checkForUpdate } from "./update.mjs"; -import { sendTelemetryPing } from "./telemetry.mjs"; -import { Frame, Modal, Button } from "./components.mjs"; +import { checkForUpdate } from "./updateCheck.mjs"; +import { sendTelemetryPing } from "./sendTelemetry.mjs"; +import { Modal, Frame } from "./islands/Modal.mjs"; +import { MenuButton } from "./islands/MenuButton.mjs"; -const doThemeOverride = async (db) => { +const shouldLoadThemeOverrides = async (db) => { const { getMods, isEnabled } = globalThis.__enhancerApi, loadThemeOverrides = await db.get("loadThemeOverrides"); if (loadThemeOverrides === "Enabled") return true; if (loadThemeOverrides === "Disabled") return false; // prettier-ignore + // loadThemeOverrides === "Auto" return (await getMods(async (mod) => { - // loadThemeOverrides === "Auto" if (!mod._src.startsWith("themes/")) return false; return await isEnabled(mod.id); })).length; }, - overrideThemes = async (db) => { + loadThemeOverrides = async (db) => { const { html, enhancerUrl } = globalThis.__enhancerApi; - if (!(await doThemeOverride(db))) return; + if (!(await shouldLoadThemeOverrides(db))) return; document.head.append(html` { `); }; -const initMenu = async (db) => { +const insertMenu = async (db) => { const notionSidebar = `.notion-sidebar-container .notion-sidebar > :nth-child(3) > div > :nth-child(2)`, notionSettingsAndMembers = `${notionSidebar} > [role="button"]:nth-child(3)`, { html, addKeyListener, addMutationListener } = globalThis.__enhancerApi, { platform, enhancerUrl, onMessage } = globalThis.__enhancerApi, menuButtonIconStyle = await db.get("menuButtonIconStyle"), openMenuHotkey = await db.get("openMenuHotkey"), - renderPing = { + menuPing = { channel: "notion-enhancer", hotkey: openMenuHotkey, icon: menuButtonIconStyle, }; let _contentWindow; - const sendThemePing = () => { + const updateMenuTheme = () => { const darkMode = document.body.classList.contains("dark"), notionTheme = darkMode ? "dark" : "light"; - if (renderPing.theme === notionTheme) return; - renderPing.theme = notionTheme; - _contentWindow?.postMessage?.(renderPing, "*"); + if (menuPing.theme === notionTheme) return; + menuPing.theme = notionTheme; + _contentWindow?.postMessage?.(menuPing, "*"); }, - sendRenderPing = (contentWindow) => { + triggerMenuRender = (contentWindow) => { _contentWindow ??= contentWindow; if (!$modal.hasAttribute("open")) return; - delete renderPing.theme; _contentWindow?.focus?.(); - sendThemePing(); + delete menuPing.theme; + updateMenuTheme(); }; - const $modal = html`<${Modal} onopen=${sendRenderPing}> + const $modal = html`<${Modal} onopen=${triggerMenuRender}> <${Frame} title="notion-enhancer menu" src="${enhancerUrl("core/menu/index.html")}" @@ -76,52 +77,50 @@ const initMenu = async (db) => { const apiKey = "__enhancerApi"; this.contentWindow[apiKey] = globalThis[apiKey]; } - sendRenderPing(this.contentWindow); + triggerMenuRender(this.contentWindow); }} /> `, - $button = html`<${Button} + $button = html`<${MenuButton} onclick=${$modal.open} notifications=${(await checkForUpdate()) ? 1 : 0} - themeOverridesLoaded=${await doThemeOverride(db)} + themeOverridesLoaded=${await shouldLoadThemeOverrides(db)} icon="notion-enhancer${menuButtonIconStyle === "Monochrome" ? "?mask" : " text-[16px]"}" >notion-enhancer `; - const insertMenu = () => { + const appendToDom = () => { if (!document.contains($modal)) document.body.append($modal); if (!document.querySelector(notionSidebar)?.contains($button)) { document.querySelector(notionSettingsAndMembers)?.after($button); } }; - addMutationListener(notionSidebar, insertMenu); - insertMenu(); - - addMutationListener("body", sendThemePing); - window.addEventListener("focus", sendRenderPing); + addMutationListener(notionSidebar, appendToDom); + addMutationListener("body", updateMenuTheme); + appendToDom(); addKeyListener(openMenuHotkey, (event) => { event.preventDefault(); $modal.open(); }); + window.addEventListener("focus", triggerMenuRender); window.addEventListener("message", (event) => { + // from embedded menu if (event.data?.channel !== "notion-enhancer") return; if (event.data?.action === "close-menu") $modal.close(); if (event.data?.action === "open-menu") $modal.open(); }); onMessage("notion-enhancer", (message) => { + // from worker if (message === "open-menu") $modal.open(); }); }; -export default async (api, db) => { - const { sendMessage } = globalThis.__enhancerApi; - await Promise.all([ - overrideThemes(db), +export default async (api, db) => + Promise.all([ + insertMenu(db), insertCustomStyles(db), - initMenu(db), + loadThemeOverrides(db), sendTelemetryPing(), - ]); - sendMessage("notion-enhancer", "load-complete"); -}; + ]).then(() => api.sendMessage("notion-enhancer", "load-complete")); diff --git a/src/core/components/mod.json b/src/core/components/mod.json deleted file mode 100644 index ceb59ed..0000000 --- a/src/core/components/mod.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "__comment": "pseudo-mod to allow configuration of api-provided components", - "name": "components", - "id": "36a2ffc9-27ff-480e-84a7-c7700a7d232d", - "version": "0.2.0", - "description": "shared notion-style elements.", - "tags": ["core"], - "authors": [ - { - "name": "dragonwocky", - "email": "thedragonring.bod@gmail.com", - "homepage": "https://dragonwocky.me/", - "avatar": "https://dragonwocky.me/avatar.jpg" - }, - { - "name": "CloudHill", - "email": "rh.cloudhill@gmail.com", - "homepage": "https://github.com/CloudHill", - "avatar": "https://avatars.githubusercontent.com/u/54142180" - } - ], - "js": {}, - "css": {}, - "options": [ - { - "type": "hotkey", - "key": "panel.hotkey", - "label": "toggle panel hotkey", - "value": "Ctrl+Alt+\\", - "tooltip": "**opens/closes the side panel in notion** if a mod that uses it has been enabled" - } - ] -} diff --git a/src/core/islands/MenuButton.mjs b/src/core/islands/MenuButton.mjs new file mode 100644 index 0000000..f3b2501 --- /dev/null +++ b/src/core/islands/MenuButton.mjs @@ -0,0 +1,43 @@ +/** + * notion-enhancer + * (c) 2023 dragonwocky (https://dragonwocky.me/) + * (https://notion-enhancer.github.io/) under the MIT license + */ + +function MenuButton( + { icon, notifications, themeOverridesLoaded, ...props }, + ...children +) { + const { html, extendProps } = globalThis.__enhancerApi; + extendProps(props, { + tabindex: 0, + role: "button", + class: `notion-enhancer--menu-button + flex select-none cursor-pointer rounded-[3px] + text-[14px] my-px mx-[4px] py-[2px] px-[10px] + transition hover:bg-[color:var(--theme--bg-hover)]`, + }); + return html`
+
+ +
+
${children}
+ +
+ +
+ ${notifications} +
+
+
`; +} + +export { MenuButton }; diff --git a/src/core/components.mjs b/src/core/islands/Modal.mjs similarity index 57% rename from src/core/components.mjs rename to src/core/islands/Modal.mjs index 2d406e2..b84a11a 100644 --- a/src/core/components.mjs +++ b/src/core/islands/Modal.mjs @@ -4,18 +4,6 @@ * (https://notion-enhancer.github.io/) under the MIT license */ -function Frame(props) { - const { html, extendProps } = globalThis.__enhancerApi; - extendProps(props, { - class: `rounded-[5px] w-[1150px] h-[calc(100vh-100px)] - max-w-[calc(100vw-100px)] max-h-[715px] overflow-hidden - bg-[color:var(--theme--bg-primary)] drop-shadow-xl - group-open:(pointer-events-auto opacity-100 scale-100) - transition opacity-0 scale-95`, - }); - return html``; -} - function Modal(props, ...children) { const { html, extendProps, addKeyListener } = globalThis.__enhancerApi; extendProps(props, { @@ -56,40 +44,16 @@ function Modal(props, ...children) { return $modal; } -function Button( - { icon, notifications, themeOverridesLoaded, ...props }, - ...children -) { +function Frame(props) { const { html, extendProps } = globalThis.__enhancerApi; extendProps(props, { - tabindex: 0, - role: "button", - class: `notion-enhancer--menu-button - flex select-none cursor-pointer rounded-[3px] - text-[14px] my-px mx-[4px] py-[2px] px-[10px] - transition hover:bg-[color:var(--theme--bg-hover)]`, + class: `rounded-[5px] w-[1150px] h-[calc(100vh-100px)] + max-w-[calc(100vw-100px)] max-h-[715px] overflow-hidden + bg-[color:var(--theme--bg-primary)] drop-shadow-xl + group-open:(pointer-events-auto opacity-100 scale-100) + transition opacity-0 scale-95`, }); - return html`
-
- -
-
${children}
- -
- -
- ${notifications} -
-
-
`; + return html``; } -export { Frame, Modal, Button }; +export { Modal, Frame }; diff --git a/src/core/islands/Panel.mjs b/src/core/islands/Panel.mjs new file mode 100644 index 0000000..ddae96f --- /dev/null +++ b/src/core/islands/Panel.mjs @@ -0,0 +1,12 @@ +/** + * notion-enhancer + * (c) 2023 dragonwocky (https://dragonwocky.me/) + * (https://notion-enhancer.github.io/) under the MIT license + */ + +function Panel(props) { + const { html, extendProps } = globalThis.__enhancerApi; + return html``; +} + +export { Panel }; diff --git a/src/core/menu/islands/Banner.mjs b/src/core/menu/islands/Banner.mjs index 4726ba0..10d8199 100644 --- a/src/core/menu/islands/Banner.mjs +++ b/src/core/menu/islands/Banner.mjs @@ -4,9 +4,9 @@ * (https://notion-enhancer.github.io/) under the MIT license */ -import { Popup } from "../components/Popup.mjs"; -import { Button } from "../components/Button.mjs"; -import { Description } from "../components/Description.mjs"; +import { Popup } from "./Popup.mjs"; +import { Button } from "./Button.mjs"; +import { Description } from "./Description.mjs"; import { useState } from "../state.mjs"; const updateGuide = diff --git a/src/core/menu/components/Button.mjs b/src/core/menu/islands/Button.mjs similarity index 100% rename from src/core/menu/components/Button.mjs rename to src/core/menu/islands/Button.mjs diff --git a/src/core/menu/components/Checkbox.mjs b/src/core/menu/islands/Checkbox.mjs similarity index 100% rename from src/core/menu/components/Checkbox.mjs rename to src/core/menu/islands/Checkbox.mjs diff --git a/src/core/menu/components/Description.mjs b/src/core/menu/islands/Description.mjs similarity index 100% rename from src/core/menu/components/Description.mjs rename to src/core/menu/islands/Description.mjs diff --git a/src/core/menu/islands/Footer.mjs b/src/core/menu/islands/Footer.mjs index 4385c1f..61a0542 100644 --- a/src/core/menu/islands/Footer.mjs +++ b/src/core/menu/islands/Footer.mjs @@ -5,7 +5,7 @@ */ import { setState, useState } from "../state.mjs"; -import { Button } from "../components/Button.mjs"; +import { Button } from "./Button.mjs"; function Footer({ categories }) { const { html, reloadApp } = globalThis.__enhancerApi, diff --git a/src/core/menu/components/Heading.mjs b/src/core/menu/islands/Heading.mjs similarity index 100% rename from src/core/menu/components/Heading.mjs rename to src/core/menu/islands/Heading.mjs diff --git a/src/core/menu/components/Input.mjs b/src/core/menu/islands/Input.mjs similarity index 100% rename from src/core/menu/components/Input.mjs rename to src/core/menu/islands/Input.mjs diff --git a/src/core/menu/islands/List.mjs b/src/core/menu/islands/List.mjs index d07409e..4a9a750 100644 --- a/src/core/menu/islands/List.mjs +++ b/src/core/menu/islands/List.mjs @@ -5,8 +5,8 @@ */ import { setState } from "../state.mjs"; -import { Description } from "../components/Description.mjs"; -import { Input } from "../components/Input.mjs"; +import { Description } from "./Description.mjs"; +import { Input } from "./Input.mjs"; import { Mod } from "./Mod.mjs"; function Search({ items, itemType }) { diff --git a/src/core/menu/islands/Mod.mjs b/src/core/menu/islands/Mod.mjs index 3912fb6..22a27af 100644 --- a/src/core/menu/islands/Mod.mjs +++ b/src/core/menu/islands/Mod.mjs @@ -5,8 +5,8 @@ */ import { setState } from "../state.mjs"; -import { Description } from "../components/Description.mjs"; -import { Toggle } from "../components/Toggle.mjs"; +import { Description } from "./Description.mjs"; +import { Toggle } from "./Toggle.mjs"; function Mod({ id, diff --git a/src/core/menu/islands/Onboarding.mjs b/src/core/menu/islands/Onboarding.mjs index f7b4528..47d94ce 100644 --- a/src/core/menu/islands/Onboarding.mjs +++ b/src/core/menu/islands/Onboarding.mjs @@ -4,11 +4,11 @@ * (https://notion-enhancer.github.io/) under the MIT license */ -import { Heading } from "../components/Heading.mjs"; -import { Description } from "../components/Description.mjs"; -import { Checkbox } from "../components/Checkbox.mjs"; -import { Button } from "../components/Button.mjs"; -import { Tile } from "../components/Tile.mjs"; +import { Heading } from "./Heading.mjs"; +import { Description } from "./Description.mjs"; +import { Checkbox } from "./Checkbox.mjs"; +import { Button } from "./Button.mjs"; +import { Tile } from "./Tile.mjs"; import { setState, useState } from "../state.mjs"; const privacyPolicy = "https://notion-enhancer.github.io/about/privacy-policy/", diff --git a/src/core/menu/islands/Options.mjs b/src/core/menu/islands/Options.mjs index 9c1e21c..d5c6257 100644 --- a/src/core/menu/islands/Options.mjs +++ b/src/core/menu/islands/Options.mjs @@ -5,11 +5,11 @@ */ import { setState } from "../state.mjs"; -import { Heading } from "../components/Heading.mjs"; -import { Description } from "../components/Description.mjs"; -import { Input } from "../components/Input.mjs"; -import { Select } from "../components/Select.mjs"; -import { Toggle } from "../components/Toggle.mjs"; +import { Heading } from "./Heading.mjs"; +import { Description } from "./Description.mjs"; +import { Input } from "./Input.mjs"; +import { Select } from "./Select.mjs"; +import { Toggle } from "./Toggle.mjs"; const camelToSentenceCase = (string) => string[0].toUpperCase() + @@ -22,16 +22,18 @@ const camelToSentenceCase = (string) => // ignore platform-specific options if (opt.platforms && !opt.platforms.includes(platform)) return options; // replace consective headings - opt.autoremove ??= true; + opt._autoremoveIfSectionEmpty ??= true; const prev = options[options.length - 1], - canReplacePrev = prev?.autoremove && prev?.type === opt.type; + canReplacePrev = + prev?._autoremoveIfSectionEmpty && prev?.type === opt.type; if (opt.type === "heading" && canReplacePrev) { options[options.length - 1] = opt; } else options.push(opt); return options; }, []); // remove trailing heading - return options.at(-1)?.type === "heading" && options.at(-1)?.autoremove + return options.at(-1)?.type === "heading" && + options.at(-1)?._autoremoveIfSectionEmpty ? options.slice(0, -1) : options; }; diff --git a/src/core/menu/components/Popup.mjs b/src/core/menu/islands/Popup.mjs similarity index 100% rename from src/core/menu/components/Popup.mjs rename to src/core/menu/islands/Popup.mjs diff --git a/src/core/menu/islands/Profiles.mjs b/src/core/menu/islands/Profiles.mjs index 592c43d..c09a46c 100644 --- a/src/core/menu/islands/Profiles.mjs +++ b/src/core/menu/islands/Profiles.mjs @@ -5,12 +5,12 @@ */ import { setState, useState } from "../state.mjs"; -import { Heading } from "../components/Heading.mjs"; -import { Description } from "../components/Description.mjs"; -import { Checkbox } from "../components/Checkbox.mjs"; -import { Button } from "../components/Button.mjs"; -import { Input } from "../components/Input.mjs"; -import { Popup } from "../components/Popup.mjs"; +import { Heading } from "./Heading.mjs"; +import { Description } from "./Description.mjs"; +import { Checkbox } from "./Checkbox.mjs"; +import { Button } from "./Button.mjs"; +import { Input } from "./Input.mjs"; +import { Popup } from "./Popup.mjs"; function Profile({ id }) { const { html, getProfile, initDatabase } = globalThis.__enhancerApi, diff --git a/src/core/menu/components/Select.mjs b/src/core/menu/islands/Select.mjs similarity index 100% rename from src/core/menu/components/Select.mjs rename to src/core/menu/islands/Select.mjs diff --git a/src/core/menu/islands/Sidebar.mjs b/src/core/menu/islands/Sidebar.mjs index 8296869..72e90b0 100644 --- a/src/core/menu/islands/Sidebar.mjs +++ b/src/core/menu/islands/Sidebar.mjs @@ -5,7 +5,7 @@ */ import { setState, useState } from "../state.mjs"; -import { Description } from "../components/Description.mjs"; +import { Description } from "./Description.mjs"; function SidebarHeading({}, ...children) { const { html } = globalThis.__enhancerApi; diff --git a/src/core/menu/islands/Telemetry.mjs b/src/core/menu/islands/Telemetry.mjs index df4b61f..65c258b 100644 --- a/src/core/menu/islands/Telemetry.mjs +++ b/src/core/menu/islands/Telemetry.mjs @@ -4,7 +4,7 @@ * (https://notion-enhancer.github.io/) under the MIT license */ -import { collectTelemetryData } from "../../telemetry.mjs"; +import { collectTelemetryData } from "../../sendTelemetry.mjs"; import { useState, setState } from "../state.mjs"; import { Option } from "./Options.mjs"; diff --git a/src/core/menu/components/Tile.mjs b/src/core/menu/islands/Tile.mjs similarity index 100% rename from src/core/menu/components/Tile.mjs rename to src/core/menu/islands/Tile.mjs diff --git a/src/core/menu/components/Toggle.mjs b/src/core/menu/islands/Toggle.mjs similarity index 100% rename from src/core/menu/components/Toggle.mjs rename to src/core/menu/islands/Toggle.mjs diff --git a/src/core/menu/menu.mjs b/src/core/menu/menu.mjs index a73a57d..f2d6a94 100644 --- a/src/core/menu/menu.mjs +++ b/src/core/menu/menu.mjs @@ -5,7 +5,7 @@ */ import { setState, useState } from "./state.mjs"; -import { checkForUpdate, isDevelopmentBuild } from "../update.mjs"; +import { checkForUpdate, isDevelopmentBuild } from "../updateCheck.mjs"; import { Sidebar } from "./islands/Sidebar.mjs"; import { Footer } from "./islands/Footer.mjs"; import { Banner } from "./islands/Banner.mjs"; diff --git a/src/core/mod.json b/src/core/mod.json index be6ef8a..9f464ce 100644 --- a/src/core/mod.json +++ b/src/core/mod.json @@ -1,7 +1,7 @@ { "id": "0f0bf8b6-eae6-4273-b307-8fc43f2ee082", "name": "notion-enhancer", - "version": "0.11.1-dev", + "version": "0.11.1", "description": "an enhancer/customiser for the all-in-one productivity workspace notion.so", "tags": ["core"], "authors": [ @@ -35,7 +35,7 @@ { "type": "select", "key": "loadThemeOverrides", - "description": "Loads the styling required for a theme to customise Notion's interface. Disabling this will increase client performance.", + "description": "Loads the styling required for a theme to customise Notion's interface. Disabling this may increase client performance, but will also disable all themes.", "values": ["Auto", "Enabled", "Disabled"] }, { @@ -47,16 +47,17 @@ { "type": "heading", "label": "Advanced", - "autoremove": false + "_autoremoveIfSectionEmpty": false }, { "type": "toggle", "key": "developerMode", - "description": "Activates built-in debugging tools accessible through the application menu in desktop environments and restores access to the DevTools console via the Ctrl+Shift+I hotkey.", + "description": "Activates built-in debugging tools accessible through the application menu.", + "platforms": ["linux", "win32", "darwin"], "value": false } ], "clientStyles": ["variables.css"], "clientScripts": ["client.mjs"], - "electronScripts": [] + "electronScripts": [{ "source": "notionConfig.cjs", "target": "config.js" }] } diff --git a/src/core/notionConfig.cjs b/src/core/notionConfig.cjs new file mode 100644 index 0000000..e56b9dc --- /dev/null +++ b/src/core/notionConfig.cjs @@ -0,0 +1,9 @@ +/** + * notion-enhancer + * (c) 2023 dragonwocky (https://dragonwocky.me/) + * (https://notion-enhancer.github.io/) under the MIT license + */ + +module.exports = async (api, db, __exports, __eval) => { + if (await db.get("developerMode")) __exports.default.env = "development"; +}; diff --git a/src/core/telemetry.mjs b/src/core/sendTelemetry.mjs similarity index 100% rename from src/core/telemetry.mjs rename to src/core/sendTelemetry.mjs diff --git a/src/core/update.mjs b/src/core/updateCheck.mjs similarity index 100% rename from src/core/update.mjs rename to src/core/updateCheck.mjs