@sapphire/cron 1.1.4-pr-725.25672a58.0 → 1.2.0-next.bedc937e
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 +1 -3
- package/dist/cjs/index.cjs +19 -23
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +6 -0
- package/dist/esm/index.d.mts +6 -0
- package/dist/esm/index.mjs +19 -23
- package/dist/esm/index.mjs.map +1 -1
- package/dist/iife/index.global.js +20 -24
- package/dist/iife/index.global.js.map +1 -1
- package/package.json +14 -12
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
|
|
21
|
+
- [Contributors](#contributors)
|
|
24
22
|
|
|
25
23
|
## Features
|
|
26
24
|
|
package/dist/cjs/index.cjs
CHANGED
|
@@ -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
|
-
|
|
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=
|
|
175
|
+
//# sourceMappingURL=index.cjs.map
|
|
180
176
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -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"]}
|
package/dist/cjs/index.d.cts
CHANGED
|
@@ -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
|
package/dist/esm/index.d.mts
CHANGED
|
@@ -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
|
package/dist/esm/index.mjs
CHANGED
|
@@ -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
|
-
|
|
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=
|
|
166
|
+
//# sourceMappingURL=index.mjs.map
|
|
171
167
|
//# sourceMappingURL=index.mjs.map
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -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-
|
|
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
|
-
|
|
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=
|
|
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":"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","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.
|
|
3
|
+
"version": "1.2.0-next.bedc937e",
|
|
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": "
|
|
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.
|
|
66
|
+
"@sapphire/utilities": "^3.17.0"
|
|
66
67
|
},
|
|
67
68
|
"devDependencies": {
|
|
68
|
-
"@favware/cliff-jumper": "^
|
|
69
|
-
"@vitest/coverage-v8": "^
|
|
70
|
-
"tsup": "^8.
|
|
71
|
-
"
|
|
72
|
-
"typedoc
|
|
73
|
-
"
|
|
74
|
-
"
|
|
69
|
+
"@favware/cliff-jumper": "^4.0.3",
|
|
70
|
+
"@vitest/coverage-v8": "^2.0.5",
|
|
71
|
+
"tsup": "^8.2.4",
|
|
72
|
+
"tsx": "^4.16.5",
|
|
73
|
+
"typedoc": "^0.25.13",
|
|
74
|
+
"typedoc-json-parser": "^10.0.0",
|
|
75
|
+
"typescript": "~5.4.5",
|
|
76
|
+
"vitest": "^2.0.5"
|
|
75
77
|
}
|
|
76
78
|
}
|