UNPKG

dayjs-recur

Version:

A Day.js plugin for matching and generating recurring dates.

1 lines 7.82 kB
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("dayjs/plugin/utc"),require("dayjs/plugin/weekOfYear")):"function"==typeof define&&define.amd?define(["dayjs/plugin/utc","dayjs/plugin/weekOfYear"],e):(t=t||self).recur=e(t.utc,t.weekOfYear)}(this,(function(t,e){"use strict";t=t&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t,e=e&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e;return(r,n,s)=>{s.extend(t),s.extend(e);var a={create:function(t,e){for(var r in t)if(t.hasOwnProperty(r)&&parseInt(r,10)<=0)throw Error("Intervals must be greater than zero");return{measure:e.toLowerCase(),units:t}},match:function(t,e,r,n){var s=null;for(var a in s=n.isBefore(r)?r.diff(n,t,!0):n.diff(r,t,!0),"days"==t&&(s=parseInt(s)),e)if(e.hasOwnProperty(a)&&s%(a=parseInt(a,10))==0)return!0;return!1}},i=function(){const t={daysOfMonth:"date",daysOfWeek:"day",weeksOfMonth:"monthWeek",weeksOfMonthByDay:"monthWeekByDay",weeksOfYear:"week",monthsOfYear:"month"},e={daysOfMonth:{low:1,high:31},daysOfWeek:{low:0,high:6},weeksOfMonth:{low:0,high:4},weeksOfMonthByDay:{low:0,high:4},weeksOfYear:{low:0,high:52},monthsOfYear:{low:0,high:11}},r={Sunday:0,Monday:1,Tuesday:2,Wednesday:3,Thursday:4,Friday:5,Saturday:6};function n(t,e){var n,a,i={};for(n in t)t.hasOwnProperty(n)&&(a=parseInt(n,10),isNaN(a)&&(a=n),i["days"===e&&isNaN(a)?s().set("day",r[a]).get("day"):s().set(e,a).get(e)]=t[n]);return i}return{create:function(t,r){var s=[];for(var a in"daysOfWeek"===r&&(t=n(t,"days")),"monthsOfYear"===r&&(t=n(t,"months")),t)hasOwnProperty.call(t,a)&&s.push(a);return function(t,e,r){r.forEach((function(r){if(r<t||r>e)throw Error("Value should be in range "+t+" to "+e)}))}(e[r].low,e[r].high,s),{measure:r,units:t}},match:function(e,r,n){var s=t[e],a=n[s]();if(r[a])return!0;if("date"===s&&a==n.add(1,"months").date(0).format("D")&&a<31)for(;a<=31;){if(r[a])return!0;a++}return!1}}}(),o=function(){var t={days:"interval",weeks:"interval",months:"interval",years:"interval",daysOfWeek:"calendar",daysOfMonth:"calendar",weeksOfMonth:"calendar",weeksOfMonthByDay:"calendar",weeksOfYear:"calendar",monthsOfYear:"calendar"},e={days:"day",weeks:"week",months:"month",years:"year",daysOfWeek:"dayOfWeek",daysOfMonth:"dayOfMonth",weeksOfMonth:"weekOfMonth",weeksOfMonthByDay:"weekOfMonthByDay",weeksOfYear:"weekOfYear",monthsOfYear:"monthOfYear"};function r(){var e,r=t[this.measure];if(!(this instanceof u))throw Error("Private method trigger() was called directly or not called as instance of Recur!");if(void 0===this.units||null===this.units||!this.measure)return this;if("calendar"!==r&&"interval"!==r)throw Error("Invalid measure provided: "+this.measure);if("interval"===r){if(!this.start)throw Error("Must have a start date set to set an interval!");e=a.create(this.units,this.measure)}if("calendar"===r&&(e=i.create(this.units,this.measure)),this.units=null,this.measure=null,"weeksOfMonthByDay"===e.measure&&!this.hasRule("daysOfWeek"))throw Error("weeksOfMonthByDay must be combined with daysOfWeek");for(var n=0;n<this.rules.length;n++)this.rules[n].measure===e.measure&&this.rules.splice(n,1);return this.rules.push(e),this}function n(t,e,r){var n,s,a=[];if(!(this instanceof u))throw Error("Private method trigger() was called directly or not called as instance of Recur!");if(!this.start&&!this.from)throw Error("Cannot get occurrences without start or from date.");if("all"===r&&!this.end)throw Error("Cannot get all occurrences without an end date.");if(this.end&&this.start>this.end)throw Error("Start date cannot be later than end date.");if("all"!==r&&!(t>0))return a;for(n=(this.from||this.start).clone(),"all"===r&&this.matches(n,!1)&&(s=e?n.format(e):n.clone(),a.push(s));a.length<(null===t?a.length+1:t)&&(n="next"===r||"all"===r?n.add(1,"day"):n.subtract(1,"day"),this.matches(n,"all"!==r)&&(s=e?n.format(e):n.clone(),a.push(s)),!(n>=this.end)););return a}function o(t){switch(t){case"day":return"days";case"week":return"weeks";case"month":return"months";case"year":return"years";case"dayOfWeek":return"daysOfWeek";case"dayOfMonth":return"daysOfMonth";case"weekOfMonth":return"weeksOfMonth";case"weekOfMonthByDay":return"weeksOfMonthByDay";case"weekOfYear":return"weeksOfYear";case"monthOfYear":return"monthsOfYear";default:return t}}function h(t){return function(e){return this.every.call(this,e,t),this}}var u=function(t){t.start&&(this.start=s(t.start).dateOnly()),t.end&&(this.end=s(t.end).dateOnly()),this.rules=t.rules||[];var e=t.exceptions||[];this.exceptions=[];for(var r=0;r<e.length;r++)this.except(e[r]);return this.units=null,this.measure=null,this.from=null,this};for(var f in u.prototype.startDate=function(t){return null===t?(this.start=null,this):t?(this.start=s(t).dateOnly(),this):this.start},u.prototype.endDate=function(t){return null===t?(this.end=null,this):t?(this.end=s(t).dateOnly(),this):this.end},u.prototype.fromDate=function(t){return null===t?(this.from=null,this):t?(this.from=s(t).dateOnly(),this):this.from},u.prototype.save=function(){var t={};this.start&&s(this.start).isValid()&&(t.start=this.start.format("YYYY-MM-DD")),this.end&&s(this.end).isValid()&&(t.end=this.end.format("YYYY-MM-DD")),t.exceptions=[];for(var e=0,r=this.exceptions.length;e<r;e++)t.exceptions.push(this.exceptions[e].format("YYYY-MM-DD"));return t.rules=this.rules,t},u.prototype.repeats=function(){return this.rules.length>0},u.prototype.every=function(t,e){return null!=t&&(this.units=function(t){var e={};if("[object Array]"==Object.prototype.toString.call(t))t.forEach((function(t){e[t]=!0}));else if(t===Object(t))e=t;else{if("[object Number]"!=Object.prototype.toString.call(t)&&"[object String]"!=Object.prototype.toString.call(t))throw Error("Provide an array, object, string or number when passing units!");e[t]=!0}return e}(t)),null!=e&&(this.measure=o(e)),r.call(this)},u.prototype.except=function(t){return t=s(t).dateOnly(),this.exceptions.push(t),this},u.prototype.forget=function(t){var e,r,n=s(t);if(n.isValid()){for(n=n.dateOnly(),e=0,r=this.exceptions.length;e<r;e++)if(n.isSame(this.exceptions[e]))return this.exceptions.splice(e,1),this;return this}for(e=0,r=this.rules.length;e<r;e++)this.rules[e].measure===o(t)&&this.rules.splice(e,1)},u.prototype.hasRule=function(t){var e,r;for(e=0,r=this.rules.length;e<r;e++)if(this.rules[e].measure===o(t))return!0;return!1},u.prototype.matches=function(e,r){var n=s(e).dateOnly();if(!n.isValid())throw Error("Invalid date supplied to match method: "+e);return!(!r&&!function(t,e,r){return(!t||!r.isBefore(t))&&(!e||!r.isAfter(e))}(this.start,this.end,n))&&(!function(t,e){for(var r=0,n=t.length;r<n;r++)if(s(t[r]).isSame(e))return!0;return!1}(this.exceptions,n)&&!!function(e,r,n){var s,o,h,u;for(s=0,o=e.length;s<o;s++)if(h=e[s],"interval"===(u=t[h.measure])){if(!a.match(h.measure,h.units,n,r))return!1}else{if("calendar"!==u)return!1;if(!i.match(h.measure,h.units,r))return!1}return!0}(this.rules,n,this.start))},u.prototype.next=function(t,e){return n.call(this,t,e,"next")},u.prototype.previous=function(t,e){return n.call(this,t,e,"previous")},u.prototype.all=function(t){return n.call(this,null,t,"all")},e)t.hasOwnProperty(f)&&(u.prototype[f]=u.prototype[e[f]]=h(f));return u}();s.recur=function(t,e){return t!==Object(t)||s.isDayjs(t)?new o({start:t,end:e}):new o(t)},n.prototype.recur=function(t,e){return t!==Object(t)||s.isDayjs(t)?(e||(e=t,t=void 0),t||(t=this),new o({start:t,end:e,moment:this})):(void 0===t.start&&(t.start=this),new o(t))},n.prototype.monthWeek=function(){var t=this.clone().startOf("month").startOf("week");return this.clone().startOf("week").diff(t,"weeks")},n.prototype.monthWeekByDay=function(){return Math.floor((this.date()-1)/7)},n.prototype.dateOnly=function(){return this.startOf("day").add(this.utcOffset(),"minute").utc()}}}));