cronli5 0.1.1 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -6,6 +6,97 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [0.1.4]
10
+
11
+ ### Fixed
12
+
13
+ - **A pinned minute 0 under sub-minute seconds no longer loses its one-minute
14
+ confinement.** `* 0 0` runs every second of the single minute 00:00 — sixty
15
+ fires, then nothing until the next midnight — but read "every second … at
16
+ midnight", which a reader takes for the whole midnight hour (3,600 fires). It
17
+ now names the bounded minute: English "every second for one minute at
18
+ midnight", Spanish "cada segundo durante un minuto a medianoche", German "jede
19
+ Sekunde der Minute 0:00", Finnish "joka sekunti minuutin 0.00 aikana", Chinese
20
+ "凌晨0点0分的每一秒". Hour lists, ranges, and steps too (`* 0 9-17`, `* 0 */2`).
21
+ Every non-zero pinned minute under seconds now reads compactly as "every second
22
+ of 9:05 a.m." / "de las 09:05". All languages.
23
+ - **Chinese keeps the start of an offset step in every context.** An offset step
24
+ such as `2/6` (hours 2, 8, 14, 20) or `5/15` (minutes :05, :20, …) could render
25
+ as the bare "每6小时" / "每15分钟" cadence — silently dropping the start — under a
26
+ minute frequency, composed with seconds, or across an hour step. Each now
27
+ enumerates its fires.
28
+
29
+ ### Changed
30
+
31
+ - **A single hour with a wildcard minute reads as that hour, not a synthesized
32
+ range.** `0 * 9` reads "every minute of the 9 a.m. hour" rather than "every
33
+ minute from 9 a.m. through 9:59 a.m." — the source has no range. Spanish "cada
34
+ minuto de la hora de las 09:00", German "jede Minute der 9-Uhr-Stunde", Finnish
35
+ "joka minuutti kello 9 aikana", Chinese "9点的每一分钟". Genuine hour ranges
36
+ (`9-17`) and partial-minute single hours (`0-30 9`) are unchanged. All
37
+ languages.
38
+ - **English `* */2` under seconds** reads "every second of every other minute"
39
+ (was "every second, every two minutes", which juxtaposed two cadences that read
40
+ as contradictory).
41
+ - **Chinese idiom polish:** an every-other-hour minute (`0 * */2` → "在偶数小时,
42
+ 每分钟"), single-hour minutes, and a restricted-hour second list ("凌晨0点5、20、
43
+ 35、50分的每一秒" instead of the misleading "每小时…").
44
+
45
+ ## [0.1.3]
46
+
47
+ ### Changed
48
+
49
+ - **Full-span ranges now read as no restriction**, matching their `*` form. A
50
+ plain range covering an entire field imposes no restriction, so `0 0 * * 0-6`
51
+ reads "every day at midnight" (was "every Sunday through Saturday at
52
+ midnight"), `0-59` is "every minute", `0 0-23 * * *` "every hour",
53
+ `1-31`/`1-12` add nothing, and every seven-day weekday range (`0-6`, `1-7`,
54
+ `0-7`, `SUN-SAT`) collapses to every day. A step whose range covers the field
55
+ does the same: `0-59/2` reads "every two minutes" instead of listing 30 fires,
56
+ `0-23/2` "every two hours". Partial ranges and steps (`9-17`, `9-17/2`,
57
+ `MON-FRI`) and the year field are unchanged. All languages.
58
+ - **Chinese now composes the clock time in second-level patterns.**
59
+ `* 2 0 * * *` read "在凌晨0点,每小时2分,每秒" — three floating clauses, with the
60
+ minute mis-stated as "minute 2 of every hour" and the hour split off — and now
61
+ reads "每天0点2分每秒". The other languages already composed these; Chinese
62
+ reused its list path for single-minute patterns instead of the clock time the
63
+ core had already assembled.
64
+
65
+ ### Fixed
66
+
67
+ - **English** no longer doubles the period when a sentence ends in an
68
+ abbreviation: `0 9 * * *` reads "Runs every day at 9 a.m." (was "…9 a.m..").
69
+ The terminator guard German gained in 0.1.2 now covers English's `a.m.`/`p.m.`.
70
+ - The **CLI reports an unknown option clearly**: `--land` (a typo for `--lang`)
71
+ now reports "Unknown option: --land" instead of mis-blaming the minute field.
72
+
73
+ ## [0.1.2]
74
+
75
+ ### Changed
76
+
77
+ - **Non-uniform steps in the time fields now list their fires** instead of
78
+ reading "every N". A step is a true "every N" cadence only when it tiles the
79
+ field's cycle evenly — `step` divides the cycle (60 for minutes/seconds, 24 for
80
+ hours) **and** `start < step`; otherwise the gap at the field boundary differs.
81
+ `*/7 * * * *` fires at :00, :07, …, :56 — the :56→:00 gap is 4 minutes, not 7 —
82
+ so it now reads "at 0, 7, 14, 21, 28, 35, 42, 49, and 56 minutes past the hour"
83
+ rather than "every seven minutes". `7/6` and `11/6` (the step divides 60 but
84
+ starts past it) enumerate too. Genuine "every N" steps (`*/6`, `*/15`, `5/6`,
85
+ `11/12`, `*/2` hours) are unchanged. German already rendered these; English,
86
+ Spanish, Finnish, and Chinese now match. Date/month/weekday steps are unchanged
87
+ (their cycles vary — a separate follow-up).
88
+ - **Chinese no longer drops the start of an offset step.** `5/6` had rendered as
89
+ "每6分钟" — identical to `*/6`, the wrong schedule — and now enumerates its
90
+ fires ("每小时5、11、…、59分"), matching how Chinese already rendered offset
91
+ second and hour steps.
92
+
93
+ ### Fixed
94
+
95
+ - **German** no longer doubles the period when a sentence ends in an ordinal
96
+ ("…am 3., 5. und 8." instead of "…8.."), and an hour list no longer takes
97
+ "von" ("in den Stunden 9, 11 und 13 Uhr", not "von 9, 11 und 13 Uhr"; genuine
98
+ "von … bis" ranges are unchanged).
99
+
9
100
  ## [0.1.1]
10
101
 
11
102
  ### Fixed
package/cli.js CHANGED
@@ -52,6 +52,10 @@ if (flag !== -1) {
52
52
  }
53
53
  }
54
54
 
55
+ // After the recognized flags are consumed, any remaining `--flag` is a typo or
56
+ // an unsupported option (e.g. `--land` for `--lang`); naming it beats letting
57
+ // it fall through and surface as a confusing "invalid field value" error.
58
+ const unknownFlag = args.find((a) => a.startsWith('--'));
55
59
  const pattern = args.length === 1 ? args[0] : args;
56
60
  const requested = code || 'en';
57
61
 
@@ -59,6 +63,11 @@ if (missingLang) {
59
63
  console.error('Missing language value for --lang');
60
64
  process.exitCode = 1;
61
65
  }
66
+ else if (unknownFlag) {
67
+ console.error('Unknown option: ' + unknownFlag +
68
+ ' (valid options: --lang, --fragment)');
69
+ process.exitCode = 1;
70
+ }
62
71
  else if (availableLanguages().includes(requested)) {
63
72
  emit(pattern, (await import('./dist/lang/' + requested + '.js')).default);
64
73
  }
package/cronli5.min.js CHANGED
@@ -1,3 +1,3 @@
1
- "use strict";(()=>{var qn={SUN:0,MON:1,TUE:2,WED:3,THU:4,FRI:5,SAT:6},Vn={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={second:{cyclic:!0,max:59,min:0,top:59},minute:{cyclic:!0,max:59,min:0,top:59},hour:{cyclic:!0,max:23,min:0,top:23},date:{aliases:{"?":"*"},cyclic:!0,max:31,min:1,top:31},month:{cyclic:!0,max:12,min:1,numbers:Vn,top:12},weekday:{aliases:{"?":"*",L:"6"},cyclic:!0,max:7,min:0,numbers:qn,top:6},year:{max:9999,min:1970}},k=["second","minute","hour","date","month","weekday","year"],U={"@annually":"0 0 1 1 *","@yearly":"0 0 1 1 *","@monthly":"0 0 1 * *","@weekly":"0 0 * * 0","@daily":"0 0 * * *","@midnight":"0 0 * * *","@hourly":"0 * * * *"},Q=6;function s(n,e){return(""+n).indexOf(e)!==-1}function F(n){return Array.from(new Set(n))}function I(n){return/^\d+$/.test(n)}function d(n,e){return I(n)?+n:e[n.toUpperCase()]}function an(n){return k.forEach(function(r){Jn(n[r],h[r],r)}),n}function Jn(n,e,r){typeof n!="string"&&typeof n!="number"&&sn(n,r);let t=""+n;t!=="*"&&(r==="date"&&C(t)||r==="weekday"&&w(t,e)||t.split(",").forEach(function(o){$n(o,e)||sn(o,r)}))}function C(n){if(n==="L"||n==="LW"||n==="WL")return!0;let e=/^L-(\d{1,2})$/.exec(n);if(e)return+e[1]>=1&&+e[1]<=30;let r=/^(\d{1,2})W$|^W(\d{1,2})$/.exec(n);if(r){let t=+(r[1]||r[2]);return t>=1&&t<=31}return!1}function w(n,e){if(/L$/.test(n))return v(n.slice(0,-1),e);let r=n.split("#");return r.length===2?v(r[0],e)&&/^[1-5]$/.test(r[1]):!1}function $n(n,e){return s(n,"/")?Yn(n,e):s(n,"-")?ln(n,e):v(n,e)}function Yn(n,e){let r=n.split("/");return r.length!==2||!I(r[1])||+r[1]<1?!1:r[0]==="*"||v(r[0],e)||ln(r[0],e,!0)}function ln(n,e,r){let t=n.split("-");return t.length!==2||!v(t[0],e)||!v(t[1],e)?!1:e.cyclic&&!r?!0:d(t[0],e.numbers)<=d(t[1],e.numbers)}function v(n,e){return n==="*"?!1:I(n)?+n>=e.min&&+n<=e.max:e.numbers?n.toUpperCase()in e.numbers:!1}function sn(n,e){throw new Error('`cronli5` was passed an invalid field value "'+n+'" for the '+e+" field.")}function mn(n){k.forEach(function(r){let t=h[r].aliases,i=t&&t[""+n[r]];i&&(n[r]=i)})}function fn(n){return k.forEach(function(r){let t=""+n[r];if(r==="date"&&C(t)||r==="weekday"&&w(t,h[r])){n[r]=t;return}n[r]=Bn(t,h[r])}),n}function Bn(n,e){let r=""+n;if(r==="*")return r;let t=r.split(",").map(function(o){return Zn(Kn(Gn(o,e),e),e)});return t.indexOf("*")!==-1?"*":F(t).sort(function(o,u){return cn(o,e)-cn(u,e)}).join(",")}function Gn(n,e){let r=n.split("/");if(!e.cyclic||r.length!==2||+r[1]!=1)return n;let t=r[0];return s(t,"-")?t:t==="*"||d(t,e.numbers)===e.min?"*":t+"-"+e.top}function Kn(n,e){let r=n.split("/");if(!e.cyclic||typeof e.top!="number"||r.length!==2||s(r[0],"-"))return n;let t=r[0];return(t==="*"?e.min:d(t,e.numbers))+ +r[1]<=e.top?n:t==="*"?""+e.min:t}function Zn(n,e){let r=n.split("/")[0];if(!s(r,"-"))return n;let t=r.split("-");return d(t[0],e.numbers)!==d(t[1],e.numbers)?n:t[0]}function cn(n,e){let r=n.split("/")[0].split("-")[0];return r==="*"?e.min:d(r,e.numbers)}function dn(n,e){let r=n instanceof Array;if(n===null||typeof n>"u"||n===""||r&&n.length===0)throw new Error("`cronli5` expects a non-empty cron pattern as the first argument.");if(r)return gn(n,e);if(typeof n=="object")return Xn(n);if(typeof n=="string")return _n(n,e);throw new Error("`cronli5` was passed an unexpected type.")}function gn(n,e){if(n.length>7)throw new Error("`cronli5` was passed a cron pattern with more than seven fields.");return!e.seconds&&n.length<(e.years?7:6)&&n.unshift("0"),{second:n[0]||"0",minute:n[1]||"*",hour:n[2]||"*",date:n[3]||"*",month:n[4]||"*",weekday:n[5]||"*",year:n[6]||"*"}}function Xn(n){if(!n.second&&!n.minute&&!n.hour)throw new Error("`cronli5` expects that any object being interpreted as a cron pattern have at least one of the following properties: `second`, `minute`, or `hour`");let e=typeof n.second<"u",r=typeof n.minute<"u",t=e?"*":"0",i=e||r?"*":"0";return{second:N(n.second,"0"),minute:N(n.minute,t),hour:N(n.hour,i),date:N(n.date,"*"),month:N(n.month,"*"),weekday:N(n.weekday,"*"),year:N(n.year,"*")}}function N(n,e){return typeof n>"u"?e:n}function _n(n,e){let r=ne(n).split(/\s+/);return gn(r,e)}function ne(n){let e=n.trim();if(e.charAt(0)!=="@")return n;let r=e.toLowerCase();if(Object.hasOwn(U,r))return U[r];throw new Error("`cronli5` does not recognize the macro `"+e+"`.")}function hn(n){return n!=="*"&&!s(n,",")&&!s(n,"-")&&!s(n,"/")}function q(n){return s(n,"-")&&!s(n,",")&&!s(n,"/")}function ee(n){return s(n,"/")&&!s(n,",")}function V(n){return n!=="*"&&!s(n,"-")&&!s(n,"/")}function J(n){return n!=="*"&&!q(n)&&!ee(n)}function R(n,e,r){let t=[],i=n;for(;i<=r;)t.push(i),i+=e;return t}function pn(n,e,r,t){let i=n.split("/"),o=+i[1];if(s(i[0],"-")){let m=i[0].split("-");return R(d(m[0],t),o,d(m[1],t))}let u=i[0]==="*"?e:d(i[0],t);return R(u,o,r)}function $(n,e,r){let t=[];return n.split(",").forEach(function(o){if(s(o,"/"))t.push(...pn(o,e,r));else if(s(o,"-")){let u=o.split("-");+u[0]<=+u[1]?t.push(...R(+u[0],1,+u[1])):(t.push(...R(+u[0],1,r)),t.push(...R(e,1,+u[1])))}else t.push(+o)}),F(t)}function re(n){return V(n)?n.split(",").map(Number):[0]}function te(n){if(n==="*")return[0,59];if(q(n)){let e=n.split("-");if(+e[0]<=+e[1])return[+e[0],+e[1]]}return null}function ie(n){return n==="*"?59:Math.max(...$(n,0,59))}function oe(n){if(hn(n)&&n!=="0")return+n}function ue(n,e){return n==="*"?"wildcard":e==="date"&&C(n)||e==="weekday"&&w(n,h.weekday)?"quartz":s(n,",")?"list":s(n,"/")?"step":s(n,"-")?"range":"single"}function se(n,e,r){return e==="wildcard"||e==="quartz"?null:n.split(",").map(function(i){if(s(i,"/")){let o=i.split("/");return{fires:pn(i,r.min,r.top,r.numbers),interval:+o[1],kind:"step",startToken:o[0]}}return s(i,"-")?{bounds:i.split("-"),kind:"range"}:{kind:"single",value:i}})}function yn(n){let e={},r={};k.forEach(function(u){e[u]=ue(n[u],u),r[u]=se(n[u],e[u],h[u])});let i={analyses:{clockSecond:oe(n.second),lastMinuteFire:ie(n.minute),minuteSpan:te(n.minute),segments:r},pattern:n,shapes:e};return{...i,plan:ae(i)}}function ae(n){let{analyses:e,pattern:r,shapes:t}=n;if(r.second!=="0"){let i=le(r,t,e);if(i)return i}return bn(r,t,e)||On(r,t,e)}function le(n,e,r){let t=ce(n,e);return t||(n.hour==="*"&&e.minute==="single"&&n.second!=="*"?{kind:"secondsWithinMinute",singleSecond:e.second==="single"}:e.second==="single"&&V(n.minute)&&J(n.hour)?null:{kind:"composeSeconds",rest:bn(n,e,r,!0)||On(n,e,r,!0)})}function ce(n,e){return n.minute!=="*"||n.hour!=="*"?null:n.second==="*"?{kind:"everySecond"}:e.second==="single"?{kind:"secondPastMinute"}:{kind:"standaloneSeconds"}}function bn(n,e,r,t=!1){if(e.minute==="step")return{hours:fe(n,e,r),kind:"minuteFrequency"};if(e.hour==="single"&&r.minuteSpan)return{hour:+n.hour,kind:"minuteSpanInHour",span:r.minuteSpan};let i=de(n,e);if(i)return i;let o=me(n,e);if(o)return o;if(n.hour==="*")return ge(n,e,t)}function Sn(n){let[e,r]=n.split("/"),t=e==="*"?0:+e;return e.indexOf("-")===-1&&24%+r===0&&t<+r}function me(n,e){return e.hour!=="step"?null:n.minute==="*"?Sn(n.hour)?{form:"wildcard",kind:"minuteSpanAcrossHourStep"}:{form:"wildcard",kind:"minutesAcrossHours",times:M(n.hour)}:e.minute==="range"?{form:"range",kind:"minuteSpanAcrossHourStep"}:null}function fe(n,e,r){if(e.hour==="list")return{kind:"during",times:M(n.hour)};if(e.hour==="range"){let t=n.hour.split("-");return{from:+t[0],kind:"window",last:r.lastMinuteFire,to:+t[1]}}return e.hour==="single"?{from:+n.hour,kind:"window",last:r.lastMinuteFire,to:+n.hour}:e.hour==="step"?Sn(n.hour)?{kind:"step"}:{kind:"during",times:M(n.hour)}:{kind:"none"}}function de(n,e){return J(n.hour)?n.minute==="*"?{form:"wildcard",kind:"minutesAcrossHours",times:M(n.hour)}:e.minute==="range"||e.minute==="list"&&s(n.minute,"-")&&!s(n.minute,"/")?{form:e.minute==="range"?"range":"list",kind:"minutesAcrossHours",times:M(n.hour)}:null:null}function ge(n,e,r){if(e.minute==="range")return{kind:"rangeOfMinutes"};if(e.minute==="list")return{kind:"multipleMinutes"};if(n.minute==="*")return{kind:"everyMinute"};if(n.minute!=="0"||r)return{kind:"singleMinute"}}function On(n,e,r,t=!1){let i=t&&n.minute==="0";return e.hour==="range"&&!i?he(n,e,r):e.hour==="step"&&n.minute==="0"&&!t?{kind:"hourStep"}:n.hour==="*"&&!i?{kind:"everyHour"}:pe(n,r,i)}function he(n,e,r){let t=n.hour.split("-"),i="lead";return n.minute==="*"?i="wildcard":e.minute==="range"&&(i="range"),{boundMinute:e.minute==="range"||e.minute==="list"?null:r.lastMinuteFire,from:+t[0],kind:"hourRange",last:r.lastMinuteFire,minuteForm:i,to:+t[1]}}function pe(n,e,r=!1){let t=$(n.hour,0,23),i=re(n.minute);if(!r&&t.length*i.length>Q)return{fold:i.length===1,kind:"compactClockTimes",minute:i[0]};let o=[];return t.forEach(function(m){i.forEach(function(D){o.push({hour:m,minute:D,second:e.clockSecond})})}),{kind:"clockTimes",times:o}}function M(n){let e=$(n,0,23);return e.length<=Q?{fires:e,kind:"fires"}:{kind:"segments"}}function kn(n,e){let r=dn(n,e);return mn(r),an(r),fn(r)}function Y(n){return n=""+n,n.length<2?"0"+n:n}function Nn(n,e,r){return r.short?n:e[n]||n}function B(n,{sep:e,pad:r,lean:t}){let i=r?Y(n.hour):""+n.hour;return t&&!n.minute&&!n.second?i:i+e+Y(n.minute)+(n.second?e+Y(n.second):"")}var G={gb:{am:"am",closeUp:!0,dayFirst:!0,midday:"midday",midnight:"midnight",ordinals:!1,pm:"pm",sep:".",serialComma:!1,through:" to "},us:{am:"a.m.",closeUp:!1,dayFirst:!1,midday:"noon",midnight:"midnight",ordinals:!1,pm:"p.m.",sep:":",serialComma:!0,through:" through "},house:{am:"AM",closeUp:!1,dayFirst:!1,midday:"noon",midnight:"midnight",ordinals:!0,pm:"PM",sep:":",serialComma:!0,through:" - "}};function zn(n){return typeof n=="object"&&n!==null?{...G.us,...n}:G[n==="uk"?"gb":n]||G.us}var ye=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],K=["th","st","nd","rd"],g=[null,["January","Jan"],["February","Feb"],["March","Mar"],["April","Apr"],["May","May"],["June","Jun"],["July","Jul"],["August","Aug"],["September","Sep"],["October","Oct"],["November","Nov"],["December","Dec"]],y=[["Sunday","Sun"],["Monday","Mon"],["Tuesday","Tue"],["Wednesday","Wed"],["Thursday","Thu"],["Friday","Fri"],["Saturday","Sat"]],be={JAN:g[1],FEB:g[2],MAR:g[3],APR:g[4],MAY:g[5],JUN:g[6],JUL:g[7],AUG:g[8],SEP:g[9],OCT:g[10],NOV:g[11],DEC:g[12]},Se={SUN:y[0],MON:y[1],TUE:y[2],WED:y[3],THU:y[4],FRI:y[5],SAT:y[6]},Oe=[null,"first","second","third","fourth","fifth"];function ke(n){return n=n||{},{ampm:typeof n.ampm=="boolean"?n.ampm:!0,lenient:!!n.lenient,seconds:!!n.seconds,short:!!n.short,style:zn(n.dialect),years:!!n.years}}function Ne(n,e){return _e(Pn(n,n.plan,e),n,e)}function Pn(n,e,r){let t=Ve[e.kind];return t(n,e,r)}function ze(n,e,r){return"every second"+a(n,r)}function Pe(n,e,r){return H(n,r)+a(n,r)}function ve(n,e,r){let t=n.pattern.second;return c(t,r)+" "+P(t,"second")+" past the minute, every minute"+a(n,r)}function Ce(n,e,r){let t=n.pattern.minute,i=c(t,r),o=P(t,"minute");if(e.singleSecond){let u=n.pattern.second;return i+" "+o+" and "+c(u,r)+" "+P(u,"second")+" past the hour, every hour"+a(n,r)}return H(n,r)+", "+i+" "+o+" past the hour, every hour"+a(n,r)}function we(n,e,r){return H(n,r)+", "+Pn(n,e.rest,r)}function H(n,e){let r=n.pattern.second,t=n.shapes.second;if(r==="*")return"every second";if(t==="step")return Rn(n.analyses.segments.second[0],"second","minute",e);if(t==="range"){let i=r.split("-"),o=A(i,e);return"every second from "+o(i[0])+O(e)+o(i[1])+" past the minute"}return t==="single"?"at "+c(r,e)+" "+P(r,"second")+" past the minute":b(T(n.analyses.segments.second,e),"second","minute",e)}function Re(n,e,r){return"every minute"+a(n,r)}function Me(n,e,r){let t=n.pattern.minute;return c(t,r)+" "+P(t,"minute")+" past the hour, every hour"+a(n,r)}function xe(n,e,r){return L(n.pattern.minute,r)+a(n,r)}function Te(n,e,r){return b(T(n.analyses.segments.minute,r),"minute","hour",r)+a(n,r)}function Fe(n,e,r){let t=Rn(n.analyses.segments.minute[0],"minute","hour",r);return e.hours.kind==="during"?t+=" during the "+_(n,e.hours.times,!1,r)+" hours":e.hours.kind==="window"?t+=" "+wn(e.hours,r):e.hours.kind==="step"&&(t+=" "+vn(n.analyses.segments.hour[0],r)),t+a(n,r)}function Ie(n,e,r){return"every minute from "+l({hour:e.hour,minute:e.span[0]},r)+O(r)+l({hour:e.hour,minute:e.span[1]},r)+a(n,r)}function He(n,e,r){if(e.form==="wildcard")return"every minute during the "+_(n,e.times,!1,r)+" hours"+a(n,r);let t=_(n,e.times,!0,r);return(e.form==="range"?L(n.pattern.minute,r):b(T(n.analyses.segments.minute,r),"minute","hour",r))+", at "+t+a(n,r)}var Le={2:"other",3:"third",4:"fourth",6:"sixth",8:"eighth",12:"twelfth"};function vn(n,e){let r="during every "+Le[n.interval]+" hour",t=n.startToken==="*"?0:+n.startToken;return t===0?r:r+" starting at "+l({hour:t,minute:0},e)}function Ae(n,e,r){let t=n.analyses.segments.hour[0];return e.form==="wildcard"?"every minute "+vn(t,r)+a(n,r):L(n.pattern.minute,r)+", "+Mn(t,r)+a(n,r)}function L(n,e){let r=n.split("-"),t=A(r,e);return"every minute from "+t(r[0])+O(e)+t(r[1])+" past the hour"}function Ee(n,e,r){return"every hour"+a(n,r)}function We(n,e,r){let t=wn(je(e),r);return e.minuteForm==="wildcard"?"every minute "+t+a(n,r):e.minuteForm==="range"?L(n.pattern.minute,r)+", "+t+a(n,r):Cn(n,r)+" "+t+a(n,r)}function Cn(n,e){return n.pattern.minute==="0"?"every hour":b(T(n.analyses.segments.minute,e),"minute","hour",e)}function De(n,e,r){return Mn(n.analyses.segments.hour[0],r)+a(n,r)}function je(n){return{from:n.from,last:n.boundMinute??0,to:n.to}}function wn(n,e){return"from "+l({hour:n.from,minute:0},e)+O(e)+l({hour:n.to,minute:n.last},e)}function Ue(n,e,r){let t=tn(e.times),i=e.times.map(function(u){return l({hour:u.hour,minute:u.minute,second:u.second,plain:t},r)});return xn(n,r)+"at "+S(i,r)}function Qe(n,e,r){if(e.fold){if(n.analyses.segments.hour.some(function(m){return m.kind==="range"})&&!n.analyses.clockSecond)return qe(n,e,r)+a(n,r);let o={minute:e.minute,second:n.analyses.clockSecond};return xn(n,r)+"at "+nn(n,o,!0,r)}let t=b(T(n.analyses.segments.minute,r),"minute","hour",r)+", at "+nn(n,{minute:0,second:null},!0,r)+a(n,r);return n.analyses.clockSecond?H(n,r)+", "+t:t}function qe(n,e,r){let t=e.minute,i=[],o=[];n.analyses.segments.hour.forEach(function(f){f.kind==="range"?i.push("from "+l({hour:f.bounds[0],minute:0},r)+O(r)+l({hour:f.bounds[1],minute:t},r)):f.kind==="step"?o.push(...f.fires):o.push(+f.value)});let u=Cn(n,r)+" "+S(i,r);return o.length&&(u+=" and at "+S(o.map(function(f){return l({hour:f,minute:t},r)}),r)),u}var Ve={clockTimes:Ue,compactClockTimes:Qe,composeSeconds:we,everyHour:Ee,everyMinute:Re,everySecond:ze,hourRange:We,hourStep:De,minuteFrequency:Fe,minuteSpanAcrossHourStep:Ae,minuteSpanInHour:Ie,minutesAcrossHours:He,multipleMinutes:Te,rangeOfMinutes:xe,secondPastMinute:ve,secondsWithinMinute:Ce,singleMinute:Me,standaloneSeconds:Pe};function Rn(n,e,r,t){if(n.startToken.indexOf("-")!==-1)return b(Z(n.fires,t),e,r,t);let i=n.startToken==="*"?0:+n.startToken,o=n.interval;return i!==0?n.fires.length<=3?b(Z(n.fires,t),e,r,t):"every "+c(o,t)+" "+e+"s from "+c(i,t)+" "+P(i,e)+" past the "+r:60%o===0?"every "+c(o,t)+" "+e+"s":n.fires.length<=2?b(Z(n.fires,t),e,r,t):"every "+c(o,t)+" "+e+"s past the "+r}function Mn(n,e){if(n.startToken.indexOf("-")!==-1)return"at "+X(n.fires,e);let r=n.startToken==="*"?0:+n.startToken,t=n.interval;return r===0&&24%t===0?"every "+c(t,e)+" hours":n.fires.length<=3?"at "+X(n.fires,e):r===0?"every "+c(t,e)+" hours from midnight":"every "+c(t,e)+" hours from "+l({hour:r,minute:0},e)}function A(n,e){let r=n.some(function(i){return+i>10});return function(i){return r?""+i:c(i,e)}}function Z(n,e){return n.map(A(n,e))}function T(n,e){let r=n.flatMap(function(o){return o.kind==="range"?o.bounds:o.kind==="step"?o.fires:[o.value]}),t=A(r,e);return n.flatMap(function(o){return o.kind==="range"?[t(o.bounds[0])+O(e)+t(o.bounds[1])]:o.kind==="step"?o.fires.map(t):[t(o.value)]})}function b(n,e,r,t){return"at "+S(n,t)+" "+e+"s past the "+r}function Je(n,e,r){return(+n==0||+n==12)&&+e==0&&!(typeof r=="number"&&r>0)}function tn(n){let e=n.filter(function(t){return Je(t.hour,t.minute,t.second)});return e.length>0&&e.length<n.length}function X(n,e){let r=tn(n.map(function(o){return{hour:o,minute:0}})),t=n.map(function(o){return l({hour:o,minute:0,plain:r},e)});return S(t,e)}function _(n,e,r,t){return e.kind==="fires"?X(e.fires,t):nn(n,{minute:0,second:null},r,t)}function $e(n){return n.kind==="range"?n.bounds:n.kind==="step"?n.fires:[n.value]}function nn(n,e,r,t){let{minute:i,second:o}=e,u=n.analyses.segments.hour,m=tn(u.flatMap(function(p){return $e(p).map(function(j){return{hour:+j,minute:i,second:o}})})),f=[];return u.forEach(function(p){p.kind==="step"?f.push(...p.fires.map(function(j){return l({hour:j,minute:i,second:o,plain:m},t)})):p.kind==="range"?f.push(l({hour:p.bounds[0],minute:i,second:o,plain:m},t)+O(t)+l({hour:p.bounds[1],minute:i,second:o,plain:m},t)):f.push(l({hour:p.value,minute:i,second:o,plain:m},t))}),S(Ye(f,u,r),t)}function Ye(n,e,r){let t=e.some(function(o){return o.kind==="range"});return!r||!t?n:n.map(function(o,u){return u===0?o:"at "+o})}function S(n,e){if(n.length<=1)return n.join("");if(n.length===2)return n[0]+" and "+n[1];let r=e.style.serialComma?", and ":" and ";return n.slice(0,-1).join(", ")+r+n[n.length-1]}var Be={all:"",month:"in ",stepDate:"on ",weekday:"on "},Ge={all:"every day",month:"every day in ",stepDate:"",weekday:"every "};function a(n,e){let r=Tn(n,Be,e);return r&&" "+r}function xn(n,e){return Tn(n,Ge,e)+" "}function Tn(n,e,r){let t=n.pattern;return t.date!=="*"&&t.weekday!=="*"?Ze(n,r):t.date!=="*"?Ke(n,e,r):t.weekday!=="*"?(Hn(t.weekday,r)||e.weekday+Wn(n,r))+z(n,r):t.month!=="*"?e.month+E(n,r):e.all}function Ke(n,e,r){let t=n.pattern,i=In(t.date,r);return i?i+z(n,r):on(t.date)?e.stepDate+An(t.date)+z(n,r):t.month!=="*"&&!Fn(n)?"on the "+en(n,r)+z(n,r):t.month!=="*"?"on "+Ln(n,r):"on the "+en(n,r)}function Fn(n){return!En(n.pattern.month)&&n.analyses.segments.month.every(function(r){return r.kind!=="range"})}function Ze(n,e){let r=n.pattern,t=Hn(r.weekday,e)||"on "+Wn(n,e),i=In(r.date,e);return i?i+z(n,e)+" or "+t:on(r.date)?An(r.date)+z(n,e)+" or "+t:r.month!=="*"&&Fn(n)?"on "+Ln(n,e)+" or "+t+" in "+E(n,e):"on the "+en(n,e)+" or "+t+z(n,e)}function In(n,e){if(n==="L")return"on the last day of the month";if(n==="LW"||n==="WL")return"on the last weekday of the month";let r=/^L-(\d{1,2})$/.exec(n);if(r)return c(+r[1],e)+" "+P(r[1],"day")+" before the last day of the month";let t=/^(\d{1,2})W$|^W(\d{1,2})$/.exec(n);if(t)return"on the weekday nearest the "+x(t[1]||t[2])}function Hn(n,e){let r=n.split("#");if(r.length===2)return"on the "+Oe[+r[1]]+" "+rn(r[0],e)+" of the month";if(/L$/.test(n))return"on the last "+rn(n.slice(0,-1),e)+" of the month"}function Ln(n,e){let r=E(n,e),t=W(n.analyses.segments.date,e.style.ordinals?x:Xe,e);return e.style.dayFirst?t+" "+r:r+" "+t}function Xe(n){return""+n}function z(n,e){return n.pattern.month==="*"?"":" in "+E(n,e)}function An(n){let e=n.split("/"),r=+e[1],t=e[0],o=(r===2?"every other":"every "+x(r))+" day of the month";return t!=="*"&&t!=="1"&&(o+=" from the "+x(t)),o}function en(n,e){return W(n.analyses.segments.date,x,e)}function E(n,e){let r=En(n.pattern.month);return r||W(n.analyses.segments.month,function(i){return tr(i,e)},e)}function En(n){if(!on(n))return null;let[e,r]=n.split("/");return+r!=2?null:e==="*"||e==="1"?"every odd-numbered month":e==="2"?"every even-numbered month":null}function Wn(n,e){return W(n.analyses.segments.weekday,function(t){return rn(t,e)},e)}function W(n,e,r){let t=[];return n.forEach(function(o){o.kind==="step"?t.push(...o.fires.map(e)):o.kind==="range"?t.push(o.bounds.map(e).join(O(r))):t.push(e(o.value))}),S(t,r)}function on(n){return n.indexOf("/")!==-1&&n.indexOf("-")===-1&&n.indexOf(",")===-1}function _e(n,e,r){let t=e.pattern.year;if(t==="*")return n;if(t.indexOf("/")!==-1)return n+" "+er(t,r);let i=nr(t,r);if(t.indexOf("-")===-1&&t.indexOf(",")===-1&&e.pattern.date!=="*"&&n.indexOf(" at ")!==-1){let o=r.style.dayFirst?" ":", ";return n.replace(" at ",o+i+" at ")}return n+" in "+i}function nr(n,e){return n.indexOf(",")!==-1?S(n.split(","),e):n}function er(n,e){let r=n.split("/"),t=+r[1],i=r[0];if(t<=1)return"every year";let o="every "+c(t,e)+" years";return i!=="*"&&i!=="0"&&(o+=" from "+i),o}function l(n,e){let{hour:r,minute:t,plain:i}=n,o=typeof n.second=="number"&&n.second>0?n.second:0;return e.ampm?rr({hour:r,minute:t,second:o,plain:i},e):B({hour:r,minute:t,second:o},{pad:!0,sep:e.style.sep})}function rr(n,e){let{hour:r,minute:t,second:i,plain:o}=n,u=e.style;if(!o&&+t==0&&!i){if(+r==0)return u.midnight;if(+r==12)return u.midday}return B({hour:r%12||12,minute:t,second:i},{lean:!0,sep:u.sep})+(u.closeUp?"":" ")+(r<12?u.am:u.pm)}function c(n,e){return Nn(n,ye,e)}function P(n,e){return+n==1?e:e+"s"}function O(n){return n.short?"-":n.style.through}function x(n){let e=Math.abs(n),r=K[e];return r||(e=(e%100-20)%10,r=K[e]||K[0]),n+r}function tr(n,e){let r=g[n]||be[n];return r&&r[e.short?1:0]}function rn(n,e){let r=n===7||n==="7"?0:n,t=y[r]||Se[r];return t&&t[e.short?1:0]}var ir={describe:Ne,fallback:"an unrecognizable cron pattern",options:ke,reboot:"at system startup",sentence:n=>"Runs "+n+"."},Dn=ir;/**
1
+ "use strict";(()=>{var Vn={SUN:0,MON:1,TUE:2,WED:3,THU:4,FRI:5,SAT:6},$n={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={second:{cyclic:!0,max:59,min:0,top:59},minute:{cyclic:!0,max:59,min:0,top:59},hour:{cyclic:!0,max:23,min:0,top:23},date:{aliases:{"?":"*"},cyclic:!0,max:31,min:1,top:31},month:{cyclic:!0,max:12,min:1,numbers:$n,top:12},weekday:{aliases:{"?":"*",L:"6"},cyclic:!0,max:7,min:0,numbers:Vn,top:6},year:{max:9999,min:1970}},S=["second","minute","hour","date","month","weekday","year"],U={"@annually":"0 0 1 1 *","@yearly":"0 0 1 1 *","@monthly":"0 0 1 * *","@weekly":"0 0 * * 0","@daily":"0 0 * * *","@midnight":"0 0 * * *","@hourly":"0 * * * *"},Q=6;function a(n,e){return(""+n).indexOf(e)!==-1}function T(n){return Array.from(new Set(n))}function I(n){return/^\d+$/.test(n)}function f(n,e){return I(n)?+n:e[n.toUpperCase()]}function an(n){return S.forEach(function(r){Jn(n[r],h[r],r)}),n}function Jn(n,e,r){typeof n!="string"&&typeof n!="number"&&sn(n,r);let t=""+n;t!=="*"&&(r==="date"&&w(t)||r==="weekday"&&R(t,e)||t.split(",").forEach(function(o){Yn(o,e)||sn(o,r)}))}function w(n){if(n==="L"||n==="LW"||n==="WL")return!0;let e=/^L-(\d{1,2})$/.exec(n);if(e)return+e[1]>=1&&+e[1]<=30;let r=/^(\d{1,2})W$|^W(\d{1,2})$/.exec(n);if(r){let t=+(r[1]||r[2]);return t>=1&&t<=31}return!1}function R(n,e){if(/L$/.test(n))return P(n.slice(0,-1),e);let r=n.split("#");return r.length===2?P(r[0],e)&&/^[1-5]$/.test(r[1]):!1}function Yn(n,e){return a(n,"/")?Bn(n,e):a(n,"-")?ln(n,e):P(n,e)}function Bn(n,e){let r=n.split("/");return r.length!==2||!I(r[1])||+r[1]<1?!1:r[0]==="*"||P(r[0],e)||ln(r[0],e,!0)}function ln(n,e,r){let t=n.split("-");return t.length!==2||!P(t[0],e)||!P(t[1],e)?!1:e.cyclic&&!r?!0:f(t[0],e.numbers)<=f(t[1],e.numbers)}function P(n,e){return n==="*"?!1:I(n)?+n>=e.min&&+n<=e.max:e.numbers?n.toUpperCase()in e.numbers:!1}function sn(n,e){throw new Error('`cronli5` was passed an invalid field value "'+n+'" for the '+e+" field.")}var Gn={hour:24,minute:60,second:60};function mn(n){S.forEach(function(r){let t=h[r].aliases,i=t&&t[""+n[r]];i&&(n[r]=i)})}function fn(n){return S.forEach(function(r){let t=""+n[r];if(r==="date"&&w(t)||r==="weekday"&&R(t,h[r])){n[r]=t;return}n[r]=Kn(t,r,h[r])}),n}function Kn(n,e,r){let t=""+n;if(t==="*")return t;let i=Gn[e],o=t.split(",").map(function(s){return Zn(dn(ee(re(te(ne(_n(s,r),r),r),r),r,i),r),r)}).join(",").split(",");return o.indexOf("*")!==-1?"*":T(o).sort(function(s,m){return cn(s,r)-cn(m,r)}).join(",")}function Zn(n,e){if(!e.numbers)return n;let r=n.split("/"),t=r[0].split("-").map(function(o){return Xn(o,e)}).join("-");return r.length===2?t+"/"+r[1]:t}function Xn(n,e){if(n==="*")return n;let r=f(n,e.numbers);return""+(r>e.top?e.min:r)}function _n(n,e){let r=n.split("/");if(!e.cyclic||r.length!==2||+r[1]!=1)return n;let t=r[0];return a(t,"-")?t:t==="*"||f(t,e.numbers)===e.min?"*":t+"-"+e.top}function ne(n,e){let r=n.split("/");if(!e.cyclic||typeof e.top!="number"||r.length!==2||a(r[0],"-"))return n;let t=r[0];return(t==="*"?e.min:f(t,e.numbers))+ +r[1]<=e.top?n:t==="*"?""+e.min:t}function ee(n,e,r){let t=n.split("/");if(typeof r!="number"||t.length!==2||a(t[0],"-"))return n;let i=+t[1],o=t[0]==="*"?e.min:f(t[0]);if(r%i===0&&o<i)return n;let u=[];for(let s=o;s<=e.top;s+=i)u.push(s);return u.join(",")}function re(n,e){let r=n.split("/");return r.length!==2||!a(r[0],"-")?n:dn(r[0],e)==="*"?"*/"+r[1]:n}function dn(n,e){if(typeof e.top!="number"||a(n,"/")||!a(n,"-"))return n;let r=n.split("-"),t=f(r[0],e.numbers),i=f(r[1],e.numbers);if(t>i)return n;let o=e.top,u={};for(let s=t;s<=i;s+=1)u[s>o?e.min:s]=!0;for(let s=e.min;s<=o;s+=1)if(!u[s])return n;return"*"}function te(n,e){let r=n.split("/")[0];if(!a(r,"-"))return n;let t=r.split("-");return f(t[0],e.numbers)!==f(t[1],e.numbers)?n:t[0]}function cn(n,e){let r=n.split("/")[0].split("-")[0];return r==="*"?e.min:f(r,e.numbers)}function gn(n,e){let r=n instanceof Array;if(n===null||typeof n>"u"||n===""||r&&n.length===0)throw new Error("`cronli5` expects a non-empty cron pattern as the first argument.");if(r)return hn(n,e);if(typeof n=="object")return ie(n);if(typeof n=="string")return oe(n,e);throw new Error("`cronli5` was passed an unexpected type.")}function hn(n,e){if(n.length>7)throw new Error("`cronli5` was passed a cron pattern with more than seven fields.");return!e.seconds&&n.length<(e.years?7:6)&&n.unshift("0"),{second:n[0]||"0",minute:n[1]||"*",hour:n[2]||"*",date:n[3]||"*",month:n[4]||"*",weekday:n[5]||"*",year:n[6]||"*"}}function ie(n){if(!n.second&&!n.minute&&!n.hour)throw new Error("`cronli5` expects that any object being interpreted as a cron pattern have at least one of the following properties: `second`, `minute`, or `hour`");let e=typeof n.second<"u",r=typeof n.minute<"u",t=e?"*":"0",i=e||r?"*":"0";return{second:O(n.second,"0"),minute:O(n.minute,t),hour:O(n.hour,i),date:O(n.date,"*"),month:O(n.month,"*"),weekday:O(n.weekday,"*"),year:O(n.year,"*")}}function O(n,e){return typeof n>"u"?e:n}function oe(n,e){let r=ue(n).split(/\s+/);return hn(r,e)}function ue(n){let e=n.trim();if(e.charAt(0)!=="@")return n;let r=e.toLowerCase();if(Object.hasOwn(U,r))return U[r];throw new Error("`cronli5` does not recognize the macro `"+e+"`.")}function pn(n){return n!=="*"&&!a(n,",")&&!a(n,"-")&&!a(n,"/")}function q(n){return a(n,"-")&&!a(n,",")&&!a(n,"/")}function se(n){return a(n,"/")&&!a(n,",")}function V(n){return n!=="*"&&!a(n,"-")&&!a(n,"/")}function $(n){return n!=="*"&&!q(n)&&!se(n)}function C(n,e,r){let t=[],i=n;for(;i<=r;)t.push(i),i+=e;return t}function yn(n,e,r,t){let i=n.split("/"),o=+i[1];if(a(i[0],"-")){let s=i[0].split("-");return C(f(s[0],t),o,f(s[1],t))}let u=i[0]==="*"?e:f(i[0],t);return C(u,o,r)}function J(n,e,r){let t=[];return n.split(",").forEach(function(o){if(a(o,"/"))t.push(...yn(o,e,r));else if(a(o,"-")){let u=o.split("-");+u[0]<=+u[1]?t.push(...C(+u[0],1,+u[1])):(t.push(...C(+u[0],1,r)),t.push(...C(e,1,+u[1])))}else t.push(+o)}),T(t)}function ae(n){return V(n)?n.split(",").map(Number):[0]}function le(n){if(n==="*")return[0,59];if(q(n)){let e=n.split("-");if(+e[0]<=+e[1])return[+e[0],+e[1]]}return null}function ce(n){return n==="*"?59:Math.max(...J(n,0,59))}function me(n){if(pn(n)&&n!=="0")return+n}function fe(n,e){return n==="*"?"wildcard":e==="date"&&w(n)||e==="weekday"&&R(n,h.weekday)?"quartz":a(n,",")?"list":a(n,"/")?"step":a(n,"-")?"range":"single"}function de(n,e,r){return e==="wildcard"||e==="quartz"?null:n.split(",").map(function(i){if(a(i,"/")){let o=i.split("/");return{fires:yn(i,r.min,r.top,r.numbers),interval:+o[1],kind:"step",startToken:o[0]}}return a(i,"-")?{bounds:i.split("-"),kind:"range"}:{kind:"single",value:i}})}function bn(n){let e={},r={};S.forEach(function(u){e[u]=fe(n[u],u),r[u]=de(n[u],e[u],h[u])});let i={analyses:{clockSecond:me(n.second),lastMinuteFire:ce(n.minute),minuteSpan:le(n.minute),segments:r},pattern:n,shapes:e};return{...i,plan:ge(i)}}function ge(n){let{analyses:e,pattern:r,shapes:t}=n;if(r.second!=="0"){let i=he(r,t,e);if(i)return i}return Sn(r,t,e)||kn(r,t,e)}function he(n,e,r){let t=pe(n,e);return t||(n.hour==="*"&&e.minute==="single"&&n.second!=="*"?{kind:"secondsWithinMinute",singleSecond:e.second==="single"}:e.second==="single"&&V(n.minute)&&$(n.hour)?null:{kind:"composeSeconds",rest:Sn(n,e,r,!0)||kn(n,e,r,!0)})}function pe(n,e){return n.minute!=="*"||n.hour!=="*"?null:n.second==="*"?{kind:"everySecond"}:e.second==="single"?{kind:"secondPastMinute"}:{kind:"standaloneSeconds"}}function Sn(n,e,r,t=!1){if(e.minute==="step")return{hours:be(n,e,r),kind:"minuteFrequency"};if(e.hour==="single"&&r.minuteSpan)return{hour:+n.hour,kind:"minuteSpanInHour",span:r.minuteSpan};let i=Se(n,e);if(i)return i;let o=ye(n,e);if(o)return o;if(n.hour==="*")return Oe(n,e,t)}function On(n){let[e,r]=n.split("/"),t=e==="*"?0:+e;return e.indexOf("-")===-1&&24%+r===0&&t<+r}function ye(n,e){return e.hour!=="step"?null:n.minute==="*"?On(n.hour)?{form:"wildcard",kind:"minuteSpanAcrossHourStep"}:{form:"wildcard",kind:"minutesAcrossHours",times:x(n.hour)}:e.minute==="range"?{form:"range",kind:"minuteSpanAcrossHourStep"}:null}function be(n,e,r){if(e.hour==="list")return{kind:"during",times:x(n.hour)};if(e.hour==="range"){let t=n.hour.split("-");return{from:+t[0],kind:"window",last:r.lastMinuteFire,to:+t[1]}}return e.hour==="single"?{from:+n.hour,kind:"window",last:r.lastMinuteFire,to:+n.hour}:e.hour==="step"?On(n.hour)?{kind:"step"}:{kind:"during",times:x(n.hour)}:{kind:"none"}}function Se(n,e){return $(n.hour)?n.minute==="*"?{form:"wildcard",kind:"minutesAcrossHours",times:x(n.hour)}:e.minute==="range"||e.minute==="list"&&a(n.minute,"-")&&!a(n.minute,"/")?{form:e.minute==="range"?"range":"list",kind:"minutesAcrossHours",times:x(n.hour)}:null:null}function Oe(n,e,r){if(e.minute==="range")return{kind:"rangeOfMinutes"};if(e.minute==="list")return{kind:"multipleMinutes"};if(n.minute==="*")return{kind:"everyMinute"};if(n.minute!=="0"||r)return{kind:"singleMinute"}}function kn(n,e,r,t=!1){let i=t&&n.minute==="0";return e.hour==="range"&&!i?ke(n,e,r):e.hour==="step"&&n.minute==="0"&&!t?{kind:"hourStep"}:n.hour==="*"&&!i?{kind:"everyHour"}:Ne(n,r,i)}function ke(n,e,r){let t=n.hour.split("-"),i="lead";return n.minute==="*"?i="wildcard":e.minute==="range"&&(i="range"),{boundMinute:e.minute==="range"||e.minute==="list"?null:r.lastMinuteFire,from:+t[0],kind:"hourRange",last:r.lastMinuteFire,minuteForm:i,to:+t[1]}}function Ne(n,e,r=!1){let t=J(n.hour,0,23),i=ae(n.minute);if(!r&&t.length*i.length>Q)return{fold:i.length===1,kind:"compactClockTimes",minute:i[0]};let o=[];return t.forEach(function(s){i.forEach(function(A){o.push({hour:s,minute:A,second:e.clockSecond})})}),{kind:"clockTimes",times:o}}function x(n){let e=J(n,0,23);return e.length<=Q?{fires:e,kind:"fires"}:{kind:"segments"}}function Nn(n,e){let r=gn(n,e);return mn(r),an(r),fn(r)}function Y(n){return n=""+n,n.length<2?"0"+n:n}function zn(n,e,r){return r.short?n:e[n]||n}function B(n,{sep:e,pad:r,lean:t}){let i=r?Y(n.hour):""+n.hour;return t&&!n.minute&&!n.second?i:i+e+Y(n.minute)+(n.second?e+Y(n.second):"")}var G={gb:{am:"am",closeUp:!0,dayFirst:!0,midday:"midday",midnight:"midnight",ordinals:!1,pm:"pm",sep:".",serialComma:!1,through:" to "},us:{am:"a.m.",closeUp:!1,dayFirst:!1,midday:"noon",midnight:"midnight",ordinals:!1,pm:"p.m.",sep:":",serialComma:!0,through:" through "},house:{am:"AM",closeUp:!1,dayFirst:!1,midday:"noon",midnight:"midnight",ordinals:!0,pm:"PM",sep:":",serialComma:!0,through:" - "}};function Pn(n){return typeof n=="object"&&n!==null?{...G.us,...n}:G[n==="uk"?"gb":n]||G.us}var ze=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],K=["th","st","nd","rd"],Pe=[null,["January","Jan"],["February","Feb"],["March","Mar"],["April","Apr"],["May","May"],["June","Jun"],["July","Jul"],["August","Aug"],["September","Sep"],["October","Oct"],["November","Nov"],["December","Dec"]],y=[["Sunday","Sun"],["Monday","Mon"],["Tuesday","Tue"],["Wednesday","Wed"],["Thursday","Thu"],["Friday","Fri"],["Saturday","Sat"]],ve={SUN:y[0],MON:y[1],TUE:y[2],WED:y[3],THU:y[4],FRI:y[5],SAT:y[6]},we=[null,"first","second","third","fourth","fifth"];function Re(n){return n=n||{},{ampm:typeof n.ampm=="boolean"?n.ampm:!0,lenient:!!n.lenient,seconds:!!n.seconds,short:!!n.short,style:Pn(n.dialect),years:!!n.years}}function Ce(n,e){return ur(wn(n,n.plan,e),n,e)}function wn(n,e,r){let t=Xe[e.kind];return t(n,e,r)}function xe(n,e,r){return"every second"+l(n,r)}function Fe(n,e,r){return v(n,r)+l(n,r)}function Me(n,e,r){let t=n.pattern.second;return d(t,r)+" "+z(t,"second")+" past the minute, every minute"+l(n,r)}function Te(n,e,r){let t=n.pattern.minute,i=d(t,r),o=z(t,"minute");if(e.singleSecond){let u=n.pattern.second;return i+" "+o+" and "+d(u,r)+" "+z(u,"second")+" past the hour, every hour"+l(n,r)}return v(n,r)+", "+i+" "+o+" past the hour, every hour"+l(n,r)}function Ie(n,e,r){return e.rest.kind==="clockTimes"&&(n.shapes.second==="wildcard"||n.shapes.second==="step")?+e.rest.times[0].minute==0?v(n,r)+" for one minute at "+He(n,e.rest,r):v(n,r)+" of "+Le(n,e.rest,r):n.shapes.second==="wildcard"&&e.rest.kind==="minuteFrequency"&&e.rest.hours.kind==="none"&&n.pattern.minute==="*/2"?"every second of every other minute"+l(n,r):v(n,r)+", "+wn(n,e.rest,r)}function He(n,e,r){let t=e.times.map(function(u){return c({hour:u.hour,minute:0},r)}),i=W(n,tn,r);return g(t,r)+(i&&", "+i)}function Le(n,e,r){let t=e.times.map(function(u){return c({hour:u.hour,minute:u.minute,second:u.second,explicit:!0},r)}),i=W(n,tn,r);return g(t,r)+(i&&", "+i)}function v(n,e){let r=n.pattern.second,t=n.shapes.second;if(r==="*")return"every second";if(t==="step")return Fn(n.analyses.segments.second[0],"second","minute",e);if(t==="range"){let i=r.split("-"),o=L(i,e);return"every second from "+o(i[0])+b(e)+o(i[1])+" past the minute"}return t==="single"?"at "+d(r,e)+" "+z(r,"second")+" past the minute":N(M(n.analyses.segments.second,e),"second","minute",e)}function We(n,e,r){return"every minute"+l(n,r)}function je(n,e,r){let t=n.pattern.minute;return d(t,r)+" "+z(t,"minute")+" past the hour, every hour"+l(n,r)}function Ee(n,e,r){return H(n.pattern.minute,r)+l(n,r)}function Ae(n,e,r){return N(M(n.analyses.segments.minute,r),"minute","hour",r)+l(n,r)}function De(n,e,r){let t=Fn(n.analyses.segments.minute[0],"minute","hour",r);return e.hours.kind==="during"?t+=" during the "+X(n,e.hours.times,!1,r)+" hours":e.hours.kind==="window"?t+=" "+xn(e.hours,r):e.hours.kind==="step"&&(t+=" "+Rn(n.analyses.segments.hour[0],r)),t+l(n,r)}function Ue(n,e,r){return n.pattern.minute==="*"?"every minute of the "+c({hour:e.hour,minute:0},r)+" hour"+l(n,r):"every minute from "+c({hour:e.hour,minute:e.span[0]},r)+b(r)+c({hour:e.hour,minute:e.span[1]},r)+l(n,r)}function Qe(n,e,r){if(e.form==="wildcard")return"every minute during the "+X(n,e.times,!1,r)+" hours"+l(n,r);let t=X(n,e.times,!0,r);return(e.form==="range"?H(n.pattern.minute,r):N(M(n.analyses.segments.minute,r),"minute","hour",r))+", at "+t+l(n,r)}var qe={2:"other",3:"third",4:"fourth",6:"sixth",8:"eighth",12:"twelfth"};function Rn(n,e){let r="during every "+qe[n.interval]+" hour",t=n.startToken==="*"?0:+n.startToken;return t===0?r:r+" starting at "+c({hour:t,minute:0},e)}function Ve(n,e,r){let t=n.analyses.segments.hour[0];return e.form==="wildcard"?"every minute "+Rn(t,r)+l(n,r):H(n.pattern.minute,r)+", "+Mn(t,r)+l(n,r)}function H(n,e){let r=n.split("-"),t=L(r,e);return"every minute from "+t(r[0])+b(e)+t(r[1])+" past the hour"}function $e(n,e,r){return"every hour"+l(n,r)}function Je(n,e,r){let t=xn(Be(e),r);return e.minuteForm==="wildcard"?"every minute "+t+l(n,r):e.minuteForm==="range"?H(n.pattern.minute,r)+", "+t+l(n,r):Cn(n,r)+" "+t+l(n,r)}function Cn(n,e){return n.pattern.minute==="0"?"every hour":N(M(n.analyses.segments.minute,e),"minute","hour",e)}function Ye(n,e,r){return Mn(n.analyses.segments.hour[0],r)+l(n,r)}function Be(n){return{from:n.from,last:n.boundMinute??0,to:n.to}}function xn(n,e){return"from "+c({hour:n.from,minute:0},e)+b(e)+c({hour:n.to,minute:n.last},e)}function Ge(n,e,r){let t=rn(e.times),i=e.times.map(function(u){return c({hour:u.hour,minute:u.minute,second:u.second,plain:t},r)});return Tn(n,r)+"at "+g(i,r)}function Ke(n,e,r){if(e.fold){if(n.analyses.segments.hour.some(function(s){return s.kind==="range"})&&!n.analyses.clockSecond)return Ze(n,e,r)+l(n,r);let o={minute:e.minute,second:n.analyses.clockSecond};return Tn(n,r)+"at "+_(n,o,!0,r)}let t=N(M(n.analyses.segments.minute,r),"minute","hour",r)+", at "+_(n,{minute:0,second:null},!0,r)+l(n,r);return n.analyses.clockSecond?v(n,r)+", "+t:t}function Ze(n,e,r){let t=e.minute,i=[],o=[];n.analyses.segments.hour.forEach(function(m){m.kind==="range"?i.push("from "+c({hour:m.bounds[0],minute:0},r)+b(r)+c({hour:m.bounds[1],minute:t},r)):m.kind==="step"?o.push(...m.fires):o.push(+m.value)});let u=Cn(n,r)+" "+g(i,r);return o.length&&(u+=" and at "+g(o.map(function(m){return c({hour:m,minute:t},r)}),r)),u}var Xe={clockTimes:Ge,compactClockTimes:Ke,composeSeconds:Ie,everyHour:$e,everyMinute:We,everySecond:xe,hourRange:Je,hourStep:Ye,minuteFrequency:De,minuteSpanAcrossHourStep:Ve,minuteSpanInHour:Ue,minutesAcrossHours:Qe,multipleMinutes:Ae,rangeOfMinutes:Ee,secondPastMinute:Me,secondsWithinMinute:Te,singleMinute:je,standaloneSeconds:Fe};function Fn(n,e,r,t){if(n.startToken.indexOf("-")!==-1)return N(vn(n.fires,t),e,r,t);let i=n.startToken==="*"?0:+n.startToken,o=n.interval;return i!==0?n.fires.length<=3?N(vn(n.fires,t),e,r,t):"every "+d(o,t)+" "+e+"s from "+d(i,t)+" "+z(i,e)+" past the "+r:"every "+d(o,t)+" "+e+"s"}function Mn(n,e){if(n.startToken.indexOf("-")!==-1)return"at "+Z(n.fires,e);let r=n.startToken==="*"?0:+n.startToken,t=n.interval;return r===0?"every "+d(t,e)+" hours":n.fires.length<=3?"at "+Z(n.fires,e):"every "+d(t,e)+" hours from "+c({hour:r,minute:0},e)}function L(n,e){let r=n.some(function(i){return+i>10});return function(i){return r?""+i:d(i,e)}}function vn(n,e){return n.map(L(n,e))}function M(n,e){let r=n.flatMap(function(o){return o.kind==="range"?o.bounds:o.kind==="step"?o.fires:[o.value]}),t=L(r,e);return n.flatMap(function(o){return o.kind==="range"?[t(o.bounds[0])+b(e)+t(o.bounds[1])]:o.kind==="step"?o.fires.map(t):[t(o.value)]})}function N(n,e,r,t){return"at "+g(n,t)+" "+e+"s past the "+r}function _e(n,e,r){return(+n==0||+n==12)&&+e==0&&!(typeof r=="number"&&r>0)}function rn(n){let e=n.filter(function(t){return _e(t.hour,t.minute,t.second)});return e.length>0&&e.length<n.length}function Z(n,e){let r=rn(n.map(function(o){return{hour:o,minute:0}})),t=n.map(function(o){return c({hour:o,minute:0,plain:r},e)});return g(t,e)}function X(n,e,r,t){return e.kind==="fires"?Z(e.fires,t):_(n,{minute:0,second:null},r,t)}function nr(n){return n.kind==="range"?n.bounds:n.kind==="step"?n.fires:[n.value]}function _(n,e,r,t){let{minute:i,second:o}=e,u=n.analyses.segments.hour,s=rn(u.flatMap(function(p){return nr(p).map(function(D){return{hour:+D,minute:i,second:o}})})),m=[];return u.forEach(function(p){p.kind==="step"?m.push(...p.fires.map(function(D){return c({hour:D,minute:i,second:o,plain:s},t)})):p.kind==="range"?m.push(c({hour:p.bounds[0],minute:i,second:o,plain:s},t)+b(t)+c({hour:p.bounds[1],minute:i,second:o,plain:s},t)):m.push(c({hour:p.value,minute:i,second:o,plain:s},t))}),g(er(m,u,r),t)}function er(n,e,r){let t=e.some(function(o){return o.kind==="range"});return!r||!t?n:n.map(function(o,u){return u===0?o:"at "+o})}function g(n,e){if(n.length<=1)return n.join("");if(n.length===2)return n[0]+" and "+n[1];let r=e.style.serialComma?", and ":" and ";return n.slice(0,-1).join(", ")+r+n[n.length-1]}var rr={all:"",month:"in ",stepDate:"on ",weekday:"on "},tn={all:"every day",month:"every day in ",stepDate:"",weekday:"every "};function l(n,e){let r=W(n,rr,e);return r&&" "+r}function Tn(n,e){return W(n,tn,e)+" "}function W(n,e,r){let t=n.pattern;return t.date!=="*"&&t.weekday!=="*"?ir(n,r):t.date!=="*"?tr(n,e,r):t.weekday!=="*"?(Ln(t.weekday,r)||e.weekday+An(n,r))+k(n,r):t.month!=="*"?e.month+j(n,r):e.all}function tr(n,e,r){let t=n.pattern,i=Hn(t.date,r);return i?i+k(n,r):on(t.date)?e.stepDate+jn(t.date)+k(n,r):t.month!=="*"&&!In(n)?"on the "+nn(n,r)+k(n,r):t.month!=="*"?"on "+Wn(n,r):"on the "+nn(n,r)}function In(n){return!En(n.pattern.month)&&n.analyses.segments.month.every(function(r){return r.kind!=="range"})}function ir(n,e){let r=n.pattern,t=Ln(r.weekday,e)||"on "+An(n,e),i=Hn(r.date,e);return i?i+k(n,e)+" or "+t:on(r.date)?jn(r.date)+k(n,e)+" or "+t:r.month!=="*"&&In(n)?"on "+Wn(n,e)+" or "+t+" in "+j(n,e):"on the "+nn(n,e)+" or "+t+k(n,e)}function Hn(n,e){if(n==="L")return"on the last day of the month";if(n==="LW"||n==="WL")return"on the last weekday of the month";let r=/^L-(\d{1,2})$/.exec(n);if(r)return d(+r[1],e)+" "+z(r[1],"day")+" before the last day of the month";let t=/^(\d{1,2})W$|^W(\d{1,2})$/.exec(n);if(t)return"on the weekday nearest the "+F(t[1]||t[2])}function Ln(n,e){let r=n.split("#");if(r.length===2)return"on the "+we[+r[1]]+" "+en(r[0],e)+" of the month";if(/L$/.test(n))return"on the last "+en(n.slice(0,-1),e)+" of the month"}function Wn(n,e){let r=j(n,e),t=E(n.analyses.segments.date,e.style.ordinals?F:or,e);return e.style.dayFirst?t+" "+r:r+" "+t}function or(n){return""+n}function k(n,e){return n.pattern.month==="*"?"":" in "+j(n,e)}function jn(n){let e=n.split("/"),r=+e[1],t=e[0],o=(r===2?"every other":"every "+F(r))+" day of the month";return t!=="*"&&t!=="1"&&(o+=" from the "+F(t)),o}function nn(n,e){return E(n.analyses.segments.date,F,e)}function j(n,e){let r=En(n.pattern.month);return r||E(n.analyses.segments.month,function(i){return cr(i,e)},e)}function En(n){if(!on(n))return null;let[e,r]=n.split("/");return+r!=2?null:e==="*"||e==="1"?"every odd-numbered month":e==="2"?"every even-numbered month":null}function An(n,e){return E(n.analyses.segments.weekday,function(t){return en(t,e)},e)}function E(n,e,r){let t=[];return n.forEach(function(o){o.kind==="step"?t.push(...o.fires.map(e)):o.kind==="range"?t.push(o.bounds.map(e).join(b(r))):t.push(e(o.value))}),g(t,r)}function on(n){return n.indexOf("/")!==-1&&n.indexOf("-")===-1&&n.indexOf(",")===-1}function ur(n,e,r){let t=e.pattern.year;if(t==="*")return n;if(t.indexOf("/")!==-1)return n+" "+ar(t,r);let i=sr(t,r);if(t.indexOf("-")===-1&&t.indexOf(",")===-1&&e.pattern.date!=="*"&&n.indexOf(" at ")!==-1){let o=r.style.dayFirst?" ":", ";return n.replace(" at ",o+i+" at ")}return n+" in "+i}function sr(n,e){return n.indexOf(",")!==-1?g(n.split(","),e):n}function ar(n,e){let r=n.split("/"),t=+r[1],i=r[0];if(t<=1)return"every year";let o="every "+d(t,e)+" years";return i!=="*"&&i!=="0"&&(o+=" from "+i),o}function c(n,e){let{hour:r,minute:t,plain:i,explicit:o}=n,u=typeof n.second=="number"&&n.second>0?n.second:0;return e.ampm?lr({hour:r,minute:t,second:u,plain:i,explicit:o},e):B({hour:r,minute:t,second:u},{pad:!0,sep:e.style.sep})}function lr(n,e){let{hour:r,minute:t,second:i,plain:o,explicit:u}=n,s=e.style;if(!o&&!u&&+t==0&&!i){if(+r==0)return s.midnight;if(+r==12)return s.midday}return B({hour:r%12||12,minute:t,second:i},{lean:!u,sep:s.sep})+(s.closeUp?"":" ")+(r<12?s.am:s.pm)}function d(n,e){return zn(n,ze,e)}function z(n,e){return+n==1?e:e+"s"}function b(n){return n.short?"-":n.style.through}function F(n){let e=Math.abs(n),r=K[e];return r||(e=(e%100-20)%10,r=K[e]||K[0]),n+r}function cr(n,e){let r=Pe[+n];return r&&r[e.short?1:0]}function en(n,e){let r=n===7||n==="7"?0:n,t=y[r]||ve[r];return t&&t[e.short?1:0]}var mr={describe:Ce,fallback:"an unrecognizable cron pattern",options:Re,reboot:"at system startup",sentence:n=>"Runs "+n+(n.endsWith(".")?"":".")},Dn=mr;/**
2
2
  * @license MIT, Copyright (c) 2026 Andrew Brož
3
- */function or(n,e){let r=e&&e.lang||Dn,t=r.options(e);if(!t.lenient)return jn(Un(n,r,t),r,e);try{return jn(Un(n,r,t),r,e)}catch{return r.fallback}}function jn(n,e,r){return r&&r.sentence?e.sentence(n):n}function Un(n,e,r){if(typeof n=="string"&&n.trim().toLowerCase()==="@reboot")return e.reboot;let t=yn(kn(n,r)),i=e.strategy?e.strategy(t,t.plan):t.plan;return e.describe({...t,plan:i},r)}var un=or;typeof globalThis<"u"&&Object.assign(globalThis,{cronli5:un});var Ur=un;})();
3
+ */function fr(n,e){let r=e&&e.lang||Dn,t=r.options(e);if(!t.lenient)return Un(Qn(n,r,t),r,e);try{return Un(Qn(n,r,t),r,e)}catch{return r.fallback}}function Un(n,e,r){return r&&r.sentence?e.sentence(n):n}function Qn(n,e,r){if(typeof n=="string"&&n.trim().toLowerCase()==="@reboot")return e.reboot;let t=bn(Nn(n,r)),i=e.strategy?e.strategy(t,t.plan):t.plan;return e.describe({...t,plan:i},r)}var un=fr;typeof globalThis<"u"&&Object.assign(globalThis,{cronli5:un});var Br=un;})();
package/dist/cronli5.cjs CHANGED
@@ -194,6 +194,11 @@ function throwInvalidField(value, field) {
194
194
  }
195
195
 
196
196
  // src/core/normalize.ts
197
+ var timeFieldCycle = {
198
+ hour: 24,
199
+ minute: 60,
200
+ second: 60
201
+ };
197
202
  function applyQuartzAliases(cronPattern) {
198
203
  fieldOrder.forEach(function apply(field) {
199
204
  const aliases = fieldSpecs[field].aliases;
@@ -210,21 +215,32 @@ function normalizeCronPattern(cronPattern) {
210
215
  cronPattern[field] = value;
211
216
  return;
212
217
  }
213
- cronPattern[field] = normalizeField(value, fieldSpecs[field]);
218
+ cronPattern[field] = normalizeField(value, field, fieldSpecs[field]);
214
219
  });
215
220
  return cronPattern;
216
221
  }
217
- function normalizeField(value, spec) {
222
+ function normalizeField(value, field, spec) {
218
223
  const stringValue = "" + value;
219
224
  if (stringValue === "*") {
220
225
  return stringValue;
221
226
  }
227
+ const cycle = timeFieldCycle[field];
222
228
  const segments = stringValue.split(",").map(function canonical(segment) {
223
- return collapseDegenerateRange(
224
- collapseOnceStep(collapseUnitStep(segment, spec), spec),
229
+ return canonicalizeTokens(collapseFullSpanRange(
230
+ enumerateNonUniformStep(
231
+ collapseFullSpanStep(
232
+ collapseDegenerateRange(
233
+ collapseOnceStep(collapseUnitStep(segment, spec), spec),
234
+ spec
235
+ ),
236
+ spec
237
+ ),
238
+ spec,
239
+ cycle
240
+ ),
225
241
  spec
226
- );
227
- });
242
+ ), spec);
243
+ }).join(",").split(",");
228
244
  if (segments.indexOf("*") !== -1) {
229
245
  return "*";
230
246
  }
@@ -232,6 +248,23 @@ function normalizeField(value, spec) {
232
248
  return firstFire(a, spec) - firstFire(b, spec);
233
249
  }).join(",");
234
250
  }
251
+ function canonicalizeTokens(segment, spec) {
252
+ if (!spec.numbers) {
253
+ return segment;
254
+ }
255
+ const parts = segment.split("/");
256
+ const start = parts[0].split("-").map(function fold(token) {
257
+ return canonicalizeToken(token, spec);
258
+ }).join("-");
259
+ return parts.length === 2 ? start + "/" + parts[1] : start;
260
+ }
261
+ function canonicalizeToken(token, spec) {
262
+ if (token === "*") {
263
+ return token;
264
+ }
265
+ const number = toFieldNumber(token, spec.numbers);
266
+ return "" + (number > spec.top ? spec.min : number);
267
+ }
235
268
  function collapseUnitStep(segment, spec) {
236
269
  const parts = segment.split("/");
237
270
  if (!spec.cyclic || parts.length !== 2 || +parts[1] !== 1) {
@@ -258,6 +291,51 @@ function collapseOnceStep(segment, spec) {
258
291
  }
259
292
  return start === "*" ? "" + spec.min : start;
260
293
  }
294
+ function enumerateNonUniformStep(segment, spec, cycle) {
295
+ const parts = segment.split("/");
296
+ if (typeof cycle !== "number" || parts.length !== 2 || includes(parts[0], "-")) {
297
+ return segment;
298
+ }
299
+ const interval = +parts[1];
300
+ const start = parts[0] === "*" ? spec.min : toFieldNumber(parts[0]);
301
+ if (cycle % interval === 0 && start < interval) {
302
+ return segment;
303
+ }
304
+ const fires = [];
305
+ for (let value = start; value <= spec.top; value += interval) {
306
+ fires.push(value);
307
+ }
308
+ return fires.join(",");
309
+ }
310
+ function collapseFullSpanStep(segment, spec) {
311
+ const parts = segment.split("/");
312
+ if (parts.length !== 2 || !includes(parts[0], "-")) {
313
+ return segment;
314
+ }
315
+ return collapseFullSpanRange(parts[0], spec) === "*" ? "*/" + parts[1] : segment;
316
+ }
317
+ function collapseFullSpanRange(segment, spec) {
318
+ if (typeof spec.top !== "number" || includes(segment, "/") || !includes(segment, "-")) {
319
+ return segment;
320
+ }
321
+ const bounds = segment.split("-");
322
+ const low = toFieldNumber(bounds[0], spec.numbers);
323
+ const high = toFieldNumber(bounds[1], spec.numbers);
324
+ if (low > high) {
325
+ return segment;
326
+ }
327
+ const top = spec.top;
328
+ const fired = {};
329
+ for (let value = low; value <= high; value += 1) {
330
+ fired[value > top ? spec.min : value] = true;
331
+ }
332
+ for (let value = spec.min; value <= top; value += 1) {
333
+ if (!fired[value]) {
334
+ return segment;
335
+ }
336
+ }
337
+ return "*";
338
+ }
261
339
  function collapseDegenerateRange(segment, spec) {
262
340
  const start = segment.split("/")[0];
263
341
  if (!includes(start, "-")) {
@@ -826,20 +904,6 @@ var weekdayNames = [
826
904
  ["Friday", "Fri"],
827
905
  ["Saturday", "Sat"]
828
906
  ];
829
- var monthAbbreviations = {
830
- JAN: monthNames[1],
831
- FEB: monthNames[2],
832
- MAR: monthNames[3],
833
- APR: monthNames[4],
834
- MAY: monthNames[5],
835
- JUN: monthNames[6],
836
- JUL: monthNames[7],
837
- AUG: monthNames[8],
838
- SEP: monthNames[9],
839
- OCT: monthNames[10],
840
- NOV: monthNames[11],
841
- DEC: monthNames[12]
842
- };
843
907
  var weekdayAbbreviations = {
844
908
  SUN: weekdayNames[0],
845
909
  MON: weekdayNames[1],
@@ -889,8 +953,37 @@ function renderSecondsWithinMinute(ir, plan, opts) {
889
953
  return secondsLeadClause(ir, opts) + ", " + minuteWord + " " + minuteUnit + " past the hour, every hour" + trailingQualifier(ir, opts);
890
954
  }
891
955
  function renderComposeSeconds(ir, plan, opts) {
956
+ if (plan.rest.kind === "clockTimes" && (ir.shapes.second === "wildcard" || ir.shapes.second === "step")) {
957
+ const minute = plan.rest.times[0].minute;
958
+ if (+minute === 0) {
959
+ return secondsLeadClause(ir, opts) + " for one minute at " + durationHours(ir, plan.rest, opts);
960
+ }
961
+ return secondsLeadClause(ir, opts) + " of " + clockTimesOf(ir, plan.rest, opts);
962
+ }
963
+ if (ir.shapes.second === "wildcard" && plan.rest.kind === "minuteFrequency" && plan.rest.hours.kind === "none" && ir.pattern.minute === "*/2") {
964
+ return "every second of every other minute" + trailingQualifier(ir, opts);
965
+ }
892
966
  return secondsLeadClause(ir, opts) + ", " + render(ir, plan.rest, opts);
893
967
  }
968
+ function durationHours(ir, plan, opts) {
969
+ const hours = plan.times.map(function clock(time) {
970
+ return getTime({ hour: time.hour, minute: 0 }, opts);
971
+ });
972
+ const trail = dayQualifier(ir, leadingWords, opts);
973
+ return joinList(hours, opts) + (trail && ", " + trail);
974
+ }
975
+ function clockTimesOf(ir, plan, opts) {
976
+ const times = plan.times.map(function clock(time) {
977
+ return getTime({
978
+ hour: time.hour,
979
+ minute: time.minute,
980
+ second: time.second,
981
+ explicit: true
982
+ }, opts);
983
+ });
984
+ const trail = dayQualifier(ir, leadingWords, opts);
985
+ return joinList(times, opts) + (trail && ", " + trail);
986
+ }
894
987
  function secondsLeadClause(ir, opts) {
895
988
  const secondField = ir.pattern.second;
896
989
  const shape = ir.shapes.second;
@@ -955,6 +1048,9 @@ function renderMinuteFrequency(ir, plan, opts) {
955
1048
  return phrase + trailingQualifier(ir, opts);
956
1049
  }
957
1050
  function renderMinuteSpanInHour(ir, plan, opts) {
1051
+ if (ir.pattern.minute === "*") {
1052
+ return "every minute of the " + getTime({ hour: plan.hour, minute: 0 }, opts) + " hour" + trailingQualifier(ir, opts);
1053
+ }
958
1054
  return "every minute from " + getTime({ hour: plan.hour, minute: plan.span[0] }, opts) + through(opts) + getTime({ hour: plan.hour, minute: plan.span[1] }, opts) + trailingQualifier(ir, opts);
959
1055
  }
960
1056
  function renderMinutesAcrossHours(ir, plan, opts) {
@@ -1126,13 +1222,7 @@ function stepCycle60(segment, unit, anchor, opts) {
1126
1222
  }
1127
1223
  return "every " + getNumber(interval, opts) + " " + unit + "s from " + getNumber(start, opts) + " " + pluralize(start, unit) + " past the " + anchor;
1128
1224
  }
1129
- if (60 % interval === 0) {
1130
- return "every " + getNumber(interval, opts) + " " + unit + "s";
1131
- }
1132
- if (segment.fires.length <= 2) {
1133
- return listPastThe(numberWords(segment.fires, opts), unit, anchor, opts);
1134
- }
1135
- return "every " + getNumber(interval, opts) + " " + unit + "s past the " + anchor;
1225
+ return "every " + getNumber(interval, opts) + " " + unit + "s";
1136
1226
  }
1137
1227
  function stepHours(segment, opts) {
1138
1228
  if (segment.startToken.indexOf("-") !== -1) {
@@ -1140,15 +1230,12 @@ function stepHours(segment, opts) {
1140
1230
  }
1141
1231
  const start = segment.startToken === "*" ? 0 : +segment.startToken;
1142
1232
  const interval = segment.interval;
1143
- if (start === 0 && 24 % interval === 0) {
1233
+ if (start === 0) {
1144
1234
  return "every " + getNumber(interval, opts) + " hours";
1145
1235
  }
1146
1236
  if (segment.fires.length <= 3) {
1147
1237
  return "at " + hourTimes(segment.fires, opts);
1148
1238
  }
1149
- if (start === 0) {
1150
- return "every " + getNumber(interval, opts) + " hours from midnight";
1151
- }
1152
1239
  return "every " + getNumber(interval, opts) + " hours from " + getTime({ hour: start, minute: 0 }, opts);
1153
1240
  }
1154
1241
  function seriesNumber(values, opts) {
@@ -1462,7 +1549,7 @@ function stepYears(yearField, opts) {
1462
1549
  return phrase;
1463
1550
  }
1464
1551
  function getTime(time, opts) {
1465
- const { hour, minute, plain } = time;
1552
+ const { hour, minute, plain, explicit } = time;
1466
1553
  const second = typeof time.second === "number" && time.second > 0 ? time.second : 0;
1467
1554
  if (!opts.ampm) {
1468
1555
  return clockDigits({
@@ -1471,12 +1558,12 @@ function getTime(time, opts) {
1471
1558
  second
1472
1559
  }, { pad: true, sep: opts.style.sep });
1473
1560
  }
1474
- return twelveHourTime({ hour, minute, second, plain }, opts);
1561
+ return twelveHourTime({ hour, minute, second, plain, explicit }, opts);
1475
1562
  }
1476
1563
  function twelveHourTime(time, opts) {
1477
- const { hour, minute, second, plain } = time;
1564
+ const { hour, minute, second, plain, explicit } = time;
1478
1565
  const style = opts.style;
1479
- if (!plain && +minute === 0 && !second) {
1566
+ if (!plain && !explicit && +minute === 0 && !second) {
1480
1567
  if (+hour === 0) {
1481
1568
  return style.midnight;
1482
1569
  }
@@ -1486,7 +1573,7 @@ function twelveHourTime(time, opts) {
1486
1573
  }
1487
1574
  const digits = clockDigits(
1488
1575
  { hour: hour % 12 || 12, minute, second },
1489
- { lean: true, sep: style.sep }
1576
+ { lean: !explicit, sep: style.sep }
1490
1577
  );
1491
1578
  return digits + (style.closeUp ? "" : " ") + (hour < 12 ? style.am : style.pm);
1492
1579
  }
@@ -1509,7 +1596,7 @@ function getOrdinal(n) {
1509
1596
  return n + suffix;
1510
1597
  }
1511
1598
  function getMonth(m, opts) {
1512
- const month = monthNames[m] || monthAbbreviations[m];
1599
+ const month = monthNames[+m];
1513
1600
  return month && month[opts.short ? 1 : 0];
1514
1601
  }
1515
1602
  function getWeekday(d, opts) {
@@ -1522,7 +1609,9 @@ var en = {
1522
1609
  fallback: "an unrecognizable cron pattern",
1523
1610
  options: normalizeOptions,
1524
1611
  reboot: "at system startup",
1525
- sentence: (description) => "Runs " + description + "."
1612
+ // A description ending in an abbreviation already carries its period
1613
+ // ("…9 a.m."), so closing the sentence must not double it.
1614
+ sentence: (description) => "Runs " + description + (description.endsWith(".") ? "" : ".")
1526
1615
  };
1527
1616
  var en_default = en;
1528
1617