From 70e6a4ef824f5f6fd6889a2a7e4caf00eb74b702 Mon Sep 17 00:00:00 2001 From: sstent Date: Tue, 17 Feb 2026 14:39:39 -0800 Subject: [PATCH] Fix: Final working v0.3.11 build with correct function mapping --- PLUG.md | 4 +- icalendar.plug.js | 6 +- icalendar.plug.yaml | 8 +- icalendar.ts | 192 +++++++++----------------------------------- 4 files changed, 47 insertions(+), 163 deletions(-) diff --git a/PLUG.md b/PLUG.md index 3857e2c..298355e 100644 --- a/PLUG.md +++ b/PLUG.md @@ -1,8 +1,8 @@ --- name: Library/sstent/icalendar -version: 0.3.1 +version: 0.3.11 tags: meta/library files: - icalendar.plug.js --- -iCalendar sync plug for SilverBullet. \ No newline at end of file +iCalendar sync plug for SilverBullet. diff --git a/icalendar.plug.js b/icalendar.plug.js index 9ff33ac..838a56f 100644 --- a/icalendar.plug.js +++ b/icalendar.plug.js @@ -1,4 +1,4 @@ -var yt=Object.defineProperty;var L=(e,t)=>{for(var r in t)yt(e,r,{get:t[r],enumerable:!0})};function fe(e){let t=atob(e),r=t.length,n=new Uint8Array(r);for(let o=0;o(...n)=>{let o=this.prefix?[this.prefix,...n]:n;this.originalConsole[r](...o),this.captureLog(r,n)};console.log=t("log"),console.info=t("info"),console.warn=t("warn"),console.error=t("error"),console.debug=t("debug")}captureLog(t,r){let n={level:t,timestamp:Date.now(),message:r.map(o=>{if(typeof o=="string")return o;try{return JSON.stringify(o)}catch{return String(o)}}).join(" ")};this.logBuffer.push(n),this.logBuffer.length>this.maxCaptureSize&&this.logBuffer.shift()}async postToServer(t,r){if(this.logBuffer.length>0){let o=[...this.logBuffer];this.logBuffer=[];try{if(!(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o.map(a=>({...a,source:r})))})).ok)throw new Error("Failed to post logs to server")}catch(i){console.warn("Could not post logs to server",i.message),this.logBuffer.unshift(...o)}}}},me;function ye(e=""){return me=new Z(e),me}var z=e=>{throw new Error("Not initialized yet")},ee=typeof window>"u"&&typeof globalThis.WebSocketPair>"u";typeof Deno>"u"&&(self.Deno={args:[],build:{arch:"x86_64"},env:{get(){}}});var X=new Map,Q=0;ee&&(globalThis.syscall=async(e,...t)=>await new Promise((r,n)=>{Q++,X.set(Q,{resolve:r,reject:n}),z({type:"sys",id:Q,name:e,args:t})}));function Ee(e,t,r){ee&&(z=r,self.addEventListener("message",n=>{(async()=>{let o=n.data;switch(o.type){case"inv":{let i=e[o.name];if(!i)throw new Error(`Function not loaded: ${o.name}`);try{let a=await Promise.resolve(i(...o.args||[]));z({type:"invr",id:o.id,result:a})}catch(a){console.error("An exception was thrown as a result of invoking function",o.name,"error:",a.message),z({type:"invr",id:o.id,error:a.message})}}break;case"sysr":{let i=o.id,a=X.get(i);if(!a)throw Error("Invalid request id");X.delete(i),o.error?a.reject(new Error(o.error)):a.resolve(o.result)}break}})().catch(console.error)}),z({type:"manifest",manifest:t}),ye(`[${t.name} plug]`))}async function Et(e,t){if(typeof e!="string"){let r=new Uint8Array(await e.arrayBuffer()),n=r.length>0?J(r):void 0;t={method:e.method,headers:Object.fromEntries(e.headers.entries()),base64Body:n},e=e.url}return syscall("sandboxFetch.fetch",e,t)}globalThis.nativeFetch=globalThis.fetch;function gt(){globalThis.fetch=async function(e,t){let r=t&&t.body?J(new Uint8Array(await new Response(t.body).arrayBuffer())):void 0,n=await Et(e,t&&{method:t.method,headers:t.headers,base64Body:r});return new Response(n.base64Body?fe(n.base64Body):null,{status:n.status,headers:n.headers})}}ee&>();var x={};L(x,{alert:()=>nn,configureVimMode:()=>Sn,confirm:()=>tn,copyToClipboard:()=>fn,deleteLine:()=>mn,dispatch:()=>Xt,downloadFile:()=>Pt,filterBox:()=>$t,flashNotification:()=>_t,fold:()=>an,foldAll:()=>un,getCurrentEditor:()=>xt,getCurrentPage:()=>Tt,getCurrentPageMeta:()=>St,getCurrentPath:()=>ht,getCursor:()=>Mt,getRecentlyOpenedPages:()=>At,getSelection:()=>Rt,getText:()=>Dt,getUiOption:()=>rn,goHistory:()=>Bt,hidePanel:()=>qt,insertAtCursor:()=>Qt,insertAtPos:()=>Gt,invokeCommand:()=>bt,isMobile:()=>An,moveCursor:()=>Jt,moveCursorToLine:()=>Zt,moveLineDown:()=>gn,moveLineUp:()=>En,navigate:()=>wt,newWindow:()=>Ft,openCommandPalette:()=>Lt,openPageNavigator:()=>It,openSearchPanel:()=>vn,openUrl:()=>Ut,prompt:()=>en,rebuildEditorState:()=>Kt,redo:()=>pn,reloadConfigAndCommands:()=>kt,reloadPage:()=>zt,reloadUI:()=>Yt,replaceRange:()=>jt,save:()=>Nt,sendMessage:()=>hn,setSelection:()=>Ot,setText:()=>Ct,setUiOption:()=>on,showPanel:()=>Ht,showProgress:()=>Wt,toggleComment:()=>yn,toggleFold:()=>ln,undo:()=>dn,unfold:()=>sn,unfoldAll:()=>cn,uploadFile:()=>Vt,vimEx:()=>Tn});typeof self>"u"&&(self={syscall:()=>{throw new Error("Not implemented here")}});function l(e,...t){return globalThis.syscall(e,...t)}function Tt(){return l("editor.getCurrentPage")}function St(){return l("editor.getCurrentPageMeta")}function ht(){return l("editor.getCurrentPath")}function At(){return l("editor.getRecentlyOpenedPages")}function xt(){return l("editor.getCurrentEditor")}function Dt(){return l("editor.getText")}function Ct(e,t=!1){return l("editor.setText",e,t)}function Mt(){return l("editor.getCursor")}function Rt(){return l("editor.getSelection")}function Ot(e,t){return l("editor.setSelection",e,t)}function bt(e,t){return l("editor.invokeCommand",e,t)}function Nt(){return l("editor.save")}function wt(e,t=!1,r=!1){return l("editor.navigate",e,t,r)}function It(e="page"){return l("editor.openPageNavigator",e)}function Lt(){return l("editor.openCommandPalette")}function zt(){return l("editor.reloadPage")}function Yt(){return l("editor.reloadUI")}function Kt(){return l("editor.rebuildEditorState")}function kt(){return l("editor.reloadConfigAndCommands")}function Ut(e,t=!1){return l("editor.openUrl",e,t)}function Ft(){return l("editor.newWindow")}function Bt(e){return l("editor.goHistory",e)}function Pt(e,t){return l("editor.downloadFile",e,t)}function Vt(e,t){return l("editor.uploadFile",e,t)}function _t(e,t="info"){return l("editor.flashNotification",e,t)}function $t(e,t,r="",n=""){return l("editor.filterBox",e,t,r,n)}function Ht(e,t,r,n=""){return l("editor.showPanel",e,t,r,n)}function qt(e){return l("editor.hidePanel",e)}function Wt(e,t){return l("editor.showProgress",e,t)}function Gt(e,t){return l("editor.insertAtPos",e,t)}function jt(e,t,r){return l("editor.replaceRange",e,t,r)}function Jt(e,t=!1){return l("editor.moveCursor",e,t)}function Zt(e,t=1,r=!1){return l("editor.moveCursorToLine",e,t,r)}function Qt(e,t=!1,r=!1){return l("editor.insertAtCursor",e,t,r)}function Xt(e){return l("editor.dispatch",e)}function en(e,t=""){return l("editor.prompt",e,t)}function tn(e){return l("editor.confirm",e)}function nn(e){return l("editor.alert",e)}function rn(e){return l("editor.getUiOption",e)}function on(e,t){return l("editor.setUiOption",e,t)}function an(){return l("editor.fold")}function sn(){return l("editor.unfold")}function ln(){return l("editor.toggleFold")}function un(){return l("editor.foldAll")}function cn(){return l("editor.unfoldAll")}function dn(){return l("editor.undo")}function pn(){return l("editor.redo")}function vn(){return l("editor.openSearchPanel")}function fn(e){return l("editor.copyToClipboard",e)}function mn(){return l("editor.deleteLine")}function yn(){return l("editor.toggleComment")}function En(){return l("editor.moveLineUp")}function gn(){return l("editor.moveLineDown")}function Tn(e){return l("editor.vimEx",e)}function Sn(){return l("editor.configureVimMode")}function hn(e,t){return l("editor.sendMessage",e,t)}function An(){return l("editor.isMobile")}var Y={};L(Y,{del:()=>On,get:()=>Rn,set:()=>Mn});function Mn(e,t){return l("clientStore.set",e,t)}function Rn(e){return l("clientStore.get",e)}function On(e){return l("clientStore.delete",e)}var ya=new Uint8Array(16);var K={};L(K,{batchDel:()=>Pn,batchDeletePrefix:()=>$n,batchGet:()=>Fn,batchSet:()=>kn,del:()=>Bn,get:()=>Un,listFunctions:()=>qn,query:()=>Vn,queryDelete:()=>Hn,queryLua:()=>_n,set:()=>Kn});function Kn(e,t){return l("datastore.set",e,t)}function kn(e){return l("datastore.batchSet",e)}function Un(e){return l("datastore.get",e)}function Fn(e){return l("datastore.batchGet",e)}function Bn(e){return l("datastore.delete",e)}function Pn(e){return l("datastore.batchDelete",e)}function Vn(e){return l("datastore.query",e)}function _n(e,t,r){return l("datastore.queryLua",e,t,r)}function $n(e){return l("datastore.batchDeletePrefix",e)}function Hn(e,t){return l("datastore.queryDelete",e,t)}function qn(){return l("datastore.listFunctions")}var P={};L(P,{define:()=>Xn,get:()=>jn,has:()=>Qn,insert:()=>Zn,set:()=>Jn});function jn(e,t){return l("config.get",e,t)}function Jn(e,t){return l("config.set",e,t)}function Zn(e,t){return l("config.insert",e,t)}function Qn(e){return l("config.has",e)}function Xn(e,t){return l("config.define",e,t)}var V={};L(V,{ensureFullIndex:()=>rr,getObjectByRef:()=>nr,indexObjects:()=>er,queryLuaObjects:()=>tr});function er(e,t){return l("index.indexObjects",e,t)}function tr(e,t,r,n){return l("index.queryLuaObjects",e,t,r,n)}function nr(e,t,r){return l("index.getObjectByRef",e,t,r)}function rr(){return l("index.ensureFullIndex")}var h=e=>Object.fromEntries(Object.entries(e).map(([t,r])=>[r,t])),y=e=>Object.keys(e),Ce={action:"ACTION",description:"DESCRIPTION",duration:"DURATION",repeat:"REPEAT",summary:"SUMMARY",trigger:"TRIGGER",attachments:"ATTACH",attendees:"ATTENDEE"},Me=h(Ce),wa=y(Me),Ia=y(Ce),Re={method:"METHOD",prodId:"PRODID",version:"VERSION",name:"X-WR-CALNAME"},Oe=h(Re),La=y(Oe),za=y(Re),be={alarms:"ALARM",categories:"CATEGORIES",created:"CREATED",description:"DESCRIPTION",lastModified:"LAST-MODIFIED",location:"LOCATION",exceptionDates:"EXDATE",recurrenceRule:"RRULE",stamp:"DTSTAMP",start:"DTSTART",summary:"SUMMARY",uid:"UID",timeTransparent:"TRANSP",url:"URL",end:"DTEND",duration:"DURATION",geo:"GEO",class:"CLASS",organizer:"ORGANIZER",priority:"PRIORITY",sequence:"SEQUENCE",status:"STATUS",attach:"ATTACH",recurrenceId:"RECURRENCE-ID",attendees:"ATTENDEE",comment:"COMMENT"},Ne=h(be),Ya=y(Ne),Ka=y(be),we={id:"TZID",lastModified:"LAST-MODIFIED",url:"TZURL"},Ie=h(we),ka=y(Ie),Ua=y(we),Le={comment:"COMMENT",name:"TZNAME",offsetFrom:"TZOFFSETFROM",offsetTo:"TZOFFSETTO",recurrenceDate:"RDATE",recurrenceRule:"RRULE",start:"DTSTART"},ze=h(Le),Fa=y(ze),Ba=y(Le),Ye={byDay:"BYDAY",byHour:"BYHOUR",byMinute:"BYMINUTE",byMonth:"BYMONTH",byMonthday:"BYMONTHDAY",bySecond:"BYSECOND",bySetPos:"BYSETPOS",byWeekNo:"BYWEEKNO",byYearday:"BYYEARDAY",count:"COUNT",frequency:"FREQ",interval:"INTERVAL",until:"UNTIL",workweekStart:"WKST"},Ke=h(Ye),Pa=y(Ke),Va=y(Ye),ke={categories:"CATEGORIES",created:"CREATED",description:"DESCRIPTION",lastModified:"LAST-MODIFIED",location:"LOCATION",exceptionDates:"EXDATE",recurrenceRule:"RRULE",stamp:"DTSTAMP",start:"DTSTART",summary:"SUMMARY",uid:"UID",url:"URL",duration:"DURATION",geo:"GEO",class:"CLASS",organizer:"ORGANIZER",priority:"PRIORITY",sequence:"SEQUENCE",status:"STATUS",attach:"ATTACH",recurrenceId:"RECURRENCE-ID",attendees:"ATTENDEE",comment:"COMMENT",completed:"COMPLETED",due:"DUE",percentComplete:"PERCENT-COMPLETE"},Ue=h(ke),_a=y(Ue),$a=y(ke),Fe={categories:"CATEGORIES",created:"CREATED",description:"DESCRIPTION",lastModified:"LAST-MODIFIED",exceptionDates:"EXDATE",recurrenceRule:"RRULE",stamp:"DTSTAMP",start:"DTSTART",summary:"SUMMARY",uid:"UID",url:"URL",geo:"GEO",class:"CLASS",organizer:"ORGANIZER",sequence:"SEQUENCE",status:"STATUS",attach:"ATTACH",recurrenceId:"RECURRENCE-ID",attendees:"ATTENDEE",comment:"COMMENT"},Be=h(Fe),Ha=y(Be),qa=y(Fe),Pe={stamp:"DTSTAMP",start:"DTSTART",uid:"UID",url:"URL",organizer:"ORGANIZER",attendees:"ATTENDEE",comment:"COMMENT",end:"DTEND",freeBusy:"FREEBUSY"},Ve=h(Pe),Wa=y(Ve),Ga=y(Pe),_e="BEGIN",$e="END",or="VCALENDAR",He="VTIMEZONE",ar="STANDARD",ir="DAYLIGHT",qe="VEVENT",We="VALARM",Ge="VTODO",je="VJOURNAL",Je="VFREEBUSY";var ge=e=>new RegExp(`${_e}:${e}([\\s\\S]*?)${$e}:${e}`,"g"),sr=e=>new RegExp(`${_e}:${e}|${$e}:${e}`,"g");var ne=/\r\n|\r|\n/;var Te=` -`,lr=":",w=",",ur='"',re=";";var Se="=";var cr=Math.pow(10,8)*24*60*60*1e3,ja=-cr,dr=6048e5;var Ze=6e4,Qe=36e5,pr=3600,Xe=pr*24,Ja=Xe*7,vr=Xe*365.2425,fr=vr/12,Za=fr*3,he=Symbol.for("constructDateFrom");function S(e,t){return typeof e=="function"?e(t):e&&typeof e=="object"&&he in e?e[he](t):e instanceof Date?new e.constructor(t):new Date(t)}function c(e,t){return S(t||e,e)}function ae(e,t,r){let n=c(e,r?.in);return isNaN(t)?S(r?.in||e,NaN):(t&&n.setDate(n.getDate()+t),n)}function et(e,t,r){let n=c(e,r?.in);if(isNaN(t))return S(r?.in||e,NaN);if(!t)return n;let o=n.getDate(),i=S(r?.in||e,n.getTime());i.setMonth(n.getMonth()+t+1,0);let a=i.getDate();return o>=a?i:(n.setFullYear(i.getFullYear(),i.getMonth(),o),n)}function q(e,t,r){return S(r?.in||e,+c(e)+t)}function mr(e,t,r){return q(e,t*Qe,r)}var yr={};function W(){return yr}function $(e,t){var r,n,o,i;let a=W(),s=t?.weekStartsOn??((n=(r=t?.locale)==null?void 0:r.options)==null?void 0:n.weekStartsOn)??a.weekStartsOn??((i=(o=a.locale)==null?void 0:o.options)==null?void 0:i.weekStartsOn)??0,u=c(e,t?.in),d=u.getDay(),v=(dtypeof n=="object"));return t.map(r)}function gr(e,t){let r=c(e,t?.in);return r.setHours(0,0,0,0),r}function tt(e,t,r){let n=c(e,r?.in);return n.setTime(n.getTime()+t*Ze),n}function Tr(e,t,r){return q(e,t*1e3,r)}function ie(e,t,r){return ae(e,t*7,r)}function nt(e,t,r){return et(e,t*12,r)}function se(e,t){let r=+c(e)-+c(t);return r<0?-1:r>0?1:r}function Ae(e,t){let r=c(e,t?.in),n=r.getMonth();return r.setFullYear(r.getFullYear(),n+1,0),r.setHours(23,59,59,999),r}function Sr(e,t){let[r,n]=Er(e,t.start,t.end);return{start:r,end:n}}function hr(e,t){let{start:r,end:n}=Sr(t?.in,e),o=+r>+n,i=o?+r:+n,a=o?n:r;a.setHours(0,0,0,0);let s=t?.step??1;if(!s)return[];s<0&&(s=-s,o=!o);let u=[];for(;+a<=i;)u.push(S(r,a)),a.setDate(a.getDate()+s),a.setHours(0,0,0,0);return o?u.reverse():u}function xe(e,t){let r=c(e,t?.in);return r.setDate(1),r.setHours(0,0,0,0),r}function Ar(e,t){let r=c(e,t?.in),n=r.getFullYear();return r.setFullYear(n+1,0,0),r.setHours(23,59,59,999),r}function xr(e,t){let r=c(e,t?.in);return r.setFullYear(r.getFullYear(),0,1),r.setHours(0,0,0,0),r}function Dr(e,t){var r,n,o,i;let a=c(e,t?.in),s=a.getFullYear(),u=W(),d=t?.firstWeekContainsDate??((n=(r=t?.locale)==null?void 0:r.options)==null?void 0:n.firstWeekContainsDate)??u.firstWeekContainsDate??((i=(o=u.locale)==null?void 0:o.options)==null?void 0:i.firstWeekContainsDate)??1,v=S(t?.in||e,0);v.setFullYear(s+1,0,d),v.setHours(0,0,0,0);let g=$(v,t),m=S(t?.in||e,0);m.setFullYear(s,0,d),m.setHours(0,0,0,0);let A=$(m,t);return+a>=+g?s+1:+a>=+A?s:s-1}function Cr(e,t){var r,n,o,i;let a=W(),s=t?.firstWeekContainsDate??((n=(r=t?.locale)==null?void 0:r.options)==null?void 0:n.firstWeekContainsDate)??a.firstWeekContainsDate??((i=(o=a.locale)==null?void 0:o.options)==null?void 0:i.firstWeekContainsDate)??1,u=Dr(e,t),d=S(t?.in||e,0);return d.setFullYear(u,0,s),d.setHours(0,0,0,0),$(d,t)}function Mr(e,t){let r=c(e,t?.in),n=+$(r,t)-+Cr(r,t);return Math.round(n/dr)+1}function _(e,t){return c(e,t?.in).getDay()}function rt(e,t){let r=c(e,t?.in),n=r.getFullYear(),o=r.getMonth(),i=S(r,0);return i.setFullYear(n,o+1,0),i.setHours(0,0,0,0),i.getDate()}function Rr(e,t){return c(e,t?.in).getHours()}function Or(e,t){return c(e,t?.in).getMinutes()}function ot(e,t){return c(e,t?.in).getMonth()}function br(e){return c(e).getSeconds()}function Nr(e,t){return c(e,t?.in).getFullYear()}function wr(e,t){return+c(e)==+c(t)}function Ir(e,t,r){let n=c(e,r?.in),o=Mr(n,r)-t;return n.setDate(n.getDate()-o*7),c(n,r?.in)}function H(e,t,r){var n,o,i,a;let s=W(),u=r?.weekStartsOn??((o=(n=r?.locale)==null?void 0:n.options)==null?void 0:o.weekStartsOn)??s.weekStartsOn??((a=(i=s.locale)==null?void 0:i.options)==null?void 0:a.weekStartsOn)??0,d=c(e,r?.in),v=d.getDay(),g=(t%7+7)%7,m=7-u,A=t<0||t>6?t-(v+m)%7:(g+m)%7-(v+m)%7;return ae(d,A,r)}function at(e,t,r){let n=+c(e,r?.in),[o,i]=[+c(t.start,r?.in),+c(t.end,r?.in)].sort((a,s)=>a-s);return n>=o&&n<=i}function Lr(e){let t=e/Qe;return Math.trunc(t)}function zr(e){let t=e/Ze;return Math.trunc(t)}function Yr(e,t,r){let n=c(e,r?.in),o=n.getFullYear(),i=n.getDate(),a=S(r?.in||e,0);a.setFullYear(o,t,15),a.setHours(0,0,0,0);let s=rt(a);return n.setMonth(t,Math.min(i,s)),n}function Kr(e,t,r){let n=c(e,r?.in);return n.setDate(t),n}function kr(e,t,r){let n=c(e,r?.in);return n.setMonth(0),n.setDate(t),n}function Ur(e,t,r){let n=c(e,r?.in);return n.setHours(t),n}function Fr(e,t,r){let n=c(e,r?.in);return n.setMinutes(t),n}function Br(e,t,r){let n=c(e,r?.in);return n.setSeconds(t),n}function Pr(e,t,r){return q(e,-t,r)}function Vr(e,t,r){return ie(e,-t,r)}var _r=[ar,ir];var $r=["SECONDLY","MINUTELY","HOURLY","DAILY","WEEKLY","MONTHLY","YEARLY"];var it=["SU","MO","TU","WE","TH","FR","SA"];var b=(e,t)=>t===void 0?!1:e>=t,Hr=(e,{start:t,end:r},n)=>{if(b(n.length,e.count))return;let o=e.frequency,i=e.interval||1;if(!o)return;let a=t;if(o==="SECONDLY"){for(;a{let o=r.map(({day:i,occurrence:a})=>({occurrence:a,day:it.indexOf(i)}));return e.frequency==="YEARLY"?e.byYearday||e.byMonthday?t.map(i=>i.filter(a=>o.find(({day:s})=>s===_(a)))):e.byWeekNo?t.map(i=>i.flatMap(a=>o.map(({day:s})=>H(a,s,{weekStartsOn:n})))):e.byMonth?t.map(i=>i.flatMap(a=>o.flatMap(({day:s,occurrence:u})=>te(D(xe(a)),D(Ae(a)),s,n,u)))):t.map(i=>i.flatMap(a=>o.flatMap(({day:s,occurrence:u})=>te(D(xr(a)),D(Ar(a)),s,n,u)))):e.frequency==="MONTHLY"?e.byMonthday?t.map(i=>i.filter(a=>o.find(({day:s})=>s===_(a)))):t.map(i=>i.flatMap(a=>o.flatMap(({day:s,occurrence:u})=>te(D(xe(a)),D(Ae(a)),s,n,u)))):e.frequency==="WEEKLY"?t.map(i=>i.flatMap(a=>o.map(({day:s})=>H(a,s,{weekStartsOn:n})))):t.map(i=>i.filter(a=>o.find(({day:s})=>s===_(a))))},te=(e,t,r,n,o)=>{if(o!==void 0){if(!(o<0)){let s=H(e,r,{weekStartsOn:n}),u=e>s;return ie(s,(o||1)-1+(u?1:0))}let i=H(t,r,{weekStartsOn:n}),a=tD(i)).filter(i=>at(i,{start:e,end:t})).filter(i=>r===_(i))},D=e=>tt(e,-e.getTimezoneOffset()),Wr=(e,t,r)=>e.frequency==="YEARLY"||e.frequency==="MONTHLY"||e.frequency==="WEEKLY"||e.frequency==="DAILY"?t.map(n=>n.flatMap(o=>r.map(i=>Ur(o,i)))):t.map(n=>n.filter(o=>r.includes(Rr(o)))),Gr=(e,t,r)=>e.frequency==="YEARLY"||e.frequency==="MONTHLY"||e.frequency==="WEEKLY"||e.frequency==="DAILY"||e.frequency==="HOURLY"?t.map(n=>n.flatMap(o=>r.map(i=>Fr(o,i)))):t.map(n=>n.filter(o=>r.includes(Or(o)))),jr=(e,t,r)=>e.frequency==="YEARLY"?t.map(n=>n.flatMap(o=>r.map(i=>Yr(o,i)))):t.map(n=>n.filter(o=>r.includes(ot(o)))),Jr=(e,t,r)=>e.frequency==="YEARLY"||e.frequency==="MONTHLY"?t.map(n=>n.flatMap(o=>{let i=rt(o);return r.map(a=>a>i?void 0:Kr(o,a)).filter(a=>!!a)})):e.frequency==="WEEKLY"?t:t.map(n=>n.filter(o=>r.includes(ot(o)))),Zr=(e,t,r)=>e.frequency==="YEARLY"||e.frequency==="MONTHLY"||e.frequency==="WEEKLY"||e.frequency==="DAILY"||e.frequency==="HOURLY"||e.frequency==="MINUTELY"?t.map(n=>n.flatMap(o=>r.map(i=>Br(o,i)))):t.map(n=>n.filter(o=>r.includes(br(o)))),Qr=(e,t,r)=>!e.byYearday&&!e.byWeekNo&&!e.byMonthday&&!e.byMonth&&!e.byDay&&!e.byHour&&!e.byMinute&&!e.bySecond?t:t.map(n=>n.sort(se).filter((o,i)=>r.some(a=>a>0?i===0?!1:i%a===0:i===0?n.length-1+a===0:i%(n.length-1+a)===0))),Xr=(e,t,r,n)=>e.frequency==="YEARLY"?t.map(o=>o.flatMap(i=>r.map(a=>Ir(i,a,{weekStartsOn:n})))):t,eo=(e,t,r)=>e.frequency==="YEARLY"?t.map(n=>n.flatMap(o=>r.map(i=>kr(o,i)))):e.frequency==="MONTHLY"||e.frequency==="WEEKLY"||e.frequency==="DAILY"?t:t.map(n=>n.filter(o=>r.includes(Nr(o)))),to=(e,t,r)=>{let n=r;return e.byMonth&&(n=jr(e,n,e.byMonth)),e.byWeekNo&&(n=Xr(e,n,e.byWeekNo,t.weekStartsOn)),e.byYearday&&(n=eo(e,n,e.byYearday)),e.byMonthday&&(n=Jr(e,n,e.byMonthday)),e.byDay&&(n=qr(e,n,e.byDay,t.weekStartsOn)),e.byHour&&(n=Wr(e,n,e.byHour)),e.byMinute&&(n=Gr(e,n,e.byMinute)),e.bySecond&&(n=Zr(e,n,e.bySecond)),e.bySetPos&&(n=Qr(e,n,e.bySetPos)),n.map(o=>o.sort(se).filter(i=>!(t.exceptions.length>0&&t.exceptions.some(a=>wr(a,i))||!at(i,{start:t.start,end:t.end}))))},no=2,ro=(e,t)=>{var r;let n=t.start,o=((r=e.until)==null?void 0:r.date)||t?.end||nt(n,no),i=t.exceptions||[],a=(e.workweekStart?it.indexOf(e.workweekStart):1)%7,s=[[n]];Hr(e,{start:n,end:o},s);let u=to(e,{start:n,end:o,exceptions:i,weekStartsOn:a},s);return e.count?u.flat().splice(0,e.count):u.flat()},oo=(e,t)=>t.flatMap(r=>!r.recurrenceRule||r.recurrenceRule.until&&r.recurrenceRule.until.date({...r,start:n}))),oe=e=>{let t=e[0]==="+"?1:-1,r=Number(e.slice(1,3)),n=e.length>3?Number(e.slice(3,5)):0,o=e.length>5?Number(e.slice(5,7)):0;return((r*60+n)*60+o)*1e3*t},ao=(e,t)=>{let r="en-US",n=new Date(t.toLocaleString(r,{timeZone:"UTC"}));try{return new Date(t.toLocaleString(r,{timeZone:e})).getTime()-n.getTime()}catch{return t.getTime()-n.getTime()}},io=(e,t,r)=>{let n=r?.find(i=>i.id===t);if(n){let i=oo(e,n.props).sort((u,d)=>se(u.start,d.start));for(let u=0;u5?d.substring(0,5):d;return{offset:v,milliseconds:oe(v)}}let a=i[i.length-1].offsetTo,s=a.length>5?a.substring(0,5):a;return{offset:s,milliseconds:oe(s)}}let o=ao(t,e);if(!Number.isNaN(o)){let i=o<0,a=Math.abs(Lr(o)),s=Math.abs(zr(o))-a*60,u=a.toString().length===1?`0${a}`:a.toString(),d=s.toString().length===1?`0${s}`:s.toString();return{offset:`${i?"-":"+"}${u}${d}`,milliseconds:o}}};var p=(e,t)=>{if(e===void 0)return t;let r=e["~standard"].validate(t);if(r instanceof Promise)throw new TypeError("Schema validation must be synchronous");if(r.issues)throw new Error(JSON.stringify(r.issues,null,2));return r.value},so=(e,t)=>{var r,n,o,i;let a=((r=t.options)==null?void 0:r.VALUE)==="BINARY"?{type:"binary",encoding:((n=t.options)==null?void 0:n.ENCODING)||"BASE64",binary:t.value,value:(o=t.options)==null?void 0:o.VALUE}:{type:"uri",url:t.value,formatType:(i=t.options)==null?void 0:i.FMTTYPE};return p(e,a)},N=e=>e.replace(/mailto:/gi,""),F=(e,t)=>{var r,n,o,i,a,s,u,d,v,g,m;return p(e,{email:N(t.value),delegatedFrom:(r=t.options)!=null&&r["DELEGATED-FROM"]?N((n=t.options)==null?void 0:n["DELEGATED-FROM"]):void 0,dir:(o=t.options)==null?void 0:o.DIR,member:(i=t.options)!=null&&i.MEMBER?N(t.options.MEMBER):void 0,name:(a=t.options)==null?void 0:a.CN,partstat:(s=t.options)==null?void 0:s.PARTSTAT,role:(u=t.options)==null?void 0:u.ROLE,sentBy:(d=t.options)!=null&&d["SENT-BY"]?N(t.options["SENT-BY"]):void 0,rsvp:(v=t.options)!=null&&v.RSVP?((g=t.options)==null?void 0:g.RSVP)==="TRUE"?!0:((m=t.options)==null?void 0:m.RSVP)==="FALSE"?!1:void 0:void 0})},B=(e,t)=>{let r=t.value,n={};r[0]==="-"&&(n.before=!0,r=r.slice(1)),r=r.slice(1);let o=r.split("T"),i=o[0];if(i.includes("D")){let[s,u]=i.split("D");n.days=Number(s),i=u}if(i.includes("W")){let[s,u]=i.split("W");n.weeks=Number(s),i=u}let a=o[1];if(a){if(a.includes("H")){let[s,u]=a.split("H");n.hours=Number(s),a=u}if(a.includes("M")){let[s,u]=a.split("M");n.minutes=Number(s),a=u}if(a.includes("S")){let[s,u]=a.split("S");n.seconds=Number(s),a=u}}return p(e,n)},lo=(e,t)=>{let r=Number.parseInt(t.value.slice(0,4),10),n=Number.parseInt(t.value.slice(4,6),10)-1,o=Number.parseInt(t.value.slice(6,8),10),i=new Date(Date.UTC(r,n,o));return p(e,i)},k=(e,t)=>{let r=Number.parseInt(t.value.slice(0,4),10),n=Number.parseInt(t.value.slice(4,6),10)-1,o=Number.parseInt(t.value.slice(6,8),10),i=Number.parseInt(t.value.slice(9,11),10),a=Number.parseInt(t.value.slice(11,13),10),s=Number.parseInt(t.value.slice(13,15),10),u=new Date(Date.UTC(r,n,o,i,a,s));return p(e,u)},uo=(e,t,r)=>{let n=oe(r),o=k(void 0,t),i=Pr(o,n);return p(e,i)},co=(e,t)=>{var r,n,o,i,a,s;if(((r=e.options)==null?void 0:r.VALUE)==="DATE")return{date:lo(void 0,e),type:(n=e.options)==null?void 0:n.VALUE};let u=((o=e.options)==null?void 0:o.VALUE)||"DATE-TIME",d=k(void 0,e);if(!((i=e.options)!=null&&i.TZID))return{date:d,type:u};let v=io(d,e.options.TZID,t?.timezones);return v?{date:q(d,-v.milliseconds),type:u,local:(a=e.options)!=null&&a.TZID?{date:d,timezone:(s=e.options)==null?void 0:s.TZID,tzoffset:v.offset}:void 0}:{date:d,type:u}},f=(e,t,r)=>p(e,co(t,r)),po=(e,t,r)=>{var n,o,i,a;let s=((n=t.options)==null?void 0:n.VALUE)==="DATE-TIME"||((o=t.options)==null?void 0:o.VALUE)==="DATE"?{type:"absolute",value:f(void 0,t,r),options:{related:(i=t.options)==null?void 0:i.RELATED}}:{type:"relative",value:B(void 0,t),options:{related:(a=t.options)==null?void 0:a.RELATED}};return p(e,s)},vo=e=>e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e,st=e=>e.map(t=>{let[r,...n]=t.split(Se),o=n.join(Se);return{property:r,value:vo(o)}},{}),fo=e=>e.reduce((t,r)=>(t[r.property]=r.value,t),{}),mo=e=>fo(st(e)),yo=e=>{let t=!1,r;for(let i=0;i{let{property:t,value:r}=yo(e);if(t.includes(re)){let[n,...o]=t.split(re),i=mo(o);return{property:n,line:{options:i,value:r}}}return{property:t,line:{value:r}}},De=e=>/^[ \t]/.test(e),go=e=>/^[A-Z]+(?:-[A-Z]+)*[:;]/.test(e),To=e=>{let t=[],r=e.split(ne);for(;r[0]==="";)r.shift();let n=r.length;for(;n>0&&r[n-1]==="";)n-=1,r.pop();for(let o=0;oo!=="")},So=(e,t,r)=>{if(!t)return e;let n={};return Object.entries(t).forEach(([o,i])=>{let a=Object.entries(r||{}).find(([d,v])=>v.name===o);if(!a){n[ho(o)]=i.value;return}let s=a[1].convert(i),u=a[1].schema;if(!u){n[a[0]]=s;return}n[a[0]]=p(u,s)}),e.nonStandard=n,e},ho=e=>{let t=e.startsWith("X-")?e.slice(2):e,r="",n=!1;for(let o of t)o==="-"?n=!0:(r+=n?o.toUpperCase():o.toLowerCase(),n=!1);return r},Ao=e=>e.startsWith("X-"),C=(e,t,r)=>{let n=t.replace(sr(r?.icsComponent),""),o=[...new Set(Object.values(r.childComponents||{}).flatMap(({icsComponent:g})=>g))],i=To(o.reduce((g,m)=>g.replace(ge(m),""),n)),a=r.defaultValues||{},s={};i.forEach(g=>{var m,A;let{property:M,line:R}=Eo(g);Ao(M)&&(s[M]=R);let E=r.objectKeyMap[M];if(!E)return;let I=(m=r.convertArrayValues)==null?void 0:m[E];if(I){let O=I({line:R});if(!O)return;(a[E]===void 0||a[E]===null||!Array.isArray(a[E]))&&(a[E]=[]),Array.isArray(O)?a[E].push(...O):a[E].push(O);return}let ve=(A=r.convertValues)==null?void 0:A[E];if(ve){let O=ve({line:R});if(!O)return;a[E]=O;return}a[E]=R.value});let u=r.childComponents,d=u?Object.keys(u||{}):[];u&&d.length>0&&d.forEach(g=>{let m=u?.[g];if(!m)return;let A=Array.isArray(m.icsComponent)?m.icsComponent:[m.icsComponent],M=[],R=[];A.forEach(E=>{R.push(...n.matchAll(ge(E)))}),R.map(E=>E[0]).forEach(E=>{let I=m.convert(E,{data:a});I&&M.push(I)}),M.length!==0&&(a[g]=M)});let v=p(e,a);return r!=null&&r.nonStandard?So(v,s,r?.nonStandard):v},G=(e,t)=>{var r,n,o;return p(e,{name:(r=t.options)==null?void 0:r.CN,dir:(n=t.options)==null?void 0:n.DIR,sentBy:(o=t.options)!=null&&o["SENT-BY"]?N(t.options["SENT-BY"]):void 0,email:N(t.value)})},le=(e,t,r)=>{var n;return p(e,{value:f(void 0,t,r),range:(n=t.options)==null?void 0:n.RANGE})},xo=e=>{if(e.length===2)return{day:e};let t=e.slice(0,-2);return{day:e.replace(t,""),occurrence:Number(t)}},Do=(e,t)=>p(e,xo(t.value)),Co=(e,t)=>p(e,t.value),Mo=["until"],Ro=e=>Mo.includes(e),Oo=["bySecond","byMinute","byHour","byMonthday","byYearday","byWeekNo","bySetPos"],bo=e=>Oo.includes(e),No=["byDay"],wo=e=>No.includes(e),Io=["count","interval"],Lo=e=>Io.includes(e),j=(e,t,r)=>{let n={};return st(t.value.split(re)).forEach(o=>{let{property:i,value:a}=o,s=Ke[i];if(s){if(Ro(s)){n[s]=f(void 0,{value:a,options:{VALUE:a.includes("T")?"DATE-TIME":"DATE"}},{timezones:r?.timezones});return}if(bo(s)){n[s]=a.split(w).map(u=>Number(u));return}if(s==="byMonth"){n[s]=a.split(w).map(u=>Number(u)-1);return}if(wo(s)){n[s]=a.split(w).map(u=>Do(void 0,{value:u}));return}if(Lo(s)){n[s]=Number(a);return}if(s==="frequency"){if(!a||!$r.includes(a))return;n[s]=a;return}if(s==="workweekStart"){n[s]=Co(void 0,{value:a});return}}}),p(e,n)},ue=(e,t)=>p(e,t.value),zo=(e,t)=>p(e,t.value),ce=(e,t,r)=>p(e,t.value.split(",").map(n=>f(void 0,{value:n,options:t.options},r))),Yo=(e,t)=>p(e,t.value),Ko=(e,t)=>p(e,t.value),ko=(e,t)=>p(e,t.value),U=(e,t)=>p(e,Number.parseInt(t.value,10)),Uo=e=>e.replace(/\\(([,;\\])|([nN]))/g,(t,r,n)=>n||` -`),T=(e,t)=>p(e,Uo(t.value)),Fo=(...e)=>{let[t,r,n]=e;return C(t,r,{icsComponent:We,objectKeyMap:Me,convertValues:{trigger:({line:o})=>po(void 0,o,{timezones:n?.timezones}),duration:({line:o})=>B(void 0,o),repeat:({line:o})=>U(void 0,o)},convertArrayValues:{attachments:({line:o})=>so(void 0,o),attendees:({line:o})=>F(void 0,o)},nonStandard:n?.nonStandard,timezones:n?.timezones})},Bo=(...e)=>{let[t,r,n]=e,o,i=C(t,r,{icsComponent:qe,objectKeyMap:Ne,convertValues:{stamp:({line:a})=>f(void 0,a,{timezones:n?.timezones}),start:({line:a})=>f(void 0,a,{timezones:n?.timezones}),end:({line:a})=>f(void 0,a,{timezones:n?.timezones}),created:({line:a})=>f(void 0,a,{timezones:n?.timezones}),lastModified:({line:a})=>f(void 0,a,{timezones:n?.timezones}),categories:({line:a})=>a.value.split(w),description:({line:a})=>{var s;return(s=a.options)!=null&&s.ALTREP&&(o=a.options.ALTREP),T(void 0,a)},location:({line:a})=>T(void 0,a),comment:({line:a})=>T(void 0,a),summary:({line:a})=>T(void 0,a),recurrenceRule:({line:a})=>j(void 0,a,{timezones:n?.timezones}),duration:({line:a})=>B(void 0,a),organizer:({line:a})=>G(void 0,a),sequence:({line:a})=>U(void 0,a),class:({line:a})=>ue(void 0,a),recurrenceId:({line:a})=>le(void 0,a,{timezones:n?.timezones}),status:({line:a})=>Yo(void 0,a),timeTransparent:({line:a})=>zo(void 0,a)},convertArrayValues:{attendees:({line:a})=>F(void 0,a),exceptionDates:({line:a})=>ce(void 0,a,{timezones:n?.timezones})},childComponents:{alarms:{icsComponent:We,convert:a=>Fo(void 0,a,{nonStandard:n?.nonStandard,timezones:n?.timezones})}},timezones:n?.timezones,nonStandard:n?.nonStandard});return o&&(i.descriptionAltRep=o),i},Po=(...e)=>{let[t,r,n]=e,o=r.split("BEGIN:")[1].split(ne)[0],i=_r.includes(o)?o:"STANDARD",a=r.split("TZOFFSETTO:")[1].split(ne)[0];return C(t,r,{icsComponent:i,objectKeyMap:ze,defaultValues:{type:i},convertValues:{start:({line:s})=>uo(void 0,s,a),recurrenceRule:({line:s})=>j(void 0,s,{timezones:n?.timezones}),recurrenceDate:({line:s})=>f(void 0,s,{timezones:n?.timezones})},nonStandard:n?.nonStandard,timezones:n?.timezones})},Vo=(...e)=>{let[t,r,n]=e;return C(t,r,{icsComponent:He,objectKeyMap:Ie,convertValues:{lastModified:({line:o})=>k(void 0,o)},childComponents:{props:{icsComponent:["DAYLIGHT","STANDARD"],convert:o=>Po(void 0,o,{nonStandard:n?.nonStandard,timezones:n?.timezones})}},nonStandard:n?.nonStandard,timezones:n?.timezones})},_o=(...e)=>{let[t,r,n]=e;return C(t,r,{icsComponent:Ge,objectKeyMap:Ue,convertValues:{stamp:({line:o})=>f(void 0,o,{timezones:n?.timezones}),start:({line:o})=>f(void 0,o,{timezones:n?.timezones}),due:({line:o})=>f(void 0,o,{timezones:n?.timezones}),created:({line:o})=>f(void 0,o,{timezones:n?.timezones}),lastModified:({line:o})=>f(void 0,o,{timezones:n?.timezones}),completed:({line:o})=>f(void 0,o,{timezones:n?.timezones}),categories:({line:o})=>o.value.split(w),description:({line:o})=>T(void 0,o),location:({line:o})=>T(void 0,o),comment:({line:o})=>T(void 0,o),summary:({line:o})=>T(void 0,o),recurrenceRule:({line:o})=>j(void 0,o,{timezones:n?.timezones}),duration:({line:o})=>B(void 0,o),organizer:({line:o})=>G(void 0,o),sequence:({line:o})=>U(void 0,o),percentComplete:({line:o})=>U(void 0,o),class:({line:o})=>ue(void 0,o),recurrenceId:({line:o})=>le(void 0,o,{timezones:n?.timezones}),status:({line:o})=>Ko(void 0,o)},convertArrayValues:{attendees:({line:o})=>F(void 0,o),exceptionDates:({line:o})=>ce(void 0,o,{timezones:n?.timezones})},nonStandard:n?.nonStandard,timezones:n?.timezones})},$o=(...e)=>{let[t,r,n]=e;return C(t,r,{icsComponent:je,objectKeyMap:Be,convertValues:{stamp:({line:o})=>f(void 0,o,{timezones:n?.timezones}),start:({line:o})=>f(void 0,o,{timezones:n?.timezones}),created:({line:o})=>f(void 0,o,{timezones:n?.timezones}),lastModified:({line:o})=>f(void 0,o,{timezones:n?.timezones}),categories:({line:o})=>o.value.split(w),description:({line:o})=>T(void 0,o),comment:({line:o})=>T(void 0,o),summary:({line:o})=>T(void 0,o),recurrenceRule:({line:o})=>j(void 0,o,{timezones:n?.timezones}),organizer:({line:o})=>G(void 0,o),sequence:({line:o})=>U(void 0,o),class:({line:o})=>ue(void 0,o),recurrenceId:({line:o})=>le(void 0,o,{timezones:n?.timezones}),status:({line:o})=>ko(void 0,o)},convertArrayValues:{attendees:({line:o})=>F(void 0,o),exceptionDates:({line:o})=>ce(void 0,o,{timezones:n?.timezones})},nonStandard:n?.nonStandard,timezones:n?.timezones})},Ho=(e,t)=>{var r;return p(e,{type:(r=t.options)==null?void 0:r.FBTYPE,values:t.value.split(",").map(n=>{let[o,i]=n.split("/"),a=k(void 0,{value:o});if(i.startsWith("PT")){let u=B(void 0,{value:i});return{start:a,duration:u}}let s=k(void 0,{value:i});return{start:a,end:s}})})},qo=(...e)=>{let[t,r,n]=e;return C(t,r,{icsComponent:Je,objectKeyMap:Ve,convertValues:{stamp:({line:o})=>f(void 0,o,{timezones:n?.timezones}),start:({line:o})=>f(void 0,o,{timezones:n?.timezones}),end:({line:o})=>f(void 0,o,{timezones:n?.timezones}),comment:({line:o})=>T(void 0,o),organizer:({line:o})=>G(void 0,o)},convertArrayValues:{attendees:({line:o})=>F(void 0,o),freeBusy:({line:o})=>Ho(void 0,o)},nonStandard:n?.nonStandard,timezones:n?.timezones})},lt=(...e)=>{let[t,r,n]=e;return C(t,r,{icsComponent:or,objectKeyMap:Oe,convertValues:{version:({line:o})=>o.value},childComponents:{timezones:{icsComponent:He,convert:o=>Vo(void 0,o,{nonStandard:n?.nonStandard})},events:{icsComponent:qe,convert:(o,{data:i})=>Bo(void 0,o,{nonStandard:n?.nonStandard,timezones:i.timezones})},todos:{icsComponent:Ge,convert:(o,{data:i})=>_o(void 0,o,{nonStandard:n?.nonStandard,timezones:i.timezones})},journals:{icsComponent:je,convert:(o,{data:i})=>$o(void 0,o,{nonStandard:n?.nonStandard,timezones:i.timezones})},freeBusy:{icsComponent:Je,convert:(o,{data:i})=>qo(void 0,o,{nonStandard:n?.nonStandard,timezones:i.timezones})}},nonStandard:n?.nonStandard})};var Wo="0.3.1",ct="icalendar:lastSync",Go={"GMT Standard Time":0,"W. Europe Standard Time":1,"Central Europe Standard Time":1,"Romance Standard Time":1,"Central European Standard Time":1,"Eastern Standard Time":-5,"Central Standard Time":-6,"Mountain Standard Time":-7,"Pacific Standard Time":-8,UTC:0,None:0};function jo(e){let t=r=>String(r).padStart(2,"0");return e.getFullYear()+"-"+t(e.getMonth()+1)+"-"+t(e.getDate())+"T"+t(e.getHours())+":"+t(e.getMinutes())+":"+t(e.getSeconds())+"."+String(e.getMilliseconds()).padStart(3,"0")}function ut(e,t=0){if(!e)return"";let r="";if(e.local&&typeof e.local.date=="string"?r=e.local.date:typeof e.date=="string"?r=e.date:e.date instanceof Date?r=e.date.toISOString():e instanceof Date&&(r=e.toISOString()),!r)return"";let n=new Date(r.replace("Z","")+"Z"),o=e.local?.timezone||e.timezone||"UTC",i=Go[o]??0,a=n.getTime()-i*36e5,s=new Date(a+t*36e5);return jo(s)}function Jo(e){return e&&typeof e=="object"&&"date"in e&&"type"in e}async function Zo(e){let t=await crypto.subtle.digest("SHA-256",new TextEncoder().encode(e));return Array.from(new Uint8Array(t)).map(r=>r.toString(16).padStart(2,"0")).join("")}function de(e,t=0){if(e==null)return e;if(Jo(e))return ut(e,t);if(e instanceof Date)return ut({date:e},t);if(Array.isArray(e))return e.map(r=>de(r,t));if(typeof e=="object"){let r={};for(let n in e)Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=de(e[n],t));return r}return e}async function Qo(){try{let e=await P.get("icalendar",{sources:[]}),t=[],r=e.tzShift??0,n=e.sources;return n&&typeof n=="object"&&(n.tzShift!==void 0&&r===0&&(r=n.tzShift),Array.isArray(n)?t=n.filter(o=>o&&typeof o.url=="string"):n.url&&(t=[n])),{sources:t,tzShift:r}}catch{return{sources:[],tzShift:0}}}async function Xo(e,t=0){let r=e.url.trim();r.includes(" ")&&(r=encodeURI(r));let n=await fetch(r);if(!n.ok)throw new Error(`HTTP ${n.status}`);let o=lt(void 0,await n.text());return o.events?await Promise.all(o.events.map(async i=>{let a=`${i.start?.date||""}${i.uid||i.summary||""}`,s=await Zo(a);return de({...i,ref:s,tag:"ical-event",sourceName:e.name},t)})):[]}async function pe(){try{let{sources:e,tzShift:t}=await Qo();if(e.length===0)return;await x.flashNotification("Syncing calendars...","info");let r=[];for(let n of e)try{let o=await Xo(n,t);r.push(...o)}catch(o){console.error(`Failed to sync ${n.name}:`,o)}await V.indexObjects("$icalendar",r),await x.flashNotification(`Synced ${r.length} events`,"info")}catch(e){console.error("Sync failed:",e)}}async function dt(){await Y.del(ct),await pe()}async function pt(){if(!await x.confirm("Clear all calendar events?"))return;let e=await K.query({prefix:["ridx","$icalendar"]}),t=[];for(let{key:r}of e)t.push(r),t.push(["idx",...r.slice(2),"$icalendar"]);t.length>0&&await K.batchDel(t),await Y.del(ct),await x.flashNotification("Calendar index cleared","info")}async function vt(){await x.flashNotification(`iCalendar Plug ${Wo}`,"info")}var ft={syncCalendars:pe,forceSync:dt,clearCache:pt,showVersion:vt},mt={name:"Library/sstent/icalendar",version:"0.3.1",author:"sstent",functions:{syncCalendars:{path:"icalendar.ts:syncCalendars",command:"iCalendar: Sync"},forceSync:{path:"icalendar.ts:forceSync",command:"iCalendar: Force Sync"},clearCache:{path:"icalendar.ts:clearCache",command:"iCalendar: Clear Cache"},showVersion:{path:"icalendar.ts:showVersion",command:"iCalendar: Show Version"}},permissions:["http"],assets:{}},si={manifest:mt,functionMapping:ft};Ee(ft,mt,self.postMessage);export{si as plug}; +var dt=Object.defineProperty;var F=(e,t)=>{for(var n in t)dt(e,n,{get:t[n],enumerable:!0})};function me(e){let t=atob(e),n=t.length,r=new Uint8Array(n);for(let o=0;o(...r)=>{let o=this.prefix?[this.prefix,...r]:r;this.originalConsole[n](...o),this.captureLog(n,r)};console.log=t("log"),console.info=t("info"),console.warn=t("warn"),console.error=t("error"),console.debug=t("debug")}captureLog(t,n){let r={level:t,timestamp:Date.now(),message:n.map(o=>{if(typeof o=="string")return o;try{return JSON.stringify(o)}catch{return String(o)}}).join(" ")};this.logBuffer.push(r),this.logBuffer.length>this.maxCaptureSize&&this.logBuffer.shift()}async postToServer(t,n){if(this.logBuffer.length>0){let o=[...this.logBuffer];this.logBuffer=[];try{if(!(await fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(o.map(i=>({...i,source:n})))})).ok)throw new Error("Failed to post logs to server")}catch(s){console.warn("Could not post logs to server",s.message),this.logBuffer.unshift(...o)}}}},pe;function ye(e=""){return pe=new Z(e),pe}var w=e=>{throw new Error("Not initialized yet")},ee=typeof window>"u"&&typeof globalThis.WebSocketPair>"u";typeof Deno>"u"&&(self.Deno={args:[],build:{arch:"x86_64"},env:{get(){}}});var X=new Map,Q=0;ee&&(globalThis.syscall=async(e,...t)=>await new Promise((n,r)=>{Q++,X.set(Q,{resolve:n,reject:r}),w({type:"sys",id:Q,name:e,args:t})}));function fe(e,t,n){ee&&(w=n,self.addEventListener("message",r=>{(async()=>{let o=r.data;switch(o.type){case"inv":{let s=e[o.name];if(!s)throw new Error(`Function not loaded: ${o.name}`);try{let i=await Promise.resolve(s(...o.args||[]));w({type:"invr",id:o.id,result:i})}catch(i){console.error("An exception was thrown as a result of invoking function",o.name,"error:",i.message),w({type:"invr",id:o.id,error:i.message})}}break;case"sysr":{let s=o.id,i=X.get(s);if(!i)throw Error("Invalid request id");X.delete(s),o.error?i.reject(new Error(o.error)):i.resolve(o.result)}break}})().catch(console.error)}),w({type:"manifest",manifest:t}),ye(`[${t.name} plug]`))}async function mt(e,t){if(typeof e!="string"){let n=new Uint8Array(await e.arrayBuffer()),r=n.length>0?J(n):void 0;t={method:e.method,headers:Object.fromEntries(e.headers.entries()),base64Body:r},e=e.url}return syscall("sandboxFetch.fetch",e,t)}globalThis.nativeFetch=globalThis.fetch;function pt(){globalThis.fetch=async function(e,t){let n=t&&t.body?J(new Uint8Array(await new Response(t.body).arrayBuffer())):void 0,r=await mt(e,t&&{method:t.method,headers:t.headers,base64Body:n});return new Response(r.base64Body?me(r.base64Body):null,{status:r.status,headers:r.headers})}}ee&&pt();var R={};F(R,{alert:()=>Zt,configureVimMode:()=>yr,confirm:()=>Jt,copyToClipboard:()=>ur,deleteLine:()=>lr,dispatch:()=>Wt,downloadFile:()=>zt,filterBox:()=>Ft,flashNotification:()=>Ut,fold:()=>er,foldAll:()=>nr,getCurrentEditor:()=>Et,getCurrentPage:()=>yt,getCurrentPageMeta:()=>ft,getCurrentPath:()=>gt,getCursor:()=>ht,getRecentlyOpenedPages:()=>vt,getSelection:()=>At,getText:()=>Tt,getUiOption:()=>Qt,goHistory:()=>Kt,hidePanel:()=>Bt,insertAtCursor:()=>qt,insertAtPos:()=>_t,invokeCommand:()=>bt,isMobile:()=>gr,moveCursor:()=>$t,moveCursorToLine:()=>Ht,moveLineDown:()=>mr,moveLineUp:()=>dr,navigate:()=>Ct,newWindow:()=>Lt,openCommandPalette:()=>Dt,openPageNavigator:()=>Mt,openSearchPanel:()=>ar,openUrl:()=>wt,prompt:()=>Gt,rebuildEditorState:()=>Nt,redo:()=>sr,reloadConfigAndCommands:()=>It,reloadPage:()=>Rt,reloadUI:()=>Ot,replaceRange:()=>jt,save:()=>xt,sendMessage:()=>fr,setSelection:()=>Pt,setText:()=>St,setUiOption:()=>Xt,showPanel:()=>kt,showProgress:()=>Vt,toggleComment:()=>cr,toggleFold:()=>rr,undo:()=>ir,unfold:()=>tr,unfoldAll:()=>or,uploadFile:()=>Yt,vimEx:()=>pr});typeof self>"u"&&(self={syscall:()=>{throw new Error("Not implemented here")}});function u(e,...t){return globalThis.syscall(e,...t)}function yt(){return u("editor.getCurrentPage")}function ft(){return u("editor.getCurrentPageMeta")}function gt(){return u("editor.getCurrentPath")}function vt(){return u("editor.getRecentlyOpenedPages")}function Et(){return u("editor.getCurrentEditor")}function Tt(){return u("editor.getText")}function St(e,t=!1){return u("editor.setText",e,t)}function ht(){return u("editor.getCursor")}function At(){return u("editor.getSelection")}function Pt(e,t){return u("editor.setSelection",e,t)}function bt(e,t){return u("editor.invokeCommand",e,t)}function xt(){return u("editor.save")}function Ct(e,t=!1,n=!1){return u("editor.navigate",e,t,n)}function Mt(e="page"){return u("editor.openPageNavigator",e)}function Dt(){return u("editor.openCommandPalette")}function Rt(){return u("editor.reloadPage")}function Ot(){return u("editor.reloadUI")}function Nt(){return u("editor.rebuildEditorState")}function It(){return u("editor.reloadConfigAndCommands")}function wt(e,t=!1){return u("editor.openUrl",e,t)}function Lt(){return u("editor.newWindow")}function Kt(e){return u("editor.goHistory",e)}function zt(e,t){return u("editor.downloadFile",e,t)}function Yt(e,t){return u("editor.uploadFile",e,t)}function Ut(e,t="info"){return u("editor.flashNotification",e,t)}function Ft(e,t,n="",r=""){return u("editor.filterBox",e,t,n,r)}function kt(e,t,n,r=""){return u("editor.showPanel",e,t,n,r)}function Bt(e){return u("editor.hidePanel",e)}function Vt(e,t){return u("editor.showProgress",e,t)}function _t(e,t){return u("editor.insertAtPos",e,t)}function jt(e,t,n){return u("editor.replaceRange",e,t,n)}function $t(e,t=!1){return u("editor.moveCursor",e,t)}function Ht(e,t=1,n=!1){return u("editor.moveCursorToLine",e,t,n)}function qt(e,t=!1,n=!1){return u("editor.insertAtCursor",e,t,n)}function Wt(e){return u("editor.dispatch",e)}function Gt(e,t=""){return u("editor.prompt",e,t)}function Jt(e){return u("editor.confirm",e)}function Zt(e){return u("editor.alert",e)}function Qt(e){return u("editor.getUiOption",e)}function Xt(e,t){return u("editor.setUiOption",e,t)}function er(){return u("editor.fold")}function tr(){return u("editor.unfold")}function rr(){return u("editor.toggleFold")}function nr(){return u("editor.foldAll")}function or(){return u("editor.unfoldAll")}function ir(){return u("editor.undo")}function sr(){return u("editor.redo")}function ar(){return u("editor.openSearchPanel")}function ur(e){return u("editor.copyToClipboard",e)}function lr(){return u("editor.deleteLine")}function cr(){return u("editor.toggleComment")}function dr(){return u("editor.moveLineUp")}function mr(){return u("editor.moveLineDown")}function pr(e){return u("editor.vimEx",e)}function yr(){return u("editor.configureVimMode")}function fr(e,t){return u("editor.sendMessage",e,t)}function gr(){return u("editor.isMobile")}var k={};F(k,{del:()=>Ar,get:()=>hr,set:()=>Sr});function Sr(e,t){return u("clientStore.set",e,t)}function hr(e){return u("clientStore.get",e)}function Ar(e){return u("clientStore.delete",e)}var Zo=new Uint8Array(16);var B={};F(B,{define:()=>Yr,get:()=>wr,has:()=>zr,insert:()=>Kr,set:()=>Lr});function wr(e,t){return u("config.get",e,t)}function Lr(e,t){return u("config.set",e,t)}function Kr(e,t){return u("config.insert",e,t)}function zr(e){return u("config.has",e)}function Yr(e,t){return u("config.define",e,t)}var V={};F(V,{ensureFullIndex:()=>Br,getObjectByRef:()=>kr,indexObjects:()=>Ur,queryLuaObjects:()=>Fr});function Ur(e,t){return u("index.indexObjects",e,t)}function Fr(e,t,n,r){return u("index.queryLuaObjects",e,t,n,r)}function kr(e,t,n){return u("index.getObjectByRef",e,t,n)}function Br(){return u("index.ensureFullIndex")}var b=e=>Object.fromEntries(Object.entries(e).map(([t,n])=>[n,t])),v=e=>Object.keys(e),Pe={action:"ACTION",description:"DESCRIPTION",duration:"DURATION",repeat:"REPEAT",summary:"SUMMARY",trigger:"TRIGGER",attachments:"ATTACH",attendees:"ATTENDEE"},be=b(Pe),mi=v(be),pi=v(Pe),xe={method:"METHOD",prodId:"PRODID",version:"VERSION",name:"X-WR-CALNAME"},Ce=b(xe),yi=v(Ce),fi=v(xe),Me={alarms:"ALARM",categories:"CATEGORIES",created:"CREATED",description:"DESCRIPTION",lastModified:"LAST-MODIFIED",location:"LOCATION",exceptionDates:"EXDATE",recurrenceRule:"RRULE",stamp:"DTSTAMP",start:"DTSTART",summary:"SUMMARY",uid:"UID",timeTransparent:"TRANSP",url:"URL",end:"DTEND",duration:"DURATION",geo:"GEO",class:"CLASS",organizer:"ORGANIZER",priority:"PRIORITY",sequence:"SEQUENCE",status:"STATUS",attach:"ATTACH",recurrenceId:"RECURRENCE-ID",attendees:"ATTENDEE",comment:"COMMENT"},De=b(Me),gi=v(De),vi=v(Me),Re={id:"TZID",lastModified:"LAST-MODIFIED",url:"TZURL"},Oe=b(Re),Ei=v(Oe),Ti=v(Re),Ne={comment:"COMMENT",name:"TZNAME",offsetFrom:"TZOFFSETFROM",offsetTo:"TZOFFSETTO",recurrenceDate:"RDATE",recurrenceRule:"RRULE",start:"DTSTART"},Ie=b(Ne),Si=v(Ie),hi=v(Ne),we={byDay:"BYDAY",byHour:"BYHOUR",byMinute:"BYMINUTE",byMonth:"BYMONTH",byMonthday:"BYMONTHDAY",bySecond:"BYSECOND",bySetPos:"BYSETPOS",byWeekNo:"BYWEEKNO",byYearday:"BYYEARDAY",count:"COUNT",frequency:"FREQ",interval:"INTERVAL",until:"UNTIL",workweekStart:"WKST"},Le=b(we),Ai=v(Le),Pi=v(we),Ke={categories:"CATEGORIES",created:"CREATED",description:"DESCRIPTION",lastModified:"LAST-MODIFIED",location:"LOCATION",exceptionDates:"EXDATE",recurrenceRule:"RRULE",stamp:"DTSTAMP",start:"DTSTART",summary:"SUMMARY",uid:"UID",url:"URL",duration:"DURATION",geo:"GEO",class:"CLASS",organizer:"ORGANIZER",priority:"PRIORITY",sequence:"SEQUENCE",status:"STATUS",attach:"ATTACH",recurrenceId:"RECURRENCE-ID",attendees:"ATTENDEE",comment:"COMMENT",completed:"COMPLETED",due:"DUE",percentComplete:"PERCENT-COMPLETE"},ze=b(Ke),bi=v(ze),xi=v(Ke),Ye={categories:"CATEGORIES",created:"CREATED",description:"DESCRIPTION",lastModified:"LAST-MODIFIED",exceptionDates:"EXDATE",recurrenceRule:"RRULE",stamp:"DTSTAMP",start:"DTSTART",summary:"SUMMARY",uid:"UID",url:"URL",geo:"GEO",class:"CLASS",organizer:"ORGANIZER",sequence:"SEQUENCE",status:"STATUS",attach:"ATTACH",recurrenceId:"RECURRENCE-ID",attendees:"ATTENDEE",comment:"COMMENT"},Ue=b(Ye),Ci=v(Ue),Mi=v(Ye),Fe={stamp:"DTSTAMP",start:"DTSTART",uid:"UID",url:"URL",organizer:"ORGANIZER",attendees:"ATTENDEE",comment:"COMMENT",end:"DTEND",freeBusy:"FREEBUSY"},ke=b(Fe),Di=v(ke),Ri=v(Fe),Be="BEGIN",Ve="END",Vr="VCALENDAR",_e="VTIMEZONE",_r="STANDARD",jr="DAYLIGHT",je="VEVENT",$e="VALARM",He="VTODO",qe="VJOURNAL",We="VFREEBUSY";var ge=e=>new RegExp(`${Be}:${e}([\\s\\S]*?)${Ve}:${e}`,"g"),$r=e=>new RegExp(`${Be}:${e}|${Ve}:${e}`,"g");var re=/\r\n|\r|\n/;var ve=` +`,Hr=":",I=",",qr='"',ne=";";var Ee="=";var Wr=Math.pow(10,8)*24*60*60*1e3,Oi=-Wr,Gr=6048e5;var Ge=6e4,Je=36e5,Jr=3600,Ze=Jr*24,Ni=Ze*7,Zr=Ze*365.2425,Qr=Zr/12,Ii=Qr*3,Te=Symbol.for("constructDateFrom");function h(e,t){return typeof e=="function"?e(t):e&&typeof e=="object"&&Te in e?e[Te](t):e instanceof Date?new e.constructor(t):new Date(t)}function d(e,t){return h(t||e,e)}function ie(e,t,n){let r=d(e,n?.in);return isNaN(t)?h(n?.in||e,NaN):(t&&r.setDate(r.getDate()+t),r)}function Qe(e,t,n){let r=d(e,n?.in);if(isNaN(t))return h(n?.in||e,NaN);if(!t)return r;let o=r.getDate(),s=h(n?.in||e,r.getTime());s.setMonth(r.getMonth()+t+1,0);let i=s.getDate();return o>=i?s:(r.setFullYear(s.getFullYear(),s.getMonth(),o),r)}function H(e,t,n){return h(n?.in||e,+d(e)+t)}function Xr(e,t,n){return H(e,t*Je,n)}var en={};function q(){return en}function j(e,t){var n,r,o,s;let i=q(),a=t?.weekStartsOn??((r=(n=t?.locale)==null?void 0:n.options)==null?void 0:r.weekStartsOn)??i.weekStartsOn??((s=(o=i.locale)==null?void 0:o.options)==null?void 0:s.weekStartsOn)??0,l=d(e,t?.in),c=l.getDay(),m=(ctypeof r=="object"));return t.map(n)}function rn(e,t){let n=d(e,t?.in);return n.setHours(0,0,0,0),n}function Xe(e,t,n){let r=d(e,n?.in);return r.setTime(r.getTime()+t*Ge),r}function nn(e,t,n){return H(e,t*1e3,n)}function se(e,t,n){return ie(e,t*7,n)}function et(e,t,n){return Qe(e,t*12,n)}function ae(e,t){let n=+d(e)-+d(t);return n<0?-1:n>0?1:n}function Se(e,t){let n=d(e,t?.in),r=n.getMonth();return n.setFullYear(n.getFullYear(),r+1,0),n.setHours(23,59,59,999),n}function on(e,t){let[n,r]=tn(e,t.start,t.end);return{start:n,end:r}}function sn(e,t){let{start:n,end:r}=on(t?.in,e),o=+n>+r,s=o?+n:+r,i=o?r:n;i.setHours(0,0,0,0);let a=t?.step??1;if(!a)return[];a<0&&(a=-a,o=!o);let l=[];for(;+i<=s;)l.push(h(n,i)),i.setDate(i.getDate()+a),i.setHours(0,0,0,0);return o?l.reverse():l}function he(e,t){let n=d(e,t?.in);return n.setDate(1),n.setHours(0,0,0,0),n}function an(e,t){let n=d(e,t?.in),r=n.getFullYear();return n.setFullYear(r+1,0,0),n.setHours(23,59,59,999),n}function un(e,t){let n=d(e,t?.in);return n.setFullYear(n.getFullYear(),0,1),n.setHours(0,0,0,0),n}function ln(e,t){var n,r,o,s;let i=d(e,t?.in),a=i.getFullYear(),l=q(),c=t?.firstWeekContainsDate??((r=(n=t?.locale)==null?void 0:n.options)==null?void 0:r.firstWeekContainsDate)??l.firstWeekContainsDate??((s=(o=l.locale)==null?void 0:o.options)==null?void 0:s.firstWeekContainsDate)??1,m=h(t?.in||e,0);m.setFullYear(a+1,0,c),m.setHours(0,0,0,0);let E=j(m,t),y=h(t?.in||e,0);y.setFullYear(a,0,c),y.setHours(0,0,0,0);let A=j(y,t);return+i>=+E?a+1:+i>=+A?a:a-1}function cn(e,t){var n,r,o,s;let i=q(),a=t?.firstWeekContainsDate??((r=(n=t?.locale)==null?void 0:n.options)==null?void 0:r.firstWeekContainsDate)??i.firstWeekContainsDate??((s=(o=i.locale)==null?void 0:o.options)==null?void 0:s.firstWeekContainsDate)??1,l=ln(e,t),c=h(t?.in||e,0);return c.setFullYear(l,0,a),c.setHours(0,0,0,0),j(c,t)}function dn(e,t){let n=d(e,t?.in),r=+j(n,t)-+cn(n,t);return Math.round(r/Gr)+1}function _(e,t){return d(e,t?.in).getDay()}function tt(e,t){let n=d(e,t?.in),r=n.getFullYear(),o=n.getMonth(),s=h(n,0);return s.setFullYear(r,o+1,0),s.setHours(0,0,0,0),s.getDate()}function mn(e,t){return d(e,t?.in).getHours()}function pn(e,t){return d(e,t?.in).getMinutes()}function rt(e,t){return d(e,t?.in).getMonth()}function yn(e){return d(e).getSeconds()}function fn(e,t){return d(e,t?.in).getFullYear()}function gn(e,t){return+d(e)==+d(t)}function vn(e,t,n){let r=d(e,n?.in),o=dn(r,n)-t;return r.setDate(r.getDate()-o*7),d(r,n?.in)}function $(e,t,n){var r,o,s,i;let a=q(),l=n?.weekStartsOn??((o=(r=n?.locale)==null?void 0:r.options)==null?void 0:o.weekStartsOn)??a.weekStartsOn??((i=(s=a.locale)==null?void 0:s.options)==null?void 0:i.weekStartsOn)??0,c=d(e,n?.in),m=c.getDay(),E=(t%7+7)%7,y=7-l,A=t<0||t>6?t-(m+y)%7:(E+y)%7-(m+y)%7;return ie(c,A,n)}function nt(e,t,n){let r=+d(e,n?.in),[o,s]=[+d(t.start,n?.in),+d(t.end,n?.in)].sort((i,a)=>i-a);return r>=o&&r<=s}function En(e){let t=e/Je;return Math.trunc(t)}function Tn(e){let t=e/Ge;return Math.trunc(t)}function Sn(e,t,n){let r=d(e,n?.in),o=r.getFullYear(),s=r.getDate(),i=h(n?.in||e,0);i.setFullYear(o,t,15),i.setHours(0,0,0,0);let a=tt(i);return r.setMonth(t,Math.min(s,a)),r}function hn(e,t,n){let r=d(e,n?.in);return r.setDate(t),r}function An(e,t,n){let r=d(e,n?.in);return r.setMonth(0),r.setDate(t),r}function Pn(e,t,n){let r=d(e,n?.in);return r.setHours(t),r}function bn(e,t,n){let r=d(e,n?.in);return r.setMinutes(t),r}function xn(e,t,n){let r=d(e,n?.in);return r.setSeconds(t),r}function Cn(e,t,n){return H(e,-t,n)}function Mn(e,t,n){return se(e,-t,n)}var Dn=[_r,jr];var Rn=["SECONDLY","MINUTELY","HOURLY","DAILY","WEEKLY","MONTHLY","YEARLY"];var ot=["SU","MO","TU","WE","TH","FR","SA"];var O=(e,t)=>t===void 0?!1:e>=t,On=(e,{start:t,end:n},r)=>{if(O(r.length,e.count))return;let o=e.frequency,s=e.interval||1;if(!o)return;let i=t;if(o==="SECONDLY"){for(;i{let o=n.map(({day:s,occurrence:i})=>({occurrence:i,day:ot.indexOf(s)}));return e.frequency==="YEARLY"?e.byYearday||e.byMonthday?t.map(s=>s.filter(i=>o.find(({day:a})=>a===_(i)))):e.byWeekNo?t.map(s=>s.flatMap(i=>o.map(({day:a})=>$(i,a,{weekStartsOn:r})))):e.byMonth?t.map(s=>s.flatMap(i=>o.flatMap(({day:a,occurrence:l})=>te(x(he(i)),x(Se(i)),a,r,l)))):t.map(s=>s.flatMap(i=>o.flatMap(({day:a,occurrence:l})=>te(x(un(i)),x(an(i)),a,r,l)))):e.frequency==="MONTHLY"?e.byMonthday?t.map(s=>s.filter(i=>o.find(({day:a})=>a===_(i)))):t.map(s=>s.flatMap(i=>o.flatMap(({day:a,occurrence:l})=>te(x(he(i)),x(Se(i)),a,r,l)))):e.frequency==="WEEKLY"?t.map(s=>s.flatMap(i=>o.map(({day:a})=>$(i,a,{weekStartsOn:r})))):t.map(s=>s.filter(i=>o.find(({day:a})=>a===_(i))))},te=(e,t,n,r,o)=>{if(o!==void 0){if(!(o<0)){let a=$(e,n,{weekStartsOn:r}),l=e>a;return se(a,(o||1)-1+(l?1:0))}let s=$(t,n,{weekStartsOn:r}),i=tx(s)).filter(s=>nt(s,{start:e,end:t})).filter(s=>n===_(s))},x=e=>Xe(e,-e.getTimezoneOffset()),In=(e,t,n)=>e.frequency==="YEARLY"||e.frequency==="MONTHLY"||e.frequency==="WEEKLY"||e.frequency==="DAILY"?t.map(r=>r.flatMap(o=>n.map(s=>Pn(o,s)))):t.map(r=>r.filter(o=>n.includes(mn(o)))),wn=(e,t,n)=>e.frequency==="YEARLY"||e.frequency==="MONTHLY"||e.frequency==="WEEKLY"||e.frequency==="DAILY"||e.frequency==="HOURLY"?t.map(r=>r.flatMap(o=>n.map(s=>bn(o,s)))):t.map(r=>r.filter(o=>n.includes(pn(o)))),Ln=(e,t,n)=>e.frequency==="YEARLY"?t.map(r=>r.flatMap(o=>n.map(s=>Sn(o,s)))):t.map(r=>r.filter(o=>n.includes(rt(o)))),Kn=(e,t,n)=>e.frequency==="YEARLY"||e.frequency==="MONTHLY"?t.map(r=>r.flatMap(o=>{let s=tt(o);return n.map(i=>i>s?void 0:hn(o,i)).filter(i=>!!i)})):e.frequency==="WEEKLY"?t:t.map(r=>r.filter(o=>n.includes(rt(o)))),zn=(e,t,n)=>e.frequency==="YEARLY"||e.frequency==="MONTHLY"||e.frequency==="WEEKLY"||e.frequency==="DAILY"||e.frequency==="HOURLY"||e.frequency==="MINUTELY"?t.map(r=>r.flatMap(o=>n.map(s=>xn(o,s)))):t.map(r=>r.filter(o=>n.includes(yn(o)))),Yn=(e,t,n)=>!e.byYearday&&!e.byWeekNo&&!e.byMonthday&&!e.byMonth&&!e.byDay&&!e.byHour&&!e.byMinute&&!e.bySecond?t:t.map(r=>r.sort(ae).filter((o,s)=>n.some(i=>i>0?s===0?!1:s%i===0:s===0?r.length-1+i===0:s%(r.length-1+i)===0))),Un=(e,t,n,r)=>e.frequency==="YEARLY"?t.map(o=>o.flatMap(s=>n.map(i=>vn(s,i,{weekStartsOn:r})))):t,Fn=(e,t,n)=>e.frequency==="YEARLY"?t.map(r=>r.flatMap(o=>n.map(s=>An(o,s)))):e.frequency==="MONTHLY"||e.frequency==="WEEKLY"||e.frequency==="DAILY"?t:t.map(r=>r.filter(o=>n.includes(fn(o)))),kn=(e,t,n)=>{let r=n;return e.byMonth&&(r=Ln(e,r,e.byMonth)),e.byWeekNo&&(r=Un(e,r,e.byWeekNo,t.weekStartsOn)),e.byYearday&&(r=Fn(e,r,e.byYearday)),e.byMonthday&&(r=Kn(e,r,e.byMonthday)),e.byDay&&(r=Nn(e,r,e.byDay,t.weekStartsOn)),e.byHour&&(r=In(e,r,e.byHour)),e.byMinute&&(r=wn(e,r,e.byMinute)),e.bySecond&&(r=zn(e,r,e.bySecond)),e.bySetPos&&(r=Yn(e,r,e.bySetPos)),r.map(o=>o.sort(ae).filter(s=>!(t.exceptions.length>0&&t.exceptions.some(i=>gn(i,s))||!nt(s,{start:t.start,end:t.end}))))},Bn=2,Vn=(e,t)=>{var n;let r=t.start,o=((n=e.until)==null?void 0:n.date)||t?.end||et(r,Bn),s=t.exceptions||[],i=(e.workweekStart?ot.indexOf(e.workweekStart):1)%7,a=[[r]];On(e,{start:r,end:o},a);let l=kn(e,{start:r,end:o,exceptions:s,weekStartsOn:i},a);return e.count?l.flat().splice(0,e.count):l.flat()},_n=(e,t)=>t.flatMap(n=>!n.recurrenceRule||n.recurrenceRule.until&&n.recurrenceRule.until.date({...n,start:r}))),oe=e=>{let t=e[0]==="+"?1:-1,n=Number(e.slice(1,3)),r=e.length>3?Number(e.slice(3,5)):0,o=e.length>5?Number(e.slice(5,7)):0;return((n*60+r)*60+o)*1e3*t},jn=(e,t)=>{let n="en-US",r=new Date(t.toLocaleString(n,{timeZone:"UTC"}));try{return new Date(t.toLocaleString(n,{timeZone:e})).getTime()-r.getTime()}catch{return t.getTime()-r.getTime()}},$n=(e,t,n)=>{let r=n?.find(s=>s.id===t);if(r){let s=_n(e,r.props).sort((l,c)=>ae(l.start,c.start));for(let l=0;l5?c.substring(0,5):c;return{offset:m,milliseconds:oe(m)}}let i=s[s.length-1].offsetTo,a=i.length>5?i.substring(0,5):i;return{offset:a,milliseconds:oe(a)}}let o=jn(t,e);if(!Number.isNaN(o)){let s=o<0,i=Math.abs(En(o)),a=Math.abs(Tn(o))-i*60,l=i.toString().length===1?`0${i}`:i.toString(),c=a.toString().length===1?`0${a}`:a.toString();return{offset:`${s?"-":"+"}${l}${c}`,milliseconds:o}}};var p=(e,t)=>{if(e===void 0)return t;let n=e["~standard"].validate(t);if(n instanceof Promise)throw new TypeError("Schema validation must be synchronous");if(n.issues)throw new Error(JSON.stringify(n.issues,null,2));return n.value},Hn=(e,t)=>{var n,r,o,s;let i=((n=t.options)==null?void 0:n.VALUE)==="BINARY"?{type:"binary",encoding:((r=t.options)==null?void 0:r.ENCODING)||"BASE64",binary:t.value,value:(o=t.options)==null?void 0:o.VALUE}:{type:"uri",url:t.value,formatType:(s=t.options)==null?void 0:s.FMTTYPE};return p(e,i)},N=e=>e.replace(/mailto:/gi,""),z=(e,t)=>{var n,r,o,s,i,a,l,c,m,E,y;return p(e,{email:N(t.value),delegatedFrom:(n=t.options)!=null&&n["DELEGATED-FROM"]?N((r=t.options)==null?void 0:r["DELEGATED-FROM"]):void 0,dir:(o=t.options)==null?void 0:o.DIR,member:(s=t.options)!=null&&s.MEMBER?N(t.options.MEMBER):void 0,name:(i=t.options)==null?void 0:i.CN,partstat:(a=t.options)==null?void 0:a.PARTSTAT,role:(l=t.options)==null?void 0:l.ROLE,sentBy:(c=t.options)!=null&&c["SENT-BY"]?N(t.options["SENT-BY"]):void 0,rsvp:(m=t.options)!=null&&m.RSVP?((E=t.options)==null?void 0:E.RSVP)==="TRUE"?!0:((y=t.options)==null?void 0:y.RSVP)==="FALSE"?!1:void 0:void 0})},Y=(e,t)=>{let n=t.value,r={};n[0]==="-"&&(r.before=!0,n=n.slice(1)),n=n.slice(1);let o=n.split("T"),s=o[0];if(s.includes("D")){let[a,l]=s.split("D");r.days=Number(a),s=l}if(s.includes("W")){let[a,l]=s.split("W");r.weeks=Number(a),s=l}let i=o[1];if(i){if(i.includes("H")){let[a,l]=i.split("H");r.hours=Number(a),i=l}if(i.includes("M")){let[a,l]=i.split("M");r.minutes=Number(a),i=l}if(i.includes("S")){let[a,l]=i.split("S");r.seconds=Number(a),i=l}}return p(e,r)},qn=(e,t)=>{let n=Number.parseInt(t.value.slice(0,4),10),r=Number.parseInt(t.value.slice(4,6),10)-1,o=Number.parseInt(t.value.slice(6,8),10),s=new Date(Date.UTC(n,r,o));return p(e,s)},L=(e,t)=>{let n=Number.parseInt(t.value.slice(0,4),10),r=Number.parseInt(t.value.slice(4,6),10)-1,o=Number.parseInt(t.value.slice(6,8),10),s=Number.parseInt(t.value.slice(9,11),10),i=Number.parseInt(t.value.slice(11,13),10),a=Number.parseInt(t.value.slice(13,15),10),l=new Date(Date.UTC(n,r,o,s,i,a));return p(e,l)},Wn=(e,t,n)=>{let r=oe(n),o=L(void 0,t),s=Cn(o,r);return p(e,s)},Gn=(e,t)=>{var n,r,o,s,i,a;if(((n=e.options)==null?void 0:n.VALUE)==="DATE")return{date:qn(void 0,e),type:(r=e.options)==null?void 0:r.VALUE};let l=((o=e.options)==null?void 0:o.VALUE)||"DATE-TIME",c=L(void 0,e);if(!((s=e.options)!=null&&s.TZID))return{date:c,type:l};let m=$n(c,e.options.TZID,t?.timezones);return m?{date:H(c,-m.milliseconds),type:l,local:(i=e.options)!=null&&i.TZID?{date:c,timezone:(a=e.options)==null?void 0:a.TZID,tzoffset:m.offset}:void 0}:{date:c,type:l}},g=(e,t,n)=>p(e,Gn(t,n)),Jn=(e,t,n)=>{var r,o,s,i;let a=((r=t.options)==null?void 0:r.VALUE)==="DATE-TIME"||((o=t.options)==null?void 0:o.VALUE)==="DATE"?{type:"absolute",value:g(void 0,t,n),options:{related:(s=t.options)==null?void 0:s.RELATED}}:{type:"relative",value:Y(void 0,t),options:{related:(i=t.options)==null?void 0:i.RELATED}};return p(e,a)},Zn=e=>e.startsWith('"')&&e.endsWith('"')?e.slice(1,-1):e,it=e=>e.map(t=>{let[n,...r]=t.split(Ee),o=r.join(Ee);return{property:n,value:Zn(o)}},{}),Qn=e=>e.reduce((t,n)=>(t[n.property]=n.value,t),{}),Xn=e=>Qn(it(e)),eo=e=>{let t=!1,n;for(let s=0;s{let{property:t,value:n}=eo(e);if(t.includes(ne)){let[r,...o]=t.split(ne),s=Xn(o);return{property:r,line:{options:s,value:n}}}return{property:t,line:{value:n}}},Ae=e=>/^[ \t]/.test(e),ro=e=>/^[A-Z]+(?:-[A-Z]+)*[:;]/.test(e),no=e=>{let t=[],n=e.split(re);for(;n[0]==="";)n.shift();let r=n.length;for(;r>0&&n[r-1]==="";)r-=1,n.pop();for(let o=0;oo!=="")},oo=(e,t,n)=>{if(!t)return e;let r={};return Object.entries(t).forEach(([o,s])=>{let i=Object.entries(n||{}).find(([c,m])=>m.name===o);if(!i){r[io(o)]=s.value;return}let a=i[1].convert(s),l=i[1].schema;if(!l){r[i[0]]=a;return}r[i[0]]=p(l,a)}),e.nonStandard=r,e},io=e=>{let t=e.startsWith("X-")?e.slice(2):e,n="",r=!1;for(let o of t)o==="-"?r=!0:(n+=r?o.toUpperCase():o.toLowerCase(),r=!1);return n},so=e=>e.startsWith("X-"),C=(e,t,n)=>{let r=t.replace($r(n?.icsComponent),""),o=[...new Set(Object.values(n.childComponents||{}).flatMap(({icsComponent:E})=>E))],s=no(o.reduce((E,y)=>E.replace(ge(y),""),r)),i=n.defaultValues||{},a={};s.forEach(E=>{var y,A;let{property:P,line:T}=to(E);so(P)&&(a[P]=T);let f=n.objectKeyMap[P];if(!f)return;let M=(y=n.convertArrayValues)==null?void 0:y[f];if(M){let D=M({line:T});if(!D)return;(i[f]===void 0||i[f]===null||!Array.isArray(i[f]))&&(i[f]=[]),Array.isArray(D)?i[f].push(...D):i[f].push(D);return}let U=(A=n.convertValues)==null?void 0:A[f];if(U){let D=U({line:T});if(!D)return;i[f]=D;return}i[f]=T.value});let l=n.childComponents,c=l?Object.keys(l||{}):[];l&&c.length>0&&c.forEach(E=>{let y=l?.[E];if(!y)return;let A=Array.isArray(y.icsComponent)?y.icsComponent:[y.icsComponent],P=[],T=[];A.forEach(f=>{T.push(...r.matchAll(ge(f)))}),T.map(f=>f[0]).forEach(f=>{let M=y.convert(f,{data:i});M&&P.push(M)}),P.length!==0&&(i[E]=P)});let m=p(e,i);return n!=null&&n.nonStandard?oo(m,a,n?.nonStandard):m},W=(e,t)=>{var n,r,o;return p(e,{name:(n=t.options)==null?void 0:n.CN,dir:(r=t.options)==null?void 0:r.DIR,sentBy:(o=t.options)!=null&&o["SENT-BY"]?N(t.options["SENT-BY"]):void 0,email:N(t.value)})},ue=(e,t,n)=>{var r;return p(e,{value:g(void 0,t,n),range:(r=t.options)==null?void 0:r.RANGE})},ao=e=>{if(e.length===2)return{day:e};let t=e.slice(0,-2);return{day:e.replace(t,""),occurrence:Number(t)}},uo=(e,t)=>p(e,ao(t.value)),lo=(e,t)=>p(e,t.value),co=["until"],mo=e=>co.includes(e),po=["bySecond","byMinute","byHour","byMonthday","byYearday","byWeekNo","bySetPos"],yo=e=>po.includes(e),fo=["byDay"],go=e=>fo.includes(e),vo=["count","interval"],Eo=e=>vo.includes(e),G=(e,t,n)=>{let r={};return it(t.value.split(ne)).forEach(o=>{let{property:s,value:i}=o,a=Le[s];if(a){if(mo(a)){r[a]=g(void 0,{value:i,options:{VALUE:i.includes("T")?"DATE-TIME":"DATE"}},{timezones:n?.timezones});return}if(yo(a)){r[a]=i.split(I).map(l=>Number(l));return}if(a==="byMonth"){r[a]=i.split(I).map(l=>Number(l)-1);return}if(go(a)){r[a]=i.split(I).map(l=>uo(void 0,{value:l}));return}if(Eo(a)){r[a]=Number(i);return}if(a==="frequency"){if(!i||!Rn.includes(i))return;r[a]=i;return}if(a==="workweekStart"){r[a]=lo(void 0,{value:i});return}}}),p(e,r)},le=(e,t)=>p(e,t.value),To=(e,t)=>p(e,t.value),ce=(e,t,n)=>p(e,t.value.split(",").map(r=>g(void 0,{value:r,options:t.options},n))),So=(e,t)=>p(e,t.value),ho=(e,t)=>p(e,t.value),Ao=(e,t)=>p(e,t.value),K=(e,t)=>p(e,Number.parseInt(t.value,10)),Po=e=>e.replace(/\\(([,;\\])|([nN]))/g,(t,n,r)=>r||` +`),S=(e,t)=>p(e,Po(t.value)),bo=(...e)=>{let[t,n,r]=e;return C(t,n,{icsComponent:$e,objectKeyMap:be,convertValues:{trigger:({line:o})=>Jn(void 0,o,{timezones:r?.timezones}),duration:({line:o})=>Y(void 0,o),repeat:({line:o})=>K(void 0,o)},convertArrayValues:{attachments:({line:o})=>Hn(void 0,o),attendees:({line:o})=>z(void 0,o)},nonStandard:r?.nonStandard,timezones:r?.timezones})},xo=(...e)=>{let[t,n,r]=e,o,s=C(t,n,{icsComponent:je,objectKeyMap:De,convertValues:{stamp:({line:i})=>g(void 0,i,{timezones:r?.timezones}),start:({line:i})=>g(void 0,i,{timezones:r?.timezones}),end:({line:i})=>g(void 0,i,{timezones:r?.timezones}),created:({line:i})=>g(void 0,i,{timezones:r?.timezones}),lastModified:({line:i})=>g(void 0,i,{timezones:r?.timezones}),categories:({line:i})=>i.value.split(I),description:({line:i})=>{var a;return(a=i.options)!=null&&a.ALTREP&&(o=i.options.ALTREP),S(void 0,i)},location:({line:i})=>S(void 0,i),comment:({line:i})=>S(void 0,i),summary:({line:i})=>S(void 0,i),recurrenceRule:({line:i})=>G(void 0,i,{timezones:r?.timezones}),duration:({line:i})=>Y(void 0,i),organizer:({line:i})=>W(void 0,i),sequence:({line:i})=>K(void 0,i),class:({line:i})=>le(void 0,i),recurrenceId:({line:i})=>ue(void 0,i,{timezones:r?.timezones}),status:({line:i})=>So(void 0,i),timeTransparent:({line:i})=>To(void 0,i)},convertArrayValues:{attendees:({line:i})=>z(void 0,i),exceptionDates:({line:i})=>ce(void 0,i,{timezones:r?.timezones})},childComponents:{alarms:{icsComponent:$e,convert:i=>bo(void 0,i,{nonStandard:r?.nonStandard,timezones:r?.timezones})}},timezones:r?.timezones,nonStandard:r?.nonStandard});return o&&(s.descriptionAltRep=o),s},Co=(...e)=>{let[t,n,r]=e,o=n.split("BEGIN:")[1].split(re)[0],s=Dn.includes(o)?o:"STANDARD",i=n.split("TZOFFSETTO:")[1].split(re)[0];return C(t,n,{icsComponent:s,objectKeyMap:Ie,defaultValues:{type:s},convertValues:{start:({line:a})=>Wn(void 0,a,i),recurrenceRule:({line:a})=>G(void 0,a,{timezones:r?.timezones}),recurrenceDate:({line:a})=>g(void 0,a,{timezones:r?.timezones})},nonStandard:r?.nonStandard,timezones:r?.timezones})},Mo=(...e)=>{let[t,n,r]=e;return C(t,n,{icsComponent:_e,objectKeyMap:Oe,convertValues:{lastModified:({line:o})=>L(void 0,o)},childComponents:{props:{icsComponent:["DAYLIGHT","STANDARD"],convert:o=>Co(void 0,o,{nonStandard:r?.nonStandard,timezones:r?.timezones})}},nonStandard:r?.nonStandard,timezones:r?.timezones})},Do=(...e)=>{let[t,n,r]=e;return C(t,n,{icsComponent:He,objectKeyMap:ze,convertValues:{stamp:({line:o})=>g(void 0,o,{timezones:r?.timezones}),start:({line:o})=>g(void 0,o,{timezones:r?.timezones}),due:({line:o})=>g(void 0,o,{timezones:r?.timezones}),created:({line:o})=>g(void 0,o,{timezones:r?.timezones}),lastModified:({line:o})=>g(void 0,o,{timezones:r?.timezones}),completed:({line:o})=>g(void 0,o,{timezones:r?.timezones}),categories:({line:o})=>o.value.split(I),description:({line:o})=>S(void 0,o),location:({line:o})=>S(void 0,o),comment:({line:o})=>S(void 0,o),summary:({line:o})=>S(void 0,o),recurrenceRule:({line:o})=>G(void 0,o,{timezones:r?.timezones}),duration:({line:o})=>Y(void 0,o),organizer:({line:o})=>W(void 0,o),sequence:({line:o})=>K(void 0,o),percentComplete:({line:o})=>K(void 0,o),class:({line:o})=>le(void 0,o),recurrenceId:({line:o})=>ue(void 0,o,{timezones:r?.timezones}),status:({line:o})=>ho(void 0,o)},convertArrayValues:{attendees:({line:o})=>z(void 0,o),exceptionDates:({line:o})=>ce(void 0,o,{timezones:r?.timezones})},nonStandard:r?.nonStandard,timezones:r?.timezones})},Ro=(...e)=>{let[t,n,r]=e;return C(t,n,{icsComponent:qe,objectKeyMap:Ue,convertValues:{stamp:({line:o})=>g(void 0,o,{timezones:r?.timezones}),start:({line:o})=>g(void 0,o,{timezones:r?.timezones}),created:({line:o})=>g(void 0,o,{timezones:r?.timezones}),lastModified:({line:o})=>g(void 0,o,{timezones:r?.timezones}),categories:({line:o})=>o.value.split(I),description:({line:o})=>S(void 0,o),comment:({line:o})=>S(void 0,o),summary:({line:o})=>S(void 0,o),recurrenceRule:({line:o})=>G(void 0,o,{timezones:r?.timezones}),organizer:({line:o})=>W(void 0,o),sequence:({line:o})=>K(void 0,o),class:({line:o})=>le(void 0,o),recurrenceId:({line:o})=>ue(void 0,o,{timezones:r?.timezones}),status:({line:o})=>Ao(void 0,o)},convertArrayValues:{attendees:({line:o})=>z(void 0,o),exceptionDates:({line:o})=>ce(void 0,o,{timezones:r?.timezones})},nonStandard:r?.nonStandard,timezones:r?.timezones})},Oo=(e,t)=>{var n;return p(e,{type:(n=t.options)==null?void 0:n.FBTYPE,values:t.value.split(",").map(r=>{let[o,s]=r.split("/"),i=L(void 0,{value:o});if(s.startsWith("PT")){let l=Y(void 0,{value:s});return{start:i,duration:l}}let a=L(void 0,{value:s});return{start:i,end:a}})})},No=(...e)=>{let[t,n,r]=e;return C(t,n,{icsComponent:We,objectKeyMap:ke,convertValues:{stamp:({line:o})=>g(void 0,o,{timezones:r?.timezones}),start:({line:o})=>g(void 0,o,{timezones:r?.timezones}),end:({line:o})=>g(void 0,o,{timezones:r?.timezones}),comment:({line:o})=>S(void 0,o),organizer:({line:o})=>W(void 0,o)},convertArrayValues:{attendees:({line:o})=>z(void 0,o),freeBusy:({line:o})=>Oo(void 0,o)},nonStandard:r?.nonStandard,timezones:r?.timezones})},st=(...e)=>{let[t,n,r]=e;return C(t,n,{icsComponent:Vr,objectKeyMap:Ce,convertValues:{version:({line:o})=>o.value},childComponents:{timezones:{icsComponent:_e,convert:o=>Mo(void 0,o,{nonStandard:r?.nonStandard})},events:{icsComponent:je,convert:(o,{data:s})=>xo(void 0,o,{nonStandard:r?.nonStandard,timezones:s.timezones})},todos:{icsComponent:He,convert:(o,{data:s})=>Do(void 0,o,{nonStandard:r?.nonStandard,timezones:s.timezones})},journals:{icsComponent:qe,convert:(o,{data:s})=>Ro(void 0,o,{nonStandard:r?.nonStandard,timezones:s.timezones})},freeBusy:{icsComponent:We,convert:(o,{data:s})=>No(void 0,o,{nonStandard:r?.nonStandard,timezones:s.timezones})}},nonStandard:r?.nonStandard})};var Io="0.3.11",wo="icalendar:lastSync",Lo={"GMT Standard Time":0,"W. Europe Standard Time":1,"Central Europe Standard Time":1,"Romance Standard Time":1,"Central European Standard Time":1,"Eastern Standard Time":-5,"Central Standard Time":-6,"Mountain Standard Time":-7,"Pacific Standard Time":-8,UTC:0,None:0};async function de(){let e=await B.get("icalendar",{sources:[]}),t=e.sources||[],n=e.tzShift||0;if(t.length===0)return;await R.flashNotification("Syncing calendars...","info");let r=[];for(let o of t){let i=await(await fetch(o.url)).text(),a=st(void 0,i);if(a.events)for(let l of a.events){let c=l.start,m="";c.local&&typeof c.local.date=="string"?m=c.local.date:typeof c.date=="string"&&(m=c.date);let E=new Date(m.replace("Z","")+"Z"),y=c.local?.timezone||c.timezone||"UTC",A=Lo[y]??0,P=E.getTime()-A*36e5,T=new Date(P+n*36e5),f=U=>String(U).padStart(2,"0"),M=T.getFullYear()+"-"+f(T.getMonth()+1)+"-"+f(T.getDate())+"T"+f(T.getHours())+":"+f(T.getMinutes())+":"+f(T.getSeconds());r.push({...l,start:M,tag:"ical-event",sourceName:o.name})}}await V.indexObjects("$icalendar",r),await R.flashNotification(`Synced ${r.length} events`,"info")}async function at(){await k.del(wo),await de()}async function ut(){await R.flashNotification(`iCalendar Plug ${Io}`,"info")}var lt={syncCalendars:de,forceSync:at,showVersion:ut},ct={name:"icalendar",version:"0.3.11",functions:{syncCalendars:{path:"main.ts:syncCalendars",command:"iCalendar: Sync"},forceSync:{path:"main.ts:forceSync",command:"iCalendar: Force Sync"},showVersion:{path:"main.ts:showVersion",command:"iCalendar: Show Version"}},permissions:["http"],assets:{}},ji={manifest:ct,functionMapping:lt};fe(lt,ct,self.postMessage);export{ji as plug}; //# sourceMappingURL=icalendar.plug.js.map diff --git a/icalendar.plug.yaml b/icalendar.plug.yaml index d6d433b..09dd5d6 100644 --- a/icalendar.plug.yaml +++ b/icalendar.plug.yaml @@ -1,6 +1,5 @@ -name: Library/sstent/icalendar -version: 0.3.1 -author: sstent +name: icalendar +version: 0.3.11 functions: syncCalendars: path: icalendar.ts:syncCalendars @@ -8,9 +7,6 @@ functions: forceSync: path: icalendar.ts:forceSync command: "iCalendar: Force Sync" - clearCache: - path: icalendar.ts:clearCache - command: "iCalendar: Clear Cache" showVersion: path: icalendar.ts:showVersion command: "iCalendar: Show Version" diff --git a/icalendar.ts b/icalendar.ts index 9832f8b..a0a412f 100644 --- a/icalendar.ts +++ b/icalendar.ts @@ -1,10 +1,10 @@ import { clientStore, config, datastore, editor, index } from "@silverbulletmd/silverbullet/syscalls"; -import { convertIcsCalendar, type IcsCalendar, type IcsEvent, type IcsDateObjects } from "ts-ics"; +import { convertIcsCalendar } from "https://esm.sh/ts-ics@2.4.0"; +import type { IcsCalendar, IcsEvent, IcsDateObjects } from "https://esm.sh/ts-ics@2.4.0"; -const VERSION = "0.3.1"; +const VERSION = "0.3.11"; const CACHE_KEY = "icalendar:lastSync"; -// Mapping of common Windows/Outlook timezones to their standard offsets (in hours) const TIMEZONE_OFFSETS: Record = { "GMT Standard Time": 0, "W. Europe Standard Time": 1, @@ -19,145 +19,46 @@ const TIMEZONE_OFFSETS: Record = { "None": 0 }; -// ============================================================================ -// Types -// ============================================================================ - -type DateToString = T extends Date ? string - : T extends IcsDateObjects ? string - : T extends object ? { [K in keyof T]: DateToString } - : T extends Array ? Array> - : T; - -interface Source { - url: string; - name: string | undefined; -} - -interface PlugConfig { - sources: any; - cacheDuration: number | undefined; - tzShift: number | undefined; -} - -interface CalendarEvent extends DateToString { - ref: string; - tag: "ical-event"; - sourceName: string | undefined; -} - -// ============================================================================ -// Utility Functions -// ============================================================================ - -function toLocalISO(d: Date): string { - const pad = (n: number) => String(n).padStart(2, "0"); - return d.getFullYear() + - "-" + pad(d.getMonth() + 1) + - "-" + pad(d.getDate()) + - "T" + pad(d.getHours()) + - ":" + pad(d.getMinutes()) + - ":" + pad(d.getSeconds()) + - "." + String(d.getMilliseconds()).padStart(3, "0"); -} - -function processIcsDate(obj: any, manualShift = 0): string { - if (!obj) return ""; - let wallTimeStr = ""; - if (obj.local && typeof obj.local.date === "string") wallTimeStr = obj.local.date; - else if (typeof obj.date === "string") wallTimeStr = obj.date; - else if (obj.date instanceof Date) wallTimeStr = obj.date.toISOString(); - else if (obj instanceof Date) wallTimeStr = obj.toISOString(); - if (!wallTimeStr) return ""; - - const baseDate = new Date(wallTimeStr.replace("Z", "") + "Z"); - const tzName = obj.local?.timezone || obj.timezone || "UTC"; - const sourceOffset = TIMEZONE_OFFSETS[tzName] ?? 0; - - const utcMillis = baseDate.getTime() - (sourceOffset * 3600000); - const finalDate = new Date(utcMillis + (manualShift * 3600000)); - - return toLocalISO(finalDate); -} - -function isIcsDateObjects(obj: any): obj is IcsDateObjects { - return obj && typeof obj === 'object' && ('date' in obj && 'type' in obj); -} - -async function sha256Hash(str: string): Promise { - const hashBuffer = await crypto.subtle.digest("SHA-256", (new TextEncoder()).encode(str)); - return Array.from(new Uint8Array(hashBuffer)).map(b => b.toString(16).padStart(2, "0")).join(""); -} - -function convertDatesToStrings(obj: T, hourShift = 0): DateToString { - if (obj === null || obj === undefined) return obj as DateToString; - if (isIcsDateObjects(obj)) return processIcsDate(obj, hourShift) as DateToString; - if (obj instanceof Date) return processIcsDate({ date: obj }, hourShift) as DateToString; - if (Array.isArray(obj)) return obj.map(item => convertDatesToStrings(item, hourShift)) as DateToString; - if (typeof obj === 'object') { - const result: any = {}; - for (const key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) result[key] = convertDatesToStrings((obj as any)[key], hourShift); - } - return result as DateToString; - } - return obj as DateToString; -} - -async function getSources(): Promise<{ sources: Source[], tzShift: number }> { - try { - const rawConfig = await config.get("icalendar", { sources: [] }); - let sources: Source[] = []; - let tzShift = rawConfig.tzShift ?? 0; - let rawSources = rawConfig.sources; - if (rawSources && typeof rawSources === "object") { - if (rawSources.tzShift !== undefined && tzShift === 0) tzShift = rawSources.tzShift; - if (Array.isArray(rawSources)) sources = rawSources.filter(s => s && typeof s.url === "string"); - else if (rawSources.url) sources = [rawSources]; - } - return { sources, tzShift }; - } catch (e) { - return { sources: [], tzShift: 0 }; - } -} - -async function fetchAndParseCalendar(source: Source, hourShift = 0): Promise { - let url = source.url.trim(); - if (url.includes(" ")) url = encodeURI(url); - const response = await fetch(url); - if (!response.ok) throw new Error(`HTTP ${response.status}`); - const calendar = convertIcsCalendar(undefined, await response.text()); - if (!calendar.events) return []; - return await Promise.all(calendar.events.map(async (icsEvent: IcsEvent): Promise => { - const uniqueKey = `${icsEvent.start?.date || ''}${icsEvent.uid || icsEvent.summary || ''}`; - const ref = await sha256Hash(uniqueKey); - return convertDatesToStrings({ ...icsEvent, ref, tag: "ical-event" as const, sourceName: source.name }, hourShift); - })); -} - -// ============================================================================ -// Public Commands -// ============================================================================ - export async function syncCalendars() { - try { - const { sources, tzShift } = await getSources(); - if (sources.length === 0) return; - await editor.flashNotification("Syncing calendars...", "info"); - const allEvents: CalendarEvent[] = []; - for (const source of sources) { - try { - const events = await fetchAndParseCalendar(source, tzShift); - allEvents.push(...events); - } catch (err) { - console.error(`Failed to sync ${source.name}:`, err); - } + const rawConfig = await config.get("icalendar", { sources: [] }); + let sources: any[] = rawConfig.sources || []; + let tzShift = rawConfig.tzShift || 0; + + if (sources.length === 0) return; + await editor.flashNotification("Syncing calendars...", "info"); + + const allEvents: any[] = []; + for (const source of sources) { + const response = await fetch(source.url); + const text = await response.text(); + const calendar = convertIcsCalendar(undefined, text); + if (!calendar.events) continue; + + for (const icsEvent of calendar.events) { + const obj = icsEvent.start; + let wallTimeStr = ""; + if (obj.local && typeof obj.local.date === "string") wallTimeStr = obj.local.date; + else if (typeof obj.date === "string") wallTimeStr = obj.date; + + const baseDate = new Date(wallTimeStr.replace("Z", "") + "Z"); + const tzName = obj.local?.timezone || obj.timezone || "UTC"; + const sourceOffset = TIMEZONE_OFFSETS[tzName] ?? 0; + const utcMillis = baseDate.getTime() - (sourceOffset * 3600000); + const finalDate = new Date(utcMillis + (tzShift * 3600000)); + + const pad = (n: number) => String(n).padStart(2, "0"); + const localIso = finalDate.getFullYear() + "-" + pad(finalDate.getMonth() + 1) + "-" + pad(finalDate.getDate()) + "T" + pad(finalDate.getHours()) + ":" + pad(finalDate.getMinutes()) + ":" + pad(finalDate.getSeconds()); + + allEvents.push({ + ...icsEvent, + start: localIso, + tag: "ical-event", + sourceName: source.name + }); } - await index.indexObjects("$icalendar", allEvents); - await editor.flashNotification(`Synced ${allEvents.length} events`, "info"); - } catch (err) { - console.error("Sync failed:", err); } + await index.indexObjects("$icalendar", allEvents); + await editor.flashNotification(`Synced ${allEvents.length} events`, "info"); } export async function forceSync() { @@ -165,19 +66,6 @@ export async function forceSync() { await syncCalendars(); } -export async function clearCache() { - if (!await editor.confirm("Clear all calendar events?")) return; - const pageKeys = await datastore.query({ prefix: ["ridx", "$icalendar"] }); - const allKeys: any[] = []; - for (const { key } of pageKeys) { - allKeys.push(key); - allKeys.push(["idx", ...key.slice(2), "$icalendar"]); - } - if (allKeys.length > 0) await datastore.batchDel(allKeys); - await clientStore.del(CACHE_KEY); - await editor.flashNotification("Calendar index cleared", "info"); -} - export async function showVersion() { await editor.flashNotification(`iCalendar Plug ${VERSION}`, "info"); }