@sapphire/cron 1.1.4-pr-725.25672a58.0 → 1.2.0-next.db356eb0

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/README.md CHANGED
@@ -17,10 +17,8 @@
17
17
 
18
18
  - [Features](#features)
19
19
  - [Installation](#installation)
20
- - [Usage](#usage)
21
- - [Basic Usage](#basic-usage)
22
20
  - [Buy us some doughnuts](#buy-us-some-doughnuts)
23
- - [Contributors](#contributors-%E2%9C%A8)
21
+ - [Contributors](#contributors)
24
22
 
25
23
  ## Features
26
24
 
@@ -5,10 +5,7 @@ var utilities = require('@sapphire/utilities');
5
5
  var __defProp = Object.defineProperty;
6
6
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
7
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
8
- var __publicField = (obj, key, value) => {
9
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
10
- return value;
11
- };
8
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
12
9
 
13
10
  // src/lib/constants.ts
14
11
  var Time = /* @__PURE__ */ ((Time2) => {
@@ -88,32 +85,35 @@ var _Cron = class _Cron {
88
85
  if (!this.days.includes(outset.getUTCDate()) || !this.months.includes(outset.getUTCMonth() + 1) || !this.dows.includes(outset.getUTCDay())) {
89
86
  return this.next(new Date(outset.getTime() + 864e5 /* Day */), false);
90
87
  }
91
- if (!origin)
92
- return new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), this.hours[0], this.minutes[0]));
88
+ if (!origin) return new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), this.hours[0], this.minutes[0]));
93
89
  const now = new Date(outset.getTime() + 6e4);
94
90
  for (const hour of this.hours) {
95
- if (hour < now.getUTCHours())
96
- continue;
91
+ if (hour < now.getUTCHours()) continue;
97
92
  for (const minute of this.minutes) {
98
- if (hour === now.getUTCHours() && minute < now.getUTCMinutes())
99
- continue;
93
+ if (hour === now.getUTCHours() && minute < now.getUTCMinutes()) continue;
100
94
  return new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), hour, minute));
101
95
  }
102
96
  }
103
97
  return this.next(new Date(outset.getTime() + 864e5 /* Day */), false);
104
98
  }
99
+ /**
100
+ * Returns the string that represents this cron pattern
101
+ *
102
+ * @returns The string that represents this cron pattern
103
+ */
104
+ toString() {
105
+ return this.cron;
106
+ }
105
107
  /**
106
108
  * Normalize the pattern
107
109
  * @param cron The pattern to normalize
108
110
  */
109
111
  static normalize(cron) {
110
- if (Reflect.has(predefined, cron))
111
- return Reflect.get(predefined, cron);
112
+ if (Reflect.has(predefined, cron)) return Reflect.get(predefined, cron);
112
113
  const now = /* @__PURE__ */ new Date();
113
114
  cron = cron.split(" ").map(
114
115
  (val, i) => val.replace(wildcardRegex, (match) => {
115
- if (match === "h")
116
- return (Math.floor(Math.random() * allowedNum[i][1]) + allowedNum[i][0]).toString();
116
+ if (match === "h") return (Math.floor(Math.random() * allowedNum[i][1]) + allowedNum[i][0]).toString();
117
117
  if (match === "?") {
118
118
  switch (i) {
119
119
  case 0:
@@ -139,8 +139,7 @@ var _Cron = class _Cron {
139
139
  */
140
140
  static parseString(cron) {
141
141
  const parts = cron.split(" ");
142
- if (parts.length !== 5)
143
- throw new Error("Invalid Cron Provided");
142
+ if (parts.length !== 5) throw new Error("Invalid Cron Provided");
144
143
  return parts.map((part, i) => _Cron.parsePart(part, i));
145
144
  }
146
145
  /**
@@ -151,16 +150,13 @@ var _Cron = class _Cron {
151
150
  static parsePart(cronPart, id) {
152
151
  if (cronPart.includes(",")) {
153
152
  const res = [];
154
- for (const part of cronPart.split(","))
155
- res.push(..._Cron.parsePart(part, id));
153
+ for (const part of cronPart.split(",")) res.push(..._Cron.parsePart(part, id));
156
154
  return [...new Set(res)].sort((a, b) => a - b);
157
155
  }
158
156
  const [, wild, minStr, maxStr, step] = partRegex.exec(cronPart);
159
157
  let [min, max] = [parseInt(minStr, 10), parseInt(maxStr, 10)];
160
- if (wild)
161
- [min, max] = allowedNum[id];
162
- else if (!max && !step)
163
- return [min];
158
+ if (wild) [min, max] = allowedNum[id];
159
+ else if (!max && !step) return [min];
164
160
  [min, max] = [min, max || allowedNum[id][1]].sort((a, b) => a - b);
165
161
  return utilities.range(min, max, parseInt(step, 10) || 1);
166
162
  }
@@ -176,5 +172,5 @@ exports.partRegex = partRegex;
176
172
  exports.predefined = predefined;
177
173
  exports.tokensRegex = tokensRegex;
178
174
  exports.wildcardRegex = wildcardRegex;
179
- //# sourceMappingURL=out.js.map
175
+ //# sourceMappingURL=index.cjs.map
180
176
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/constants.ts","../../src/lib/Cron.ts"],"names":["Time"],"mappings":"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","sourcesContent":["export 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\nexport const partRegex = /^(?:(\\*)|(\\d+)(?:-(\\d+))?)(?:\\/(\\d+))?$/;\n\nexport const wildcardRegex = /\\bh\\b|\\B\\?\\B/g;\n\nexport const allowedNum = [\n\t[0, 59],\n\t[0, 23],\n\t[1, 31],\n\t[1, 12],\n\t[0, 6]\n];\n\nexport const predefined = {\n\t'@annually': '0 0 1 1 *',\n\t'@yearly': '0 0 1 1 *',\n\t'@monthly': '0 0 1 * *',\n\t'@weekly': '0 0 * * 0',\n\t'@daily': '0 0 * * *',\n\t'@hourly': '0 * * * *'\n} as const;\n\nexport const cronTokens = {\n\tjan: 1,\n\tfeb: 2,\n\tmar: 3,\n\tapr: 4,\n\tmay: 5,\n\tjun: 6,\n\tjul: 7,\n\taug: 8,\n\tsep: 9,\n\toct: 10,\n\tnov: 11,\n\tdec: 12,\n\tsun: 0,\n\tmon: 1,\n\ttue: 2,\n\twed: 3,\n\tthu: 4,\n\tfri: 5,\n\tsat: 6\n} as const;\n\nexport const tokensRegex = new RegExp(Object.keys(cronTokens).join('|'), 'g');\n","import { range } from '@sapphire/utilities';\nimport { allowedNum, cronTokens, partRegex, predefined, Time, tokensRegex, wildcardRegex } from './constants';\n\n/**\n * Handles Cron strings and generates dates based on the cron string provided.\n * @see https://en.wikipedia.org/wiki/Cron\n */\nexport class Cron {\n\tpublic cron: string;\n\tpublic normalized: string;\n\tpublic minutes: number[];\n\tpublic hours: number[];\n\tpublic days: number[];\n\tpublic months: number[];\n\tpublic dows: number[];\n\n\t/**\n\t * @param cron The cron pattern to use\n\t */\n\tpublic constructor(cron: string) {\n\t\tthis.cron = cron.toLowerCase();\n\t\tthis.normalized = Cron.normalize(this.cron);\n\t\t[this.minutes, this.hours, this.days, this.months, this.dows] = Cron.parseString(this.normalized);\n\t}\n\n\t/**\n\t * Get the next date that matches with the current pattern\n\t * @param outset The Date instance to compare with\n\t * @param origin Whether this next call is origin\n\t */\n\tpublic next(outset: Date = new Date(), origin = true): Date {\n\t\tif (!this.days.includes(outset.getUTCDate()) || !this.months.includes(outset.getUTCMonth() + 1) || !this.dows.includes(outset.getUTCDay())) {\n\t\t\treturn this.next(new Date(outset.getTime() + Time.Day), false);\n\t\t}\n\t\tif (!origin) return new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), this.hours[0], this.minutes[0]));\n\n\t\tconst now = new Date(outset.getTime() + 60000);\n\n\t\tfor (const hour of this.hours) {\n\t\t\tif (hour < now.getUTCHours()) continue;\n\t\t\tfor (const minute of this.minutes) {\n\t\t\t\tif (hour === now.getUTCHours() && minute < now.getUTCMinutes()) continue;\n\t\t\t\treturn new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), hour, minute));\n\t\t\t}\n\t\t}\n\n\t\treturn this.next(new Date(outset.getTime() + Time.Day), false);\n\t}\n\n\t/**\n\t * Normalize the pattern\n\t * @param cron The pattern to normalize\n\t */\n\tprivate static normalize(cron: string): string {\n\t\tif (Reflect.has(predefined, cron)) return Reflect.get(predefined, cron);\n\t\tconst now = new Date();\n\t\tcron = cron\n\t\t\t.split(' ')\n\t\t\t.map((val, i) =>\n\t\t\t\tval.replace(wildcardRegex, (match) => {\n\t\t\t\t\tif (match === 'h') return (Math.floor(Math.random() * allowedNum[i][1]) + allowedNum[i][0]).toString();\n\n\t\t\t\t\tif (match === '?') {\n\t\t\t\t\t\tswitch (i) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\treturn now.getUTCMinutes().toString();\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\treturn now.getUTCHours().toString();\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\treturn now.getUTCDate().toString();\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\treturn now.getUTCMonth().toString();\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\treturn now.getUTCDay().toString();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn match;\n\t\t\t\t})\n\t\t\t)\n\t\t\t.join(' ');\n\t\treturn cron.replace(tokensRegex, (match) => String(Reflect.get(cronTokens, match)));\n\t}\n\n\t/**\n\t * Parse the pattern\n\t * @param cron The pattern to parse\n\t */\n\tprivate static parseString(cron: string): Array<number[]> {\n\t\tconst parts = cron.split(' ');\n\t\tif (parts.length !== 5) throw new Error('Invalid Cron Provided');\n\t\treturn parts.map((part, i) => Cron.parsePart(part, i));\n\t}\n\n\t/**\n\t * Parse the current part\n\t * @param cronPart The part of the pattern to parse\n\t * @param id The id that identifies the current part\n\t */\n\tprivate static parsePart(cronPart: string, id: number): number[] {\n\t\tif (cronPart.includes(',')) {\n\t\t\tconst res: number[] = [];\n\t\t\tfor (const part of cronPart.split(',')) res.push(...Cron.parsePart(part, id));\n\t\t\treturn [...new Set(res)].sort((a, b) => a - b);\n\t\t}\n\n\t\tconst [, wild, minStr, maxStr, step] = partRegex.exec(cronPart)!;\n\t\tlet [min, max] = [parseInt(minStr, 10), parseInt(maxStr, 10)];\n\n\t\t// If '*', set min and max as the minimum and maximum allowed numbers:\n\t\tif (wild) [min, max] = allowedNum[id];\n\t\t// Else if a number was given, but not a maximum nor a step, return it\n\t\t// as only allowed value:\n\t\telse if (!max && !step) return [min];\n\n\t\t// Set min and max as the given numbers, defaulting max to the maximum\n\t\t// allowed, so min is never bigger than max:\n\t\t// This makes min and max be, in the following cases (considering minutes):\n\t\t// -> 1-2 | 1..2\n\t\t// -> 2-1 | 1..2\n\t\t// -> 1/7 | 1, 8, 15, 22, 29, 36, 43, 50, 57\n\t\t[min, max] = [min, max || allowedNum[id][1]].sort((a, b) => a - b);\n\n\t\t// Generate a range\n\t\treturn range(min, max, parseInt(step, 10) || 1);\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../src/lib/constants.ts","../../src/lib/Cron.ts"],"names":["Time","range"],"mappings":"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","file":"index.cjs","sourcesContent":["export 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\nexport const partRegex = /^(?:(\\*)|(\\d+)(?:-(\\d+))?)(?:\\/(\\d+))?$/;\n\nexport const wildcardRegex = /\\bh\\b|\\B\\?\\B/g;\n\nexport const allowedNum = [\n\t[0, 59],\n\t[0, 23],\n\t[1, 31],\n\t[1, 12],\n\t[0, 6]\n];\n\nexport const predefined = {\n\t'@annually': '0 0 1 1 *',\n\t'@yearly': '0 0 1 1 *',\n\t'@monthly': '0 0 1 * *',\n\t'@weekly': '0 0 * * 0',\n\t'@daily': '0 0 * * *',\n\t'@hourly': '0 * * * *'\n} as const;\n\nexport const cronTokens = {\n\tjan: 1,\n\tfeb: 2,\n\tmar: 3,\n\tapr: 4,\n\tmay: 5,\n\tjun: 6,\n\tjul: 7,\n\taug: 8,\n\tsep: 9,\n\toct: 10,\n\tnov: 11,\n\tdec: 12,\n\tsun: 0,\n\tmon: 1,\n\ttue: 2,\n\twed: 3,\n\tthu: 4,\n\tfri: 5,\n\tsat: 6\n} as const;\n\nexport const tokensRegex = new RegExp(Object.keys(cronTokens).join('|'), 'g');\n","import { range } from '@sapphire/utilities';\nimport { allowedNum, cronTokens, partRegex, predefined, Time, tokensRegex, wildcardRegex } from './constants';\n\n/**\n * Handles Cron strings and generates dates based on the cron string provided.\n * @see https://en.wikipedia.org/wiki/Cron\n */\nexport class Cron {\n\tpublic cron: string;\n\tpublic normalized: string;\n\tpublic minutes: number[];\n\tpublic hours: number[];\n\tpublic days: number[];\n\tpublic months: number[];\n\tpublic dows: number[];\n\n\t/**\n\t * @param cron The cron pattern to use\n\t */\n\tpublic constructor(cron: string) {\n\t\tthis.cron = cron.toLowerCase();\n\t\tthis.normalized = Cron.normalize(this.cron);\n\t\t[this.minutes, this.hours, this.days, this.months, this.dows] = Cron.parseString(this.normalized);\n\t}\n\n\t/**\n\t * Get the next date that matches with the current pattern\n\t * @param outset The Date instance to compare with\n\t * @param origin Whether this next call is origin\n\t */\n\tpublic next(outset: Date = new Date(), origin = true): Date {\n\t\tif (!this.days.includes(outset.getUTCDate()) || !this.months.includes(outset.getUTCMonth() + 1) || !this.dows.includes(outset.getUTCDay())) {\n\t\t\treturn this.next(new Date(outset.getTime() + Time.Day), false);\n\t\t}\n\t\tif (!origin) return new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), this.hours[0], this.minutes[0]));\n\n\t\tconst now = new Date(outset.getTime() + 60000);\n\n\t\tfor (const hour of this.hours) {\n\t\t\tif (hour < now.getUTCHours()) continue;\n\t\t\tfor (const minute of this.minutes) {\n\t\t\t\tif (hour === now.getUTCHours() && minute < now.getUTCMinutes()) continue;\n\t\t\t\treturn new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), hour, minute));\n\t\t\t}\n\t\t}\n\n\t\treturn this.next(new Date(outset.getTime() + Time.Day), false);\n\t}\n\n\t/**\n\t * Returns the string that represents this cron pattern\n\t *\n\t * @returns The string that represents this cron pattern\n\t */\n\tpublic toString() {\n\t\treturn this.cron;\n\t}\n\n\t/**\n\t * Normalize the pattern\n\t * @param cron The pattern to normalize\n\t */\n\tprivate static normalize(cron: string): string {\n\t\tif (Reflect.has(predefined, cron)) return Reflect.get(predefined, cron);\n\t\tconst now = new Date();\n\t\tcron = cron\n\t\t\t.split(' ')\n\t\t\t.map((val, i) =>\n\t\t\t\tval.replace(wildcardRegex, (match) => {\n\t\t\t\t\tif (match === 'h') return (Math.floor(Math.random() * allowedNum[i][1]) + allowedNum[i][0]).toString();\n\n\t\t\t\t\tif (match === '?') {\n\t\t\t\t\t\tswitch (i) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\treturn now.getUTCMinutes().toString();\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\treturn now.getUTCHours().toString();\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\treturn now.getUTCDate().toString();\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\treturn now.getUTCMonth().toString();\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\treturn now.getUTCDay().toString();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn match;\n\t\t\t\t})\n\t\t\t)\n\t\t\t.join(' ');\n\t\treturn cron.replace(tokensRegex, (match) => String(Reflect.get(cronTokens, match)));\n\t}\n\n\t/**\n\t * Parse the pattern\n\t * @param cron The pattern to parse\n\t */\n\tprivate static parseString(cron: string): Array<number[]> {\n\t\tconst parts = cron.split(' ');\n\t\tif (parts.length !== 5) throw new Error('Invalid Cron Provided');\n\t\treturn parts.map((part, i) => Cron.parsePart(part, i));\n\t}\n\n\t/**\n\t * Parse the current part\n\t * @param cronPart The part of the pattern to parse\n\t * @param id The id that identifies the current part\n\t */\n\tprivate static parsePart(cronPart: string, id: number): number[] {\n\t\tif (cronPart.includes(',')) {\n\t\t\tconst res: number[] = [];\n\t\t\tfor (const part of cronPart.split(',')) res.push(...Cron.parsePart(part, id));\n\t\t\treturn [...new Set(res)].sort((a, b) => a - b);\n\t\t}\n\n\t\tconst [, wild, minStr, maxStr, step] = partRegex.exec(cronPart)!;\n\t\tlet [min, max] = [parseInt(minStr, 10), parseInt(maxStr, 10)];\n\n\t\t// If '*', set min and max as the minimum and maximum allowed numbers:\n\t\tif (wild) [min, max] = allowedNum[id];\n\t\t// Else if a number was given, but not a maximum nor a step, return it\n\t\t// as only allowed value:\n\t\telse if (!max && !step) return [min];\n\n\t\t// Set min and max as the given numbers, defaulting max to the maximum\n\t\t// allowed, so min is never bigger than max:\n\t\t// This makes min and max be, in the following cases (considering minutes):\n\t\t// -> 1-2 | 1..2\n\t\t// -> 2-1 | 1..2\n\t\t// -> 1/7 | 1, 8, 15, 22, 29, 36, 43, 50, 57\n\t\t[min, max] = [min, max || allowedNum[id][1]].sort((a, b) => a - b);\n\n\t\t// Generate a range\n\t\treturn range(min, max, parseInt(step, 10) || 1);\n\t}\n}\n"]}
@@ -66,6 +66,12 @@ declare class Cron {
66
66
  * @param origin Whether this next call is origin
67
67
  */
68
68
  next(outset?: Date, origin?: boolean): Date;
69
+ /**
70
+ * Returns the string that represents this cron pattern
71
+ *
72
+ * @returns The string that represents this cron pattern
73
+ */
74
+ toString(): string;
69
75
  /**
70
76
  * Normalize the pattern
71
77
  * @param cron The pattern to normalize
@@ -66,6 +66,12 @@ declare class Cron {
66
66
  * @param origin Whether this next call is origin
67
67
  */
68
68
  next(outset?: Date, origin?: boolean): Date;
69
+ /**
70
+ * Returns the string that represents this cron pattern
71
+ *
72
+ * @returns The string that represents this cron pattern
73
+ */
74
+ toString(): string;
69
75
  /**
70
76
  * Normalize the pattern
71
77
  * @param cron The pattern to normalize
@@ -3,10 +3,7 @@ import { range } from '@sapphire/utilities';
3
3
  var __defProp = Object.defineProperty;
4
4
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
5
5
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
6
- var __publicField = (obj, key, value) => {
7
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
8
- return value;
9
- };
6
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
10
7
 
11
8
  // src/lib/constants.ts
12
9
  var Time = /* @__PURE__ */ ((Time2) => {
@@ -86,32 +83,35 @@ var _Cron = class _Cron {
86
83
  if (!this.days.includes(outset.getUTCDate()) || !this.months.includes(outset.getUTCMonth() + 1) || !this.dows.includes(outset.getUTCDay())) {
87
84
  return this.next(new Date(outset.getTime() + 864e5 /* Day */), false);
88
85
  }
89
- if (!origin)
90
- return new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), this.hours[0], this.minutes[0]));
86
+ if (!origin) return new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), this.hours[0], this.minutes[0]));
91
87
  const now = new Date(outset.getTime() + 6e4);
92
88
  for (const hour of this.hours) {
93
- if (hour < now.getUTCHours())
94
- continue;
89
+ if (hour < now.getUTCHours()) continue;
95
90
  for (const minute of this.minutes) {
96
- if (hour === now.getUTCHours() && minute < now.getUTCMinutes())
97
- continue;
91
+ if (hour === now.getUTCHours() && minute < now.getUTCMinutes()) continue;
98
92
  return new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), hour, minute));
99
93
  }
100
94
  }
101
95
  return this.next(new Date(outset.getTime() + 864e5 /* Day */), false);
102
96
  }
97
+ /**
98
+ * Returns the string that represents this cron pattern
99
+ *
100
+ * @returns The string that represents this cron pattern
101
+ */
102
+ toString() {
103
+ return this.cron;
104
+ }
103
105
  /**
104
106
  * Normalize the pattern
105
107
  * @param cron The pattern to normalize
106
108
  */
107
109
  static normalize(cron) {
108
- if (Reflect.has(predefined, cron))
109
- return Reflect.get(predefined, cron);
110
+ if (Reflect.has(predefined, cron)) return Reflect.get(predefined, cron);
110
111
  const now = /* @__PURE__ */ new Date();
111
112
  cron = cron.split(" ").map(
112
113
  (val, i) => val.replace(wildcardRegex, (match) => {
113
- if (match === "h")
114
- return (Math.floor(Math.random() * allowedNum[i][1]) + allowedNum[i][0]).toString();
114
+ if (match === "h") return (Math.floor(Math.random() * allowedNum[i][1]) + allowedNum[i][0]).toString();
115
115
  if (match === "?") {
116
116
  switch (i) {
117
117
  case 0:
@@ -137,8 +137,7 @@ var _Cron = class _Cron {
137
137
  */
138
138
  static parseString(cron) {
139
139
  const parts = cron.split(" ");
140
- if (parts.length !== 5)
141
- throw new Error("Invalid Cron Provided");
140
+ if (parts.length !== 5) throw new Error("Invalid Cron Provided");
142
141
  return parts.map((part, i) => _Cron.parsePart(part, i));
143
142
  }
144
143
  /**
@@ -149,16 +148,13 @@ var _Cron = class _Cron {
149
148
  static parsePart(cronPart, id) {
150
149
  if (cronPart.includes(",")) {
151
150
  const res = [];
152
- for (const part of cronPart.split(","))
153
- res.push(..._Cron.parsePart(part, id));
151
+ for (const part of cronPart.split(",")) res.push(..._Cron.parsePart(part, id));
154
152
  return [...new Set(res)].sort((a, b) => a - b);
155
153
  }
156
154
  const [, wild, minStr, maxStr, step] = partRegex.exec(cronPart);
157
155
  let [min, max] = [parseInt(minStr, 10), parseInt(maxStr, 10)];
158
- if (wild)
159
- [min, max] = allowedNum[id];
160
- else if (!max && !step)
161
- return [min];
156
+ if (wild) [min, max] = allowedNum[id];
157
+ else if (!max && !step) return [min];
162
158
  [min, max] = [min, max || allowedNum[id][1]].sort((a, b) => a - b);
163
159
  return range(min, max, parseInt(step, 10) || 1);
164
160
  }
@@ -167,5 +163,5 @@ __name(_Cron, "Cron");
167
163
  var Cron = _Cron;
168
164
 
169
165
  export { Cron, Time, allowedNum, cronTokens, partRegex, predefined, tokensRegex, wildcardRegex };
170
- //# sourceMappingURL=out.js.map
166
+ //# sourceMappingURL=index.mjs.map
171
167
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/constants.ts","../../src/lib/Cron.ts"],"names":["Time"],"mappings":"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","sourcesContent":["export 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\nexport const partRegex = /^(?:(\\*)|(\\d+)(?:-(\\d+))?)(?:\\/(\\d+))?$/;\n\nexport const wildcardRegex = /\\bh\\b|\\B\\?\\B/g;\n\nexport const allowedNum = [\n\t[0, 59],\n\t[0, 23],\n\t[1, 31],\n\t[1, 12],\n\t[0, 6]\n];\n\nexport const predefined = {\n\t'@annually': '0 0 1 1 *',\n\t'@yearly': '0 0 1 1 *',\n\t'@monthly': '0 0 1 * *',\n\t'@weekly': '0 0 * * 0',\n\t'@daily': '0 0 * * *',\n\t'@hourly': '0 * * * *'\n} as const;\n\nexport const cronTokens = {\n\tjan: 1,\n\tfeb: 2,\n\tmar: 3,\n\tapr: 4,\n\tmay: 5,\n\tjun: 6,\n\tjul: 7,\n\taug: 8,\n\tsep: 9,\n\toct: 10,\n\tnov: 11,\n\tdec: 12,\n\tsun: 0,\n\tmon: 1,\n\ttue: 2,\n\twed: 3,\n\tthu: 4,\n\tfri: 5,\n\tsat: 6\n} as const;\n\nexport const tokensRegex = new RegExp(Object.keys(cronTokens).join('|'), 'g');\n","import { range } from '@sapphire/utilities';\nimport { allowedNum, cronTokens, partRegex, predefined, Time, tokensRegex, wildcardRegex } from './constants';\n\n/**\n * Handles Cron strings and generates dates based on the cron string provided.\n * @see https://en.wikipedia.org/wiki/Cron\n */\nexport class Cron {\n\tpublic cron: string;\n\tpublic normalized: string;\n\tpublic minutes: number[];\n\tpublic hours: number[];\n\tpublic days: number[];\n\tpublic months: number[];\n\tpublic dows: number[];\n\n\t/**\n\t * @param cron The cron pattern to use\n\t */\n\tpublic constructor(cron: string) {\n\t\tthis.cron = cron.toLowerCase();\n\t\tthis.normalized = Cron.normalize(this.cron);\n\t\t[this.minutes, this.hours, this.days, this.months, this.dows] = Cron.parseString(this.normalized);\n\t}\n\n\t/**\n\t * Get the next date that matches with the current pattern\n\t * @param outset The Date instance to compare with\n\t * @param origin Whether this next call is origin\n\t */\n\tpublic next(outset: Date = new Date(), origin = true): Date {\n\t\tif (!this.days.includes(outset.getUTCDate()) || !this.months.includes(outset.getUTCMonth() + 1) || !this.dows.includes(outset.getUTCDay())) {\n\t\t\treturn this.next(new Date(outset.getTime() + Time.Day), false);\n\t\t}\n\t\tif (!origin) return new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), this.hours[0], this.minutes[0]));\n\n\t\tconst now = new Date(outset.getTime() + 60000);\n\n\t\tfor (const hour of this.hours) {\n\t\t\tif (hour < now.getUTCHours()) continue;\n\t\t\tfor (const minute of this.minutes) {\n\t\t\t\tif (hour === now.getUTCHours() && minute < now.getUTCMinutes()) continue;\n\t\t\t\treturn new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), hour, minute));\n\t\t\t}\n\t\t}\n\n\t\treturn this.next(new Date(outset.getTime() + Time.Day), false);\n\t}\n\n\t/**\n\t * Normalize the pattern\n\t * @param cron The pattern to normalize\n\t */\n\tprivate static normalize(cron: string): string {\n\t\tif (Reflect.has(predefined, cron)) return Reflect.get(predefined, cron);\n\t\tconst now = new Date();\n\t\tcron = cron\n\t\t\t.split(' ')\n\t\t\t.map((val, i) =>\n\t\t\t\tval.replace(wildcardRegex, (match) => {\n\t\t\t\t\tif (match === 'h') return (Math.floor(Math.random() * allowedNum[i][1]) + allowedNum[i][0]).toString();\n\n\t\t\t\t\tif (match === '?') {\n\t\t\t\t\t\tswitch (i) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\treturn now.getUTCMinutes().toString();\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\treturn now.getUTCHours().toString();\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\treturn now.getUTCDate().toString();\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\treturn now.getUTCMonth().toString();\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\treturn now.getUTCDay().toString();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn match;\n\t\t\t\t})\n\t\t\t)\n\t\t\t.join(' ');\n\t\treturn cron.replace(tokensRegex, (match) => String(Reflect.get(cronTokens, match)));\n\t}\n\n\t/**\n\t * Parse the pattern\n\t * @param cron The pattern to parse\n\t */\n\tprivate static parseString(cron: string): Array<number[]> {\n\t\tconst parts = cron.split(' ');\n\t\tif (parts.length !== 5) throw new Error('Invalid Cron Provided');\n\t\treturn parts.map((part, i) => Cron.parsePart(part, i));\n\t}\n\n\t/**\n\t * Parse the current part\n\t * @param cronPart The part of the pattern to parse\n\t * @param id The id that identifies the current part\n\t */\n\tprivate static parsePart(cronPart: string, id: number): number[] {\n\t\tif (cronPart.includes(',')) {\n\t\t\tconst res: number[] = [];\n\t\t\tfor (const part of cronPart.split(',')) res.push(...Cron.parsePart(part, id));\n\t\t\treturn [...new Set(res)].sort((a, b) => a - b);\n\t\t}\n\n\t\tconst [, wild, minStr, maxStr, step] = partRegex.exec(cronPart)!;\n\t\tlet [min, max] = [parseInt(minStr, 10), parseInt(maxStr, 10)];\n\n\t\t// If '*', set min and max as the minimum and maximum allowed numbers:\n\t\tif (wild) [min, max] = allowedNum[id];\n\t\t// Else if a number was given, but not a maximum nor a step, return it\n\t\t// as only allowed value:\n\t\telse if (!max && !step) return [min];\n\n\t\t// Set min and max as the given numbers, defaulting max to the maximum\n\t\t// allowed, so min is never bigger than max:\n\t\t// This makes min and max be, in the following cases (considering minutes):\n\t\t// -> 1-2 | 1..2\n\t\t// -> 2-1 | 1..2\n\t\t// -> 1/7 | 1, 8, 15, 22, 29, 36, 43, 50, 57\n\t\t[min, max] = [min, max || allowedNum[id][1]].sort((a, b) => a - b);\n\n\t\t// Generate a range\n\t\treturn range(min, max, parseInt(step, 10) || 1);\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../src/lib/constants.ts","../../src/lib/Cron.ts"],"names":["Time"],"mappings":"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","file":"index.mjs","sourcesContent":["export 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\nexport const partRegex = /^(?:(\\*)|(\\d+)(?:-(\\d+))?)(?:\\/(\\d+))?$/;\n\nexport const wildcardRegex = /\\bh\\b|\\B\\?\\B/g;\n\nexport const allowedNum = [\n\t[0, 59],\n\t[0, 23],\n\t[1, 31],\n\t[1, 12],\n\t[0, 6]\n];\n\nexport const predefined = {\n\t'@annually': '0 0 1 1 *',\n\t'@yearly': '0 0 1 1 *',\n\t'@monthly': '0 0 1 * *',\n\t'@weekly': '0 0 * * 0',\n\t'@daily': '0 0 * * *',\n\t'@hourly': '0 * * * *'\n} as const;\n\nexport const cronTokens = {\n\tjan: 1,\n\tfeb: 2,\n\tmar: 3,\n\tapr: 4,\n\tmay: 5,\n\tjun: 6,\n\tjul: 7,\n\taug: 8,\n\tsep: 9,\n\toct: 10,\n\tnov: 11,\n\tdec: 12,\n\tsun: 0,\n\tmon: 1,\n\ttue: 2,\n\twed: 3,\n\tthu: 4,\n\tfri: 5,\n\tsat: 6\n} as const;\n\nexport const tokensRegex = new RegExp(Object.keys(cronTokens).join('|'), 'g');\n","import { range } from '@sapphire/utilities';\nimport { allowedNum, cronTokens, partRegex, predefined, Time, tokensRegex, wildcardRegex } from './constants';\n\n/**\n * Handles Cron strings and generates dates based on the cron string provided.\n * @see https://en.wikipedia.org/wiki/Cron\n */\nexport class Cron {\n\tpublic cron: string;\n\tpublic normalized: string;\n\tpublic minutes: number[];\n\tpublic hours: number[];\n\tpublic days: number[];\n\tpublic months: number[];\n\tpublic dows: number[];\n\n\t/**\n\t * @param cron The cron pattern to use\n\t */\n\tpublic constructor(cron: string) {\n\t\tthis.cron = cron.toLowerCase();\n\t\tthis.normalized = Cron.normalize(this.cron);\n\t\t[this.minutes, this.hours, this.days, this.months, this.dows] = Cron.parseString(this.normalized);\n\t}\n\n\t/**\n\t * Get the next date that matches with the current pattern\n\t * @param outset The Date instance to compare with\n\t * @param origin Whether this next call is origin\n\t */\n\tpublic next(outset: Date = new Date(), origin = true): Date {\n\t\tif (!this.days.includes(outset.getUTCDate()) || !this.months.includes(outset.getUTCMonth() + 1) || !this.dows.includes(outset.getUTCDay())) {\n\t\t\treturn this.next(new Date(outset.getTime() + Time.Day), false);\n\t\t}\n\t\tif (!origin) return new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), this.hours[0], this.minutes[0]));\n\n\t\tconst now = new Date(outset.getTime() + 60000);\n\n\t\tfor (const hour of this.hours) {\n\t\t\tif (hour < now.getUTCHours()) continue;\n\t\t\tfor (const minute of this.minutes) {\n\t\t\t\tif (hour === now.getUTCHours() && minute < now.getUTCMinutes()) continue;\n\t\t\t\treturn new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), hour, minute));\n\t\t\t}\n\t\t}\n\n\t\treturn this.next(new Date(outset.getTime() + Time.Day), false);\n\t}\n\n\t/**\n\t * Returns the string that represents this cron pattern\n\t *\n\t * @returns The string that represents this cron pattern\n\t */\n\tpublic toString() {\n\t\treturn this.cron;\n\t}\n\n\t/**\n\t * Normalize the pattern\n\t * @param cron The pattern to normalize\n\t */\n\tprivate static normalize(cron: string): string {\n\t\tif (Reflect.has(predefined, cron)) return Reflect.get(predefined, cron);\n\t\tconst now = new Date();\n\t\tcron = cron\n\t\t\t.split(' ')\n\t\t\t.map((val, i) =>\n\t\t\t\tval.replace(wildcardRegex, (match) => {\n\t\t\t\t\tif (match === 'h') return (Math.floor(Math.random() * allowedNum[i][1]) + allowedNum[i][0]).toString();\n\n\t\t\t\t\tif (match === '?') {\n\t\t\t\t\t\tswitch (i) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\treturn now.getUTCMinutes().toString();\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\treturn now.getUTCHours().toString();\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\treturn now.getUTCDate().toString();\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\treturn now.getUTCMonth().toString();\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\treturn now.getUTCDay().toString();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn match;\n\t\t\t\t})\n\t\t\t)\n\t\t\t.join(' ');\n\t\treturn cron.replace(tokensRegex, (match) => String(Reflect.get(cronTokens, match)));\n\t}\n\n\t/**\n\t * Parse the pattern\n\t * @param cron The pattern to parse\n\t */\n\tprivate static parseString(cron: string): Array<number[]> {\n\t\tconst parts = cron.split(' ');\n\t\tif (parts.length !== 5) throw new Error('Invalid Cron Provided');\n\t\treturn parts.map((part, i) => Cron.parsePart(part, i));\n\t}\n\n\t/**\n\t * Parse the current part\n\t * @param cronPart The part of the pattern to parse\n\t * @param id The id that identifies the current part\n\t */\n\tprivate static parsePart(cronPart: string, id: number): number[] {\n\t\tif (cronPart.includes(',')) {\n\t\t\tconst res: number[] = [];\n\t\t\tfor (const part of cronPart.split(',')) res.push(...Cron.parsePart(part, id));\n\t\t\treturn [...new Set(res)].sort((a, b) => a - b);\n\t\t}\n\n\t\tconst [, wild, minStr, maxStr, step] = partRegex.exec(cronPart)!;\n\t\tlet [min, max] = [parseInt(minStr, 10), parseInt(maxStr, 10)];\n\n\t\t// If '*', set min and max as the minimum and maximum allowed numbers:\n\t\tif (wild) [min, max] = allowedNum[id];\n\t\t// Else if a number was given, but not a maximum nor a step, return it\n\t\t// as only allowed value:\n\t\telse if (!max && !step) return [min];\n\n\t\t// Set min and max as the given numbers, defaulting max to the maximum\n\t\t// allowed, so min is never bigger than max:\n\t\t// This makes min and max be, in the following cases (considering minutes):\n\t\t// -> 1-2 | 1..2\n\t\t// -> 2-1 | 1..2\n\t\t// -> 1/7 | 1, 8, 15, 22, 29, 36, 43, 50, 57\n\t\t[min, max] = [min, max || allowedNum[id][1]].sort((a, b) => a - b);\n\n\t\t// Generate a range\n\t\treturn range(min, max, parseInt(step, 10) || 1);\n\t}\n}\n"]}
@@ -4,10 +4,7 @@ var SapphireCron = (function (exports) {
4
4
  var __defProp = Object.defineProperty;
5
5
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
6
  var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
- var __publicField = (obj, key, value) => {
8
- __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
9
- return value;
10
- };
7
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
11
8
 
12
9
  // src/lib/constants.ts
13
10
  var Time = /* @__PURE__ */ ((Time2) => {
@@ -63,7 +60,7 @@ var SapphireCron = (function (exports) {
63
60
  };
64
61
  var tokensRegex = new RegExp(Object.keys(cronTokens).join("|"), "g");
65
62
 
66
- // ../utilities/dist/esm/chunk-G5GHKT7C.mjs
63
+ // ../utilities/dist/esm/chunk-PAWJFY3S.mjs
67
64
  var __defProp2 = Object.defineProperty;
68
65
  var __name2 = /* @__PURE__ */ __name((target, value) => __defProp2(target, "name", { value, configurable: true }), "__name");
69
66
 
@@ -100,32 +97,35 @@ var SapphireCron = (function (exports) {
100
97
  if (!this.days.includes(outset.getUTCDate()) || !this.months.includes(outset.getUTCMonth() + 1) || !this.dows.includes(outset.getUTCDay())) {
101
98
  return this.next(new Date(outset.getTime() + 864e5 /* Day */), false);
102
99
  }
103
- if (!origin)
104
- return new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), this.hours[0], this.minutes[0]));
100
+ if (!origin) return new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), this.hours[0], this.minutes[0]));
105
101
  const now = new Date(outset.getTime() + 6e4);
106
102
  for (const hour of this.hours) {
107
- if (hour < now.getUTCHours())
108
- continue;
103
+ if (hour < now.getUTCHours()) continue;
109
104
  for (const minute of this.minutes) {
110
- if (hour === now.getUTCHours() && minute < now.getUTCMinutes())
111
- continue;
105
+ if (hour === now.getUTCHours() && minute < now.getUTCMinutes()) continue;
112
106
  return new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), hour, minute));
113
107
  }
114
108
  }
115
109
  return this.next(new Date(outset.getTime() + 864e5 /* Day */), false);
116
110
  }
111
+ /**
112
+ * Returns the string that represents this cron pattern
113
+ *
114
+ * @returns The string that represents this cron pattern
115
+ */
116
+ toString() {
117
+ return this.cron;
118
+ }
117
119
  /**
118
120
  * Normalize the pattern
119
121
  * @param cron The pattern to normalize
120
122
  */
121
123
  static normalize(cron) {
122
- if (Reflect.has(predefined, cron))
123
- return Reflect.get(predefined, cron);
124
+ if (Reflect.has(predefined, cron)) return Reflect.get(predefined, cron);
124
125
  const now = /* @__PURE__ */ new Date();
125
126
  cron = cron.split(" ").map(
126
127
  (val, i) => val.replace(wildcardRegex, (match) => {
127
- if (match === "h")
128
- return (Math.floor(Math.random() * allowedNum[i][1]) + allowedNum[i][0]).toString();
128
+ if (match === "h") return (Math.floor(Math.random() * allowedNum[i][1]) + allowedNum[i][0]).toString();
129
129
  if (match === "?") {
130
130
  switch (i) {
131
131
  case 0:
@@ -151,8 +151,7 @@ var SapphireCron = (function (exports) {
151
151
  */
152
152
  static parseString(cron) {
153
153
  const parts = cron.split(" ");
154
- if (parts.length !== 5)
155
- throw new Error("Invalid Cron Provided");
154
+ if (parts.length !== 5) throw new Error("Invalid Cron Provided");
156
155
  return parts.map((part, i) => _Cron.parsePart(part, i));
157
156
  }
158
157
  /**
@@ -163,16 +162,13 @@ var SapphireCron = (function (exports) {
163
162
  static parsePart(cronPart, id) {
164
163
  if (cronPart.includes(",")) {
165
164
  const res = [];
166
- for (const part of cronPart.split(","))
167
- res.push(..._Cron.parsePart(part, id));
165
+ for (const part of cronPart.split(",")) res.push(..._Cron.parsePart(part, id));
168
166
  return [...new Set(res)].sort((a, b) => a - b);
169
167
  }
170
168
  const [, wild, minStr, maxStr, step] = partRegex.exec(cronPart);
171
169
  let [min, max] = [parseInt(minStr, 10), parseInt(maxStr, 10)];
172
- if (wild)
173
- [min, max] = allowedNum[id];
174
- else if (!max && !step)
175
- return [min];
170
+ if (wild) [min, max] = allowedNum[id];
171
+ else if (!max && !step) return [min];
176
172
  [min, max] = [min, max || allowedNum[id][1]].sort((a, b) => a - b);
177
173
  return range(min, max, parseInt(step, 10) || 1);
178
174
  }
@@ -192,5 +188,5 @@ var SapphireCron = (function (exports) {
192
188
  return exports;
193
189
 
194
190
  })({});
195
- //# sourceMappingURL=out.js.map
191
+ //# sourceMappingURL=index.global.js.map
196
192
  //# sourceMappingURL=index.global.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/constants.ts","../../../utilities/dist/esm/chunk-G5GHKT7C.mjs","../../../utilities/src/lib/range.ts","../../src/lib/Cron.ts"],"names":["Time","__defProp","__name"],"mappings":"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","sourcesContent":["export 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\nexport const partRegex = /^(?:(\\*)|(\\d+)(?:-(\\d+))?)(?:\\/(\\d+))?$/;\n\nexport const wildcardRegex = /\\bh\\b|\\B\\?\\B/g;\n\nexport const allowedNum = [\n\t[0, 59],\n\t[0, 23],\n\t[1, 31],\n\t[1, 12],\n\t[0, 6]\n];\n\nexport const predefined = {\n\t'@annually': '0 0 1 1 *',\n\t'@yearly': '0 0 1 1 *',\n\t'@monthly': '0 0 1 * *',\n\t'@weekly': '0 0 * * 0',\n\t'@daily': '0 0 * * *',\n\t'@hourly': '0 * * * *'\n} as const;\n\nexport const cronTokens = {\n\tjan: 1,\n\tfeb: 2,\n\tmar: 3,\n\tapr: 4,\n\tmay: 5,\n\tjun: 6,\n\tjul: 7,\n\taug: 8,\n\tsep: 9,\n\toct: 10,\n\tnov: 11,\n\tdec: 12,\n\tsun: 0,\n\tmon: 1,\n\ttue: 2,\n\twed: 3,\n\tthu: 4,\n\tfri: 5,\n\tsat: 6\n} as const;\n\nexport const tokensRegex = new RegExp(Object.keys(cronTokens).join('|'), 'g');\n","var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\nexport { __name };\n//# sourceMappingURL=out.js.map\n//# sourceMappingURL=chunk-G5GHKT7C.mjs.map","/**\n * Get an array of numbers with the selected range\n * @param min The minimum value\n * @param max The maximum value\n * @param step The step value\n */\nexport function range(min: number, max: number, step: number): number[] {\n\treturn new Array(Math.floor((max - min) / step) + 1).fill(0).map((_val, i) => min + i * step);\n}\n","import { range } from '@sapphire/utilities';\nimport { allowedNum, cronTokens, partRegex, predefined, Time, tokensRegex, wildcardRegex } from './constants';\n\n/**\n * Handles Cron strings and generates dates based on the cron string provided.\n * @see https://en.wikipedia.org/wiki/Cron\n */\nexport class Cron {\n\tpublic cron: string;\n\tpublic normalized: string;\n\tpublic minutes: number[];\n\tpublic hours: number[];\n\tpublic days: number[];\n\tpublic months: number[];\n\tpublic dows: number[];\n\n\t/**\n\t * @param cron The cron pattern to use\n\t */\n\tpublic constructor(cron: string) {\n\t\tthis.cron = cron.toLowerCase();\n\t\tthis.normalized = Cron.normalize(this.cron);\n\t\t[this.minutes, this.hours, this.days, this.months, this.dows] = Cron.parseString(this.normalized);\n\t}\n\n\t/**\n\t * Get the next date that matches with the current pattern\n\t * @param outset The Date instance to compare with\n\t * @param origin Whether this next call is origin\n\t */\n\tpublic next(outset: Date = new Date(), origin = true): Date {\n\t\tif (!this.days.includes(outset.getUTCDate()) || !this.months.includes(outset.getUTCMonth() + 1) || !this.dows.includes(outset.getUTCDay())) {\n\t\t\treturn this.next(new Date(outset.getTime() + Time.Day), false);\n\t\t}\n\t\tif (!origin) return new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), this.hours[0], this.minutes[0]));\n\n\t\tconst now = new Date(outset.getTime() + 60000);\n\n\t\tfor (const hour of this.hours) {\n\t\t\tif (hour < now.getUTCHours()) continue;\n\t\t\tfor (const minute of this.minutes) {\n\t\t\t\tif (hour === now.getUTCHours() && minute < now.getUTCMinutes()) continue;\n\t\t\t\treturn new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), hour, minute));\n\t\t\t}\n\t\t}\n\n\t\treturn this.next(new Date(outset.getTime() + Time.Day), false);\n\t}\n\n\t/**\n\t * Normalize the pattern\n\t * @param cron The pattern to normalize\n\t */\n\tprivate static normalize(cron: string): string {\n\t\tif (Reflect.has(predefined, cron)) return Reflect.get(predefined, cron);\n\t\tconst now = new Date();\n\t\tcron = cron\n\t\t\t.split(' ')\n\t\t\t.map((val, i) =>\n\t\t\t\tval.replace(wildcardRegex, (match) => {\n\t\t\t\t\tif (match === 'h') return (Math.floor(Math.random() * allowedNum[i][1]) + allowedNum[i][0]).toString();\n\n\t\t\t\t\tif (match === '?') {\n\t\t\t\t\t\tswitch (i) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\treturn now.getUTCMinutes().toString();\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\treturn now.getUTCHours().toString();\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\treturn now.getUTCDate().toString();\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\treturn now.getUTCMonth().toString();\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\treturn now.getUTCDay().toString();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn match;\n\t\t\t\t})\n\t\t\t)\n\t\t\t.join(' ');\n\t\treturn cron.replace(tokensRegex, (match) => String(Reflect.get(cronTokens, match)));\n\t}\n\n\t/**\n\t * Parse the pattern\n\t * @param cron The pattern to parse\n\t */\n\tprivate static parseString(cron: string): Array<number[]> {\n\t\tconst parts = cron.split(' ');\n\t\tif (parts.length !== 5) throw new Error('Invalid Cron Provided');\n\t\treturn parts.map((part, i) => Cron.parsePart(part, i));\n\t}\n\n\t/**\n\t * Parse the current part\n\t * @param cronPart The part of the pattern to parse\n\t * @param id The id that identifies the current part\n\t */\n\tprivate static parsePart(cronPart: string, id: number): number[] {\n\t\tif (cronPart.includes(',')) {\n\t\t\tconst res: number[] = [];\n\t\t\tfor (const part of cronPart.split(',')) res.push(...Cron.parsePart(part, id));\n\t\t\treturn [...new Set(res)].sort((a, b) => a - b);\n\t\t}\n\n\t\tconst [, wild, minStr, maxStr, step] = partRegex.exec(cronPart)!;\n\t\tlet [min, max] = [parseInt(minStr, 10), parseInt(maxStr, 10)];\n\n\t\t// If '*', set min and max as the minimum and maximum allowed numbers:\n\t\tif (wild) [min, max] = allowedNum[id];\n\t\t// Else if a number was given, but not a maximum nor a step, return it\n\t\t// as only allowed value:\n\t\telse if (!max && !step) return [min];\n\n\t\t// Set min and max as the given numbers, defaulting max to the maximum\n\t\t// allowed, so min is never bigger than max:\n\t\t// This makes min and max be, in the following cases (considering minutes):\n\t\t// -> 1-2 | 1..2\n\t\t// -> 2-1 | 1..2\n\t\t// -> 1/7 | 1, 8, 15, 22, 29, 36, 43, 50, 57\n\t\t[min, max] = [min, max || allowedNum[id][1]].sort((a, b) => a - b);\n\n\t\t// Generate a range\n\t\treturn range(min, max, parseInt(step, 10) || 1);\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../src/lib/constants.ts","../../../utilities/dist/esm/chunk-PAWJFY3S.mjs","../../../utilities/src/lib/range.ts","../../src/lib/Cron.ts"],"names":["Time","__defProp","__name"],"mappings":";;;;;;;;;AAAY,MAAA,IAAA,qBAAAA,KAAL,KAAA;EACN,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,gBAAa,IAAb,CAAA,GAAA,YAAA,CAAA;EACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,iBAAc,IAAd,CAAA,GAAA,aAAA,CAAA;EACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,iBAAc,CAAd,CAAA,GAAA,aAAA,CAAA;EACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,YAAS,GAAT,CAAA,GAAA,QAAA,CAAA;EACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,YAAS,GAAT,CAAA,GAAA,QAAA,CAAA;EACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,UAAO,IAAP,CAAA,GAAA,MAAA,CAAA;EACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,SAAM,KAAN,CAAA,GAAA,KAAA,CAAA;EACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,UAAO,MAAP,CAAA,GAAA,MAAA,CAAA;EACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,WAAQ,MAAR,CAAA,GAAA,OAAA,CAAA;EACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,UAAO,OAAP,CAAA,GAAA,MAAA,CAAA;EAVW,EAAAA,OAAAA,KAAAA,CAAAA;EAAA,CAAA,EAAA,IAAA,IAAA,EAAA,EAAA;AAaL,MAAM,SAAY,GAAA,0CAAA;AAElB,MAAM,aAAgB,GAAA,gBAAA;AAEtB,MAAM,UAAa,GAAA;EAAA,EACzB,CAAC,GAAG,EAAE,CAAA;EAAA,EACN,CAAC,GAAG,EAAE,CAAA;EAAA,EACN,CAAC,GAAG,EAAE,CAAA;EAAA,EACN,CAAC,GAAG,EAAE,CAAA;EAAA,EACN,CAAC,GAAG,CAAC,CAAA;EACN,EAAA;AAEO,MAAM,UAAa,GAAA;EAAA,EACzB,WAAa,EAAA,WAAA;EAAA,EACb,SAAW,EAAA,WAAA;EAAA,EACX,UAAY,EAAA,WAAA;EAAA,EACZ,SAAW,EAAA,WAAA;EAAA,EACX,QAAU,EAAA,WAAA;EAAA,EACV,SAAW,EAAA,WAAA;EACZ,EAAA;AAEO,MAAM,UAAa,GAAA;EAAA,EACzB,GAAK,EAAA,CAAA;EAAA,EACL,GAAK,EAAA,CAAA;EAAA,EACL,GAAK,EAAA,CAAA;EAAA,EACL,GAAK,EAAA,CAAA;EAAA,EACL,GAAK,EAAA,CAAA;EAAA,EACL,GAAK,EAAA,CAAA;EAAA,EACL,GAAK,EAAA,CAAA;EAAA,EACL,GAAK,EAAA,CAAA;EAAA,EACL,GAAK,EAAA,CAAA;EAAA,EACL,GAAK,EAAA,EAAA;EAAA,EACL,GAAK,EAAA,EAAA;EAAA,EACL,GAAK,EAAA,EAAA;EAAA,EACL,GAAK,EAAA,CAAA;EAAA,EACL,GAAK,EAAA,CAAA;EAAA,EACL,GAAK,EAAA,CAAA;EAAA,EACL,GAAK,EAAA,CAAA;EAAA,EACL,GAAK,EAAA,CAAA;EAAA,EACL,GAAK,EAAA,CAAA;EAAA,EACL,GAAK,EAAA,CAAA;EACN,EAAA;AAEa,MAAA,WAAA,GAAc,IAAI,MAAA,CAAO,MAAO,CAAA,IAAA,CAAK,UAAU,CAAE,CAAA,IAAA,CAAK,GAAG,CAAA,EAAG,GAAG,EAAA;;;ECxD5E,IAAIC,aAAY,MAAO,CAAA,cAAA,CAAA;EACvB,IAAIC,OAAS,mBAAA,MAAA,CAAA,CAAC,MAAQ,EAAA,KAAA,KAAUD,UAAU,CAAA,MAAA,EAAQ,MAAQ,EAAA,EAAE,KAAO,EAAA,YAAA,EAAc,IAAK,EAAC,CAA1E,EAAA,QAAA,CAAA,CAAA;;;ECKN,SAAS,KAAA,CAAM,GAAa,EAAA,GAAA,EAAa,IAAwB,EAAA;EACvE,EAAA,OAAO,IAAI,KAAM,CAAA,IAAA,CAAK,OAAO,GAAM,GAAA,GAAA,IAAO,IAAI,CAAI,GAAA,CAAC,EAAE,IAAK,CAAA,CAAC,EAAE,GAAI,CAAA,CAAC,MAAM,CAAM,KAAA,GAAA,GAAM,IAAI,IAAI,CAAA,CAAA;EAC7F,CAAA;EAFgB,MAAA,CAAA,KAAA,EAAA,OAAA,CAAA,CAAA;EAAAC,OAAAA,CAAA,OAAA,OAAA,CAAA,CAAA;;;ECCT,IAAM,KAAA,GAAN,MAAM,KAAK,CAAA;EAAA;EAAA;EAAA;EAAA,EAYV,YAAY,IAAc,EAAA;EAXjC,IAAO,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;EACP,IAAO,aAAA,CAAA,IAAA,EAAA,YAAA,CAAA,CAAA;EACP,IAAO,aAAA,CAAA,IAAA,EAAA,SAAA,CAAA,CAAA;EACP,IAAO,aAAA,CAAA,IAAA,EAAA,OAAA,CAAA,CAAA;EACP,IAAO,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;EACP,IAAO,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAA;EACP,IAAO,aAAA,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;EAMN,IAAK,IAAA,CAAA,IAAA,GAAO,KAAK,WAAY,EAAA,CAAA;EAC7B,IAAA,IAAA,CAAK,UAAa,GAAA,KAAA,CAAK,SAAU,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;EAC1C,IAAA,CAAC,IAAK,CAAA,OAAA,EAAS,IAAK,CAAA,KAAA,EAAO,KAAK,IAAM,EAAA,IAAA,CAAK,MAAQ,EAAA,IAAA,CAAK,IAAI,CAAA,GAAI,KAAK,CAAA,WAAA,CAAY,KAAK,UAAU,CAAA,CAAA;EAAA,GACjG;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA,EAOO,KAAK,MAAe,mBAAA,IAAI,IAAK,EAAA,EAAG,SAAS,IAAY,EAAA;EAC3D,IAAI,IAAA,CAAC,IAAK,CAAA,IAAA,CAAK,QAAS,CAAA,MAAA,CAAO,YAAY,CAAA,IAAK,CAAC,IAAA,CAAK,MAAO,CAAA,QAAA,CAAS,OAAO,WAAY,EAAA,GAAI,CAAC,CAAA,IAAK,CAAC,IAAA,CAAK,KAAK,QAAS,CAAA,MAAA,CAAO,SAAU,EAAC,CAAG,EAAA;EAC3I,MAAO,OAAA,IAAA,CAAK,KAAK,IAAI,IAAA,CAAK,OAAO,OAAQ,EAAA,GAAA,KAAA,aAAe,KAAK,CAAA,CAAA;EAAA,KAC9D;EACA,IAAI,IAAA,CAAC,MAAQ,EAAA,OAAO,IAAI,IAAA,CAAK,KAAK,GAAI,CAAA,MAAA,CAAO,cAAe,EAAA,EAAG,MAAO,CAAA,WAAA,IAAe,MAAO,CAAA,UAAA,EAAc,EAAA,IAAA,CAAK,KAAM,CAAA,CAAC,GAAG,IAAK,CAAA,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA,CAAA;EAEzI,IAAA,MAAM,MAAM,IAAI,IAAA,CAAK,MAAO,CAAA,OAAA,KAAY,GAAK,CAAA,CAAA;EAE7C,IAAW,KAAA,MAAA,IAAA,IAAQ,KAAK,KAAO,EAAA;EAC9B,MAAI,IAAA,IAAA,GAAO,GAAI,CAAA,WAAA,EAAe,EAAA,SAAA;EAC9B,MAAW,KAAA,MAAA,MAAA,IAAU,KAAK,OAAS,EAAA;EAClC,QAAA,IAAI,SAAS,GAAI,CAAA,WAAA,MAAiB,MAAS,GAAA,GAAA,CAAI,eAAiB,EAAA,SAAA;EAChE,QAAA,OAAO,IAAI,IAAA,CAAK,IAAK,CAAA,GAAA,CAAI,OAAO,cAAe,EAAA,EAAG,MAAO,CAAA,WAAA,IAAe,MAAO,CAAA,UAAA,EAAc,EAAA,IAAA,EAAM,MAAM,CAAC,CAAA,CAAA;EAAA,OAC3G;EAAA,KACD;EAEA,IAAO,OAAA,IAAA,CAAK,KAAK,IAAI,IAAA,CAAK,OAAO,OAAQ,EAAA,GAAA,KAAA,aAAe,KAAK,CAAA,CAAA;EAAA,GAC9D;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA,EAOO,QAAW,GAAA;EACjB,IAAA,OAAO,IAAK,CAAA,IAAA,CAAA;EAAA,GACb;EAAA;EAAA;EAAA;EAAA;EAAA,EAMA,OAAe,UAAU,IAAsB,EAAA;EAC9C,IAAI,IAAA,OAAA,CAAQ,IAAI,UAAY,EAAA,IAAI,GAAU,OAAA,OAAA,CAAQ,GAAI,CAAA,UAAA,EAAY,IAAI,CAAA,CAAA;EACtE,IAAM,MAAA,GAAA,uBAAU,IAAK,EAAA,CAAA;EACrB,IAAO,IAAA,GAAA,IAAA,CACL,KAAM,CAAA,GAAG,CACT,CAAA,GAAA;EAAA,MAAI,CAAC,GAAK,EAAA,CAAA,KACV,IAAI,OAAQ,CAAA,aAAA,EAAe,CAAC,KAAU,KAAA;EACrC,QAAA,IAAI,UAAU,GAAK,EAAA,OAAA,CAAQ,KAAK,KAAM,CAAA,IAAA,CAAK,QAAW,GAAA,UAAA,CAAW,CAAC,CAAE,CAAA,CAAC,CAAC,CAAI,GAAA,UAAA,CAAW,CAAC,CAAE,CAAA,CAAC,GAAG,QAAS,EAAA,CAAA;EAErG,QAAA,IAAI,UAAU,GAAK,EAAA;EAClB,UAAA,QAAQ,CAAG;EAAA,YACV,KAAK,CAAA;EACJ,cAAO,OAAA,GAAA,CAAI,aAAc,EAAA,CAAE,QAAS,EAAA,CAAA;EAAA,YACrC,KAAK,CAAA;EACJ,cAAO,OAAA,GAAA,CAAI,WAAY,EAAA,CAAE,QAAS,EAAA,CAAA;EAAA,YACnC,KAAK,CAAA;EACJ,cAAO,OAAA,GAAA,CAAI,UAAW,EAAA,CAAE,QAAS,EAAA,CAAA;EAAA,YAClC,KAAK,CAAA;EACJ,cAAO,OAAA,GAAA,CAAI,WAAY,EAAA,CAAE,QAAS,EAAA,CAAA;EAAA,YACnC,KAAK,CAAA;EACJ,cAAO,OAAA,GAAA,CAAI,SAAU,EAAA,CAAE,QAAS,EAAA,CAAA;EAAA,WAClC;EAAA,SACD;EAEA,QAAO,OAAA,KAAA,CAAA;EAAA,OACP,CAAA;EAAA,KACF,CACC,KAAK,GAAG,CAAA,CAAA;EACV,IAAO,OAAA,IAAA,CAAK,OAAQ,CAAA,WAAA,EAAa,CAAC,KAAA,KAAU,MAAO,CAAA,OAAA,CAAQ,GAAI,CAAA,UAAA,EAAY,KAAK,CAAC,CAAC,CAAA,CAAA;EAAA,GACnF;EAAA;EAAA;EAAA;EAAA;EAAA,EAMA,OAAe,YAAY,IAA+B,EAAA;EACzD,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;EAC5B,IAAA,IAAI,MAAM,MAAW,KAAA,CAAA,EAAS,MAAA,IAAI,MAAM,uBAAuB,CAAA,CAAA;EAC/D,IAAO,OAAA,KAAA,CAAM,IAAI,CAAC,IAAA,EAAM,MAAM,KAAK,CAAA,SAAA,CAAU,IAAM,EAAA,CAAC,CAAC,CAAA,CAAA;EAAA,GACtD;EAAA;EAAA;EAAA;EAAA;EAAA;EAAA,EAOA,OAAe,SAAU,CAAA,QAAA,EAAkB,EAAsB,EAAA;EAChE,IAAI,IAAA,QAAA,CAAS,QAAS,CAAA,GAAG,CAAG,EAAA;EAC3B,MAAA,MAAM,MAAgB,EAAC,CAAA;EACvB,MAAA,KAAA,MAAW,IAAQ,IAAA,QAAA,CAAS,KAAM,CAAA,GAAG,CAAG,EAAA,GAAA,CAAI,IAAK,CAAA,GAAG,KAAK,CAAA,SAAA,CAAU,IAAM,EAAA,EAAE,CAAC,CAAA,CAAA;EAC5E,MAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,GAAG,CAAC,CAAE,CAAA,IAAA,CAAK,CAAC,CAAA,EAAG,CAAM,KAAA,CAAA,GAAI,CAAC,CAAA,CAAA;EAAA,KAC9C;EAEA,IAAM,MAAA,GAAG,IAAM,EAAA,MAAA,EAAQ,QAAQ,IAAI,CAAA,GAAI,SAAU,CAAA,IAAA,CAAK,QAAQ,CAAA,CAAA;EAC9D,IAAA,IAAI,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,CAAC,QAAA,CAAS,MAAQ,EAAA,EAAE,CAAG,EAAA,QAAA,CAAS,MAAQ,EAAA,EAAE,CAAC,CAAA,CAAA;EAG5D,IAAA,IAAI,MAAO,CAAA,GAAA,EAAK,GAAG,CAAA,GAAI,WAAW,EAAE,CAAA,CAAA;EAAA,SAAA,IAG3B,CAAC,GAAO,IAAA,CAAC,IAAM,EAAA,OAAO,CAAC,GAAG,CAAA,CAAA;EAQnC,IAAA,CAAC,KAAK,GAAG,CAAA,GAAI,CAAC,GAAA,EAAK,OAAO,UAAW,CAAA,EAAE,CAAE,CAAA,CAAC,CAAC,CAAE,CAAA,IAAA,CAAK,CAAC,CAAG,EAAA,CAAA,KAAM,IAAI,CAAC,CAAA,CAAA;EAGjE,IAAA,OAAO,MAAM,GAAK,EAAA,GAAA,EAAK,SAAS,IAAM,EAAA,EAAE,KAAK,CAAC,CAAA,CAAA;EAAA,GAC/C;EACD,CAAA,CAAA;EAhIkB,MAAA,CAAA,KAAA,EAAA,MAAA,CAAA,CAAA;AAAX,MAAM,IAAN,GAAA","file":"index.global.js","sourcesContent":["export 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\nexport const partRegex = /^(?:(\\*)|(\\d+)(?:-(\\d+))?)(?:\\/(\\d+))?$/;\n\nexport const wildcardRegex = /\\bh\\b|\\B\\?\\B/g;\n\nexport const allowedNum = [\n\t[0, 59],\n\t[0, 23],\n\t[1, 31],\n\t[1, 12],\n\t[0, 6]\n];\n\nexport const predefined = {\n\t'@annually': '0 0 1 1 *',\n\t'@yearly': '0 0 1 1 *',\n\t'@monthly': '0 0 1 * *',\n\t'@weekly': '0 0 * * 0',\n\t'@daily': '0 0 * * *',\n\t'@hourly': '0 * * * *'\n} as const;\n\nexport const cronTokens = {\n\tjan: 1,\n\tfeb: 2,\n\tmar: 3,\n\tapr: 4,\n\tmay: 5,\n\tjun: 6,\n\tjul: 7,\n\taug: 8,\n\tsep: 9,\n\toct: 10,\n\tnov: 11,\n\tdec: 12,\n\tsun: 0,\n\tmon: 1,\n\ttue: 2,\n\twed: 3,\n\tthu: 4,\n\tfri: 5,\n\tsat: 6\n} as const;\n\nexport const tokensRegex = new RegExp(Object.keys(cronTokens).join('|'), 'g');\n","var __defProp = Object.defineProperty;\nvar __name = (target, value) => __defProp(target, \"name\", { value, configurable: true });\n\nexport { __name };\n//# sourceMappingURL=chunk-PAWJFY3S.mjs.map\n//# sourceMappingURL=chunk-PAWJFY3S.mjs.map","/**\n * Get an array of numbers with the selected range\n * @param min The minimum value\n * @param max The maximum value\n * @param step The step value\n */\nexport function range(min: number, max: number, step: number): number[] {\n\treturn new Array(Math.floor((max - min) / step) + 1).fill(0).map((_val, i) => min + i * step);\n}\n","import { range } from '@sapphire/utilities';\nimport { allowedNum, cronTokens, partRegex, predefined, Time, tokensRegex, wildcardRegex } from './constants';\n\n/**\n * Handles Cron strings and generates dates based on the cron string provided.\n * @see https://en.wikipedia.org/wiki/Cron\n */\nexport class Cron {\n\tpublic cron: string;\n\tpublic normalized: string;\n\tpublic minutes: number[];\n\tpublic hours: number[];\n\tpublic days: number[];\n\tpublic months: number[];\n\tpublic dows: number[];\n\n\t/**\n\t * @param cron The cron pattern to use\n\t */\n\tpublic constructor(cron: string) {\n\t\tthis.cron = cron.toLowerCase();\n\t\tthis.normalized = Cron.normalize(this.cron);\n\t\t[this.minutes, this.hours, this.days, this.months, this.dows] = Cron.parseString(this.normalized);\n\t}\n\n\t/**\n\t * Get the next date that matches with the current pattern\n\t * @param outset The Date instance to compare with\n\t * @param origin Whether this next call is origin\n\t */\n\tpublic next(outset: Date = new Date(), origin = true): Date {\n\t\tif (!this.days.includes(outset.getUTCDate()) || !this.months.includes(outset.getUTCMonth() + 1) || !this.dows.includes(outset.getUTCDay())) {\n\t\t\treturn this.next(new Date(outset.getTime() + Time.Day), false);\n\t\t}\n\t\tif (!origin) return new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), this.hours[0], this.minutes[0]));\n\n\t\tconst now = new Date(outset.getTime() + 60000);\n\n\t\tfor (const hour of this.hours) {\n\t\t\tif (hour < now.getUTCHours()) continue;\n\t\t\tfor (const minute of this.minutes) {\n\t\t\t\tif (hour === now.getUTCHours() && minute < now.getUTCMinutes()) continue;\n\t\t\t\treturn new Date(Date.UTC(outset.getUTCFullYear(), outset.getUTCMonth(), outset.getUTCDate(), hour, minute));\n\t\t\t}\n\t\t}\n\n\t\treturn this.next(new Date(outset.getTime() + Time.Day), false);\n\t}\n\n\t/**\n\t * Returns the string that represents this cron pattern\n\t *\n\t * @returns The string that represents this cron pattern\n\t */\n\tpublic toString() {\n\t\treturn this.cron;\n\t}\n\n\t/**\n\t * Normalize the pattern\n\t * @param cron The pattern to normalize\n\t */\n\tprivate static normalize(cron: string): string {\n\t\tif (Reflect.has(predefined, cron)) return Reflect.get(predefined, cron);\n\t\tconst now = new Date();\n\t\tcron = cron\n\t\t\t.split(' ')\n\t\t\t.map((val, i) =>\n\t\t\t\tval.replace(wildcardRegex, (match) => {\n\t\t\t\t\tif (match === 'h') return (Math.floor(Math.random() * allowedNum[i][1]) + allowedNum[i][0]).toString();\n\n\t\t\t\t\tif (match === '?') {\n\t\t\t\t\t\tswitch (i) {\n\t\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t\treturn now.getUTCMinutes().toString();\n\t\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t\treturn now.getUTCHours().toString();\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\treturn now.getUTCDate().toString();\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\treturn now.getUTCMonth().toString();\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\treturn now.getUTCDay().toString();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn match;\n\t\t\t\t})\n\t\t\t)\n\t\t\t.join(' ');\n\t\treturn cron.replace(tokensRegex, (match) => String(Reflect.get(cronTokens, match)));\n\t}\n\n\t/**\n\t * Parse the pattern\n\t * @param cron The pattern to parse\n\t */\n\tprivate static parseString(cron: string): Array<number[]> {\n\t\tconst parts = cron.split(' ');\n\t\tif (parts.length !== 5) throw new Error('Invalid Cron Provided');\n\t\treturn parts.map((part, i) => Cron.parsePart(part, i));\n\t}\n\n\t/**\n\t * Parse the current part\n\t * @param cronPart The part of the pattern to parse\n\t * @param id The id that identifies the current part\n\t */\n\tprivate static parsePart(cronPart: string, id: number): number[] {\n\t\tif (cronPart.includes(',')) {\n\t\t\tconst res: number[] = [];\n\t\t\tfor (const part of cronPart.split(',')) res.push(...Cron.parsePart(part, id));\n\t\t\treturn [...new Set(res)].sort((a, b) => a - b);\n\t\t}\n\n\t\tconst [, wild, minStr, maxStr, step] = partRegex.exec(cronPart)!;\n\t\tlet [min, max] = [parseInt(minStr, 10), parseInt(maxStr, 10)];\n\n\t\t// If '*', set min and max as the minimum and maximum allowed numbers:\n\t\tif (wild) [min, max] = allowedNum[id];\n\t\t// Else if a number was given, but not a maximum nor a step, return it\n\t\t// as only allowed value:\n\t\telse if (!max && !step) return [min];\n\n\t\t// Set min and max as the given numbers, defaulting max to the maximum\n\t\t// allowed, so min is never bigger than max:\n\t\t// This makes min and max be, in the following cases (considering minutes):\n\t\t// -> 1-2 | 1..2\n\t\t// -> 2-1 | 1..2\n\t\t// -> 1/7 | 1, 8, 15, 22, 29, 36, 43, 50, 57\n\t\t[min, max] = [min, max || allowedNum[id][1]].sort((a, b) => a - b);\n\n\t\t// Generate a range\n\t\treturn range(min, max, parseInt(step, 10) || 1);\n\t}\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sapphire/cron",
3
- "version": "1.1.4-pr-725.25672a58.0",
3
+ "version": "1.2.0-next.db356eb0",
4
4
  "description": "A cron utility library for JavaScript.",
5
5
  "author": "@sapphire",
6
6
  "license": "MIT",
@@ -25,12 +25,13 @@
25
25
  "scripts": {
26
26
  "test": "vitest run",
27
27
  "lint": "eslint src tests --ext ts --fix -c ../../.eslintrc",
28
- "build": "tsup && yarn build:rename-cjs-index",
29
- "build:rename-cjs-index": "node ../../scripts/rename-cjs-index.mjs",
28
+ "build": "yarn gen-index && tsup && yarn build:rename-cjs-index",
29
+ "build:rename-cjs-index": "tsx ../../scripts/rename-cjs-index.cts",
30
30
  "docs": "typedoc-json-parser",
31
31
  "prepack": "yarn build",
32
32
  "bump": "cliff-jumper",
33
- "check-update": "cliff-jumper --dry-run"
33
+ "check-update": "cliff-jumper --dry-run",
34
+ "gen-index": "tsx ../../scripts/gen-index.cts -w cron"
34
35
  },
35
36
  "repository": {
36
37
  "type": "git",
@@ -62,15 +63,16 @@
62
63
  "access": "public"
63
64
  },
64
65
  "dependencies": {
65
- "@sapphire/utilities": "^3.15.3"
66
+ "@sapphire/utilities": "^3.17.0"
66
67
  },
67
68
  "devDependencies": {
68
- "@favware/cliff-jumper": "^3.0.1",
69
- "@vitest/coverage-v8": "^1.4.0",
70
- "tsup": "^8.0.2",
71
- "typedoc": "^0.25.12",
72
- "typedoc-json-parser": "^9.0.1",
73
- "typescript": "^5.4.2",
74
- "vitest": "^1.4.0"
69
+ "@favware/cliff-jumper": "^4.0.3",
70
+ "@vitest/coverage-v8": "^2.0.4",
71
+ "tsup": "^8.2.3",
72
+ "tsx": "^4.16.2",
73
+ "typedoc": "^0.25.13",
74
+ "typedoc-json-parser": "^10.0.0",
75
+ "typescript": "~5.4.5",
76
+ "vitest": "^2.0.4"
75
77
  }
76
78
  }