]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
adding jshint to build script
authorTim Wood <washwithcare@gmail.com>
Sat, 7 May 2011 00:10:47 +0000 (17:10 -0700)
committerTim Wood <washwithcare@gmail.com>
Sat, 7 May 2011 00:10:47 +0000 (17:10 -0700)
build.js
underscore.date.js
underscore.date.min.js

index 672bdb61742bc650e92175f5653a962f6760133f..b4a7affc755cc6e20044fd5d5d54b13f6b508591 100755 (executable)
--- a/build.js
+++ b/build.js
@@ -1,12 +1,40 @@
 var fs     = require('fs'),
-    uglify = require('uglify-js');
+    uglify = require('uglify-js'),
+    jshint = require('jshint');
 
+var config = {
+    "node" : true,
+    "es5" : true,
+    "browser" : true,
+    "boss" : false,
+    "curly": true,
+    "debug": false,
+    "devel": false,
+    "eqeqeq": true,
+    "evil": false,
+    "forin": false,
+    "immed": false,
+    "laxbreak": false,
+    "newcap": true,
+    "noarg": true,
+    "noempty": false,
+    "nonew": false,
+    "nomen": false,
+    "onevar": true,
+    "plusplus": false,
+    "regexp": false,
+    "undef": true,
+    "sub": true,
+    "strict": false,
+    "white": true
+}
+    
 function makeFile(filename, contents) {
     fs.writeFileSync(filename, contents);
     console.log(filename + " saved");
 }
 
-(function() {
+function minify() {
     var output = fs.readFileSync('./underscore.date.js', 'utf8'), 
         ast, 
         ugly;
@@ -16,4 +44,26 @@ function makeFile(filename, contents) {
     ugly = uglify.uglify.gen_code(ast);
         
     makeFile('./underscore.date.min.js', ugly);
-})();
+}
+
+function logError(error) {
+    console.log('==== ' + error.id + ' ' + error.line + ':' + error.character);
+    console.log('     ' + error.reason);
+    console.log('     ' + error.evidence);
+}
+
+(function(){
+    var source = fs.readFileSync('./underscore.date.js', 'utf8');
+
+    var passed = jshint.JSHINT(source, config);
+       
+    if (passed) {
+        console.log(' passed jshint ');
+        minify();
+    } else {
+        console.log('============================================');
+        console.log(' failed jshint ');
+        jshint.JSHINT.errors.forEach(logError);
+        console.log('============================================');
+    }
+})();
\ No newline at end of file
index 672a0e929681feff26b0bc4351e0bcf3a88b7212..8157745396e915cfab09e8b7c4fb5553e2566134 100644 (file)
@@ -5,12 +5,10 @@
 //
 // Version 0.4.0
 
-(function(undefined){
+(function (undefined) {
     // Establish the root object, "window" in the browser, or "global" on the server.
-    var root = this;
-
-    // assign variables here so they can be overwritten for i18n or customization
-    var self = this, _date,
+    var root = this, 
+        _date,
         wordsMonths = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
         wordsMonthsShort = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
         wordsWeekdays = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
@@ -30,7 +28,7 @@
             y: "a year",
             yy: "%d years"
         },
-        createOrdinal = function(number) {
+        createOrdinal = function (number) {
             var b = number % 10;
             return (~~ (number % 100 / 10) === 1) ? 'th' : 
                 (b === 1) ? 'st' : 
@@ -49,7 +47,7 @@
     }
     
     // helper function for _.addTime and _.subtractTime
-    function dateAddRemove(_this, input, adding){
+    function dateAddRemove(_this, input, adding) {
         var self = _this.date,
             ms = (input.ms || 0) +
             (input.s  || 0) * 1e3 + // 1000
@@ -92,9 +90,9 @@
     // array = new Date(array)
     // number = new Date(number)
     // string = new Date(string)
-    function makeInputDate(input){
+    function makeInputDate(input) {
         return input === undefined ? new Date() :
-            input instanceof _Date ? input.date :
+            input.date instanceof Date ? input.date :
             input instanceof Date ? input : 
             isArray(input) ? dateFromArray(input) :
             new Date(input);
     // date = date.gettime()
     // array = new Date(array).getTime()
     // string = new Date(string).getTime()
-    function makeInputMilliseconds(input){
+    function makeInputMilliseconds(input) {
         return isNaN(input) ? makeInputDate(input).getTime() : input;
     }
     
             substituteTimeAgo('yy', ~~ years);
     }
     
-    // _Date prototype object
-    function _Date(input) {
+    // UnderscoreDate prototype object
+    function UnderscoreDate(input) {
         this.date = makeInputDate(input);
         return this;
     }
     
-    var _DateProto = _Date.prototype = {
+    UnderscoreDate.prototype = {
         
-        format : function(inputString) {
+        format : function (inputString) {
             // shortcuts to this and getting time functions
             // done to save bytes in minification
             var date = this.date,
                 var a, b;
                 switch (input) {
                     // MONTH
-                    case 'M' : 
-                        return currentMonth + 1;
-                    case 'Mo' : 
-                        return (currentMonth + 1) + createOrdinal(currentMonth + 1);
-                    case 'MM' :
-                        return leftZeroFill(currentMonth + 1, 2);
-                    case 'MMM' : 
-                        return wordsMonthsShort[currentMonth];
-                    case 'MMMM' : 
-                        return wordsMonths[currentMonth];
-                    // DAY OF MONTH
-                    case 'D' : 
-                        return currentDate;
-                    case 'Do' : 
-                        return currentDate + createOrdinal(currentDate);
-                    case 'DD' : 
-                        return leftZeroFill(currentDate, 2);
-                    // DAY OF YEAR
-                    case 'DDD' :
-                        a = new Date(currentYear, currentMonth, currentDate);
-                        b = new Date(currentYear, 0, 1);
-                        return ~~ (((a - b) / 864e5) + 1.5);
-                    case 'DDDo' : 
-                        a = replaceFunction('DDD');
-                        return a + createOrdinal(a);
-                    case 'DDDD' :
-                        return leftZeroFill(replaceFunction('DDD'), 3);
-                    // WEEKDAY
-                    case 'd' :
-                        return currentDay;
-                    case 'do' : 
-                        return currentDay + createOrdinal(currentDay);
-                    case 'ddd' : 
-                        return wordsWeekdaysShort[currentDay];
-                    case 'dddd' : 
-                        return wordsWeekdays[currentDay];
-                    // WEEK OF YEAR
-                    case 'w' : 
-                        a = new Date(currentYear, currentMonth, currentDate - currentDay + 5);
-                        b = new Date(a.getFullYear(), 0, 4);
-                        return ~~ ((a - b) / 864e5 / 7 + 1.5);
-                    case 'wo' : 
-                        a = replaceFunction('w');
-                        return a + createOrdinal(a);
-                    case 'ww' : 
-                        return leftZeroFill(replaceFunction('w'), 2);
-                    // YEAR
-                    case 'YY' : 
-                        return (currentYear + '').slice(-2);
-                    case 'YYYY' : 
-                        return currentYear;
-                    // AM / PM
-                    case 'a' : 
-                        return currentHours > 11 ? 'pm' : 'am';
-                    case 'A' :
-                        return currentHours > 11 ? 'PM' : 'AM';
-                    // 24 HOUR 
-                    case 'H' : 
-                        return currentHours;
-                    case 'HH' : 
-                        return leftZeroFill(currentHours, 2);
-                    // 12 HOUR 
-                    case 'h' : 
-                        return currentHours % 12 || 12;
-                    case 'hh' : 
-                        return leftZeroFill(currentHours % 12 || 12, 2);
-                    // MINUTE
-                    case 'm' : 
-                        return currentMinutes;
-                    case 'mm' : 
-                        return leftZeroFill(currentMinutes, 2);
-                    // SECOND
-                    case 's' : 
-                        return currentSeconds;
-                    case 'ss' : 
-                        return leftZeroFill(currentSeconds, 2);
-                    // TIMEZONE
-                    case 'z' :
-                        return replaceFunction('zz').replace(nonuppercaseLetters, '');
-                    case 'zz' : 
-                        a = currentString.indexOf('(');
-                        if (a > -1) {
-                            return currentString.slice(a + 1, currentString.indexOf(')'));
-                        }
-                        return currentString.slice(currentString.indexOf(':')).replace(nonuppercaseLetters, '');
-                    // DEFAULT
-                    default :
-                        return input.replace("\\", "");
+                case 'M' : 
+                    return currentMonth + 1;
+                case 'Mo' : 
+                    return (currentMonth + 1) + createOrdinal(currentMonth + 1);
+                case 'MM' :
+                    return leftZeroFill(currentMonth + 1, 2);
+                case 'MMM' : 
+                    return wordsMonthsShort[currentMonth];
+                case 'MMMM' : 
+                    return wordsMonths[currentMonth];
+                // DAY OF MONTH
+                case 'D' : 
+                    return currentDate;
+                case 'Do' : 
+                    return currentDate + createOrdinal(currentDate);
+                case 'DD' : 
+                    return leftZeroFill(currentDate, 2);
+                // DAY OF YEAR
+                case 'DDD' :
+                    a = new Date(currentYear, currentMonth, currentDate);
+                    b = new Date(currentYear, 0, 1);
+                    return ~~ (((a - b) / 864e5) + 1.5);
+                case 'DDDo' : 
+                    a = replaceFunction('DDD');
+                    return a + createOrdinal(a);
+                case 'DDDD' :
+                    return leftZeroFill(replaceFunction('DDD'), 3);
+                // WEEKDAY
+                case 'd' :
+                    return currentDay;
+                case 'do' : 
+                    return currentDay + createOrdinal(currentDay);
+                case 'ddd' : 
+                    return wordsWeekdaysShort[currentDay];
+                case 'dddd' : 
+                    return wordsWeekdays[currentDay];
+                // WEEK OF YEAR
+                case 'w' : 
+                    a = new Date(currentYear, currentMonth, currentDate - currentDay + 5);
+                    b = new Date(a.getFullYear(), 0, 4);
+                    return ~~ ((a - b) / 864e5 / 7 + 1.5);
+                case 'wo' : 
+                    a = replaceFunction('w');
+                    return a + createOrdinal(a);
+                case 'ww' : 
+                    return leftZeroFill(replaceFunction('w'), 2);
+                // YEAR
+                case 'YY' : 
+                    return (currentYear + '').slice(-2);
+                case 'YYYY' : 
+                    return currentYear;
+                // AM / PM
+                case 'a' : 
+                    return currentHours > 11 ? 'pm' : 'am';
+                case 'A' :
+                    return currentHours > 11 ? 'PM' : 'AM';
+                // 24 HOUR 
+                case 'H' : 
+                    return currentHours;
+                case 'HH' : 
+                    return leftZeroFill(currentHours, 2);
+                // 12 HOUR 
+                case 'h' : 
+                    return currentHours % 12 || 12;
+                case 'hh' : 
+                    return leftZeroFill(currentHours % 12 || 12, 2);
+                // MINUTE
+                case 'm' : 
+                    return currentMinutes;
+                case 'mm' : 
+                    return leftZeroFill(currentMinutes, 2);
+                // SECOND
+                case 's' : 
+                    return currentSeconds;
+                case 'ss' : 
+                    return leftZeroFill(currentSeconds, 2);
+                // TIMEZONE
+                case 'z' :
+                    return replaceFunction('zz').replace(nonuppercaseLetters, '');
+                case 'zz' : 
+                    a = currentString.indexOf('(');
+                    if (a > -1) {
+                        return currentString.slice(a + 1, currentString.indexOf(')'));
+                    }
+                    return currentString.slice(currentString.indexOf(':')).replace(nonuppercaseLetters, '');
+                // DEFAULT
+                default :
+                    return input.replace("\\", "");
                 }
             }
             return inputString.replace(charactersToReplace, replaceFunction);
         },
-        add : function(input) {
+        add : function (input) {
             return dateAddRemove(this, input, 1);
         },
-        subtract : function(input) {
+        subtract : function (input) {
             return dateAddRemove(this, input, -1);
         },
-        customize : function(input) {
+        customize : function (input) {
             var inputOrdinal = input.ordinal,
-                inputRelativeTime = input.relativeTime;
+                inputRelativeTime = input.relativeTime,
+                key;
             if (input.weekdays) {
                 wordsWeekdays = input.weekdays;
             }
                 wordsMonthsShort = input.monthsShort;
             }
             if (inputRelativeTime) {
-                for (var key in inputRelativeTime) {
+                for (key in inputRelativeTime) {
                     if (inputRelativeTime.hasOwnProperty(key)) {
                         wordsTimeAgo[key] = inputRelativeTime[key];
                     }
                 createOrdinal = inputOrdinal;
             }
         },
-        from : function(time, withoutSuffix, asMilliseconds) {
+        from : function (time, withoutSuffix, asMilliseconds) {
             var difference = msApart(this.date, time),
                 string = difference < 0 ? wordsTimeAgo.past : wordsTimeAgo.future;
             return asMilliseconds ? difference : 
                 withoutSuffix ? relativeTime(difference) :
                 string.replace(/%s/i, relativeTime(difference));
         },
-        fromNow : function(withoutSuffix, asMilliseconds) {
+        fromNow : function (withoutSuffix, asMilliseconds) {
             return this.from(_date.now(), withoutSuffix, asMilliseconds);
         },
-        isLeapYear : function() {
+        isLeapYear : function () {
             return _date.isLeapYear(this.date.getFullYear());
         }
     };
         // function to convert string input to date
         function addTime(format, input) {
             switch (format) {
-                // MONTH
-                case 'M' :
-                    // fall through to MM
-                case 'MM' :
-                    array[1] = ~~input - 1;
-                    break;
-                // DAY OF MONTH
-                case 'D' : 
-                    // fall through to DDDD
-                case 'DD' : 
-                    // fall through to DDDD
-                case 'DDD' :
-                    // fall through to DDDD
-                case 'DDDD' :
-                    array[2] = ~~input;
-                    break;
-                // YEAR
-                case 'YY' : 
-                    input = ~~input;
-                    array[0] = input + (input > 70 ? 1900 : 2000);
-                    break;
-                case 'YYYY' : 
-                    array[0] = ~~input;
-                    break;
-                // AM / PM
-                case 'a' : 
-                    // fall through to A
-                case 'A' :
-                    isPm = (input.toLowerCase() === 'pm');
-                    break;
-                // 24 HOUR 
-                case 'H' : 
-                    // fall through to hh
-                case 'HH' : 
-                    // fall through to hh
-                case 'h' : 
-                    // fall through to hh
-                case 'hh' : 
-                    array[3] = ~~input;
-                    break;
-                // MINUTE
-                case 'm' : 
-                    // fall through to mm
-                case 'mm' : 
-                    array[4] = ~~input;
-                    break;
-                // SECOND
-                case 's' : 
-                    // fall through to ss
-                case 'ss' : 
-                    array[5] = ~~input;
-                    break;
+            // MONTH
+            case 'M' :
+                // fall through to MM
+            case 'MM' :
+                array[1] = ~~input - 1;
+                break;
+            // DAY OF MONTH
+            case 'D' : 
+                // fall through to DDDD
+            case 'DD' : 
+                // fall through to DDDD
+            case 'DDD' :
+                // fall through to DDDD
+            case 'DDDD' :
+                array[2] = ~~input;
+                break;
+            // YEAR
+            case 'YY' : 
+                input = ~~input;
+                array[0] = input + (input > 70 ? 1900 : 2000);
+                break;
+            case 'YYYY' : 
+                array[0] = ~~input;
+                break;
+            // AM / PM
+            case 'a' : 
+                // fall through to A
+            case 'A' :
+                isPm = (input.toLowerCase() === 'pm');
+                break;
+            // 24 HOUR 
+            case 'H' : 
+                // fall through to hh
+            case 'HH' : 
+                // fall through to hh
+            case 'h' : 
+                // fall through to hh
+            case 'hh' : 
+                array[3] = ~~input;
+                break;
+            // MINUTE
+            case 'm' : 
+                // fall through to mm
+            case 'mm' : 
+                array[4] = ~~input;
+                break;
+            // SECOND
+            case 's' : 
+                // fall through to ss
+            case 'ss' : 
+                array[5] = ~~input;
+                break;
             }
         }
         
         // add input parts to array
-        string.replace(charactersToPutInArray, function(input) {
+        string.replace(charactersToPutInArray, function (input) {
             inputParts.push(input);
         });
         // add format parts to array
-        format.replace(charactersToPutInArray, function(input) {
+        format.replace(charactersToPutInArray, function (input) {
             formatParts.push(input);
         });
         
             array[3] += 12;
         }
         
-        return new _Date(array);
+        return new UnderscoreDate(array);
     }
     
     _date = {
-        date : function(input, format) {
-            return format ? makeDateFromStringAndFormat(input, format) : new _Date(input);
+        date : function (input, format) {
+            return format ? makeDateFromStringAndFormat(input, format) : new UnderscoreDate(input);
         },
-        now : function(asTimestamp) {
+        now : function (asTimestamp) {
             return asTimestamp ? new Date().getTime() : _date.date();
         },
-        isLeapYear : function(year) {
+        isLeapYear : function (year) {
             return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;
         }
     };
index bc79668b659cab9feae293ac1a7598535a8b8081..f82557a7dda08bc63c5c6b0e2ec9c3f2e70b109e 100644 (file)
@@ -1 +1 @@
-(function(a){function v(a,b){function i(a,b){switch(a){case"M":case"MM":c[1]=~~b-1;break;case"D":case"DD":case"DDD":case"DDDD":c[2]=~~b;break;case"YY":b=~~b,c[0]=b+(b>70?1900:2e3);break;case"YYYY":c[0]=~~b;break;case"a":case"A":h=b.toLowerCase()==="pm";break;case"H":case"HH":case"h":case"hh":c[3]=~~b;break;case"m":case"mm":c[4]=~~b;break;case"s":case"ss":c[5]=~~b}}var c=[0],d=/[0-9a-zA-Z]+/g,e=[],f=[],g,h;a.replace(d,function(a){e.push(a)}),b.replace(d,function(a){f.push(a)});for(g=0;g<f.length;g++)i(f[g],e[g]);h&&c[3]<12&&(c[3]+=12);return new t(c)}function t(a){this.date=o(a);return this}function s(a){var b=Math.abs(a)/1e3,c=b/60,d=c/60,e=d/24,f=e/365;return b<45&&q("s",~~b)||b<90&&q("m")||c<45&&q("mm",~~c)||c<90&&q("h")||d<24&&q("hh",~~d)||d<48&&q("d")||e<25&&q("dd",~~e)||e<45&&q("M")||e<350&&q("MM",~~((e+15)/30))||f<2&&q("y")||q("yy",~~f)}function r(a,b){return p(a)-p(b)}function q(a,b){return i[a].replace(/%d/i,b||1)}function p(a){return isNaN(a)?o(a).getTime():a}function o(b){return b===a?new Date:b instanceof t?b.date:b instanceof Date?b:n(b)?m(b):new Date(b)}function n(a){return Object.prototype.toString.call(a)==="[object Array]"}function m(a){return new Date(a[0],a[1]||0,a[2]||1,a[3]||0,a[4]||0,a[5]||0,a[6]||0)}function l(a,b,c){var d=a.date,e=(b.ms||0)+(b.s||0)*1e3+(b.m||0)*6e4+(b.h||0)*36e5+(b.d||0)*864e5+(b.w||0)*6048e5,f=(b.M||0)+(b.y||0)*12,g;e&&d.setMilliseconds(d.getMilliseconds()+e*c),f&&(g=d.getDate(),d.setDate(1),d.setMonth(d.getMonth()+f*c),d.setDate(Math.min((new Date(d.getFullYear(),d.getMonth()+1,0)).getDate(),g)));return a}function k(a,b){var c=a+"";while(c.length<b)c="0"+c;return c}var b=this,c=this,d,e=["January","February","March","April","May","June","July","August","September","October","November","December"],f=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],g=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],h=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],i={future:"in %s",past:"%s ago",s:"seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},j=function(a){var b=a%10;return~~(a%100/10)===1?"th":b===1?"st":b===2?"nd":b===3?"rd":"th"},u=t.prototype={format:function(a){function s(a){var b,q;switch(a){case"M":return c+1;case"Mo":return c+1+j(c+1);case"MM":return k(c+1,2);case"MMM":return f[c];case"MMMM":return e[c];case"D":return d;case"Do":return d+j(d);case"DD":return k(d,2);case"DDD":b=new Date(i,c,d),q=new Date(i,0,1);return~~((b-q)/864e5+1.5);case"DDDo":b=s("DDD");return b+j(b);case"DDDD":return k(s("DDD"),3);case"d":return l;case"do":return l+j(l);case"ddd":return h[l];case"dddd":return g[l];case"w":b=new Date(i,c,d-l+5),q=new Date(b.getFullYear(),0,4);return~~((b-q)/864e5/7+1.5);case"wo":b=s("w");return b+j(b);case"ww":return k(s("w"),2);case"YY":return(i+"").slice(-2);case"YYYY":return i;case"a":return m>11?"pm":"am";case"A":return m>11?"PM":"AM";case"H":return m;case"HH":return k(m,2);case"h":return m%12||12;case"hh":return k(m%12||12,2);case"m":return n;case"mm":return k(n,2);case"s":return o;case"ss":return k(o,2);case"z":return s("zz").replace(r,"");case"zz":b=p.indexOf("(");if(b>-1)return p.slice(b+1,p.indexOf(")"));return p.slice(p.indexOf(":")).replace(r,"");default:return a.replace("\\","")}}var b=this.date,c=b.getMonth(),d=b.getDate(),i=b.getFullYear(),l=b.getDay(),m=b.getHours(),n=b.getMinutes(),o=b.getSeconds(),p=b.toString(),q=/(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|dddd?|do?|w[o|w]?|YYYY|YY|a|A|hh?|HH?|mm?|ss?|zz?)/g,r=/[^A-Z]/g;return a.replace(q,s)},add:function(a){return l(this,a,1)},subtract:function(a){return l(this,a,-1)},customize:function(a){var b=a.ordinal,c=a.relativeTime;a.weekdays&&(g=a.weekdays),a.weekdaysShort&&(h=a.weekdaysShort),a.months&&(e=a.months),a.monthsShort&&(f=a.monthsShort);if(c)for(var d in c)c.hasOwnProperty(d)&&(i[d]=c[d]);b&&b instanceof Function&&(j=b)},from:function(a,b,c){var d=r(this.date,a),e=d<0?i.past:i.future;return c?d:b?s(d):e.replace(/%s/i,s(d))},fromNow:function(a,b){return this.from(d.now(),a,b)},isLeapYear:function(){return d.isLeapYear(this.date.getFullYear())}};d={date:function(a,b){return b?v(a,b):new t(a)},now:function(a){return a?(new Date).getTime():d.date()},isLeapYear:function(a){return a%4===0&&a%100!==0||a%400===0}},typeof window=="undefined"&&typeof module!="undefined"?module.exports=d:b._!==a?b._.mixin(d):b._date=d})()
\ No newline at end of file
+(function(a){function t(a,b){function i(a,b){switch(a){case"M":case"MM":c[1]=~~b-1;break;case"D":case"DD":case"DDD":case"DDDD":c[2]=~~b;break;case"YY":b=~~b,c[0]=b+(b>70?1900:2e3);break;case"YYYY":c[0]=~~b;break;case"a":case"A":h=b.toLowerCase()==="pm";break;case"H":case"HH":case"h":case"hh":c[3]=~~b;break;case"m":case"mm":c[4]=~~b;break;case"s":case"ss":c[5]=~~b}}var c=[0],d=/[0-9a-zA-Z]+/g,e=[],f=[],g,h;a.replace(d,function(a){e.push(a)}),b.replace(d,function(a){f.push(a)});for(g=0;g<f.length;g++)i(f[g],e[g]);h&&c[3]<12&&(c[3]+=12);return new s(c)}function s(a){this.date=n(a);return this}function r(a){var b=Math.abs(a)/1e3,c=b/60,d=c/60,e=d/24,f=e/365;return b<45&&p("s",~~b)||b<90&&p("m")||c<45&&p("mm",~~c)||c<90&&p("h")||d<24&&p("hh",~~d)||d<48&&p("d")||e<25&&p("dd",~~e)||e<45&&p("M")||e<350&&p("MM",~~((e+15)/30))||f<2&&p("y")||p("yy",~~f)}function q(a,b){return o(a)-o(b)}function p(a,b){return h[a].replace(/%d/i,b||1)}function o(a){return isNaN(a)?n(a).getTime():a}function n(b){return b===a?new Date:b.date instanceof Date?b.date:b instanceof Date?b:m(b)?l(b):new Date(b)}function m(a){return Object.prototype.toString.call(a)==="[object Array]"}function l(a){return new Date(a[0],a[1]||0,a[2]||1,a[3]||0,a[4]||0,a[5]||0,a[6]||0)}function k(a,b,c){var d=a.date,e=(b.ms||0)+(b.s||0)*1e3+(b.m||0)*6e4+(b.h||0)*36e5+(b.d||0)*864e5+(b.w||0)*6048e5,f=(b.M||0)+(b.y||0)*12,g;e&&d.setMilliseconds(d.getMilliseconds()+e*c),f&&(g=d.getDate(),d.setDate(1),d.setMonth(d.getMonth()+f*c),d.setDate(Math.min((new Date(d.getFullYear(),d.getMonth()+1,0)).getDate(),g)));return a}function j(a,b){var c=a+"";while(c.length<b)c="0"+c;return c}var b=this,c,d=["January","February","March","April","May","June","July","August","September","October","November","December"],e=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],f=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],g=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],h={future:"in %s",past:"%s ago",s:"seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},i=function(a){var b=a%10;return~~(a%100/10)===1?"th":b===1?"st":b===2?"nd":b===3?"rd":"th"};s.prototype={format:function(a){function s(a){var b,q;switch(a){case"M":return c+1;case"Mo":return c+1+i(c+1);case"MM":return j(c+1,2);case"MMM":return e[c];case"MMMM":return d[c];case"D":return h;case"Do":return h+i(h);case"DD":return j(h,2);case"DDD":b=new Date(k,c,h),q=new Date(k,0,1);return~~((b-q)/864e5+1.5);case"DDDo":b=s("DDD");return b+i(b);case"DDDD":return j(s("DDD"),3);case"d":return l;case"do":return l+i(l);case"ddd":return g[l];case"dddd":return f[l];case"w":b=new Date(k,c,h-l+5),q=new Date(b.getFullYear(),0,4);return~~((b-q)/864e5/7+1.5);case"wo":b=s("w");return b+i(b);case"ww":return j(s("w"),2);case"YY":return(k+"").slice(-2);case"YYYY":return k;case"a":return m>11?"pm":"am";case"A":return m>11?"PM":"AM";case"H":return m;case"HH":return j(m,2);case"h":return m%12||12;case"hh":return j(m%12||12,2);case"m":return n;case"mm":return j(n,2);case"s":return o;case"ss":return j(o,2);case"z":return s("zz").replace(r,"");case"zz":b=p.indexOf("(");if(b>-1)return p.slice(b+1,p.indexOf(")"));return p.slice(p.indexOf(":")).replace(r,"");default:return a.replace("\\","")}}var b=this.date,c=b.getMonth(),h=b.getDate(),k=b.getFullYear(),l=b.getDay(),m=b.getHours(),n=b.getMinutes(),o=b.getSeconds(),p=b.toString(),q=/(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|dddd?|do?|w[o|w]?|YYYY|YY|a|A|hh?|HH?|mm?|ss?|zz?)/g,r=/[^A-Z]/g;return a.replace(q,s)},add:function(a){return k(this,a,1)},subtract:function(a){return k(this,a,-1)},customize:function(a){var b=a.ordinal,c=a.relativeTime,j;a.weekdays&&(f=a.weekdays),a.weekdaysShort&&(g=a.weekdaysShort),a.months&&(d=a.months),a.monthsShort&&(e=a.monthsShort);if(c)for(j in c)c.hasOwnProperty(j)&&(h[j]=c[j]);b&&b instanceof Function&&(i=b)},from:function(a,b,c){var d=q(this.date,a),e=d<0?h.past:h.future;return c?d:b?r(d):e.replace(/%s/i,r(d))},fromNow:function(a,b){return this.from(c.now(),a,b)},isLeapYear:function(){return c.isLeapYear(this.date.getFullYear())}},c={date:function(a,b){return b?t(a,b):new s(a)},now:function(a){return a?(new Date).getTime():c.date()},isLeapYear:function(a){return a%4===0&&a%100!==0||a%400===0}},typeof window=="undefined"&&typeof module!="undefined"?module.exports=c:b._!==a?b._.mixin(c):b._date=c})()
\ No newline at end of file