@sapphire/duration 1.1.0-next.5440a99.0 → 1.1.0-next.5a1e7fe.0

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.d.ts CHANGED
@@ -26,11 +26,14 @@ interface DurationFormatAssetsTime {
26
26
  }
27
27
 
28
28
  declare enum Time {
29
+ Nanosecond = 0.000001,
30
+ Microsecond = 0.001,
29
31
  Millisecond = 1,
30
32
  Second = 1000,
31
33
  Minute = 60000,
32
34
  Hour = 3600000,
33
35
  Day = 86400000,
36
+ Week = 604800000,
34
37
  Month = 2628000000,
35
38
  Year = 31536000000
36
39
  }
@@ -11,11 +11,14 @@ var SapphireDuration = (function (exports) {
11
11
 
12
12
  // src/lib/constants.ts
13
13
  var Time = /* @__PURE__ */ ((Time2) => {
14
+ Time2[Time2["Nanosecond"] = 1e-6] = "Nanosecond";
15
+ Time2[Time2["Microsecond"] = 1e-3] = "Microsecond";
14
16
  Time2[Time2["Millisecond"] = 1] = "Millisecond";
15
17
  Time2[Time2["Second"] = 1e3] = "Second";
16
18
  Time2[Time2["Minute"] = 6e4] = "Minute";
17
19
  Time2[Time2["Hour"] = 36e5] = "Hour";
18
20
  Time2[Time2["Day"] = 864e5] = "Day";
21
+ Time2[Time2["Week"] = 6048e5] = "Week";
19
22
  Time2[Time2["Month"] = 2628e6] = "Month";
20
23
  Time2[Time2["Year"] = 31536e6] = "Year";
21
24
  return Time2;
@@ -107,16 +110,34 @@ var SapphireDuration = (function (exports) {
107
110
  ["y", 1e3 * 60 * 60 * 24 * 365.25]
108
111
  ]);
109
112
  var _Duration = class {
113
+ /**
114
+ * Create a new Duration instance
115
+ * @param pattern The string to parse
116
+ */
110
117
  constructor(pattern) {
118
+ /**
119
+ * The offset
120
+ */
111
121
  __publicField(this, "offset");
112
122
  this.offset = _Duration.parse(pattern.toLowerCase());
113
123
  }
124
+ /**
125
+ * Get the date from now
126
+ */
114
127
  get fromNow() {
115
- return this.dateFrom(new Date());
128
+ return this.dateFrom(/* @__PURE__ */ new Date());
116
129
  }
130
+ /**
131
+ * Get the date from
132
+ * @param date The Date instance to get the date from
133
+ */
117
134
  dateFrom(date) {
118
135
  return new Date(date.getTime() + this.offset);
119
136
  }
137
+ /**
138
+ * Parse the pattern
139
+ * @param pattern The pattern to parse
140
+ */
120
141
  static parse(pattern) {
121
142
  let result = 0;
122
143
  let valid = false;
@@ -133,13 +154,23 @@ var SapphireDuration = (function (exports) {
133
154
  };
134
155
  var Duration = _Duration;
135
156
  __name(Duration, "Duration");
157
+ /**
158
+ * The RegExp used for the pattern parsing
159
+ */
136
160
  __publicField(Duration, "kPatternRegex", /(-?\d*\.?\d+(?:e[-+]?\d+)?)\s*([a-zμ]*)/gi);
161
+ /**
162
+ * The RegExp used for removing commas
163
+ */
137
164
  __publicField(Duration, "kCommaRegex", /,/g);
165
+ /**
166
+ * The RegExp used for replacing a/an with 1
167
+ */
138
168
  __publicField(Duration, "kAanRegex", /\ban?\b/gi);
139
169
 
140
170
  // src/lib/DurationFormatter.ts
141
171
  var kTimeDurations = [
142
172
  ["year" /* Year */, 31536e6],
173
+ // 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month
143
174
  ["month" /* Month */, 2628e6],
144
175
  ["week" /* Week */, 1e3 * 60 * 60 * 24 * 7],
145
176
  ["day" /* Day */, 1e3 * 60 * 60 * 24],
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/constants.ts","../src/lib/Duration.ts","../src/lib/DurationFormatter.ts"],"names":["Time","TimeTypes"],"mappings":";;;;;;;;;AAEO,IAAK,OAAL,kBAAKA,UAAL;AACN,EAAAA,YAAA,iBAAc,KAAd;AACA,EAAAA,YAAA,YAAS,OAAT;AACA,EAAAA,YAAA,YAAS,OAAT;AACA,EAAAA,YAAA,UAAO,QAAP;AACA,EAAAA,YAAA,SAAM,SAAN;AACA,EAAAA,YAAA,WAAQ,UAAR;AACA,EAAAA,YAAA,UAAO,WAAP;AAPW,SAAAA;AAAA,GAAA;AAaL,IAAK,YAAL,kBAAKC,eAAL;AACN,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,YAAS;AACT,EAAAA,WAAA,UAAO;AACP,EAAAA,WAAA,SAAM;AACN,EAAAA,WAAA,UAAO;AACP,EAAAA,WAAA,WAAQ;AACR,EAAAA,WAAA,UAAO;AAPI,SAAAA;AAAA,GAAA;AAUL,IAAM,gBAA0C;AAAA,EACtD,CAAC,oBAAiB;AAAA,IACjB,GAAG;AAAA,IACH,SAAS;AAAA,EACV;AAAA,EACA,CAAC,sBAAkB;AAAA,IAClB,GAAG;AAAA,IACH,SAAS;AAAA,EACV;AAAA,EACA,CAAC,oBAAiB;AAAA,IACjB,GAAG;AAAA,IACH,SAAS;AAAA,EACV;AAAA,EACA,CAAC,kBAAgB;AAAA,IAChB,GAAG;AAAA,IACH,SAAS;AAAA,EACV;AAAA,EACA,CAAC,oBAAiB;AAAA,IACjB,GAAG;AAAA,IACH,SAAS;AAAA,EACV;AAAA,EACA,CAAC,wBAAmB;AAAA,IACnB,GAAG;AAAA,IACH,SAAS;AAAA,EACV;AAAA,EACA,CAAC,wBAAmB;AAAA,IACnB,GAAG;AAAA,IACH,SAAS;AAAA,EACV;AACD;AAEO,IAAM,qBAA+C;AAAA,EAC3D,MAAM;AAAA,EACN,OAAO;AACR;;;AC3DA,IAAM,SAAS,oBAAI,IAAI;AAAA,EACtB,CAAC,cAAc,IAAI,GAAG;AAAA,EACtB,CAAC,eAAe,IAAI,GAAG;AAAA,EACvB,CAAC,MAAM,IAAI,GAAG;AAAA,EAEd,CAAC,eAAe,CAAC;AAAA,EACjB,CAAC,gBAAgB,CAAC;AAAA,EAClB,CAAC,MAAM,CAAC;AAAA,EAER,CAAC,UAAU,GAAI;AAAA,EACf,CAAC,WAAW,GAAI;AAAA,EAChB,CAAC,OAAO,GAAI;AAAA,EACZ,CAAC,QAAQ,GAAI;AAAA,EACb,CAAC,KAAK,GAAI;AAAA,EAEV,CAAC,UAAU,MAAO,EAAE;AAAA,EACpB,CAAC,WAAW,MAAO,EAAE;AAAA,EACrB,CAAC,OAAO,MAAO,EAAE;AAAA,EACjB,CAAC,QAAQ,MAAO,EAAE;AAAA,EAClB,CAAC,KAAK,MAAO,EAAE;AAAA,EAEf,CAAC,QAAQ,MAAO,KAAK,EAAE;AAAA,EACvB,CAAC,SAAS,MAAO,KAAK,EAAE;AAAA,EACxB,CAAC,MAAM,MAAO,KAAK,EAAE;AAAA,EACrB,CAAC,OAAO,MAAO,KAAK,EAAE;AAAA,EACtB,CAAC,KAAK,MAAO,KAAK,EAAE;AAAA,EAEpB,CAAC,OAAO,MAAO,KAAK,KAAK,EAAE;AAAA,EAC3B,CAAC,QAAQ,MAAO,KAAK,KAAK,EAAE;AAAA,EAC5B,CAAC,KAAK,MAAO,KAAK,KAAK,EAAE;AAAA,EAEzB,CAAC,QAAQ,MAAO,KAAK,KAAK,KAAK,CAAC;AAAA,EAChC,CAAC,SAAS,MAAO,KAAK,KAAK,KAAK,CAAC;AAAA,EACjC,CAAC,MAAM,MAAO,KAAK,KAAK,KAAK,CAAC;AAAA,EAC9B,CAAC,OAAO,MAAO,KAAK,KAAK,KAAK,CAAC;AAAA,EAC/B,CAAC,KAAK,MAAO,KAAK,KAAK,KAAK,CAAC;AAAA,EAE7B,CAAC,SAAS,MAAO,KAAK,KAAK,MAAM,SAAS,GAAG;AAAA,EAC7C,CAAC,UAAU,MAAO,KAAK,KAAK,MAAM,SAAS,GAAG;AAAA,EAC9C,CAAC,KAAK,MAAO,KAAK,KAAK,MAAM,SAAS,GAAG;AAAA,EACzC,CAAC,MAAM,MAAO,KAAK,KAAK,MAAM,SAAS,GAAG;AAAA,EAE1C,CAAC,QAAQ,MAAO,KAAK,KAAK,KAAK,MAAM;AAAA,EACrC,CAAC,SAAS,MAAO,KAAK,KAAK,KAAK,MAAM;AAAA,EACtC,CAAC,MAAM,MAAO,KAAK,KAAK,KAAK,MAAM;AAAA,EACnC,CAAC,OAAO,MAAO,KAAK,KAAK,KAAK,MAAM;AAAA,EACpC,CAAC,KAAK,MAAO,KAAK,KAAK,KAAK,MAAM;AACnC,CAAC;AAKM,IAAM,YAAN,MAAe;AAAA,EAUd,YAAY,SAAiB;AANpC,wBAAO;AAON,SAAK,SAAS,UAAS,MAAM,QAAQ,YAAY,CAAC;AAAA,EACnD;AAAA,EAKA,IAAW,UAAgB;AAC1B,WAAO,KAAK,SAAS,IAAI,KAAK,CAAC;AAAA,EAChC;AAAA,EAMO,SAAS,MAAkB;AACjC,WAAO,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,MAAM;AAAA,EAC7C;AAAA,EAqBA,OAAe,MAAM,SAAyB;AAC7C,QAAI,SAAS;AACb,QAAI,QAAQ;AAEZ,YAEE,QAAQ,UAAS,aAAa,EAAE,EAEhC,QAAQ,UAAS,WAAW,GAAG,EAE/B,QAAQ,UAAS,eAAe,CAAC,GAAG,GAAG,UAAU;AACjD,YAAM,QAAQ,OAAO,IAAI,KAAK;AAC9B,UAAI,UAAU,QAAW;AACxB,kBAAU,OAAO,CAAC,IAAI;AACtB,gBAAQ;AAAA,MACT;AACA,aAAO;AAAA,IACR,CAAC;AAEF,WAAO,QAAQ,SAAS;AAAA,EACzB;AACD;AArEO,IAAM,WAAN;AAAM;AAgCZ,cAhCY,UAgCY,iBAAgB;AAKxC,cArCY,UAqCY,eAAc;AAKtC,cA1CY,UA0CY,aAAY;;;ACzFrC,IAAM,iBAAiD;AAAA,EACtD,oBAAiB,OAAW;AAAA,EAE5B,sBAAkB,MAAU;AAAA,EAC5B,oBAAiB,MAAO,KAAK,KAAK,KAAK,CAAC;AAAA,EACxC,kBAAgB,MAAO,KAAK,KAAK,EAAE;AAAA,EACnC,oBAAiB,MAAO,KAAK,EAAE;AAAA,EAC/B,wBAAmB,MAAO,EAAE;AAAA,EAC5B,wBAAmB,GAAI;AACxB;AAOO,IAAM,oBAAN,MAAwB;AAAA,EACvB,YAAmB,QAAkC,eAAe;AAAjD;AAAA,EAAkD;AAAA,EAErE,OACN,UACA,YAAY,GACZ;AAAA,IACC,MAAM,gBAAgB,mBAAmB;AAAA,IACzC,OAAO,iBAAiB,mBAAmB;AAAA,EAC5C,IAA8B,oBAC7B;AACD,UAAM,SAAmB,CAAC;AAC1B,UAAM,WAAW,WAAW;AAC5B,QAAI;AAAU,kBAAY;AAE1B,eAAW,CAAC,MAAM,YAAY,KAAK,gBAAgB;AAClD,YAAM,WAAW,WAAW;AAC5B,UAAI,WAAW;AAAG;AAElB,YAAM,UAAU,KAAK,MAAM,QAAQ;AACnC,kBAAY,UAAU;AACtB,aAAO,KAAK,QAAQ,SAAS,KAAK,MAAM,OAAO,aAAc,CAAC;AAG9D,UAAI,OAAO,UAAU;AAAW;AAAA,IACjC;AAEA,WAAO,GAAG,WAAW,MAAM,KAAK,OAAO,KAAK,cAAc,KAAK,QAAQ,GAAG,KAAK,MAAM,QAAQ,aAAc;AAAA,EAC5G;AACD;AA7Ba;AAoCb,SAAS,QAAQ,MAAc,MAAgC,WAAmB;AACjF,MAAI,QAAQ,IAAI,MAAM,IAAI;AAAG,WAAO,GAAG,OAAO,YAAY,QAAQ,IAAI,MAAM,IAAI;AAChF,SAAO,GAAG,OAAO,YAAY,KAAK;AACnC;AAHS","sourcesContent":["import type { DurationFormatAssetsTime, DurationFormatSeparators } from './DurationFormatter';\n\nexport enum Time {\n\tMillisecond = 1,\n\tSecond = 1000,\n\tMinute = 1000 * 60,\n\tHour = 1000 * 60 * 60,\n\tDay = 1000 * 60 * 60 * 24,\n\tMonth = 1000 * 60 * 60 * 24 * (365 / 12),\n\tYear = 1000 * 60 * 60 * 24 * 365\n}\n\n/**\n * The supported time types\n */\nexport enum TimeTypes {\n\tSecond = 'second',\n\tMinute = 'minute',\n\tHour = 'hour',\n\tDay = 'day',\n\tWeek = 'week',\n\tMonth = 'month',\n\tYear = 'year'\n}\n\nexport const DEFAULT_UNITS: DurationFormatAssetsTime = {\n\t[TimeTypes.Year]: {\n\t\t1: 'year',\n\t\tDEFAULT: 'years'\n\t},\n\t[TimeTypes.Month]: {\n\t\t1: 'month',\n\t\tDEFAULT: 'months'\n\t},\n\t[TimeTypes.Week]: {\n\t\t1: 'week',\n\t\tDEFAULT: 'weeks'\n\t},\n\t[TimeTypes.Day]: {\n\t\t1: 'day',\n\t\tDEFAULT: 'days'\n\t},\n\t[TimeTypes.Hour]: {\n\t\t1: 'hour',\n\t\tDEFAULT: 'hours'\n\t},\n\t[TimeTypes.Minute]: {\n\t\t1: 'minute',\n\t\tDEFAULT: 'minutes'\n\t},\n\t[TimeTypes.Second]: {\n\t\t1: 'second',\n\t\tDEFAULT: 'seconds'\n\t}\n};\n\nexport const DEFAULT_SEPARATORS: DurationFormatSeparators = {\n\tleft: ' ',\n\tright: ' '\n};\n","const tokens = new Map([\n\t['nanosecond', 1 / 1e6],\n\t['nanoseconds', 1 / 1e6],\n\t['ns', 1 / 1e6],\n\n\t['millisecond', 1],\n\t['milliseconds', 1],\n\t['ms', 1],\n\n\t['second', 1000],\n\t['seconds', 1000],\n\t['sec', 1000],\n\t['secs', 1000],\n\t['s', 1000],\n\n\t['minute', 1000 * 60],\n\t['minutes', 1000 * 60],\n\t['min', 1000 * 60],\n\t['mins', 1000 * 60],\n\t['m', 1000 * 60],\n\n\t['hour', 1000 * 60 * 60],\n\t['hours', 1000 * 60 * 60],\n\t['hr', 1000 * 60 * 60],\n\t['hrs', 1000 * 60 * 60],\n\t['h', 1000 * 60 * 60],\n\n\t['day', 1000 * 60 * 60 * 24],\n\t['days', 1000 * 60 * 60 * 24],\n\t['d', 1000 * 60 * 60 * 24],\n\n\t['week', 1000 * 60 * 60 * 24 * 7],\n\t['weeks', 1000 * 60 * 60 * 24 * 7],\n\t['wk', 1000 * 60 * 60 * 24 * 7],\n\t['wks', 1000 * 60 * 60 * 24 * 7],\n\t['w', 1000 * 60 * 60 * 24 * 7],\n\n\t['month', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['months', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['b', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['mo', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\n\t['year', 1000 * 60 * 60 * 24 * 365.25],\n\t['years', 1000 * 60 * 60 * 24 * 365.25],\n\t['yr', 1000 * 60 * 60 * 24 * 365.25],\n\t['yrs', 1000 * 60 * 60 * 24 * 365.25],\n\t['y', 1000 * 60 * 60 * 24 * 365.25]\n]);\n\n/**\n * Converts duration strings into ms and future dates\n */\nexport class Duration {\n\t/**\n\t * The offset\n\t */\n\tpublic offset: number;\n\n\t/**\n\t * Create a new Duration instance\n\t * @param pattern The string to parse\n\t */\n\tpublic constructor(pattern: string) {\n\t\tthis.offset = Duration.parse(pattern.toLowerCase());\n\t}\n\n\t/**\n\t * Get the date from now\n\t */\n\tpublic get fromNow(): Date {\n\t\treturn this.dateFrom(new Date());\n\t}\n\n\t/**\n\t * Get the date from\n\t * @param date The Date instance to get the date from\n\t */\n\tpublic dateFrom(date: Date): Date {\n\t\treturn new Date(date.getTime() + this.offset);\n\t}\n\n\t/**\n\t * The RegExp used for the pattern parsing\n\t */\n\tprivate static readonly kPatternRegex = /(-?\\d*\\.?\\d+(?:e[-+]?\\d+)?)\\s*([a-zμ]*)/gi;\n\n\t/**\n\t * The RegExp used for removing commas\n\t */\n\tprivate static readonly kCommaRegex = /,/g;\n\n\t/**\n\t * The RegExp used for replacing a/an with 1\n\t */\n\tprivate static readonly kAanRegex = /\\ban?\\b/gi;\n\n\t/**\n\t * Parse the pattern\n\t * @param pattern The pattern to parse\n\t */\n\tprivate static parse(pattern: string): number {\n\t\tlet result = 0;\n\t\tlet valid = false;\n\n\t\tpattern\n\t\t\t// ignore commas\n\t\t\t.replace(Duration.kCommaRegex, '')\n\t\t\t// a / an = 1\n\t\t\t.replace(Duration.kAanRegex, '1')\n\t\t\t// do math\n\t\t\t.replace(Duration.kPatternRegex, (_, i, units) => {\n\t\t\t\tconst token = tokens.get(units);\n\t\t\t\tif (token !== undefined) {\n\t\t\t\t\tresult += Number(i) * token;\n\t\t\t\t\tvalid = true;\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t});\n\n\t\treturn valid ? result : NaN;\n\t}\n}\n","import { DEFAULT_SEPARATORS, DEFAULT_UNITS, TimeTypes } from './constants';\n\n/**\n * The duration of each time type in milliseconds\n */\nconst kTimeDurations: readonly [TimeTypes, number][] = [\n\t[TimeTypes.Year, 31536000000],\n\t// 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month\n\t[TimeTypes.Month, 2628000000],\n\t[TimeTypes.Week, 1000 * 60 * 60 * 24 * 7],\n\t[TimeTypes.Day, 1000 * 60 * 60 * 24],\n\t[TimeTypes.Hour, 1000 * 60 * 60],\n\t[TimeTypes.Minute, 1000 * 60],\n\t[TimeTypes.Second, 1000]\n];\n\n/**\n * Display the duration\n * @param duration The duration in milliseconds to parse and display\n * @param assets The language assets\n */\nexport class DurationFormatter {\n\tpublic constructor(public units: DurationFormatAssetsTime = DEFAULT_UNITS) {}\n\n\tpublic format(\n\t\tduration: number,\n\t\tprecision = 7,\n\t\t{\n\t\t\tleft: leftSeparator = DEFAULT_SEPARATORS.left,\n\t\t\tright: rightSeparator = DEFAULT_SEPARATORS.right\n\t\t}: DurationFormatSeparators = DEFAULT_SEPARATORS\n\t) {\n\t\tconst output: string[] = [];\n\t\tconst negative = duration < 0;\n\t\tif (negative) duration *= -1;\n\n\t\tfor (const [type, timeDuration] of kTimeDurations) {\n\t\t\tconst division = duration / timeDuration;\n\t\t\tif (division < 1) continue;\n\n\t\t\tconst floored = Math.floor(division);\n\t\t\tduration -= floored * timeDuration;\n\t\t\toutput.push(addUnit(floored, this.units[type], leftSeparator!));\n\n\t\t\t// If the output has enough precision, break\n\t\t\tif (output.length >= precision) break;\n\t\t}\n\n\t\treturn `${negative ? '-' : ''}${output.join(rightSeparator) || addUnit(0, this.units.second, leftSeparator!)}`;\n\t}\n}\n\n/**\n * Adds an unit, if non zero\n * @param time The duration of said unit\n * @param unit The unit language assets\n */\nfunction addUnit(time: number, unit: DurationFormatAssetsUnit, separator: string) {\n\tif (Reflect.has(unit, time)) return `${time}${separator}${Reflect.get(unit, time)}`;\n\treturn `${time}${separator}${unit.DEFAULT}`;\n}\n\nexport interface DurationFormatSeparators {\n\tleft?: string;\n\tright?: string;\n}\n\nexport interface DurationFormatAssetsUnit extends Record<number, string> {\n\tDEFAULT: string;\n}\n\nexport interface DurationFormatAssetsTime {\n\t[TimeTypes.Second]: DurationFormatAssetsUnit;\n\t[TimeTypes.Minute]: DurationFormatAssetsUnit;\n\t[TimeTypes.Hour]: DurationFormatAssetsUnit;\n\t[TimeTypes.Day]: DurationFormatAssetsUnit;\n\t[TimeTypes.Week]: DurationFormatAssetsUnit;\n\t[TimeTypes.Month]: DurationFormatAssetsUnit;\n\t[TimeTypes.Year]: DurationFormatAssetsUnit;\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/constants.ts","../src/lib/Duration.ts","../src/lib/DurationFormatter.ts"],"names":["Time","TimeTypes"],"mappings":"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","sourcesContent":["import type { DurationFormatAssetsTime, DurationFormatSeparators } from './DurationFormatter';\n\nexport enum Time {\n\tNanosecond = 1 / 1_000_000,\n\tMicrosecond = 1 / 1000,\n\tMillisecond = 1,\n\tSecond = 1000,\n\tMinute = Second * 60,\n\tHour = Minute * 60,\n\tDay = Hour * 24,\n\tWeek = Day * 7,\n\tMonth = Day * (365 / 12),\n\tYear = Day * 365\n}\n\n/**\n * The supported time types\n */\nexport enum TimeTypes {\n\tSecond = 'second',\n\tMinute = 'minute',\n\tHour = 'hour',\n\tDay = 'day',\n\tWeek = 'week',\n\tMonth = 'month',\n\tYear = 'year'\n}\n\nexport const DEFAULT_UNITS: DurationFormatAssetsTime = {\n\t[TimeTypes.Year]: {\n\t\t1: 'year',\n\t\tDEFAULT: 'years'\n\t},\n\t[TimeTypes.Month]: {\n\t\t1: 'month',\n\t\tDEFAULT: 'months'\n\t},\n\t[TimeTypes.Week]: {\n\t\t1: 'week',\n\t\tDEFAULT: 'weeks'\n\t},\n\t[TimeTypes.Day]: {\n\t\t1: 'day',\n\t\tDEFAULT: 'days'\n\t},\n\t[TimeTypes.Hour]: {\n\t\t1: 'hour',\n\t\tDEFAULT: 'hours'\n\t},\n\t[TimeTypes.Minute]: {\n\t\t1: 'minute',\n\t\tDEFAULT: 'minutes'\n\t},\n\t[TimeTypes.Second]: {\n\t\t1: 'second',\n\t\tDEFAULT: 'seconds'\n\t}\n};\n\nexport const DEFAULT_SEPARATORS: DurationFormatSeparators = {\n\tleft: ' ',\n\tright: ' '\n};\n","const tokens = new Map([\n\t['nanosecond', 1 / 1e6],\n\t['nanoseconds', 1 / 1e6],\n\t['ns', 1 / 1e6],\n\n\t['millisecond', 1],\n\t['milliseconds', 1],\n\t['ms', 1],\n\n\t['second', 1000],\n\t['seconds', 1000],\n\t['sec', 1000],\n\t['secs', 1000],\n\t['s', 1000],\n\n\t['minute', 1000 * 60],\n\t['minutes', 1000 * 60],\n\t['min', 1000 * 60],\n\t['mins', 1000 * 60],\n\t['m', 1000 * 60],\n\n\t['hour', 1000 * 60 * 60],\n\t['hours', 1000 * 60 * 60],\n\t['hr', 1000 * 60 * 60],\n\t['hrs', 1000 * 60 * 60],\n\t['h', 1000 * 60 * 60],\n\n\t['day', 1000 * 60 * 60 * 24],\n\t['days', 1000 * 60 * 60 * 24],\n\t['d', 1000 * 60 * 60 * 24],\n\n\t['week', 1000 * 60 * 60 * 24 * 7],\n\t['weeks', 1000 * 60 * 60 * 24 * 7],\n\t['wk', 1000 * 60 * 60 * 24 * 7],\n\t['wks', 1000 * 60 * 60 * 24 * 7],\n\t['w', 1000 * 60 * 60 * 24 * 7],\n\n\t['month', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['months', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['b', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['mo', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\n\t['year', 1000 * 60 * 60 * 24 * 365.25],\n\t['years', 1000 * 60 * 60 * 24 * 365.25],\n\t['yr', 1000 * 60 * 60 * 24 * 365.25],\n\t['yrs', 1000 * 60 * 60 * 24 * 365.25],\n\t['y', 1000 * 60 * 60 * 24 * 365.25]\n]);\n\n/**\n * Converts duration strings into ms and future dates\n */\nexport class Duration {\n\t/**\n\t * The offset\n\t */\n\tpublic offset: number;\n\n\t/**\n\t * Create a new Duration instance\n\t * @param pattern The string to parse\n\t */\n\tpublic constructor(pattern: string) {\n\t\tthis.offset = Duration.parse(pattern.toLowerCase());\n\t}\n\n\t/**\n\t * Get the date from now\n\t */\n\tpublic get fromNow(): Date {\n\t\treturn this.dateFrom(new Date());\n\t}\n\n\t/**\n\t * Get the date from\n\t * @param date The Date instance to get the date from\n\t */\n\tpublic dateFrom(date: Date): Date {\n\t\treturn new Date(date.getTime() + this.offset);\n\t}\n\n\t/**\n\t * The RegExp used for the pattern parsing\n\t */\n\tprivate static readonly kPatternRegex = /(-?\\d*\\.?\\d+(?:e[-+]?\\d+)?)\\s*([a-zμ]*)/gi;\n\n\t/**\n\t * The RegExp used for removing commas\n\t */\n\tprivate static readonly kCommaRegex = /,/g;\n\n\t/**\n\t * The RegExp used for replacing a/an with 1\n\t */\n\tprivate static readonly kAanRegex = /\\ban?\\b/gi;\n\n\t/**\n\t * Parse the pattern\n\t * @param pattern The pattern to parse\n\t */\n\tprivate static parse(pattern: string): number {\n\t\tlet result = 0;\n\t\tlet valid = false;\n\n\t\tpattern\n\t\t\t// ignore commas\n\t\t\t.replace(Duration.kCommaRegex, '')\n\t\t\t// a / an = 1\n\t\t\t.replace(Duration.kAanRegex, '1')\n\t\t\t// do math\n\t\t\t.replace(Duration.kPatternRegex, (_, i, units) => {\n\t\t\t\tconst token = tokens.get(units);\n\t\t\t\tif (token !== undefined) {\n\t\t\t\t\tresult += Number(i) * token;\n\t\t\t\t\tvalid = true;\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t});\n\n\t\treturn valid ? result : NaN;\n\t}\n}\n","import { DEFAULT_SEPARATORS, DEFAULT_UNITS, TimeTypes } from './constants';\n\n/**\n * The duration of each time type in milliseconds\n */\nconst kTimeDurations: readonly [TimeTypes, number][] = [\n\t[TimeTypes.Year, 31536000000],\n\t// 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month\n\t[TimeTypes.Month, 2628000000],\n\t[TimeTypes.Week, 1000 * 60 * 60 * 24 * 7],\n\t[TimeTypes.Day, 1000 * 60 * 60 * 24],\n\t[TimeTypes.Hour, 1000 * 60 * 60],\n\t[TimeTypes.Minute, 1000 * 60],\n\t[TimeTypes.Second, 1000]\n];\n\n/**\n * Display the duration\n * @param duration The duration in milliseconds to parse and display\n * @param assets The language assets\n */\nexport class DurationFormatter {\n\tpublic constructor(public units: DurationFormatAssetsTime = DEFAULT_UNITS) {}\n\n\tpublic format(\n\t\tduration: number,\n\t\tprecision = 7,\n\t\t{\n\t\t\tleft: leftSeparator = DEFAULT_SEPARATORS.left,\n\t\t\tright: rightSeparator = DEFAULT_SEPARATORS.right\n\t\t}: DurationFormatSeparators = DEFAULT_SEPARATORS\n\t) {\n\t\tconst output: string[] = [];\n\t\tconst negative = duration < 0;\n\t\tif (negative) duration *= -1;\n\n\t\tfor (const [type, timeDuration] of kTimeDurations) {\n\t\t\tconst division = duration / timeDuration;\n\t\t\tif (division < 1) continue;\n\n\t\t\tconst floored = Math.floor(division);\n\t\t\tduration -= floored * timeDuration;\n\t\t\toutput.push(addUnit(floored, this.units[type], leftSeparator!));\n\n\t\t\t// If the output has enough precision, break\n\t\t\tif (output.length >= precision) break;\n\t\t}\n\n\t\treturn `${negative ? '-' : ''}${output.join(rightSeparator) || addUnit(0, this.units.second, leftSeparator!)}`;\n\t}\n}\n\n/**\n * Adds an unit, if non zero\n * @param time The duration of said unit\n * @param unit The unit language assets\n */\nfunction addUnit(time: number, unit: DurationFormatAssetsUnit, separator: string) {\n\tif (Reflect.has(unit, time)) return `${time}${separator}${Reflect.get(unit, time)}`;\n\treturn `${time}${separator}${unit.DEFAULT}`;\n}\n\nexport interface DurationFormatSeparators {\n\tleft?: string;\n\tright?: string;\n}\n\nexport interface DurationFormatAssetsUnit extends Record<number, string> {\n\tDEFAULT: string;\n}\n\nexport interface DurationFormatAssetsTime {\n\t[TimeTypes.Second]: DurationFormatAssetsUnit;\n\t[TimeTypes.Minute]: DurationFormatAssetsUnit;\n\t[TimeTypes.Hour]: DurationFormatAssetsUnit;\n\t[TimeTypes.Day]: DurationFormatAssetsUnit;\n\t[TimeTypes.Week]: DurationFormatAssetsUnit;\n\t[TimeTypes.Month]: DurationFormatAssetsUnit;\n\t[TimeTypes.Year]: DurationFormatAssetsUnit;\n}\n"]}
package/dist/index.js CHANGED
@@ -10,11 +10,14 @@ var __publicField = (obj, key, value) => {
10
10
 
11
11
  // src/lib/constants.ts
12
12
  var Time = /* @__PURE__ */ ((Time2) => {
13
+ Time2[Time2["Nanosecond"] = 1e-6] = "Nanosecond";
14
+ Time2[Time2["Microsecond"] = 1e-3] = "Microsecond";
13
15
  Time2[Time2["Millisecond"] = 1] = "Millisecond";
14
16
  Time2[Time2["Second"] = 1e3] = "Second";
15
17
  Time2[Time2["Minute"] = 6e4] = "Minute";
16
18
  Time2[Time2["Hour"] = 36e5] = "Hour";
17
19
  Time2[Time2["Day"] = 864e5] = "Day";
20
+ Time2[Time2["Week"] = 6048e5] = "Week";
18
21
  Time2[Time2["Month"] = 2628e6] = "Month";
19
22
  Time2[Time2["Year"] = 31536e6] = "Year";
20
23
  return Time2;
@@ -106,16 +109,34 @@ var tokens = /* @__PURE__ */ new Map([
106
109
  ["y", 1e3 * 60 * 60 * 24 * 365.25]
107
110
  ]);
108
111
  var _Duration = class {
112
+ /**
113
+ * Create a new Duration instance
114
+ * @param pattern The string to parse
115
+ */
109
116
  constructor(pattern) {
117
+ /**
118
+ * The offset
119
+ */
110
120
  __publicField(this, "offset");
111
121
  this.offset = _Duration.parse(pattern.toLowerCase());
112
122
  }
123
+ /**
124
+ * Get the date from now
125
+ */
113
126
  get fromNow() {
114
- return this.dateFrom(new Date());
127
+ return this.dateFrom(/* @__PURE__ */ new Date());
115
128
  }
129
+ /**
130
+ * Get the date from
131
+ * @param date The Date instance to get the date from
132
+ */
116
133
  dateFrom(date) {
117
134
  return new Date(date.getTime() + this.offset);
118
135
  }
136
+ /**
137
+ * Parse the pattern
138
+ * @param pattern The pattern to parse
139
+ */
119
140
  static parse(pattern) {
120
141
  let result = 0;
121
142
  let valid = false;
@@ -132,13 +153,23 @@ var _Duration = class {
132
153
  };
133
154
  var Duration = _Duration;
134
155
  __name(Duration, "Duration");
156
+ /**
157
+ * The RegExp used for the pattern parsing
158
+ */
135
159
  __publicField(Duration, "kPatternRegex", /(-?\d*\.?\d+(?:e[-+]?\d+)?)\s*([a-zμ]*)/gi);
160
+ /**
161
+ * The RegExp used for removing commas
162
+ */
136
163
  __publicField(Duration, "kCommaRegex", /,/g);
164
+ /**
165
+ * The RegExp used for replacing a/an with 1
166
+ */
137
167
  __publicField(Duration, "kAanRegex", /\ban?\b/gi);
138
168
 
139
169
  // src/lib/DurationFormatter.ts
140
170
  var kTimeDurations = [
141
171
  ["year" /* Year */, 31536e6],
172
+ // 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month
142
173
  ["month" /* Month */, 2628e6],
143
174
  ["week" /* Week */, 1e3 * 60 * 60 * 24 * 7],
144
175
  ["day" /* Day */, 1e3 * 60 * 60 * 24],
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/constants.ts","../src/lib/Duration.ts","../src/lib/DurationFormatter.ts"],"names":["Time","TimeTypes"],"mappings":"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","sourcesContent":["import type { DurationFormatAssetsTime, DurationFormatSeparators } from './DurationFormatter';\n\nexport enum Time {\n\tMillisecond = 1,\n\tSecond = 1000,\n\tMinute = 1000 * 60,\n\tHour = 1000 * 60 * 60,\n\tDay = 1000 * 60 * 60 * 24,\n\tMonth = 1000 * 60 * 60 * 24 * (365 / 12),\n\tYear = 1000 * 60 * 60 * 24 * 365\n}\n\n/**\n * The supported time types\n */\nexport enum TimeTypes {\n\tSecond = 'second',\n\tMinute = 'minute',\n\tHour = 'hour',\n\tDay = 'day',\n\tWeek = 'week',\n\tMonth = 'month',\n\tYear = 'year'\n}\n\nexport const DEFAULT_UNITS: DurationFormatAssetsTime = {\n\t[TimeTypes.Year]: {\n\t\t1: 'year',\n\t\tDEFAULT: 'years'\n\t},\n\t[TimeTypes.Month]: {\n\t\t1: 'month',\n\t\tDEFAULT: 'months'\n\t},\n\t[TimeTypes.Week]: {\n\t\t1: 'week',\n\t\tDEFAULT: 'weeks'\n\t},\n\t[TimeTypes.Day]: {\n\t\t1: 'day',\n\t\tDEFAULT: 'days'\n\t},\n\t[TimeTypes.Hour]: {\n\t\t1: 'hour',\n\t\tDEFAULT: 'hours'\n\t},\n\t[TimeTypes.Minute]: {\n\t\t1: 'minute',\n\t\tDEFAULT: 'minutes'\n\t},\n\t[TimeTypes.Second]: {\n\t\t1: 'second',\n\t\tDEFAULT: 'seconds'\n\t}\n};\n\nexport const DEFAULT_SEPARATORS: DurationFormatSeparators = {\n\tleft: ' ',\n\tright: ' '\n};\n","const tokens = new Map([\n\t['nanosecond', 1 / 1e6],\n\t['nanoseconds', 1 / 1e6],\n\t['ns', 1 / 1e6],\n\n\t['millisecond', 1],\n\t['milliseconds', 1],\n\t['ms', 1],\n\n\t['second', 1000],\n\t['seconds', 1000],\n\t['sec', 1000],\n\t['secs', 1000],\n\t['s', 1000],\n\n\t['minute', 1000 * 60],\n\t['minutes', 1000 * 60],\n\t['min', 1000 * 60],\n\t['mins', 1000 * 60],\n\t['m', 1000 * 60],\n\n\t['hour', 1000 * 60 * 60],\n\t['hours', 1000 * 60 * 60],\n\t['hr', 1000 * 60 * 60],\n\t['hrs', 1000 * 60 * 60],\n\t['h', 1000 * 60 * 60],\n\n\t['day', 1000 * 60 * 60 * 24],\n\t['days', 1000 * 60 * 60 * 24],\n\t['d', 1000 * 60 * 60 * 24],\n\n\t['week', 1000 * 60 * 60 * 24 * 7],\n\t['weeks', 1000 * 60 * 60 * 24 * 7],\n\t['wk', 1000 * 60 * 60 * 24 * 7],\n\t['wks', 1000 * 60 * 60 * 24 * 7],\n\t['w', 1000 * 60 * 60 * 24 * 7],\n\n\t['month', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['months', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['b', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['mo', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\n\t['year', 1000 * 60 * 60 * 24 * 365.25],\n\t['years', 1000 * 60 * 60 * 24 * 365.25],\n\t['yr', 1000 * 60 * 60 * 24 * 365.25],\n\t['yrs', 1000 * 60 * 60 * 24 * 365.25],\n\t['y', 1000 * 60 * 60 * 24 * 365.25]\n]);\n\n/**\n * Converts duration strings into ms and future dates\n */\nexport class Duration {\n\t/**\n\t * The offset\n\t */\n\tpublic offset: number;\n\n\t/**\n\t * Create a new Duration instance\n\t * @param pattern The string to parse\n\t */\n\tpublic constructor(pattern: string) {\n\t\tthis.offset = Duration.parse(pattern.toLowerCase());\n\t}\n\n\t/**\n\t * Get the date from now\n\t */\n\tpublic get fromNow(): Date {\n\t\treturn this.dateFrom(new Date());\n\t}\n\n\t/**\n\t * Get the date from\n\t * @param date The Date instance to get the date from\n\t */\n\tpublic dateFrom(date: Date): Date {\n\t\treturn new Date(date.getTime() + this.offset);\n\t}\n\n\t/**\n\t * The RegExp used for the pattern parsing\n\t */\n\tprivate static readonly kPatternRegex = /(-?\\d*\\.?\\d+(?:e[-+]?\\d+)?)\\s*([a-zμ]*)/gi;\n\n\t/**\n\t * The RegExp used for removing commas\n\t */\n\tprivate static readonly kCommaRegex = /,/g;\n\n\t/**\n\t * The RegExp used for replacing a/an with 1\n\t */\n\tprivate static readonly kAanRegex = /\\ban?\\b/gi;\n\n\t/**\n\t * Parse the pattern\n\t * @param pattern The pattern to parse\n\t */\n\tprivate static parse(pattern: string): number {\n\t\tlet result = 0;\n\t\tlet valid = false;\n\n\t\tpattern\n\t\t\t// ignore commas\n\t\t\t.replace(Duration.kCommaRegex, '')\n\t\t\t// a / an = 1\n\t\t\t.replace(Duration.kAanRegex, '1')\n\t\t\t// do math\n\t\t\t.replace(Duration.kPatternRegex, (_, i, units) => {\n\t\t\t\tconst token = tokens.get(units);\n\t\t\t\tif (token !== undefined) {\n\t\t\t\t\tresult += Number(i) * token;\n\t\t\t\t\tvalid = true;\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t});\n\n\t\treturn valid ? result : NaN;\n\t}\n}\n","import { DEFAULT_SEPARATORS, DEFAULT_UNITS, TimeTypes } from './constants';\n\n/**\n * The duration of each time type in milliseconds\n */\nconst kTimeDurations: readonly [TimeTypes, number][] = [\n\t[TimeTypes.Year, 31536000000],\n\t// 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month\n\t[TimeTypes.Month, 2628000000],\n\t[TimeTypes.Week, 1000 * 60 * 60 * 24 * 7],\n\t[TimeTypes.Day, 1000 * 60 * 60 * 24],\n\t[TimeTypes.Hour, 1000 * 60 * 60],\n\t[TimeTypes.Minute, 1000 * 60],\n\t[TimeTypes.Second, 1000]\n];\n\n/**\n * Display the duration\n * @param duration The duration in milliseconds to parse and display\n * @param assets The language assets\n */\nexport class DurationFormatter {\n\tpublic constructor(public units: DurationFormatAssetsTime = DEFAULT_UNITS) {}\n\n\tpublic format(\n\t\tduration: number,\n\t\tprecision = 7,\n\t\t{\n\t\t\tleft: leftSeparator = DEFAULT_SEPARATORS.left,\n\t\t\tright: rightSeparator = DEFAULT_SEPARATORS.right\n\t\t}: DurationFormatSeparators = DEFAULT_SEPARATORS\n\t) {\n\t\tconst output: string[] = [];\n\t\tconst negative = duration < 0;\n\t\tif (negative) duration *= -1;\n\n\t\tfor (const [type, timeDuration] of kTimeDurations) {\n\t\t\tconst division = duration / timeDuration;\n\t\t\tif (division < 1) continue;\n\n\t\t\tconst floored = Math.floor(division);\n\t\t\tduration -= floored * timeDuration;\n\t\t\toutput.push(addUnit(floored, this.units[type], leftSeparator!));\n\n\t\t\t// If the output has enough precision, break\n\t\t\tif (output.length >= precision) break;\n\t\t}\n\n\t\treturn `${negative ? '-' : ''}${output.join(rightSeparator) || addUnit(0, this.units.second, leftSeparator!)}`;\n\t}\n}\n\n/**\n * Adds an unit, if non zero\n * @param time The duration of said unit\n * @param unit The unit language assets\n */\nfunction addUnit(time: number, unit: DurationFormatAssetsUnit, separator: string) {\n\tif (Reflect.has(unit, time)) return `${time}${separator}${Reflect.get(unit, time)}`;\n\treturn `${time}${separator}${unit.DEFAULT}`;\n}\n\nexport interface DurationFormatSeparators {\n\tleft?: string;\n\tright?: string;\n}\n\nexport interface DurationFormatAssetsUnit extends Record<number, string> {\n\tDEFAULT: string;\n}\n\nexport interface DurationFormatAssetsTime {\n\t[TimeTypes.Second]: DurationFormatAssetsUnit;\n\t[TimeTypes.Minute]: DurationFormatAssetsUnit;\n\t[TimeTypes.Hour]: DurationFormatAssetsUnit;\n\t[TimeTypes.Day]: DurationFormatAssetsUnit;\n\t[TimeTypes.Week]: DurationFormatAssetsUnit;\n\t[TimeTypes.Month]: DurationFormatAssetsUnit;\n\t[TimeTypes.Year]: DurationFormatAssetsUnit;\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/constants.ts","../src/lib/Duration.ts","../src/lib/DurationFormatter.ts"],"names":["Time","TimeTypes"],"mappings":"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","sourcesContent":["import type { DurationFormatAssetsTime, DurationFormatSeparators } from './DurationFormatter';\n\nexport enum Time {\n\tNanosecond = 1 / 1_000_000,\n\tMicrosecond = 1 / 1000,\n\tMillisecond = 1,\n\tSecond = 1000,\n\tMinute = Second * 60,\n\tHour = Minute * 60,\n\tDay = Hour * 24,\n\tWeek = Day * 7,\n\tMonth = Day * (365 / 12),\n\tYear = Day * 365\n}\n\n/**\n * The supported time types\n */\nexport enum TimeTypes {\n\tSecond = 'second',\n\tMinute = 'minute',\n\tHour = 'hour',\n\tDay = 'day',\n\tWeek = 'week',\n\tMonth = 'month',\n\tYear = 'year'\n}\n\nexport const DEFAULT_UNITS: DurationFormatAssetsTime = {\n\t[TimeTypes.Year]: {\n\t\t1: 'year',\n\t\tDEFAULT: 'years'\n\t},\n\t[TimeTypes.Month]: {\n\t\t1: 'month',\n\t\tDEFAULT: 'months'\n\t},\n\t[TimeTypes.Week]: {\n\t\t1: 'week',\n\t\tDEFAULT: 'weeks'\n\t},\n\t[TimeTypes.Day]: {\n\t\t1: 'day',\n\t\tDEFAULT: 'days'\n\t},\n\t[TimeTypes.Hour]: {\n\t\t1: 'hour',\n\t\tDEFAULT: 'hours'\n\t},\n\t[TimeTypes.Minute]: {\n\t\t1: 'minute',\n\t\tDEFAULT: 'minutes'\n\t},\n\t[TimeTypes.Second]: {\n\t\t1: 'second',\n\t\tDEFAULT: 'seconds'\n\t}\n};\n\nexport const DEFAULT_SEPARATORS: DurationFormatSeparators = {\n\tleft: ' ',\n\tright: ' '\n};\n","const tokens = new Map([\n\t['nanosecond', 1 / 1e6],\n\t['nanoseconds', 1 / 1e6],\n\t['ns', 1 / 1e6],\n\n\t['millisecond', 1],\n\t['milliseconds', 1],\n\t['ms', 1],\n\n\t['second', 1000],\n\t['seconds', 1000],\n\t['sec', 1000],\n\t['secs', 1000],\n\t['s', 1000],\n\n\t['minute', 1000 * 60],\n\t['minutes', 1000 * 60],\n\t['min', 1000 * 60],\n\t['mins', 1000 * 60],\n\t['m', 1000 * 60],\n\n\t['hour', 1000 * 60 * 60],\n\t['hours', 1000 * 60 * 60],\n\t['hr', 1000 * 60 * 60],\n\t['hrs', 1000 * 60 * 60],\n\t['h', 1000 * 60 * 60],\n\n\t['day', 1000 * 60 * 60 * 24],\n\t['days', 1000 * 60 * 60 * 24],\n\t['d', 1000 * 60 * 60 * 24],\n\n\t['week', 1000 * 60 * 60 * 24 * 7],\n\t['weeks', 1000 * 60 * 60 * 24 * 7],\n\t['wk', 1000 * 60 * 60 * 24 * 7],\n\t['wks', 1000 * 60 * 60 * 24 * 7],\n\t['w', 1000 * 60 * 60 * 24 * 7],\n\n\t['month', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['months', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['b', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['mo', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\n\t['year', 1000 * 60 * 60 * 24 * 365.25],\n\t['years', 1000 * 60 * 60 * 24 * 365.25],\n\t['yr', 1000 * 60 * 60 * 24 * 365.25],\n\t['yrs', 1000 * 60 * 60 * 24 * 365.25],\n\t['y', 1000 * 60 * 60 * 24 * 365.25]\n]);\n\n/**\n * Converts duration strings into ms and future dates\n */\nexport class Duration {\n\t/**\n\t * The offset\n\t */\n\tpublic offset: number;\n\n\t/**\n\t * Create a new Duration instance\n\t * @param pattern The string to parse\n\t */\n\tpublic constructor(pattern: string) {\n\t\tthis.offset = Duration.parse(pattern.toLowerCase());\n\t}\n\n\t/**\n\t * Get the date from now\n\t */\n\tpublic get fromNow(): Date {\n\t\treturn this.dateFrom(new Date());\n\t}\n\n\t/**\n\t * Get the date from\n\t * @param date The Date instance to get the date from\n\t */\n\tpublic dateFrom(date: Date): Date {\n\t\treturn new Date(date.getTime() + this.offset);\n\t}\n\n\t/**\n\t * The RegExp used for the pattern parsing\n\t */\n\tprivate static readonly kPatternRegex = /(-?\\d*\\.?\\d+(?:e[-+]?\\d+)?)\\s*([a-zμ]*)/gi;\n\n\t/**\n\t * The RegExp used for removing commas\n\t */\n\tprivate static readonly kCommaRegex = /,/g;\n\n\t/**\n\t * The RegExp used for replacing a/an with 1\n\t */\n\tprivate static readonly kAanRegex = /\\ban?\\b/gi;\n\n\t/**\n\t * Parse the pattern\n\t * @param pattern The pattern to parse\n\t */\n\tprivate static parse(pattern: string): number {\n\t\tlet result = 0;\n\t\tlet valid = false;\n\n\t\tpattern\n\t\t\t// ignore commas\n\t\t\t.replace(Duration.kCommaRegex, '')\n\t\t\t// a / an = 1\n\t\t\t.replace(Duration.kAanRegex, '1')\n\t\t\t// do math\n\t\t\t.replace(Duration.kPatternRegex, (_, i, units) => {\n\t\t\t\tconst token = tokens.get(units);\n\t\t\t\tif (token !== undefined) {\n\t\t\t\t\tresult += Number(i) * token;\n\t\t\t\t\tvalid = true;\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t});\n\n\t\treturn valid ? result : NaN;\n\t}\n}\n","import { DEFAULT_SEPARATORS, DEFAULT_UNITS, TimeTypes } from './constants';\n\n/**\n * The duration of each time type in milliseconds\n */\nconst kTimeDurations: readonly [TimeTypes, number][] = [\n\t[TimeTypes.Year, 31536000000],\n\t// 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month\n\t[TimeTypes.Month, 2628000000],\n\t[TimeTypes.Week, 1000 * 60 * 60 * 24 * 7],\n\t[TimeTypes.Day, 1000 * 60 * 60 * 24],\n\t[TimeTypes.Hour, 1000 * 60 * 60],\n\t[TimeTypes.Minute, 1000 * 60],\n\t[TimeTypes.Second, 1000]\n];\n\n/**\n * Display the duration\n * @param duration The duration in milliseconds to parse and display\n * @param assets The language assets\n */\nexport class DurationFormatter {\n\tpublic constructor(public units: DurationFormatAssetsTime = DEFAULT_UNITS) {}\n\n\tpublic format(\n\t\tduration: number,\n\t\tprecision = 7,\n\t\t{\n\t\t\tleft: leftSeparator = DEFAULT_SEPARATORS.left,\n\t\t\tright: rightSeparator = DEFAULT_SEPARATORS.right\n\t\t}: DurationFormatSeparators = DEFAULT_SEPARATORS\n\t) {\n\t\tconst output: string[] = [];\n\t\tconst negative = duration < 0;\n\t\tif (negative) duration *= -1;\n\n\t\tfor (const [type, timeDuration] of kTimeDurations) {\n\t\t\tconst division = duration / timeDuration;\n\t\t\tif (division < 1) continue;\n\n\t\t\tconst floored = Math.floor(division);\n\t\t\tduration -= floored * timeDuration;\n\t\t\toutput.push(addUnit(floored, this.units[type], leftSeparator!));\n\n\t\t\t// If the output has enough precision, break\n\t\t\tif (output.length >= precision) break;\n\t\t}\n\n\t\treturn `${negative ? '-' : ''}${output.join(rightSeparator) || addUnit(0, this.units.second, leftSeparator!)}`;\n\t}\n}\n\n/**\n * Adds an unit, if non zero\n * @param time The duration of said unit\n * @param unit The unit language assets\n */\nfunction addUnit(time: number, unit: DurationFormatAssetsUnit, separator: string) {\n\tif (Reflect.has(unit, time)) return `${time}${separator}${Reflect.get(unit, time)}`;\n\treturn `${time}${separator}${unit.DEFAULT}`;\n}\n\nexport interface DurationFormatSeparators {\n\tleft?: string;\n\tright?: string;\n}\n\nexport interface DurationFormatAssetsUnit extends Record<number, string> {\n\tDEFAULT: string;\n}\n\nexport interface DurationFormatAssetsTime {\n\t[TimeTypes.Second]: DurationFormatAssetsUnit;\n\t[TimeTypes.Minute]: DurationFormatAssetsUnit;\n\t[TimeTypes.Hour]: DurationFormatAssetsUnit;\n\t[TimeTypes.Day]: DurationFormatAssetsUnit;\n\t[TimeTypes.Week]: DurationFormatAssetsUnit;\n\t[TimeTypes.Month]: DurationFormatAssetsUnit;\n\t[TimeTypes.Year]: DurationFormatAssetsUnit;\n}\n"]}
package/dist/index.mjs CHANGED
@@ -8,11 +8,14 @@ var __publicField = (obj, key, value) => {
8
8
 
9
9
  // src/lib/constants.ts
10
10
  var Time = /* @__PURE__ */ ((Time2) => {
11
+ Time2[Time2["Nanosecond"] = 1e-6] = "Nanosecond";
12
+ Time2[Time2["Microsecond"] = 1e-3] = "Microsecond";
11
13
  Time2[Time2["Millisecond"] = 1] = "Millisecond";
12
14
  Time2[Time2["Second"] = 1e3] = "Second";
13
15
  Time2[Time2["Minute"] = 6e4] = "Minute";
14
16
  Time2[Time2["Hour"] = 36e5] = "Hour";
15
17
  Time2[Time2["Day"] = 864e5] = "Day";
18
+ Time2[Time2["Week"] = 6048e5] = "Week";
16
19
  Time2[Time2["Month"] = 2628e6] = "Month";
17
20
  Time2[Time2["Year"] = 31536e6] = "Year";
18
21
  return Time2;
@@ -104,16 +107,34 @@ var tokens = /* @__PURE__ */ new Map([
104
107
  ["y", 1e3 * 60 * 60 * 24 * 365.25]
105
108
  ]);
106
109
  var _Duration = class {
110
+ /**
111
+ * Create a new Duration instance
112
+ * @param pattern The string to parse
113
+ */
107
114
  constructor(pattern) {
115
+ /**
116
+ * The offset
117
+ */
108
118
  __publicField(this, "offset");
109
119
  this.offset = _Duration.parse(pattern.toLowerCase());
110
120
  }
121
+ /**
122
+ * Get the date from now
123
+ */
111
124
  get fromNow() {
112
- return this.dateFrom(new Date());
125
+ return this.dateFrom(/* @__PURE__ */ new Date());
113
126
  }
127
+ /**
128
+ * Get the date from
129
+ * @param date The Date instance to get the date from
130
+ */
114
131
  dateFrom(date) {
115
132
  return new Date(date.getTime() + this.offset);
116
133
  }
134
+ /**
135
+ * Parse the pattern
136
+ * @param pattern The pattern to parse
137
+ */
117
138
  static parse(pattern) {
118
139
  let result = 0;
119
140
  let valid = false;
@@ -130,13 +151,23 @@ var _Duration = class {
130
151
  };
131
152
  var Duration = _Duration;
132
153
  __name(Duration, "Duration");
154
+ /**
155
+ * The RegExp used for the pattern parsing
156
+ */
133
157
  __publicField(Duration, "kPatternRegex", /(-?\d*\.?\d+(?:e[-+]?\d+)?)\s*([a-zμ]*)/gi);
158
+ /**
159
+ * The RegExp used for removing commas
160
+ */
134
161
  __publicField(Duration, "kCommaRegex", /,/g);
162
+ /**
163
+ * The RegExp used for replacing a/an with 1
164
+ */
135
165
  __publicField(Duration, "kAanRegex", /\ban?\b/gi);
136
166
 
137
167
  // src/lib/DurationFormatter.ts
138
168
  var kTimeDurations = [
139
169
  ["year" /* Year */, 31536e6],
170
+ // 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month
140
171
  ["month" /* Month */, 2628e6],
141
172
  ["week" /* Week */, 1e3 * 60 * 60 * 24 * 7],
142
173
  ["day" /* Day */, 1e3 * 60 * 60 * 24],
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/constants.ts","../src/lib/Duration.ts","../src/lib/DurationFormatter.ts"],"names":["Time","TimeTypes"],"mappings":"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","sourcesContent":["import type { DurationFormatAssetsTime, DurationFormatSeparators } from './DurationFormatter';\n\nexport enum Time {\n\tMillisecond = 1,\n\tSecond = 1000,\n\tMinute = 1000 * 60,\n\tHour = 1000 * 60 * 60,\n\tDay = 1000 * 60 * 60 * 24,\n\tMonth = 1000 * 60 * 60 * 24 * (365 / 12),\n\tYear = 1000 * 60 * 60 * 24 * 365\n}\n\n/**\n * The supported time types\n */\nexport enum TimeTypes {\n\tSecond = 'second',\n\tMinute = 'minute',\n\tHour = 'hour',\n\tDay = 'day',\n\tWeek = 'week',\n\tMonth = 'month',\n\tYear = 'year'\n}\n\nexport const DEFAULT_UNITS: DurationFormatAssetsTime = {\n\t[TimeTypes.Year]: {\n\t\t1: 'year',\n\t\tDEFAULT: 'years'\n\t},\n\t[TimeTypes.Month]: {\n\t\t1: 'month',\n\t\tDEFAULT: 'months'\n\t},\n\t[TimeTypes.Week]: {\n\t\t1: 'week',\n\t\tDEFAULT: 'weeks'\n\t},\n\t[TimeTypes.Day]: {\n\t\t1: 'day',\n\t\tDEFAULT: 'days'\n\t},\n\t[TimeTypes.Hour]: {\n\t\t1: 'hour',\n\t\tDEFAULT: 'hours'\n\t},\n\t[TimeTypes.Minute]: {\n\t\t1: 'minute',\n\t\tDEFAULT: 'minutes'\n\t},\n\t[TimeTypes.Second]: {\n\t\t1: 'second',\n\t\tDEFAULT: 'seconds'\n\t}\n};\n\nexport const DEFAULT_SEPARATORS: DurationFormatSeparators = {\n\tleft: ' ',\n\tright: ' '\n};\n","const tokens = new Map([\n\t['nanosecond', 1 / 1e6],\n\t['nanoseconds', 1 / 1e6],\n\t['ns', 1 / 1e6],\n\n\t['millisecond', 1],\n\t['milliseconds', 1],\n\t['ms', 1],\n\n\t['second', 1000],\n\t['seconds', 1000],\n\t['sec', 1000],\n\t['secs', 1000],\n\t['s', 1000],\n\n\t['minute', 1000 * 60],\n\t['minutes', 1000 * 60],\n\t['min', 1000 * 60],\n\t['mins', 1000 * 60],\n\t['m', 1000 * 60],\n\n\t['hour', 1000 * 60 * 60],\n\t['hours', 1000 * 60 * 60],\n\t['hr', 1000 * 60 * 60],\n\t['hrs', 1000 * 60 * 60],\n\t['h', 1000 * 60 * 60],\n\n\t['day', 1000 * 60 * 60 * 24],\n\t['days', 1000 * 60 * 60 * 24],\n\t['d', 1000 * 60 * 60 * 24],\n\n\t['week', 1000 * 60 * 60 * 24 * 7],\n\t['weeks', 1000 * 60 * 60 * 24 * 7],\n\t['wk', 1000 * 60 * 60 * 24 * 7],\n\t['wks', 1000 * 60 * 60 * 24 * 7],\n\t['w', 1000 * 60 * 60 * 24 * 7],\n\n\t['month', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['months', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['b', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['mo', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\n\t['year', 1000 * 60 * 60 * 24 * 365.25],\n\t['years', 1000 * 60 * 60 * 24 * 365.25],\n\t['yr', 1000 * 60 * 60 * 24 * 365.25],\n\t['yrs', 1000 * 60 * 60 * 24 * 365.25],\n\t['y', 1000 * 60 * 60 * 24 * 365.25]\n]);\n\n/**\n * Converts duration strings into ms and future dates\n */\nexport class Duration {\n\t/**\n\t * The offset\n\t */\n\tpublic offset: number;\n\n\t/**\n\t * Create a new Duration instance\n\t * @param pattern The string to parse\n\t */\n\tpublic constructor(pattern: string) {\n\t\tthis.offset = Duration.parse(pattern.toLowerCase());\n\t}\n\n\t/**\n\t * Get the date from now\n\t */\n\tpublic get fromNow(): Date {\n\t\treturn this.dateFrom(new Date());\n\t}\n\n\t/**\n\t * Get the date from\n\t * @param date The Date instance to get the date from\n\t */\n\tpublic dateFrom(date: Date): Date {\n\t\treturn new Date(date.getTime() + this.offset);\n\t}\n\n\t/**\n\t * The RegExp used for the pattern parsing\n\t */\n\tprivate static readonly kPatternRegex = /(-?\\d*\\.?\\d+(?:e[-+]?\\d+)?)\\s*([a-zμ]*)/gi;\n\n\t/**\n\t * The RegExp used for removing commas\n\t */\n\tprivate static readonly kCommaRegex = /,/g;\n\n\t/**\n\t * The RegExp used for replacing a/an with 1\n\t */\n\tprivate static readonly kAanRegex = /\\ban?\\b/gi;\n\n\t/**\n\t * Parse the pattern\n\t * @param pattern The pattern to parse\n\t */\n\tprivate static parse(pattern: string): number {\n\t\tlet result = 0;\n\t\tlet valid = false;\n\n\t\tpattern\n\t\t\t// ignore commas\n\t\t\t.replace(Duration.kCommaRegex, '')\n\t\t\t// a / an = 1\n\t\t\t.replace(Duration.kAanRegex, '1')\n\t\t\t// do math\n\t\t\t.replace(Duration.kPatternRegex, (_, i, units) => {\n\t\t\t\tconst token = tokens.get(units);\n\t\t\t\tif (token !== undefined) {\n\t\t\t\t\tresult += Number(i) * token;\n\t\t\t\t\tvalid = true;\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t});\n\n\t\treturn valid ? result : NaN;\n\t}\n}\n","import { DEFAULT_SEPARATORS, DEFAULT_UNITS, TimeTypes } from './constants';\n\n/**\n * The duration of each time type in milliseconds\n */\nconst kTimeDurations: readonly [TimeTypes, number][] = [\n\t[TimeTypes.Year, 31536000000],\n\t// 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month\n\t[TimeTypes.Month, 2628000000],\n\t[TimeTypes.Week, 1000 * 60 * 60 * 24 * 7],\n\t[TimeTypes.Day, 1000 * 60 * 60 * 24],\n\t[TimeTypes.Hour, 1000 * 60 * 60],\n\t[TimeTypes.Minute, 1000 * 60],\n\t[TimeTypes.Second, 1000]\n];\n\n/**\n * Display the duration\n * @param duration The duration in milliseconds to parse and display\n * @param assets The language assets\n */\nexport class DurationFormatter {\n\tpublic constructor(public units: DurationFormatAssetsTime = DEFAULT_UNITS) {}\n\n\tpublic format(\n\t\tduration: number,\n\t\tprecision = 7,\n\t\t{\n\t\t\tleft: leftSeparator = DEFAULT_SEPARATORS.left,\n\t\t\tright: rightSeparator = DEFAULT_SEPARATORS.right\n\t\t}: DurationFormatSeparators = DEFAULT_SEPARATORS\n\t) {\n\t\tconst output: string[] = [];\n\t\tconst negative = duration < 0;\n\t\tif (negative) duration *= -1;\n\n\t\tfor (const [type, timeDuration] of kTimeDurations) {\n\t\t\tconst division = duration / timeDuration;\n\t\t\tif (division < 1) continue;\n\n\t\t\tconst floored = Math.floor(division);\n\t\t\tduration -= floored * timeDuration;\n\t\t\toutput.push(addUnit(floored, this.units[type], leftSeparator!));\n\n\t\t\t// If the output has enough precision, break\n\t\t\tif (output.length >= precision) break;\n\t\t}\n\n\t\treturn `${negative ? '-' : ''}${output.join(rightSeparator) || addUnit(0, this.units.second, leftSeparator!)}`;\n\t}\n}\n\n/**\n * Adds an unit, if non zero\n * @param time The duration of said unit\n * @param unit The unit language assets\n */\nfunction addUnit(time: number, unit: DurationFormatAssetsUnit, separator: string) {\n\tif (Reflect.has(unit, time)) return `${time}${separator}${Reflect.get(unit, time)}`;\n\treturn `${time}${separator}${unit.DEFAULT}`;\n}\n\nexport interface DurationFormatSeparators {\n\tleft?: string;\n\tright?: string;\n}\n\nexport interface DurationFormatAssetsUnit extends Record<number, string> {\n\tDEFAULT: string;\n}\n\nexport interface DurationFormatAssetsTime {\n\t[TimeTypes.Second]: DurationFormatAssetsUnit;\n\t[TimeTypes.Minute]: DurationFormatAssetsUnit;\n\t[TimeTypes.Hour]: DurationFormatAssetsUnit;\n\t[TimeTypes.Day]: DurationFormatAssetsUnit;\n\t[TimeTypes.Week]: DurationFormatAssetsUnit;\n\t[TimeTypes.Month]: DurationFormatAssetsUnit;\n\t[TimeTypes.Year]: DurationFormatAssetsUnit;\n}\n"]}
1
+ {"version":3,"sources":["../src/lib/constants.ts","../src/lib/Duration.ts","../src/lib/DurationFormatter.ts"],"names":["Time","TimeTypes"],"mappings":"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","sourcesContent":["import type { DurationFormatAssetsTime, DurationFormatSeparators } from './DurationFormatter';\n\nexport enum Time {\n\tNanosecond = 1 / 1_000_000,\n\tMicrosecond = 1 / 1000,\n\tMillisecond = 1,\n\tSecond = 1000,\n\tMinute = Second * 60,\n\tHour = Minute * 60,\n\tDay = Hour * 24,\n\tWeek = Day * 7,\n\tMonth = Day * (365 / 12),\n\tYear = Day * 365\n}\n\n/**\n * The supported time types\n */\nexport enum TimeTypes {\n\tSecond = 'second',\n\tMinute = 'minute',\n\tHour = 'hour',\n\tDay = 'day',\n\tWeek = 'week',\n\tMonth = 'month',\n\tYear = 'year'\n}\n\nexport const DEFAULT_UNITS: DurationFormatAssetsTime = {\n\t[TimeTypes.Year]: {\n\t\t1: 'year',\n\t\tDEFAULT: 'years'\n\t},\n\t[TimeTypes.Month]: {\n\t\t1: 'month',\n\t\tDEFAULT: 'months'\n\t},\n\t[TimeTypes.Week]: {\n\t\t1: 'week',\n\t\tDEFAULT: 'weeks'\n\t},\n\t[TimeTypes.Day]: {\n\t\t1: 'day',\n\t\tDEFAULT: 'days'\n\t},\n\t[TimeTypes.Hour]: {\n\t\t1: 'hour',\n\t\tDEFAULT: 'hours'\n\t},\n\t[TimeTypes.Minute]: {\n\t\t1: 'minute',\n\t\tDEFAULT: 'minutes'\n\t},\n\t[TimeTypes.Second]: {\n\t\t1: 'second',\n\t\tDEFAULT: 'seconds'\n\t}\n};\n\nexport const DEFAULT_SEPARATORS: DurationFormatSeparators = {\n\tleft: ' ',\n\tright: ' '\n};\n","const tokens = new Map([\n\t['nanosecond', 1 / 1e6],\n\t['nanoseconds', 1 / 1e6],\n\t['ns', 1 / 1e6],\n\n\t['millisecond', 1],\n\t['milliseconds', 1],\n\t['ms', 1],\n\n\t['second', 1000],\n\t['seconds', 1000],\n\t['sec', 1000],\n\t['secs', 1000],\n\t['s', 1000],\n\n\t['minute', 1000 * 60],\n\t['minutes', 1000 * 60],\n\t['min', 1000 * 60],\n\t['mins', 1000 * 60],\n\t['m', 1000 * 60],\n\n\t['hour', 1000 * 60 * 60],\n\t['hours', 1000 * 60 * 60],\n\t['hr', 1000 * 60 * 60],\n\t['hrs', 1000 * 60 * 60],\n\t['h', 1000 * 60 * 60],\n\n\t['day', 1000 * 60 * 60 * 24],\n\t['days', 1000 * 60 * 60 * 24],\n\t['d', 1000 * 60 * 60 * 24],\n\n\t['week', 1000 * 60 * 60 * 24 * 7],\n\t['weeks', 1000 * 60 * 60 * 24 * 7],\n\t['wk', 1000 * 60 * 60 * 24 * 7],\n\t['wks', 1000 * 60 * 60 * 24 * 7],\n\t['w', 1000 * 60 * 60 * 24 * 7],\n\n\t['month', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['months', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['b', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\t['mo', 1000 * 60 * 60 * 24 * (365.25 / 12)],\n\n\t['year', 1000 * 60 * 60 * 24 * 365.25],\n\t['years', 1000 * 60 * 60 * 24 * 365.25],\n\t['yr', 1000 * 60 * 60 * 24 * 365.25],\n\t['yrs', 1000 * 60 * 60 * 24 * 365.25],\n\t['y', 1000 * 60 * 60 * 24 * 365.25]\n]);\n\n/**\n * Converts duration strings into ms and future dates\n */\nexport class Duration {\n\t/**\n\t * The offset\n\t */\n\tpublic offset: number;\n\n\t/**\n\t * Create a new Duration instance\n\t * @param pattern The string to parse\n\t */\n\tpublic constructor(pattern: string) {\n\t\tthis.offset = Duration.parse(pattern.toLowerCase());\n\t}\n\n\t/**\n\t * Get the date from now\n\t */\n\tpublic get fromNow(): Date {\n\t\treturn this.dateFrom(new Date());\n\t}\n\n\t/**\n\t * Get the date from\n\t * @param date The Date instance to get the date from\n\t */\n\tpublic dateFrom(date: Date): Date {\n\t\treturn new Date(date.getTime() + this.offset);\n\t}\n\n\t/**\n\t * The RegExp used for the pattern parsing\n\t */\n\tprivate static readonly kPatternRegex = /(-?\\d*\\.?\\d+(?:e[-+]?\\d+)?)\\s*([a-zμ]*)/gi;\n\n\t/**\n\t * The RegExp used for removing commas\n\t */\n\tprivate static readonly kCommaRegex = /,/g;\n\n\t/**\n\t * The RegExp used for replacing a/an with 1\n\t */\n\tprivate static readonly kAanRegex = /\\ban?\\b/gi;\n\n\t/**\n\t * Parse the pattern\n\t * @param pattern The pattern to parse\n\t */\n\tprivate static parse(pattern: string): number {\n\t\tlet result = 0;\n\t\tlet valid = false;\n\n\t\tpattern\n\t\t\t// ignore commas\n\t\t\t.replace(Duration.kCommaRegex, '')\n\t\t\t// a / an = 1\n\t\t\t.replace(Duration.kAanRegex, '1')\n\t\t\t// do math\n\t\t\t.replace(Duration.kPatternRegex, (_, i, units) => {\n\t\t\t\tconst token = tokens.get(units);\n\t\t\t\tif (token !== undefined) {\n\t\t\t\t\tresult += Number(i) * token;\n\t\t\t\t\tvalid = true;\n\t\t\t\t}\n\t\t\t\treturn '';\n\t\t\t});\n\n\t\treturn valid ? result : NaN;\n\t}\n}\n","import { DEFAULT_SEPARATORS, DEFAULT_UNITS, TimeTypes } from './constants';\n\n/**\n * The duration of each time type in milliseconds\n */\nconst kTimeDurations: readonly [TimeTypes, number][] = [\n\t[TimeTypes.Year, 31536000000],\n\t// 29.53059 days is the official duration of a month: https://en.wikipedia.org/wiki/Month\n\t[TimeTypes.Month, 2628000000],\n\t[TimeTypes.Week, 1000 * 60 * 60 * 24 * 7],\n\t[TimeTypes.Day, 1000 * 60 * 60 * 24],\n\t[TimeTypes.Hour, 1000 * 60 * 60],\n\t[TimeTypes.Minute, 1000 * 60],\n\t[TimeTypes.Second, 1000]\n];\n\n/**\n * Display the duration\n * @param duration The duration in milliseconds to parse and display\n * @param assets The language assets\n */\nexport class DurationFormatter {\n\tpublic constructor(public units: DurationFormatAssetsTime = DEFAULT_UNITS) {}\n\n\tpublic format(\n\t\tduration: number,\n\t\tprecision = 7,\n\t\t{\n\t\t\tleft: leftSeparator = DEFAULT_SEPARATORS.left,\n\t\t\tright: rightSeparator = DEFAULT_SEPARATORS.right\n\t\t}: DurationFormatSeparators = DEFAULT_SEPARATORS\n\t) {\n\t\tconst output: string[] = [];\n\t\tconst negative = duration < 0;\n\t\tif (negative) duration *= -1;\n\n\t\tfor (const [type, timeDuration] of kTimeDurations) {\n\t\t\tconst division = duration / timeDuration;\n\t\t\tif (division < 1) continue;\n\n\t\t\tconst floored = Math.floor(division);\n\t\t\tduration -= floored * timeDuration;\n\t\t\toutput.push(addUnit(floored, this.units[type], leftSeparator!));\n\n\t\t\t// If the output has enough precision, break\n\t\t\tif (output.length >= precision) break;\n\t\t}\n\n\t\treturn `${negative ? '-' : ''}${output.join(rightSeparator) || addUnit(0, this.units.second, leftSeparator!)}`;\n\t}\n}\n\n/**\n * Adds an unit, if non zero\n * @param time The duration of said unit\n * @param unit The unit language assets\n */\nfunction addUnit(time: number, unit: DurationFormatAssetsUnit, separator: string) {\n\tif (Reflect.has(unit, time)) return `${time}${separator}${Reflect.get(unit, time)}`;\n\treturn `${time}${separator}${unit.DEFAULT}`;\n}\n\nexport interface DurationFormatSeparators {\n\tleft?: string;\n\tright?: string;\n}\n\nexport interface DurationFormatAssetsUnit extends Record<number, string> {\n\tDEFAULT: string;\n}\n\nexport interface DurationFormatAssetsTime {\n\t[TimeTypes.Second]: DurationFormatAssetsUnit;\n\t[TimeTypes.Minute]: DurationFormatAssetsUnit;\n\t[TimeTypes.Hour]: DurationFormatAssetsUnit;\n\t[TimeTypes.Day]: DurationFormatAssetsUnit;\n\t[TimeTypes.Week]: DurationFormatAssetsUnit;\n\t[TimeTypes.Month]: DurationFormatAssetsUnit;\n\t[TimeTypes.Year]: DurationFormatAssetsUnit;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapphire/duration",
3
- "version": "1.1.0-next.5440a99.0",
3
+ "version": "1.1.0-next.5a1e7fe.0",
4
4
  "description": "A time duration utility library for JavaScript.",
5
5
  "author": "@sapphire",
6
6
  "license": "MIT",
@@ -57,12 +57,12 @@
57
57
  "access": "public"
58
58
  },
59
59
  "devDependencies": {
60
- "@favware/cliff-jumper": "^1.10.0",
61
- "@vitest/coverage-c8": "^0.27.1",
62
- "tsup": "^6.5.0",
63
- "typedoc": "^0.23.24",
64
- "typedoc-json-parser": "^7.1.0",
65
- "typescript": "^4.9.4",
66
- "vitest": "^0.27.1"
60
+ "@favware/cliff-jumper": "^2.0.0",
61
+ "@vitest/coverage-c8": "^0.29.2",
62
+ "tsup": "^6.6.3",
63
+ "typedoc": "^0.23.26",
64
+ "typedoc-json-parser": "^7.2.0",
65
+ "typescript": "^4.9.5",
66
+ "vitest": "^0.29.2"
67
67
  }
68
68
  }