@sapphire/cron 1.2.2-next.ff2c792d → 1.3.0-pr-935.7da5c8bb

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.
@@ -1 +1 @@
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"]}
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"]}
@@ -1 +1 @@
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"]}
1
+ {"version":3,"sources":["../../src/lib/constants.ts","../../src/lib/Cron.ts"],"names":["Time"],"mappings":";;;;;;;;AAAO,IAAK,IAAA,qBAAAA,KAAAA,KAAL;AACN,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,gBAAa,IAAA,CAAA,GAAb,YAAA;AACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,iBAAc,IAAA,CAAA,GAAd,aAAA;AACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,iBAAc,CAAA,CAAA,GAAd,aAAA;AACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,YAAS,GAAA,CAAA,GAAT,QAAA;AACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,YAAS,GAAA,CAAA,GAAT,QAAA;AACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,UAAO,IAAA,CAAA,GAAP,MAAA;AACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,SAAM,KAAA,CAAA,GAAN,KAAA;AACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,UAAO,MAAA,CAAA,GAAP,MAAA;AACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,WAAQ,MAAA,CAAA,GAAR,OAAA;AACA,EAAAA,KAAAA,CAAAA,KAAAA,CAAA,UAAO,OAAA,CAAA,GAAP,MAAA;AAVW,EAAA,OAAAA,KAAAA;AAAA,CAAA,EAAA,IAAA,IAAA,EAAA;AAaL,IAAM,SAAA,GAAY;AAElB,IAAM,aAAA,GAAgB;AAEtB,IAAM,UAAA,GAAa;AAAA,EACzB,CAAC,GAAG,EAAE,CAAA;AAAA,EACN,CAAC,GAAG,EAAE,CAAA;AAAA,EACN,CAAC,GAAG,EAAE,CAAA;AAAA,EACN,CAAC,GAAG,EAAE,CAAA;AAAA,EACN,CAAC,GAAG,CAAC;AACN;AAEO,IAAM,UAAA,GAAa;AAAA,EACzB,WAAA,EAAa,WAAA;AAAA,EACb,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,WAAA;AAAA,EACZ,SAAA,EAAW,WAAA;AAAA,EACX,QAAA,EAAU,WAAA;AAAA,EACV,SAAA,EAAW;AACZ;AAEO,IAAM,UAAA,GAAa;AAAA,EACzB,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,EAAA;AAAA,EACL,GAAA,EAAK,EAAA;AAAA,EACL,GAAA,EAAK,EAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK,CAAA;AAAA,EACL,GAAA,EAAK;AACN;AAEO,IAAM,WAAA,GAAc,IAAI,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,UAAU,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA,EAAG,GAAG;ACjDrE,IAAM,KAAA,GAAN,MAAM,KAAA,CAAK;AAAA;AAAA;AAAA;AAAA,EAYV,YAAY,IAAA,EAAc;AAXjC,IAAA,aAAA,CAAA,IAAA,EAAO,MAAA,CAAA;AACP,IAAA,aAAA,CAAA,IAAA,EAAO,YAAA,CAAA;AACP,IAAA,aAAA,CAAA,IAAA,EAAO,SAAA,CAAA;AACP,IAAA,aAAA,CAAA,IAAA,EAAO,OAAA,CAAA;AACP,IAAA,aAAA,CAAA,IAAA,EAAO,MAAA,CAAA;AACP,IAAA,aAAA,CAAA,IAAA,EAAO,QAAA,CAAA;AACP,IAAA,aAAA,CAAA,IAAA,EAAO,MAAA,CAAA;AAMN,IAAA,IAAA,CAAK,IAAA,GAAO,KAAK,WAAA,EAAY;AAC7B,IAAA,IAAA,CAAK,UAAA,GAAa,KAAA,CAAK,SAAA,CAAU,IAAA,CAAK,IAAI,CAAA;AAC1C,IAAA,CAAC,IAAA,CAAK,OAAA,EAAS,IAAA,CAAK,KAAA,EAAO,KAAK,IAAA,EAAM,IAAA,CAAK,MAAA,EAAQ,IAAA,CAAK,IAAI,CAAA,GAAI,KAAA,CAAK,WAAA,CAAY,KAAK,UAAU,CAAA;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAK,MAAA,mBAAe,IAAI,IAAA,EAAK,EAAG,SAAS,IAAA,EAAY;AAC3D,IAAA,IAAI,CAAC,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAA,CAAO,YAAY,CAAA,IAAK,CAAC,IAAA,CAAK,MAAA,CAAO,QAAA,CAAS,OAAO,WAAA,EAAY,GAAI,CAAC,CAAA,IAAK,CAAC,IAAA,CAAK,KAAK,QAAA,CAAS,MAAA,CAAO,SAAA,EAAW,CAAA,EAAG;AAC3I,MAAA,OAAO,IAAA,CAAK,KAAK,IAAI,IAAA,CAAK,OAAO,OAAA,EAAQ,GAAA,KAAA,aAAe,KAAK,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,IAAI,IAAA,CAAK,KAAK,GAAA,CAAI,MAAA,CAAO,cAAA,EAAe,EAAG,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,UAAA,EAAW,EAAG,IAAA,CAAK,KAAA,CAAM,CAAC,GAAG,IAAA,CAAK,OAAA,CAAQ,CAAC,CAAC,CAAC,CAAA;AAEzI,IAAA,MAAM,MAAM,IAAI,IAAA,CAAK,MAAA,CAAO,OAAA,KAAY,GAAK,CAAA;AAE7C,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAK,KAAA,EAAO;AAC9B,MAAA,IAAI,IAAA,GAAO,GAAA,CAAI,WAAA,EAAY,EAAG;AAC9B,MAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AAClC,QAAA,IAAI,SAAS,GAAA,CAAI,WAAA,MAAiB,MAAA,GAAS,GAAA,CAAI,eAAc,EAAG;AAChE,QAAA,OAAO,IAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,OAAO,cAAA,EAAe,EAAG,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,UAAA,EAAW,EAAG,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,MAC3G;AAAA,IACD;AAEA,IAAA,OAAO,IAAA,CAAK,KAAK,IAAI,IAAA,CAAK,OAAO,OAAA,EAAQ,GAAA,KAAA,aAAe,KAAK,CAAA;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,QAAA,GAAW;AACjB,IAAA,OAAO,IAAA,CAAK,IAAA;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAe,UAAU,IAAA,EAAsB;AAC9C,IAAA,IAAI,OAAA,CAAQ,IAAI,UAAA,EAAY,IAAI,GAAG,OAAO,OAAA,CAAQ,GAAA,CAAI,UAAA,EAAY,IAAI,CAAA;AACtE,IAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,IAAA,IAAA,GAAO,IAAA,CACL,KAAA,CAAM,GAAG,CAAA,CACT,GAAA;AAAA,MAAI,CAAC,GAAA,EAAK,CAAA,KACV,IAAI,OAAA,CAAQ,aAAA,EAAe,CAAC,KAAA,KAAU;AACrC,QAAA,IAAI,UAAU,GAAA,EAAK,OAAA,CAAQ,KAAK,KAAA,CAAM,IAAA,CAAK,QAAO,GAAI,UAAA,CAAW,CAAC,CAAA,CAAE,CAAC,CAAC,CAAA,GAAI,UAAA,CAAW,CAAC,CAAA,CAAE,CAAC,GAAG,QAAA,EAAS;AAErG,QAAA,IAAI,UAAU,GAAA,EAAK;AAClB,UAAA,QAAQ,CAAA;AAAG,YACV,KAAK,CAAA;AACJ,cAAA,OAAO,GAAA,CAAI,aAAA,EAAc,CAAE,QAAA,EAAS;AAAA,YACrC,KAAK,CAAA;AACJ,cAAA,OAAO,GAAA,CAAI,WAAA,EAAY,CAAE,QAAA,EAAS;AAAA,YACnC,KAAK,CAAA;AACJ,cAAA,OAAO,GAAA,CAAI,UAAA,EAAW,CAAE,QAAA,EAAS;AAAA,YAClC,KAAK,CAAA;AACJ,cAAA,OAAO,GAAA,CAAI,WAAA,EAAY,CAAE,QAAA,EAAS;AAAA,YACnC,KAAK,CAAA;AACJ,cAAA,OAAO,GAAA,CAAI,SAAA,EAAU,CAAE,QAAA,EAAS;AAAA;AAClC,QACD;AAEA,QAAA,OAAO,KAAA;AAAA,MACR,CAAC;AAAA,KACF,CACC,KAAK,GAAG,CAAA;AACV,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,WAAA,EAAa,CAAC,KAAA,KAAU,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,UAAA,EAAY,KAAK,CAAC,CAAC,CAAA;AAAA,EACnF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,OAAe,YAAY,IAAA,EAA+B;AACzD,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC5B,IAAA,IAAI,MAAM,MAAA,KAAW,CAAA,EAAG,MAAM,IAAI,MAAM,uBAAuB,CAAA;AAC/D,IAAA,OAAO,KAAA,CAAM,IAAI,CAAC,IAAA,EAAM,MAAM,KAAA,CAAK,SAAA,CAAU,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,OAAe,SAAA,CAAU,QAAA,EAAkB,EAAA,EAAsB;AAChE,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,EAAG;AAC3B,MAAA,MAAM,MAAgB,EAAC;AACvB,MAAA,KAAA,MAAW,IAAA,IAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,GAAG,KAAA,CAAK,SAAA,CAAU,IAAA,EAAM,EAAE,CAAC,CAAA;AAC5E,MAAA,OAAO,CAAC,GAAG,IAAI,GAAA,CAAI,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAAA,IAC9C;AAEA,IAAA,MAAM,GAAG,IAAA,EAAM,MAAA,EAAQ,QAAQ,IAAI,CAAA,GAAI,SAAA,CAAU,IAAA,CAAK,QAAQ,CAAA;AAC9D,IAAA,IAAI,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,CAAC,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAA,EAAG,QAAA,CAAS,MAAA,EAAQ,EAAE,CAAC,CAAA;AAG5D,IAAA,IAAI,MAAM,CAAC,GAAA,EAAK,GAAG,CAAA,GAAI,WAAW,EAAE,CAAA;AAAA,SAAA,IAG3B,CAAC,GAAA,IAAO,CAAC,IAAA,EAAM,OAAO,CAAC,GAAG,CAAA;AAQnC,IAAA,CAAC,KAAK,GAAG,CAAA,GAAI,CAAC,GAAA,EAAK,OAAO,UAAA,CAAW,EAAE,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAGjE,IAAA,OAAO,MAAM,GAAA,EAAK,GAAA,EAAK,SAAS,IAAA,EAAM,EAAE,KAAK,CAAC,CAAA;AAAA,EAC/C;AACD,CAAA;AAhIkB,MAAA,CAAA,KAAA,EAAA,MAAA,CAAA;AAAX,IAAM,IAAA,GAAN","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"]}
@@ -1 +1 @@
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"]}
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.2.2-next.ff2c792d",
3
+ "version": "1.3.0-pr-935.7da5c8bb",
4
4
  "description": "A cron utility library for JavaScript.",
5
5
  "author": "@sapphire",
6
6
  "license": "MIT",
@@ -63,16 +63,16 @@
63
63
  "access": "public"
64
64
  },
65
65
  "dependencies": {
66
- "@sapphire/utilities": "^3.18.1"
66
+ "@sapphire/utilities": "^3.18.2"
67
67
  },
68
68
  "devDependencies": {
69
- "@favware/cliff-jumper": "^5.0.0",
70
- "@vitest/coverage-v8": "^2.1.8",
71
- "tsup": "^8.3.5",
72
- "tsx": "^4.19.2",
69
+ "@favware/cliff-jumper": "^6.0.0",
70
+ "@vitest/coverage-v8": "^3.2.4",
71
+ "tsup": "^8.5.0",
72
+ "tsx": "^4.20.6",
73
73
  "typedoc": "^0.26.11",
74
74
  "typedoc-json-parser": "^10.2.0",
75
75
  "typescript": "~5.4.5",
76
- "vitest": "^2.1.8"
76
+ "vitest": "^3.2.4"
77
77
  }
78
78
  }