/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/

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());
  });
};

// main.ts
__export(exports, {
  default: () => Waypoint
});
var import_obsidian = __toModule(require("obsidian"));
var FolderNoteType;
(function(FolderNoteType2) {
  FolderNoteType2["InsideFolder"] = "INSIDE_FOLDER";
  FolderNoteType2["OutsideFolder"] = "OUTSIDE_FOLDER";
})(FolderNoteType || (FolderNoteType = {}));
var DEFAULT_SETTINGS = {
  waypointFlag: "%% Waypoint %%",
  stopScanAtFolderNotes: false,
  showFolderNotes: false,
  showNonMarkdownFiles: false,
  debugLogging: false,
  useWikiLinks: true,
  showEnclosingNote: false,
  folderNoteType: FolderNoteType.InsideFolder
};
var _Waypoint = class extends import_obsidian.Plugin {
  constructor() {
    super(...arguments);
    this.foldersWithChanges = new Set();
    this.detectWaypointFlag = (file) => __async(this, null, function* () {
      this.log("Modification on " + file.name);
      this.log("Scanning for Waypoint flags...");
      const text = yield this.app.vault.cachedRead(file);
      const lines = text.split("\n");
      for (let i = 0; i < lines.length; i++) {
        if (lines[i].trim() === this.settings.waypointFlag) {
          if (this.isFolderNote(file)) {
            this.log("Found waypoint flag in folder note!");
            yield this.updateWaypoint(file);
            yield this.updateParentWaypoint(file.parent, this.settings.folderNoteType === FolderNoteType.OutsideFolder);
            return;
          } else if (file.parent.isRoot()) {
            this.log("Found waypoint flag in root folder.");
            this.printWaypointError(file, `%% Error: Cannot create a waypoint in the root folder of your vault. For more information, check the instructions [here](https://github.com/IdreesInc/Waypoint) %%`);
            return;
          } else {
            this.log("Found waypoint flag in invalid note.");
            this.printWaypointError(file, `%% Error: Cannot create a waypoint in a note that's not the folder note. For more information, check the instructions [here](https://github.com/IdreesInc/Waypoint) %%`);
            return;
          }
        }
      }
      this.log("No waypoint flags found.");
    });
    this.updateChangedFolders = () => __async(this, null, function* () {
      this.log("Updating changed folders...");
      this.foldersWithChanges.forEach((folder) => {
        this.log("Updating " + folder.path);
        this.updateParentWaypoint(folder, true);
      });
      this.foldersWithChanges.clear();
    });
    this.scheduleUpdate = (0, import_obsidian.debounce)(this.updateChangedFolders.bind(this), 500, true);
    this.updateParentWaypoint = (node, includeCurrentNode) => __async(this, null, function* () {
      const parentWaypoint = yield this.locateParentWaypoint(node, includeCurrentNode);
      if (parentWaypoint !== null) {
        this.updateWaypoint(parentWaypoint);
      }
    });
  }
  onload() {
    return __async(this, null, function* () {
      yield this.loadSettings();
      this.app.workspace.onLayoutReady(() => __async(this, null, function* () {
        this.registerEvent(this.app.vault.on("create", (file) => {
          this.log("create " + file.name);
          this.foldersWithChanges.add(file.parent);
          this.scheduleUpdate();
        }));
        this.registerEvent(this.app.vault.on("delete", (file) => {
          this.log("delete " + file.name);
          const parentFolder = this.getParentFolder(file.path);
          if (parentFolder !== null) {
            this.foldersWithChanges.add(parentFolder);
            this.scheduleUpdate();
          }
        }));
        this.registerEvent(this.app.vault.on("rename", (file, oldPath) => {
          this.log("rename " + file.name);
          this.foldersWithChanges.add(file.parent);
          const parentFolder = this.getParentFolder(oldPath);
          if (parentFolder !== null) {
            this.foldersWithChanges.add(parentFolder);
          }
          this.scheduleUpdate();
        }));
        this.registerEvent(this.app.vault.on("modify", this.detectWaypointFlag));
      }));
      this.addSettingTab(new WaypointSettingsTab(this.app, this));
    });
  }
  onunload() {
  }
  isFolderNote(file) {
    if (this.settings.folderNoteType === FolderNoteType.InsideFolder) {
      return file.basename == file.parent.name;
    } else if (this.settings.folderNoteType === FolderNoteType.OutsideFolder) {
      if (file.parent) {
        return this.app.vault.getAbstractFileByPath(this.getCleanParentPath(file) + file.basename) instanceof import_obsidian.TFolder;
      }
      return false;
    }
  }
  getCleanParentPath(node) {
    if (node.parent instanceof import_obsidian.TFolder && node.parent.isRoot()) {
      return "";
    } else {
      return node.parent.path + "/";
    }
  }
  printWaypointError(file, error) {
    return __async(this, null, function* () {
      this.log("Creating waypoint error in " + file.path);
      const text = yield this.app.vault.read(file);
      const lines = text.split("\n");
      let waypointIndex = -1;
      for (let i = 0; i < lines.length; i++) {
        const trimmed = lines[i].trim();
        if (trimmed === this.settings.waypointFlag) {
          waypointIndex = i;
        }
      }
      if (waypointIndex === -1) {
        console.error("Error: No waypoint flag found while trying to print error.");
        return;
      }
      lines.splice(waypointIndex, 1, error);
      yield this.app.vault.modify(file, lines.join("\n"));
    });
  }
  updateWaypoint(file) {
    return __async(this, null, function* () {
      this.log("Updating waypoint in " + file.path);
      let fileTree;
      if (this.settings.folderNoteType === FolderNoteType.InsideFolder) {
        fileTree = yield this.getFileTreeRepresentation(file.parent, file.parent, 0, true);
      } else if (this.settings.folderNoteType === FolderNoteType.OutsideFolder) {
        const folder = this.app.vault.getAbstractFileByPath(this.getCleanParentPath(file) + file.basename);
        if (folder instanceof import_obsidian.TFolder) {
          fileTree = yield this.getFileTreeRepresentation(file.parent, folder, 0, true);
        }
      }
      const waypoint = `${_Waypoint.BEGIN_WAYPOINT}
${fileTree}

${_Waypoint.END_WAYPOINT}`;
      const text = yield this.app.vault.read(file);
      const lines = text.split("\n");
      let waypointStart = -1;
      let waypointEnd = -1;
      for (let i = 0; i < lines.length; i++) {
        const trimmed = lines[i].trim();
        if (waypointStart === -1 && (trimmed === this.settings.waypointFlag || trimmed === _Waypoint.BEGIN_WAYPOINT)) {
          waypointStart = i;
        } else if (waypointStart !== -1 && trimmed === _Waypoint.END_WAYPOINT) {
          waypointEnd = i;
          break;
        }
      }
      if (waypointStart === -1) {
        console.error("Error: No waypoint found while trying to update " + file.path);
        return;
      }
      this.log("Waypoint found at " + waypointStart + " to " + waypointEnd);
      lines.splice(waypointStart, waypointEnd !== -1 ? waypointEnd - waypointStart + 1 : 1, waypoint);
      yield this.app.vault.modify(file, lines.join("\n"));
    });
  }
  getFileTreeRepresentation(rootNode, node, indentLevel, topLevel = false) {
    return __async(this, null, function* () {
      const bullet = "	".repeat(indentLevel) + "-";
      if (node instanceof import_obsidian.TFile) {
        console.log(node);
        if (node.extension == "md") {
          if (this.settings.useWikiLinks) {
            return `${bullet} [[${node.basename}]]`;
          } else {
            return `${bullet} [${node.basename}](${this.getEncodedUri(rootNode, node)})`;
          }
        } else if (this.settings.showNonMarkdownFiles) {
          if (this.settings.useWikiLinks) {
            return `${bullet} [[${node.name}]]`;
          } else {
            return `${bullet} [${node.name}](${this.getEncodedUri(rootNode, node)})`;
          }
        }
        return null;
      } else if (node instanceof import_obsidian.TFolder) {
        let text = "";
        if (!topLevel || this.settings.showEnclosingNote) {
          text = `${bullet} **${node.name}**`;
          let folderNote;
          if (this.settings.folderNoteType === FolderNoteType.InsideFolder) {
            folderNote = this.app.vault.getAbstractFileByPath(node.path + "/" + node.name + ".md");
          } else if (this.settings.folderNoteType === FolderNoteType.OutsideFolder) {
            if (node.parent) {
              folderNote = this.app.vault.getAbstractFileByPath(node.parent.path + "/" + node.name + ".md");
            }
          }
          if (folderNote instanceof import_obsidian.TFile) {
            if (this.settings.useWikiLinks) {
              text = `${bullet} **[[${folderNote.basename}]]**`;
            } else {
              text = `${bullet} **[${folderNote.basename}](${this.getEncodedUri(rootNode, folderNote)})**`;
            }
            if (!topLevel) {
              if (this.settings.stopScanAtFolderNotes) {
                return text;
              } else {
                const content = yield this.app.vault.cachedRead(folderNote);
                if (content.includes(_Waypoint.BEGIN_WAYPOINT) || content.includes(this.settings.waypointFlag)) {
                  return text;
                }
              }
            }
          }
        }
        if (node.children && node.children.length > 0) {
          let children = node.children;
          children = children.sort((a, b) => {
            return a.name.localeCompare(b.name, void 0, { numeric: true, sensitivity: "base" });
          });
          if (!this.settings.showFolderNotes) {
            if (this.settings.folderNoteType === FolderNoteType.InsideFolder) {
              children = children.filter((child) => this.settings.showFolderNotes || child.name !== node.name + ".md");
            } else if (this.settings.folderNoteType === FolderNoteType.OutsideFolder) {
              const folderNames = new Set();
              for (const element of children) {
                if (element instanceof import_obsidian.TFolder) {
                  folderNames.add(element.name + ".md");
                }
              }
              children = children.filter((child) => child instanceof import_obsidian.TFolder || !folderNames.has(child.name));
            }
          }
          if (children.length > 0) {
            const nextIndentLevel = topLevel && !this.settings.showEnclosingNote ? indentLevel : indentLevel + 1;
            text += (text === "" ? "" : "\n") + (yield Promise.all(children.map((child) => this.getFileTreeRepresentation(rootNode, child, nextIndentLevel)))).filter(Boolean).join("\n");
          }
          return text;
        } else {
          return `${bullet} **${node.name}**`;
        }
      }
      return null;
    });
  }
  getEncodedUri(rootNode, node) {
    if (rootNode.isRoot()) {
      return `./${encodeURI(node.path)}`;
    }
    return `./${encodeURI(node.path.substring(rootNode.path.length + 1))}`;
  }
  locateParentWaypoint(node, includeCurrentNode) {
    return __async(this, null, function* () {
      this.log("Locating parent waypoint of " + node.name);
      let folder = includeCurrentNode ? node : node.parent;
      while (folder) {
        let folderNote;
        if (this.settings.folderNoteType === FolderNoteType.InsideFolder) {
          folderNote = this.app.vault.getAbstractFileByPath(folder.path + "/" + folder.name + ".md");
        } else if (this.settings.folderNoteType === FolderNoteType.OutsideFolder) {
          if (folder.parent) {
            folderNote = this.app.vault.getAbstractFileByPath(this.getCleanParentPath(folder) + folder.name + ".md");
          }
        }
        if (folderNote instanceof import_obsidian.TFile) {
          this.log("Found folder note: " + folderNote.path);
          const text = yield this.app.vault.cachedRead(folderNote);
          if (text.includes(_Waypoint.BEGIN_WAYPOINT) || text.includes(this.settings.waypointFlag)) {
            this.log("Found parent waypoint!");
            return folderNote;
          }
        }
        folder = folder.parent;
      }
      this.log("No parent waypoint found.");
      return null;
    });
  }
  getParentFolder(path) {
    const abstractFile = this.app.vault.getAbstractFileByPath(path.split("/").slice(0, -1).join("/"));
    if (abstractFile instanceof import_obsidian.TFolder) {
      return abstractFile;
    } else {
      return null;
    }
  }
  log(message) {
    if (this.settings.debugLogging) {
      console.log(message);
    }
  }
  loadSettings() {
    return __async(this, null, function* () {
      this.settings = Object.assign({}, DEFAULT_SETTINGS, yield this.loadData());
    });
  }
  saveSettings() {
    return __async(this, null, function* () {
      yield this.saveData(this.settings);
    });
  }
};
var Waypoint = _Waypoint;
Waypoint.BEGIN_WAYPOINT = "%% Begin Waypoint %%";
Waypoint.END_WAYPOINT = "%% End Waypoint %%";
var WaypointSettingsTab = class extends import_obsidian.PluginSettingTab {
  constructor(app, plugin) {
    super(app, plugin);
    this.plugin = plugin;
  }
  display() {
    const { containerEl } = this;
    containerEl.empty();
    containerEl.createEl("h2", { text: "Waypoint Settings" });
    new import_obsidian.Setting(this.containerEl).setName("Folder Note Style").setDesc("Select the style of folder note used.").addDropdown((dropdown) => dropdown.addOption(FolderNoteType.InsideFolder, "Folder Name Inside").addOption(FolderNoteType.OutsideFolder, "Folder Name Outside").setValue(this.plugin.settings.folderNoteType).onChange((value) => __async(this, null, function* () {
      this.plugin.settings.folderNoteType = value;
      yield this.plugin.saveSettings();
    })));
    new import_obsidian.Setting(containerEl).setName("Show Folder Notes").setDesc("If enabled, folder notes will be listed alongside other notes in the generated waypoints.").addToggle((toggle) => toggle.setValue(this.plugin.settings.showFolderNotes).onChange((value) => __async(this, null, function* () {
      this.plugin.settings.showFolderNotes = value;
      yield this.plugin.saveSettings();
    })));
    new import_obsidian.Setting(containerEl).setName("Show Non-Markdown Files").setDesc("If enabled, non-Markdown files will be listed alongside other notes in the generated waypoints.").addToggle((toggle) => toggle.setValue(this.plugin.settings.showNonMarkdownFiles).onChange((value) => __async(this, null, function* () {
      this.plugin.settings.showNonMarkdownFiles = value;
      yield this.plugin.saveSettings();
    })));
    new import_obsidian.Setting(containerEl).setName("Show Enclosing Note").setDesc("If enabled, the name of the folder note containing the waypoint will be listed at the top of the generated waypoints.").addToggle((toggle) => toggle.setValue(this.plugin.settings.showEnclosingNote).onChange((value) => __async(this, null, function* () {
      this.plugin.settings.showEnclosingNote = value;
      yield this.plugin.saveSettings();
    })));
    new import_obsidian.Setting(containerEl).setName("Stop Scan at Folder Notes").setDesc("If enabled, the waypoint generator will stop scanning nested folders when it encounters a folder note. Otherwise, it will only stop if the folder note contains a waypoint.").addToggle((toggle) => toggle.setValue(this.plugin.settings.stopScanAtFolderNotes).onChange((value) => __async(this, null, function* () {
      this.plugin.settings.stopScanAtFolderNotes = value;
      yield this.plugin.saveSettings();
    })));
    new import_obsidian.Setting(containerEl).setName("Use WikiLinks").setDesc("If enabled, links will be generated like [[My Page]] instead of [My Page](../Folder/My%Page.md).").addToggle((toggle) => toggle.setValue(this.plugin.settings.useWikiLinks).onChange((value) => __async(this, null, function* () {
      this.plugin.settings.useWikiLinks = value;
      yield this.plugin.saveSettings();
    })));
    new import_obsidian.Setting(containerEl).setName("Waypoint Flag").setDesc("Text flag that triggers waypoint generation in a folder note. Must be surrounded by double-percent signs.").addText((text) => text.setPlaceholder(DEFAULT_SETTINGS.waypointFlag).setValue(this.plugin.settings.waypointFlag).onChange((value) => __async(this, null, function* () {
      if (value && value.startsWith("%%") && value.endsWith("%%") && value !== "%%" && value !== "%%%" && value !== "%%%%") {
        this.plugin.settings.waypointFlag = value;
      } else {
        this.plugin.settings.waypointFlag = DEFAULT_SETTINGS.waypointFlag;
        console.error("Error: Waypoint flag must be surrounded by double-percent signs.");
      }
      yield this.plugin.saveSettings();
    })));
    const postscriptElement = containerEl.createEl("div", {
      cls: "setting-item"
    });
    const descriptionElement = postscriptElement.createDiv({ cls: "setting-item-description" });
    descriptionElement.createSpan({ text: "For instructions on how to use this plugin, check out the README on " });
    descriptionElement.createEl("a", { attr: { "href": "https://github.com/IdreesInc/Waypoint" }, text: "GitHub" });
    descriptionElement.createSpan({ text: " or get in touch with the author " });
    descriptionElement.createEl("a", { attr: { "href": "https://twitter.com/IdreesInc" }, text: "@IdreesInc" });
    postscriptElement.appendChild(descriptionElement);
  }
};
