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 +91 -0
- package/cli.js +9 -0
- package/cronli5.min.js +2 -2
- package/dist/cronli5.cjs +127 -38
- package/dist/cronli5.js +127 -38
- package/dist/lang/de.cjs +59 -36
- package/dist/lang/de.js +59 -36
- package/dist/lang/en.cjs +43 -32
- package/dist/lang/en.js +43 -32
- package/dist/lang/es.cjs +81 -40
- package/dist/lang/es.js +81 -40
- package/dist/lang/fi.cjs +46 -44
- package/dist/lang/fi.js +46 -44
- package/dist/lang/zh.cjs +36 -13
- package/dist/lang/zh.js +36 -13
- package/package.json +2 -1
- package/src/core/normalize.ts +144 -6
- package/src/lang/de/index.ts +99 -35
- package/src/lang/en/index.ts +113 -48
- package/src/lang/es/index.ts +140 -41
- package/src/lang/fi/index.ts +62 -39
- package/src/lang/zh/index.ts +93 -21
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
|
|
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
|
|
224
|
-
|
|
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
|
-
|
|
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
|
|
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:
|
|
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]
|
|
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
|
-
|
|
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
|
|