@stacksjs/calendar-api 0.72.56 → 0.72.60
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +5 -5
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import{format as
|
|
3
|
-
`)}function
|
|
4
|
-
`))}`}function
|
|
5
|
-
`)}function
|
|
6
|
-
`)}function
|
|
2
|
+
import{format as I}from"@stacksjs/datetime";var Z="YYYYMMDD",B="YYYYMMDDThhmmss";function A(e){let t="https://calendar.google.com/calendar/render?action=TEMPLATE",o=M(e.from,"UTC"),r=M(e.to,"UTC"),n=e.allDay?Z:B;if(t=`${t}&dates=${I(o,n)}/${I(r,n)}`,e.timezone)t=`${t}&ctz=${e.timezone}`;if(t=`${t}&text=${encodeURIComponent(e.title)}`,e.description)t=`${t}&details=${encodeURIComponent(e.description)}`;if(e.address)t=`${t}&location=${encodeURIComponent(e.address)}`;return t}function M(e,t){let o=typeof e==="string"?new Date(e):e;if(!t)return o;let r=o.toLocaleString("en-US",{timeZone:t}),n=new Date(r);return Number.isNaN(n.getTime())?o:n}import{format as g}from"@stacksjs/datetime";import{createHash as H}from"crypto";function P(e){return{toString:()=>H("md5").update(e).digest("hex")}}function N(e){return b(e).join(`\r
|
|
3
|
+
`)}function S(e){return _(b(e))}function b(e){let r=`UID:${G(e)}`,n=`SUMMARY:${e.title}`,a=["BEGIN:VCALENDAR","VERSION:2.0","PRODID:Spatie calendar-links","BEGIN:VEVENT",r,n],i=`${e.timezone||"PST"}:YYYYMMDDThhmmss`,u=e.allDay?"YYYYMMDD":i;if(e.allDay)a.push(`DTSTAMP;TZID=${g(e.from,u)}`),a.push(`DTSTART:${g(e.from,u)}`),a.push(`DURATION:P${Math.max(1,q(e.from,e.to))}D`);else a.push(`DTSTAMP;TZID=${g(e.from,u)}`),a.push(`DTSTART;TZID=${g(e.from,u)}`),a.push(`DTEND;TZID=${g(e.to,u)}`);if(e.description)a.push(`X-ALT-DESC;FMTTYPE=text/html:${e.description}`);if(e.address)a.push(`LOCATION:${e.address}`);return a.push("END:VEVENT"),a.push("END:VCALENDAR"),a}function _(e){return`data:text/calendar;charset=utf8;base64,${btoa(e.join(`\r
|
|
4
|
+
`))}`}function q(e,t){let r=Date.UTC(e.getFullYear(),e.getMonth(),e.getDate()),n=Date.UTC(t.getFullYear(),t.getMonth(),t.getDate());return Math.floor((n-r)/86400000)}function G(e){let o=g(e.from,"YYYY-MM-DDThh:mm:ss+00:00"),r=g(e.to,"YYYY-MM-DDThh:mm:ss+00:00");return P(`${o}${r}${e.title}`).toString()}import{format as U}from"@stacksjs/datetime";function F(e){let n="https://outlook.live.com/calendar/deeplink/compose?path=/calendar/action/compose&rru=addevent",a=x(e.from,"UTC"),c=x(e.to,"UTC"),i=e.allDay?"YYYY-MM-DD":"YYYY-MM-DDThh:mm:ss";if(n=e.allDay?`${n}&startdt=${U(a,i)}`:`${n}&startdt=${U(a,i)}Z`,n=e.allDay?`${n}&enddt=${U(c,i)}`:`${n}&enddt=${U(c,i)}Z`,e.allDay)n=`${n}&allday=true`;if(n=`${n}&subject=${encodeURIComponent(e.title)}`,e.description)n=`${n}&body=${encodeURIComponent(e.description)}`;if(e.address)n=`${n}&location=${encodeURIComponent(e.address)}`;return n}function x(e,t){return new Date((typeof e==="string"?new Date(e):e).toLocaleString("en-US",{timeZone:t}))}import{format as E}from"@stacksjs/datetime";function v(e){let r="https://calendar.yahoo.com/?v=60&view=d&type=20",n=O(e.from,"UTC"),a=O(e.to,"UTC"),c=e.allDay?"YYYYMMDD":"YYYYMMDDThhmmss";if(e.allDay)r=`${r}&ST=${E(e.from,c)}`,r=`${r}&DUR=allday`,r=`${r}&ET=${E(e.to,c)}`;else r=`${r}&ST=${E(n,c)}Z`,r=`${r}&ET=${E(a,c)}Z`;if(r=`${r}&TITLE=${encodeURIComponent(e.title)}`,e.description)r=`${r}&DESC=${encodeURIComponent(e.description)}`;if(e.address)r=`${r}&in_loc=${encodeURIComponent(e.address)}`;return r}function O(e,t){return new Date((typeof e==="string"?new Date(e):e).toLocaleString("en-US",{timeZone:t}))}function C(e){return e.replace(/\\/g,"\\\\").replace(/;/g,"\\;").replace(/,/g,"\\,").replace(/\r?\n/g,"\\n")}function V(e){if(Buffer.byteLength(e,"utf8")<=75)return e;let t=[],o="";for(let r of e){let n=t.length===0?75:74;if(Buffer.byteLength(o+r,"utf8")>n)t.push(o),o=r;else o+=r}if(o)t.push(o);return t.map((r,n)=>n===0?r:` ${r}`).join(`\r
|
|
5
|
+
`)}function R(e){return`${e.toISOString().replace(/[-:]/g,"").slice(0,15)}Z`}function w(e){return e.toISOString().replace(/-/g,"").slice(0,8)}function z(e){let t=["BEGIN:VCALENDAR","VERSION:2.0",`PRODID:${e.prodId??"-//Stacks//calendar-api//EN"}`,"CALSCALE:GREGORIAN","METHOD:PUBLISH",`X-WR-CALNAME:${C(e.name)}`];if(e.timezone)t.push(`X-WR-TIMEZONE:${e.timezone}`);t.push(`REFRESH-INTERVAL;VALUE=DURATION:${e.refreshInterval??"PT1H"}`);for(let o of e.events){if(t.push("BEGIN:VEVENT"),t.push(`UID:${C(o.uid)}`),t.push(`DTSTAMP:${R(o.updatedAt??o.start)}`),t.push(`SUMMARY:${C(o.title)}`),o.allDay){t.push(`DTSTART;VALUE=DATE:${w(o.start)}`);let r=new Date(o.end);r.setUTCDate(r.getUTCDate()+1),t.push(`DTEND;VALUE=DATE:${w(r)}`)}else t.push(`DTSTART:${R(o.start)}`),t.push(`DTEND:${R(o.end)}`);if(o.rrule)t.push(`RRULE:${o.rrule.replace(/^RRULE:/i,"")}`);if(o.description)t.push(`DESCRIPTION:${C(o.description)}`);if(o.location)t.push(`LOCATION:${C(o.location)}`);if(o.url)t.push(`URL:${o.url}`);if(o.sequence!==void 0)t.push(`SEQUENCE:${o.sequence}`);t.push("END:VEVENT")}return t.push("END:VCALENDAR"),t.map(V).join(`\r
|
|
6
|
+
`)}function W(e="calendar.ics"){return{"Content-Type":"text/calendar; charset=utf-8","Content-Disposition":`inline; filename="${e}"`,"Cache-Control":"public, max-age=300"}}var h=["SU","MO","TU","WE","TH","FR","SA"];function j(e){let t={};for(let n of e.replace(/^RRULE:/i,"").split(";")){let a=n.indexOf("=");if(a===-1)continue;t[n.slice(0,a).toUpperCase()]=n.slice(a+1)}let o=t.FREQ?.toUpperCase();if(o!=="DAILY"&&o!=="WEEKLY"&&o!=="MONTHLY"&&o!=="YEARLY")return null;let r={freq:o,interval:Math.max(1,Number(t.INTERVAL??1)||1)};if(t.COUNT)r.count=Math.max(1,Number(t.COUNT)||1);if(t.UNTIL){let n=t.UNTIL.match(/^(\d{4})(\d{2})(\d{2})(?:T(\d{2})(\d{2})(\d{2})Z?)?$/);if(n)r.until=new Date(Date.UTC(Number(n[1]),Number(n[2])-1,Number(n[3]),Number(n[4]??23),Number(n[5]??59),Number(n[6]??59)))}if(t.BYDAY)r.byDay=t.BYDAY.split(",").map((n)=>n.trim().toUpperCase()).filter(Boolean);if(t.BYMONTHDAY)r.byMonthDay=t.BYMONTHDAY.split(",").map(Number).filter((n)=>Number.isInteger(n)&&n>=1&&n<=31);return r}function y(e,t){let o=new Date(t);return o.setUTCHours(e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),0),o}function K(e,t,o,r){let n=h.indexOf(o);if(n===-1)return null;if(r>0){let s=new Date(Date.UTC(e,t,1)),D=1+(n-s.getUTCDay()+7)%7+(r-1)*7,d=new Date(Date.UTC(e,t,D));return d.getUTCMonth()===t?d:null}let a=new Date(Date.UTC(e,t+1,0)),c=(a.getUTCDay()-n+7)%7,i=a.getUTCDate()-c+(r+1)*7,u=new Date(Date.UTC(e,t,i));return u.getUTCMonth()===t&&i>=1?u:null}function X(e,t,o,r){let n=[],a=1000,c=0,i=(s)=>{if(e.until&&s.getTime()>e.until.getTime())return!1;if(e.count!==void 0&&c>=e.count)return!1;if(c++,s.getTime()>=o.getTime()&&s.getTime()<=r.getTime())n.push(s);return n.length<1000},u=(s)=>s.getTime()>r.getTime()||e.until!==void 0&&s.getTime()>e.until.getTime();if(e.freq==="DAILY"){for(let s=new Date(t);;s.setUTCDate(s.getUTCDate()+e.interval))if(u(s)||!i(new Date(s)))break;return n}if(e.freq==="WEEKLY"){let s=e.byDay?.length?e.byDay:[h[t.getUTCDay()]],m=new Date(t);m.setUTCDate(m.getUTCDate()-m.getUTCDay());e:for(let D=new Date(m);;D.setUTCDate(D.getUTCDate()+7*e.interval)){for(let d of[...s].sort((T,l)=>h.indexOf(T)-h.indexOf(l))){let T=h.indexOf(d);if(T===-1)continue;let l=y(t,new Date(Date.UTC(D.getUTCFullYear(),D.getUTCMonth(),D.getUTCDate()+T)));if(l.getTime()<t.getTime())continue;if(u(l)||!i(l))break e}if(D.getTime()>r.getTime())break}return n}if(e.freq==="MONTHLY"){e:for(let s=0;;s+=e.interval){let m=t.getUTCFullYear(),D=t.getUTCMonth()+s,d=[];if(e.byDay?.length)for(let f of e.byDay){let p=f.match(/^(-?\d)?([A-Z]{2})$/);if(!p)continue;let Y=Number(p[1]??1),L=K(m,D,p[2],Y);if(L)d.push(y(t,L))}else if(e.byMonthDay?.length)for(let f of e.byMonthDay){let p=new Date(Date.UTC(m,D,f));if(p.getUTCDate()===f)d.push(y(t,p))}else{let f=new Date(Date.UTC(m,D,t.getUTCDate()));if(f.getUTCDate()===t.getUTCDate())d.push(y(t,f))}let T=!1;for(let f of d.sort((p,Y)=>p.getTime()-Y.getTime())){if(f.getTime()<t.getTime())continue;if(T=!0,u(f)||!i(f))break e}if(new Date(Date.UTC(m,D,1)).getTime()>r.getTime()&&!T)break}return n}for(let s=0;;s+=e.interval){let m=new Date(Date.UTC(t.getUTCFullYear()+s,t.getUTCMonth(),t.getUTCDate(),t.getUTCHours(),t.getUTCMinutes(),t.getUTCSeconds()));if(u(m)||!i(m))break}return n}function fe(e){return A(e)}function de(e){return S(e)}function pe(e){return N(e)}function Te(e){return F(e)}function ge(e){return v(e)}export{z as buildCalendarFeed,W as calendarFeedHeaders,C as escapeIcsText,X as expandRecurrence,fe as exportCalendarGoogle,de as exportCalendarIcs,pe as exportCalendarIcsBody,Te as exportCalendarOutlook,ge as exportCalendarYahoo,V as foldIcsLine,j as parseRRule};
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stacksjs/calendar-api",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.72.
|
|
4
|
+
"version": "0.72.60",
|
|
5
5
|
"description": "Easily interact with calendar APIs.",
|
|
6
6
|
"author": "Chris Breuer",
|
|
7
7
|
"contributors": [
|
|
@@ -60,9 +60,9 @@
|
|
|
60
60
|
"@stacksjs/stx": "^0.2.219"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
|
-
"@stacksjs/browser": "0.72.
|
|
63
|
+
"@stacksjs/browser": "0.72.60",
|
|
64
64
|
"better-dx": "^0.2.24",
|
|
65
|
-
"@stacksjs/security": "0.72.
|
|
65
|
+
"@stacksjs/security": "0.72.60"
|
|
66
66
|
},
|
|
67
67
|
"sideEffects": false
|
|
68
68
|
}
|