javascript
var{defineProperty:g,getOwnPropertyNames:V,getOwnPropertyDescriptor:M}=Object,D=Object.prototype.hasOwnProperty;function H(e){return this[e]}var L=(e)=>{var t=(w??=new WeakMap).get(e),n;if(t)return t;if(t=g({},"__esModule",{value:!0}),e&&typeof e==="object"||typeof e==="function"){for(var i of V(e))if(!D.call(t,i))g(t,i,{get:H.bind(e,i),enumerable:!(n=M(e,i))||n.enumerable})}return w.set(e,t),t},w;var b=(e)=>e;function N(e,t){this[e]=b.bind(null,t)}var $=(e,t)=>{for(var n in t)g(e,n,{get:t[n],enumerable:!0,configurable:!0,set:N.bind(t,n)})};var y={};$(y,{default:()=>x});module.exports=L(y);var o=require("obsidian");var c={autoUpdate:!1,changelogPath:"Changelog.md",datetimeFormat:"YYYY-MM-DD[T]HHmm",maxRecentFiles:25,excludedFolders:[],useWikiLinks:!0,changelogHeading:""},p=500;function h(e){let t=Number(e);if(!Number.isFinite(t))return c.maxRecentFiles;return Math.max(1,Math.min(Math.floor(t),500))}function E(e,t){let n=e??{},i=new Set(Object.keys(c)),d={};for(let s of Object.keys(n))if(i.has(s))d[s]=n[s];let l={...c,...d};for(let s of["changelogPath","changelogHeading","datetimeFormat"])if(typeof l[s]!=="string")l[s]=c[s];for(let s of["autoUpdate","useWikiLinks"])if(typeof l[s]!=="boolean")l[s]=c[s];if(!Array.isArray(l.excludedFolders)||!l.excludedFolders.every((s)=>typeof s==="string"))l.excludedFolders=c.excludedFolders;return l.changelogPath=t(l.changelogPath),l.excludedFolders=l.excludedFolders.map(t),l.maxRecentFiles=h(l.maxRecentFiles),l.changelogHeading=l.changelogHeading.trim(),l}function f(e){return e.endsWith(".md")}function C(e,t){if(!e||e===".")return"invalid";if(t.includes(e))return"duplicate";return"ok"}function P(e,t,n,i){return e.filter((d)=>{if(d.path===t)return!1;for(let l of n)if(d.path.startsWith(l.endsWith("/")?l:`${l}/`))return!1;return!0}).sort((d,l)=>l.stat.mtime-d.stat.mtime).slice(0,i)}function S(e,t,n,i,d){let l=i?`${i}
`:"";for(let s of e){let u=d(s.stat.mtime,t),r=n?`[[${s.basename}]]`:s.basename;l+=`- ${u} · ${r}
`}return l}var a=require("obsidian");class m extends a.AbstractInputSuggest{inputEl;cachedPaths=null;constructor(e,t){super(e,t);this.inputEl=t}getPaths(){if(this.cachedPaths)return this.cachedPaths;let e=[];for(let t of this.app.vault.getAllFolders())e.push(`${t.path}/`);for(let t of this.app.vault.getFiles())if(t.extension==="md")e.push(t.path);return this.cachedPaths=e,e}getSuggestions(e){let t=e.toLowerCase();return this.getPaths().filter((n)=>n.toLowerCase().contains(t))}renderSuggestion(e,t){t.setText(e)}selectSuggestion(e){this.inputEl.value=e,this.inputEl.trigger("input"),this.inputEl.dispatchEvent(new Event("blur")),this.close()}}class v extends a.PluginSettingTab{plugin;constructor(e,t){super(e,t);this.plugin=t}renderExcludedFolders(e){if(e.empty(),this.plugin.settings.excludedFolders.length===0){e.createDiv({text:"No excluded folders"});return}this.plugin.settings.excludedFolders.forEach((t)=>{let n=e.createDiv("excluded-folder-item");n.createSpan({text:t}),n.createEl("button",{text:"✕",cls:"excluded-folder-remove",attr:{"aria-label":"Remove excluded folder"}}).addEventListener("click",()=>{let d=this.plugin.settings.excludedFolders.indexOf(t);if(d>-1)this.plugin.settings.excludedFolders.splice(d,1),this.plugin.saveSettingsSafely(),this.renderExcludedFolders(e)})})}display(){let{containerEl:e}=this,{settings:t}=this.plugin;e.empty(),new a.Setting(e).setName("Auto update").setDesc("Automatically update changelog on vault changes").addToggle((s)=>s.setValue(t.autoUpdate).onChange((u)=>{t.autoUpdate=u,this.plugin.saveSettingsSafely()})),new a.Setting(e).setName("Changelog path").setDesc("Relative path including filename and extension").addText((s)=>{s.setPlaceholder("Folder/Changelog.md").setValue(t.changelogPath),s.inputEl.addEventListener("blur",()=>{let u=a.normalizePath(s.getValue());if(!f(u)){s.setValue(t.changelogPath),new a.Notice("Changelog path must end with .md");return}t.changelogPath=u,this.plugin.saveSettingsSafely()}),new m(this.app,s.inputEl)});let n;n=new a.Setting(e).setName("Datetime format").setDesc("Moment.js format string").addText((s)=>s.setPlaceholder("YYYY-MM-DD[T]HHmm").setValue(t.datetimeFormat).onChange((u)=>{let r=u||c.datetimeFormat;if(!u)s.setValue(r);t.datetimeFormat=r,n.textContent=`Preview: ${window.moment().format(r)}`,this.plugin.saveSettingsSafely()})).descEl.createDiv({text:`Preview: ${window.moment().format(t.datetimeFormat)}`}),new a.Setting(e).setName("Max recent files").setDesc(`Maximum number of recently edited files to include (1–${p})`).addText((s)=>{s.setValue(t.maxRecentFiles.toString()),s.inputEl.addEventListener("blur",()=>{let u=Number(s.getValue());if(Number.isNaN(u)||u<1){s.setValue(t.maxRecentFiles.toString()),new a.Notice(`Max recent files must be between 1 and ${p}`);return}let r=h(u);t.maxRecentFiles=r,s.setValue(r.toString()),this.plugin.saveSettingsSafely()})}),new a.Setting(e).setName("Use wiki-links").setDesc("Format filenames as wiki-links [[note]] instead of plain text").addToggle((s)=>s.setValue(t.useWikiLinks).onChange((u)=>{t.useWikiLinks=u,this.plugin.saveSettingsSafely()})),new a.Setting(e).setName("Changelog heading").setDesc("Optional heading to prepend to the changelog, written literally (e.g., # Changelog). Leave empty for no heading.").addText((s)=>s.setPlaceholder("# Changelog").setValue(t.changelogHeading).onChange((u)=>{t.changelogHeading=u.trim(),this.plugin.saveSettingsSafely()})),new a.Setting(e).setName("Excluded folders").setHeading();let d=e.createDiv("excluded-folders-list");this.renderExcludedFolders(d);let l;new a.Setting(e).setName("Add excluded folder").setDesc("Folders to exclude from the changelog").addText((s)=>{s.setPlaceholder("folder/path/"),l=s.inputEl,new m(this.app,l)}).addButton((s)=>{s.setButtonText("Add").onClick(()=>{let u=a.normalizePath(l.value),r=C(u,t.excludedFolders);if(r==="invalid"){new a.Notice("Excluded folder path cannot be empty or the vault root");return}if(r==="ok")t.excludedFolders.push(u),this.plugin.saveSettingsSafely(),l.value="",this.renderExcludedFolders(d)})})}}class x extends o.Plugin{settings=c;debouncedVaultChange=o.debounce(()=>{this.updateChangelog().catch(()=>{new o.Notice("Failed to update changelog")})},200);async onload(){await this.loadSettings(),this.addSettingTab(new v(this.app,this)),this.addCommand({id:"update-changelog",name:"Update Changelog",callback:()=>{this.updateChangelog().catch(()=>{new o.Notice("Failed to update changelog")})}});let e=(t)=>{if(this.settings.autoUpdate&&t instanceof o.TFile&&t.path!==this.settings.changelogPath)this.debouncedVaultChange()};this.registerEvent(this.app.vault.on("modify",e)),this.registerEvent(this.app.vault.on("delete",e)),this.registerEvent(this.app.vault.on("rename",e))}async updateChangelog(){let e=P(this.app.vault.getMarkdownFiles(),this.settings.changelogPath,this.settings.excludedFolders,this.settings.maxRecentFiles),t=S(e,this.settings.datetimeFormat,this.settings.useWikiLinks,this.settings.changelogHeading,(n,i)=>window.moment(n).format(i));await this.writeToFile(this.settings.changelogPath,t)}async writeToFile(e,t){let n=this.app.vault.getAbstractFileByPath(e);if(!n)try{n=await this.app.vault.create(e,"")}catch{if(n=this.app.vault.getAbstractFileByPath(e),!n)throw Error(`Failed to create changelog at: ${e}`)}if(n instanceof o.TFile)await this.app.vault.modify(n,t);else new o.Notice(`Could not update changelog at path: ${e}`)}async loadSettings(){this.settings=E(await this.loadData(),o.normalizePath)}onunload(){}async saveSettings(){await this.saveData(this.settings)}saveSettingsSafely(){this.saveSettings().catch(()=>{new o.Notice("Failed to save changelog settings")})}}
/* nosourcemap */