soff-cron 0.0.1 → 0.0.3

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/i18n/en.ts"],"names":["en"],"mappings":"AAEO,IAAMA,CAAAA,CAAkB,CAC7B,EAAA,CAAI,IAAA,CACJ,MAAO,OAAA,CACP,WAAA,CAAa,cAAA,CACb,SAAA,CAAW,YAAA,CACX,QAAA,CAAU,YACV,SAAA,CAAW,YAAA,CACX,UAAA,CAAY,aAAA,CACZ,SAAA,CAAW,YAAA,CACX,OAAQ,QAAA,CACR,OAAA,CAAS,SAAA,CACT,IAAA,CAAM,MAAA,CACN,KAAA,CAAO,QACP,GAAA,CAAK,KAAA,CACL,IAAA,CAAM,MAAA,CACN,IAAA,CAAM,MAAA,CACN,MAAO,OAAA,CACP,KAAA,CAAO,OAAA,CACP,MAAA,CAAQ,QAAA,CACR,IAAA,CAAM,OACN,KAAA,CAAO,OAAA,CACP,EAAA,CAAI,IAAA,CACJ,EAAA,CAAI,IAAA,CACJ,IAAK,KAAA,CACL,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,SAAA,CACT,EAAA,CAAI,KACJ,MAAA,CAAQ,QAAA,CACR,OAAA,CAAS,SAAA,CAGT,MAAA,CAAQ,QAAA,CACR,OAAQ,QAAA,CACR,OAAA,CAAS,SAAA,CACT,SAAA,CAAW,WAAA,CACX,QAAA,CAAU,WACV,MAAA,CAAQ,QAAA,CACR,QAAA,CAAU,UAAA,CAGV,OAAA,CAAS,SAAA,CACT,SAAU,UAAA,CACV,KAAA,CAAO,OAAA,CACP,KAAA,CAAO,OAAA,CACP,GAAA,CAAK,MACL,IAAA,CAAM,MAAA,CACN,IAAA,CAAM,MAAA,CACN,MAAA,CAAQ,QAAA,CACR,UAAW,WAAA,CACX,OAAA,CAAS,SAAA,CACT,QAAA,CAAU,UAAA,CACV,QAAA,CAAU,WAGV,EAAA,CAAI,IAAA,CACJ,EAAA,CAAI,IAAA,CACJ,QAAA,CAAU,UAAA,CACV,KAAM,MAAA,CAGN,OAAA,CAAS,SAAA,CACT,OAAA,CAAS,SACX","file":"en.js","sourcesContent":["import type { I18nStrings } from './es.js';\n\nexport const en: I18nStrings = {\n at: 'at',\n every: 'every',\n everyMinute: 'every minute',\n everyHour: 'every hour',\n everyDay: 'every day',\n everyWeek: 'every week',\n everyMonth: 'every month',\n everyYear: 'every year',\n minute: 'minute',\n minutes: 'minutes',\n hour: 'hour',\n hours: 'hours',\n day: 'day',\n days: 'days',\n week: 'week',\n weeks: 'weeks',\n month: 'month',\n months: 'months',\n year: 'year',\n years: 'years',\n on: 'on',\n in: 'in',\n and: 'and',\n between: 'between',\n through: 'through',\n of: 'of',\n second: 'second',\n seconds: 'seconds',\n\n // Day names\n sunday: 'Sunday',\n monday: 'Monday',\n tuesday: 'Tuesday',\n wednesday: 'Wednesday',\n thursday: 'Thursday',\n friday: 'Friday',\n saturday: 'Saturday',\n\n // Month names\n january: 'January',\n february: 'February',\n march: 'March',\n april: 'April',\n may: 'May',\n june: 'June',\n july: 'July',\n august: 'August',\n september: 'September',\n october: 'October',\n november: 'November',\n december: 'December',\n\n // Time periods\n am: 'AM',\n pm: 'PM',\n midnight: 'midnight',\n noon: 'noon',\n\n // Special\n weekday: 'weekday',\n weekend: 'weekend',\n};\n"]}
1
+ {"version":3,"sources":["../../src/core/humanizer.ts","../../src/i18n/en.ts"],"names":["parseTimeString","timeStr","cleaned","match","hour","period","minute","parseDayOfWeek","day","patterns","normalized","index","dayName","en","enPatterns","time"],"mappings":"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","file":"en.js","sourcesContent":["/**\n * Humanizer - Converts natural language text to cron expressions\n */\n\nimport type { Locale } from './types.js';\nimport { validateCron } from './validator.js';\nimport type { HumanizerPatterns } from '../i18n/en.js';\nimport { enPatterns } from '../i18n/en.js';\nimport { esPatterns } from '../i18n/es.js';\n\n/**\n * Options for humanizing text to cron\n */\nexport interface HumanizerOptions {\n /**\n * Locale for parsing the input text\n * @default 'en'\n */\n locale?: Locale;\n}\n\n/**\n * Result of humanizing text to cron\n */\nexport interface HumanizerResult {\n /**\n * Whether the text was successfully converted\n */\n success: boolean;\n\n /**\n * The generated cron expression\n */\n cronExpression?: string;\n\n /**\n * Error message if conversion failed\n */\n error?: string;\n\n /**\n * Suggestions for fixing the input\n */\n suggestions?: string[];\n}\n\n/**\n * Converts natural language text to a cron expression\n *\n * @param text - Human-readable text (e.g., \"every 5 minutes\", \"cada hora\")\n * @param options - Options for parsing\n * @returns Result with cron expression or error\n *\n * @example\n * ```typescript\n * humanizeCron(\"every 5 minutes\", { locale: 'en' });\n * // → { success: true, cronExpression: \"*\\/5 * * * *\" }\n *\n * humanizeCron(\"todos los días a las 2 am\", { locale: 'es' });\n * // → { success: true, cronExpression: \"0 2 * * *\" }\n * ```\n */\nexport function humanizeCron(text: string, options: HumanizerOptions = {}): HumanizerResult {\n const { locale = 'en' } = options;\n const patterns = locale === 'es' ? esPatterns : enPatterns;\n\n // Normalize text: lowercase, trim, remove extra spaces\n const normalized = text.toLowerCase().trim().replace(/\\s+/g, ' ');\n\n // Try to match against patterns\n for (const pattern of patterns.patterns) {\n const match = normalized.match(pattern.regex);\n if (match) {\n try {\n const cron = pattern.toCron(match, patterns);\n\n // Validate the generated cron\n const validation = validateCron(cron);\n if (validation.isValid) {\n return {\n success: true,\n cronExpression: cron,\n };\n } else {\n return {\n success: false,\n error: `Generated invalid cron: ${validation.error}`,\n suggestions: getSuggestions(normalized, locale),\n };\n }\n } catch {\n continue; // Try next pattern\n }\n }\n }\n\n // No pattern matched\n return {\n success: false,\n error:\n locale === 'es'\n ? 'No se pudo interpretar el texto. Intenta usar frases como \"cada 5 minutos\" o \"todos los días a las 2 am\".'\n : 'Could not parse the text. Try phrases like \"every 5 minutes\" or \"every day at 2 am\".',\n suggestions: getSuggestions(normalized, locale),\n };\n}\n\n/**\n * Get suggestions based on partial matches\n */\nfunction getSuggestions(text: string, locale: Locale): string[] {\n const suggestions: string[] = [];\n\n if (locale === 'es') {\n if (text.includes('minuto')) suggestions.push('cada 5 minutos');\n if (text.includes('hora')) suggestions.push('cada hora', 'cada 2 horas');\n if (text.includes('día') || text.includes('dia'))\n suggestions.push('todos los días', 'todos los días a las 9 am');\n if (text.includes('semana')) suggestions.push('cada semana', 'todos los lunes');\n if (text.includes('mes')) suggestions.push('cada mes', 'el día 1 de cada mes');\n if (text.includes('lunes') || text.includes('martes') || text.includes('miércoles')) {\n suggestions.push('todos los lunes a las 10 am');\n }\n } else {\n if (text.includes('minute')) suggestions.push('every 5 minutes', 'every 15 minutes');\n if (text.includes('hour')) suggestions.push('every hour', 'every 2 hours');\n if (text.includes('day')) suggestions.push('every day', 'every day at 9 am');\n if (text.includes('week')) suggestions.push('every week', 'every monday');\n if (text.includes('month')) suggestions.push('every month', 'on the 1st of every month');\n if (text.includes('monday') || text.includes('tuesday') || text.includes('wednesday')) {\n suggestions.push('every monday at 10 am');\n }\n }\n\n return suggestions.slice(0, 3); // Return max 3 suggestions\n}\n\n/**\n * Helper to parse time strings like \"2am\", \"14:30\", \"2:30 pm\"\n */\nexport function parseTimeString(timeStr: string): { hour: number; minute: number } | null {\n // Remove spaces\n const cleaned = timeStr.replace(/\\s+/g, '');\n\n // Pattern: 2am, 2pm, 14, etc.\n let match = cleaned.match(/^(\\d{1,2})(am|pm)?$/i);\n if (match) {\n let hour = parseInt(match[1], 10);\n const period = match[2]?.toLowerCase();\n\n if (period === 'pm' && hour !== 12) hour += 12;\n if (period === 'am' && hour === 12) hour = 0;\n\n if (hour >= 0 && hour <= 23) {\n return { hour, minute: 0 };\n }\n }\n\n // Pattern: 14:30, 2:30pm, 2:30 pm\n match = cleaned.match(/^(\\d{1,2}):(\\d{2})(am|pm)?$/i);\n if (match) {\n let hour = parseInt(match[1], 10);\n const minute = parseInt(match[2], 10);\n const period = match[3]?.toLowerCase();\n\n if (period === 'pm' && hour !== 12) hour += 12;\n if (period === 'am' && hour === 12) hour = 0;\n\n if (hour >= 0 && hour <= 23 && minute >= 0 && minute <= 59) {\n return { hour, minute };\n }\n }\n\n return null;\n}\n\n/**\n * Helper to parse day of week names\n */\nexport function parseDayOfWeek(day: string, patterns: HumanizerPatterns): number | null {\n const normalized = day.toLowerCase();\n\n for (const [index, dayName] of patterns.days.entries()) {\n if (normalized.includes(dayName.toLowerCase())) {\n return index; // 0 = Sunday, 1 = Monday, etc.\n }\n }\n\n return null;\n}\n","import type { I18nStrings } from './es.js';\nimport { parseTimeString, parseDayOfWeek } from '../core/humanizer.js';\n\nexport const en: I18nStrings = {\n at: 'at',\n every: 'every',\n everyMinute: 'every minute',\n everyHour: 'every hour',\n everyDay: 'every day',\n everyWeek: 'every week',\n everyMonth: 'every month',\n everyYear: 'every year',\n minute: 'minute',\n minutes: 'minutes',\n hour: 'hour',\n hours: 'hours',\n day: 'day',\n days: 'days',\n week: 'week',\n weeks: 'weeks',\n month: 'month',\n months: 'months',\n year: 'year',\n years: 'years',\n on: 'on',\n in: 'in',\n and: 'and',\n between: 'between',\n through: 'through',\n of: 'of',\n second: 'second',\n seconds: 'seconds',\n\n // Day names\n sunday: 'Sunday',\n monday: 'Monday',\n tuesday: 'Tuesday',\n wednesday: 'Wednesday',\n thursday: 'Thursday',\n friday: 'Friday',\n saturday: 'Saturday',\n\n // Month names\n january: 'January',\n february: 'February',\n march: 'March',\n april: 'April',\n may: 'May',\n june: 'June',\n july: 'July',\n august: 'August',\n september: 'September',\n october: 'October',\n november: 'November',\n december: 'December',\n\n // Time periods\n am: 'AM',\n pm: 'PM',\n midnight: 'midnight',\n noon: 'noon',\n\n // Special\n weekday: 'weekdays',\n weekend: 'weekends',\n};\n\n/**\n * Pattern for converting natural language to cron\n */\nexport interface HumanizerPattern {\n /**\n * Regular expression to match the pattern\n */\n regex: RegExp;\n\n /**\n * Function to convert match groups to cron expression\n */\n toCron: (match: RegExpMatchArray, patterns: HumanizerPatterns) => string;\n\n /**\n * Description of what this pattern matches\n */\n description: string;\n}\n\n/**\n * Collection of patterns and helper data for humanizer\n */\nexport interface HumanizerPatterns {\n days: string[];\n months: string[];\n patterns: HumanizerPattern[];\n}\n\nexport const enPatterns: HumanizerPatterns = {\n days: ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'],\n months: [\n 'january',\n 'february',\n 'march',\n 'april',\n 'may',\n 'june',\n 'july',\n 'august',\n 'september',\n 'october',\n 'november',\n 'december',\n ],\n\n patterns: [\n // \"every minute\" → */1 * * * *\n {\n regex: /^every\\s+minute$/,\n toCron: () => '* * * * *',\n description: 'Every minute',\n },\n\n // \"every 5 minutes\" → */5 * * * *\n {\n regex: /^every\\s+(\\d+)\\s+minutes?$/,\n toCron: (match) => `*/${match[1]} * * * *`,\n description: 'Every N minutes',\n },\n\n // \"every hour\" → 0 * * * *\n {\n regex: /^every\\s+hour$/,\n toCron: () => '0 * * * *',\n description: 'Every hour',\n },\n\n // \"every 2 hours\" → 0 */2 * * *\n {\n regex: /^every\\s+(\\d+)\\s+hours?$/,\n toCron: (match) => `0 */${match[1]} * * *`,\n description: 'Every N hours',\n },\n\n // \"every day\" → 0 0 * * *\n {\n regex: /^every\\s+day$/,\n toCron: () => '0 0 * * *',\n description: 'Every day at midnight',\n },\n\n // \"every day at 2am\" or \"every day at 14:30\"\n {\n regex: /^every\\s+day\\s+at\\s+(.+)$/,\n toCron: (match) => {\n const time = parseTimeString(match[1]);\n if (!time) throw new Error('Invalid time format');\n return `${time.minute} ${time.hour} * * *`;\n },\n description: 'Every day at specific time',\n },\n\n // \"every week\" → 0 0 * * 0\n {\n regex: /^every\\s+week$/,\n toCron: () => '0 0 * * 0',\n description: 'Every week (Sunday at midnight)',\n },\n\n // \"every monday\" or \"every mon\"\n {\n regex:\n /^every\\s+(monday|mon|tuesday|tue|wednesday|wed|thursday|thu|friday|fri|saturday|sat|sunday|sun)$/,\n toCron: (match, patterns) => {\n const day = parseDayOfWeek(match[1], patterns);\n if (day === null) throw new Error('Invalid day');\n return `0 0 * * ${day}`;\n },\n description: 'Every specific day of week',\n },\n\n // \"every monday at 10am\"\n {\n regex:\n /^every\\s+(monday|mon|tuesday|tue|wednesday|wed|thursday|thu|friday|fri|saturday|sat|sunday|sun)\\s+at\\s+(.+)$/,\n toCron: (match, patterns) => {\n const day = parseDayOfWeek(match[1], patterns);\n const time = parseTimeString(match[2]);\n if (day === null || !time) throw new Error('Invalid day or time');\n return `${time.minute} ${time.hour} * * ${day}`;\n },\n description: 'Every specific day at specific time',\n },\n\n // \"every month\" → 0 0 1 * *\n {\n regex: /^every\\s+month$/,\n toCron: () => '0 0 1 * *',\n description: 'Every month (1st at midnight)',\n },\n\n // \"on the 1st of every month\" or \"on the 15th of every month\"\n {\n regex: /^on\\s+the\\s+(\\d{1,2})(?:st|nd|rd|th)?\\s+of\\s+every\\s+month(?:\\s+at\\s+(.+))?$/,\n toCron: (match) => {\n const day = parseInt(match[1], 10);\n if (day < 1 || day > 31) throw new Error('Invalid day of month');\n\n if (match[2]) {\n const time = parseTimeString(match[2]);\n if (!time) throw new Error('Invalid time format');\n return `${time.minute} ${time.hour} ${day} * *`;\n }\n return `0 0 ${day} * *`;\n },\n description: 'Specific day of every month',\n },\n\n // \"every year\" → 0 0 1 1 *\n {\n regex: /^every\\s+year$/,\n toCron: () => '0 0 1 1 *',\n description: 'Every year (Jan 1st at midnight)',\n },\n\n // \"at 2am\" or \"at 14:30\"\n {\n regex: /^at\\s+(.+)$/,\n toCron: (match) => {\n const time = parseTimeString(match[1]);\n if (!time) throw new Error('Invalid time format');\n return `${time.minute} ${time.hour} * * *`;\n },\n description: 'Daily at specific time',\n },\n\n // \"weekdays at 9am\" or \"on weekdays at 9am\"\n {\n regex: /^(?:on\\s+)?weekdays?\\s+at\\s+(.+)$/,\n toCron: (match) => {\n const time = parseTimeString(match[1]);\n if (!time) throw new Error('Invalid time format');\n return `${time.minute} ${time.hour} * * 1-5`;\n },\n description: 'Weekdays at specific time',\n },\n\n // \"weekends at 10am\" or \"on weekends at 10am\"\n {\n regex: /^(?:on\\s+)?weekends?\\s+at\\s+(.+)$/,\n toCron: (match) => {\n const time = parseTimeString(match[1]);\n if (!time) throw new Error('Invalid time format');\n return `${time.minute} ${time.hour} * * 0,6`;\n },\n description: 'Weekends at specific time',\n },\n ],\n};\n"]}
package/dist/i18n/es.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var e={at:"a las",every:"cada",everyMinute:"cada minuto",everyHour:"cada hora",everyDay:"todos los d\xEDas",everyWeek:"cada semana",everyMonth:"cada mes",everyYear:"cada a\xF1o",minute:"minuto",minutes:"minutos",hour:"hora",hours:"horas",day:"d\xEDa",days:"d\xEDas",week:"semana",weeks:"semanas",month:"mes",months:"meses",year:"a\xF1o",years:"a\xF1os",on:"el",in:"en",and:"y",between:"entre",through:"hasta",of:"de",second:"segundo",seconds:"segundos",sunday:"domingo",monday:"lunes",tuesday:"martes",wednesday:"mi\xE9rcoles",thursday:"jueves",friday:"viernes",saturday:"s\xE1bado",january:"enero",february:"febrero",march:"marzo",april:"abril",may:"mayo",june:"junio",july:"julio",august:"agosto",september:"septiembre",october:"octubre",november:"noviembre",december:"diciembre",am:"AM",pm:"PM",midnight:"medianoche",noon:"mediod\xEDa",weekday:"d\xEDa de semana",weekend:"fin de semana"};exports.es=e;//# sourceMappingURL=es.cjs.map
1
+ 'use strict';function o(s){let e=s.replace(/\s+/g,""),n=e.match(/^(\d{1,2})(am|pm)?$/i);if(n){let r=parseInt(n[1],10),a=n[2]?.toLowerCase();if(a==="pm"&&r!==12&&(r+=12),a==="am"&&r===12&&(r=0),r>=0&&r<=23)return {hour:r,minute:0}}if(n=e.match(/^(\d{1,2}):(\d{2})(am|pm)?$/i),n){let r=parseInt(n[1],10),a=parseInt(n[2],10),t=n[3]?.toLowerCase();if(t==="pm"&&r!==12&&(r+=12),t==="am"&&r===12&&(r=0),r>=0&&r<=23&&a>=0&&a<=59)return {hour:r,minute:a}}return null}function i(s,e){let n=s.toLowerCase();for(let[r,a]of e.days.entries())if(n.includes(a.toLowerCase()))return r;return null}var u={at:"a las",every:"cada",everyMinute:"cada minuto",everyHour:"cada hora",everyDay:"todos los d\xEDas",everyWeek:"cada semana",everyMonth:"cada mes",everyYear:"cada a\xF1o",minute:"minuto",minutes:"minutos",hour:"hora",hours:"horas",day:"d\xEDa",days:"d\xEDas",week:"semana",weeks:"semanas",month:"mes",months:"meses",year:"a\xF1o",years:"a\xF1os",on:"el",in:"en",and:"y",between:"entre",through:"hasta",of:"de",second:"segundo",seconds:"segundos",sunday:"domingo",monday:"lunes",tuesday:"martes",wednesday:"mi\xE9rcoles",thursday:"jueves",friday:"viernes",saturday:"s\xE1bado",january:"enero",february:"febrero",march:"marzo",april:"abril",may:"mayo",june:"junio",july:"julio",august:"agosto",september:"septiembre",october:"octubre",november:"noviembre",december:"diciembre",am:"AM",pm:"PM",midnight:"medianoche",noon:"mediod\xEDa",weekday:"d\xEDas de semana",weekend:"fines de semana"},c={days:["domingo","lunes","martes","mi\xE9rcoles","jueves","viernes","s\xE1bado"],months:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],patterns:[{regex:/^cada\s+minuto$/,toCron:()=>"* * * * *",description:"Cada minuto"},{regex:/^cada\s+(\d+)\s+minutos?$/,toCron:s=>`*/${s[1]} * * * *`,description:"Cada N minutos"},{regex:/^cada\s+hora$/,toCron:()=>"0 * * * *",description:"Cada hora"},{regex:/^cada\s+(\d+)\s+horas?$/,toCron:s=>`0 */${s[1]} * * *`,description:"Cada N horas"},{regex:/^todos\s+los\s+d[ií]as$/,toCron:()=>"0 0 * * *",description:"Todos los d\xEDas a medianoche"},{regex:/^todos\s+los\s+d[ií]as\s+a\s+las?\s+(.+)$/,toCron:s=>{let e=o(s[1]);if(!e)throw new Error("Formato de hora inv\xE1lido");return `${e.minute} ${e.hour} * * *`},description:"Todos los d\xEDas a una hora espec\xEDfica"},{regex:/^cada\s+semana$/,toCron:()=>"0 0 * * 0",description:"Cada semana (domingo a medianoche)"},{regex:/^(?:todos\s+los|cada)\s+(lunes|martes|mi[eé]rcoles|jueves|viernes|s[aá]bado|domingo)$/,toCron:(s,e)=>{let n=i(s[1],e);if(n===null)throw new Error("D\xEDa inv\xE1lido");return `0 0 * * ${n}`},description:"Cada d\xEDa espec\xEDfico de la semana"},{regex:/^(?:todos\s+los|cada)\s+(lunes|martes|mi[eé]rcoles|jueves|viernes|s[aá]bado|domingo)\s+a\s+las?\s+(.+)$/,toCron:(s,e)=>{let n=i(s[1],e),r=o(s[2]);if(n===null||!r)throw new Error("D\xEDa u hora inv\xE1lida");return `${r.minute} ${r.hour} * * ${n}`},description:"Cada d\xEDa espec\xEDfico a una hora espec\xEDfica"},{regex:/^cada\s+mes$/,toCron:()=>"0 0 1 * *",description:"Cada mes (d\xEDa 1 a medianoche)"},{regex:/^el\s+d[ií]a\s+(\d{1,2})\s+de\s+cada\s+mes(?:\s+a\s+las?\s+(.+))?$/,toCron:s=>{let e=parseInt(s[1],10);if(e<1||e>31)throw new Error("D\xEDa del mes inv\xE1lido");if(s[2]){let n=o(s[2]);if(!n)throw new Error("Formato de hora inv\xE1lido");return `${n.minute} ${n.hour} ${e} * *`}return `0 0 ${e} * *`},description:"D\xEDa espec\xEDfico de cada mes"},{regex:/^cada\s+a[ñn]o$/,toCron:()=>"0 0 1 1 *",description:"Cada a\xF1o (1 de enero a medianoche)"},{regex:/^a\s+las?\s+(.+)$/,toCron:s=>{let e=o(s[1]);if(!e)throw new Error("Formato de hora inv\xE1lido");return `${e.minute} ${e.hour} * * *`},description:"Diariamente a una hora espec\xEDfica"},{regex:/^(?:d[ií]as\s+de\s+semana|d[ií]as\s+laborales)\s+a\s+las?\s+(.+)$/,toCron:s=>{let e=o(s[1]);if(!e)throw new Error("Formato de hora inv\xE1lido");return `${e.minute} ${e.hour} * * 1-5`},description:"D\xEDas de semana a una hora espec\xEDfica"},{regex:/^fines?\s+de\s+semana\s+a\s+las?\s+(.+)$/,toCron:s=>{let e=o(s[1]);if(!e)throw new Error("Formato de hora inv\xE1lido");return `${e.minute} ${e.hour} * * 0,6`},description:"Fines de semana a una hora espec\xEDfica"}]};exports.es=u;exports.esPatterns=c;//# sourceMappingURL=es.cjs.map
2
2
  //# sourceMappingURL=es.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/i18n/es.ts"],"names":["es"],"mappings":"aAmEO,IAAMA,CAAAA,CAAkB,CAC7B,EAAA,CAAI,OAAA,CACJ,MAAO,MAAA,CACP,WAAA,CAAa,aAAA,CACb,SAAA,CAAW,WAAA,CACX,QAAA,CAAU,oBACV,SAAA,CAAW,aAAA,CACX,UAAA,CAAY,UAAA,CACZ,SAAA,CAAW,aAAA,CACX,OAAQ,QAAA,CACR,OAAA,CAAS,SAAA,CACT,IAAA,CAAM,MAAA,CACN,KAAA,CAAO,QACP,GAAA,CAAK,QAAA,CACL,IAAA,CAAM,SAAA,CACN,IAAA,CAAM,QAAA,CACN,MAAO,SAAA,CACP,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,OAAA,CACR,IAAA,CAAM,SACN,KAAA,CAAO,SAAA,CACP,EAAA,CAAI,IAAA,CACJ,EAAA,CAAI,IAAA,CACJ,IAAK,GAAA,CACL,OAAA,CAAS,OAAA,CACT,OAAA,CAAS,OAAA,CACT,EAAA,CAAI,KACJ,MAAA,CAAQ,SAAA,CACR,OAAA,CAAS,UAAA,CAGT,MAAA,CAAQ,SAAA,CACR,OAAQ,OAAA,CACR,OAAA,CAAS,QAAA,CACT,SAAA,CAAW,cAAA,CACX,QAAA,CAAU,SACV,MAAA,CAAQ,SAAA,CACR,QAAA,CAAU,WAAA,CAGV,OAAA,CAAS,OAAA,CACT,SAAU,SAAA,CACV,KAAA,CAAO,OAAA,CACP,KAAA,CAAO,OAAA,CACP,GAAA,CAAK,OACL,IAAA,CAAM,OAAA,CACN,IAAA,CAAM,OAAA,CACN,MAAA,CAAQ,QAAA,CACR,UAAW,YAAA,CACX,OAAA,CAAS,SAAA,CACT,QAAA,CAAU,WAAA,CACV,QAAA,CAAU,YAGV,EAAA,CAAI,IAAA,CACJ,EAAA,CAAI,IAAA,CACJ,QAAA,CAAU,YAAA,CACV,KAAM,aAAA,CAGN,OAAA,CAAS,kBAAA,CACT,OAAA,CAAS,eACX","file":"es.cjs","sourcesContent":["/**\n * Internationalization strings for Spanish\n */\nexport interface I18nStrings {\n at: string;\n every: string;\n everyMinute: string;\n everyHour: string;\n everyDay: string;\n everyWeek: string;\n everyMonth: string;\n everyYear: string;\n minute: string;\n minutes: string;\n hour: string;\n hours: string;\n day: string;\n days: string;\n week: string;\n weeks: string;\n month: string;\n months: string;\n year: string;\n years: string;\n on: string;\n in: string;\n and: string;\n between: string;\n through: string;\n of: string;\n second: string;\n seconds: string;\n\n // Day names\n sunday: string;\n monday: string;\n tuesday: string;\n wednesday: string;\n thursday: string;\n friday: string;\n saturday: string;\n\n // Month names\n january: string;\n february: string;\n march: string;\n april: string;\n may: string;\n june: string;\n july: string;\n august: string;\n september: string;\n october: string;\n november: string;\n december: string;\n\n // Time periods\n am: string;\n pm: string;\n midnight: string;\n noon: string;\n\n // Special\n weekday: string;\n weekend: string;\n}\n\nexport const es: I18nStrings = {\n at: 'a las',\n every: 'cada',\n everyMinute: 'cada minuto',\n everyHour: 'cada hora',\n everyDay: 'todos los días',\n everyWeek: 'cada semana',\n everyMonth: 'cada mes',\n everyYear: 'cada año',\n minute: 'minuto',\n minutes: 'minutos',\n hour: 'hora',\n hours: 'horas',\n day: 'día',\n days: 'días',\n week: 'semana',\n weeks: 'semanas',\n month: 'mes',\n months: 'meses',\n year: 'año',\n years: 'años',\n on: 'el',\n in: 'en',\n and: 'y',\n between: 'entre',\n through: 'hasta',\n of: 'de',\n second: 'segundo',\n seconds: 'segundos',\n\n // Day names\n sunday: 'domingo',\n monday: 'lunes',\n tuesday: 'martes',\n wednesday: 'miércoles',\n thursday: 'jueves',\n friday: 'viernes',\n saturday: 'sábado',\n\n // Month names\n january: 'enero',\n february: 'febrero',\n march: 'marzo',\n april: 'abril',\n may: 'mayo',\n june: 'junio',\n july: 'julio',\n august: 'agosto',\n september: 'septiembre',\n october: 'octubre',\n november: 'noviembre',\n december: 'diciembre',\n\n // Time periods\n am: 'AM',\n pm: 'PM',\n midnight: 'medianoche',\n noon: 'mediodía',\n\n // Special\n weekday: 'día de semana',\n weekend: 'fin de semana',\n};\n"]}
1
+ {"version":3,"sources":["../../src/core/humanizer.ts","../../src/i18n/es.ts"],"names":["parseTimeString","timeStr","cleaned","match","hour","period","minute","parseDayOfWeek","day","patterns","normalized","index","dayName","es","esPatterns","time"],"mappings":"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","file":"es.cjs","sourcesContent":["/**\n * Humanizer - Converts natural language text to cron expressions\n */\n\nimport type { Locale } from './types.js';\nimport { validateCron } from './validator.js';\nimport type { HumanizerPatterns } from '../i18n/en.js';\nimport { enPatterns } from '../i18n/en.js';\nimport { esPatterns } from '../i18n/es.js';\n\n/**\n * Options for humanizing text to cron\n */\nexport interface HumanizerOptions {\n /**\n * Locale for parsing the input text\n * @default 'en'\n */\n locale?: Locale;\n}\n\n/**\n * Result of humanizing text to cron\n */\nexport interface HumanizerResult {\n /**\n * Whether the text was successfully converted\n */\n success: boolean;\n\n /**\n * The generated cron expression\n */\n cronExpression?: string;\n\n /**\n * Error message if conversion failed\n */\n error?: string;\n\n /**\n * Suggestions for fixing the input\n */\n suggestions?: string[];\n}\n\n/**\n * Converts natural language text to a cron expression\n *\n * @param text - Human-readable text (e.g., \"every 5 minutes\", \"cada hora\")\n * @param options - Options for parsing\n * @returns Result with cron expression or error\n *\n * @example\n * ```typescript\n * humanizeCron(\"every 5 minutes\", { locale: 'en' });\n * // → { success: true, cronExpression: \"*\\/5 * * * *\" }\n *\n * humanizeCron(\"todos los días a las 2 am\", { locale: 'es' });\n * // → { success: true, cronExpression: \"0 2 * * *\" }\n * ```\n */\nexport function humanizeCron(text: string, options: HumanizerOptions = {}): HumanizerResult {\n const { locale = 'en' } = options;\n const patterns = locale === 'es' ? esPatterns : enPatterns;\n\n // Normalize text: lowercase, trim, remove extra spaces\n const normalized = text.toLowerCase().trim().replace(/\\s+/g, ' ');\n\n // Try to match against patterns\n for (const pattern of patterns.patterns) {\n const match = normalized.match(pattern.regex);\n if (match) {\n try {\n const cron = pattern.toCron(match, patterns);\n\n // Validate the generated cron\n const validation = validateCron(cron);\n if (validation.isValid) {\n return {\n success: true,\n cronExpression: cron,\n };\n } else {\n return {\n success: false,\n error: `Generated invalid cron: ${validation.error}`,\n suggestions: getSuggestions(normalized, locale),\n };\n }\n } catch {\n continue; // Try next pattern\n }\n }\n }\n\n // No pattern matched\n return {\n success: false,\n error:\n locale === 'es'\n ? 'No se pudo interpretar el texto. Intenta usar frases como \"cada 5 minutos\" o \"todos los días a las 2 am\".'\n : 'Could not parse the text. Try phrases like \"every 5 minutes\" or \"every day at 2 am\".',\n suggestions: getSuggestions(normalized, locale),\n };\n}\n\n/**\n * Get suggestions based on partial matches\n */\nfunction getSuggestions(text: string, locale: Locale): string[] {\n const suggestions: string[] = [];\n\n if (locale === 'es') {\n if (text.includes('minuto')) suggestions.push('cada 5 minutos');\n if (text.includes('hora')) suggestions.push('cada hora', 'cada 2 horas');\n if (text.includes('día') || text.includes('dia'))\n suggestions.push('todos los días', 'todos los días a las 9 am');\n if (text.includes('semana')) suggestions.push('cada semana', 'todos los lunes');\n if (text.includes('mes')) suggestions.push('cada mes', 'el día 1 de cada mes');\n if (text.includes('lunes') || text.includes('martes') || text.includes('miércoles')) {\n suggestions.push('todos los lunes a las 10 am');\n }\n } else {\n if (text.includes('minute')) suggestions.push('every 5 minutes', 'every 15 minutes');\n if (text.includes('hour')) suggestions.push('every hour', 'every 2 hours');\n if (text.includes('day')) suggestions.push('every day', 'every day at 9 am');\n if (text.includes('week')) suggestions.push('every week', 'every monday');\n if (text.includes('month')) suggestions.push('every month', 'on the 1st of every month');\n if (text.includes('monday') || text.includes('tuesday') || text.includes('wednesday')) {\n suggestions.push('every monday at 10 am');\n }\n }\n\n return suggestions.slice(0, 3); // Return max 3 suggestions\n}\n\n/**\n * Helper to parse time strings like \"2am\", \"14:30\", \"2:30 pm\"\n */\nexport function parseTimeString(timeStr: string): { hour: number; minute: number } | null {\n // Remove spaces\n const cleaned = timeStr.replace(/\\s+/g, '');\n\n // Pattern: 2am, 2pm, 14, etc.\n let match = cleaned.match(/^(\\d{1,2})(am|pm)?$/i);\n if (match) {\n let hour = parseInt(match[1], 10);\n const period = match[2]?.toLowerCase();\n\n if (period === 'pm' && hour !== 12) hour += 12;\n if (period === 'am' && hour === 12) hour = 0;\n\n if (hour >= 0 && hour <= 23) {\n return { hour, minute: 0 };\n }\n }\n\n // Pattern: 14:30, 2:30pm, 2:30 pm\n match = cleaned.match(/^(\\d{1,2}):(\\d{2})(am|pm)?$/i);\n if (match) {\n let hour = parseInt(match[1], 10);\n const minute = parseInt(match[2], 10);\n const period = match[3]?.toLowerCase();\n\n if (period === 'pm' && hour !== 12) hour += 12;\n if (period === 'am' && hour === 12) hour = 0;\n\n if (hour >= 0 && hour <= 23 && minute >= 0 && minute <= 59) {\n return { hour, minute };\n }\n }\n\n return null;\n}\n\n/**\n * Helper to parse day of week names\n */\nexport function parseDayOfWeek(day: string, patterns: HumanizerPatterns): number | null {\n const normalized = day.toLowerCase();\n\n for (const [index, dayName] of patterns.days.entries()) {\n if (normalized.includes(dayName.toLowerCase())) {\n return index; // 0 = Sunday, 1 = Monday, etc.\n }\n }\n\n return null;\n}\n","/**\n * Internationalization strings for Spanish\n */\nexport interface I18nStrings {\n at: string;\n every: string;\n everyMinute: string;\n everyHour: string;\n everyDay: string;\n everyWeek: string;\n everyMonth: string;\n everyYear: string;\n minute: string;\n minutes: string;\n hour: string;\n hours: string;\n day: string;\n days: string;\n week: string;\n weeks: string;\n month: string;\n months: string;\n year: string;\n years: string;\n on: string;\n in: string;\n and: string;\n between: string;\n through: string;\n of: string;\n second: string;\n seconds: string;\n\n // Day names\n sunday: string;\n monday: string;\n tuesday: string;\n wednesday: string;\n thursday: string;\n friday: string;\n saturday: string;\n\n // Month names\n january: string;\n february: string;\n march: string;\n april: string;\n may: string;\n june: string;\n july: string;\n august: string;\n september: string;\n october: string;\n november: string;\n december: string;\n\n // Time periods\n am: string;\n pm: string;\n midnight: string;\n noon: string;\n\n // Special\n weekday: string;\n weekend: string;\n}\n\nexport const es: I18nStrings = {\n at: 'a las',\n every: 'cada',\n everyMinute: 'cada minuto',\n everyHour: 'cada hora',\n everyDay: 'todos los días',\n everyWeek: 'cada semana',\n everyMonth: 'cada mes',\n everyYear: 'cada año',\n minute: 'minuto',\n minutes: 'minutos',\n hour: 'hora',\n hours: 'horas',\n day: 'día',\n days: 'días',\n week: 'semana',\n weeks: 'semanas',\n month: 'mes',\n months: 'meses',\n year: 'año',\n years: 'años',\n on: 'el',\n in: 'en',\n and: 'y',\n between: 'entre',\n through: 'hasta',\n of: 'de',\n second: 'segundo',\n seconds: 'segundos',\n\n // Day names\n sunday: 'domingo',\n monday: 'lunes',\n tuesday: 'martes',\n wednesday: 'miércoles',\n thursday: 'jueves',\n friday: 'viernes',\n saturday: 'sábado',\n\n // Month names\n january: 'enero',\n february: 'febrero',\n march: 'marzo',\n april: 'abril',\n may: 'mayo',\n june: 'junio',\n july: 'julio',\n august: 'agosto',\n september: 'septiembre',\n october: 'octubre',\n november: 'noviembre',\n december: 'diciembre',\n\n // Time periods\n am: 'AM',\n pm: 'PM',\n midnight: 'medianoche',\n noon: 'mediodía',\n\n // Special\n weekday: 'días de semana',\n weekend: 'fines de semana',\n};\n\nimport type { HumanizerPatterns } from './en.js';\nimport { parseTimeString, parseDayOfWeek } from '../core/humanizer.js';\n\nexport const esPatterns: HumanizerPatterns = {\n days: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n months: [\n 'enero',\n 'febrero',\n 'marzo',\n 'abril',\n 'mayo',\n 'junio',\n 'julio',\n 'agosto',\n 'septiembre',\n 'octubre',\n 'noviembre',\n 'diciembre',\n ],\n\n patterns: [\n // \"cada minuto\" → * * * * *\n {\n regex: /^cada\\s+minuto$/,\n toCron: () => '* * * * *',\n description: 'Cada minuto',\n },\n\n // \"cada 5 minutos\" → */5 * * * *\n {\n regex: /^cada\\s+(\\d+)\\s+minutos?$/,\n toCron: (match) => `*/${match[1]} * * * *`,\n description: 'Cada N minutos',\n },\n\n // \"cada hora\" → 0 * * * *\n {\n regex: /^cada\\s+hora$/,\n toCron: () => '0 * * * *',\n description: 'Cada hora',\n },\n\n // \"cada 2 horas\" → 0 */2 * * *\n {\n regex: /^cada\\s+(\\d+)\\s+horas?$/,\n toCron: (match) => `0 */${match[1]} * * *`,\n description: 'Cada N horas',\n },\n\n // \"todos los días\" or \"todos los dias\" → 0 0 * * *\n {\n regex: /^todos\\s+los\\s+d[ií]as$/,\n toCron: () => '0 0 * * *',\n description: 'Todos los días a medianoche',\n },\n\n // \"todos los días a las 2am\" or \"todos los dias a las 14:30\"\n {\n regex: /^todos\\s+los\\s+d[ií]as\\s+a\\s+las?\\s+(.+)$/,\n toCron: (match) => {\n const time = parseTimeString(match[1]);\n if (!time) throw new Error('Formato de hora inválido');\n return `${time.minute} ${time.hour} * * *`;\n },\n description: 'Todos los días a una hora específica',\n },\n\n // \"cada semana\" → 0 0 * * 0\n {\n regex: /^cada\\s+semana$/,\n toCron: () => '0 0 * * 0',\n description: 'Cada semana (domingo a medianoche)',\n },\n\n // \"todos los lunes\" or \"cada lunes\"\n {\n regex:\n /^(?:todos\\s+los|cada)\\s+(lunes|martes|mi[eé]rcoles|jueves|viernes|s[aá]bado|domingo)$/,\n toCron: (match, patterns) => {\n const day = parseDayOfWeek(match[1], patterns);\n if (day === null) throw new Error('Día inválido');\n return `0 0 * * ${day}`;\n },\n description: 'Cada día específico de la semana',\n },\n\n // \"todos los lunes a las 10am\"\n {\n regex:\n /^(?:todos\\s+los|cada)\\s+(lunes|martes|mi[eé]rcoles|jueves|viernes|s[aá]bado|domingo)\\s+a\\s+las?\\s+(.+)$/,\n toCron: (match, patterns) => {\n const day = parseDayOfWeek(match[1], patterns);\n const time = parseTimeString(match[2]);\n if (day === null || !time) throw new Error('Día u hora inválida');\n return `${time.minute} ${time.hour} * * ${day}`;\n },\n description: 'Cada día específico a una hora específica',\n },\n\n // \"cada mes\" → 0 0 1 * *\n {\n regex: /^cada\\s+mes$/,\n toCron: () => '0 0 1 * *',\n description: 'Cada mes (día 1 a medianoche)',\n },\n\n // \"el día 1 de cada mes\" or \"el dia 15 de cada mes\"\n {\n regex: /^el\\s+d[ií]a\\s+(\\d{1,2})\\s+de\\s+cada\\s+mes(?:\\s+a\\s+las?\\s+(.+))?$/,\n toCron: (match) => {\n const day = parseInt(match[1], 10);\n if (day < 1 || day > 31) throw new Error('Día del mes inválido');\n\n if (match[2]) {\n const time = parseTimeString(match[2]);\n if (!time) throw new Error('Formato de hora inválido');\n return `${time.minute} ${time.hour} ${day} * *`;\n }\n return `0 0 ${day} * *`;\n },\n description: 'Día específico de cada mes',\n },\n\n // \"cada año\" → 0 0 1 1 *\n {\n regex: /^cada\\s+a[ñn]o$/,\n toCron: () => '0 0 1 1 *',\n description: 'Cada año (1 de enero a medianoche)',\n },\n\n // \"a las 2am\" or \"a las 14:30\"\n {\n regex: /^a\\s+las?\\s+(.+)$/,\n toCron: (match) => {\n const time = parseTimeString(match[1]);\n if (!time) throw new Error('Formato de hora inválido');\n return `${time.minute} ${time.hour} * * *`;\n },\n description: 'Diariamente a una hora específica',\n },\n\n // \"días de semana a las 9am\" or \"dias laborales a las 9am\"\n {\n regex: /^(?:d[ií]as\\s+de\\s+semana|d[ií]as\\s+laborales)\\s+a\\s+las?\\s+(.+)$/,\n toCron: (match) => {\n const time = parseTimeString(match[1]);\n if (!time) throw new Error('Formato de hora inválido');\n return `${time.minute} ${time.hour} * * 1-5`;\n },\n description: 'Días de semana a una hora específica',\n },\n\n // \"fines de semana a las 10am\"\n {\n regex: /^fines?\\s+de\\s+semana\\s+a\\s+las?\\s+(.+)$/,\n toCron: (match) => {\n const time = parseTimeString(match[1]);\n if (!time) throw new Error('Formato de hora inválido');\n return `${time.minute} ${time.hour} * * 0,6`;\n },\n description: 'Fines de semana a una hora específica',\n },\n ],\n};\n"]}
@@ -1,61 +1 @@
1
- /**
2
- * Internationalization strings for Spanish
3
- */
4
- interface I18nStrings {
5
- at: string;
6
- every: string;
7
- everyMinute: string;
8
- everyHour: string;
9
- everyDay: string;
10
- everyWeek: string;
11
- everyMonth: string;
12
- everyYear: string;
13
- minute: string;
14
- minutes: string;
15
- hour: string;
16
- hours: string;
17
- day: string;
18
- days: string;
19
- week: string;
20
- weeks: string;
21
- month: string;
22
- months: string;
23
- year: string;
24
- years: string;
25
- on: string;
26
- in: string;
27
- and: string;
28
- between: string;
29
- through: string;
30
- of: string;
31
- second: string;
32
- seconds: string;
33
- sunday: string;
34
- monday: string;
35
- tuesday: string;
36
- wednesday: string;
37
- thursday: string;
38
- friday: string;
39
- saturday: string;
40
- january: string;
41
- february: string;
42
- march: string;
43
- april: string;
44
- may: string;
45
- june: string;
46
- july: string;
47
- august: string;
48
- september: string;
49
- october: string;
50
- november: string;
51
- december: string;
52
- am: string;
53
- pm: string;
54
- midnight: string;
55
- noon: string;
56
- weekday: string;
57
- weekend: string;
58
- }
59
- declare const es: I18nStrings;
60
-
61
- export { type I18nStrings, es };
1
+ export { I as I18nStrings, e as es, a as esPatterns } from '../en-J_BInlEG.cjs';
package/dist/i18n/es.d.ts CHANGED
@@ -1,61 +1 @@
1
- /**
2
- * Internationalization strings for Spanish
3
- */
4
- interface I18nStrings {
5
- at: string;
6
- every: string;
7
- everyMinute: string;
8
- everyHour: string;
9
- everyDay: string;
10
- everyWeek: string;
11
- everyMonth: string;
12
- everyYear: string;
13
- minute: string;
14
- minutes: string;
15
- hour: string;
16
- hours: string;
17
- day: string;
18
- days: string;
19
- week: string;
20
- weeks: string;
21
- month: string;
22
- months: string;
23
- year: string;
24
- years: string;
25
- on: string;
26
- in: string;
27
- and: string;
28
- between: string;
29
- through: string;
30
- of: string;
31
- second: string;
32
- seconds: string;
33
- sunday: string;
34
- monday: string;
35
- tuesday: string;
36
- wednesday: string;
37
- thursday: string;
38
- friday: string;
39
- saturday: string;
40
- january: string;
41
- february: string;
42
- march: string;
43
- april: string;
44
- may: string;
45
- june: string;
46
- july: string;
47
- august: string;
48
- september: string;
49
- october: string;
50
- november: string;
51
- december: string;
52
- am: string;
53
- pm: string;
54
- midnight: string;
55
- noon: string;
56
- weekday: string;
57
- weekend: string;
58
- }
59
- declare const es: I18nStrings;
60
-
61
- export { type I18nStrings, es };
1
+ export { I as I18nStrings, e as es, a as esPatterns } from '../en-J_BInlEG.js';
package/dist/i18n/es.js CHANGED
@@ -1,2 +1,2 @@
1
- var e={at:"a las",every:"cada",everyMinute:"cada minuto",everyHour:"cada hora",everyDay:"todos los d\xEDas",everyWeek:"cada semana",everyMonth:"cada mes",everyYear:"cada a\xF1o",minute:"minuto",minutes:"minutos",hour:"hora",hours:"horas",day:"d\xEDa",days:"d\xEDas",week:"semana",weeks:"semanas",month:"mes",months:"meses",year:"a\xF1o",years:"a\xF1os",on:"el",in:"en",and:"y",between:"entre",through:"hasta",of:"de",second:"segundo",seconds:"segundos",sunday:"domingo",monday:"lunes",tuesday:"martes",wednesday:"mi\xE9rcoles",thursday:"jueves",friday:"viernes",saturday:"s\xE1bado",january:"enero",february:"febrero",march:"marzo",april:"abril",may:"mayo",june:"junio",july:"julio",august:"agosto",september:"septiembre",october:"octubre",november:"noviembre",december:"diciembre",am:"AM",pm:"PM",midnight:"medianoche",noon:"mediod\xEDa",weekday:"d\xEDa de semana",weekend:"fin de semana"};export{e as es};//# sourceMappingURL=es.js.map
1
+ function o(s){let e=s.replace(/\s+/g,""),n=e.match(/^(\d{1,2})(am|pm)?$/i);if(n){let r=parseInt(n[1],10),a=n[2]?.toLowerCase();if(a==="pm"&&r!==12&&(r+=12),a==="am"&&r===12&&(r=0),r>=0&&r<=23)return {hour:r,minute:0}}if(n=e.match(/^(\d{1,2}):(\d{2})(am|pm)?$/i),n){let r=parseInt(n[1],10),a=parseInt(n[2],10),t=n[3]?.toLowerCase();if(t==="pm"&&r!==12&&(r+=12),t==="am"&&r===12&&(r=0),r>=0&&r<=23&&a>=0&&a<=59)return {hour:r,minute:a}}return null}function i(s,e){let n=s.toLowerCase();for(let[r,a]of e.days.entries())if(n.includes(a.toLowerCase()))return r;return null}var u={at:"a las",every:"cada",everyMinute:"cada minuto",everyHour:"cada hora",everyDay:"todos los d\xEDas",everyWeek:"cada semana",everyMonth:"cada mes",everyYear:"cada a\xF1o",minute:"minuto",minutes:"minutos",hour:"hora",hours:"horas",day:"d\xEDa",days:"d\xEDas",week:"semana",weeks:"semanas",month:"mes",months:"meses",year:"a\xF1o",years:"a\xF1os",on:"el",in:"en",and:"y",between:"entre",through:"hasta",of:"de",second:"segundo",seconds:"segundos",sunday:"domingo",monday:"lunes",tuesday:"martes",wednesday:"mi\xE9rcoles",thursday:"jueves",friday:"viernes",saturday:"s\xE1bado",january:"enero",february:"febrero",march:"marzo",april:"abril",may:"mayo",june:"junio",july:"julio",august:"agosto",september:"septiembre",october:"octubre",november:"noviembre",december:"diciembre",am:"AM",pm:"PM",midnight:"medianoche",noon:"mediod\xEDa",weekday:"d\xEDas de semana",weekend:"fines de semana"},c={days:["domingo","lunes","martes","mi\xE9rcoles","jueves","viernes","s\xE1bado"],months:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],patterns:[{regex:/^cada\s+minuto$/,toCron:()=>"* * * * *",description:"Cada minuto"},{regex:/^cada\s+(\d+)\s+minutos?$/,toCron:s=>`*/${s[1]} * * * *`,description:"Cada N minutos"},{regex:/^cada\s+hora$/,toCron:()=>"0 * * * *",description:"Cada hora"},{regex:/^cada\s+(\d+)\s+horas?$/,toCron:s=>`0 */${s[1]} * * *`,description:"Cada N horas"},{regex:/^todos\s+los\s+d[ií]as$/,toCron:()=>"0 0 * * *",description:"Todos los d\xEDas a medianoche"},{regex:/^todos\s+los\s+d[ií]as\s+a\s+las?\s+(.+)$/,toCron:s=>{let e=o(s[1]);if(!e)throw new Error("Formato de hora inv\xE1lido");return `${e.minute} ${e.hour} * * *`},description:"Todos los d\xEDas a una hora espec\xEDfica"},{regex:/^cada\s+semana$/,toCron:()=>"0 0 * * 0",description:"Cada semana (domingo a medianoche)"},{regex:/^(?:todos\s+los|cada)\s+(lunes|martes|mi[eé]rcoles|jueves|viernes|s[aá]bado|domingo)$/,toCron:(s,e)=>{let n=i(s[1],e);if(n===null)throw new Error("D\xEDa inv\xE1lido");return `0 0 * * ${n}`},description:"Cada d\xEDa espec\xEDfico de la semana"},{regex:/^(?:todos\s+los|cada)\s+(lunes|martes|mi[eé]rcoles|jueves|viernes|s[aá]bado|domingo)\s+a\s+las?\s+(.+)$/,toCron:(s,e)=>{let n=i(s[1],e),r=o(s[2]);if(n===null||!r)throw new Error("D\xEDa u hora inv\xE1lida");return `${r.minute} ${r.hour} * * ${n}`},description:"Cada d\xEDa espec\xEDfico a una hora espec\xEDfica"},{regex:/^cada\s+mes$/,toCron:()=>"0 0 1 * *",description:"Cada mes (d\xEDa 1 a medianoche)"},{regex:/^el\s+d[ií]a\s+(\d{1,2})\s+de\s+cada\s+mes(?:\s+a\s+las?\s+(.+))?$/,toCron:s=>{let e=parseInt(s[1],10);if(e<1||e>31)throw new Error("D\xEDa del mes inv\xE1lido");if(s[2]){let n=o(s[2]);if(!n)throw new Error("Formato de hora inv\xE1lido");return `${n.minute} ${n.hour} ${e} * *`}return `0 0 ${e} * *`},description:"D\xEDa espec\xEDfico de cada mes"},{regex:/^cada\s+a[ñn]o$/,toCron:()=>"0 0 1 1 *",description:"Cada a\xF1o (1 de enero a medianoche)"},{regex:/^a\s+las?\s+(.+)$/,toCron:s=>{let e=o(s[1]);if(!e)throw new Error("Formato de hora inv\xE1lido");return `${e.minute} ${e.hour} * * *`},description:"Diariamente a una hora espec\xEDfica"},{regex:/^(?:d[ií]as\s+de\s+semana|d[ií]as\s+laborales)\s+a\s+las?\s+(.+)$/,toCron:s=>{let e=o(s[1]);if(!e)throw new Error("Formato de hora inv\xE1lido");return `${e.minute} ${e.hour} * * 1-5`},description:"D\xEDas de semana a una hora espec\xEDfica"},{regex:/^fines?\s+de\s+semana\s+a\s+las?\s+(.+)$/,toCron:s=>{let e=o(s[1]);if(!e)throw new Error("Formato de hora inv\xE1lido");return `${e.minute} ${e.hour} * * 0,6`},description:"Fines de semana a una hora espec\xEDfica"}]};export{u as es,c as esPatterns};//# sourceMappingURL=es.js.map
2
2
  //# sourceMappingURL=es.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/i18n/es.ts"],"names":["es"],"mappings":"AAmEO,IAAMA,CAAAA,CAAkB,CAC7B,EAAA,CAAI,OAAA,CACJ,MAAO,MAAA,CACP,WAAA,CAAa,aAAA,CACb,SAAA,CAAW,WAAA,CACX,QAAA,CAAU,oBACV,SAAA,CAAW,aAAA,CACX,UAAA,CAAY,UAAA,CACZ,SAAA,CAAW,aAAA,CACX,OAAQ,QAAA,CACR,OAAA,CAAS,SAAA,CACT,IAAA,CAAM,MAAA,CACN,KAAA,CAAO,QACP,GAAA,CAAK,QAAA,CACL,IAAA,CAAM,SAAA,CACN,IAAA,CAAM,QAAA,CACN,MAAO,SAAA,CACP,KAAA,CAAO,KAAA,CACP,MAAA,CAAQ,OAAA,CACR,IAAA,CAAM,SACN,KAAA,CAAO,SAAA,CACP,EAAA,CAAI,IAAA,CACJ,EAAA,CAAI,IAAA,CACJ,IAAK,GAAA,CACL,OAAA,CAAS,OAAA,CACT,OAAA,CAAS,OAAA,CACT,EAAA,CAAI,KACJ,MAAA,CAAQ,SAAA,CACR,OAAA,CAAS,UAAA,CAGT,MAAA,CAAQ,SAAA,CACR,OAAQ,OAAA,CACR,OAAA,CAAS,QAAA,CACT,SAAA,CAAW,cAAA,CACX,QAAA,CAAU,SACV,MAAA,CAAQ,SAAA,CACR,QAAA,CAAU,WAAA,CAGV,OAAA,CAAS,OAAA,CACT,SAAU,SAAA,CACV,KAAA,CAAO,OAAA,CACP,KAAA,CAAO,OAAA,CACP,GAAA,CAAK,OACL,IAAA,CAAM,OAAA,CACN,IAAA,CAAM,OAAA,CACN,MAAA,CAAQ,QAAA,CACR,UAAW,YAAA,CACX,OAAA,CAAS,SAAA,CACT,QAAA,CAAU,WAAA,CACV,QAAA,CAAU,YAGV,EAAA,CAAI,IAAA,CACJ,EAAA,CAAI,IAAA,CACJ,QAAA,CAAU,YAAA,CACV,KAAM,aAAA,CAGN,OAAA,CAAS,kBAAA,CACT,OAAA,CAAS,eACX","file":"es.js","sourcesContent":["/**\n * Internationalization strings for Spanish\n */\nexport interface I18nStrings {\n at: string;\n every: string;\n everyMinute: string;\n everyHour: string;\n everyDay: string;\n everyWeek: string;\n everyMonth: string;\n everyYear: string;\n minute: string;\n minutes: string;\n hour: string;\n hours: string;\n day: string;\n days: string;\n week: string;\n weeks: string;\n month: string;\n months: string;\n year: string;\n years: string;\n on: string;\n in: string;\n and: string;\n between: string;\n through: string;\n of: string;\n second: string;\n seconds: string;\n\n // Day names\n sunday: string;\n monday: string;\n tuesday: string;\n wednesday: string;\n thursday: string;\n friday: string;\n saturday: string;\n\n // Month names\n january: string;\n february: string;\n march: string;\n april: string;\n may: string;\n june: string;\n july: string;\n august: string;\n september: string;\n october: string;\n november: string;\n december: string;\n\n // Time periods\n am: string;\n pm: string;\n midnight: string;\n noon: string;\n\n // Special\n weekday: string;\n weekend: string;\n}\n\nexport const es: I18nStrings = {\n at: 'a las',\n every: 'cada',\n everyMinute: 'cada minuto',\n everyHour: 'cada hora',\n everyDay: 'todos los días',\n everyWeek: 'cada semana',\n everyMonth: 'cada mes',\n everyYear: 'cada año',\n minute: 'minuto',\n minutes: 'minutos',\n hour: 'hora',\n hours: 'horas',\n day: 'día',\n days: 'días',\n week: 'semana',\n weeks: 'semanas',\n month: 'mes',\n months: 'meses',\n year: 'año',\n years: 'años',\n on: 'el',\n in: 'en',\n and: 'y',\n between: 'entre',\n through: 'hasta',\n of: 'de',\n second: 'segundo',\n seconds: 'segundos',\n\n // Day names\n sunday: 'domingo',\n monday: 'lunes',\n tuesday: 'martes',\n wednesday: 'miércoles',\n thursday: 'jueves',\n friday: 'viernes',\n saturday: 'sábado',\n\n // Month names\n january: 'enero',\n february: 'febrero',\n march: 'marzo',\n april: 'abril',\n may: 'mayo',\n june: 'junio',\n july: 'julio',\n august: 'agosto',\n september: 'septiembre',\n october: 'octubre',\n november: 'noviembre',\n december: 'diciembre',\n\n // Time periods\n am: 'AM',\n pm: 'PM',\n midnight: 'medianoche',\n noon: 'mediodía',\n\n // Special\n weekday: 'día de semana',\n weekend: 'fin de semana',\n};\n"]}
1
+ {"version":3,"sources":["../../src/core/humanizer.ts","../../src/i18n/es.ts"],"names":["parseTimeString","timeStr","cleaned","match","hour","period","minute","parseDayOfWeek","day","patterns","normalized","index","dayName","es","esPatterns","time"],"mappings":"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","file":"es.js","sourcesContent":["/**\n * Humanizer - Converts natural language text to cron expressions\n */\n\nimport type { Locale } from './types.js';\nimport { validateCron } from './validator.js';\nimport type { HumanizerPatterns } from '../i18n/en.js';\nimport { enPatterns } from '../i18n/en.js';\nimport { esPatterns } from '../i18n/es.js';\n\n/**\n * Options for humanizing text to cron\n */\nexport interface HumanizerOptions {\n /**\n * Locale for parsing the input text\n * @default 'en'\n */\n locale?: Locale;\n}\n\n/**\n * Result of humanizing text to cron\n */\nexport interface HumanizerResult {\n /**\n * Whether the text was successfully converted\n */\n success: boolean;\n\n /**\n * The generated cron expression\n */\n cronExpression?: string;\n\n /**\n * Error message if conversion failed\n */\n error?: string;\n\n /**\n * Suggestions for fixing the input\n */\n suggestions?: string[];\n}\n\n/**\n * Converts natural language text to a cron expression\n *\n * @param text - Human-readable text (e.g., \"every 5 minutes\", \"cada hora\")\n * @param options - Options for parsing\n * @returns Result with cron expression or error\n *\n * @example\n * ```typescript\n * humanizeCron(\"every 5 minutes\", { locale: 'en' });\n * // → { success: true, cronExpression: \"*\\/5 * * * *\" }\n *\n * humanizeCron(\"todos los días a las 2 am\", { locale: 'es' });\n * // → { success: true, cronExpression: \"0 2 * * *\" }\n * ```\n */\nexport function humanizeCron(text: string, options: HumanizerOptions = {}): HumanizerResult {\n const { locale = 'en' } = options;\n const patterns = locale === 'es' ? esPatterns : enPatterns;\n\n // Normalize text: lowercase, trim, remove extra spaces\n const normalized = text.toLowerCase().trim().replace(/\\s+/g, ' ');\n\n // Try to match against patterns\n for (const pattern of patterns.patterns) {\n const match = normalized.match(pattern.regex);\n if (match) {\n try {\n const cron = pattern.toCron(match, patterns);\n\n // Validate the generated cron\n const validation = validateCron(cron);\n if (validation.isValid) {\n return {\n success: true,\n cronExpression: cron,\n };\n } else {\n return {\n success: false,\n error: `Generated invalid cron: ${validation.error}`,\n suggestions: getSuggestions(normalized, locale),\n };\n }\n } catch {\n continue; // Try next pattern\n }\n }\n }\n\n // No pattern matched\n return {\n success: false,\n error:\n locale === 'es'\n ? 'No se pudo interpretar el texto. Intenta usar frases como \"cada 5 minutos\" o \"todos los días a las 2 am\".'\n : 'Could not parse the text. Try phrases like \"every 5 minutes\" or \"every day at 2 am\".',\n suggestions: getSuggestions(normalized, locale),\n };\n}\n\n/**\n * Get suggestions based on partial matches\n */\nfunction getSuggestions(text: string, locale: Locale): string[] {\n const suggestions: string[] = [];\n\n if (locale === 'es') {\n if (text.includes('minuto')) suggestions.push('cada 5 minutos');\n if (text.includes('hora')) suggestions.push('cada hora', 'cada 2 horas');\n if (text.includes('día') || text.includes('dia'))\n suggestions.push('todos los días', 'todos los días a las 9 am');\n if (text.includes('semana')) suggestions.push('cada semana', 'todos los lunes');\n if (text.includes('mes')) suggestions.push('cada mes', 'el día 1 de cada mes');\n if (text.includes('lunes') || text.includes('martes') || text.includes('miércoles')) {\n suggestions.push('todos los lunes a las 10 am');\n }\n } else {\n if (text.includes('minute')) suggestions.push('every 5 minutes', 'every 15 minutes');\n if (text.includes('hour')) suggestions.push('every hour', 'every 2 hours');\n if (text.includes('day')) suggestions.push('every day', 'every day at 9 am');\n if (text.includes('week')) suggestions.push('every week', 'every monday');\n if (text.includes('month')) suggestions.push('every month', 'on the 1st of every month');\n if (text.includes('monday') || text.includes('tuesday') || text.includes('wednesday')) {\n suggestions.push('every monday at 10 am');\n }\n }\n\n return suggestions.slice(0, 3); // Return max 3 suggestions\n}\n\n/**\n * Helper to parse time strings like \"2am\", \"14:30\", \"2:30 pm\"\n */\nexport function parseTimeString(timeStr: string): { hour: number; minute: number } | null {\n // Remove spaces\n const cleaned = timeStr.replace(/\\s+/g, '');\n\n // Pattern: 2am, 2pm, 14, etc.\n let match = cleaned.match(/^(\\d{1,2})(am|pm)?$/i);\n if (match) {\n let hour = parseInt(match[1], 10);\n const period = match[2]?.toLowerCase();\n\n if (period === 'pm' && hour !== 12) hour += 12;\n if (period === 'am' && hour === 12) hour = 0;\n\n if (hour >= 0 && hour <= 23) {\n return { hour, minute: 0 };\n }\n }\n\n // Pattern: 14:30, 2:30pm, 2:30 pm\n match = cleaned.match(/^(\\d{1,2}):(\\d{2})(am|pm)?$/i);\n if (match) {\n let hour = parseInt(match[1], 10);\n const minute = parseInt(match[2], 10);\n const period = match[3]?.toLowerCase();\n\n if (period === 'pm' && hour !== 12) hour += 12;\n if (period === 'am' && hour === 12) hour = 0;\n\n if (hour >= 0 && hour <= 23 && minute >= 0 && minute <= 59) {\n return { hour, minute };\n }\n }\n\n return null;\n}\n\n/**\n * Helper to parse day of week names\n */\nexport function parseDayOfWeek(day: string, patterns: HumanizerPatterns): number | null {\n const normalized = day.toLowerCase();\n\n for (const [index, dayName] of patterns.days.entries()) {\n if (normalized.includes(dayName.toLowerCase())) {\n return index; // 0 = Sunday, 1 = Monday, etc.\n }\n }\n\n return null;\n}\n","/**\n * Internationalization strings for Spanish\n */\nexport interface I18nStrings {\n at: string;\n every: string;\n everyMinute: string;\n everyHour: string;\n everyDay: string;\n everyWeek: string;\n everyMonth: string;\n everyYear: string;\n minute: string;\n minutes: string;\n hour: string;\n hours: string;\n day: string;\n days: string;\n week: string;\n weeks: string;\n month: string;\n months: string;\n year: string;\n years: string;\n on: string;\n in: string;\n and: string;\n between: string;\n through: string;\n of: string;\n second: string;\n seconds: string;\n\n // Day names\n sunday: string;\n monday: string;\n tuesday: string;\n wednesday: string;\n thursday: string;\n friday: string;\n saturday: string;\n\n // Month names\n january: string;\n february: string;\n march: string;\n april: string;\n may: string;\n june: string;\n july: string;\n august: string;\n september: string;\n october: string;\n november: string;\n december: string;\n\n // Time periods\n am: string;\n pm: string;\n midnight: string;\n noon: string;\n\n // Special\n weekday: string;\n weekend: string;\n}\n\nexport const es: I18nStrings = {\n at: 'a las',\n every: 'cada',\n everyMinute: 'cada minuto',\n everyHour: 'cada hora',\n everyDay: 'todos los días',\n everyWeek: 'cada semana',\n everyMonth: 'cada mes',\n everyYear: 'cada año',\n minute: 'minuto',\n minutes: 'minutos',\n hour: 'hora',\n hours: 'horas',\n day: 'día',\n days: 'días',\n week: 'semana',\n weeks: 'semanas',\n month: 'mes',\n months: 'meses',\n year: 'año',\n years: 'años',\n on: 'el',\n in: 'en',\n and: 'y',\n between: 'entre',\n through: 'hasta',\n of: 'de',\n second: 'segundo',\n seconds: 'segundos',\n\n // Day names\n sunday: 'domingo',\n monday: 'lunes',\n tuesday: 'martes',\n wednesday: 'miércoles',\n thursday: 'jueves',\n friday: 'viernes',\n saturday: 'sábado',\n\n // Month names\n january: 'enero',\n february: 'febrero',\n march: 'marzo',\n april: 'abril',\n may: 'mayo',\n june: 'junio',\n july: 'julio',\n august: 'agosto',\n september: 'septiembre',\n october: 'octubre',\n november: 'noviembre',\n december: 'diciembre',\n\n // Time periods\n am: 'AM',\n pm: 'PM',\n midnight: 'medianoche',\n noon: 'mediodía',\n\n // Special\n weekday: 'días de semana',\n weekend: 'fines de semana',\n};\n\nimport type { HumanizerPatterns } from './en.js';\nimport { parseTimeString, parseDayOfWeek } from '../core/humanizer.js';\n\nexport const esPatterns: HumanizerPatterns = {\n days: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n months: [\n 'enero',\n 'febrero',\n 'marzo',\n 'abril',\n 'mayo',\n 'junio',\n 'julio',\n 'agosto',\n 'septiembre',\n 'octubre',\n 'noviembre',\n 'diciembre',\n ],\n\n patterns: [\n // \"cada minuto\" → * * * * *\n {\n regex: /^cada\\s+minuto$/,\n toCron: () => '* * * * *',\n description: 'Cada minuto',\n },\n\n // \"cada 5 minutos\" → */5 * * * *\n {\n regex: /^cada\\s+(\\d+)\\s+minutos?$/,\n toCron: (match) => `*/${match[1]} * * * *`,\n description: 'Cada N minutos',\n },\n\n // \"cada hora\" → 0 * * * *\n {\n regex: /^cada\\s+hora$/,\n toCron: () => '0 * * * *',\n description: 'Cada hora',\n },\n\n // \"cada 2 horas\" → 0 */2 * * *\n {\n regex: /^cada\\s+(\\d+)\\s+horas?$/,\n toCron: (match) => `0 */${match[1]} * * *`,\n description: 'Cada N horas',\n },\n\n // \"todos los días\" or \"todos los dias\" → 0 0 * * *\n {\n regex: /^todos\\s+los\\s+d[ií]as$/,\n toCron: () => '0 0 * * *',\n description: 'Todos los días a medianoche',\n },\n\n // \"todos los días a las 2am\" or \"todos los dias a las 14:30\"\n {\n regex: /^todos\\s+los\\s+d[ií]as\\s+a\\s+las?\\s+(.+)$/,\n toCron: (match) => {\n const time = parseTimeString(match[1]);\n if (!time) throw new Error('Formato de hora inválido');\n return `${time.minute} ${time.hour} * * *`;\n },\n description: 'Todos los días a una hora específica',\n },\n\n // \"cada semana\" → 0 0 * * 0\n {\n regex: /^cada\\s+semana$/,\n toCron: () => '0 0 * * 0',\n description: 'Cada semana (domingo a medianoche)',\n },\n\n // \"todos los lunes\" or \"cada lunes\"\n {\n regex:\n /^(?:todos\\s+los|cada)\\s+(lunes|martes|mi[eé]rcoles|jueves|viernes|s[aá]bado|domingo)$/,\n toCron: (match, patterns) => {\n const day = parseDayOfWeek(match[1], patterns);\n if (day === null) throw new Error('Día inválido');\n return `0 0 * * ${day}`;\n },\n description: 'Cada día específico de la semana',\n },\n\n // \"todos los lunes a las 10am\"\n {\n regex:\n /^(?:todos\\s+los|cada)\\s+(lunes|martes|mi[eé]rcoles|jueves|viernes|s[aá]bado|domingo)\\s+a\\s+las?\\s+(.+)$/,\n toCron: (match, patterns) => {\n const day = parseDayOfWeek(match[1], patterns);\n const time = parseTimeString(match[2]);\n if (day === null || !time) throw new Error('Día u hora inválida');\n return `${time.minute} ${time.hour} * * ${day}`;\n },\n description: 'Cada día específico a una hora específica',\n },\n\n // \"cada mes\" → 0 0 1 * *\n {\n regex: /^cada\\s+mes$/,\n toCron: () => '0 0 1 * *',\n description: 'Cada mes (día 1 a medianoche)',\n },\n\n // \"el día 1 de cada mes\" or \"el dia 15 de cada mes\"\n {\n regex: /^el\\s+d[ií]a\\s+(\\d{1,2})\\s+de\\s+cada\\s+mes(?:\\s+a\\s+las?\\s+(.+))?$/,\n toCron: (match) => {\n const day = parseInt(match[1], 10);\n if (day < 1 || day > 31) throw new Error('Día del mes inválido');\n\n if (match[2]) {\n const time = parseTimeString(match[2]);\n if (!time) throw new Error('Formato de hora inválido');\n return `${time.minute} ${time.hour} ${day} * *`;\n }\n return `0 0 ${day} * *`;\n },\n description: 'Día específico de cada mes',\n },\n\n // \"cada año\" → 0 0 1 1 *\n {\n regex: /^cada\\s+a[ñn]o$/,\n toCron: () => '0 0 1 1 *',\n description: 'Cada año (1 de enero a medianoche)',\n },\n\n // \"a las 2am\" or \"a las 14:30\"\n {\n regex: /^a\\s+las?\\s+(.+)$/,\n toCron: (match) => {\n const time = parseTimeString(match[1]);\n if (!time) throw new Error('Formato de hora inválido');\n return `${time.minute} ${time.hour} * * *`;\n },\n description: 'Diariamente a una hora específica',\n },\n\n // \"días de semana a las 9am\" or \"dias laborales a las 9am\"\n {\n regex: /^(?:d[ií]as\\s+de\\s+semana|d[ií]as\\s+laborales)\\s+a\\s+las?\\s+(.+)$/,\n toCron: (match) => {\n const time = parseTimeString(match[1]);\n if (!time) throw new Error('Formato de hora inválido');\n return `${time.minute} ${time.hour} * * 1-5`;\n },\n description: 'Días de semana a una hora específica',\n },\n\n // \"fines de semana a las 10am\"\n {\n regex: /^fines?\\s+de\\s+semana\\s+a\\s+las?\\s+(.+)$/,\n toCron: (match) => {\n const time = parseTimeString(match[1]);\n if (!time) throw new Error('Formato de hora inválido');\n return `${time.minute} ${time.hour} * * 0,6`;\n },\n description: 'Fines de semana a una hora específica',\n },\n ],\n};\n"]}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var g={"@yearly":"0 0 1 1 *","@annually":"0 0 1 1 *","@monthly":"0 0 1 * *","@weekly":"0 0 * * 0","@daily":"0 0 * * *","@midnight":"0 0 * * *","@hourly":"0 * * * *"},l={minute:{min:0,max:59,name:"minute"},hour:{min:0,max:23,name:"hour"},dayOfMonth:{min:1,max:31,name:"day of month"},month:{min:1,max:12,name:"month"},dayOfWeek:{min:0,max:7,name:"day of week"},second:{min:0,max:59,name:"second"}},c={JAN:1,FEB:2,MAR:3,APR:4,MAY:5,JUN:6,JUL:7,AUG:8,SEP:9,OCT:10,NOV:11,DEC:12},y={SUN:0,MON:1,TUE:2,WED:3,THU:4,FRI:5,SAT:6};function S(r,e=false){if(!r||typeof r!="string")return {isValid:false,error:"Cron expression must be a non-empty string"};let t=r.trim();if(t.startsWith("@"))return g[t]?{isValid:true}:{isValid:false,error:`Unknown special keyword: ${t}`};let n=t.split(/\s+/),s=e?6:5;if(n.length!==s)return {isValid:false,error:`Expected ${s} fields, got ${n.length}`};let a=e?["second","minute","hour","dayOfMonth","month","dayOfWeek"]:["minute","hour","dayOfMonth","month","dayOfWeek"];for(let i=0;i<n.length;i++){let o=a[i],u=n[i],d=l[o],f=E(u,d,o);if(!f.isValid)return {isValid:false,error:f.error,field:o}}return {isValid:true}}function E(r,e,t){return r?r==="*"?{isValid:true}:r==="?"?t==="dayOfMonth"||t==="dayOfWeek"?{isValid:true}:{isValid:false,error:`Question mark (?) is only valid for day fields, not ${e.name}`}:r.includes("/")?j(r,e,t):r.includes(",")?D(r,e,t):r.includes("-")?C(r,e,t):O(r,e,t):{isValid:false,error:`${e.name} field cannot be empty`}}function j(r,e,t){let n=r.split("/");if(n.length!==2)return {isValid:false,error:`Invalid step syntax in ${e.name}: ${r}`};let[s,a]=n,i=parseInt(a,10);return isNaN(i)||i<=0?{isValid:false,error:`Invalid step value in ${e.name}: ${a}`}:s==="*"?{isValid:true}:s.includes("-")?C(s,e,t):O(s,e,t)}function C(r,e,t){let n=r.split("-");if(n.length!==2)return {isValid:false,error:`Invalid range syntax in ${e.name}: ${r}`};let[s,a]=n,i=b(s,t),o=b(a,t);return i===null?{isValid:false,error:`Invalid start value in ${e.name} range: ${s}`}:o===null?{isValid:false,error:`Invalid end value in ${e.name} range: ${a}`}:i<e.min||i>e.max?{isValid:false,error:`Start value ${i} is out of range for ${e.name} (${e.min}-${e.max})`}:o<e.min||o>e.max?{isValid:false,error:`End value ${o} is out of range for ${e.name} (${e.min}-${e.max})`}:i>o?{isValid:false,error:`Start value ${i} cannot be greater than end value ${o} in ${e.name}`}:{isValid:true}}function D(r,e,t){let n=r.split(",");for(let s of n){let a=s.trim();if(!a)return {isValid:false,error:`Empty value in ${e.name} list`};if(a.includes("-")){let i=C(a,e,t);if(!i.isValid)return i}else {let i=O(a,e,t);if(!i.isValid)return i}}return {isValid:true}}function O(r,e,t){let n=b(r,t);return n===null?{isValid:false,error:`Invalid value in ${e.name}: ${r}`}:n<e.min||n>e.max?{isValid:false,error:`Value ${n} is out of range for ${e.name} (${e.min}-${e.max})`}:{isValid:true}}function b(r,e){let t=parseInt(r,10);if(!isNaN(t))return t;if(e==="month"){let n=c[r.toUpperCase()];if(n!==void 0)return n}if(e==="dayOfWeek"){let n=y[r.toUpperCase()];if(n!==void 0)return n}return null}function M(r,e=false){let t=S(r,e);if(!t.isValid)throw new Error(t.error||"Invalid cron expression");let n=r.trim();if(n.startsWith("@")){let s=g[n];return {expression:n,...k(s,false),isSpecial:true,specialKeyword:n}}return {expression:n,...k(n,e),isSpecial:false}}function k(r,e){let t=r.split(/\s+/);if(e&&t.length===6){let[u,d,f,I,R,A]=t;return {second:m(u,l.second,"second"),minute:m(d,l.minute,"minute"),hour:m(f,l.hour,"hour"),dayOfMonth:m(I,l.dayOfMonth,"dayOfMonth"),month:m(R,l.month,"month"),dayOfWeek:m(A,l.dayOfWeek,"dayOfWeek")}}let[n,s,a,i,o]=t;return {minute:m(n,l.minute,"minute"),hour:m(s,l.hour,"hour"),dayOfMonth:m(a,l.dayOfMonth,"dayOfMonth"),month:m(i,l.month,"month"),dayOfWeek:m(o,l.dayOfWeek,"dayOfWeek")}}function m(r,e,t){let n=r,s=r==="*"||r==="?",a=r.includes("/"),i=r.includes("-")&&!a,o=r.includes(","),u;if(s)u=W(e.min,e.max);else if(a)u=N(r,e,t);else if(o)u=T(r,e,t);else if(i)u=V(r,e,t);else {let d=h(r,t);u=d!==null?[d]:[];}return t==="dayOfWeek"&&(u=u.map(d=>d===7?0:d),u=[...new Set(u)]),u.sort((d,f)=>d-f),{raw:n,values:u,isWildcard:s,isRange:i,isStep:a,isList:o}}function N(r,e,t){let[n,s]=r.split("/"),a=parseInt(s,10),i;if(n==="*")i=W(e.min,e.max);else if(n.includes("-"))i=V(n,e,t);else {let u=h(n,t);i=u!==null?[u]:[];}let o=[];for(let u=0;u<i.length;u+=a)o.push(i[u]);return o}function V(r,e,t){let[n,s]=r.split("-"),a=h(n,t),i=h(s,t);return a===null||i===null?[]:W(a,i)}function T(r,e,t){let n=r.split(","),s=[];for(let a of n){let i=a.trim();if(i.includes("-")){let o=V(i,e,t);s.push(...o);}else {let o=h(i,t);o!==null&&s.push(o);}}return s}function h(r,e){let t=parseInt(r,10);if(!isNaN(t))return t;if(e==="month"){let n=c[r.toUpperCase()];if(n!==void 0)return n}if(e==="dayOfWeek"){let n=y[r.toUpperCase()];if(n!==void 0)return n}return null}function W(r,e){let t=[];for(let n=r;n<=e;n++)t.push(n);return t}var x={at:"a las",every:"cada",everyMinute:"cada minuto",everyHour:"cada hora",everyDay:"todos los d\xEDas",everyWeek:"cada semana",everyMonth:"cada mes",everyYear:"cada a\xF1o",minute:"minuto",minutes:"minutos",day:"d\xEDa",days:"d\xEDas",on:"el",in:"en",and:"y",between:"entre",through:"hasta",second:"segundo",sunday:"domingo",monday:"lunes",tuesday:"martes",wednesday:"mi\xE9rcoles",thursday:"jueves",friday:"viernes",saturday:"s\xE1bado",january:"enero",february:"febrero",march:"marzo",april:"abril",may:"mayo",june:"junio",july:"julio",august:"agosto",september:"septiembre",october:"octubre",november:"noviembre",december:"diciembre",am:"AM",pm:"PM",midnight:"medianoche",weekday:"d\xEDa de semana",weekend:"fin de semana"};var w={at:"at",every:"every",everyMinute:"every minute",everyHour:"every hour",everyDay:"every day",everyWeek:"every week",everyMonth:"every month",everyYear:"every year",minute:"minute",minutes:"minutes",day:"day",days:"days",on:"on",in:"in",and:"and",between:"between",through:"through",second:"second",sunday:"Sunday",monday:"Monday",tuesday:"Tuesday",wednesday:"Wednesday",thursday:"Thursday",friday:"Friday",saturday:"Saturday",january:"January",february:"February",march:"March",april:"April",may:"May",june:"June",july:"July",august:"August",september:"September",october:"October",november:"November",december:"December",am:"AM",pm:"PM",midnight:"midnight",weekday:"weekday",weekend:"weekend"};function P(r){if(r.length<2)return false;for(let e=1;e<r.length;e++)if(r[e]!==r[e-1]+1)return false;return true}function L(r,e={}){let{locale:t="en",use24HourFormat:n=true,includeSeconds:s=false,verbose:a=false}=e,i=t==="es"?x:w,o=M(r,s);return o.isSpecial&&o.specialKeyword?_(o.specialKeyword,i):Y(o,i,n,a)}function _(r,e){return {"@yearly":e.everyYear,"@annually":e.everyYear,"@monthly":e.everyMonth,"@weekly":e.everyWeek,"@daily":e.everyDay,"@midnight":`${e.at} ${e.midnight}`,"@hourly":e.everyHour}[r]||r}function Y(r,e,t,n){let s=[],a=U(r,e,t);a&&s.push(a);let i=K(r,e,n);return i&&s.push(i),s.join(", ")}function U(r,e,t){let{minute:n,hour:s,second:a}=r;if(n.isWildcard&&s.isWildcard)return a&&!a.isWildcard?`${e.at} ${e.second} ${a.values.join(", ")}`:e.everyMinute;if(n.isWildcard){if(s.values.length===1){let i=p(s.values[0],t,e);return `${e.everyMinute} ${e.at} ${i}`}if(s.values.length>1&&s.isRange){let i=p(s.values[0],t,e),o=p(s.values[s.values.length-1],t,e);return `${e.everyMinute}, ${e.between} ${i} ${e.and} ${o}`}}if(s.isWildcard&&!n.isWildcard){if(n.values.length===1)return `${e.at} ${e.minute} ${n.values[0]}`;if(n.isStep){let i=n.values[1]-n.values[0];return `${e.every} ${i} ${e.minutes}`}}if(!n.isWildcard&&!s.isWildcard){if(n.values.length===1&&s.values.length===1){let i=v(s.values[0],n.values[0]),o=t?i:$(s.values[0],n.values[0],e);return `${e.at} ${o}`}if(n.values.length>1||s.values.length>1){if(n.values.length===1&&s.isRange&&s.values.length>1&&P(s.values)){let i=t?v(s.values[0],n.values[0]):$(s.values[0],n.values[0],e),o=t?v(s.values[s.values.length-1],n.values[0]):$(s.values[s.values.length-1],n.values[0],e);return `${e.between} ${i} ${e.and} ${o}`}if(n.isStep){let i=n.values[1]-n.values[0];if(s.isRange){let o=p(s.values[0],t,e),u=p(s.values[s.values.length-1],t,e);return `${e.every} ${i} ${e.minutes}, ${e.between} ${o} ${e.and} ${u}`}return `${e.every} ${i} ${e.minutes}`}}}return H(r,e,t)}function K(r,e,t){let{dayOfMonth:n,month:s,dayOfWeek:a}=r;if(n.isWildcard&&a.isWildcard&&s.isWildcard)return e.everyDay;let i=[];if(!a.isWildcard){let o=J(a.values,e,t);o&&i.push(o);}if(!n.isWildcard&&a.isWildcard){let o=z(n.values,e,t);o&&i.push(o);}if(!s.isWildcard){let o=B(s.values,e,t);o&&i.push(o);}return i.join(", ")}function v(r,e){return `${r.toString().padStart(2,"0")}:${e.toString().padStart(2,"0")}`}function $(r,e,t){let n=r<12?t.am:t.pm;return `${r===0?12:r>12?r-12:r}:${e.toString().padStart(2,"0")} ${n}`}function p(r,e,t){return e?`${r.toString().padStart(2,"0")}:00`:$(r,0,t)}function H(r,e,t){let n=[];for(let s of r.hour.values)for(let a of r.minute.values){let i=t?v(s,a):$(s,a,e);n.push(i);}return n.length<=3?`${e.at} ${n.join(", ")}`:`${e.at} ${n.slice(0,2).join(", ")}... (${n.length} times)`}function J(r,e,t){let n=[e.sunday,e.monday,e.tuesday,e.wednesday,e.thursday,e.friday,e.saturday];if(r.length===5&&r.includes(1)&&r.includes(2)&&r.includes(3)&&r.includes(4)&&r.includes(5))return e.weekday+"s";if(r.length===2&&r.includes(0)&&r.includes(6))return e.weekend+"s";if(r.length===1)return e.on+" "+n[r[0]];if(r.length===7)return e.everyDay;let s=r.map(a=>n[a]);return t||r.length<=3?F(s,e):`${s[0]} ${e.through} ${s[s.length-1]}`}function z(r,e,t){return r.length===1?`${e.on} ${e.day} ${r[0]}`:r.length===31?e.everyDay:t||r.length<=3?`${e.on} ${e.days} ${r.join(", ")}`:`${e.on} ${e.days} ${r[0]} ${e.through} ${r[r.length-1]}`}function B(r,e,t){let n=[e.january,e.february,e.march,e.april,e.may,e.june,e.july,e.august,e.september,e.october,e.november,e.december];if(r.length===1)return `${e.in} ${n[r[0]-1]}`;if(r.length===12)return "";let s=r.map(a=>n[a-1]);return t||r.length<=3?`${e.in} ${F(s,e)}`:`${e.in} ${s[0]} ${e.through} ${s[s.length-1]}`}function F(r,e){if(r.length===0)return "";if(r.length===1)return r[0];if(r.length===2)return `${r[0]} ${e.and} ${r[1]}`;let t=r[r.length-1];return `${r.slice(0,-1).join(", ")}, ${e.and} ${t}`}exports.DAY_NAMES=y;exports.FIELD_CONSTRAINTS=l;exports.MONTH_NAMES=c;exports.SPECIAL_KEYWORDS=g;exports.formatCron=L;exports.parseCron=M;exports.validateCron=S;//# sourceMappingURL=index.cjs.map
1
+ 'use strict';var g={"@yearly":"0 0 1 1 *","@annually":"0 0 1 1 *","@monthly":"0 0 1 * *","@weekly":"0 0 * * 0","@daily":"0 0 * * *","@midnight":"0 0 * * *","@hourly":"0 * * * *"},d={minute:{min:0,max:59,name:"minute"},hour:{min:0,max:23,name:"hour"},dayOfMonth:{min:1,max:31,name:"day of month"},month:{min:1,max:12,name:"month"},dayOfWeek:{min:0,max:7,name:"day of week"},second:{min:0,max:59,name:"second"}},p={JAN:1,FEB:2,MAR:3,APR:4,MAY:5,JUN:6,JUL:7,AUG:8,SEP:9,OCT:10,NOV:11,DEC:12},h={SUN:0,MON:1,TUE:2,WED:3,THU:4,FRI:5,SAT:6};function $(r,e=false){if(!r||typeof r!="string")return {isValid:false,error:"Cron expression must be a non-empty string"};let n=r.trim();if(n.startsWith("@"))return g[n]?{isValid:true}:{isValid:false,error:`Unknown special keyword: ${n}`};let t=n.split(/\s+/),s=e?6:5;if(t.length!==s)return {isValid:false,error:`Expected ${s} fields, got ${t.length}`};let i=e?["second","minute","hour","dayOfMonth","month","dayOfWeek"]:["minute","hour","dayOfMonth","month","dayOfWeek"];for(let o=0;o<t.length;o++){let a=i[o],u=t[o],m=d[a],y=N(u,m,a);if(!y.isValid)return {isValid:false,error:y.error,field:a}}return {isValid:true}}function N(r,e,n){return r?r==="*"?{isValid:true}:r==="?"?n==="dayOfMonth"||n==="dayOfWeek"?{isValid:true}:{isValid:false,error:`Question mark (?) is only valid for day fields, not ${e.name}`}:r.includes("/")?L(r,e,n):r.includes(",")?z(r,e,n):r.includes("-")?x(r,e,n):O(r,e,n):{isValid:false,error:`${e.name} field cannot be empty`}}function L(r,e,n){let t=r.split("/");if(t.length!==2)return {isValid:false,error:`Invalid step syntax in ${e.name}: ${r}`};let[s,i]=t,o=parseInt(i,10);return isNaN(o)||o<=0?{isValid:false,error:`Invalid step value in ${e.name}: ${i}`}:s==="*"?{isValid:true}:s.includes("-")?x(s,e,n):O(s,e,n)}function x(r,e,n){let t=r.split("-");if(t.length!==2)return {isValid:false,error:`Invalid range syntax in ${e.name}: ${r}`};let[s,i]=t,o=S(s,n),a=S(i,n);return o===null?{isValid:false,error:`Invalid start value in ${e.name} range: ${s}`}:a===null?{isValid:false,error:`Invalid end value in ${e.name} range: ${i}`}:o<e.min||o>e.max?{isValid:false,error:`Start value ${o} is out of range for ${e.name} (${e.min}-${e.max})`}:a<e.min||a>e.max?{isValid:false,error:`End value ${a} is out of range for ${e.name} (${e.min}-${e.max})`}:o>a?{isValid:false,error:`Start value ${o} cannot be greater than end value ${a} in ${e.name}`}:{isValid:true}}function z(r,e,n){let t=r.split(",");for(let s of t){let i=s.trim();if(!i)return {isValid:false,error:`Empty value in ${e.name} list`};if(i.includes("-")){let o=x(i,e,n);if(!o.isValid)return o}else {let o=O(i,e,n);if(!o.isValid)return o}}return {isValid:true}}function O(r,e,n){let t=S(r,n);return t===null?{isValid:false,error:`Invalid value in ${e.name}: ${r}`}:t<e.min||t>e.max?{isValid:false,error:`Value ${t} is out of range for ${e.name} (${e.min}-${e.max})`}:{isValid:true}}function S(r,e){let n=parseInt(r,10);if(!isNaN(n))return n;if(e==="month"){let t=p[r.toUpperCase()];if(t!==void 0)return t}if(e==="dayOfWeek"){let t=h[r.toUpperCase()];if(t!==void 0)return t}return null}function k(r,e=false){let n=$(r,e);if(!n.isValid)throw new Error(n.error||"Invalid cron expression");let t=r.trim();if(t.startsWith("@")){let s=g[t];return {expression:t,...W(s,false),isSpecial:true,specialKeyword:t}}return {expression:t,...W(t,e),isSpecial:false}}function W(r,e){let n=r.split(/\s+/);if(e&&n.length===6){let[u,m,y,P,A,T]=n;return {second:c(u,d.second,"second"),minute:c(m,d.minute,"minute"),hour:c(y,d.hour,"hour"),dayOfMonth:c(P,d.dayOfMonth,"dayOfMonth"),month:c(A,d.month,"month"),dayOfWeek:c(T,d.dayOfWeek,"dayOfWeek")}}let[t,s,i,o,a]=n;return {minute:c(t,d.minute,"minute"),hour:c(s,d.hour,"hour"),dayOfMonth:c(i,d.dayOfMonth,"dayOfMonth"),month:c(o,d.month,"month"),dayOfWeek:c(a,d.dayOfWeek,"dayOfWeek")}}function c(r,e,n){let t=r,s=r==="*"||r==="?",i=r.includes("/"),o=r.includes("-")&&!i,a=r.includes(","),u;if(s)u=I(e.min,e.max);else if(i)u=H(r,e,n);else if(a)u=_(r,e,n);else if(o)u=E(r,e,n);else {let m=v(r,n);u=m!==null?[m]:[];}return n==="dayOfWeek"&&(u=u.map(m=>m===7?0:m),u=[...new Set(u)]),u.sort((m,y)=>m-y),{raw:t,values:u,isWildcard:s,isRange:o,isStep:i,isList:a}}function H(r,e,n){let[t,s]=r.split("/"),i=parseInt(s,10),o;if(t==="*")o=I(e.min,e.max);else if(t.includes("-"))o=E(t,e,n);else {let u=v(t,n);o=u!==null?[u]:[];}let a=[];for(let u=0;u<o.length;u+=i)a.push(o[u]);return a}function E(r,e,n){let[t,s]=r.split("-"),i=v(t,n),o=v(s,n);return i===null||o===null?[]:I(i,o)}function _(r,e,n){let t=r.split(","),s=[];for(let i of t){let o=i.trim();if(o.includes("-")){let a=E(o,e,n);s.push(...a);}else {let a=v(o,n);a!==null&&s.push(a);}}return s}function v(r,e){let n=parseInt(r,10);if(!isNaN(n))return n;if(e==="month"){let t=p[r.toUpperCase()];if(t!==void 0)return t}if(e==="dayOfWeek"){let t=h[r.toUpperCase()];if(t!==void 0)return t}return null}function I(r,e){let n=[];for(let t=r;t<=e;t++)n.push(t);return n}var M={at:"at",every:"every",everyMinute:"every minute",everyHour:"every hour",everyDay:"every day",everyWeek:"every week",everyMonth:"every month",everyYear:"every year",minute:"minute",minutes:"minutes",day:"day",days:"days",on:"on",in:"in",and:"and",between:"between",through:"through",second:"second",sunday:"Sunday",monday:"Monday",tuesday:"Tuesday",wednesday:"Wednesday",thursday:"Thursday",friday:"Friday",saturday:"Saturday",january:"January",february:"February",march:"March",april:"April",may:"May",june:"June",july:"July",august:"August",september:"September",october:"October",november:"November",december:"December",am:"AM",pm:"PM",midnight:"midnight",weekday:"weekdays",weekend:"weekends"},V={days:["sunday","monday","tuesday","wednesday","thursday","friday","saturday"],months:["january","february","march","april","may","june","july","august","september","october","november","december"],patterns:[{regex:/^every\s+minute$/,toCron:()=>"* * * * *",description:"Every minute"},{regex:/^every\s+(\d+)\s+minutes?$/,toCron:r=>`*/${r[1]} * * * *`,description:"Every N minutes"},{regex:/^every\s+hour$/,toCron:()=>"0 * * * *",description:"Every hour"},{regex:/^every\s+(\d+)\s+hours?$/,toCron:r=>`0 */${r[1]} * * *`,description:"Every N hours"},{regex:/^every\s+day$/,toCron:()=>"0 0 * * *",description:"Every day at midnight"},{regex:/^every\s+day\s+at\s+(.+)$/,toCron:r=>{let e=l(r[1]);if(!e)throw new Error("Invalid time format");return `${e.minute} ${e.hour} * * *`},description:"Every day at specific time"},{regex:/^every\s+week$/,toCron:()=>"0 0 * * 0",description:"Every week (Sunday at midnight)"},{regex:/^every\s+(monday|mon|tuesday|tue|wednesday|wed|thursday|thu|friday|fri|saturday|sat|sunday|sun)$/,toCron:(r,e)=>{let n=f(r[1],e);if(n===null)throw new Error("Invalid day");return `0 0 * * ${n}`},description:"Every specific day of week"},{regex:/^every\s+(monday|mon|tuesday|tue|wednesday|wed|thursday|thu|friday|fri|saturday|sat|sunday|sun)\s+at\s+(.+)$/,toCron:(r,e)=>{let n=f(r[1],e),t=l(r[2]);if(n===null||!t)throw new Error("Invalid day or time");return `${t.minute} ${t.hour} * * ${n}`},description:"Every specific day at specific time"},{regex:/^every\s+month$/,toCron:()=>"0 0 1 * *",description:"Every month (1st at midnight)"},{regex:/^on\s+the\s+(\d{1,2})(?:st|nd|rd|th)?\s+of\s+every\s+month(?:\s+at\s+(.+))?$/,toCron:r=>{let e=parseInt(r[1],10);if(e<1||e>31)throw new Error("Invalid day of month");if(r[2]){let n=l(r[2]);if(!n)throw new Error("Invalid time format");return `${n.minute} ${n.hour} ${e} * *`}return `0 0 ${e} * *`},description:"Specific day of every month"},{regex:/^every\s+year$/,toCron:()=>"0 0 1 1 *",description:"Every year (Jan 1st at midnight)"},{regex:/^at\s+(.+)$/,toCron:r=>{let e=l(r[1]);if(!e)throw new Error("Invalid time format");return `${e.minute} ${e.hour} * * *`},description:"Daily at specific time"},{regex:/^(?:on\s+)?weekdays?\s+at\s+(.+)$/,toCron:r=>{let e=l(r[1]);if(!e)throw new Error("Invalid time format");return `${e.minute} ${e.hour} * * 1-5`},description:"Weekdays at specific time"},{regex:/^(?:on\s+)?weekends?\s+at\s+(.+)$/,toCron:r=>{let e=l(r[1]);if(!e)throw new Error("Invalid time format");return `${e.minute} ${e.hour} * * 0,6`},description:"Weekends at specific time"}]};function Y(r,e={}){let{locale:n="en"}=e,t=n==="es"?j:V,s=r.toLowerCase().trim().replace(/\s+/g," ");for(let i of t.patterns){let o=s.match(i.regex);if(o)try{let a=i.toCron(o,t),u=$(a);return u.isValid?{success:!0,cronExpression:a}:{success:!1,error:`Generated invalid cron: ${u.error}`,suggestions:F(s,n)}}catch{continue}}return {success:false,error:n==="es"?'No se pudo interpretar el texto. Intenta usar frases como "cada 5 minutos" o "todos los d\xEDas a las 2 am".':'Could not parse the text. Try phrases like "every 5 minutes" or "every day at 2 am".',suggestions:F(s,n)}}function F(r,e){let n=[];return e==="es"?(r.includes("minuto")&&n.push("cada 5 minutos"),r.includes("hora")&&n.push("cada hora","cada 2 horas"),(r.includes("d\xEDa")||r.includes("dia"))&&n.push("todos los d\xEDas","todos los d\xEDas a las 9 am"),r.includes("semana")&&n.push("cada semana","todos los lunes"),r.includes("mes")&&n.push("cada mes","el d\xEDa 1 de cada mes"),(r.includes("lunes")||r.includes("martes")||r.includes("mi\xE9rcoles"))&&n.push("todos los lunes a las 10 am")):(r.includes("minute")&&n.push("every 5 minutes","every 15 minutes"),r.includes("hour")&&n.push("every hour","every 2 hours"),r.includes("day")&&n.push("every day","every day at 9 am"),r.includes("week")&&n.push("every week","every monday"),r.includes("month")&&n.push("every month","on the 1st of every month"),(r.includes("monday")||r.includes("tuesday")||r.includes("wednesday"))&&n.push("every monday at 10 am")),n.slice(0,3)}function l(r){let e=r.replace(/\s+/g,""),n=e.match(/^(\d{1,2})(am|pm)?$/i);if(n){let t=parseInt(n[1],10),s=n[2]?.toLowerCase();if(s==="pm"&&t!==12&&(t+=12),s==="am"&&t===12&&(t=0),t>=0&&t<=23)return {hour:t,minute:0}}if(n=e.match(/^(\d{1,2}):(\d{2})(am|pm)?$/i),n){let t=parseInt(n[1],10),s=parseInt(n[2],10),i=n[3]?.toLowerCase();if(i==="pm"&&t!==12&&(t+=12),i==="am"&&t===12&&(t=0),t>=0&&t<=23&&s>=0&&s<=59)return {hour:t,minute:s}}return null}function f(r,e){let n=r.toLowerCase();for(let[t,s]of e.days.entries())if(n.includes(s.toLowerCase()))return t;return null}var R={at:"a las",every:"cada",everyMinute:"cada minuto",everyHour:"cada hora",everyDay:"todos los d\xEDas",everyWeek:"cada semana",everyMonth:"cada mes",everyYear:"cada a\xF1o",minute:"minuto",minutes:"minutos",day:"d\xEDa",days:"d\xEDas",on:"el",in:"en",and:"y",between:"entre",through:"hasta",second:"segundo",sunday:"domingo",monday:"lunes",tuesday:"martes",wednesday:"mi\xE9rcoles",thursday:"jueves",friday:"viernes",saturday:"s\xE1bado",january:"enero",february:"febrero",march:"marzo",april:"abril",may:"mayo",june:"junio",july:"julio",august:"agosto",september:"septiembre",october:"octubre",november:"noviembre",december:"diciembre",am:"AM",pm:"PM",midnight:"medianoche",weekday:"d\xEDas de semana",weekend:"fines de semana"},j={days:["domingo","lunes","martes","mi\xE9rcoles","jueves","viernes","s\xE1bado"],months:["enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],patterns:[{regex:/^cada\s+minuto$/,toCron:()=>"* * * * *",description:"Cada minuto"},{regex:/^cada\s+(\d+)\s+minutos?$/,toCron:r=>`*/${r[1]} * * * *`,description:"Cada N minutos"},{regex:/^cada\s+hora$/,toCron:()=>"0 * * * *",description:"Cada hora"},{regex:/^cada\s+(\d+)\s+horas?$/,toCron:r=>`0 */${r[1]} * * *`,description:"Cada N horas"},{regex:/^todos\s+los\s+d[ií]as$/,toCron:()=>"0 0 * * *",description:"Todos los d\xEDas a medianoche"},{regex:/^todos\s+los\s+d[ií]as\s+a\s+las?\s+(.+)$/,toCron:r=>{let e=l(r[1]);if(!e)throw new Error("Formato de hora inv\xE1lido");return `${e.minute} ${e.hour} * * *`},description:"Todos los d\xEDas a una hora espec\xEDfica"},{regex:/^cada\s+semana$/,toCron:()=>"0 0 * * 0",description:"Cada semana (domingo a medianoche)"},{regex:/^(?:todos\s+los|cada)\s+(lunes|martes|mi[eé]rcoles|jueves|viernes|s[aá]bado|domingo)$/,toCron:(r,e)=>{let n=f(r[1],e);if(n===null)throw new Error("D\xEDa inv\xE1lido");return `0 0 * * ${n}`},description:"Cada d\xEDa espec\xEDfico de la semana"},{regex:/^(?:todos\s+los|cada)\s+(lunes|martes|mi[eé]rcoles|jueves|viernes|s[aá]bado|domingo)\s+a\s+las?\s+(.+)$/,toCron:(r,e)=>{let n=f(r[1],e),t=l(r[2]);if(n===null||!t)throw new Error("D\xEDa u hora inv\xE1lida");return `${t.minute} ${t.hour} * * ${n}`},description:"Cada d\xEDa espec\xEDfico a una hora espec\xEDfica"},{regex:/^cada\s+mes$/,toCron:()=>"0 0 1 * *",description:"Cada mes (d\xEDa 1 a medianoche)"},{regex:/^el\s+d[ií]a\s+(\d{1,2})\s+de\s+cada\s+mes(?:\s+a\s+las?\s+(.+))?$/,toCron:r=>{let e=parseInt(r[1],10);if(e<1||e>31)throw new Error("D\xEDa del mes inv\xE1lido");if(r[2]){let n=l(r[2]);if(!n)throw new Error("Formato de hora inv\xE1lido");return `${n.minute} ${n.hour} ${e} * *`}return `0 0 ${e} * *`},description:"D\xEDa espec\xEDfico de cada mes"},{regex:/^cada\s+a[ñn]o$/,toCron:()=>"0 0 1 1 *",description:"Cada a\xF1o (1 de enero a medianoche)"},{regex:/^a\s+las?\s+(.+)$/,toCron:r=>{let e=l(r[1]);if(!e)throw new Error("Formato de hora inv\xE1lido");return `${e.minute} ${e.hour} * * *`},description:"Diariamente a una hora espec\xEDfica"},{regex:/^(?:d[ií]as\s+de\s+semana|d[ií]as\s+laborales)\s+a\s+las?\s+(.+)$/,toCron:r=>{let e=l(r[1]);if(!e)throw new Error("Formato de hora inv\xE1lido");return `${e.minute} ${e.hour} * * 1-5`},description:"D\xEDas de semana a una hora espec\xEDfica"},{regex:/^fines?\s+de\s+semana\s+a\s+las?\s+(.+)$/,toCron:r=>{let e=l(r[1]);if(!e)throw new Error("Formato de hora inv\xE1lido");return `${e.minute} ${e.hour} * * 0,6`},description:"Fines de semana a una hora espec\xEDfica"}]};function U(r){if(r.length<2)return false;for(let e=1;e<r.length;e++)if(r[e]!==r[e-1]+1)return false;return true}function K(r,e={}){let{locale:n="en",use24HourFormat:t=true,includeSeconds:s=false,verbose:i=false}=e,o=n==="es"?R:M,a=k(r,s);return a.isSpecial&&a.specialKeyword?J(a.specialKeyword,o):G(a,o,t,i)}function J(r,e){return {"@yearly":e.everyYear,"@annually":e.everyYear,"@monthly":e.everyMonth,"@weekly":e.everyWeek,"@daily":e.everyDay,"@midnight":`${e.at} ${e.midnight}`,"@hourly":e.everyHour}[r]||r}function G(r,e,n,t){let s=[],i=B(r,e,n);i&&s.push(i);let o=Q(r,e,t);return o&&s.push(o),s.join(", ")}function B(r,e,n){let{minute:t,hour:s,second:i}=r;if(t.isWildcard&&s.isWildcard)return i&&!i.isWildcard?`${e.at} ${e.second} ${i.values.join(", ")}`:e.everyMinute;if(t.isWildcard){if(s.values.length===1){let o=C(s.values[0],n,e);return `${e.everyMinute} ${e.at} ${o}`}if(s.values.length>1&&s.isRange){let o=C(s.values[0],n,e),a=C(s.values[s.values.length-1],n,e);return `${e.everyMinute}, ${e.between} ${o} ${e.and} ${a}`}}if(s.isWildcard&&!t.isWildcard){if(t.values.length===1)return `${e.at} ${e.minute} ${t.values[0]}`;if(t.isStep){let o=t.values[1]-t.values[0];return `${e.every} ${o} ${e.minutes}`}}if(!t.isWildcard&&!s.isWildcard){if(t.values.length===1&&s.values.length===1){let o=w(s.values[0],t.values[0]),a=n?o:b(s.values[0],t.values[0],e);return `${e.at} ${a}`}if(t.values.length>1||s.values.length>1){if(t.values.length===1&&s.isRange&&s.values.length>1&&U(s.values)){let o=n?w(s.values[0],t.values[0]):b(s.values[0],t.values[0],e),a=n?w(s.values[s.values.length-1],t.values[0]):b(s.values[s.values.length-1],t.values[0],e);return `${e.between} ${o} ${e.and} ${a}`}if(t.isStep){let o=t.values[1]-t.values[0];if(s.isRange){let a=C(s.values[0],n,e),u=C(s.values[s.values.length-1],n,e);return `${e.every} ${o} ${e.minutes}, ${e.between} ${a} ${e.and} ${u}`}return `${e.every} ${o} ${e.minutes}`}}}return q(r,e,n)}function Q(r,e,n){let{dayOfMonth:t,month:s,dayOfWeek:i}=r;if(t.isWildcard&&i.isWildcard&&s.isWildcard)return e.everyDay;let o=[];if(!i.isWildcard){let a=X(i.values,e,n);a&&o.push(a);}if(!t.isWildcard&&i.isWildcard){let a=Z(t.values,e,n);a&&o.push(a);}if(!s.isWildcard){let a=ee(s.values,e,n);a&&o.push(a);}return o.join(", ")}function w(r,e){return `${r.toString().padStart(2,"0")}:${e.toString().padStart(2,"0")}`}function b(r,e,n){let t=r<12?n.am:n.pm;return `${r===0?12:r>12?r-12:r}:${e.toString().padStart(2,"0")} ${t}`}function C(r,e,n){return e?`${r.toString().padStart(2,"0")}:00`:b(r,0,n)}function q(r,e,n){let t=[];for(let s of r.hour.values)for(let i of r.minute.values){let o=n?w(s,i):b(s,i,e);t.push(o);}return t.length<=3?`${e.at} ${t.join(", ")}`:`${e.at} ${t.slice(0,2).join(", ")}... (${t.length} times)`}function X(r,e,n){let t=[e.sunday,e.monday,e.tuesday,e.wednesday,e.thursday,e.friday,e.saturday];if(r.length===5&&r.includes(1)&&r.includes(2)&&r.includes(3)&&r.includes(4)&&r.includes(5))return e.weekday;if(r.length===2&&r.includes(0)&&r.includes(6))return e.weekend;if(r.length===1)return e.on+" "+t[r[0]];if(r.length===7)return e.everyDay;let s=r.map(i=>t[i]);return n||r.length<=3?D(s,e):`${s[0]} ${e.through} ${s[s.length-1]}`}function Z(r,e,n){return r.length===1?`${e.on} ${e.day} ${r[0]}`:r.length===31?e.everyDay:n||r.length<=3?`${e.on} ${e.days} ${r.join(", ")}`:`${e.on} ${e.days} ${r[0]} ${e.through} ${r[r.length-1]}`}function ee(r,e,n){let t=[e.january,e.february,e.march,e.april,e.may,e.june,e.july,e.august,e.september,e.october,e.november,e.december];if(r.length===1)return `${e.in} ${t[r[0]-1]}`;if(r.length===12)return "";let s=r.map(i=>t[i-1]);return n||r.length<=3?`${e.in} ${D(s,e)}`:`${e.in} ${s[0]} ${e.through} ${s[s.length-1]}`}function D(r,e){if(r.length===0)return "";if(r.length===1)return r[0];if(r.length===2)return `${r[0]} ${e.and} ${r[1]}`;let n=r[r.length-1];return `${r.slice(0,-1).join(", ")}, ${e.and} ${n}`}exports.DAY_NAMES=h;exports.FIELD_CONSTRAINTS=d;exports.MONTH_NAMES=p;exports.SPECIAL_KEYWORDS=g;exports.formatCron=K;exports.humanizeCron=Y;exports.parseCron=k;exports.parseDayOfWeek=f;exports.parseTimeString=l;exports.validateCron=$;//# sourceMappingURL=index.cjs.map
2
2
  //# sourceMappingURL=index.cjs.map