mirror of
https://github.com/notion-enhancer/notion-enhancer.git
synced 2025-04-03 12:19:02 +00:00
84 lines
2.7 KiB
JavaScript
84 lines
2.7 KiB
JavaScript
/**
|
|
* notion-enhancer
|
|
* (c) 2023 dragonwocky <thedragonring.bod@gmail.com> (https://dragonwocky.me/)
|
|
* (https://notion-enhancer.github.io/) under the MIT license
|
|
*/
|
|
|
|
"use strict";
|
|
|
|
const _isManifestValid = (modManifest) => {
|
|
const hasRequiredFields =
|
|
modManifest.id &&
|
|
modManifest.name &&
|
|
modManifest.version &&
|
|
modManifest.description &&
|
|
modManifest.authors,
|
|
meetsThemeRequirements =
|
|
!modManifest._src.startsWith("themes/") ||
|
|
((modManifest.tags?.includes("dark") ||
|
|
modManifest.tags?.includes("light")) &&
|
|
modManifest.thumbnail),
|
|
targetsCurrentPlatform =
|
|
!modManifest.platforms || //
|
|
modManifest.platforms.includes(platform);
|
|
return hasRequiredFields && meetsThemeRequirements && targetsCurrentPlatform;
|
|
};
|
|
|
|
let _mods;
|
|
const getMods = async (asyncFilter) => {
|
|
const { readJson } = globalThis.__enhancerApi;
|
|
// prettier-ignore
|
|
_mods ??= (await Promise.all((await readJson("registry.json")).map(async (_src) => {
|
|
const modManifest = { ...(await readJson(`${_src}/mod.json`)), _src };
|
|
return _isManifestValid(modManifest) ? modManifest : undefined;
|
|
}))).filter((mod) => mod);
|
|
// prettier-ignore
|
|
return (await Promise.all(_mods.map(async (mod) => {
|
|
return !asyncFilter || (await asyncFilter(mod)) ? mod : undefined;
|
|
}))).filter((mod) => mod);
|
|
},
|
|
getProfile = async () => {
|
|
const db = globalThis.__enhancerApi.initDatabase();
|
|
let activeProfile = await db.get("activeProfile");
|
|
activeProfile ??= (await db.get("profileIds"))?.[0];
|
|
return activeProfile ?? "default";
|
|
};
|
|
|
|
const isEnabled = async (id) => {
|
|
const { version, initDatabase } = globalThis.__enhancerApi,
|
|
mod = (await getMods()).find((mod) => mod.id === id);
|
|
if (mod._src === "core") return true;
|
|
const agreedToTerms = await initDatabase().get("agreedToTerms"),
|
|
enabledInProfile = await initDatabase([
|
|
await getProfile(),
|
|
"enabledMods",
|
|
]).get(id);
|
|
return agreedToTerms === version && enabledInProfile;
|
|
},
|
|
setEnabled = async (id, enabled) => {
|
|
return await globalThis.__enhancerApi
|
|
.initDatabase([await getProfile(), "enabledMods"])
|
|
.set(id, enabled);
|
|
};
|
|
|
|
const modDatabase = async (id) => {
|
|
const optionDefaults =
|
|
(await getMods())
|
|
.find((mod) => mod.id === id)
|
|
?.options?.map?.((opt) => [opt.key, opt.value ?? opt.values?.[0]])
|
|
?.filter?.(([, value]) => typeof value !== "undefined") ?? {};
|
|
return globalThis.__enhancerApi.initDatabase(
|
|
[await getProfile(), id],
|
|
Object.fromEntries(optionDefaults)
|
|
);
|
|
};
|
|
|
|
globalThis.__enhancerApi ??= {};
|
|
Object.assign(globalThis.__enhancerApi, {
|
|
getMods,
|
|
getProfile,
|
|
isEnabled,
|
|
setEnabled,
|
|
modDatabase,
|
|
});
|