new
This commit is contained in:
Vendored
+210
@@ -0,0 +1,210 @@
|
||||
var __defProp = Object.defineProperty;
|
||||
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
||||
var __getOwnPropNames = Object.getOwnPropertyNames;
|
||||
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
||||
var __export = (target, all) => {
|
||||
for (var name in all)
|
||||
__defProp(target, name, { get: all[name], enumerable: true });
|
||||
};
|
||||
var __copyProps = (to, from, except, desc) => {
|
||||
if (from && typeof from === "object" || typeof from === "function") {
|
||||
for (let key of __getOwnPropNames(from))
|
||||
if (!__hasOwnProp.call(to, key) && key !== except)
|
||||
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
||||
}
|
||||
return to;
|
||||
};
|
||||
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
||||
|
||||
// hot-reload.ts
|
||||
var hot_reload_exports = {};
|
||||
__export(hot_reload_exports, {
|
||||
default: () => HotReload
|
||||
});
|
||||
module.exports = __toCommonJS(hot_reload_exports);
|
||||
var import_obsidian = require("obsidian");
|
||||
|
||||
// node_modules/.pnpm/monkey-around@3.0.0/node_modules/monkey-around/dist/index.mjs
|
||||
function around(obj, factories) {
|
||||
const removers = Object.keys(factories).map((key) => around1(obj, key, factories[key]));
|
||||
return removers.length === 1 ? removers[0] : function() {
|
||||
removers.forEach((r) => r());
|
||||
};
|
||||
}
|
||||
function around1(obj, method, createWrapper) {
|
||||
const inherited = obj[method], hadOwn = obj.hasOwnProperty(method), original = hadOwn ? inherited : function() {
|
||||
return Object.getPrototypeOf(obj)[method].apply(this, arguments);
|
||||
};
|
||||
let current = createWrapper(original);
|
||||
if (inherited)
|
||||
Object.setPrototypeOf(current, inherited);
|
||||
Object.setPrototypeOf(wrapper, current);
|
||||
obj[method] = wrapper;
|
||||
return remove;
|
||||
function wrapper(...args) {
|
||||
if (current === original && obj[method] === wrapper)
|
||||
remove();
|
||||
return current.apply(this, args);
|
||||
}
|
||||
function remove() {
|
||||
if (obj[method] === wrapper) {
|
||||
if (hadOwn)
|
||||
obj[method] = original;
|
||||
else
|
||||
delete obj[method];
|
||||
}
|
||||
if (current === original)
|
||||
return;
|
||||
current = original;
|
||||
Object.setPrototypeOf(wrapper, inherited || Function);
|
||||
}
|
||||
}
|
||||
|
||||
// hot-reload.ts
|
||||
var watchNeeded = !import_obsidian.Platform.isMacOS && !import_obsidian.Platform.isWin;
|
||||
var HotReload = class extends import_obsidian.Plugin {
|
||||
constructor() {
|
||||
super(...arguments);
|
||||
this.statCache = /* @__PURE__ */ new Map();
|
||||
// path -> Stat
|
||||
this.run = taskQueue();
|
||||
this.reindexPlugins = (0, import_obsidian.debounce)(() => this.run(() => this.getPluginNames()), 250, true);
|
||||
this.pluginReloaders = {};
|
||||
this.pluginNames = {};
|
||||
this.enabledPlugins = /* @__PURE__ */ new Set();
|
||||
this.currentlyLoading = 0;
|
||||
this.isSymlink = (() => {
|
||||
try {
|
||||
const { lstatSync } = require("fs");
|
||||
return (path) => {
|
||||
const realPath = [this.app.vault.adapter.basePath, path].join("/");
|
||||
const lstat = lstatSync(realPath, { throwIfNoEntry: false });
|
||||
return lstat && lstat.isSymbolicLink();
|
||||
};
|
||||
} catch (e) {
|
||||
return () => true;
|
||||
}
|
||||
})();
|
||||
this.checkVersion = async (plugin) => {
|
||||
const { dir } = this.app.plugins.manifests[plugin];
|
||||
for (const file of ["main.js", "styles.css"]) {
|
||||
const path = `${dir}/${file}`;
|
||||
const stat = await this.app.vault.adapter.stat(path);
|
||||
if (stat) {
|
||||
if (this.statCache.has(path) && stat.mtime !== this.statCache.get(path).mtime) {
|
||||
this.requestReload(plugin);
|
||||
}
|
||||
this.statCache.set(path, stat);
|
||||
}
|
||||
}
|
||||
};
|
||||
this.onFileChange = (filename) => {
|
||||
if (!filename.startsWith(this.app.plugins.getPluginFolder() + "/"))
|
||||
return;
|
||||
const path = filename.split("/");
|
||||
const base = path.pop(), dir = path.pop();
|
||||
if (path.length === 1 && dir === "plugins")
|
||||
return this.watch(filename);
|
||||
if (path.length != 2)
|
||||
return;
|
||||
const plugin = dir && this.pluginNames[dir];
|
||||
if (base === "manifest.json" || base === ".hotreload" || base === ".git" || !plugin)
|
||||
return this.reindexPlugins();
|
||||
if (base !== "main.js" && base !== "styles.css")
|
||||
return;
|
||||
this.checkVersion(plugin);
|
||||
};
|
||||
}
|
||||
async onload() {
|
||||
await this.getPluginNames();
|
||||
this.addCommand({
|
||||
id: "scan-for-changes",
|
||||
name: "Check plugins for changes and reload them",
|
||||
callback: this.reindexPlugins
|
||||
});
|
||||
this.app.workspace.onLayoutReady(() => {
|
||||
this.registerEvent(this.app.vault.on("raw", this.onFileChange));
|
||||
this.watch(this.app.plugins.getPluginFolder());
|
||||
});
|
||||
}
|
||||
async watch(path) {
|
||||
var _a;
|
||||
if ((_a = this.app.vault.adapter.watchers) == null ? void 0 : _a.hasOwnProperty(path))
|
||||
return;
|
||||
if ((await this.app.vault.adapter.stat(path)).type !== "folder")
|
||||
return;
|
||||
if (watchNeeded || this.isSymlink(path))
|
||||
this.app.vault.adapter.startWatchPath(path, false);
|
||||
}
|
||||
checkVersions() {
|
||||
return Promise.all(Object.values(this.pluginNames).map(this.checkVersion));
|
||||
}
|
||||
async getPluginNames() {
|
||||
const plugins = {}, enabled = /* @__PURE__ */ new Set();
|
||||
for (const { id, dir } of Object.values(this.app.plugins.manifests)) {
|
||||
this.watch(dir);
|
||||
plugins[dir.split("/").pop()] = id;
|
||||
if (await this.app.vault.exists(dir + "/.git") || await this.app.vault.exists(dir + "/.hotreload"))
|
||||
enabled.add(id);
|
||||
}
|
||||
this.pluginNames = plugins;
|
||||
this.enabledPlugins = enabled;
|
||||
await this.checkVersions();
|
||||
}
|
||||
requestReload(plugin) {
|
||||
if (!this.enabledPlugins.has(plugin))
|
||||
return;
|
||||
const reloader = this.pluginReloaders[plugin] || (this.pluginReloaders[plugin] = (0, import_obsidian.debounce)(() => this.run(() => this.reload(plugin).catch(console.error)), 750, true));
|
||||
reloader();
|
||||
}
|
||||
async reload(plugin) {
|
||||
const plugins = this.app.plugins;
|
||||
if (!plugins.enabledPlugins.has(plugin))
|
||||
return;
|
||||
await plugins.disablePlugin(plugin);
|
||||
console.debug("disabled", plugin);
|
||||
const oldDebug = localStorage.getItem("debug-plugin");
|
||||
localStorage.setItem("debug-plugin", "1");
|
||||
const uninstall = preventSourcemapStripping(this.app, plugin);
|
||||
try {
|
||||
await plugins.enablePlugin(plugin);
|
||||
} finally {
|
||||
if (oldDebug === null)
|
||||
localStorage.removeItem("debug-plugin");
|
||||
else
|
||||
localStorage.setItem("debug-plugin", oldDebug);
|
||||
uninstall == null ? void 0 : uninstall();
|
||||
}
|
||||
console.debug("enabled", plugin);
|
||||
new import_obsidian.Notice(`Plugin "${plugin}" has been reloaded`);
|
||||
}
|
||||
};
|
||||
function preventSourcemapStripping(app, pluginName) {
|
||||
if ((0, import_obsidian.requireApiVersion)("1.6"))
|
||||
return around(app.vault.adapter, {
|
||||
read(old) {
|
||||
return function(path) {
|
||||
const res = old.apply(this, arguments);
|
||||
if (!path.endsWith(`/${pluginName}/main.js`))
|
||||
return res;
|
||||
return res.then((txt) => txt + "\n/* nosourcemap */");
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
function taskQueue() {
|
||||
let last = Promise.resolve();
|
||||
return (action) => {
|
||||
return !action ? last : last = new Promise(
|
||||
(res, rej) => last.finally(
|
||||
() => {
|
||||
try {
|
||||
res(action());
|
||||
} catch (e) {
|
||||
rej(e);
|
||||
}
|
||||
}
|
||||
)
|
||||
);
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user