obsidian-dev-utils
Version:
This is the collection of useful functions that you can use for your Obsidian plugin development
129 lines (126 loc) • 14.9 kB
JavaScript
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
(function initEsm(){if(globalThis.process){return}const browserProcess={browser:true,cwd:__name(()=>"/","cwd"),env:{},platform:"android"};globalThis.process=browserProcess})();
import {
FunctionHandlingMode,
toJson
} from "../../ObjectUtils.mjs";
import {
makeValidVariableName,
replaceAll
} from "../../String.mjs";
import { readFile } from "../NodeModules.mjs";
function preprocessPlugin(isEsm) {
const replacements = isEsm ? {} : {
[replaceAll("import(dot)meta(dot)url", "(dot)", ".")]: () => {
if (typeof __filename === "string") {
const localRequire = require;
const url = localRequire("node:url");
return url.pathToFileURL(__filename).href;
}
if (typeof window !== "undefined") {
return window.location.href;
}
return "";
}
};
return {
name: "preprocess",
setup(build) {
build.initialOptions.define ??= {};
for (const key of Object.keys(replacements)) {
build.initialOptions.define[key] = `__${makeValidVariableName(key)}`;
}
build.initialOptions.banner ??= {};
build.initialOptions.banner["js"] ??= "";
build.initialOptions.banner["js"] += `
(${String(isEsm ? initEsm : initCjs)})();
`;
build.onLoad({ filter: /\.(?:js|ts|cjs|mjs|cts|mts)$/ }, async (args) => {
let contents = await readFile(args.path, "utf-8");
for (const [key, value] of Object.entries(replacements)) {
const variable = `__${makeValidVariableName(key)}`;
if (!contents.includes(key)) {
continue;
}
const valueStr = typeof value === "function" ? `(${String(value)})()` : toJson(value, { functionHandlingMode: FunctionHandlingMode.Full });
if (contents.includes(`var ${variable}`)) {
continue;
}
contents = `var ${variable} = globalThis['${key}'] ?? ${valueStr};
${contents}`;
}
contents = replaceAll(contents, /`\r?\n\/\/# sourceMappingURL/g, "`\n//#${''} sourceMappingURL");
return {
contents,
loader: "ts"
};
});
}
};
}
function initCjs() {
const globalThisRecord = globalThis;
globalThisRecord["__name"] ??= name;
const originalRequire = require;
if (originalRequire && !originalRequire.__isPatched) {
require = Object.assign(
(id) => requirePatched(id),
originalRequire,
{
__isPatched: true
}
);
}
const newFuncs = {
__extractDefault: () => extractDefault,
process: () => {
const browserProcess = {
browser: true,
cwd: () => "/",
env: {},
platform: "android"
};
return browserProcess;
}
};
for (const key of Object.keys(newFuncs)) {
globalThisRecord[key] ??= newFuncs[key]?.();
}
function name(obj) {
return obj;
}
function extractDefault(module) {
return module && module.__esModule && "default" in module ? module.default : module;
}
function requirePatched(id) {
const module = originalRequire?.(id);
if (module) {
return extractDefault(module);
}
if (id === "process" || id === "node:process") {
console.error(`Module not found: ${id}. Fake process object is returned instead.`);
return globalThis.process;
}
console.error(`Module not found: ${id}. Empty object is returned instead.`);
return {};
}
}
function initEsm() {
if (globalThis.process) {
return;
}
const browserProcess = {
browser: true,
cwd: () => "/",
env: {},
platform: "android"
};
globalThis.process = browserProcess;
}
export {
preprocessPlugin
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL1NjcmlwdFV0aWxzL2VzYnVpbGQvcHJlcHJvY2Vzc1BsdWdpbi50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqXG4gKiBUaGlzIG1vZHVsZSBkZWZpbmVzIGEgY3VzdG9tIGVzYnVpbGQgcGx1Z2luIHRoYXQgcHJlcHJvY2Vzc2VzIEphdmFTY3JpcHQgYW5kIFR5cGVTY3JpcHQgZmlsZXMuXG4gKiBUaGUgcHJlcHJvY2Vzc2luZyBpbmNsdWRlcyByZXBsYWNpbmcgYGltcG9ydChkb3QpbWV0YShkb3QpdXJsYCB3aXRoIGEgTm9kZS5qcy1jb21wYXRpYmxlIGFsdGVybmF0aXZlLFxuICogZW5zdXJpbmcgY29tcGF0aWJpbGl0eSB3aXRoIE9ic2lkaWFuJ3MgcGx1Z2luIHN5c3RlbSwgYW5kIGFkZGluZyBhIGJhc2ljIGBwcm9jZXNzYCBvYmplY3QgZm9yIGVudmlyb25tZW50c1xuICogd2hlcmUgYHByb2Nlc3NgIGlzIG5vdCBhdmFpbGFibGUgKGxpa2UgbW9iaWxlIG9yIHdlYiBlbnZpcm9ubWVudHMpLlxuICpcbiAqIEByZW1hcmtzXG4gKiBXZSBjYW5ub3QgdXNlIGAuYCBpbnN0ZWFkIG9mIGAoZG90KWAgaW4gdGhlIGFib3ZlIGRlc2NyaXB0aW9uIGJlY2F1c2UgdGhlIGZpbGUgaXRzZWxmIGlzIHByZXByb2Nlc3NlZCB3aXRoIHRoZSBzYW1lIHJ1bGUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICdlc2J1aWxkJztcblxuaW1wb3J0IHR5cGUgeyBHZW5lcmljT2JqZWN0IH0gZnJvbSAnLi4vLi4vT2JqZWN0VXRpbHMudHMnO1xuXG5pbXBvcnQge1xuICBGdW5jdGlvbkhhbmRsaW5nTW9kZSxcbiAgdG9Kc29uXG59IGZyb20gJy4uLy4uL09iamVjdFV0aWxzLnRzJztcbmltcG9ydCB7XG4gIG1ha2VWYWxpZFZhcmlhYmxlTmFtZSxcbiAgcmVwbGFjZUFsbFxufSBmcm9tICcuLi8uLi9TdHJpbmcudHMnO1xuaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICcuLi9Ob2RlTW9kdWxlcy50cyc7XG5cbmludGVyZmFjZSBCcm93c2VyUHJvY2VzcyBleHRlbmRzIFBhcnRpYWw8Tm9kZUpTLlByb2Nlc3M+IHtcbiAgYnJvd3NlcjogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEVzbU1vZHVsZSB7XG4gIF9fZXNNb2R1bGU6IGJvb2xlYW47XG4gIGRlZmF1bHQ6IHVua25vd247XG59XG5cbmludGVyZmFjZSBSZXF1aXJlUGF0Y2hlZCBleHRlbmRzIE5vZGVKUy5SZXF1aXJlIHtcbiAgX19pc1BhdGNoZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBlc2J1aWxkIHBsdWdpbiB0aGF0IHByZXByb2Nlc3NlcyBKYXZhU2NyaXB0IGFuZCBUeXBlU2NyaXB0IGZpbGVzLlxuICpcbiAqIFRoaXMgcGx1Z2luIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgdGFza3M6XG4gKiAtIFJlcGxhY2VzIGluc3RhbmNlcyBvZiBgaW1wb3J0KGRvdCltZXRhKGRvdCl1cmxgIHdpdGggYSBOb2RlLmpzLWNvbXBhdGlibGUgYF9fZmlsZW5hbWVgIGFsdGVybmF0aXZlLlxuICogLSBNb2RpZmllcyB0aGUgYHNvdXJjZU1hcHBpbmdVUkxgIGNvbW1lbnQgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgd2l0aCBPYnNpZGlhbidzIHBsdWdpbiBzeXN0ZW0uXG4gKiAtIEFkZHMgYSBiYXNpYyBgcHJvY2Vzc2Agb2JqZWN0IHRvIHRoZSBnbG9iYWwgc2NvcGUgaWYgYHByb2Nlc3NgIGlzIHJlZmVyZW5jZWQgYnV0IG5vdCBkZWZpbmVkLlxuICpcbiAqIEBwYXJhbSBpc0VzbSAtIFdoZXRoZXIgdGhlIGJ1aWxkIGlzIGZvciBhbiBFU00gZm9ybWF0LlxuICogQHJldHVybnMgQW4gZXNidWlsZCBgUGx1Z2luYCBvYmplY3QgdGhhdCBoYW5kbGVzIHRoZSBwcmVwcm9jZXNzaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcHJvY2Vzc1BsdWdpbihpc0VzbT86IGJvb2xlYW4pOiBQbHVnaW4ge1xuICBjb25zdCByZXBsYWNlbWVudHMgPSBpc0VzbVxuICAgID8ge31cbiAgICA6IHtcbiAgICAgIFtyZXBsYWNlQWxsKCdpbXBvcnQoZG90KW1ldGEoZG90KXVybCcsICcoZG90KScsICcuJyldOiAoKTogc3RyaW5nID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBfX2ZpbGVuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGNvbnN0IGxvY2FsUmVxdWlyZSA9IHJlcXVpcmU7XG4gICAgICAgICAgY29uc3QgdXJsID0gbG9jYWxSZXF1aXJlKCdub2RlOnVybCcpIGFzIHR5cGVvZiBpbXBvcnQoJ25vZGU6dXJsJyk7XG4gICAgICAgICAgcmV0dXJuIHVybC5wYXRoVG9GaWxlVVJMKF9fZmlsZW5hbWUpLmhyZWY7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGYWxsYmFjayB0byBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGVudmlyb25tZW50IGlzIHVua25vd25cbiAgICAgICAgcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH07XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiAncHJlcHJvY2VzcycsXG4gICAgc2V0dXAoYnVpbGQpOiB2b2lkIHtcbiAgICAgIGJ1aWxkLmluaXRpYWxPcHRpb25zLmRlZmluZSA/Pz0ge307XG5cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlcGxhY2VtZW50cykpIHtcbiAgICAgICAgYnVpbGQuaW5pdGlhbE9wdGlvbnMuZGVmaW5lW2tleV0gPSBgX18ke21ha2VWYWxpZFZhcmlhYmxlTmFtZShrZXkpfWA7XG4gICAgICB9XG5cbiAgICAgIGJ1aWxkLmluaXRpYWxPcHRpb25zLmJhbm5lciA/Pz0ge307XG4gICAgICBidWlsZC5pbml0aWFsT3B0aW9ucy5iYW5uZXJbJ2pzJ10gPz89ICcnO1xuICAgICAgYnVpbGQuaW5pdGlhbE9wdGlvbnMuYmFubmVyWydqcyddICs9IGBcXG4oJHtTdHJpbmcoaXNFc20gPyBpbml0RXNtIDogaW5pdENqcyl9KSgpO1xcbmA7XG5cbiAgICAgIGJ1aWxkLm9uTG9hZCh7IGZpbHRlcjogL1xcLig/OmpzfHRzfGNqc3xtanN8Y3RzfG10cykkLyB9LCBhc3luYyAoYXJncykgPT4ge1xuICAgICAgICBsZXQgY29udGVudHMgPSBhd2FpdCByZWFkRmlsZShhcmdzLnBhdGgsICd1dGYtOCcpO1xuXG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJlcGxhY2VtZW50cykpIHtcbiAgICAgICAgICBjb25zdCB2YXJpYWJsZSA9IGBfXyR7bWFrZVZhbGlkVmFyaWFibGVOYW1lKGtleSl9YDtcbiAgICAgICAgICBpZiAoIWNvbnRlbnRzLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB2YWx1ZVN0ciA9IHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJyA/IGAoJHtTdHJpbmcodmFsdWUpfSkoKWAgOiB0b0pzb24odmFsdWUsIHsgZnVuY3Rpb25IYW5kbGluZ01vZGU6IEZ1bmN0aW9uSGFuZGxpbmdNb2RlLkZ1bGwgfSk7XG4gICAgICAgICAgaWYgKGNvbnRlbnRzLmluY2x1ZGVzKGB2YXIgJHt2YXJpYWJsZX1gKSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnRlbnRzID0gYHZhciAke3ZhcmlhYmxlfSA9IGdsb2JhbFRoaXNbJyR7a2V5fSddID8/ICR7dmFsdWVTdHJ9O1xcbiR7Y29udGVudHN9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEhBQ0s6IFRoZSAkeycnfSBwYXJ0IGlzIHVzZWQgdG8gZW5zdXJlIE9ic2lkaWFuIGxvYWRzIHRoZSBwbHVnaW4gcHJvcGVybHksXG4gICAgICAgIC8vIE90aGVyd2lzZSwgaXQgc3RvcHMgbG9hZGluZyBhZnRlciB0aGUgZmlyc3QgbGluZSBvZiB0aGUgc291cmNlTWFwcGluZ1VSTCBjb21tZW50LlxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdGVtcGxhdGUtY3VybHktaW4tc3RyaW5nXG4gICAgICAgIGNvbnRlbnRzID0gcmVwbGFjZUFsbChjb250ZW50cywgL2BcXHI/XFxuXFwvXFwvIyBzb3VyY2VNYXBwaW5nVVJML2csICdgXFxuLy8jJHtcXCdcXCd9IHNvdXJjZU1hcHBpbmdVUkwnKTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbnRlbnRzLFxuICAgICAgICAgIGxvYWRlcjogJ3RzJ1xuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuICB9O1xufVxuXG5mdW5jdGlvbiBpbml0Q2pzKCk6IHZvaWQge1xuICBjb25zdCBnbG9iYWxUaGlzUmVjb3JkID0gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIEdlbmVyaWNPYmplY3Q7XG4gIGdsb2JhbFRoaXNSZWNvcmRbJ19fbmFtZSddID8/PSBuYW1lO1xuICBjb25zdCBvcmlnaW5hbFJlcXVpcmUgPSByZXF1aXJlIGFzIChOb2RlSlMuUmVxdWlyZSAmIFBhcnRpYWw8UmVxdWlyZVBhdGNoZWQ+IHwgdW5kZWZpbmVkKTtcbiAgaWYgKG9yaWdpbmFsUmVxdWlyZSAmJiAhb3JpZ2luYWxSZXF1aXJlLl9faXNQYXRjaGVkKSB7XG4gICAgcmVxdWlyZSA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAoaWQ6IHN0cmluZykgPT4gcmVxdWlyZVBhdGNoZWQoaWQpLFxuICAgICAgb3JpZ2luYWxSZXF1aXJlLFxuICAgICAge1xuICAgICAgICBfX2lzUGF0Y2hlZDogdHJ1ZVxuICAgICAgfVxuICAgICkgYXMgUmVxdWlyZVBhdGNoZWQ7XG4gIH1cblxuICBjb25zdCBuZXdGdW5jczogUmVjb3JkPHN0cmluZywgKCkgPT4gdW5rbm93bj4gPSB7XG4gICAgX19leHRyYWN0RGVmYXVsdDogKCkgPT4gZXh0cmFjdERlZmF1bHQsXG4gICAgcHJvY2VzczogKCkgPT4ge1xuICAgICAgY29uc3QgYnJvd3NlclByb2Nlc3M6IEJyb3dzZXJQcm9jZXNzID0ge1xuICAgICAgICBicm93c2VyOiB0cnVlLFxuICAgICAgICBjd2Q6ICgpID0+ICcvJyxcbiAgICAgICAgZW52OiB7fSxcbiAgICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJ1xuICAgICAgfTtcbiAgICAgIHJldHVybiBicm93c2VyUHJvY2VzcztcbiAgICB9XG4gIH07XG5cbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobmV3RnVuY3MpKSB7XG4gICAgZ2xvYmFsVGhpc1JlY29yZFtrZXldID8/PSBuZXdGdW5jc1trZXldPy4oKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG5hbWUob2JqOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4dHJhY3REZWZhdWx0KG1vZHVsZTogUGFydGlhbDxFc21Nb2R1bGU+IHwgdW5kZWZpbmVkKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG1vZHVsZSAmJiBtb2R1bGUuX19lc01vZHVsZSAmJiAnZGVmYXVsdCcgaW4gbW9kdWxlID8gbW9kdWxlLmRlZmF1bHQgOiBtb2R1bGU7XG4gIH1cblxuICBmdW5jdGlvbiByZXF1aXJlUGF0Y2hlZChpZDogc3RyaW5nKTogdW5rbm93biB7XG4gICAgY29uc3QgbW9kdWxlID0gb3JpZ2luYWxSZXF1aXJlPy4oaWQpIGFzIChQYXJ0aWFsPEVzbU1vZHVsZT4gfCB1bmRlZmluZWQpO1xuICAgIGlmIChtb2R1bGUpIHtcbiAgICAgIHJldHVybiBleHRyYWN0RGVmYXVsdChtb2R1bGUpO1xuICAgIH1cblxuICAgIGlmIChpZCA9PT0gJ3Byb2Nlc3MnIHx8IGlkID09PSAnbm9kZTpwcm9jZXNzJykge1xuICAgICAgY29uc29sZS5lcnJvcihgTW9kdWxlIG5vdCBmb3VuZDogJHtpZH0uIEZha2UgcHJvY2VzcyBvYmplY3QgaXMgcmV0dXJuZWQgaW5zdGVhZC5gKTtcbiAgICAgIHJldHVybiBnbG9iYWxUaGlzLnByb2Nlc3M7XG4gICAgfVxuXG4gICAgY29uc29sZS5lcnJvcihgTW9kdWxlIG5vdCBmb3VuZDogJHtpZH0uIEVtcHR5IG9iamVjdCBpcyByZXR1cm5lZCBpbnN0ZWFkLmApO1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0RXNtKCk6IHZvaWQge1xuICBpZiAoKGdsb2JhbFRoaXMucHJvY2VzcyBhcyBOb2RlSlMuUHJvY2VzcyB8IHVuZGVmaW5lZCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBicm93c2VyUHJvY2VzczogQnJvd3NlclByb2Nlc3MgPSB7XG4gICAgYnJvd3NlcjogdHJ1ZSxcbiAgICBjd2Q6ICgpID0+ICcvJyxcbiAgICBlbnY6IHt9LFxuICAgIHBsYXRmb3JtOiAnYW5kcm9pZCdcbiAgfTtcbiAgZ2xvYmFsVGhpcy5wcm9jZXNzID0gYnJvd3NlclByb2Nlc3MgYXMgTm9kZUpTLlByb2Nlc3M7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7O0FBZ0JBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGdCQUFnQjtBQTBCbEIsU0FBUyxpQkFBaUIsT0FBeUI7QUFDeEQsUUFBTSxlQUFlLFFBQ2pCLENBQUMsSUFDRDtBQUFBLElBQ0EsQ0FBQyxXQUFXLDJCQUEyQixTQUFTLEdBQUcsQ0FBQyxHQUFHLE1BQWM7QUFDbkUsVUFBSSxPQUFPLGVBQWUsVUFBVTtBQUNsQyxjQUFNLGVBQWU7QUFDckIsY0FBTSxNQUFNLGFBQWEsVUFBVTtBQUNuQyxlQUFPLElBQUksY0FBYyxVQUFVLEVBQUU7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