You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
389 lines
14 KiB
389 lines
14 KiB
2 years ago
|
/*
|
||
|
* THIS IS A GENERATED/BUNDLED FILE.
|
||
|
* The source is available at https://github.com/dylanpizzo/obsidian-plugins-galore.
|
||
|
* Contributions are very welcome!
|
||
|
*/
|
||
|
|
||
|
var __create = Object.create;
|
||
|
var __defProp = Object.defineProperty;
|
||
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||
|
var __getProtoOf = Object.getPrototypeOf;
|
||
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||
|
var __markAsModule = (target) => __defProp(target, "__esModule", { value: true });
|
||
|
var __export = (target, all) => {
|
||
|
__markAsModule(target);
|
||
|
for (var name in all)
|
||
|
__defProp(target, name, { get: all[name], enumerable: true });
|
||
|
};
|
||
|
var __reExport = (target, module2, desc) => {
|
||
|
if (module2 && typeof module2 === "object" || typeof module2 === "function") {
|
||
|
for (let key of __getOwnPropNames(module2))
|
||
|
if (!__hasOwnProp.call(target, key) && key !== "default")
|
||
|
__defProp(target, key, { get: () => module2[key], enumerable: !(desc = __getOwnPropDesc(module2, key)) || desc.enumerable });
|
||
|
}
|
||
|
return target;
|
||
|
};
|
||
|
var __toModule = (module2) => {
|
||
|
return __reExport(__markAsModule(__defProp(module2 != null ? __create(__getProtoOf(module2)) : {}, "default", module2 && module2.__esModule && "default" in module2 ? { get: () => module2.default, enumerable: true } : { value: module2, enumerable: true })), module2);
|
||
|
};
|
||
|
var __async = (__this, __arguments, generator) => {
|
||
|
return new Promise((resolve, reject) => {
|
||
|
var fulfilled = (value) => {
|
||
|
try {
|
||
|
step(generator.next(value));
|
||
|
} catch (e) {
|
||
|
reject(e);
|
||
|
}
|
||
|
};
|
||
|
var rejected = (value) => {
|
||
|
try {
|
||
|
step(generator.throw(value));
|
||
|
} catch (e) {
|
||
|
reject(e);
|
||
|
}
|
||
|
};
|
||
|
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
||
|
step((generator = generator.apply(__this, __arguments)).next());
|
||
|
});
|
||
|
};
|
||
|
|
||
|
// src/main.ts
|
||
|
__export(exports, {
|
||
|
default: () => Galore
|
||
|
});
|
||
|
var import_obsidian7 = __toModule(require("obsidian"));
|
||
|
|
||
|
// src/util/cacheRequest.ts
|
||
|
var import_obsidian = __toModule(require("obsidian"));
|
||
|
var cache = [];
|
||
|
var cacheRequest = (req) => __async(void 0, null, function* () {
|
||
|
const filteredCache = cache.filter((item) => item.req === JSON.stringify(req));
|
||
|
if (filteredCache.length) {
|
||
|
return filteredCache[0].res;
|
||
|
}
|
||
|
const res = yield (0, import_obsidian.request)(req);
|
||
|
cache.push({ req: JSON.stringify(req), res });
|
||
|
return res;
|
||
|
});
|
||
|
|
||
|
// src/util/gitServerInterface.ts
|
||
|
var countRegexInString = (str, re) => ((str || "").match(re) || []).length;
|
||
|
var getKeyWithMax = (obj) => Object.keys(obj).reduce((a, b) => obj[a] >= obj[b] ? a : b, null);
|
||
|
var parseRepoURL = (url) => __async(void 0, null, function* () {
|
||
|
let urlObj = null;
|
||
|
try {
|
||
|
urlObj = new URL(url);
|
||
|
} catch (e) {
|
||
|
urlObj = new URL("https://" + url);
|
||
|
}
|
||
|
const domain = urlObj.hostname;
|
||
|
let path = urlObj.pathname;
|
||
|
if (path[0] === "/") {
|
||
|
path = path.slice(1);
|
||
|
}
|
||
|
const pathParts = path.split("/");
|
||
|
const owner = pathParts[0];
|
||
|
const name = pathParts[1];
|
||
|
const originBody = yield cacheRequest({ url: urlObj.origin });
|
||
|
const typeScores = {
|
||
|
github: countRegexInString(originBody, /github/gi),
|
||
|
gitea: countRegexInString(originBody, /gitea/gi),
|
||
|
gitlab: countRegexInString(originBody, /gitlab/gi)
|
||
|
};
|
||
|
const type = getKeyWithMax(typeScores);
|
||
|
return {
|
||
|
domain,
|
||
|
owner,
|
||
|
name,
|
||
|
url,
|
||
|
type
|
||
|
};
|
||
|
});
|
||
|
var getRelease = (repo, options) => __async(void 0, null, function* () {
|
||
|
const { type, domain, owner, name } = repo;
|
||
|
const { allowPrerelease = false } = options || {};
|
||
|
let release = null;
|
||
|
if (type === "github") {
|
||
|
const rawReleases = JSON.parse(yield cacheRequest({
|
||
|
url: `https://api.${domain}/repos/${owner}/${name}/releases`
|
||
|
}));
|
||
|
const rawRelease = rawReleases.filter((x) => !x.draft && (allowPrerelease || !x.prerelease)).sort((x) => x.published_at)[0];
|
||
|
release = {
|
||
|
version: rawRelease.tag_name,
|
||
|
assets: rawRelease.assets.map((asset) => ({
|
||
|
name: asset.name,
|
||
|
url: asset.browser_download_url
|
||
|
}))
|
||
|
};
|
||
|
} else if (type === "gitea") {
|
||
|
const rawReleases = JSON.parse(yield cacheRequest({
|
||
|
url: `https://${domain}/api/v1/repos/${owner}/${name}/releases`
|
||
|
}));
|
||
|
const rawRelease = rawReleases.filter((x) => !x.draft && (allowPrerelease || !x.prerelease)).sort((x) => x.published_at)[0];
|
||
|
release = {
|
||
|
version: rawRelease.tag_name,
|
||
|
assets: rawRelease.assets.map((asset) => ({
|
||
|
name: asset.name,
|
||
|
url: asset.browser_download_url
|
||
|
}))
|
||
|
};
|
||
|
} else if (type === "gitlab") {
|
||
|
const rawReleases = JSON.parse(yield cacheRequest({
|
||
|
url: `https://${domain}/api/v4/projects/${owner}%2F${name}/releases`
|
||
|
}));
|
||
|
const rawRelease = rawReleases.filter((x) => allowPrerelease || !x.upcoming_release).sort((x) => x.published_at)[0];
|
||
|
release = {
|
||
|
version: rawRelease.tag_name,
|
||
|
assets: rawRelease.assets.links.map((asset) => ({
|
||
|
name: asset.name,
|
||
|
url: asset.direct_asset_url
|
||
|
}))
|
||
|
};
|
||
|
}
|
||
|
return release;
|
||
|
});
|
||
|
var getAsset = (release, name) => __async(void 0, null, function* () {
|
||
|
const asset = release.assets.filter((asset2) => asset2.name === name)[0];
|
||
|
if (!asset) {
|
||
|
return null;
|
||
|
}
|
||
|
return cacheRequest({
|
||
|
url: asset.url
|
||
|
});
|
||
|
});
|
||
|
var getAssets = (release, names) => __async(void 0, null, function* () {
|
||
|
const assets = names ? release.assets.filter((asset) => names.includes(asset.name)) : release.assets;
|
||
|
return Promise.all(assets.map((asset) => __async(void 0, null, function* () {
|
||
|
return { name: asset.name, content: yield cacheRequest({ url: asset.url }) };
|
||
|
})));
|
||
|
});
|
||
|
|
||
|
// src/ui/settingsPage.ts
|
||
|
var import_obsidian6 = __toModule(require("obsidian"));
|
||
|
|
||
|
// src/util/pluginActions.ts
|
||
|
var import_obsidian3 = __toModule(require("obsidian"));
|
||
|
|
||
|
// src/ui/errorModal.ts
|
||
|
var import_obsidian2 = __toModule(require("obsidian"));
|
||
|
var GaloreErrorModal = class extends import_obsidian2.Modal {
|
||
|
constructor(app2, error) {
|
||
|
super(app2);
|
||
|
this.error = null;
|
||
|
this.error = error;
|
||
|
}
|
||
|
onOpen() {
|
||
|
const { contentEl } = this;
|
||
|
contentEl.setText("Oops. Something went wrong!");
|
||
|
}
|
||
|
onClose() {
|
||
|
const { contentEl } = this;
|
||
|
contentEl.empty();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// src/util/pluginActions.ts
|
||
|
var getPluginsDir = (app2) => {
|
||
|
return (0, import_obsidian3.normalizePath)(app2.vault.configDir + "/plugins") + "/";
|
||
|
};
|
||
|
var getPluginPath = (app2, pluginID) => {
|
||
|
return getPluginsDir(app2) + pluginID + "/";
|
||
|
};
|
||
|
var getRemotePluginMeta = (repo) => __async(void 0, null, function* () {
|
||
|
try {
|
||
|
const release = yield getRelease(repo);
|
||
|
return { repo, version: release.version };
|
||
|
} catch (error) {
|
||
|
console.error(error);
|
||
|
new GaloreErrorModal(app, error).open();
|
||
|
}
|
||
|
});
|
||
|
var getRemotePlugin = (repo) => __async(void 0, null, function* () {
|
||
|
try {
|
||
|
const release = yield getRelease(repo);
|
||
|
const galore = { repo, version: release.version };
|
||
|
const rawManifest = yield getAsset(release, "manifest.json");
|
||
|
const manifest = JSON.parse(yield getAsset(release, "manifest.json"));
|
||
|
const assets = yield getAssets(release);
|
||
|
return {
|
||
|
galore,
|
||
|
manifest,
|
||
|
assets
|
||
|
};
|
||
|
} catch (error) {
|
||
|
console.error(error);
|
||
|
new GaloreErrorModal(app, error).open();
|
||
|
}
|
||
|
});
|
||
|
var getLocalPluginMeta = (pluginsGalore, pluginID) => {
|
||
|
return pluginsGalore.galoreData.plugins[pluginID];
|
||
|
};
|
||
|
var writePlugin = (pluginsGalore, plugin) => __async(void 0, null, function* () {
|
||
|
try {
|
||
|
const path = getPluginPath(app, plugin.manifest.id);
|
||
|
const adapter = app.vault.adapter;
|
||
|
if (!(yield adapter.exists(path))) {
|
||
|
yield adapter.mkdir(path);
|
||
|
}
|
||
|
pluginsGalore.galoreData.plugins[plugin.manifest.id] = plugin.galore;
|
||
|
yield pluginsGalore.saveGaloreData();
|
||
|
yield Promise.all(plugin.assets.map((asset) => __async(void 0, null, function* () {
|
||
|
return adapter.write(path + asset.name, asset.content);
|
||
|
})));
|
||
|
} catch (error) {
|
||
|
console.error(error);
|
||
|
new GaloreErrorModal(app, error).open();
|
||
|
}
|
||
|
});
|
||
|
var installPluginFromRepo = (pluginsGalore, repo) => __async(void 0, null, function* () {
|
||
|
const plugin = yield getRemotePlugin(repo);
|
||
|
yield writePlugin(pluginsGalore, plugin);
|
||
|
return plugin;
|
||
|
});
|
||
|
var getGalorePlugins = (pluginsGalore) => __async(void 0, null, function* () {
|
||
|
try {
|
||
|
const app2 = pluginsGalore.app;
|
||
|
const adapter = app2.vault.adapter;
|
||
|
const pluginsDir = getPluginsDir(app2);
|
||
|
const galorePluginPaths = Object.keys(pluginsGalore.galoreData.plugins).map((pluginID) => pluginsDir + "/" + pluginID + "/");
|
||
|
const galorePlugins = yield Promise.all(galorePluginPaths.map((path) => __async(void 0, null, function* () {
|
||
|
const localManifest = JSON.parse(yield adapter.read(path + "manifest.json"));
|
||
|
const localGalore = getLocalPluginMeta(pluginsGalore, localManifest.id);
|
||
|
const remoteGalore = yield getRemotePluginMeta(localGalore.repo);
|
||
|
return {
|
||
|
manifest: localManifest,
|
||
|
repo: localGalore.repo,
|
||
|
localVersion: localGalore.version,
|
||
|
remoteVersion: remoteGalore.version,
|
||
|
canUpdate: localGalore.version !== remoteGalore.version
|
||
|
};
|
||
|
})));
|
||
|
return galorePlugins;
|
||
|
} catch (error) {
|
||
|
console.error(error);
|
||
|
new GaloreErrorModal(app, error).open();
|
||
|
}
|
||
|
});
|
||
|
|
||
|
// src/ui/updateModal.ts
|
||
|
var import_obsidian4 = __toModule(require("obsidian"));
|
||
|
var GaloreUpdateModal = class extends import_obsidian4.Modal {
|
||
|
constructor(plugin, galorePlugins) {
|
||
|
super(app);
|
||
|
this.galorePlugins = null;
|
||
|
this.plugin = plugin;
|
||
|
this.app = plugin.app;
|
||
|
this.galorePlugins = galorePlugins;
|
||
|
}
|
||
|
onOpen() {
|
||
|
const { contentEl } = this;
|
||
|
contentEl.createEl("h2", { text: "Plugins Galore: Update Plugins" });
|
||
|
new import_obsidian4.Setting(contentEl).setName("Select the plugins below to update, and then click Update.").setDesc("").addButton((button) => button.setButtonText("Cancel").onClick((ev) => {
|
||
|
this.close();
|
||
|
})).addButton((button) => button.setButtonText("Update").setCta().onClick((ev) => __async(this, null, function* () {
|
||
|
const pluginsToUpdate = this.galorePlugins.filter((plugin) => plugin.toggle.getValue());
|
||
|
for (const plugin of pluginsToUpdate) {
|
||
|
yield installPluginFromRepo(this.plugin, plugin.repo);
|
||
|
}
|
||
|
new import_obsidian4.Notice(`Updated ${pluginsToUpdate.length} plugins`);
|
||
|
this.close();
|
||
|
})));
|
||
|
for (const plugin of this.galorePlugins) {
|
||
|
new import_obsidian4.Setting(contentEl).setName(plugin.manifest.name).setDesc(`Version: ${plugin.localVersion} -> ${plugin.remoteVersion}`).addToggle((toggle) => {
|
||
|
plugin.toggle = toggle;
|
||
|
toggle.setValue(true);
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
onClose() {
|
||
|
const { contentEl } = this;
|
||
|
contentEl.empty();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// src/ui/addModal.ts
|
||
|
var import_obsidian5 = __toModule(require("obsidian"));
|
||
|
var GaloreAddModal = class extends import_obsidian5.Modal {
|
||
|
constructor(plugin) {
|
||
|
super(app);
|
||
|
this.plugin = plugin;
|
||
|
this.app = plugin.app;
|
||
|
}
|
||
|
onOpen() {
|
||
|
const { contentEl } = this;
|
||
|
contentEl.empty();
|
||
|
contentEl.createEl("h2", { text: "Plugins Galore: Add a Plugin" });
|
||
|
let repoURL = "";
|
||
|
let siteType = "github";
|
||
|
new import_obsidian5.Setting(contentEl).setName("Repo URL").setDesc("").addText((text) => text.setPlaceholder("https://github.com/{owner}/{plugin-repo}").setValue(repoURL).onChange((value) => {
|
||
|
repoURL = value;
|
||
|
}));
|
||
|
new import_obsidian5.Setting(contentEl).setName("Install the plugin").setDesc("").addButton((button) => button.setButtonText("Install").setCta().onClick((ev) => __async(this, null, function* () {
|
||
|
const repo = yield parseRepoURL(repoURL);
|
||
|
const plugin = yield installPluginFromRepo(this.plugin, repo);
|
||
|
new import_obsidian5.Notice(`Installed ${plugin.manifest.name}.`);
|
||
|
this.close();
|
||
|
})));
|
||
|
}
|
||
|
onClose() {
|
||
|
const { contentEl } = this;
|
||
|
contentEl.empty();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// src/ui/settingsPage.ts
|
||
|
var GaloreSettingTab = class extends import_obsidian6.PluginSettingTab {
|
||
|
constructor(plugin) {
|
||
|
super(app, plugin);
|
||
|
this.plugin = plugin;
|
||
|
this.app = plugin.app;
|
||
|
}
|
||
|
display() {
|
||
|
const { containerEl } = this;
|
||
|
containerEl.empty();
|
||
|
containerEl.createEl("h2", { text: "Plugins Galore" });
|
||
|
let repoURL = "";
|
||
|
let repoInput = null;
|
||
|
new import_obsidian6.Setting(containerEl).setName("Add a plugin").setDesc("").addButton((button) => button.setButtonText("Add a plugin").setCta().onClick((ev) => __async(this, null, function* () {
|
||
|
new GaloreAddModal(this.plugin).open();
|
||
|
})));
|
||
|
new import_obsidian6.Setting(containerEl).setName("Installed Plugins").setDesc("This only checks for updates on plugins installed through Plugins Galore.").addButton((button) => button.setButtonText("Check for updates").setCta().onClick((ev) => __async(this, null, function* () {
|
||
|
const galorePlugins = yield getGalorePlugins(this.plugin);
|
||
|
const galorePluginsThatCanUpdate = galorePlugins.filter((x) => x.canUpdate);
|
||
|
if (galorePluginsThatCanUpdate.length) {
|
||
|
new GaloreUpdateModal(this.plugin, galorePluginsThatCanUpdate).open();
|
||
|
} else {
|
||
|
new import_obsidian6.Notice("No plugins updates found.");
|
||
|
}
|
||
|
})));
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// src/main.ts
|
||
|
var Galore = class extends import_obsidian7.Plugin {
|
||
|
onload() {
|
||
|
return __async(this, null, function* () {
|
||
|
yield this.loadGaloreData();
|
||
|
this.addSettingTab(new GaloreSettingTab(this));
|
||
|
});
|
||
|
}
|
||
|
loadGaloreData() {
|
||
|
return __async(this, null, function* () {
|
||
|
this.galoreData = Object.assign({}, {
|
||
|
plugins: {
|
||
|
"plugins-galore": {
|
||
|
repo: yield parseRepoURL("https://github.com/dylanpizzo/obsidian-plugins-galore"),
|
||
|
version: this.manifest.version
|
||
|
}
|
||
|
}
|
||
|
}, yield this.loadData());
|
||
|
});
|
||
|
}
|
||
|
saveGaloreData() {
|
||
|
return __async(this, null, function* () {
|
||
|
yield this.saveData(this.galoreData);
|
||
|
});
|
||
|
}
|
||
|
};
|