From 33ca12258380aca08d05625f43272129c53e5d80 Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Fri, 20 Feb 2026 21:13:46 +0000 Subject: [PATCH] Build and update icalendar.plug.js [skip ci] --- icalendar.plug.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/icalendar.plug.js b/icalendar.plug.js index 8977646..7bcdd63 100644 --- a/icalendar.plug.js +++ b/icalendar.plug.js @@ -6,5 +6,5 @@ var Br=Object.defineProperty;var ce=(t,e)=>{for(var r in e)Br(t,r,{get:e[r],enum `),n=0;n0&&o[0]===" "?(r[n-1]+=o.slice(1),r.splice(n,1)):n+=1:r.splice(n,1)}return r}function Ts(t){t.forEach(function(e){if(!/(VALUE=DATE(-TIME)?)|(TZID=)/.test(e))throw new Error("unsupported RDATE/EXDATE parm: "+e)})}function br(t,e){return Ts(e),t.split(",").map(function(r){return it(r)})}function Er(t){var e=this;return function(r){if(r!==void 0&&(e["_".concat(t)]=r),e["_".concat(t)]!==void 0)return e["_".concat(t)];for(var n=0;nd.format(f).replace(", ","T"),i=a(n,e),s=a(o,e),u=new Date(i+"Z").getTime();return new Date(s+"Z").getTime()-u}var Lr="0.3.29",Nr="icalendar:lastSync";console.log(`[iCalendar] Plug script executing at top level (Version ${Lr})`);async function Ss(t){let r=new TextEncoder().encode(t),n=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(n)).map(a=>a.toString(16).padStart(2,"0")).join("")}function Ee(t){let e=r=>String(r).padStart(2,"0");return t.getFullYear()+"-"+e(t.getMonth()+1)+"-"+e(t.getDate())+"T"+e(t.getHours())+":"+e(t.getMinutes())+":"+e(t.getSeconds())}function lt(t){if(t==null)return t;if(t instanceof Date)return Ee(t);if(typeof t=="object"&&"date"in t&&t.date instanceof Date)return Ee(t.date);if(typeof t=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(t))try{return Ee(new Date(t))}catch{return t}if(Array.isArray(t))return t.map(e=>lt(e));if(typeof t=="object"){let e={};for(let r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=lt(t[r]));return e}return t}async function As(){try{let t=await Te.get("icalendar",{sources:[]});console.log("[iCalendar] Raw config retrieved:",JSON.stringify(t));let e=t.sources||[],r=t.syncWindowDays||365;if(e&&typeof e=="object"&&!Array.isArray(e)){let n=[];for(let o in e)e[o]&&typeof e[o].url=="string"&&n.push(e[o]);e=n}return{sources:e,syncWindowDays:r}}catch(t){return console.error("[iCalendar] Error in getSources:",t),{sources:[],syncWindowDays:365}}}async function xs(t){let e=t.start;if(!e)return null;let r=null;if(e.local?.date){let s=e.local.date;r=s instanceof Date?s.toISOString():String(s)}else if(e.date){let s=e.date;r=s instanceof Date?s.toISOString():String(s)}if(!r)return null;r=r.replace(/Z$/,"");let n=e.local?.timezone||e.timezone||"UTC",o=ct(n);if(!o){console.warn(`[iCalendar] Unknown timezone: "${n}" - falling back to UTC for event "${t.summary}"`);let s=new Date(r+(r.includes("T")?"":"T00:00:00")+"Z");return isNaN(s.getTime())?null:s}let a=new Date(r+(r.includes("T")?"":"T00:00:00")+"Z");if(isNaN(a.getTime()))return null;let i=_r(o,a);return new Date(a.getTime()-i)}function ks(t,e=365){let r=t.rrule||t.recurrenceRule;if(!r)return[t];if(typeof r!="string")return console.warn(`[iCalendar] Invalid rrule type (${typeof r}) for event "${t.summary||"Untitled"}". Treating as non-recurring.`),[t];try{let n=new ut,o=r.replace(/^RRULE:/i,""),a=new Date(t.start.includes("Z")?t.start:t.start+"Z");if(isNaN(a.getTime()))return console.error(`[iCalendar] Invalid start date for recurrence: ${t.start}`),[t];let i=g.parseString(o);i.dtstart=a,n.rrule(new g(i));for(let f of t.exdate||[])n.exdate(new Date(f.includes("Z")?f:f+"Z"));let s=new Date,u=new Date(s.getTime()-7*864e5),c=new Date(s.getTime()+e*864e5);return n.between(a,c,!0).filter(f=>f>=u).map(f=>{let l=Ee(f);return{...t,start:l,recurrent:!0,rrule:void 0}})}catch(n){return console.error(`[iCalendar] Error expanding recurrence for ${t.summary}:`,n),[t]}}async function Ds(t,e=365){console.log(`[iCalendar] Fetching from: ${t.url}`);try{let r=await fetch(t.url);if(!r.ok)return console.error(`[iCalendar] Fetch failed for ${t.name}: ${r.status} ${r.statusText}`),[];let n=await r.text(),o=ar(void 0,n);if(!o||!o.events)return[];let a=[];for(let i of o.events){if(i.status?.toUpperCase()==="CANCELLED")continue;let s=await xs(i);if(!s)continue;let u=Ee(s),c={...i,name:i.summary||"Untitled Event",start:u,tag:"ical-event",sourceName:t.name},d=i.start?.local?.timezone||i.start?.timezone||"UTC";d!=="UTC"&&d!=="None"&&!ct(d)&&(c.description=`(Warning: Unknown timezone "${d}") ${c.description||""}`);let f=ks(c,e);for(let l of f){let m=`${l.start}${l.uid||l.summary||""}`;l.ref=await Ss(m),a.push(lt(l))}}return a}catch(r){return console.error(`[iCalendar] Error fetching/parsing ${t.name}:`,r),[]}}async function dt(){try{let{sources:t,syncWindowDays:e}=await As();if(t.length===0)return;await H.flashNotification("Syncing calendars...","info");let r=[];for(let n of t){let o=await Ds(n,e);r.push(...o)}await we.indexObjects("$icalendar",r),await H.flashNotification(`Synced ${r.length} events`,"info")}catch(t){console.error("[iCalendar] syncCalendars failed:",t)}}async function Ir(){await de.del(Nr),await dt()}async function Ur(){if(!await H.confirm("Clear all calendar events?"))return;let t=await ye.query({prefix:["ridx","$icalendar"]}),e=[];for(let{key:r}of t)e.push(r),e.push(["idx",...r.slice(2),"$icalendar"]);e.length>0&&await ye.batchDel(e),await de.del(Nr),await H.flashNotification("Calendar index cleared","info")}async function Yr(){await H.flashNotification(`iCalendar Plug ${Lr}`,"info")}var Kr={syncCalendars:dt,forceSync:Ir,clearCache:Ur,showVersion:Yr},zr={name:"icalendar",version:"0.3.29",author:"sstent",index:"icalendar.ts",requiredPermissions:["fetch"],permissions:["fetch","http"],functions:{syncCalendars:{path:"icalendar.ts:syncCalendars",command:{name:"iCalendar: Sync",priority:-1},events:["editor:init"]},forceSync:{path:"icalendar.ts:forceSync",command:{name:"iCalendar: Force Sync",priority:-1}},clearCache:{path:"icalendar.ts:clearCache",command:{name:"iCalendar: Clear All Events",priority:-1}},showVersion:{path:"icalendar.ts:showVersion",command:{name:"iCalendar: Version",priority:-2}}},assets:{}},nc={manifest:zr,functionMapping:Kr};mt(Kr,zr,self.postMessage);export{nc as plug}; +`)},e.prototype.clone=function(){var r=new e(!!this._cache);return this._rrule.forEach(function(n){return r.rrule(n.clone())}),this._exrule.forEach(function(n){return r.exrule(n.clone())}),this._rdate.forEach(function(n){return r.rdate(new Date(n.getTime()))}),this._exdate.forEach(function(n){return r.exdate(new Date(n.getTime()))}),r},e}(g);function Tr(t,e){if(!(t instanceof g))throw new TypeError(String(t)+" is not RRule instance");A(e.map(String),String(t))||e.push(t)}function wr(t,e){if(!(t instanceof Date))throw new TypeError(String(t)+" is not Date instance");A(e.map(Number),Number(t))||(e.push(t),be(e))}function Sr(t,e,r){var n=!r||r.toUpperCase()==="UTC",o=n?"".concat(t,":"):"".concat(t,";TZID=").concat(r,":"),a=e.map(function(i){return ot(i.valueOf(),n)}).join(",");return"".concat(o).concat(a)}var ws={"Dateline Standard Time":"Etc/GMT+12","UTC-11":"Etc/GMT+11","Hawaiian Standard Time":"Pacific/Honolulu","Alaskan Standard Time":"America/Anchorage","Pacific Standard Time (Mexico)":"America/Santa_Isabel","Pacific Standard Time":"America/Los_Angeles","US Mountain Standard Time":"America/Phoenix","Mountain Standard Time (Mexico)":"America/Chihuahua","Mountain Standard Time":"America/Denver","Central America Standard Time":"America/Guatemala","Central Standard Time":"America/Chicago","Central Standard Time (Mexico)":"America/Mexico_City","Canada Central Standard Time":"America/Regina","SA Pacific Standard Time":"America/Bogota","Eastern Standard Time":"America/New_York","US Eastern Standard Time":"America/Indiana/Indianapolis","Venezuela Standard Time":"America/Caracas","Paraguay Standard Time":"America/Asuncion","Atlantic Standard Time":"America/Halifax","Central Brazilian Standard Time":"America/Cuiaba","SA Western Standard Time":"America/La_Paz","Pacific SA Standard Time":"America/Santiago","Newfoundland Standard Time":"America/St_Johns","E. South America Standard Time":"America/Sao_Paulo","Argentina Standard Time":"America/Buenos_Aires","SA Eastern Standard Time":"America/Cayenne","Greenland Standard Time":"America/Godthab","Montevideo Standard Time":"America/Montevideo","Bahia Standard Time":"America/Bahia","Azores Standard Time":"Atlantic/Azores","Cape Verde Standard Time":"Atlantic/Cape_Verde","Morocco Standard Time":"Africa/Casablanca","GMT Standard Time":"Europe/London","Greenwich Standard Time":"Atlantic/Reykjavik","W. Europe Standard Time":"Europe/Berlin","Central Europe Standard Time":"Europe/Budapest","Romance Standard Time":"Europe/Paris","Central European Standard Time":"Europe/Warsaw","W. Central Africa Standard Time":"Africa/Lagos","Namibia Standard Time":"Africa/Windhoek","Jordan Standard Time":"Asia/Amman","GTB Standard Time":"Europe/Bucharest","Middle East Standard Time":"Asia/Beirut","Egypt Standard Time":"Africa/Cairo","Syria Standard Time":"Asia/Damascus","E. Europe Standard Time":"Europe/Chisinau","South Africa Standard Time":"Africa/Johannesburg","FLE Standard Time":"Europe/Kiev","Turkey Standard Time":"Europe/Istanbul","Israel Standard Time":"Asia/Jerusalem","Kaliningrad Standard Time":"Europe/Kaliningrad","Libya Standard Time":"Africa/Tripoli","Arabic Standard Time":"Asia/Baghdad","Arab Standard Time":"Asia/Riyadh","Belarus Standard Time":"Europe/Minsk","Russian Standard Time":"Europe/Moscow","E. Africa Standard Time":"Africa/Nairobi","Iran Standard Time":"Asia/Tehran","Arabian Standard Time":"Asia/Dubai","Azerbaijan Standard Time":"Asia/Baku","Russia Time Zone 3":"Europe/Samara","Mauritius Standard Time":"Indian/Mauritius","Georgian Standard Time":"Asia/Tbilisi","Caucasus Standard Time":"Asia/Yerevan","Afghanistan Standard Time":"Asia/Kabul","West Asia Standard Time":"Asia/Tashkent","Ekaterinburg Standard Time":"Asia/Yekaterinburg","Pakistan Standard Time":"Asia/Karachi","India Standard Time":"Asia/Kolkata","Sri Lanka Standard Time":"Asia/Colombo","Nepal Standard Time":"Asia/Kathmandu","Central Asia Standard Time":"Asia/Almaty","Bangladesh Standard Time":"Asia/Dhaka","N. Central Asia Standard Time":"Asia/Novosibirsk","Myanmar Standard Time":"Asia/Rangoon","SE Asia Standard Time":"Asia/Bangkok","North Asia Standard Time":"Asia/Krasnoyarsk","China Standard Time":"Asia/Shanghai","North Asia East Standard Time":"Asia/Irkutsk","Singapore Standard Time":"Asia/Singapore","W. Australia Standard Time":"Australia/Perth","Taipei Standard Time":"Asia/Taipei","Ulaanbaatar Standard Time":"Asia/Ulaanbaatar","Tokyo Standard Time":"Asia/Tokyo","Korea Standard Time":"Asia/Seoul","Yakutsk Standard Time":"Asia/Yakutsk","Cen. Australia Standard Time":"Australia/Adelaide","AUS Central Standard Time":"Australia/Darwin","E. Australia Standard Time":"Australia/Brisbane","AUS Eastern Standard Time":"Australia/Sydney","West Pacific Standard Time":"Pacific/Port_Moresby","Tasmania Standard Time":"Australia/Hobart","Magadan Standard Time":"Asia/Magadan","Vladivostok Standard Time":"Asia/Vladivostok","Russia Time Zone 10":"Asia/Srednekolymsk","Central Pacific Standard Time":"Pacific/Guadalcanal","Russia Time Zone 11":"Asia/Anadyr","New Zealand Standard Time":"Pacific/Auckland","Fiji Standard Time":"Pacific/Fiji","Tonga Standard Time":"Pacific/Tongatapu","Samoa Standard Time":"Pacific/Apia","Line Islands Standard Time":"Pacific/Kiritimati"};function ct(t){return!t||t==="UTC"||t==="None"?"UTC":t.includes("/")?t:ws[t]??null}function _r(t,e){let r={timeZone:"UTC",hour12:!1,year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"},n=new Intl.DateTimeFormat("en-CA",r),o=new Intl.DateTimeFormat("en-CA",{...r,timeZone:t}),a=(d,f)=>d.format(f).replace(", ","T"),i=a(n,e),s=a(o,e),u=new Date(i+"Z").getTime();return new Date(s+"Z").getTime()-u}var Lr="0.3.30",Nr="icalendar:lastSync";console.log(`[iCalendar] Plug script executing at top level (Version ${Lr})`);async function Ss(t){let r=new TextEncoder().encode(t),n=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(n)).map(a=>a.toString(16).padStart(2,"0")).join("")}function Ee(t){let e=r=>String(r).padStart(2,"0");return t.getFullYear()+"-"+e(t.getMonth()+1)+"-"+e(t.getDate())+"T"+e(t.getHours())+":"+e(t.getMinutes())+":"+e(t.getSeconds())}function lt(t){if(t==null)return t;if(t instanceof Date)return Ee(t);if(typeof t=="object"&&"date"in t&&t.date instanceof Date)return Ee(t.date);if(typeof t=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(t))try{return Ee(new Date(t))}catch{return t}if(Array.isArray(t))return t.map(e=>lt(e));if(typeof t=="object"){let e={};for(let r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=lt(t[r]));return e}return t}async function As(){try{let t=await Te.get("icalendar",{sources:[]});console.log("[iCalendar] Raw config retrieved:",JSON.stringify(t));let e=t.sources||[],r=t.syncWindowDays||365;if(e&&typeof e=="object"&&!Array.isArray(e)){let n=[];for(let o in e)e[o]&&typeof e[o].url=="string"&&n.push(e[o]);e=n}return{sources:e,syncWindowDays:r}}catch(t){return console.error("[iCalendar] Error in getSources:",t),{sources:[],syncWindowDays:365}}}async function xs(t){let e=t.start;if(!e)return null;let r=null;if(e.local?.date){let s=e.local.date;r=s instanceof Date?s.toISOString():String(s)}else if(e.date){let s=e.date;r=s instanceof Date?s.toISOString():String(s)}if(!r)return null;r=r.replace(/Z$/,"");let n=e.local?.timezone||e.timezone||"UTC",o=ct(n);if(!o){console.warn(`[iCalendar] Unknown timezone: "${n}" - falling back to UTC for event "${t.summary}"`);let s=new Date(r+(r.includes("T")?"":"T00:00:00")+"Z");return isNaN(s.getTime())?null:s}let a=new Date(r+(r.includes("T")?"":"T00:00:00")+"Z");if(isNaN(a.getTime()))return null;let i=_r(o,a);return new Date(a.getTime()-i)}function ks(t,e=365){let r=t.rrule||t.recurrenceRule;if(!r)return[t];try{let n=new ut,o="";if(typeof r=="string")o=r.replace(/^RRULE:/i,"");else if(typeof r=="object"&&r!==null)o=Object.entries(r).map(([f,l])=>`${f.toUpperCase()}=${l}`).join(";");else return console.warn(`[iCalendar] Invalid rrule type (${typeof r}) for event "${t.summary||"Untitled"}". Treating as non-recurring.`),[t];let a=new Date(t.start.includes("Z")?t.start:t.start+"Z");if(isNaN(a.getTime()))return console.error(`[iCalendar] Invalid start date for recurrence: ${t.start}`),[t];let i=g.parseString(o);i.dtstart=a,n.rrule(new g(i));for(let f of t.exdate||[])n.exdate(new Date(f.includes("Z")?f:f+"Z"));let s=new Date,u=new Date(s.getTime()-7*864e5),c=new Date(s.getTime()+e*864e5);return n.between(a,c,!0).filter(f=>f>=u).map(f=>{let l=Ee(f);return{...t,start:l,recurrent:!0,rrule:void 0}})}catch(n){return console.error(`[iCalendar] Error expanding recurrence for ${t.summary}:`,n),[t]}}async function Ds(t,e=365){console.log(`[iCalendar] Fetching from: ${t.url}`);try{let r=await fetch(t.url);if(!r.ok)return console.error(`[iCalendar] Fetch failed for ${t.name}: ${r.status} ${r.statusText}`),[];let n=await r.text(),o=ar(void 0,n);if(!o||!o.events)return[];let a=[];for(let i of o.events){if(i.status?.toUpperCase()==="CANCELLED")continue;let s=await xs(i);if(!s)continue;let u=Ee(s),c={...i,name:i.summary||"Untitled Event",start:u,tag:"ical-event",sourceName:t.name},d=i.start?.local?.timezone||i.start?.timezone||"UTC";d!=="UTC"&&d!=="None"&&!ct(d)&&(c.description=`(Warning: Unknown timezone "${d}") ${c.description||""}`);let f=ks(c,e);for(let l of f){let m=`${l.start}${l.uid||l.summary||""}`;l.ref=await Ss(m),a.push(lt(l))}}return a}catch(r){return console.error(`[iCalendar] Error fetching/parsing ${t.name}:`,r),[]}}async function dt(){try{let{sources:t,syncWindowDays:e}=await As();if(t.length===0)return;await H.flashNotification("Syncing calendars...","info");let r=[];for(let n of t){let o=await Ds(n,e);r.push(...o)}await we.indexObjects("$icalendar",r),await H.flashNotification(`Synced ${r.length} events`,"info")}catch(t){console.error("[iCalendar] syncCalendars failed:",t)}}async function Ir(){await de.del(Nr),await dt()}async function Ur(){if(!await H.confirm("Clear all calendar events?"))return;let t=await ye.query({prefix:["ridx","$icalendar"]}),e=[];for(let{key:r}of t)e.push(r),e.push(["idx",...r.slice(2),"$icalendar"]);e.length>0&&await ye.batchDel(e),await de.del(Nr),await H.flashNotification("Calendar index cleared","info")}async function Yr(){await H.flashNotification(`iCalendar Plug ${Lr}`,"info")}var Kr={syncCalendars:dt,forceSync:Ir,clearCache:Ur,showVersion:Yr},zr={name:"icalendar",version:"0.3.30",author:"sstent",index:"icalendar.ts",requiredPermissions:["fetch"],permissions:["fetch","http"],functions:{syncCalendars:{path:"icalendar.ts:syncCalendars",command:{name:"iCalendar: Sync",priority:-1},events:["editor:init"]},forceSync:{path:"icalendar.ts:forceSync",command:{name:"iCalendar: Force Sync",priority:-1}},clearCache:{path:"icalendar.ts:clearCache",command:{name:"iCalendar: Clear All Events",priority:-1}},showVersion:{path:"icalendar.ts:showVersion",command:{name:"iCalendar: Version",priority:-2}}},assets:{}},nc={manifest:zr,functionMapping:Kr};mt(Kr,zr,self.postMessage);export{nc as plug}; //# sourceMappingURL=icalendar.plug.js.map