obsidian-dev-utils
Version:
This is the collection of useful functions that you can use for your Obsidian plugin development
878 lines (865 loc) • 118 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 initCjs() {
const globalThisRecord = globalThis;
globalThisRecord['__name'] ??= name;
const originalRequire = require;
if (originalRequire && !originalRequire.__isPatched) {
// eslint-disable-next-line no-global-assign, no-implicit-globals -- We need to patch the `require()` function.
require = Object.assign(
(id) => requirePatched(id),
originalRequire,
{
__isPatched: true
}
);
}
const newFuncs = {
__extractDefault() {
return extractDefault;
},
process() {
const browserProcess = {
browser: true,
cwd() {
return '/';
},
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;
}
const OBSIDIAN_BUILT_IN_MODULE_NAMES = [
'obsidian',
'@codemirror/autocomplete',
'@codemirror/collab',
'@codemirror/commands',
'@codemirror/language',
'@codemirror/lint',
'@codemirror/search',
'@codemirror/state',
'@codemirror/text',
'@codemirror/view',
'@lezer/common',
'@lezer/lr',
'@lezer/highlight'];
const DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES = [
'@codemirror/closebrackets',
'@codemirror/comment',
'@codemirror/fold',
'@codemirror/gutter',
'@codemirror/highlight',
'@codemirror/history',
'@codemirror/matchbrackets',
'@codemirror/panel',
'@codemirror/rangeset',
'@codemirror/rectangular-selection',
'@codemirror/stream-parser',
'@codemirror/tooltip'];
function requirePatched(id) {
if (OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id) || DEPRECATED_OBSIDIAN_BUILT_IN_MODULE_NAMES.includes(id)) {
return originalRequire?.(id);
}
// eslint-disable-next-line @typescript-eslint/no-deprecated, @typescript-eslint/no-unnecessary-condition -- We need access to app here which might not be available yet.
if (globalThis?.app?.isMobile) {
if (id === 'process' || id === 'node:process') {
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Fake process object is returned instead.`);
return globalThis.process;
}
} else {
const module = originalRequire?.(id);
if (module) {
return extractDefault(module);
}
}
console.debug(`The most likely you can safely ignore this error. Module not found: ${id}. Empty object is returned instead.`);
return {};
}
})();
"use strict";
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 __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 __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var Link_exports = {};
__export(Link_exports, {
LinkPathStyle: () => LinkPathStyle,
LinkStyle: () => LinkStyle,
convertLink: () => convertLink,
editBacklinks: () => editBacklinks,
editLinks: () => editLinks,
editLinksInContent: () => editLinksInContent,
encodeUrl: () => encodeUrl,
escapeAlias: () => escapeAlias,
extractLinkFile: () => extractLinkFile,
fixFrontmatterMarkdownLinks: () => fixFrontmatterMarkdownLinks,
generateMarkdownLink: () => generateMarkdownLink,
generateRawMarkdownLink: () => generateRawMarkdownLink,
parseLink: () => parseLink,
parseLinks: () => parseLinks,
registerGenerateMarkdownLinkDefaultOptionsFn: () => registerGenerateMarkdownLinkDefaultOptionsFn,
shouldResetAlias: () => shouldResetAlias,
splitSubpath: () => splitSubpath,
testAngleBrackets: () => testAngleBrackets,
testEmbed: () => testEmbed,
testLeadingDot: () => testLeadingDot,
testLeadingSlash: () => testLeadingSlash,
testWikilink: () => testWikilink,
unescapeAlias: () => unescapeAlias,
updateLink: () => updateLink,
updateLinksInContent: () => updateLinksInContent,
updateLinksInFile: () => updateLinksInFile
});
module.exports = __toCommonJS(Link_exports);
var import_obsidian = require('obsidian');
var import_implementations = require('obsidian-typings/implementations');
var import_remark = require('remark');
var import_remark_parse = __toESM(__extractDefault(require('remark-parse')), 1);
var import_remark_wiki_link = require('remark-wiki-link');
var import_unist_util_visit = require('unist-util-visit');
var import_AbortController = require('../AbortController.cjs');
var import_ObjectUtils = require('../ObjectUtils.cjs');
var import_Path = require('../Path.cjs');
var import_String = require('../String.cjs');
var import_url = require('../url.cjs');
var import_App = require('./App.cjs');
var import_FileChange = require('./FileChange.cjs');
var import_FileSystem = require('./FileSystem.cjs');
var import_MetadataCache = require('./MetadataCache.cjs');
var import_ObsidianSettings = require('./ObsidianSettings.cjs');
var import_Reference = require('./Reference.cjs');
const ESCAPED_WIKILINK_DIVIDER = "\\|";
const SPECIAL_LINK_SYMBOLS_REGEXP = /[\\\x00\x08\x0B\x0C\x0E-\x1F ]/g;
const SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX = /[\\[\]<>_*~=`$]/g;
const UNESCAPED_WIKILINK_DIVIDER_REGEXP = /(?<!\\)\|/g;
const WIKILINK_DIVIDER = "|";
var LinkPathStyle = /* @__PURE__ */ ((LinkPathStyle2) => {
LinkPathStyle2["AbsolutePathInVault"] = "AbsolutePathInVault";
LinkPathStyle2["ObsidianSettingsDefault"] = "ObsidianSettingsDefault";
LinkPathStyle2["RelativePathToTheSource"] = "RelativePathToTheSource";
LinkPathStyle2["ShortestPathWhenPossible"] = "ShortestPathWhenPossible";
return LinkPathStyle2;
})(LinkPathStyle || {});
var LinkStyle = /* @__PURE__ */ ((LinkStyle2) => {
LinkStyle2["Markdown"] = "Markdown";
LinkStyle2["ObsidianSettingsDefault"] = "ObsidianSettingsDefault";
LinkStyle2["PreserveExisting"] = "PreserveExisting";
LinkStyle2["Wikilink"] = "Wikilink";
return LinkStyle2;
})(LinkStyle || {});
function convertLink(options) {
const targetFile = extractLinkFile(options.app, options.link, options.oldSourcePathOrFile ?? options.newSourcePathOrFile);
if (!targetFile) {
return options.link.original;
}
return updateLink((0, import_ObjectUtils.normalizeOptionalProperties)({
app: options.app,
link: options.link,
linkStyle: options.linkStyle,
newSourcePathOrFile: options.newSourcePathOrFile,
newTargetPathOrFile: targetFile,
oldSourcePathOrFile: options.oldSourcePathOrFile,
shouldUpdateFileNameAlias: options.shouldUpdateFileNameAlias
}));
}
async function editBacklinks(app, pathOrFile, linkConverter, processOptions = {}) {
const backlinks = await (0, import_MetadataCache.getBacklinksForFileSafe)(app, pathOrFile, processOptions);
for (const backlinkNotePath of backlinks.keys()) {
const currentLinks = backlinks.get(backlinkNotePath) ?? [];
const linkJsons = new Set(currentLinks.map((link) => (0, import_ObjectUtils.toJson)(link)));
await editLinks(app, backlinkNotePath, (link) => {
const linkJson = (0, import_ObjectUtils.toJson)(link);
if (!linkJsons.has(linkJson)) {
return;
}
return linkConverter(link);
}, processOptions);
}
}
async function editLinks(app, pathOrFile, linkConverter, processOptions = {}) {
await (0, import_FileChange.applyFileChanges)(app, pathOrFile, async (abortSignal, content) => {
const cache = await (0, import_MetadataCache.getCacheSafe)(app, pathOrFile);
abortSignal.throwIfAborted();
const file = (0, import_FileSystem.getFile)(app, pathOrFile);
const cachedContent = await app.vault.cachedRead(file);
abortSignal.throwIfAborted();
if (content !== cachedContent) {
return null;
}
return await getFileChanges(cache, (0, import_FileSystem.isCanvasFile)(app, pathOrFile), linkConverter, abortSignal);
}, processOptions);
}
async function editLinksInContent(app, content, linkConverter, abortSignal) {
abortSignal ??= (0, import_AbortController.abortSignalNever)();
abortSignal.throwIfAborted();
const newContent = await (0, import_FileChange.applyContentChanges)(abortSignal, content, "", async () => {
const cache = await (0, import_MetadataCache.parseMetadata)(app, content);
abortSignal.throwIfAborted();
const changes = await getFileChanges(cache, false, linkConverter, abortSignal);
abortSignal.throwIfAborted();
return changes;
});
abortSignal.throwIfAborted();
if (newContent === null) {
throw new Error("Failed to update links in content");
}
return newContent;
}
function encodeUrl(url) {
return (0, import_String.replaceAll)(url, SPECIAL_LINK_SYMBOLS_REGEXP, ({ substring: specialLinkSymbol }) => encodeURIComponent(specialLinkSymbol));
}
function escapeAlias(alias) {
return (0, import_String.replaceAll)(alias, SPECIAL_MARKDOWN_LINK_SYMBOLS_REGEX, "\\$&");
}
function extractLinkFile(app, link, sourcePathOrFile, shouldAllowNonExistingFile = false) {
const { linkPath } = splitSubpath(link.link);
const sourcePath = (0, import_FileSystem.getPath)(app, sourcePathOrFile);
const file = app.metadataCache.getFirstLinkpathDest(linkPath, sourcePath);
if (file) {
return file;
}
if (!shouldAllowNonExistingFile) {
return null;
}
if (linkPath.startsWith("/")) {
return (0, import_FileSystem.getFile)(app, linkPath, true);
}
const fullLinkPath = (0, import_Path.join)((0, import_Path.dirname)(sourcePath), `./${linkPath}`);
if (fullLinkPath.startsWith("../")) {
return null;
}
return (0, import_FileSystem.getFile)(app, fullLinkPath, true);
}
function fixFrontmatterMarkdownLinks(cache) {
return _fixFrontmatterMarkdownLinks(cache.frontmatter, "", cache);
}
function generateMarkdownLink(options) {
const { app } = options;
const DEFAULT_OPTIONS = {
isEmptyEmbedAliasAllowed: true
};
const customDefaultOptions = getGenerateMarkdownLinkDefaultOptionsFns(app).map((defaultOptionsFn) => defaultOptionsFn());
options = Object.assign({}, DEFAULT_OPTIONS, ...customDefaultOptions, options);
const targetFile = (0, import_FileSystem.getFile)(app, options.targetPathOrFile, options.isNonExistingFileAllowed);
return (0, import_MetadataCache.tempRegisterFilesAndRun)(app, [targetFile], () => generateMarkdownLinkImpl(options));
}
function generateRawMarkdownLink(options) {
const embedPrefix = options.isEmbed ? "!" : "";
if (options.isWikilink) {
const aliasPart = options.alias ? `|${options.alias}` : "";
return `${embedPrefix}[[${options.url}${aliasPart}]]`;
}
const alias = options.alias ?? "";
const shouldEscapeAlias = options.shouldEscapeAlias ?? false;
const escapedAlias = shouldEscapeAlias ? escapeAlias(alias) : alias;
const url = options.shouldUseAngleBrackets ? `<${options.url}>` : encodeUrl(options.url);
const titlePart = options.title ? ` ${JSON.stringify(options.title)}` : "";
return `${embedPrefix}[${escapedAlias}](${url}${titlePart})`;
}
function parseLink(str) {
const links = parseLinks(str);
return links[0]?.raw === str ? links[0] : null;
}
function parseLinks(str) {
const embedSymbolOffsets = /* @__PURE__ */ new Set();
const EMBED_LINK_PREFIX = "![";
const NO_EMBED_LINK_PREFIX = "@[";
const DUMMY_CHARACTER = "@";
const EMBED_INSIDE_LINK_REG_EXP = /\[(?<LinkAlias>!\[.*?\]\(.+?\))\]\((?<Link>.+?)\)/g;
const noInsideEmbedsLinksStr = (0, import_String.replaceAll)(str, EMBED_INSIDE_LINK_REG_EXP, (_, linkAlias, link) => {
const dummyAlias = DUMMY_CHARACTER.repeat(linkAlias.length);
return `[${dummyAlias}](${link})`;
});
const noEmbedStr = (0, import_String.replaceAll)(noInsideEmbedsLinksStr, EMBED_LINK_PREFIX, (args) => {
embedSymbolOffsets.add(args.offset);
return NO_EMBED_LINK_PREFIX;
});
const processor = (0, import_remark.remark)().use(import_remark_parse.default).use(import_remark_wiki_link.wikiLinkPlugin, { aliasDivider: WIKILINK_DIVIDER });
const root = processor.parse(noEmbedStr);
const links = [];
const textLinks = [];
(0, import_unist_util_visit.visit)(root, (node) => {
let link;
switch (node.type) {
case "link":
link = parseLinkNode(node, str);
break;
case "wikiLink":
link = parseWikilinkNode(node, str);
break;
default:
return;
}
if (embedSymbolOffsets.has(link.startOffset - 1)) {
link.isEmbed = true;
link.startOffset--;
link.raw = `!${link.raw}`;
}
links.push(link);
});
links.sort((a, b) => a.startOffset - b.startOffset);
let textStartOffset = 0;
for (const link of links) {
extractTextLinks(str, textStartOffset, link.startOffset - 1, textLinks);
textStartOffset = link.endOffset + 1;
}
extractTextLinks(str, textStartOffset, str.length - 1, textLinks);
links.push(...textLinks);
links.sort((a, b) => a.startOffset - b.startOffset);
return links;
}
function registerGenerateMarkdownLinkDefaultOptionsFn(plugin, fn) {
const generateMarkdownLinkDefaultOptionsFns = getGenerateMarkdownLinkDefaultOptionsFns(plugin.app);
generateMarkdownLinkDefaultOptionsFns.push(fn);
plugin.register(() => {
generateMarkdownLinkDefaultOptionsFns.remove(fn);
});
}
function shouldResetAlias(options) {
const {
app,
displayText,
isWikilink,
newSourcePathOrFile,
oldSourcePathOrFile,
oldTargetPath,
targetPathOrFile
} = options;
if (isWikilink === false) {
return false;
}
if (!displayText) {
return true;
}
const targetFile = (0, import_FileSystem.getFile)(app, targetPathOrFile, true);
const newSourcePath = (0, import_FileSystem.getPath)(app, newSourcePathOrFile);
const oldSourcePath = (0, import_FileSystem.getPath)(app, oldSourcePathOrFile ?? newSourcePathOrFile);
const newSourceFolder = (0, import_Path.dirname)(newSourcePath);
const oldSourceFolder = (0, import_Path.dirname)(oldSourcePath);
const aliasesToReset = /* @__PURE__ */ new Set();
for (const pathOrFile of [targetFile.path, oldTargetPath]) {
if (!pathOrFile) {
continue;
}
const path = (0, import_FileSystem.getPath)(app, pathOrFile);
aliasesToReset.add(path);
aliasesToReset.add((0, import_Path.basename)(path));
aliasesToReset.add((0, import_Path.relative)(newSourceFolder, path));
aliasesToReset.add((0, import_Path.relative)(oldSourceFolder, path));
}
for (const sourcePath of [oldSourcePath, newSourcePath]) {
aliasesToReset.add(app.metadataCache.fileToLinktext(targetFile, sourcePath, false));
}
const cleanDisplayText = (0, import_String.replaceAll)((0, import_obsidian.normalizePath)(displayText.split(" > ")[0] ?? ""), /^\.\//g, "").toLowerCase();
for (const alias of aliasesToReset) {
if (alias.toLowerCase() === cleanDisplayText) {
return true;
}
const folder = (0, import_Path.dirname)(alias);
const base = (0, import_Path.basename)(alias, (0, import_Path.extname)(alias));
if ((0, import_Path.join)(folder, base).toLowerCase() === cleanDisplayText) {
return true;
}
}
return false;
}
function splitSubpath(link) {
const parsed = (0, import_obsidian.parseLinktext)((0, import_String.normalize)(link));
return {
linkPath: parsed.path,
subpath: parsed.subpath
};
}
function testAngleBrackets(link) {
const parseLinkResult = parseLink(link);
return parseLinkResult?.hasAngleBrackets ?? false;
}
function testEmbed(link) {
const parseLinkResult = parseLink(link);
return parseLinkResult?.isEmbed ?? false;
}
function testLeadingDot(link) {
const parseLinkResult = parseLink(link);
return parseLinkResult?.url.startsWith("./") ?? false;
}
function testLeadingSlash(link) {
const parseLinkResult = parseLink(link);
return parseLinkResult?.url.startsWith("/") ?? false;
}
function testWikilink(link) {
const parseLinkResult = parseLink(link);
return parseLinkResult?.isWikilink ?? false;
}
function unescapeAlias(escapedAlias) {
return (0, import_String.replaceAll)(escapedAlias, /(?<Backslashes>\\+)(?<SpecialCharacter>[!"#$%&'()*+,-./:;<=>?@[\\\]^_`{|}~])/g, (_, backslashes, specialChar) => {
const ESCAPED_BACKSLASH_LENGTH = 2;
const backslashCount = backslashes.length;
const keepCount = Math.floor(backslashCount / ESCAPED_BACKSLASH_LENGTH);
return "\\".repeat(keepCount) + specialChar;
});
}
function updateLink(options) {
const {
app,
link,
linkStyle,
newSourcePathOrFile,
newTargetPathOrFile,
oldSourcePathOrFile,
oldTargetPathOrFile,
shouldUpdateFileNameAlias
} = options;
if (!newTargetPathOrFile) {
return link.original;
}
const newTargetFile = (0, import_FileSystem.getFile)(app, newTargetPathOrFile, true);
const oldSourcePath = (0, import_FileSystem.getPath)(app, oldSourcePathOrFile ?? newSourcePathOrFile);
const oldTargetPath = (0, import_FileSystem.getPath)(app, oldTargetPathOrFile ?? newTargetPathOrFile);
const isWikilink = shouldUseWikilinkStyle(app, link.original, linkStyle);
const { subpath } = splitSubpath(link.link);
let shouldKeepAlias = !shouldUpdateFileNameAlias;
if ((0, import_FileSystem.isCanvasFile)(app, newSourcePathOrFile)) {
if ((0, import_Reference.isCanvasFileNodeReference)(link)) {
return newTargetFile.path + subpath;
}
}
const parseLinkResult = parseLink(link.original);
let alias;
if (isWikilink && parseLinkResult?.alias) {
alias = parseLinkResult.alias;
shouldKeepAlias = true;
}
alias ??= shouldResetAlias((0, import_ObjectUtils.normalizeOptionalProperties)({
app,
displayText: link.displayText,
isWikilink,
newSourcePathOrFile,
oldSourcePathOrFile,
oldTargetPath,
targetPathOrFile: newTargetFile
})) ? void 0 : parseLinkResult?.alias;
if (!shouldKeepAlias) {
if (alias === (0, import_Path.basename)(oldTargetPath, (0, import_Path.extname)(oldTargetPath))) {
alias = newTargetFile.basename;
} else if (alias === (0, import_Path.basename)(oldTargetPath)) {
alias = newTargetFile.name;
}
}
const newLink = generateMarkdownLink((0, import_ObjectUtils.normalizeOptionalProperties)({
alias,
app,
isSingleSubpathAllowed: oldSourcePath === oldTargetPath && !!parseLinkResult?.alias,
linkStyle,
originalLink: link.original,
sourcePathOrFile: newSourcePathOrFile,
subpath,
targetPathOrFile: newTargetFile
}));
return newLink;
}
async function updateLinksInContent(options) {
const {
app,
content,
linkStyle,
newSourcePathOrFile,
oldSourcePathOrFile,
shouldUpdateEmbedOnlyLinks,
shouldUpdateFileNameAlias
} = options;
return await editLinksInContent(app, content, (link) => {
const isEmbedLink = testEmbed(link.original);
if (shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink) {
return;
}
return convertLink((0, import_ObjectUtils.normalizeOptionalProperties)({
app,
link,
linkStyle,
newSourcePathOrFile,
oldSourcePathOrFile,
shouldUpdateFileNameAlias
}));
});
}
async function updateLinksInFile(options) {
const {
app,
linkStyle,
newSourcePathOrFile,
oldSourcePathOrFile,
shouldUpdateEmbedOnlyLinks,
shouldUpdateFileNameAlias
} = options;
if ((0, import_FileSystem.isCanvasFile)(app, newSourcePathOrFile) && !app.internalPlugins.getEnabledPluginById(import_implementations.InternalPluginName.Canvas)) {
return;
}
await editLinks(app, newSourcePathOrFile, (link) => {
const isEmbedLink = testEmbed(link.original);
if (shouldUpdateEmbedOnlyLinks !== void 0 && shouldUpdateEmbedOnlyLinks !== isEmbedLink) {
return;
}
return convertLink((0, import_ObjectUtils.normalizeOptionalProperties)({
app,
link,
linkStyle,
newSourcePathOrFile,
oldSourcePathOrFile,
shouldUpdateFileNameAlias
}));
}, options);
}
function _fixFrontmatterMarkdownLinks(value, key, cache) {
if (typeof value === "string") {
const parseLinkResult = parseLink(value);
if (!parseLinkResult || parseLinkResult.isWikilink || parseLinkResult.isExternal) {
return false;
}
cache.frontmatterLinks ??= [];
let link = cache.frontmatterLinks.find((frontmatterLink) => frontmatterLink.key === key);
if (!link) {
link = {
key,
link: "",
original: ""
};
cache.frontmatterLinks.push(link);
}
link.link = parseLinkResult.url;
link.original = value;
if (parseLinkResult.alias !== void 0) {
link.displayText = parseLinkResult.alias;
}
return true;
}
if (typeof value !== "object" || value === null) {
return false;
}
let hasFrontmatterLinks = false;
for (const [childKey, childValue] of Object.entries(value)) {
const hasChildFrontmatterLinks = _fixFrontmatterMarkdownLinks(childValue, key ? `${key}.${childKey}` : childKey, cache);
hasFrontmatterLinks ||= hasChildFrontmatterLinks;
}
return hasFrontmatterLinks;
}
function decodeUrlSafely(url, isExternal, hasAngleBrackets) {
if (isExternal || hasAngleBrackets) {
return url;
}
try {
return decodeURIComponent(url);
} catch (error) {
console.error(`Failed to decode URL ${url}`, error);
return url;
}
}
function extractAlias(str, aliasStartOffset, aliasEndOffset) {
return aliasStartOffset < aliasEndOffset ? str.slice(aliasStartOffset, aliasEndOffset) : void 0;
}
function extractTextLinks(str, startOffset, endOffset, textLinks) {
if (startOffset > endOffset) {
return;
}
const textPart = str.slice(startOffset, endOffset + 1);
(0, import_String.replaceAll)(textPart, /(?<Url>\S+)/g, (args, url) => {
if (!(0, import_url.isUrl)(url)) {
return;
}
textLinks.push({
encodedUrl: encodeUrl(url),
endOffset: startOffset + args.offset + url.length,
hasAngleBrackets: false,
isEmbed: false,
isExternal: true,
isWikilink: false,
raw: url,
startOffset: startOffset + args.offset,
url
});
});
}
function generateLinkText(app, targetFile, sourcePath, subpath, config) {
if (sourcePath === "/") {
sourcePath = "";
}
let linkText;
if (targetFile.path === sourcePath && subpath && config.isSingleSubpathAllowed) {
linkText = "";
} else {
switch (config.linkPathStyle) {
case "AbsolutePathInVault" /* AbsolutePathInVault */:
linkText = targetFile.path;
if (config.shouldUseLeadingSlashForAbsolutePaths && !linkText.startsWith("/")) {
linkText = `/${linkText}`;
}
break;
case "RelativePathToTheNote" /* RelativePathToTheSource */:
linkText = (0, import_Path.relative)((0, import_Path.dirname)(sourcePath), targetFile.path);
if (config.shouldUseLeadingDotForRelativePaths && !linkText.startsWith(".")) {
linkText = `./${linkText}`;
}
break;
case "ShortestPathWhenPossible" /* ShortestPathWhenPossible */: {
const shortestName = (0, import_FileSystem.isMarkdownFile)(app, targetFile) ? targetFile.basename : targetFile.name;
const matchedFiles = app.metadataCache.getLinkpathDest(shortestName, sourcePath);
linkText = matchedFiles.length === 1 && matchedFiles[0] === targetFile ? targetFile.name : targetFile.path;
break;
}
default:
throw new Error(`Invalid link path style: ${config.linkPathStyle}.`);
}
}
linkText = config.isWikilink ? (0, import_String.trimEnd)(linkText, `.${import_FileSystem.MARKDOWN_FILE_EXTENSION}`) : linkText;
linkText += subpath;
return linkText;
}
function generateMarkdownLinkImpl(options) {
const { app } = options;
const targetFile = (0, import_FileSystem.getFile)(app, options.targetPathOrFile, options.isNonExistingFileAllowed);
const sourcePath = (0, import_FileSystem.getPath)(app, options.sourcePathOrFile);
const subpath = options.subpath ?? "";
const linkConfig = getLinkConfig(options, targetFile);
const linkText = generateLinkText(app, targetFile, sourcePath, subpath, linkConfig);
return linkConfig.isWikilink ? generateWikiLink(linkText, options.alias, linkConfig.isEmbed) : generateMarkdownStyleLink(linkText, targetFile, options, linkConfig);
}
function generateMarkdownStyleLink(linkText, targetFile, options, config) {
const { app } = options;
let alias = options.alias ?? "";
if (!alias && ((0, import_FileSystem.isMarkdownFile)(app, targetFile) || !options.isEmptyEmbedAliasAllowed)) {
alias = !options.shouldIncludeAttachmentExtensionToEmbedAlias || (0, import_FileSystem.isMarkdownFile)(app, targetFile) ? targetFile.basename : targetFile.name;
options.shouldEscapeAlias = true;
}
return generateRawMarkdownLink({
alias,
isEmbed: config.isEmbed,
isWikilink: false,
shouldEscapeAlias: options.shouldEscapeAlias ?? false,
shouldUseAngleBrackets: config.shouldUseAngleBrackets,
url: linkText
});
}
function generateWikiLink(linkText, alias, isEmbed) {
if (alias?.toLowerCase() === linkText.toLowerCase()) {
return generateRawMarkdownLink({
isEmbed,
isWikilink: true,
url: alias
});
}
return generateRawMarkdownLink({
alias,
isEmbed,
isWikilink: true,
url: linkText
});
}
async function getFileChanges(cache, isCanvasFileCache, linkConverter, abortSignal) {
abortSignal ??= (0, import_AbortController.abortSignalNever)();
abortSignal.throwIfAborted();
if (!cache) {
return [];
}
const changes = [];
const tablePositions = (cache.sections ?? []).filter((section) => section.type === "table").map((section) => ({
end: section.position.end.offset,
start: section.position.start.offset
}));
for (const link of (0, import_MetadataCache.getAllLinks)(cache)) {
abortSignal.throwIfAborted();
const newContent = await linkConverter(link, abortSignal);
abortSignal.throwIfAborted();
if (newContent === void 0) {
continue;
}
const fileChange = (0, import_Reference.referenceToFileChange)(link, newContent);
if (isCanvasFileCache) {
if ((0, import_FileChange.isCanvasChange)(fileChange)) {
changes.push(fileChange);
} else {
console.error("Unsupported file change", fileChange);
continue;
}
} else {
if (shouldEscapeWikilinkDivider(fileChange, tablePositions)) {
fileChange.newContent = fileChange.newContent.replaceAll(UNESCAPED_WIKILINK_DIVIDER_REGEXP, ESCAPED_WIKILINK_DIVIDER);
}
changes.push(fileChange);
}
}
return changes;
}
function getFinalLinkPathStyle(app, linkPathStyle) {
switch (linkPathStyle ?? "ObsidianSettingsDefault" /* ObsidianSettingsDefault */) {
case "AbsolutePathInVault" /* AbsolutePathInVault */:
return "AbsolutePathInVault" /* AbsolutePathInVault */;
case "RelativePathToTheSource" /* RelativePathToTheSource */:
return "RelativePathToTheNote" /* RelativePathToTheSource */;
case "ShortestPathWhenPossible" /* ShortestPathWhenPossible */:
return "ShortestPathWhenPossible" /* ShortestPathWhenPossible */;
case "ObsidianSettingsDefault" /* ObsidianSettingsDefault */: {
const newLinkFormat = (0, import_ObsidianSettings.getNewLinkFormat)(app);
switch (newLinkFormat) {
case "absolute":
return "AbsolutePathInVault" /* AbsolutePathInVault */;
case "relative":
return "RelativePathToTheNote" /* RelativePathToTheSource */;
case "shortest":
return "ShortestPathWhenPossible" /* ShortestPathWhenPossible */;
default:
throw new Error(`Invalid link format: ${newLinkFormat}.`);
}
}
default:
throw new Error(`Invalid link path style: ${linkPathStyle}.`);
}
}
function getGenerateMarkdownLinkDefaultOptionsFns(app) {
return (0, import_App.getObsidianDevUtilsState)(app, "generateMarkdownLinkDefaultOptionsFns", []).value;
}
function getLinkConfig(options, targetFile) {
const { app } = options;
return {
isEmbed: options.isEmbed ?? (options.originalLink ? testEmbed(options.originalLink) : void 0) ?? (!(0, import_obsidian.requireApiVersion)("1.10.0") && !(0, import_FileSystem.isMarkdownFile)(app, targetFile)),
isSingleSubpathAllowed: options.isSingleSubpathAllowed ?? true,
isWikilink: shouldUseWikilinkStyle(app, options.originalLink, options.linkStyle),
linkPathStyle: getFinalLinkPathStyle(app, options.linkPathStyle),
shouldUseAngleBrackets: options.shouldUseAngleBrackets ?? (options.originalLink ? testAngleBrackets(options.originalLink) : void 0) ?? false,
shouldUseLeadingDotForRelativePaths: options.shouldUseLeadingDotForRelativePaths ?? (options.originalLink ? testLeadingDot(options.originalLink) : void 0) ?? false,
shouldUseLeadingSlashForAbsolutePaths: options.shouldUseLeadingSlashForAbsolutePaths ?? (options.originalLink ? testLeadingSlash(options.originalLink) : void 0) ?? false
};
}
function getRawLink(node, str) {
return str.slice(node.position?.start.offset ?? 0, node.position?.end.offset ?? 0);
}
function hasAngleBracketsInLink(raw, rawUrl) {
const OPEN_ANGLE_BRACKET = "<";
return raw.startsWith(OPEN_ANGLE_BRACKET) || rawUrl.startsWith(OPEN_ANGLE_BRACKET);
}
function parseLinkNode(node, str) {
const LINK_ALIAS_SUFFIX = "](";
const LINK_SUFFIX = ")";
const raw = getRawLink(node, str);
const aliasNodeStartOffset = node.children[0]?.position?.start.offset ?? 1;
const aliasNodeEndOffset = node.children.at(-1)?.position?.end.offset ?? 1;
const rawUrl = str.slice(aliasNodeEndOffset + LINK_ALIAS_SUFFIX.length, (node.position?.end.offset ?? 0) - LINK_SUFFIX.length);
const hasAngleBrackets = hasAngleBracketsInLink(raw, rawUrl);
const isExternal = (0, import_url.isUrl)(node.url);
const url = decodeUrlSafely(node.url, isExternal, hasAngleBrackets);
const alias = extractAlias(str, aliasNodeStartOffset, aliasNodeEndOffset);
return (0, import_ObjectUtils.normalizeOptionalProperties)({
alias,
encodedUrl: isExternal ? encodeUrl(url) : void 0,
endOffset: node.position?.end.offset ?? 0,
hasAngleBrackets,
isEmbed: false,
isExternal,
isWikilink: false,
raw,
startOffset: node.position?.start.offset ?? 0,
title: node.title ?? void 0,
unescapedAlias: alias === void 0 ? void 0 : unescapeAlias(alias),
url
});
}
function parseWikilinkNode(node, str) {
return (0, import_ObjectUtils.normalizeOptionalProperties)({
alias: str.includes(WIKILINK_DIVIDER) ? node.data.alias : void 0,
endOffset: node.position?.end.offset ?? 0,
isEmbed: false,
isExternal: false,
isWikilink: true,
raw: getRawLink(node, str),
startOffset: node.position?.start.offset ?? 0,
url: node.value
});
}
function shouldEscapeWikilinkDivider(fileChange, tablePositions) {
if (!(0, import_FileChange.isContentChange)(fileChange)) {
return false;
}
if (!UNESCAPED_WIKILINK_DIVIDER_REGEXP.test(fileChange.newContent)) {
return false;
}
return tablePositions.some(
(tablePosition) => tablePosition.start <= fileChange.reference.position.start.offset && fileChange.reference.position.end.offset <= tablePosition.end
);
}
function shouldUseWikilinkStyle(app, originalLink, linkStyle) {
switch (linkStyle ?? "PreserveExisting" /* PreserveExisting */) {
case "Markdown" /* Markdown */:
return false;
case "ObsidianSettingsDefault" /* ObsidianSettingsDefault */:
return (0, import_ObsidianSettings.shouldUseWikilinks)(app);
case "PreserveExisting" /* PreserveExisting */:
return originalLink === void 0 ? (0, import_ObsidianSettings.shouldUseWikilinks)(app) : testWikilink(originalLink);
case "Wikilink" /* Wikilink */:
return true;
default:
throw new Error(`Invalid link style: ${linkStyle}.`);
}
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
LinkPathStyle,
LinkStyle,
convertLink,
editBacklinks,
editLinks,
editLinksInContent,
encodeUrl,
escapeAlias,
extractLinkFile,
fixFrontmatterMarkdownLinks,
generateMarkdownLink,
generateRawMarkdownLink,
parseLink,
parseLinks,
registerGenerateMarkdownLinkDefaultOptionsFn,
shouldResetAlias,
splitSubpath,
testAngleBrackets,
testEmbed,
testLeadingDot,
testLeadingSlash,
testWikilink,
unescapeAlias,
updateLink,
updateLinksInContent,
updateLinksInFile
});
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL0xpbmsudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKlxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBoYW5kbGluZyBhbmQgdXBkYXRpbmcgbGlua3Mgd2l0aGluIE9ic2lkaWFuIHZhdWx0cy4gSXQgaW5jbHVkZXNcbiAqIGZ1bmN0aW9ucyB0byBzcGxpdCBwYXRocywgdXBkYXRlIGxpbmtzIGluIGZpbGVzLCBhbmQgZ2VuZXJhdGUgbWFya2Rvd24gbGlua3Mgd2l0aCB2YXJpb3VzIG9wdGlvbnMuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBMaW5rIH0gZnJvbSAnbWRhc3QnO1xuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIENhY2hlZE1ldGFkYXRhLFxuICBQbHVnaW4sXG4gIFJlZmVyZW5jZSxcbiAgVEZpbGVcbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHR5cGUgeyBQcm9taXNhYmxlIH0gZnJvbSAndHlwZS1mZXN0JztcbmltcG9ydCB0eXBlIHsgTm9kZSB9IGZyb20gJ3VuaXN0JztcblxuaW1wb3J0IHtcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyc2VMaW5rdGV4dCxcbiAgcmVxdWlyZUFwaVZlcnNpb25cbn0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgSW50ZXJuYWxQbHVnaW5OYW1lIH0gZnJvbSAnb2JzaWRpYW4tdHlwaW5ncy9pbXBsZW1lbnRhdGlvbnMnO1xuaW1wb3J0IHsgcmVtYXJrIH0gZnJvbSAncmVtYXJrJztcbmltcG9ydCByZW1hcmtQYXJzZSBmcm9tICdyZW1hcmstcGFyc2UnO1xuaW1wb3J0IHsgd2lraUxpbmtQbHVnaW4gfSBmcm9tICdyZW1hcmstd2lraS1saW5rJztcbmltcG9ydCB7IHZpc2l0IH0gZnJvbSAndW5pc3QtdXRpbC12aXNpdCc7XG5cbmltcG9ydCB0eXBlIHsgR2VuZXJpY09iamVjdCB9IGZyb20gJy4uL09iamVjdFV0aWxzLnRzJztcbmltcG9ydCB0eXBlIHsgTWF5YmVSZXR1cm4gfSBmcm9tICcuLi9UeXBlLnRzJztcbmltcG9ydCB0eXBlIHsgRmlsZUNoYW5nZSB9IGZyb20gJy4vRmlsZUNoYW5nZS50cyc7XG5pbXBvcnQgdHlwZSB7IFBhdGhPckZpbGUgfSBmcm9tICcuL0ZpbGVTeXN0ZW0udHMnO1xuaW1wb3J0IHR5cGUgeyBQcm9jZXNzT3B0aW9ucyB9IGZyb20gJy4vVmF1bHQudHMnO1xuXG5pbXBvcnQgeyBhYm9ydFNpZ25hbE5ldmVyIH0gZnJvbSAnLi4vQWJvcnRDb250cm9sbGVyLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZU9wdGlvbmFsUHJvcGVydGllcyxcbiAgdG9Kc29uXG59IGZyb20gJy4uL09iamVjdFV0aWxzLnRzJztcbmltcG9ydCB7XG4gIGJhc2VuYW1lLFxuICBkaXJuYW1lLFxuICBleHRuYW1lLFxuICBqb2luLFxuICByZWxhdGl2ZVxufSBmcm9tICcuLi9QYXRoLnRzJztcbmltcG9ydCB7XG4gIG5vcm1hbGl6ZSxcbiAgcmVwbGFjZUFsbCxcbiAgdHJpbUVuZFxufSBmcm9tICcuLi9TdHJpbmcudHMnO1xuaW1wb3J0IHsgaXNVcmwgfSBmcm9tICcuLi91cmwudHMnO1xuaW1wb3J0IHsgZ2V0T2JzaWRpYW5EZXZVdGlsc1N0YXRlIH0gZnJvbSAnLi9BcHAudHMnO1xuaW1wb3J0IHtcbiAgYXBwbHlDb250ZW50Q2hhbmdlcyxcbiAgYXBwbHlGaWxlQ2hhbmdlcyxcbiAgaXNDYW52YXNDaGFuZ2UsXG4gIGlzQ29udGVudENoYW5nZVxufSBmcm9tICcuL0ZpbGVDaGFuZ2UudHMnO1xuaW1wb3J0IHtcbiAgZ2V0RmlsZSxcbiAgZ2V0UGF0aCxcbiAgaXNDYW52YXNGaWxlLFxuICBpc01hcmtkb3duRmlsZSxcbiAgTUFSS0RPV05fRklMRV9FWFRFTlNJT05cbn0gZnJvbSAnLi9GaWxlU3lzdGVtLnRzJztcbmltcG9ydCB7XG4gIGdldEFsbExpbmtzLFxuICBnZXRCYWNrbGlua3NGb3JGaWxlU2FmZSxcbiAgZ2V0Q2FjaGVTYWZlLFxuICBwYXJzZU1ldGFkYXRhLFxuICB0ZW1wUmVnaXN0ZXJGaWxlc0FuZFJ1blxufSBmcm9tICcuL01ldGFkYXRhQ2FjaGUudHMnO1xuaW1wb3J0IHtcbiAgZ2V0TmV3TGlua0Zvcm1hdCxcbiAgc2hvdWxkVXNlV2lraWxpbmtzXG59IGZyb20gJy4vT2JzaWRpYW5TZXR0aW5ncy50cyc7XG5pbXBvcnQge1xuICBpc0NhbnZhc0ZpbGVOb2RlUmVmZXJlbmNlLFxuICByZWZlcmVuY2VUb0ZpbGVDaGFuZ2Vcbn0gZnJvbSAnLi9SZWZlcmVuY2UudHMnO1xuXG5jb25zdCBFU0NBUEVEX1dJS0lMSU5LX0RJVklERVIgPSAnXFxcXHwnO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBsaW5rIHN5bWJvbHMuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250cm9sLXJlZ2V4IC0tIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgd3JpdHRlbiB0byBjYXB0dXJlIGNvbnRyb2wgY2hhcmFjdGVycy5cbmNvbnN0IFNQRUNJQUxfTElOS19TWU1CT0xTX1JFR0VYUCA9IC9bXFxcXFxceDAwXFx4MDhcXHgwQlxceDBDXFx4MEUtXFx4MUYgXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc3BlY2lhbCBtYXJrZG93biBsaW5rIHN5bWJvbHMuXG4gKi9cbmNvbnN0IFNQRUNJQUxfTUFSS0RPV05fTElOS19TWU1CT0xTX1JFR0VYID0gL1tcXFxcW1xcXTw+Xyp+PWAkXS9nO1xuXG4vKipcbiAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgdW5lc2NhcGVkIHBpcGVzLlxuICovXG5jb25zdCBVTkVTQ0FQRURfV0lLSUxJTktfRElWSURFUl9SRUdFWFAgPSAvKD88IVxcXFwpXFx8L2c7XG5cbmNvbnN0IFdJS0lMSU5LX0RJVklERVIgPSAnfCc7XG5cbi8qKlxuICogQSBzdHlsZSBvZiB0aGUgbGluayBwYXRoLlxuICovXG5leHBvcnQgZW51bSBMaW5rUGF0aFN0eWxlIHtcbiAgLyoqXG4gICAqIFVzZSB0aGUgYWJzb2x1dGUgcGF0aCBpbiB0aGUgdmF1bHQuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbW3BhdGgvZnJvbS90aGUvdmF1bHQvcm9vdC90YXJnZXRdXWBcbiAgICovXG4gIEFic29sdXRlUGF0aEluVmF1bHQgPSAnQWJzb2x1dGVQYXRoSW5WYXVsdCcsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHBhdGggc3R5bGUgZGVmaW5lZCBpbiBPYnNpZGlhbiBzZXR0aW5ncy5cbiAgICovXG4gIE9ic2lkaWFuU2V0dGluZ3NEZWZhdWx0ID0gJ09ic2lkaWFuU2V0dGluZ3NEZWZhdWx0JyxcblxuICAvKipcbiAgICogVXNlIHRoZSByZWxhdGl2ZSBwYXRoIHRvIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIEBleGFtcGxlIGBbWy4uLy4uL3JlbGF0aXZlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqL1xuICBSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZSA9ICdSZWxhdGl2ZVBhdGhUb1RoZVNvdXJjZScsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgc2hvcnRlc3QgcGF0aCB3aGVuIHBvc3NpYmxlLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tzaG9ydGVzdC1wYXRoLXRvLXRhcmdldF1dYFxuICAgKi9cbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICovXG5leHBvcnQgZW51bSBMaW5rU3R5bGUge1xuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gbWFya2Rvd24gZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShwYXRoL3RvL3RhcmdldC5tZClgXG4gICAqL1xuICBNYXJrZG93biA9ICdNYXJrZG93bicsXG5cbiAgLyoqXG4gICAqIFVzZSB0aGUgZGVmYXVsdCBsaW5rIHN0eWxlIGRlZmluZWQgaW4gT2JzaWRpYW4gc2V0dGluZ3MuXG4gICAqL1xuICBPYnNpZGlhblNldHRpbmdzRGVmYXVsdCA9ICdPYnNpZGlhblNldHRpbmdzRGVmYXVsdCcsXG5cbiAgLyoqXG4gICAqIFByZXNlcnZlIHRoZSBleGlzdGluZyBsaW5rIHN0eWxlLlxuICAgKi9cbiAgUHJlc2VydmVFeGlzdGluZyA9ICdQcmVzZXJ2ZUV4aXN0aW5nJyxcblxuICAvKipcbiAgICogRm9yY2UgdGhlIGxpbmsgdG8gYmUgaW4gd2lraWxpbmsgZm9ybWF0LlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldF1dYFxuICAgKiBAZXhhbXBsZSBgW1twYXRoL3RvL3RhcmdldHxhbGlhc11dYFxuICAgKi9cbiAgV2lraWxpbmsgPSAnV2lraWxpbmsnXG59XG5cbmVudW0gRmluYWxMaW5rUGF0aFN0eWxlIHtcbiAgQWJzb2x1dGVQYXRoSW5WYXVsdCA9ICdBYnNvbHV0ZVBhdGhJblZhdWx0JyxcbiAgUmVsYXRpdmVQYXRoVG9UaGVTb3VyY2UgPSAnUmVsYXRpdmVQYXRoVG9UaGVOb3RlJyxcbiAgU2hvcnRlc3RQYXRoV2hlblBvc3NpYmxlID0gJ1Nob3J0ZXN0UGF0aFdoZW5Qb3NzaWJsZSdcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgY29udmVydExpbmt9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnZlcnRMaW5rT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgZm9yIHRoZSBsaW5rLlxuICAgKi9cbiAgbGluazogUmVmZXJlbmNlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICBuZXdTb3VyY2VQYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvbGQgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIG9sZFNvdXJjZVBhdGhPckZpbGU/OiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVwZGF0ZSBmaWxlIG5hbWUgYWxpYXMuIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIHNob3VsZFVwZGF0ZUZpbGVOYW1lQWxpYXM/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBnZW5lcmF0ZU1hcmtkb3duTGlua30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuZXJhdGVNYXJrZG93bkxpbmtPcHRpb25zIHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIGZvciB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGUgYFtbYWxpYXN8bGlua11dYFxuICAgKiBAZXhhbXBsZSBgW2FsaWFzXShsaW5rLm1kKWBcbiAgICovXG4gIGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCBiZSBlbWJlZGRlZC4gSWYgbm90IHByb3ZpZGVkLCBpdCB3aWxsIGJlIGluZmVycmVkIGJhc2VkIG9uIHRoZSBmaWxlIHR5cGUuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYCFbW3RhcmdldF1dYC5cbiAgICpcbiAgICogSWYgYGZhbHNlYDogYFtbdGFyZ2V0XV1gLlxuICAgKi9cbiAgaXNFbWJlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYW4gZW1wdHkgYWxpYXMgZm9yIGVtYmVkcy4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYgdGhlIHJlc3VsdCBsaW5rIHN0eWxlIGlzIHtAbGluayBMaW5rU3R5bGUuTWFya2Rvd259LlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGAhW10oZm9vLnBuZylgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgIVtmb29dKGZvby5wbmcpYC5cbiAgICovXG4gIGlzRW1wdHlFbWJlZEFsaWFzQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgbm9uLWV4aXN0aW5nIGZpbGVzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgIGFuZCB7QGxpbmsgdGFyZ2V0UGF0aE9yRmlsZX0gaXMgYSBub24tZXhpc3RpbmcgZmlsZSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gICAqL1xuICBpc05vbkV4aXN0aW5nRmlsZUFsbG93ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGFsbG93IGEgc2luZ2xlIHN1YnBhdGguIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayB0YXJnZXRQYXRoT3JGaWxlfSBhbmQge0BsaW5rIHNvdXJjZVBhdGhPckZpbGV9IGFyZSB0aGUgc2FtZSBmaWxlLlxuICAgKlxuICAgKiBJZiBgdHJ1ZWA6IGBbWyNzdWJwYXRoXV1gLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tzb3VyY2Ujc3VicGF0aF1dYFxuICAgKi9cbiAgaXNTaW5nbGVTdWJwYXRoQWxsb3dlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgc3R5bGUgb2YgdGhlIGxpbmsgcGF0aC5cbiAgICovXG4gIGxpbmtQYXRoU3R5bGU/OiBMaW5rUGF0aFN0eWxlO1xuXG4gIC8qKlxuICAgKiBBIHN0eWxlIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgbGlua1N0eWxlPzogTGlua1N0eWxlO1xuXG4gIC8qKlxuICAgKiBBbiBvcmlnaW5hbCBsaW5rIHRleHQuXG4gICAqXG4gICAqIElmIHByb3ZpZGVkLCBpdCB3aWxsIGJlIHVzZWQgdG8gaW5mZXIgdGhlIHZhbHVlcyBvZlxuICAgKlxuICAgKiAtIHtAbGluayBpc0VtYmVkfVxuICAgKiAtIHtAbGluayBsaW5rU3R5bGV9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUFuZ2xlQnJhY2tldHN9XG4gICAqIC0ge0BsaW5rIHNob3VsZFVzZUxlYWRpbmdEb3RGb3JSZWxhdGl2ZVBhdGhzfVxuICAgKiAtIHtAbGluayBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzfVxuICAgKlxuICAgKiBUaGVzZSBpbmZlcnJlZCB2YWx1ZXMgd2lsbCBiZSBvdmVycmlkZGVuIGJ5IGNvcnJlc3BvbmRpbmcgc2V0dGluZ3MgaWYgc3BlY2lmaWVkLlxuICAgKi9cbiAgb3JpZ2luYWxMaW5rPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGVzY2FwZSB0aGUgYWxpYXMuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB0aGUgcmVzdWx0IGxpbmsgc3R5bGUgaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtcXCpcXCphbGlhc1xcKlxcKl0obGluay5tZClgLlxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgWyoqYWxpYXMqKl0obGluay5tZClgLlxuICAgKi9cbiAgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIGF0dGFjaG1lbnQgZXh0ZW5zaW9uIGluIHRoZSBlbWJlZCBhbGlhcy4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc0VtcHR5RW1iZWRBbGlhc0FsbG93ZWR9IGlzIGBmYWxzZWAuXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtmb28ucG5nXShmb28ucG5nKWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbZm9vXShmb28ucG5nKWAuXG4gICAqL1xuICBzaG91bGRJbmNsdWRlQXR0YWNobWVudEV4dGVuc2lvblRvRW1iZWRBbGlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBzaG91bGQgdXNlIGFuZ2xlIGJyYWNrZXRzLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKlxuICAgKiBBcHBsaWNhYmxlIG9ubHkgaWYge0BsaW5rIGxpbmtTdHlsZX0gaXMge0BsaW5rIExpbmtTdHlsZS5NYXJrZG93bn0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFthbGlhc10oPHBhdGggd2l0aCBzcGFjZXMubWQ+KWAuXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbYWxpYXNdKHBhdGglMjB3aXRoJTIwc3BhY2VzLm1kKWAuXG4gICAqL1xuICBzaG91bGRVc2VBbmdsZUJyYWNrZXRzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIHNob3VsZCB1c2UgYSBsZWFkaW5nIGRvdC4gRGVmYXVsdHMgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBsaW5rUGF0aFN0eWxlfSBpcyB7QGxpbmsgTGlua1BhdGhTdHlsZS5SZWxhdGl2ZVBhdGhUb1NvdXJjZX0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbLi9yZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKlxuICAgKiBJZiBgZmFsc2VgOiBgW1tyZWxhdGl2ZS9wYXRoL3RvL3RhcmdldF1dYFxuICAgKi9cbiAgc2hvdWxkVXNlTGVhZGluZ0RvdEZvclJlbGF0aXZlUGF0aHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgc2hvdWxkIHVzZSBhIGxlYWRpbmcgc2xhc2guIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEFwcGxpY2FibGUgb25seSBpZiB7QGxpbmsgbGlua1BhdGhTdHlsZX0gaXMge0BsaW5rIExpbmtQYXRoU3R5bGUuQWJzb2x1dGVQYXRoSW5WYXVsdH0uXG4gICAqXG4gICAqIElmIGB0cnVlYDogYFtbL2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqXG4gICAqIElmIGBmYWxzZWA6IGBbW2Fic29sdXRlL3BhdGgvdG8vdGFyZ2V0XV1gXG4gICAqL1xuICBzaG91bGRVc2VMZWFkaW5nU2xhc2hGb3JBYnNvbHV0ZVBhdGhzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSBzb3VyY2UgcGF0aCBvZiB0aGUgbGluay5cbiAgICovXG4gIHNvdXJjZVBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIEEgc3VicGF0aCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogU2hvdWxkIGJlIGVtcHR5IG9yIHN0YXJ0IHdpdGggYCNgLlxuICAgKlxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtZW1wdHktc3VicGF0aF1dYFxuICAgKiBAZXhhbXBsZSBgW1tsaW5rLXdpdGgtc3VicGF0aCNzdWJwYXRoXV1gXG4gICAqIEBleGFtcGxlIGBbW2xpbmstd2l0aC1zdWJwYXRoI3N1YnBhdGgjbmVzdGVkLXN1YnBhdGhdXWBcbiAgICovXG4gIHN1YnBhdGg/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgdGFyZ2V0IHBhdGggb3IgZmlsZS5cbiAgICovXG4gIHRhcmdldFBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGdlbmVyYXRlUmF3TWFya2Rvd25MaW5rfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5lcmF0ZVJhd01hcmtkb3duTGlua09wdGlvbnMge1xuICAvKipcbiAgICogQW4gYWxpYXMgb2YgdGhlIGxpbmsuIERlZmF1bHRzIHRvIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgYWxpYXM/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxpbmsgc2hvdWxkIGJlIGFuIGVtYmVkIGxpbmsuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gICAqL1xuICBpc0VtYmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGluayBzaG91bGQgYmUgYSB3aWtpbGluay5cbiAgICovXG4gIGlzV2lraWxpbms6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gZXNjYXBlIHRoZSBhbGlhcy4gQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc1dpa2lsaW5rfSBpcyBgZmFsc2VgLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgc2hvdWxkRXNjYXBlQWxpYXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVzZSBhbmdsZSBicmFja2V0cy4gQXBwbGljYWJsZSBvbmx5IGlmIHtAbGluayBpc1dpa2lsaW5rfSBpcyBgZmFsc2VgLiBEZWZhdWx0cyB0byBgZmFsc2VgLlxuICAgKi9cbiAgc2hvdWxkVXNlQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgdGl0bGUgb2YgdGhlIGxpbmsuXG4gICAqL1xuICB0aXRsZT86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gVVJMIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgdXJsOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSByZXN1bHQgb2YgcGFyc2luZyBhIGxpbmsuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VMaW5rUmVzdWx0IHtcbiAgLyoqXG4gICAqIEFuIGFsaWFzIG9mIHRoZSBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW1xcKmFsaWFzXFwqXShsaW5rLm1kKSAtPiBcXCphbGlhc1xcKlxuICAgKiBgYGBcbiAgICovXG4gIGFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmNvZGVkIFVSTCBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oPGxpbmsgd2l0aCBzcGFjZS5tZD4pIC0+IGxpbmslMjB3aXRoJTIwc3BhY2UubWRcbiAgICogYGBgXG4gICAqL1xuICBlbmNvZGVkVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBlbmQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgZW5kT2Zmc2V0OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBoYXMgYW5nbGUgYnJhY2tldHMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKDxsaW5rLm1kPikgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgaGFzQW5nbGVCcmFja2V0cz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBhbiBlbWJlZCBsaW5rLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogIVtbYWxpYXNdXSAtPiB0cnVlXG4gICAqIFtbYWxpYXNdXSAtPiBmYWxzZVxuICAgKiBgYGBcbiAgICovXG4gIGlzRW1iZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgbGluayBpcyBleHRlcm5hbC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10oaHR0cHM6Ly9leGFtcGxlLmNvbSkgLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGZpbGUubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgaXNFeHRlcm5hbDogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSBsaW5rIGlzIGEgd2lraWxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbW2FsaWFzXV0gLT4gdHJ1ZVxuICAgKiBbYWxpYXNdKGxpbmsubWQpIC0+IGZhbHNlXG4gICAqIGBgYFxuICAgKi9cbiAgaXNXaWtpbGluazogYm9vbGVhbjtcblxuICAvKipcbiAgICogQSByYXcgbGluayB0ZXh0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGBcbiAgICogW2FsaWFzXShsaW5rLm1kKSAtPiBbYWxpYXNdKGxpbmsubWQpXG4gICAqIGBgYFxuICAgKi9cbiAgcmF3OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgc3RhcnQgb2Zmc2V0IG9mIHRoZSBsaW5rIGluIHRoZSBvcmlnaW5hbCB0ZXh0LlxuICAgKi9cbiAgc3RhcnRPZmZzZXQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQSB0aXRsZSBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFthbGlhc10obGluay5tZCBcInRpdGxlXCIpIC0+IHRpdGxlXG4gICAqIGBgYFxuICAgKi9cbiAgdGl0bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIHVuZXNjYXBlZCBhbGlhcyBvZiB0aGUgbGluay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgXG4gICAqIFtcXCphbGlhc1xcKl0obGluay5tZCkgLT4gKmFsaWFzKlxuICAgKiBgYGBcbiAgICovXG4gIHVuZXNjYXBlZEFsaWFzPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBVUkwgb2YgdGhlIGxpbmsuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYFxuICAgKiBbYWxpYXNdKGxpbmslMjB3aXRoJTIwc3BhY2UubWQpIC0+IGxpbmsgd2l0aCBzcGFjZS5tZFxuICAgKiBgYGBcbiAgICovXG4gIHVybDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBzaG91bGRSZXNldEFsaWFzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTaG91bGRSZXNldEFsaWFzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBBbiBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqL1xuICBhcHA6IEFwcDtcblxuICAvKipcbiAgICogQSBkaXNwbGF5IHRleHQgb2YgdGhlIGxpbmsuXG4gICAqL1xuICBkaXNwbGF5VGV4dDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGxpbmsgaXMgYSB3aWtpbGluay5cbiAgICovXG4gIGlzV2lraWxpbms/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBIHNvdXJjZSBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgbmV3U291cmNlUGF0aE9yRmlsZTogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGxpbmsuXG4gICAqL1xuICBvbGRTb3VyY2VQYXRoT3JGaWxlPzogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQW4gb2xkIHRhcmdldCBwYXRoIG9mIHRoZSBsaW5rLlxuICAgKi9cbiAgb2xkVGFyZ2V0UGF0aDogUGF0aE9yRmlsZTtcblxuICAvKipcbiAgICogQSB0YXJnZXQgcGF0aCBvciBmaWxlLlxuICAgKi9cbiAgdGFyZ2V0UGF0aE9yRmlsZTogUGF0aE9yRmlsZTt