cronli5 0.3.4 → 0.7.2
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 +97 -0
- package/README.md +39 -6
- package/cronli5.min.js +2 -2
- package/dist/cronli5.cjs +13 -6
- package/dist/cronli5.js +13 -6
- package/dist/lang/de.cjs +13 -6
- package/dist/lang/de.js +13 -6
- package/dist/lang/en.cjs +13 -6
- package/dist/lang/en.js +13 -6
- package/dist/lang/es.cjs +13 -6
- package/dist/lang/es.js +13 -6
- package/dist/lang/fi.cjs +13 -6
- package/dist/lang/fi.js +13 -6
- package/dist/lang/fr.cjs +1210 -0
- package/dist/lang/fr.js +1186 -0
- package/dist/lang/pt.cjs +1591 -0
- package/dist/lang/pt.js +1567 -0
- package/dist/lang/zh.cjs +57 -9
- package/dist/lang/zh.js +57 -9
- package/package.json +13 -2
- package/src/core/cadence.ts +25 -12
- package/src/lang/de/index.ts +2 -2
- package/src/lang/en/index.ts +2 -2
- package/src/lang/es/index.ts +2 -2
- package/src/lang/fi/index.ts +2 -2
- package/src/lang/fr/dialects.ts +49 -0
- package/src/lang/fr/index.ts +2115 -0
- package/src/lang/fr/notes.md +280 -0
- package/src/lang/fr/status.json +8 -0
- package/src/lang/pt/dialects.ts +56 -0
- package/src/lang/pt/index.ts +2803 -0
- package/src/lang/pt/notes.md +199 -0
- package/src/lang/pt/status.json +8 -0
- package/src/lang/zh/index.ts +60 -5
- package/src/lang/zh/notes.md +16 -4
- package/src/lang/zh/status.json +10 -1
- package/types/core/cadence.d.ts +1 -0
- package/types/lang/fr/dialects.d.ts +11 -0
- package/types/lang/fr/index.d.ts +4 -0
- package/types/lang/pt/dialects.d.ts +13 -0
- package/types/lang/pt/index.d.ts +4 -0
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,103 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.7.2]
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- **Docs refresh.** README + CONTRIBUTING updated for the seven languages (incl.
|
|
14
|
+
pt-BR, fr-FR, and the zh-Hant variant), the Node 20+ requirement, the Vitest
|
|
15
|
+
test runner, the `IR`→`Schedule` rename, and the sibling-derivation
|
|
16
|
+
add-language workflow (blind pipeline now the fallback). Regenerated the
|
|
17
|
+
language-status and cRonstrue comparison tables.
|
|
18
|
+
- **CI:** bumped `actions/checkout` and `actions/setup-node` to v5.
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- A duplicate `engines` key left `engines.node` effectively `>=18`; deduped to a
|
|
23
|
+
single `>=20`, so the Node requirement declared in 0.7.1 is actually in force.
|
|
24
|
+
|
|
25
|
+
## [0.7.1]
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
|
|
29
|
+
- **Require Node 20+** (`engines.node` `>=20`) and drop Node 18 from CI. Node 18
|
|
30
|
+
is EOL, and the dev/test toolchain (Vitest 4) requires Node 20.12+ (it imports
|
|
31
|
+
`node:util`'s `styleText`), which was failing the Node 18.x CI leg with a
|
|
32
|
+
startup `SyntaxError`. The published library's runtime is otherwise unchanged;
|
|
33
|
+
this just declares the supported Node range.
|
|
34
|
+
|
|
35
|
+
## [0.7.0]
|
|
36
|
+
|
|
37
|
+
### Added
|
|
38
|
+
|
|
39
|
+
- **French (fr-FR), beta.** A full French renderer via `{lang: fr}` — the
|
|
40
|
+
sibling-derivation workflow's stress test against the wider es→fr gap. 24h-only
|
|
41
|
+
("à 9 h 30", minuit/midi; `{ampm}` is a no-op), the per-value "le 1er" ordinal,
|
|
42
|
+
du/des/au/aux contractions, masculine gender agreement, "le lundi" recurrence,
|
|
43
|
+
"soit X soit Y" union, "ouvrable" for the W operator. Validated by a blind
|
|
44
|
+
3-persona fr-FR panel (0 misreads, all conventions ratified) and a clean
|
|
45
|
+
round-trip; ships **beta** pending fluent-human review (fr-CA is a future
|
|
46
|
+
dialect axis).
|
|
47
|
+
|
|
48
|
+
## [0.6.0]
|
|
49
|
+
|
|
50
|
+
### Added
|
|
51
|
+
|
|
52
|
+
- **Portuguese (pt-BR), beta.** A full Portuguese renderer via `{lang: pt}` — the
|
|
53
|
+
first language built with the new sibling-derivation workflow (derived from the
|
|
54
|
+
Spanish renderer). Natural pt-BR: preposition+article contractions
|
|
55
|
+
(do/da/no/na/à/às), gender agreement, "toda segunda-feira" recurrence, "dia 1º",
|
|
56
|
+
a 19h noite boundary. Validated by a blind 3-persona pt-BR panel and a clean
|
|
57
|
+
round-trip; ships **beta** pending fluent-human review (pt-PT is a future
|
|
58
|
+
dialect axis).
|
|
59
|
+
|
|
60
|
+
### Changed
|
|
61
|
+
|
|
62
|
+
- **Add-language workflow: sibling-derivation is now the primary path.** A new
|
|
63
|
+
language is derived from its nearest *validated* sibling — translate its
|
|
64
|
+
reviewed corpus into a target candidate, port its renderer, TDD to green — then
|
|
65
|
+
validated objectively (round-trip, fuzz, OR-scope, cRonstrue comparison) plus
|
|
66
|
+
native review. The blind pipeline (which produced verbose, inconsistent
|
|
67
|
+
renderers) is now the no-sibling fallback. See
|
|
68
|
+
[tooling/docs/language-pipeline.md](tooling/docs/language-pipeline.md).
|
|
69
|
+
- Coverage enumeration keys off `status.json` so an in-progress language build
|
|
70
|
+
stays green.
|
|
71
|
+
|
|
72
|
+
## [0.5.0]
|
|
73
|
+
|
|
74
|
+
### Added
|
|
75
|
+
|
|
76
|
+
- **Traditional Chinese (`zh-Hant`).** The Chinese renderer now produces
|
|
77
|
+
Traditional output via `cronli5(pattern, {lang: zh, dialect: 'zh-Hant'})` — a
|
|
78
|
+
faithful within-zh variant (時/鐘/點/週/個/數/單/雙/後/間 …), with Simplified
|
|
79
|
+
(`zh` / `zh-Hans`) output unchanged and identical round-trip meaning. Ships
|
|
80
|
+
**experimental** pending a Traditional-native review (two vocabulary choices
|
|
81
|
+
are flagged in the backlog).
|
|
82
|
+
|
|
83
|
+
## [0.4.0]
|
|
84
|
+
|
|
85
|
+
### Fixed
|
|
86
|
+
|
|
87
|
+
- **Core: a bounded hour step lost its bound when it folded.** A bounded hour
|
|
88
|
+
step with more fires than the clock-time enumeration cap (e.g. `23 0-20/2`,
|
|
89
|
+
hours 0,2,…,20) folded to the compact "every N hours" form, which carried no
|
|
90
|
+
bound — so it read as running all day, in every language. The fold now keeps
|
|
91
|
+
the range bound ("every two hours from midnight through 8 p.m."); open `*/n`
|
|
92
|
+
and full-day-equivalent steps stay unbounded. Surfaced by the new cRonstrue
|
|
93
|
+
round-trip. (en/es/de/fi/zh.)
|
|
94
|
+
|
|
95
|
+
### Added
|
|
96
|
+
|
|
97
|
+
- **cRonstrue comparison + migration guide (user support).** A generated,
|
|
98
|
+
CI-checked comparison (`docs/cronli5-vs-cronstrue.md`) grouping representative
|
|
99
|
+
patterns simple/medium/complex with cronli5 vs cRonstrue side by side, backed
|
|
100
|
+
by a blind reader panel (cronli5 preferred 81/108 — even on simple cadences,
|
|
101
|
+
decisive on medium/complex) and a round-trip correctness pass. A migration
|
|
102
|
+
guide (`docs/migrating-from-cronstrue.md`) with API, option, and locale
|
|
103
|
+
mappings and the behavior differences to expect. New tooling:
|
|
104
|
+
`tooling/scripts/cronstrue-divergence.mjs` (`npm run divergence`).
|
|
105
|
+
|
|
9
106
|
## [0.3.4]
|
|
10
107
|
|
|
11
108
|
### Fixed
|
package/README.md
CHANGED
|
@@ -51,6 +51,8 @@ differ and which to pick.
|
|
|
51
51
|
|
|
52
52
|
## Installation
|
|
53
53
|
|
|
54
|
+
Requires **Node.js 20 or newer**.
|
|
55
|
+
|
|
54
56
|
Install using npm:
|
|
55
57
|
```
|
|
56
58
|
# For a Node project:
|
|
@@ -103,15 +105,29 @@ As a command line tool:
|
|
|
103
105
|
$ cronli5 "*/5 * * * *"
|
|
104
106
|
Runs every five minutes.
|
|
105
107
|
|
|
106
|
-
# Other languages with --lang (de, es, fi, zh):
|
|
108
|
+
# Other languages with --lang (de, es, fi, fr, pt, zh):
|
|
107
109
|
$ cronli5 --lang de "0 0 * * *"
|
|
108
110
|
Läuft täglich um Mitternacht.
|
|
111
|
+
$ cronli5 --lang fr "0 0 * * *"
|
|
112
|
+
S'exécute tous les jours à minuit.
|
|
109
113
|
|
|
110
114
|
# --fragment prints the bare, embeddable fragment instead of a sentence:
|
|
111
115
|
$ cronli5 --fragment "*/5 * * * *"
|
|
112
116
|
every five minutes
|
|
113
117
|
```
|
|
114
118
|
|
|
119
|
+
Dialects and script variants — including Traditional Chinese (`zh-Hant`) — are
|
|
120
|
+
selected through the library's [`dialect`](#options) option rather than the CLI;
|
|
121
|
+
the CLI exposes only `--lang` and `--fragment`.
|
|
122
|
+
|
|
123
|
+
```js
|
|
124
|
+
import cronli5 from 'cronli5';
|
|
125
|
+
import zh from 'cronli5/lang/zh';
|
|
126
|
+
|
|
127
|
+
cronli5('0 0 * * *', {lang: zh}); // '每天凌晨0点' (Simplified, default)
|
|
128
|
+
cronli5('0 0 * * *', {lang: zh, dialect: 'zh-Hant'}); // '每天凌晨0點' (Traditional)
|
|
129
|
+
```
|
|
130
|
+
|
|
115
131
|
## Input Formats
|
|
116
132
|
|
|
117
133
|
`cronli5` accepts classic (five-part) cron patterns, extended (six-part) cron
|
|
@@ -202,12 +218,19 @@ docs below.
|
|
|
202
218
|
| German | `cronli5/lang/de` | Duden (`de-AT`/`de-CH` dialects) | [docs/lang/de.md](./docs/lang/de.md) |
|
|
203
219
|
| Spanish | `cronli5/lang/es` | RAE / FundéuRAE | [docs/lang/es.md](./docs/lang/es.md) |
|
|
204
220
|
| Finnish | `cronli5/lang/fi` | Kielitoimiston ohjepankki; SFS 4175 | [docs/lang/fi.md](./docs/lang/fi.md) |
|
|
221
|
+
| French | `cronli5/lang/fr` | Imprimerie nationale / Académie française (fr-FR; fr-CA is a future axis) | [docs/lang/fr.md](./docs/lang/fr.md) |
|
|
222
|
+
| Portuguese | `cronli5/lang/pt` | VOLP / Academia Brasileira de Letras (pt-BR; pt-PT is a future axis) | [docs/lang/pt.md](./docs/lang/pt.md) |
|
|
205
223
|
| Chinese (Mandarin) | `cronli5/lang/zh` | Simplified (`zh-Hans`) default; Traditional (`zh-Hant`) | [docs/lang/zh.md](./docs/lang/zh.md) |
|
|
206
224
|
|
|
207
225
|
### Language maturity
|
|
208
226
|
|
|
209
227
|
Languages ship as **experimental** → **beta** → **stable** (model-drafted →
|
|
210
|
-
model-validated
|
|
228
|
+
model-validated → verified by a fluent human). A new language is usually built
|
|
229
|
+
by **sibling-derivation** — deriving it from its nearest validated relative
|
|
230
|
+
(porting that renderer and translating its reviewed corpus, then TDD to green) —
|
|
231
|
+
and reaches **beta** once it passes the objective gates (round-trip, fuzz,
|
|
232
|
+
OR-scope, the cRonstrue comparison) and a blind persona-panel review. It
|
|
233
|
+
graduates to **stable** only on fluent-human review:
|
|
211
234
|
|
|
212
235
|
<!-- BEGIN GENERATED: language-status -->
|
|
213
236
|
| Language | Status |
|
|
@@ -216,7 +239,10 @@ model-validated by a blind persona panel → verified by a fluent human):
|
|
|
216
239
|
| English | stable |
|
|
217
240
|
| Spanish | beta |
|
|
218
241
|
| Finnish | beta |
|
|
242
|
+
| French | beta |
|
|
243
|
+
| Portuguese | beta |
|
|
219
244
|
| Chinese (Mandarin, Simplified) | beta |
|
|
245
|
+
| Chinese (Mandarin, Simplified) (`zh-Hant`) | experimental |
|
|
220
246
|
<!-- END GENERATED: language-status -->
|
|
221
247
|
|
|
222
248
|
For the review evidence behind each status, see
|
|
@@ -272,7 +298,7 @@ cronli5('0 0 15W * *'); // 'on the weekday nearest the 15th at midnight'
|
|
|
272
298
|
[`cRonstrue`][cronstrue] is the most widely used cron-description library, but
|
|
273
299
|
it differs from `cronli5` in philosophy. `cronli5` writes one flowing sentence
|
|
274
300
|
and does additional validation; its languages are full renderers
|
|
275
|
-
([
|
|
301
|
+
([seven so far](#languages)). cRonstrue assembles per-field fragments from
|
|
276
302
|
translated templates, which is how it covers 39 locales. The same compound
|
|
277
303
|
pattern — `5,10 30 9 * * MON` — in every language:
|
|
278
304
|
|
|
@@ -283,10 +309,16 @@ pattern — `5,10 30 9 * * MON` — in every language:
|
|
|
283
309
|
| German | in den Sekunden 5 und 10, um 9:30 Uhr montags | Bei Sekunde 5 und 10, bei Minute 30, um 09:00, nur jeden Montag |
|
|
284
310
|
| Spanish | los lunes, en los segundos 5 y 10 de las 09:30 | A los 5 y 10 segundos del minuto, a los 30 minutos de la hora, a las 09:00, sólo el lunes |
|
|
285
311
|
| Finnish | 5 ja 10 sekunnin kohdalla, maanantaisin klo 9.30 | 5 ja 10 sekunnnin jälkeen, 30 minuuttia yli, klo 09:00, vain maanantai |
|
|
312
|
+
| French | le lundi, aux secondes 5 et 10 de 9 h 30 | 5 et 10 secondes après la minute, 30 minutes après l'heure, 09:00, uniquement le lundi |
|
|
313
|
+
| Portuguese | às segundas-feiras, nos segundos 5 e 10 das 09:30 | Aos 5 e 10 segundos do minuto, aos 30 minutos da hora, Às 09:00, somente de segunda-feira |
|
|
314
|
+
| Chinese (Simplified) | 每周一,9点30分第5、10秒 | 在一分钟后的第 5 和 10 秒, 在整点后的第 30 分钟, 在上午 09:00, 仅星期一 |
|
|
315
|
+
| Chinese (Traditional) | 每週一,9點30分第5、10秒 | 在一分鐘後的 5 和 10 秒, 在整點後的 30 分, 在 09:00, 僅在 星期一 |
|
|
286
316
|
<!-- END GENERATED: cronstrue-head-to-head -->
|
|
287
317
|
|
|
288
318
|
See [docs/cronli5-vs-cronstrue.md](./docs/cronli5-vs-cronstrue.md) for
|
|
289
|
-
more generated side-by-side output tables
|
|
319
|
+
more generated side-by-side output tables, and
|
|
320
|
+
[docs/migrating-from-cronstrue.md](./docs/migrating-from-cronstrue.md) if you
|
|
321
|
+
are switching from cRonstrue.
|
|
290
322
|
|
|
291
323
|
## Description Accuracy
|
|
292
324
|
|
|
@@ -330,8 +362,9 @@ required.
|
|
|
330
362
|
|
|
331
363
|
## Development
|
|
332
364
|
|
|
333
|
-
The library has no runtime dependencies.
|
|
334
|
-
|
|
365
|
+
The library has no runtime dependencies. Development requires **Node.js 20 or
|
|
366
|
+
newer** (the Vitest 4 test runner needs it); the toolchain (ESLint, Vitest,
|
|
367
|
+
Chai, esbuild) lives in `devDependencies`.
|
|
335
368
|
|
|
336
369
|
```bash
|
|
337
370
|
npm install # install dev dependencies (also wires the git hooks)
|
package/cronli5.min.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
"use strict";(()=>{var Or={SUN:0,MON:1,TUE:2,WED:3,THU:4,FRI:5,SAT:6},Nr={JAN:1,FEB:2,MAR:3,APR:4,MAY:5,JUN:6,JUL:7,AUG:8,SEP:9,OCT:10,NOV:11,DEC:12},k={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:Nr,top:12},weekday:{aliases:{"?":"*",L:"6"},cyclic:!0,max:7,min:0,numbers:Or,top:6},year:{max:9999,min:1970}},M=["second","minute","hour","date","month","weekday","year"],tn={"@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 * * * *"},A=6;function l(n,r){return(""+n).indexOf(r)!==-1}function Y(n){return Array.from(new Set(n))}function G(n){return/^\d+$/.test(n)}function d(n,r){return G(n)?+n:r[n.toUpperCase()]}function Tn(n){return M.forEach(function(e){zr(n[e],k[e],e)}),n}function zr(n,r,e){typeof n!="string"&&typeof n!="number"&&Mn(n,e);let t=""+n;t!=="*"&&(e==="date"&&U(t)||e==="weekday"&&q(t,r)||t.split(",").forEach(function(o){vr(o,r)||Mn(o,e)}))}function U(n){if(n==="L"||n==="LW"||n==="WL")return!0;let r=/^L-(\d{1,2})$/.exec(n);if(r)return+r[1]>=1&&+r[1]<=30;let e=/^(\d{1,2})W$|^W(\d{1,2})$/.exec(n);if(e){let t=+(e[1]||e[2]);return t>=1&&t<=31}return!1}function q(n,r){if(/L$/.test(n))return L(n.slice(0,-1),r);let e=n.split("#");return e.length===2?L(e[0],r)&&/^[1-5]$/.test(e[1]):!1}function vr(n,r){return l(n,"/")?wr(n,r):l(n,"-")?Wn(n,r):L(n,r)}function wr(n,r){let e=n.split("/");return e.length!==2||!G(e[1])||+e[1]<1?!1:e[0]==="*"||L(e[0],r)||Wn(e[0],r,!0)}function Wn(n,r,e){let t=n.split("-");return t.length!==2||!L(t[0],r)||!L(t[1],r)?!1:r.cyclic&&!e?!0:d(t[0],r.numbers)<=d(t[1],r.numbers)}function L(n,r){return n==="*"?!1:G(n)?+n>=r.min&&+n<=r.max:r.numbers?n.toUpperCase()in r.numbers:!1}function Mn(n,r){throw new Error('`cronli5` was passed an invalid field value "'+n+'" for the '+r+" field.")}var Pr={hour:24,minute:60,second:60};function Ln(n){M.forEach(function(e){let t=k[e].aliases,i=t&&t[""+n[e]];i&&(n[e]=i)})}function En(n){return M.forEach(function(e){let t=""+n[e];if(e==="date"&&U(t)||e==="weekday"&&q(t,k[e])){n[e]=t;return}n[e]=Cr(t,e,k[e])}),n}function Cr(n,r,e){let t=""+n;if(t==="*")return t;let i=Pr[r],o=t.split(",").map(function(s){return xr(Dn(Wr(Hr(Lr(Tr(Mr(s,e),e),e),e),e,i),e),e)}).join(",").split(",");return o.indexOf("*")!==-1?"*":Y(o).sort(function(s,m){return Hn(s,e)-Hn(m,e)}).join(",")}function xr(n,r){if(!r.numbers)return n;let e=n.split("/"),t=e[0].split("-").map(function(o){return Fr(o,r)}).join("-");return e.length===2?t+"/"+e[1]:t}function Fr(n,r){if(n==="*")return n;let e=d(n,r.numbers);return""+(e>r.top?r.min:e)}function Mr(n,r){let e=n.split("/");if(!r.cyclic||e.length!==2||+e[1]!=1)return n;let t=e[0];return l(t,"-")?t:t==="*"||d(t,r.numbers)===r.min?"*":t+"-"+r.top}function Tr(n,r){let e=n.split("/");if(!r.cyclic||typeof r.top!="number"||e.length!==2||l(e[0],"-"))return n;let t=e[0];return(t==="*"?r.min:d(t,r.numbers))+ +e[1]<=r.top?n:t==="*"?""+r.min:t}function Wr(n,r,e){let t=n.split("/");if(typeof e!="number"||t.length!==2||l(t[0],"-"))return n;let i=+t[1],o=t[0]==="*"?r.min:d(t[0]);if(e%i===0&&o<i)return n;let u=[];for(let s=o;s<=r.top;s+=i)u.push(s);return u.join(",")}function Hr(n,r){let e=n.split("/");return e.length!==2||!l(e[0],"-")?n:Dn(e[0],r)==="*"?"*/"+e[1]:n}function Dn(n,r){if(typeof r.top!="number"||l(n,"/")||!l(n,"-"))return n;let e=n.split("-"),t=d(e[0],r.numbers),i=d(e[1],r.numbers);if(t>i)return n;let o=r.top,u={};for(let s=t;s<=i;s+=1)u[s>o?r.min:s]=!0;for(let s=r.min;s<=o;s+=1)if(!u[s])return n;return"*"}function Lr(n,r){let e=n.split("/")[0];if(!l(e,"-"))return n;let t=e.split("-");return d(t[0],r.numbers)!==d(t[1],r.numbers)?n:t[0]}function Hn(n,r){let e=n.split("/")[0].split("-")[0];return e==="*"?r.min:d(e,r.numbers)}function jn(n,r){let e=n instanceof Array;if(n===null||typeof n>"u"||n===""||e&&n.length===0)throw new Error("`cronli5` expects a non-empty cron pattern as the first argument.");if(e)return Rn(n,r);if(typeof n=="object")return Er(n);if(typeof n=="string")return Dr(n,r);throw new Error("`cronli5` was passed an unexpected type.")}function Rn(n,r){if(n.length>7)throw new Error("`cronli5` was passed a cron pattern with more than seven fields.");return!r.seconds&&n.length<(r.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 Er(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 r=typeof n.second<"u",e=typeof n.minute<"u",t=r?"*":"0",i=r||e?"*":"0";return{second:T(n.second,"0"),minute:T(n.minute,t),hour:T(n.hour,i),date:T(n.date,"*"),month:T(n.month,"*"),weekday:T(n.weekday,"*"),year:T(n.year,"*")}}function T(n,r){return typeof n>"u"?r:n}function Dr(n,r){let e=jr(n).split(/\s+/);return Rn(e,r)}function jr(n){let r=n.trim();if(r.charAt(0)!=="@")return n;let e=r.toLowerCase();if(Object.hasOwn(tn,e))return tn[e];throw new Error("`cronli5` does not recognize the macro `"+r+"`.")}function An(n){return n===0?7:n}function Un(n){let r=n.flatMap(function(i){return i.kind==="step"?i.fires.map(function(u){return{kind:"single",value:""+u}}):[i]});function e(t){return t.kind==="range"?An(+t.bounds[0]):An(+t.value)}return r.map(function(i,o){return[i,o]}).sort(function(i,o){return e(i[0])-e(o[0])||i[1]-o[1]}).map(function(i){return i[0]})}function on(n){if(n.length<5)return null;let r=n[1]-n[0];if(r<2)return null;for(let e=2;e<n.length;e+=1)if(n[e]-n[e-1]!==r)return null;return{start:n[0],interval:r,last:n[n.length-1]}}function c(n,r){return n.analyses.segments[r]??[]}function O(n,r){return c(n,r)[0]}function Z(n){let r=[];for(let e of n){if(e.kind!=="single")return null;r.push(+e.value)}return r}function un(n){return n.start<n.interval&&24%n.interval===0}function sn(n,r){let{start:e,interval:t,cycle:i}=n,o=i%t===0;return e===0&&o?r.bare():e<t&&o?r.offset():r.bounded()}function qn(n){if(n.length<2)return null;let r=n[1]-n[0];if(r<2)return null;for(let e=2;e<n.length;e+=1)if(n[e]-n[e-1]!==r)return null;return n[0]!==0&&n.length<5?null:{interval:r,last:n[n.length-1],start:n[0]}}function Qn(n){return n!=="*"&&!l(n,",")&&!l(n,"-")&&!l(n,"/")}function an(n){return l(n,"-")&&!l(n,",")&&!l(n,"/")}function Rr(n){return l(n,"/")&&!l(n,",")}function cn(n){return n!=="*"&&!l(n,"-")&&!l(n,"/")}function ln(n){return n!=="*"&&!an(n)&&!Rr(n)}function E(n){return n.indexOf("/")!==-1&&n.indexOf("-")===-1&&n.indexOf(",")===-1}function Q(n,r,e){let t=[],i=n;for(;i<=e;)t.push(i),i+=r;return t}function Vn(n,r,e,t){let i=n.split("/"),o=+i[1];if(l(i[0],"-")){let s=i[0].split("-");return Q(d(s[0],t),o,d(s[1],t))}let u=i[0]==="*"?r:d(i[0],t);return Q(u,o,e)}function mn(n,r,e){let t=[];return n.split(",").forEach(function(o){if(l(o,"/"))t.push(...Vn(o,r,e));else if(l(o,"-")){let u=o.split("-");+u[0]<=+u[1]?t.push(...Q(+u[0],1,+u[1])):(t.push(...Q(+u[0],1,e)),t.push(...Q(r,1,+u[1])))}else t.push(+o)}),Y(t)}function Ar(n){return cn(n)?n.split(",").map(Number):[0]}function Ur(n){if(n==="*")return[0,59];if(an(n)){let r=n.split("-");if(+r[0]<=+r[1])return[+r[0],+r[1]]}return null}function qr(n){return n==="*"?59:Math.max(...mn(n,0,59))}function Qr(n){if(Qn(n)&&n!=="0")return+n}function Vr(n,r){return n==="*"?"wildcard":r==="date"&&U(n)||r==="weekday"&&q(n,k.weekday)?"quartz":l(n,",")?"list":l(n,"/")?"step":l(n,"-")?"range":"single"}function Ir(n,r,e){return r==="wildcard"||r==="quartz"?null:n.split(",").map(function(i){if(l(i,"/")){let o=i.split("/");return{fires:Vn(i,e.min,e.top,e.numbers),interval:+o[1],kind:"step",startToken:o[0]}}return l(i,"-")?{bounds:i.split("-"),kind:"range"}:{kind:"single",value:i}})}function In(n){let r={},e={};M.forEach(function(u){r[u]=Vr(n[u],u),e[u]=Ir(n[u],r[u],k[u])});let i={analyses:{clockSecond:Qr(n.second),lastMinuteFire:qr(n.minute),minuteSpan:Ur(n.minute),segments:e},pattern:n,shapes:r};return{...i,plan:$r(i)}}function $r(n){let{analyses:r,pattern:e,shapes:t}=n;if(e.second!=="0"){let i=Jr(e,t,r);if(i)return i}return $n(e,t,r)||Jn(e,t,r)}function Jr(n,r,e){let t=Kr(n,r);return t||(n.hour==="*"&&r.minute==="single"&&n.second!=="*"?{kind:"secondsWithinMinute",singleSecond:r.second==="single"}:r.second==="single"&&cn(n.minute)&&ln(n.hour)?null:{kind:"composeSeconds",rest:$n(n,r,e,!0)||Jn(n,r,e,!0)})}function Kr(n,r){return n.minute!=="*"||n.hour!=="*"?null:n.second==="*"?{kind:"everySecond"}:r.second==="single"?{kind:"secondPastMinute"}:{kind:"standaloneSeconds"}}function $n(n,r,e,t=!1){if(r.minute==="step")return{hours:Gr(n,r,e),kind:"minuteFrequency"};if(r.hour==="single"&&e.minuteSpan)return{hour:+n.hour,kind:"minuteSpanInHour",span:e.minuteSpan};let i=Zr(n,r);if(i)return i;let o=Yr(n,r);if(o)return o;if(n.hour==="*")return Br(n,r,t)}function fn(n){let[r,e]=n.split("/"),t=r==="*"?0:+r;return r.indexOf("-")===-1&&24%+e===0&&t<+e}function Yr(n,r){return r.hour!=="step"?null:n.minute==="*"?fn(n.hour)?{form:"wildcard",kind:"minuteSpanAcrossHourStep"}:{form:"wildcard",kind:"minutesAcrossHours",times:V(n.hour)}:r.minute==="range"?{form:"range",kind:"minuteSpanAcrossHourStep"}:r.minute==="list"&&fn(n.hour)?{form:"list",kind:"minuteSpanAcrossHourStep"}:null}function Gr(n,r,e){if(r.hour==="list")return{kind:"during",times:V(n.hour)};if(r.hour==="range"){let t=n.hour.split("-");return{from:+t[0],kind:"window",last:e.lastMinuteFire,to:+t[1]}}return r.hour==="single"?{from:+n.hour,kind:"window",last:e.lastMinuteFire,to:+n.hour}:r.hour==="step"?fn(n.hour)?{kind:"step"}:{kind:"during",times:V(n.hour)}:{kind:"none"}}function Zr(n,r){return ln(n.hour)?n.minute==="*"?{form:"wildcard",kind:"minutesAcrossHours",times:V(n.hour)}:r.minute==="range"||r.minute==="list"&&l(n.minute,"-")&&!l(n.minute,"/")?{form:r.minute==="range"?"range":"list",kind:"minutesAcrossHours",times:V(n.hour)}:null:null}function Br(n,r,e){if(r.minute==="range")return{kind:"rangeOfMinutes"};if(r.minute==="list")return{kind:"multipleMinutes"};if(n.minute==="*")return{kind:"everyMinute"};if(n.minute!=="0"||e)return{kind:"singleMinute"}}function Jn(n,r,e,t=!1){let i=t&&n.minute==="0";return r.hour==="range"&&!i?Xr(n,r,e):r.hour==="step"&&n.minute==="0"&&!t?{kind:"hourStep"}:n.hour==="*"&&!i?{kind:"everyHour"}:_r(n,e,i)}function Xr(n,r,e){let t=n.hour.split("-"),i="lead";return n.minute==="*"?i="wildcard":r.minute==="range"&&(i="range"),{boundMinute:r.minute==="range"||r.minute==="list"?null:e.lastMinuteFire,from:+t[0],kind:"hourRange",last:e.lastMinuteFire,minuteForm:i,to:+t[1]}}function _r(n,r,e=!1){let t=mn(n.hour,0,23),i=Ar(n.minute);if(!e&&t.length*i.length>A)return{fold:i.length===1,kind:"compactClockTimes",minute:i[0]};let o=[];return t.forEach(function(s){i.forEach(function(S){o.push({hour:s,minute:S,second:r.clockSecond})})}),{kind:"clockTimes",times:o}}function V(n){let r=mn(n,0,23);return r.length<=A?{fires:r,kind:"fires"}:{kind:"segments"}}function Kn(n,r){let e=jn(n,r);return Ln(e),Tn(e),En(e)}function w(n){return n=""+n,n.length<2?"0"+n:n}function Yn(n,r,e){return e.short?n:r[n]||n}function dn(n,{sep:r,pad:e,lean:t}){let i=e?w(n.hour):""+n.hour;return t&&!n.minute&&!n.second?i:i+r+w(n.minute)+(n.second?r+w(n.second):"")}var gn={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 ",untilWindow:!0},house:{am:"AM",closeUp:!1,dayFirst:!1,midday:"noon",midnight:"midnight",ordinals:!0,pm:"PM",sep:":",serialComma:!0,through:" - "}};function Gn(n){return typeof n=="object"&&n!==null?{...gn.us,untilWindow:!1,...n}:gn[n==="uk"?"gb":n]||gn.us}var ne=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],hn=["th","st","nd","rd"],re=[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"]],P=[["Sunday","Sun"],["Monday","Mon"],["Tuesday","Tue"],["Wednesday","Wed"],["Thursday","Thu"],["Friday","Fri"],["Saturday","Sat"]],ee={SUN:P[0],MON:P[1],TUE:P[2],WED:P[3],THU:P[4],FRI:P[5],SAT:P[6]},te=[null,"first","second","third","fourth","fifth"];function ie(n){return n=n||{},{ampm:typeof n.ampm=="boolean"?n.ampm:!0,lenient:!!n.lenient,seconds:!!n.seconds,short:!!n.short,style:Gn(n.dialect),years:!!n.years}}function oe(n,r){let e=ce(n,r);if(e!==null)return Bn(e,n,r);let t=qe(n,r)??Xn(n,n.plan,r),i=K(n,r)?_e(n,r):"";return Bn(i+t,n,r)}function Xn(n,r,e){let t=Qe[r.kind];return t(n,r,e)}function pn(n){return n==="step"||n==="range"||n==="list"}function ue(n,r){if(!r.style.untilWindow||r.short||n.plan.kind!=="composeSeconds"||n.plan.rest.kind==="clockTimes"||K(n,r))return!1;let{shapes:e}=n;return pn(e.second)&&pn(e.minute)&&pn(e.hour)}function se(n,r){let e=On(n);if(e)return B(e,r);if(n.shapes.hour==="range"){let t=c(n,"hour").find(function(o){return o.kind==="range"});return R({continuous:!1,from:+t.bounds[0],throughMinute:0,to:+t.bounds[1]},r)}return"during the "+j(n,{minute:0,second:null},!1,r)+" hours"}function ae(n,r){return n.shapes.minute==="step"?X(O(n,"minute"),"minute","hour",r):n.shapes.minute==="range"?$(n.pattern.minute,r):H(c(n,"minute"),"minute","hour",r)??z(F(c(n,"minute"),r),"minute","hour",r)}function ce(n,r){if(!ue(n,r))return null;let e=se(n,r),t=ae(n,r),i=x(n,"minute",r),o=e+", "+t+", and within each of those minutes, "+i,u=a(n,r).trim();return u?u+", "+o:o}function le(n,r,e){return"every second"+a(n,e)}function fe(n,r,e){return D(n,e)+a(n,e)}function me(n,r,e){let t=n.pattern.second;return g(t,e)+" "+v(t,"second")+" past the minute, every minute"+a(n,e)}function de(n,r,e){let t=n.pattern.minute,i=g(t,e),o=v(t,"minute");if(r.singleSecond){let u=n.pattern.second;return i+" "+o+" and "+g(u,e)+" "+v(u,"second")+" past the hour, every hour"+a(n,e)}return D(n,e)+", "+i+" "+o+" past the hour, every hour"+a(n,e)}function ge(n,r,e){if(!(r.rest.kind==="clockTimes"||r.rest.kind==="compactClockTimes")||n.shapes.minute!=="single")return null;let i=+n.pattern.minute;return zn(n,i,e)??vn(n,i,e)}function he(n,r,e){return+r.times[0].minute==0&&n.shapes.minute==="single"?D(n,e)+" for one minute at "+ye(n,r,e):D(n,e)+" of "+be(n,r,e)}function pe(n,r,e){let t=ge(n,r,e);return t!==null?t:r.rest.kind==="clockTimes"&&(n.shapes.second==="wildcard"||n.shapes.second==="step")?he(n,r.rest,e):n.shapes.second==="wildcard"&&r.rest.kind==="minuteFrequency"&&r.rest.hours.kind==="none"&&n.pattern.minute==="*/2"?"every second of every other minute"+a(n,e):(r.rest.kind==="compactClockTimes"&&n.analyses.clockSecond?"":D(n,e)+", ")+Xn(n,r.rest,e)}function ye(n,r,e){let t=r.times.map(function(u){return f({hour:u.hour,minute:0},e)}),i=_(n,Cn,e);return p(t,e)+(i&&", "+i)}function be(n,r,e){let t=r.times.map(function(u){return f({hour:u.hour,minute:u.minute,second:u.second,explicit:!0},e)}),i=_(n,Cn,e);return p(t,e)+(i&&", "+i)}function D(n,r){return x(n,"minute",r)}function x(n,r,e){let t=n.pattern.second,i=n.shapes.second;if(t==="*")return"every second";if(i==="step")return X(O(n,"second"),"second",r,e);if(i==="range"){let o=t.split("-"),u=wn();return"every second from "+u(o[0])+h(e)+u(o[1])+" past the "+r}return i==="single"?"at "+g(t,e)+" "+v(t,"second")+" past the "+r:H(c(n,"second"),"second",r,e)??z(F(c(n,"second"),e),"second",r,e)}function Se(n,r,e){return"every minute"+a(n,e)}function ke(n,r,e){let t=n.pattern.minute;return g(t,e)+" "+v(t,"minute")+" past the hour, every hour"+a(n,e)}function Oe(n,r,e){return $(n.pattern.minute,e)+a(n,e)}function Ne(n,r,e){return(H(c(n,"minute"),"minute","hour",e)??z(F(c(n,"minute"),e),"minute","hour",e))+a(n,e)}function ze(n,r,e){let t=X(O(n,"minute"),"minute","hour",e);if(r.hours.kind==="during"){let i=J(n,e);t+=i?", "+i:" during the "+I(n,r.hours.times,!1,e)+" hours"}else r.hours.kind==="window"?t+=" "+R({continuous:!1,from:r.hours.from,throughMinute:r.hours.last,to:r.hours.to},e):r.hours.kind==="step"&&(t+=" "+kn(O(n,"hour"),e));return t+a(n,e)}function ve(n,r,e){return n.pattern.minute==="*"?"every minute of the "+f({hour:r.hour,minute:0},e)+" hour"+a(n,e):"every minute from "+f({hour:r.hour,minute:r.span[0]},e)+h(e)+f({hour:r.hour,minute:r.span[1]},e)+a(n,e)}function we(n,r,e){let t=J(n,e);if(r.form==="wildcard")return t!==null?"every minute, "+t+a(n,e):"every minute during the "+I(n,r.times,!1,e)+" hours"+a(n,e);if(r.form==="range"){let u=$(n.pattern.minute,e);return t!==null?u+", "+t+a(n,e):Ke(r.times)?u+", at "+I(n,r.times,!0,e)+a(n,e):u+" during the "+I(n,r.times,!1,e)+" hours"+a(n,e)}let i=H(c(n,"minute"),"minute","hour",e)??z(F(c(n,"minute"),e),"minute","hour",e);if(t!==null)return i+", "+t+a(n,e);let o=I(n,r.times,!0,e);return i+", at "+o+a(n,e)}var _n={2:"other",3:"third",4:"fourth",6:"sixth",8:"eighth",12:"twelfth"};function kn(n,r){let e="during every "+_n[n.interval]+" hour",t=n.startToken==="*"?0:+n.startToken;return t===0?e:e+" starting at "+f({hour:t,minute:0},r)}function Pe(n,r,e){let t=O(n,"hour");if(r.form==="wildcard")return"every minute "+kn(t,e)+a(n,e);let i=r.form==="list"?H(c(n,"minute"),"minute","hour",e)??z(F(c(n,"minute"),e),"minute","hour",e):$(n.pattern.minute,e),o=J(n,e);return i+", "+(o??or(t,e))+a(n,e)}function $(n,r){let e=n.split("-"),t=wn();return"every minute from "+t(e[0])+h(r)+t(e[1])+" past the hour"}function Ce(n,r,e){return"every hour"+a(n,e)}function xe(n,r,e){let t=Te(Me(r),e);return r.minuteForm==="wildcard"?"every minute "+t+a(n,e):r.minuteForm==="range"?$(n.pattern.minute,e)+", "+t+a(n,e):nr(n,e)+" "+t+a(n,e)}function nr(n,r){return n.pattern.minute==="0"?"every hour":H(c(n,"minute"),"minute","hour",r)??z(F(c(n,"minute"),r),"minute","hour",r)}function Fe(n,r,e){let t=J(n,e);return t!==null?t+a(n,e):or(O(n,"hour"),e)+a(n,e)}function Me(n){let r=n.minuteForm==="wildcard",e=r?n.boundMinute??0:0;return{from:n.from,closeMinute:e,to:n.to,continuous:r}}function R(n,r){let{from:e,to:t,throughMinute:i,continuous:o}=n,u="from "+f({hour:e,minute:0},r);return r.style.untilWindow&&!r.short&&e!==t?o?u+" until "+f({hour:(t+1)%24,minute:0},r):u+h(r)+f({hour:t,minute:0},r):u+h(r)+f({hour:t,minute:i},r)}function Te(n,r){return R({continuous:n.continuous,from:n.from,throughMinute:n.closeMinute,to:n.to},r)}function We(n,r,e){if(n.shapes.minute==="single"){let o=+n.pattern.minute,u=zn(n,o,e)??vn(n,o,e);if(u!==null)return u}let t=Pn(r.times),i=r.times.map(function(u){return f({hour:u.hour,minute:u.minute,second:u.second,plain:t},e)});return cr(n,e)+"at "+p(i,e)+rr(n,e)}function rr(n,r){return K(n,r)?fr(n,r):""}function He(n,r,e){if(r.fold){let u=zn(n,+r.minute,e)??vn(n,+r.minute,e);if(u!==null)return u;if(c(n,"hour").some(function(y){return y.kind==="range"})&&!n.analyses.clockSecond)return Le(n,r,e)+a(n,e);let m={minute:r.minute,second:n.analyses.clockSecond};return cr(n,e)+"at "+j(n,m,!0,e)+rr(n,e)}let t=H(c(n,"minute"),"minute","hour",e)??z(F(c(n,"minute"),e),"minute","hour",e),i=J(n,e),o=i?t+", "+i+a(n,e):t+", at "+j(n,{minute:0,second:null},!0,e)+a(n,e);return n.analyses.clockSecond?D(n,e)+", "+o:o}function Le(n,r,e){let t=r.minute,i=[],o=er(n).map(function(m){return f({hour:m,minute:t},e)});return c(n,"hour").forEach(function(m){m.kind==="range"&&i.push(R({continuous:!1,from:+m.bounds[0],throughMinute:t,to:+m.bounds[1]},e))}),nr(n,e)+" "+p(i,e)+tr(o,e)}function er(n){let r=[];return c(n,"hour").forEach(function(t){t.kind==="step"?r.push(...t.fires):t.kind!=="range"&&r.push(+t.value)}),r}function tr(n,r){return n.length?" and at "+p(n,r):""}function W(n){return n==="*"||n.startsWith("*/")&&n.indexOf("-")===-1}function Ee(n,r){let{second:e,minute:t}=n.pattern;return W(e)?{secondLead:!0,text:x(n,"minute",r)}:e==="0"&&W(t)?{secondLead:!1,text:t==="*"?"every minute":X(O(n,"minute"),"minute","hour",r)}:null}function De(n,r){let e=n.pattern.minute;if(e==="*")return"";if(W(e))return" of every other minute";let t=c(n,"minute");if(n.shapes.minute==="single")return" during minute :"+w(e);if(n.shapes.minute==="range"){let o=e.split("-");return" during minutes :"+w(o[0])+h(r)+":"+w(o[1])}let i=F(t,r).map(function(u){return":"+w(u)});return" during minutes "+p(i,r)}function je(n,r){let e=n.pattern.hour;if(e==="*")return n.pattern.minute!=="*"&&!W(n.pattern.minute)?" of every hour":"";if(W(e))return e==="*/2"?" of every other hour":"";if(n.shapes.hour==="single"){let t=+e;return n.shapes.minute==="step"?" from "+f({hour:t,minute:0},r)+" until "+f({hour:(t+1)%24,minute:0},r):n.pattern.minute!=="*"&&!W(n.pattern.minute)?" at "+f({hour:t,minute:0},r):" of the "+f({hour:t,minute:0},r)+" hour"}if(n.shapes.hour==="range"){let t=e.split("-");return" "+R({continuous:n.pattern.minute==="*",from:+t[0],throughMinute:0,to:+t[1]},r)}return" during the "+j(n,{minute:0,second:null},!1,r)+" hours"}function Re(n){if(n.shapes.hour!=="step")return!0;let r=O(n,"hour");return n.pattern.hour==="*/2"||r.startToken.indexOf("-")!==-1}function Ae(n){if(n.shapes.minute!=="list")return!1;let r=Z(c(n,"minute"));return r!==null&&on(r)!==null}function Ue(n,r){let{minute:e,hour:t}=n.pattern,i=W(e)&&e!=="*";return Re(n)?r.secondLead?i?e==="*/2"&&n.shapes.hour!=="range":!(Ae(n)||n.shapes.minute==="list"&&n.shapes.hour==="list"):t==="*/2"?!0:n.shapes.hour==="single"&&e==="*/2":!1}function qe(n,r){if(!r.style.untilWindow||r.short||n.pattern.minute==="*"&&n.pattern.hour==="*")return null;let e=Ee(n,r);if(!e||!Ue(n,e))return null;let t=e.secondLead?De(n,r):"";return e.text+t+je(n,r)+a(n,r)}var Qe={clockTimes:We,compactClockTimes:He,composeSeconds:pe,everyHour:Ce,everyMinute:Se,everySecond:le,hourRange:xe,hourStep:Fe,minuteFrequency:ze,minuteSpanAcrossHourStep:Pe,minuteSpanInHour:ve,minutesAcrossHours:we,multipleMinutes:Ne,rangeOfMinutes:Oe,secondPastMinute:me,secondsWithinMinute:de,singleMinute:ke,standaloneSeconds:fe};function ir(n,r){let{interval:e,start:t,last:i,cycle:o,unit:u,anchor:s}=n,m="every "+g(e,r)+" "+u+"s";return sn({start:t,interval:e,cycle:o},{bare:()=>m,offset:()=>m+" from "+g(t,r)+" "+v(t,u)+" past the "+s,bounded:()=>{let S=wn();return m+" from "+S(t)+h(r)+S(i)+" "+v(i,u)+" past the "+s}})}function H(n,r,e,t){let i=Z(n),o=i&&on(i);return o?ir({...o,cycle:60,unit:r,anchor:e},t):null}function X(n,r,e,t){if(n.startToken.indexOf("-")!==-1)return z(Zn(n.fires,t),r,e,t);let i=n.startToken==="*"?0:+n.startToken;return i!==0&&n.fires.length<=3?z(Zn(n.fires,t),r,e,t):ir({interval:n.interval,start:i,last:n.fires[n.fires.length-1],cycle:60,unit:r,anchor:e},t)}function or(n,r){if(n.startToken.indexOf("-")!==-1)return"at "+yn(n.fires,r);let e=n.startToken==="*"?0:+n.startToken,t=n.interval;return e===0?"every "+g(t,r)+" hours":n.fires.length<=3?"at "+yn(n.fires,r):"every "+g(t,r)+" hours from "+f({hour:e,minute:0},r)}function B(n,r){let{start:e,interval:t,last:i}=n,o="every "+g(t,r)+" hours";return sn({start:e,interval:t,cycle:24},{bare:()=>o,offset:()=>o+" from "+f({hour:e,minute:0},r),bounded:()=>o+" from "+f({hour:e,minute:0},r)+h(r)+f({hour:i,minute:0},r)})}function J(n,r){let e=On(n);return!e||un(e)?null:B(e,r)}function On(n){let r=c(n,"hour");if(r.length===1&&r[0].kind==="step"){let t=r[0];if(t.fires.length<2)return null;let i=t.startToken==="*"?0:+t.startToken.split("-")[0];return{interval:t.interval,last:t.fires[t.fires.length-1],start:i}}let e=Z(r);return e&&qn(e)}function Nn(n){return n.pattern.second==="*"||n.shapes.second==="step"}function ur(n,r,e){if(r===0)return Nn(n)?x(n,"minute",e)+" for one minute":x(n,"hour",e);let t=g(r,e)+" "+v(r,"minute")+" past the hour";return n.pattern.second==="0"?t:x(n,"minute",e)+", "+t}function zn(n,r,e){let t=On(n);if(!t)return null;let i=(t.last-t.start)/t.interval+1;if(n.pattern.second==="0"&&i<=A&&un(t))return null;let o=r===0&&Nn(n)&&Ve(n);return o?x(n,"minute",e)+" for one minute "+kn(o,e)+a(n,e):r===0&&n.pattern.second==="0"?B(t,e)+a(n,e):ur(n,r,e)+", "+B(t,e)+a(n,e)}function Ve(n){let r=c(n,"hour"),e=r.length===1&&r[0];return!e||e.kind!=="step"||e.startToken.indexOf("-")!==-1||!(e.interval in _n)?null:e}function Ie(n){return c(n,"hour").some(function(e){return e.kind==="range"})}function $e(n,r){let e=[],t=er(n);c(n,"hour").forEach(function(s){s.kind==="range"&&e.push(R({continuous:!1,from:+s.bounds[0],throughMinute:0,to:+s.bounds[1]},r))});let i="every hour "+p(e,r),o=t.map(function(s){return f({hour:s,minute:0},r)});return i+tr(o,r)}function vn(n,r,e){return r!==0||!Ie(n)||n.pattern.second==="0"?null:Nn(n)?x(n,"minute",e)+" for one minute during the "+j(n,{minute:0,second:null},!1,e)+" hours"+a(n,e):ur(n,r,e)+", "+$e(n,e)+a(n,e)}function wn(){return function(r){return""+r}}function sr(n,r){return n>1?function(t){return""+t}:function(t){return g(t,r)}}function Zn(n,r){return n.map(sr(n.length,r))}function F(n,r){let e=n.reduce(function(o,u){return u.kind==="range"?o+1:o+(u.kind==="step"?u.fires.length:1)},0),t=sr(e,r);return n.flatMap(function(o){return o.kind==="range"?[t(o.bounds[0])+h(r)+t(o.bounds[1])]:o.kind==="step"?o.fires.map(t):[t(o.value)]})}function z(n,r,e,t){return"at "+p(n,t)+" "+r+"s past the "+e}function Je(n,r,e){return(+n==0||+n==12)&&+r==0&&!(typeof e=="number"&&e>0)}function Pn(n){let r=n.filter(function(t){return Je(t.hour,t.minute,t.second)});return r.length>0&&r.length<n.length}function yn(n,r){let e=Pn(n.map(function(o){return{hour:o,minute:0}})),t=n.map(function(o){return f({hour:o,minute:0,plain:e},r)});return p(t,r)}function Ke(n){return n.kind==="fires"&&n.fires.length===1}function I(n,r,e,t){return r.kind==="fires"?yn(r.fires,t):j(n,{minute:0,second:null},e,t)}function Ye(n){return n.kind==="range"?n.bounds:n.kind==="step"?n.fires:[n.value]}function j(n,r,e,t){let{minute:i,second:o}=r,u=c(n,"hour"),s=Pn(u.flatMap(function(y){return Ye(y).map(function(en){return{hour:+en,minute:i,second:o}})})),m=[];return u.forEach(function(y){y.kind==="step"?m.push(...y.fires.map(function(en){return f({hour:en,minute:i,second:o,plain:s},t)})):y.kind==="range"?m.push(f({hour:y.bounds[0],minute:i,second:o,plain:s},t)+h(t)+f({hour:y.bounds[1],minute:i,second:o,plain:s},t)):m.push(f({hour:y.value,minute:i,second:o,plain:s},t))}),p(Ge(m,u,e),t)}function Ge(n,r,e){let t=r.some(function(o){return o.kind==="range"});return!e||!t?n:n.map(function(o,u){return u===0?o:"at "+o})}function ar(n,r,e){if(n.length<=1)return n.join("");if(n.length===2)return n[0]+r+n[1];let t=e.style.serialComma?","+r:r;return n.slice(0,-1).join(", ")+t+n[n.length-1]}function p(n,r){return ar(n," and ",r)}function Ze(n,r){return ar(n," or ",r)}var Be={all:"",month:"in ",recurringWeekday:!0,stepDate:"on ",weekday:"on "},Cn={all:"every day",month:"every day in ",recurringWeekday:!1,stepDate:"",weekday:"every "};function a(n,r){if(K(n,r))return fr(n,r);let e=_(n,Be,r);return e&&" "+e}function cr(n,r){return K(n,r)?"":_(n,Cn,r)+" "}function _(n,r,e){let t=n.pattern;if(t.date!=="*"&&t.weekday!=="*")return tt(n,e);if(t.date!=="*")return Xe(n,r,e);if(t.weekday!=="*"){let i=xn(t.weekday,e);return i?bn(i,n,e):r.weekday+pr(n,r.recurringWeekday,e)+dr(n,e)}return t.month!=="*"?r.month+N(n,e):r.all}function Xe(n,r,e){let t=n.pattern,i=nn(t.date,e);return i?bn(i,n,e):E(t.date)?bn(r.stepDate+gr(t.date),n,e):t.month!=="*"&&!lr(n)?"on the "+Sn(n,e)+dr(n,e):t.month!=="*"?"on "+mr(n,e):"on the "+Sn(n,e)}function lr(n){return!hr(n.pattern.month)&&c(n,"month").every(function(e){return e.kind!=="range"})}function K(n,r){return n.pattern.date!=="*"&&n.pattern.weekday!=="*"&&!!r.style.untilWindow&&!r.short}function fr(n,r){let e=[...nt(n,r),...rt(n,r)];return" whenever the day is "+Ze(e,r)}function _e(n,r){return n.pattern.month==="*"?"":"in "+N(n,r)+" "}function nt(n,r){let e=n.pattern.date,t=nn(e,r);if(t)return[t.replace(/^on /,"")];let i=et(e);if(i)return[i];let o=[];return c(n,"date").forEach(function(s){s.kind==="range"?o.push("from the "+b(s.bounds[0])+h(r)+"the "+b(s.bounds[1])):s.kind==="step"?s.fires.forEach(function(S){o.push("the "+b(S))}):o.push("the "+b(s.value))}),o}function rt(n,r){let e=n.pattern.weekday,t=xn(e,r);if(t)return[t.replace(/^on /,"")];let i=[];return c(n,"weekday").forEach(function(u){u.kind==="range"&&u.bounds[0]==="1"&&u.bounds[1]==="5"?i.push("a weekday"):u.kind==="range"?i.push("a "+C(u.bounds[0],r)+h(r)+"a "+C(u.bounds[1],r)):u.kind==="step"?u.fires.forEach(function(m){i.push("a "+C(m,r))}):i.push("a "+C(u.value,r))}),i}function et(n){if(!E(n))return null;let[r,e]=n.split("/");return+e!=2?null:r==="*"||r==="1"?"an odd-numbered day":r==="2"?"an even-numbered day":null}function tt(n,r){let e=n.pattern,t=xn(e.weekday,r)||"on "+pr(n,!1,r);return e.month!=="*"&&lr(n)&&!nn(e.date,r)&&!E(e.date)?"on "+mr(n,r)+" or "+t+" in "+N(n,r):it(n,r)+" or "+t+ot(n,r)}function it(n,r){let e=n.pattern,t=nn(e.date,r);return t||(E(e.date)?gr(e.date):"on the "+Sn(n,r))}function ot(n,r){return n.pattern.month==="*"?"":", in "+N(n,r)}function nn(n,r){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 e=/^L-(\d{1,2})$/.exec(n);if(e)return g(+e[1],r)+" "+v(e[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 "+b(t[1]||t[2])}function xn(n,r){let e=n.split("#");if(e.length===2)return"on the "+te[+e[1]]+" "+C(e[0],r)+" of the month";if(/L$/.test(n))return"on the last "+C(n.slice(0,-1),r)+" of the month"}function mr(n,r){let e=N(n,r),t=rn(c(n,"date"),r.style.ordinals?b:ut,r);return r.style.dayFirst&&n.shapes.date==="single"&&n.shapes.month!=="single"?"the "+b(n.pattern.date)+" of "+e:r.style.dayFirst?t+" "+e:e+" "+t}function ut(n){return""+n}function dr(n,r){return n.pattern.month==="*"?"":" in "+N(n,r)}function bn(n,r,e){if(r.pattern.month==="*")return n;let t=n.indexOf(" of the month")!==-1;return t&&r.shapes.month==="range"?n.replace(" of the month"," of each month")+" from "+N(r,e):t&&(r.shapes.month==="single"||r.shapes.month==="step")?n.replace(" of the month","")+" in "+N(r,e):n+" in "+N(r,e)}function gr(n){let r=n.split("/"),e=+r[1],t=r[0],o=(e===2?"every other":"every "+b(e))+" day of the month";return t!=="*"&&t!=="1"&&(o+=" from the "+b(t)),o}function Sn(n,r){return rn(c(n,"date"),b,r)}function N(n,r){let e=hr(n.pattern.month);return e||rn(c(n,"month"),function(i){return ft(i,r)},r)}function hr(n){if(!E(n))return null;let[r,e]=n.split("/");return+e!=2?null:r==="*"||r==="1"?"every odd-numbered month":r==="2"?"every even-numbered month":null}function pr(n,r,e){let t=Un(c(n,"weekday")),i=t.some(function(s){return s.kind==="range"});return rn(t,r&&!i?function(s){return st(s,e)}:function(s){return C(s,e)},e)}function st(n,r){let e=C(n,r);return r.short?e:e+"s"}function rn(n,r,e){let t=[];return n.forEach(function(o){o.kind==="step"?t.push(...o.fires.map(r)):o.kind==="range"?t.push(o.bounds.map(r).join(h(e))):t.push(r(o.value))}),p(t,e)}function Bn(n,r,e){let t=r.pattern.year;if(t==="*")return n;if(t.indexOf("/")!==-1)return n+", "+ct(t,e);let i=at(t,e);if(t.indexOf("-")===-1&&t.indexOf(",")===-1&&r.pattern.date!=="*"&&n.indexOf(" at ")!==-1){let o=e.style.dayFirst?" ":", ";return n.replace(" at ",o+i+" at ")}return n+" in "+i}function at(n,r){return n.indexOf(",")!==-1?p(n.split(","),r):n.indexOf("-")!==-1?n.split("-").join(h(r)):n}function ct(n,r){let e=n.split("/"),t=+e[1],i=e[0];if(t<=1)return"every year";let o=t===2?"every other year":"every "+g(t,r)+" years";return i!=="*"&&i!=="0"&&(o+=" from "+i),o}function f(n,r){let{hour:e,minute:t,plain:i,explicit:o}=n,u=typeof n.second=="number"&&n.second>0?n.second:0;return r.ampm?lt({hour:e,minute:t,second:u,plain:i,explicit:o},r):dn({hour:e,minute:t,second:u},{pad:!0,sep:r.style.sep})}function lt(n,r){let{hour:e,minute:t,second:i,plain:o,explicit:u}=n,s=r.style;if(!o&&!u&&+t==0&&!i){if(+e==0)return s.midnight;if(+e==12)return s.midday}return dn({hour:e%12||12,minute:t,second:i},{lean:!u,sep:s.sep})+(s.closeUp?"":" ")+(e<12?s.am:s.pm)}function g(n,r){return Yn(n,ne,r)}function v(n,r){return+n==1?r:r+"s"}function h(n){return n.short?"-":n.style.through}function b(n){let r=Math.abs(n),e=hn[r];return e||(r=(r%100-20)%10,e=hn[r]||hn[0]),n+e}function ft(n,r){let e=re[+n];return e&&e[r.short?1:0]}function C(n,r){let e=n===7||n==="7"?0:n,t=P[e]||ee[e];return t&&t[r.short?1:0]}var mt={describe:oe,fallback:"an unrecognizable cron pattern",options:ie,reboot:"at system startup",sentence:n=>"Runs "+n+(n.endsWith(".")?"":".")},yr=mt;/**
|
|
1
|
+
"use strict";(()=>{var Or={SUN:0,MON:1,TUE:2,WED:3,THU:4,FRI:5,SAT:6},Nr={JAN:1,FEB:2,MAR:3,APR:4,MAY:5,JUN:6,JUL:7,AUG:8,SEP:9,OCT:10,NOV:11,DEC:12},k={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:Nr,top:12},weekday:{aliases:{"?":"*",L:"6"},cyclic:!0,max:7,min:0,numbers:Or,top:6},year:{max:9999,min:1970}},M=["second","minute","hour","date","month","weekday","year"],tn={"@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 * * * *"},A=6;function m(n,r){return(""+n).indexOf(r)!==-1}function Y(n){return Array.from(new Set(n))}function G(n){return/^\d+$/.test(n)}function d(n,r){return G(n)?+n:r[n.toUpperCase()]}function Tn(n){return M.forEach(function(e){zr(n[e],k[e],e)}),n}function zr(n,r,e){typeof n!="string"&&typeof n!="number"&&Mn(n,e);let t=""+n;t!=="*"&&(e==="date"&&U(t)||e==="weekday"&&q(t,r)||t.split(",").forEach(function(o){vr(o,r)||Mn(o,e)}))}function U(n){if(n==="L"||n==="LW"||n==="WL")return!0;let r=/^L-(\d{1,2})$/.exec(n);if(r)return+r[1]>=1&&+r[1]<=30;let e=/^(\d{1,2})W$|^W(\d{1,2})$/.exec(n);if(e){let t=+(e[1]||e[2]);return t>=1&&t<=31}return!1}function q(n,r){if(/L$/.test(n))return L(n.slice(0,-1),r);let e=n.split("#");return e.length===2?L(e[0],r)&&/^[1-5]$/.test(e[1]):!1}function vr(n,r){return m(n,"/")?wr(n,r):m(n,"-")?Wn(n,r):L(n,r)}function wr(n,r){let e=n.split("/");return e.length!==2||!G(e[1])||+e[1]<1?!1:e[0]==="*"||L(e[0],r)||Wn(e[0],r,!0)}function Wn(n,r,e){let t=n.split("-");return t.length!==2||!L(t[0],r)||!L(t[1],r)?!1:r.cyclic&&!e?!0:d(t[0],r.numbers)<=d(t[1],r.numbers)}function L(n,r){return n==="*"?!1:G(n)?+n>=r.min&&+n<=r.max:r.numbers?n.toUpperCase()in r.numbers:!1}function Mn(n,r){throw new Error('`cronli5` was passed an invalid field value "'+n+'" for the '+r+" field.")}var Pr={hour:24,minute:60,second:60};function Ln(n){M.forEach(function(e){let t=k[e].aliases,i=t&&t[""+n[e]];i&&(n[e]=i)})}function En(n){return M.forEach(function(e){let t=""+n[e];if(e==="date"&&U(t)||e==="weekday"&&q(t,k[e])){n[e]=t;return}n[e]=Cr(t,e,k[e])}),n}function Cr(n,r,e){let t=""+n;if(t==="*")return t;let i=Pr[r],o=t.split(",").map(function(s){return xr(Dn(Wr(Hr(Lr(Tr(Mr(s,e),e),e),e),e,i),e),e)}).join(",").split(",");return o.indexOf("*")!==-1?"*":Y(o).sort(function(s,f){return Hn(s,e)-Hn(f,e)}).join(",")}function xr(n,r){if(!r.numbers)return n;let e=n.split("/"),t=e[0].split("-").map(function(o){return Fr(o,r)}).join("-");return e.length===2?t+"/"+e[1]:t}function Fr(n,r){if(n==="*")return n;let e=d(n,r.numbers);return""+(e>r.top?r.min:e)}function Mr(n,r){let e=n.split("/");if(!r.cyclic||e.length!==2||+e[1]!=1)return n;let t=e[0];return m(t,"-")?t:t==="*"||d(t,r.numbers)===r.min?"*":t+"-"+r.top}function Tr(n,r){let e=n.split("/");if(!r.cyclic||typeof r.top!="number"||e.length!==2||m(e[0],"-"))return n;let t=e[0];return(t==="*"?r.min:d(t,r.numbers))+ +e[1]<=r.top?n:t==="*"?""+r.min:t}function Wr(n,r,e){let t=n.split("/");if(typeof e!="number"||t.length!==2||m(t[0],"-"))return n;let i=+t[1],o=t[0]==="*"?r.min:d(t[0]);if(e%i===0&&o<i)return n;let u=[];for(let s=o;s<=r.top;s+=i)u.push(s);return u.join(",")}function Hr(n,r){let e=n.split("/");return e.length!==2||!m(e[0],"-")?n:Dn(e[0],r)==="*"?"*/"+e[1]:n}function Dn(n,r){if(typeof r.top!="number"||m(n,"/")||!m(n,"-"))return n;let e=n.split("-"),t=d(e[0],r.numbers),i=d(e[1],r.numbers);if(t>i)return n;let o=r.top,u={};for(let s=t;s<=i;s+=1)u[s>o?r.min:s]=!0;for(let s=r.min;s<=o;s+=1)if(!u[s])return n;return"*"}function Lr(n,r){let e=n.split("/")[0];if(!m(e,"-"))return n;let t=e.split("-");return d(t[0],r.numbers)!==d(t[1],r.numbers)?n:t[0]}function Hn(n,r){let e=n.split("/")[0].split("-")[0];return e==="*"?r.min:d(e,r.numbers)}function jn(n,r){let e=n instanceof Array;if(n===null||typeof n>"u"||n===""||e&&n.length===0)throw new Error("`cronli5` expects a non-empty cron pattern as the first argument.");if(e)return Rn(n,r);if(typeof n=="object")return Er(n);if(typeof n=="string")return Dr(n,r);throw new Error("`cronli5` was passed an unexpected type.")}function Rn(n,r){if(n.length>7)throw new Error("`cronli5` was passed a cron pattern with more than seven fields.");return!r.seconds&&n.length<(r.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 Er(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 r=typeof n.second<"u",e=typeof n.minute<"u",t=r?"*":"0",i=r||e?"*":"0";return{second:T(n.second,"0"),minute:T(n.minute,t),hour:T(n.hour,i),date:T(n.date,"*"),month:T(n.month,"*"),weekday:T(n.weekday,"*"),year:T(n.year,"*")}}function T(n,r){return typeof n>"u"?r:n}function Dr(n,r){let e=jr(n).split(/\s+/);return Rn(e,r)}function jr(n){let r=n.trim();if(r.charAt(0)!=="@")return n;let e=r.toLowerCase();if(Object.hasOwn(tn,e))return tn[e];throw new Error("`cronli5` does not recognize the macro `"+r+"`.")}function An(n){return n===0?7:n}function Un(n){let r=n.flatMap(function(i){return i.kind==="step"?i.fires.map(function(u){return{kind:"single",value:""+u}}):[i]});function e(t){return t.kind==="range"?An(+t.bounds[0]):An(+t.value)}return r.map(function(i,o){return[i,o]}).sort(function(i,o){return e(i[0])-e(o[0])||i[1]-o[1]}).map(function(i){return i[0]})}function on(n){if(n.length<5)return null;let r=n[1]-n[0];if(r<2)return null;for(let e=2;e<n.length;e+=1)if(n[e]-n[e-1]!==r)return null;return{start:n[0],interval:r,last:n[n.length-1]}}function c(n,r){return n.analyses.segments[r]??[]}function O(n,r){return c(n,r)[0]}function Z(n){let r=[];for(let e of n){if(e.kind!=="single")return null;r.push(+e.value)}return r}function un(n){return n.start<n.interval&&24%n.interval===0}function Rr(n,r,e){return e-1-(e-1-n)%r}function sn(n,r){let{start:e,interval:t,last:i,cycle:o}=n,u=o%t===0&&i===Rr(e,t,o);return e===0&&u?r.bare():e<t&&u?r.offset():r.bounded()}function qn(n){if(n.length<2)return null;let r=n[1]-n[0];if(r<2)return null;for(let e=2;e<n.length;e+=1)if(n[e]-n[e-1]!==r)return null;return n[0]!==0&&n.length<5?null:{interval:r,last:n[n.length-1],start:n[0]}}function Qn(n){return n!=="*"&&!m(n,",")&&!m(n,"-")&&!m(n,"/")}function an(n){return m(n,"-")&&!m(n,",")&&!m(n,"/")}function Ar(n){return m(n,"/")&&!m(n,",")}function cn(n){return n!=="*"&&!m(n,"-")&&!m(n,"/")}function mn(n){return n!=="*"&&!an(n)&&!Ar(n)}function E(n){return n.indexOf("/")!==-1&&n.indexOf("-")===-1&&n.indexOf(",")===-1}function Q(n,r,e){let t=[],i=n;for(;i<=e;)t.push(i),i+=r;return t}function Vn(n,r,e,t){let i=n.split("/"),o=+i[1];if(m(i[0],"-")){let s=i[0].split("-");return Q(d(s[0],t),o,d(s[1],t))}let u=i[0]==="*"?r:d(i[0],t);return Q(u,o,e)}function fn(n,r,e){let t=[];return n.split(",").forEach(function(o){if(m(o,"/"))t.push(...Vn(o,r,e));else if(m(o,"-")){let u=o.split("-");+u[0]<=+u[1]?t.push(...Q(+u[0],1,+u[1])):(t.push(...Q(+u[0],1,e)),t.push(...Q(r,1,+u[1])))}else t.push(+o)}),Y(t)}function Ur(n){return cn(n)?n.split(",").map(Number):[0]}function qr(n){if(n==="*")return[0,59];if(an(n)){let r=n.split("-");if(+r[0]<=+r[1])return[+r[0],+r[1]]}return null}function Qr(n){return n==="*"?59:Math.max(...fn(n,0,59))}function Vr(n){if(Qn(n)&&n!=="0")return+n}function Ir(n,r){return n==="*"?"wildcard":r==="date"&&U(n)||r==="weekday"&&q(n,k.weekday)?"quartz":m(n,",")?"list":m(n,"/")?"step":m(n,"-")?"range":"single"}function $r(n,r,e){return r==="wildcard"||r==="quartz"?null:n.split(",").map(function(i){if(m(i,"/")){let o=i.split("/");return{fires:Vn(i,e.min,e.top,e.numbers),interval:+o[1],kind:"step",startToken:o[0]}}return m(i,"-")?{bounds:i.split("-"),kind:"range"}:{kind:"single",value:i}})}function In(n){let r={},e={};M.forEach(function(u){r[u]=Ir(n[u],u),e[u]=$r(n[u],r[u],k[u])});let i={analyses:{clockSecond:Vr(n.second),lastMinuteFire:Qr(n.minute),minuteSpan:qr(n.minute),segments:e},pattern:n,shapes:r};return{...i,plan:Jr(i)}}function Jr(n){let{analyses:r,pattern:e,shapes:t}=n;if(e.second!=="0"){let i=Kr(e,t,r);if(i)return i}return $n(e,t,r)||Jn(e,t,r)}function Kr(n,r,e){let t=Yr(n,r);return t||(n.hour==="*"&&r.minute==="single"&&n.second!=="*"?{kind:"secondsWithinMinute",singleSecond:r.second==="single"}:r.second==="single"&&cn(n.minute)&&mn(n.hour)?null:{kind:"composeSeconds",rest:$n(n,r,e,!0)||Jn(n,r,e,!0)})}function Yr(n,r){return n.minute!=="*"||n.hour!=="*"?null:n.second==="*"?{kind:"everySecond"}:r.second==="single"?{kind:"secondPastMinute"}:{kind:"standaloneSeconds"}}function $n(n,r,e,t=!1){if(r.minute==="step")return{hours:Zr(n,r,e),kind:"minuteFrequency"};if(r.hour==="single"&&e.minuteSpan)return{hour:+n.hour,kind:"minuteSpanInHour",span:e.minuteSpan};let i=Br(n,r);if(i)return i;let o=Gr(n,r);if(o)return o;if(n.hour==="*")return Xr(n,r,t)}function ln(n){let[r,e]=n.split("/"),t=r==="*"?0:+r;return r.indexOf("-")===-1&&24%+e===0&&t<+e}function Gr(n,r){return r.hour!=="step"?null:n.minute==="*"?ln(n.hour)?{form:"wildcard",kind:"minuteSpanAcrossHourStep"}:{form:"wildcard",kind:"minutesAcrossHours",times:V(n.hour)}:r.minute==="range"?{form:"range",kind:"minuteSpanAcrossHourStep"}:r.minute==="list"&&ln(n.hour)?{form:"list",kind:"minuteSpanAcrossHourStep"}:null}function Zr(n,r,e){if(r.hour==="list")return{kind:"during",times:V(n.hour)};if(r.hour==="range"){let t=n.hour.split("-");return{from:+t[0],kind:"window",last:e.lastMinuteFire,to:+t[1]}}return r.hour==="single"?{from:+n.hour,kind:"window",last:e.lastMinuteFire,to:+n.hour}:r.hour==="step"?ln(n.hour)?{kind:"step"}:{kind:"during",times:V(n.hour)}:{kind:"none"}}function Br(n,r){return mn(n.hour)?n.minute==="*"?{form:"wildcard",kind:"minutesAcrossHours",times:V(n.hour)}:r.minute==="range"||r.minute==="list"&&m(n.minute,"-")&&!m(n.minute,"/")?{form:r.minute==="range"?"range":"list",kind:"minutesAcrossHours",times:V(n.hour)}:null:null}function Xr(n,r,e){if(r.minute==="range")return{kind:"rangeOfMinutes"};if(r.minute==="list")return{kind:"multipleMinutes"};if(n.minute==="*")return{kind:"everyMinute"};if(n.minute!=="0"||e)return{kind:"singleMinute"}}function Jn(n,r,e,t=!1){let i=t&&n.minute==="0";return r.hour==="range"&&!i?_r(n,r,e):r.hour==="step"&&n.minute==="0"&&!t?{kind:"hourStep"}:n.hour==="*"&&!i?{kind:"everyHour"}:ne(n,e,i)}function _r(n,r,e){let t=n.hour.split("-"),i="lead";return n.minute==="*"?i="wildcard":r.minute==="range"&&(i="range"),{boundMinute:r.minute==="range"||r.minute==="list"?null:e.lastMinuteFire,from:+t[0],kind:"hourRange",last:e.lastMinuteFire,minuteForm:i,to:+t[1]}}function ne(n,r,e=!1){let t=fn(n.hour,0,23),i=Ur(n.minute);if(!e&&t.length*i.length>A)return{fold:i.length===1,kind:"compactClockTimes",minute:i[0]};let o=[];return t.forEach(function(s){i.forEach(function(S){o.push({hour:s,minute:S,second:r.clockSecond})})}),{kind:"clockTimes",times:o}}function V(n){let r=fn(n,0,23);return r.length<=A?{fires:r,kind:"fires"}:{kind:"segments"}}function Kn(n,r){let e=jn(n,r);return Ln(e),Tn(e),En(e)}function w(n){return n=""+n,n.length<2?"0"+n:n}function Yn(n,r,e){return e.short?n:r[n]||n}function dn(n,{sep:r,pad:e,lean:t}){let i=e?w(n.hour):""+n.hour;return t&&!n.minute&&!n.second?i:i+r+w(n.minute)+(n.second?r+w(n.second):"")}var gn={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 ",untilWindow:!0},house:{am:"AM",closeUp:!1,dayFirst:!1,midday:"noon",midnight:"midnight",ordinals:!0,pm:"PM",sep:":",serialComma:!0,through:" - "}};function Gn(n){return typeof n=="object"&&n!==null?{...gn.us,untilWindow:!1,...n}:gn[n==="uk"?"gb":n]||gn.us}var re=["zero","one","two","three","four","five","six","seven","eight","nine","ten"],hn=["th","st","nd","rd"],ee=[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"]],P=[["Sunday","Sun"],["Monday","Mon"],["Tuesday","Tue"],["Wednesday","Wed"],["Thursday","Thu"],["Friday","Fri"],["Saturday","Sat"]],te={SUN:P[0],MON:P[1],TUE:P[2],WED:P[3],THU:P[4],FRI:P[5],SAT:P[6]},ie=[null,"first","second","third","fourth","fifth"];function oe(n){return n=n||{},{ampm:typeof n.ampm=="boolean"?n.ampm:!0,lenient:!!n.lenient,seconds:!!n.seconds,short:!!n.short,style:Gn(n.dialect),years:!!n.years}}function ue(n,r){let e=me(n,r);if(e!==null)return Bn(e,n,r);let t=Qe(n,r)??Xn(n,n.plan,r),i=K(n,r)?nt(n,r):"";return Bn(i+t,n,r)}function Xn(n,r,e){let t=Ve[r.kind];return t(n,r,e)}function pn(n){return n==="step"||n==="range"||n==="list"}function se(n,r){if(!r.style.untilWindow||r.short||n.plan.kind!=="composeSeconds"||n.plan.rest.kind==="clockTimes"||K(n,r))return!1;let{shapes:e}=n;return pn(e.second)&&pn(e.minute)&&pn(e.hour)}function ae(n,r){let e=On(n);if(e)return B(e,r);if(n.shapes.hour==="range"){let t=c(n,"hour").find(function(o){return o.kind==="range"});return R({continuous:!1,from:+t.bounds[0],throughMinute:0,to:+t.bounds[1]},r)}return"during the "+j(n,{minute:0,second:null},!1,r)+" hours"}function ce(n,r){return n.shapes.minute==="step"?X(O(n,"minute"),"minute","hour",r):n.shapes.minute==="range"?$(n.pattern.minute,r):H(c(n,"minute"),"minute","hour",r)??z(F(c(n,"minute"),r),"minute","hour",r)}function me(n,r){if(!se(n,r))return null;let e=ae(n,r),t=ce(n,r),i=x(n,"minute",r),o=e+", "+t+", and within each of those minutes, "+i,u=a(n,r).trim();return u?u+", "+o:o}function le(n,r,e){return"every second"+a(n,e)}function fe(n,r,e){return D(n,e)+a(n,e)}function de(n,r,e){let t=n.pattern.second;return g(t,e)+" "+v(t,"second")+" past the minute, every minute"+a(n,e)}function ge(n,r,e){let t=n.pattern.minute,i=g(t,e),o=v(t,"minute");if(r.singleSecond){let u=n.pattern.second;return i+" "+o+" and "+g(u,e)+" "+v(u,"second")+" past the hour, every hour"+a(n,e)}return D(n,e)+", "+i+" "+o+" past the hour, every hour"+a(n,e)}function he(n,r,e){if(!(r.rest.kind==="clockTimes"||r.rest.kind==="compactClockTimes")||n.shapes.minute!=="single")return null;let i=+n.pattern.minute;return zn(n,i,e)??vn(n,i,e)}function pe(n,r,e){return+r.times[0].minute==0&&n.shapes.minute==="single"?D(n,e)+" for one minute at "+be(n,r,e):D(n,e)+" of "+Se(n,r,e)}function ye(n,r,e){let t=he(n,r,e);return t!==null?t:r.rest.kind==="clockTimes"&&(n.shapes.second==="wildcard"||n.shapes.second==="step")?pe(n,r.rest,e):n.shapes.second==="wildcard"&&r.rest.kind==="minuteFrequency"&&r.rest.hours.kind==="none"&&n.pattern.minute==="*/2"?"every second of every other minute"+a(n,e):(r.rest.kind==="compactClockTimes"&&n.analyses.clockSecond?"":D(n,e)+", ")+Xn(n,r.rest,e)}function be(n,r,e){let t=r.times.map(function(u){return l({hour:u.hour,minute:0},e)}),i=_(n,Cn,e);return p(t,e)+(i&&", "+i)}function Se(n,r,e){let t=r.times.map(function(u){return l({hour:u.hour,minute:u.minute,second:u.second,explicit:!0},e)}),i=_(n,Cn,e);return p(t,e)+(i&&", "+i)}function D(n,r){return x(n,"minute",r)}function x(n,r,e){let t=n.pattern.second,i=n.shapes.second;if(t==="*")return"every second";if(i==="step")return X(O(n,"second"),"second",r,e);if(i==="range"){let o=t.split("-"),u=wn();return"every second from "+u(o[0])+h(e)+u(o[1])+" past the "+r}return i==="single"?"at "+g(t,e)+" "+v(t,"second")+" past the "+r:H(c(n,"second"),"second",r,e)??z(F(c(n,"second"),e),"second",r,e)}function ke(n,r,e){return"every minute"+a(n,e)}function Oe(n,r,e){let t=n.pattern.minute;return g(t,e)+" "+v(t,"minute")+" past the hour, every hour"+a(n,e)}function Ne(n,r,e){return $(n.pattern.minute,e)+a(n,e)}function ze(n,r,e){return(H(c(n,"minute"),"minute","hour",e)??z(F(c(n,"minute"),e),"minute","hour",e))+a(n,e)}function ve(n,r,e){let t=X(O(n,"minute"),"minute","hour",e);if(r.hours.kind==="during"){let i=J(n,e);t+=i?", "+i:" during the "+I(n,r.hours.times,!1,e)+" hours"}else r.hours.kind==="window"?t+=" "+R({continuous:!1,from:r.hours.from,throughMinute:r.hours.last,to:r.hours.to},e):r.hours.kind==="step"&&(t+=" "+kn(O(n,"hour"),e));return t+a(n,e)}function we(n,r,e){return n.pattern.minute==="*"?"every minute of the "+l({hour:r.hour,minute:0},e)+" hour"+a(n,e):"every minute from "+l({hour:r.hour,minute:r.span[0]},e)+h(e)+l({hour:r.hour,minute:r.span[1]},e)+a(n,e)}function Pe(n,r,e){let t=J(n,e);if(r.form==="wildcard")return t!==null?"every minute, "+t+a(n,e):"every minute during the "+I(n,r.times,!1,e)+" hours"+a(n,e);if(r.form==="range"){let u=$(n.pattern.minute,e);return t!==null?u+", "+t+a(n,e):Ye(r.times)?u+", at "+I(n,r.times,!0,e)+a(n,e):u+" during the "+I(n,r.times,!1,e)+" hours"+a(n,e)}let i=H(c(n,"minute"),"minute","hour",e)??z(F(c(n,"minute"),e),"minute","hour",e);if(t!==null)return i+", "+t+a(n,e);let o=I(n,r.times,!0,e);return i+", at "+o+a(n,e)}var _n={2:"other",3:"third",4:"fourth",6:"sixth",8:"eighth",12:"twelfth"};function kn(n,r){let e="during every "+_n[n.interval]+" hour",t=n.startToken==="*"?0:+n.startToken;return t===0?e:e+" starting at "+l({hour:t,minute:0},r)}function Ce(n,r,e){let t=O(n,"hour");if(r.form==="wildcard")return"every minute "+kn(t,e)+a(n,e);let i=r.form==="list"?H(c(n,"minute"),"minute","hour",e)??z(F(c(n,"minute"),e),"minute","hour",e):$(n.pattern.minute,e),o=J(n,e);return i+", "+(o??or(t,e))+a(n,e)}function $(n,r){let e=n.split("-"),t=wn();return"every minute from "+t(e[0])+h(r)+t(e[1])+" past the hour"}function xe(n,r,e){return"every hour"+a(n,e)}function Fe(n,r,e){let t=We(Te(r),e);return r.minuteForm==="wildcard"?"every minute "+t+a(n,e):r.minuteForm==="range"?$(n.pattern.minute,e)+", "+t+a(n,e):nr(n,e)+" "+t+a(n,e)}function nr(n,r){return n.pattern.minute==="0"?"every hour":H(c(n,"minute"),"minute","hour",r)??z(F(c(n,"minute"),r),"minute","hour",r)}function Me(n,r,e){let t=J(n,e);return t!==null?t+a(n,e):or(O(n,"hour"),e)+a(n,e)}function Te(n){let r=n.minuteForm==="wildcard",e=r?n.boundMinute??0:0;return{from:n.from,closeMinute:e,to:n.to,continuous:r}}function R(n,r){let{from:e,to:t,throughMinute:i,continuous:o}=n,u="from "+l({hour:e,minute:0},r);return r.style.untilWindow&&!r.short&&e!==t?o?u+" until "+l({hour:(t+1)%24,minute:0},r):u+h(r)+l({hour:t,minute:0},r):u+h(r)+l({hour:t,minute:i},r)}function We(n,r){return R({continuous:n.continuous,from:n.from,throughMinute:n.closeMinute,to:n.to},r)}function He(n,r,e){if(n.shapes.minute==="single"){let o=+n.pattern.minute,u=zn(n,o,e)??vn(n,o,e);if(u!==null)return u}let t=Pn(r.times),i=r.times.map(function(u){return l({hour:u.hour,minute:u.minute,second:u.second,plain:t},e)});return cr(n,e)+"at "+p(i,e)+rr(n,e)}function rr(n,r){return K(n,r)?lr(n,r):""}function Le(n,r,e){if(r.fold){let u=zn(n,+r.minute,e)??vn(n,+r.minute,e);if(u!==null)return u;if(c(n,"hour").some(function(y){return y.kind==="range"})&&!n.analyses.clockSecond)return Ee(n,r,e)+a(n,e);let f={minute:r.minute,second:n.analyses.clockSecond};return cr(n,e)+"at "+j(n,f,!0,e)+rr(n,e)}let t=H(c(n,"minute"),"minute","hour",e)??z(F(c(n,"minute"),e),"minute","hour",e),i=J(n,e),o=i?t+", "+i+a(n,e):t+", at "+j(n,{minute:0,second:null},!0,e)+a(n,e);return n.analyses.clockSecond?D(n,e)+", "+o:o}function Ee(n,r,e){let t=r.minute,i=[],o=er(n).map(function(f){return l({hour:f,minute:t},e)});return c(n,"hour").forEach(function(f){f.kind==="range"&&i.push(R({continuous:!1,from:+f.bounds[0],throughMinute:t,to:+f.bounds[1]},e))}),nr(n,e)+" "+p(i,e)+tr(o,e)}function er(n){let r=[];return c(n,"hour").forEach(function(t){t.kind==="step"?r.push(...t.fires):t.kind!=="range"&&r.push(+t.value)}),r}function tr(n,r){return n.length?" and at "+p(n,r):""}function W(n){return n==="*"||n.startsWith("*/")&&n.indexOf("-")===-1}function De(n,r){let{second:e,minute:t}=n.pattern;return W(e)?{secondLead:!0,text:x(n,"minute",r)}:e==="0"&&W(t)?{secondLead:!1,text:t==="*"?"every minute":X(O(n,"minute"),"minute","hour",r)}:null}function je(n,r){let e=n.pattern.minute;if(e==="*")return"";if(W(e))return" of every other minute";let t=c(n,"minute");if(n.shapes.minute==="single")return" during minute :"+w(e);if(n.shapes.minute==="range"){let o=e.split("-");return" during minutes :"+w(o[0])+h(r)+":"+w(o[1])}let i=F(t,r).map(function(u){return":"+w(u)});return" during minutes "+p(i,r)}function Re(n,r){let e=n.pattern.hour;if(e==="*")return n.pattern.minute!=="*"&&!W(n.pattern.minute)?" of every hour":"";if(W(e))return e==="*/2"?" of every other hour":"";if(n.shapes.hour==="single"){let t=+e;return n.shapes.minute==="step"?" from "+l({hour:t,minute:0},r)+" until "+l({hour:(t+1)%24,minute:0},r):n.pattern.minute!=="*"&&!W(n.pattern.minute)?" at "+l({hour:t,minute:0},r):" of the "+l({hour:t,minute:0},r)+" hour"}if(n.shapes.hour==="range"){let t=e.split("-");return" "+R({continuous:n.pattern.minute==="*",from:+t[0],throughMinute:0,to:+t[1]},r)}return" during the "+j(n,{minute:0,second:null},!1,r)+" hours"}function Ae(n){if(n.shapes.hour!=="step")return!0;let r=O(n,"hour");return n.pattern.hour==="*/2"||r.startToken.indexOf("-")!==-1}function Ue(n){if(n.shapes.minute!=="list")return!1;let r=Z(c(n,"minute"));return r!==null&&on(r)!==null}function qe(n,r){let{minute:e,hour:t}=n.pattern,i=W(e)&&e!=="*";return Ae(n)?r.secondLead?i?e==="*/2"&&n.shapes.hour!=="range":!(Ue(n)||n.shapes.minute==="list"&&n.shapes.hour==="list"):t==="*/2"?!0:n.shapes.hour==="single"&&e==="*/2":!1}function Qe(n,r){if(!r.style.untilWindow||r.short||n.pattern.minute==="*"&&n.pattern.hour==="*")return null;let e=De(n,r);if(!e||!qe(n,e))return null;let t=e.secondLead?je(n,r):"";return e.text+t+Re(n,r)+a(n,r)}var Ve={clockTimes:He,compactClockTimes:Le,composeSeconds:ye,everyHour:xe,everyMinute:ke,everySecond:le,hourRange:Fe,hourStep:Me,minuteFrequency:ve,minuteSpanAcrossHourStep:Ce,minuteSpanInHour:we,minutesAcrossHours:Pe,multipleMinutes:ze,rangeOfMinutes:Ne,secondPastMinute:de,secondsWithinMinute:ge,singleMinute:Oe,standaloneSeconds:fe};function ir(n,r){let{interval:e,start:t,last:i,cycle:o,unit:u,anchor:s}=n,f="every "+g(e,r)+" "+u+"s";return sn({start:t,interval:e,last:i,cycle:o},{bare:()=>f,offset:()=>f+" from "+g(t,r)+" "+v(t,u)+" past the "+s,bounded:()=>{let S=wn();return f+" from "+S(t)+h(r)+S(i)+" "+v(i,u)+" past the "+s}})}function H(n,r,e,t){let i=Z(n),o=i&&on(i);return o?ir({...o,cycle:60,unit:r,anchor:e},t):null}function X(n,r,e,t){if(n.startToken.indexOf("-")!==-1)return z(Zn(n.fires,t),r,e,t);let i=n.startToken==="*"?0:+n.startToken;return i!==0&&n.fires.length<=3?z(Zn(n.fires,t),r,e,t):ir({interval:n.interval,start:i,last:n.fires[n.fires.length-1],cycle:60,unit:r,anchor:e},t)}function or(n,r){if(n.startToken.indexOf("-")!==-1)return"at "+yn(n.fires,r);let e=n.startToken==="*"?0:+n.startToken,t=n.interval;return e===0?"every "+g(t,r)+" hours":n.fires.length<=3?"at "+yn(n.fires,r):"every "+g(t,r)+" hours from "+l({hour:e,minute:0},r)}function B(n,r){let{start:e,interval:t,last:i}=n,o="every "+g(t,r)+" hours";return sn({start:e,interval:t,last:i,cycle:24},{bare:()=>o,offset:()=>o+" from "+l({hour:e,minute:0},r),bounded:()=>o+" from "+l({hour:e,minute:0},r)+h(r)+l({hour:i,minute:0},r)})}function J(n,r){let e=On(n);return!e||un(e)?null:B(e,r)}function On(n){let r=c(n,"hour");if(r.length===1&&r[0].kind==="step"){let t=r[0];if(t.fires.length<2)return null;let i=t.startToken==="*"?0:+t.startToken.split("-")[0];return{interval:t.interval,last:t.fires[t.fires.length-1],start:i}}let e=Z(r);return e&&qn(e)}function Nn(n){return n.pattern.second==="*"||n.shapes.second==="step"}function ur(n,r,e){if(r===0)return Nn(n)?x(n,"minute",e)+" for one minute":x(n,"hour",e);let t=g(r,e)+" "+v(r,"minute")+" past the hour";return n.pattern.second==="0"?t:x(n,"minute",e)+", "+t}function zn(n,r,e){let t=On(n);if(!t)return null;let i=(t.last-t.start)/t.interval+1;if(n.pattern.second==="0"&&i<=A&&un(t))return null;let o=r===0&&Nn(n)&&Ie(n);return o?x(n,"minute",e)+" for one minute "+kn(o,e)+a(n,e):r===0&&n.pattern.second==="0"?B(t,e)+a(n,e):ur(n,r,e)+", "+B(t,e)+a(n,e)}function Ie(n){let r=c(n,"hour"),e=r.length===1&&r[0];return!e||e.kind!=="step"||e.startToken.indexOf("-")!==-1||!(e.interval in _n)?null:e}function $e(n){return c(n,"hour").some(function(e){return e.kind==="range"})}function Je(n,r){let e=[],t=er(n);c(n,"hour").forEach(function(s){s.kind==="range"&&e.push(R({continuous:!1,from:+s.bounds[0],throughMinute:0,to:+s.bounds[1]},r))});let i="every hour "+p(e,r),o=t.map(function(s){return l({hour:s,minute:0},r)});return i+tr(o,r)}function vn(n,r,e){return r!==0||!$e(n)||n.pattern.second==="0"?null:Nn(n)?x(n,"minute",e)+" for one minute during the "+j(n,{minute:0,second:null},!1,e)+" hours"+a(n,e):ur(n,r,e)+", "+Je(n,e)+a(n,e)}function wn(){return function(r){return""+r}}function sr(n,r){return n>1?function(t){return""+t}:function(t){return g(t,r)}}function Zn(n,r){return n.map(sr(n.length,r))}function F(n,r){let e=n.reduce(function(o,u){return u.kind==="range"?o+1:o+(u.kind==="step"?u.fires.length:1)},0),t=sr(e,r);return n.flatMap(function(o){return o.kind==="range"?[t(o.bounds[0])+h(r)+t(o.bounds[1])]:o.kind==="step"?o.fires.map(t):[t(o.value)]})}function z(n,r,e,t){return"at "+p(n,t)+" "+r+"s past the "+e}function Ke(n,r,e){return(+n==0||+n==12)&&+r==0&&!(typeof e=="number"&&e>0)}function Pn(n){let r=n.filter(function(t){return Ke(t.hour,t.minute,t.second)});return r.length>0&&r.length<n.length}function yn(n,r){let e=Pn(n.map(function(o){return{hour:o,minute:0}})),t=n.map(function(o){return l({hour:o,minute:0,plain:e},r)});return p(t,r)}function Ye(n){return n.kind==="fires"&&n.fires.length===1}function I(n,r,e,t){return r.kind==="fires"?yn(r.fires,t):j(n,{minute:0,second:null},e,t)}function Ge(n){return n.kind==="range"?n.bounds:n.kind==="step"?n.fires:[n.value]}function j(n,r,e,t){let{minute:i,second:o}=r,u=c(n,"hour"),s=Pn(u.flatMap(function(y){return Ge(y).map(function(en){return{hour:+en,minute:i,second:o}})})),f=[];return u.forEach(function(y){y.kind==="step"?f.push(...y.fires.map(function(en){return l({hour:en,minute:i,second:o,plain:s},t)})):y.kind==="range"?f.push(l({hour:y.bounds[0],minute:i,second:o,plain:s},t)+h(t)+l({hour:y.bounds[1],minute:i,second:o,plain:s},t)):f.push(l({hour:y.value,minute:i,second:o,plain:s},t))}),p(Ze(f,u,e),t)}function Ze(n,r,e){let t=r.some(function(o){return o.kind==="range"});return!e||!t?n:n.map(function(o,u){return u===0?o:"at "+o})}function ar(n,r,e){if(n.length<=1)return n.join("");if(n.length===2)return n[0]+r+n[1];let t=e.style.serialComma?","+r:r;return n.slice(0,-1).join(", ")+t+n[n.length-1]}function p(n,r){return ar(n," and ",r)}function Be(n,r){return ar(n," or ",r)}var Xe={all:"",month:"in ",recurringWeekday:!0,stepDate:"on ",weekday:"on "},Cn={all:"every day",month:"every day in ",recurringWeekday:!1,stepDate:"",weekday:"every "};function a(n,r){if(K(n,r))return lr(n,r);let e=_(n,Xe,r);return e&&" "+e}function cr(n,r){return K(n,r)?"":_(n,Cn,r)+" "}function _(n,r,e){let t=n.pattern;if(t.date!=="*"&&t.weekday!=="*")return it(n,e);if(t.date!=="*")return _e(n,r,e);if(t.weekday!=="*"){let i=xn(t.weekday,e);return i?bn(i,n,e):r.weekday+pr(n,r.recurringWeekday,e)+dr(n,e)}return t.month!=="*"?r.month+N(n,e):r.all}function _e(n,r,e){let t=n.pattern,i=nn(t.date,e);return i?bn(i,n,e):E(t.date)?bn(r.stepDate+gr(t.date),n,e):t.month!=="*"&&!mr(n)?"on the "+Sn(n,e)+dr(n,e):t.month!=="*"?"on "+fr(n,e):"on the "+Sn(n,e)}function mr(n){return!hr(n.pattern.month)&&c(n,"month").every(function(e){return e.kind!=="range"})}function K(n,r){return n.pattern.date!=="*"&&n.pattern.weekday!=="*"&&!!r.style.untilWindow&&!r.short}function lr(n,r){let e=[...rt(n,r),...et(n,r)];return" whenever the day is "+Be(e,r)}function nt(n,r){return n.pattern.month==="*"?"":"in "+N(n,r)+" "}function rt(n,r){let e=n.pattern.date,t=nn(e,r);if(t)return[t.replace(/^on /,"")];let i=tt(e);if(i)return[i];let o=[];return c(n,"date").forEach(function(s){s.kind==="range"?o.push("from the "+b(s.bounds[0])+h(r)+"the "+b(s.bounds[1])):s.kind==="step"?s.fires.forEach(function(S){o.push("the "+b(S))}):o.push("the "+b(s.value))}),o}function et(n,r){let e=n.pattern.weekday,t=xn(e,r);if(t)return[t.replace(/^on /,"")];let i=[];return c(n,"weekday").forEach(function(u){u.kind==="range"&&u.bounds[0]==="1"&&u.bounds[1]==="5"?i.push("a weekday"):u.kind==="range"?i.push("a "+C(u.bounds[0],r)+h(r)+"a "+C(u.bounds[1],r)):u.kind==="step"?u.fires.forEach(function(f){i.push("a "+C(f,r))}):i.push("a "+C(u.value,r))}),i}function tt(n){if(!E(n))return null;let[r,e]=n.split("/");return+e!=2?null:r==="*"||r==="1"?"an odd-numbered day":r==="2"?"an even-numbered day":null}function it(n,r){let e=n.pattern,t=xn(e.weekday,r)||"on "+pr(n,!1,r);return e.month!=="*"&&mr(n)&&!nn(e.date,r)&&!E(e.date)?"on "+fr(n,r)+" or "+t+" in "+N(n,r):ot(n,r)+" or "+t+ut(n,r)}function ot(n,r){let e=n.pattern,t=nn(e.date,r);return t||(E(e.date)?gr(e.date):"on the "+Sn(n,r))}function ut(n,r){return n.pattern.month==="*"?"":", in "+N(n,r)}function nn(n,r){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 e=/^L-(\d{1,2})$/.exec(n);if(e)return g(+e[1],r)+" "+v(e[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 "+b(t[1]||t[2])}function xn(n,r){let e=n.split("#");if(e.length===2)return"on the "+ie[+e[1]]+" "+C(e[0],r)+" of the month";if(/L$/.test(n))return"on the last "+C(n.slice(0,-1),r)+" of the month"}function fr(n,r){let e=N(n,r),t=rn(c(n,"date"),r.style.ordinals?b:st,r);return r.style.dayFirst&&n.shapes.date==="single"&&n.shapes.month!=="single"?"the "+b(n.pattern.date)+" of "+e:r.style.dayFirst?t+" "+e:e+" "+t}function st(n){return""+n}function dr(n,r){return n.pattern.month==="*"?"":" in "+N(n,r)}function bn(n,r,e){if(r.pattern.month==="*")return n;let t=n.indexOf(" of the month")!==-1;return t&&r.shapes.month==="range"?n.replace(" of the month"," of each month")+" from "+N(r,e):t&&(r.shapes.month==="single"||r.shapes.month==="step")?n.replace(" of the month","")+" in "+N(r,e):n+" in "+N(r,e)}function gr(n){let r=n.split("/"),e=+r[1],t=r[0],o=(e===2?"every other":"every "+b(e))+" day of the month";return t!=="*"&&t!=="1"&&(o+=" from the "+b(t)),o}function Sn(n,r){return rn(c(n,"date"),b,r)}function N(n,r){let e=hr(n.pattern.month);return e||rn(c(n,"month"),function(i){return ft(i,r)},r)}function hr(n){if(!E(n))return null;let[r,e]=n.split("/");return+e!=2?null:r==="*"||r==="1"?"every odd-numbered month":r==="2"?"every even-numbered month":null}function pr(n,r,e){let t=Un(c(n,"weekday")),i=t.some(function(s){return s.kind==="range"});return rn(t,r&&!i?function(s){return at(s,e)}:function(s){return C(s,e)},e)}function at(n,r){let e=C(n,r);return r.short?e:e+"s"}function rn(n,r,e){let t=[];return n.forEach(function(o){o.kind==="step"?t.push(...o.fires.map(r)):o.kind==="range"?t.push(o.bounds.map(r).join(h(e))):t.push(r(o.value))}),p(t,e)}function Bn(n,r,e){let t=r.pattern.year;if(t==="*")return n;if(t.indexOf("/")!==-1)return n+", "+mt(t,e);let i=ct(t,e);if(t.indexOf("-")===-1&&t.indexOf(",")===-1&&r.pattern.date!=="*"&&n.indexOf(" at ")!==-1){let o=e.style.dayFirst?" ":", ";return n.replace(" at ",o+i+" at ")}return n+" in "+i}function ct(n,r){return n.indexOf(",")!==-1?p(n.split(","),r):n.indexOf("-")!==-1?n.split("-").join(h(r)):n}function mt(n,r){let e=n.split("/"),t=+e[1],i=e[0];if(t<=1)return"every year";let o=t===2?"every other year":"every "+g(t,r)+" years";return i!=="*"&&i!=="0"&&(o+=" from "+i),o}function l(n,r){let{hour:e,minute:t,plain:i,explicit:o}=n,u=typeof n.second=="number"&&n.second>0?n.second:0;return r.ampm?lt({hour:e,minute:t,second:u,plain:i,explicit:o},r):dn({hour:e,minute:t,second:u},{pad:!0,sep:r.style.sep})}function lt(n,r){let{hour:e,minute:t,second:i,plain:o,explicit:u}=n,s=r.style;if(!o&&!u&&+t==0&&!i){if(+e==0)return s.midnight;if(+e==12)return s.midday}return dn({hour:e%12||12,minute:t,second:i},{lean:!u,sep:s.sep})+(s.closeUp?"":" ")+(e<12?s.am:s.pm)}function g(n,r){return Yn(n,re,r)}function v(n,r){return+n==1?r:r+"s"}function h(n){return n.short?"-":n.style.through}function b(n){let r=Math.abs(n),e=hn[r];return e||(r=(r%100-20)%10,e=hn[r]||hn[0]),n+e}function ft(n,r){let e=ee[+n];return e&&e[r.short?1:0]}function C(n,r){let e=n===7||n==="7"?0:n,t=P[e]||te[e];return t&&t[r.short?1:0]}var dt={describe:ue,fallback:"an unrecognizable cron pattern",options:oe,reboot:"at system startup",sentence:n=>"Runs "+n+(n.endsWith(".")?"":".")},yr=dt;/**
|
|
2
2
|
* @license MIT, Copyright (c) 2026 Andrew Brož
|
|
3
|
-
*/function
|
|
3
|
+
*/function gt(n,r){let e=r&&r.lang||yr,t=e.options(r);if(!t.lenient)return br(Sr(n,e,t),e,r);try{return br(Sr(n,e,t),e,r)}catch{return e.fallback}}function br(n,r,e){return e&&e.sentence?r.sentence(n):n}function Sr(n,r,e){if(typeof n=="string"&&n.trim().toLowerCase()==="@reboot")return r.reboot;let t=In(Kn(n,e)),i=r.plan?r.plan(t,t.plan):t.plan;return r.describe({...t,plan:i},e)}var Fn=gt;typeof globalThis<"u"&&Object.assign(globalThis,{cronli5:Fn});var ii=Fn;})();
|
package/dist/cronli5.cjs
CHANGED
|
@@ -487,13 +487,20 @@ function singleValues(segments) {
|
|
|
487
487
|
function offsetCleanStride(stride) {
|
|
488
488
|
return stride.start < stride.interval && 24 % stride.interval === 0;
|
|
489
489
|
}
|
|
490
|
+
function lastTileOf(start, interval, cycle) {
|
|
491
|
+
return cycle - 1 - (cycle - 1 - start) % interval;
|
|
492
|
+
}
|
|
490
493
|
function renderStride(spec, parts) {
|
|
491
|
-
const { start, interval, cycle } = spec;
|
|
492
|
-
const
|
|
493
|
-
|
|
494
|
+
const { start, interval, last, cycle } = spec;
|
|
495
|
+
const open = cycle % interval === 0 && last === lastTileOf(
|
|
496
|
+
start,
|
|
497
|
+
interval,
|
|
498
|
+
cycle
|
|
499
|
+
);
|
|
500
|
+
if (start === 0 && open) {
|
|
494
501
|
return parts.bare();
|
|
495
502
|
}
|
|
496
|
-
if (start < interval &&
|
|
503
|
+
if (start < interval && open) {
|
|
497
504
|
return parts.offset();
|
|
498
505
|
}
|
|
499
506
|
return parts.bounded();
|
|
@@ -1605,7 +1612,7 @@ var renderers = {
|
|
|
1605
1612
|
function renderStride2(stride, opts) {
|
|
1606
1613
|
const { interval, start, last, cycle, unit, anchor } = stride;
|
|
1607
1614
|
const cadence = "every " + getNumber(interval, opts) + " " + unit + "s";
|
|
1608
|
-
return renderStride({ start, interval, cycle }, {
|
|
1615
|
+
return renderStride({ start, interval, last, cycle }, {
|
|
1609
1616
|
bare: () => cadence,
|
|
1610
1617
|
// A clean wrap from a non-zero offset: name the start, no endpoint.
|
|
1611
1618
|
offset: () => cadence + " from " + getNumber(start, opts) + " " + pluralize(start, unit) + " past the " + anchor,
|
|
@@ -1656,7 +1663,7 @@ function stepHours(segment, opts) {
|
|
|
1656
1663
|
function hourStrideCadence(stride, opts) {
|
|
1657
1664
|
const { start, interval, last } = stride;
|
|
1658
1665
|
const cadence = "every " + getNumber(interval, opts) + " hours";
|
|
1659
|
-
return renderStride({ start, interval, cycle: 24 }, {
|
|
1666
|
+
return renderStride({ start, interval, last, cycle: 24 }, {
|
|
1660
1667
|
bare: () => cadence,
|
|
1661
1668
|
offset: () => cadence + " from " + getTime({ hour: start, minute: 0 }, opts),
|
|
1662
1669
|
bounded: () => cadence + " from " + getTime({ hour: start, minute: 0 }, opts) + through(opts) + getTime({ hour: last, minute: 0 }, opts)
|
package/dist/cronli5.js
CHANGED
|
@@ -461,13 +461,20 @@ function singleValues(segments) {
|
|
|
461
461
|
function offsetCleanStride(stride) {
|
|
462
462
|
return stride.start < stride.interval && 24 % stride.interval === 0;
|
|
463
463
|
}
|
|
464
|
+
function lastTileOf(start, interval, cycle) {
|
|
465
|
+
return cycle - 1 - (cycle - 1 - start) % interval;
|
|
466
|
+
}
|
|
464
467
|
function renderStride(spec, parts) {
|
|
465
|
-
const { start, interval, cycle } = spec;
|
|
466
|
-
const
|
|
467
|
-
|
|
468
|
+
const { start, interval, last, cycle } = spec;
|
|
469
|
+
const open = cycle % interval === 0 && last === lastTileOf(
|
|
470
|
+
start,
|
|
471
|
+
interval,
|
|
472
|
+
cycle
|
|
473
|
+
);
|
|
474
|
+
if (start === 0 && open) {
|
|
468
475
|
return parts.bare();
|
|
469
476
|
}
|
|
470
|
-
if (start < interval &&
|
|
477
|
+
if (start < interval && open) {
|
|
471
478
|
return parts.offset();
|
|
472
479
|
}
|
|
473
480
|
return parts.bounded();
|
|
@@ -1579,7 +1586,7 @@ var renderers = {
|
|
|
1579
1586
|
function renderStride2(stride, opts) {
|
|
1580
1587
|
const { interval, start, last, cycle, unit, anchor } = stride;
|
|
1581
1588
|
const cadence = "every " + getNumber(interval, opts) + " " + unit + "s";
|
|
1582
|
-
return renderStride({ start, interval, cycle }, {
|
|
1589
|
+
return renderStride({ start, interval, last, cycle }, {
|
|
1583
1590
|
bare: () => cadence,
|
|
1584
1591
|
// A clean wrap from a non-zero offset: name the start, no endpoint.
|
|
1585
1592
|
offset: () => cadence + " from " + getNumber(start, opts) + " " + pluralize(start, unit) + " past the " + anchor,
|
|
@@ -1630,7 +1637,7 @@ function stepHours(segment, opts) {
|
|
|
1630
1637
|
function hourStrideCadence(stride, opts) {
|
|
1631
1638
|
const { start, interval, last } = stride;
|
|
1632
1639
|
const cadence = "every " + getNumber(interval, opts) + " hours";
|
|
1633
|
-
return renderStride({ start, interval, cycle: 24 }, {
|
|
1640
|
+
return renderStride({ start, interval, last, cycle: 24 }, {
|
|
1634
1641
|
bare: () => cadence,
|
|
1635
1642
|
offset: () => cadence + " from " + getTime({ hour: start, minute: 0 }, opts),
|
|
1636
1643
|
bounded: () => cadence + " from " + getTime({ hour: start, minute: 0 }, opts) + through(opts) + getTime({ hour: last, minute: 0 }, opts)
|
package/dist/lang/de.cjs
CHANGED
|
@@ -77,13 +77,20 @@ function singleValues(segments) {
|
|
|
77
77
|
function offsetCleanStride(stride) {
|
|
78
78
|
return stride.start < stride.interval && 24 % stride.interval === 0;
|
|
79
79
|
}
|
|
80
|
+
function lastTileOf(start, interval, cycle) {
|
|
81
|
+
return cycle - 1 - (cycle - 1 - start) % interval;
|
|
82
|
+
}
|
|
80
83
|
function renderStride(spec, parts) {
|
|
81
|
-
const { start, interval, cycle } = spec;
|
|
82
|
-
const
|
|
83
|
-
|
|
84
|
+
const { start, interval, last, cycle } = spec;
|
|
85
|
+
const open = cycle % interval === 0 && last === lastTileOf(
|
|
86
|
+
start,
|
|
87
|
+
interval,
|
|
88
|
+
cycle
|
|
89
|
+
);
|
|
90
|
+
if (start === 0 && open) {
|
|
84
91
|
return parts.bare();
|
|
85
92
|
}
|
|
86
|
-
if (start < interval &&
|
|
93
|
+
if (start < interval && open) {
|
|
87
94
|
return parts.offset();
|
|
88
95
|
}
|
|
89
96
|
return parts.bounded();
|
|
@@ -209,7 +216,7 @@ function renderStride2(stride) {
|
|
|
209
216
|
const { interval, start, last, cycle, unit, anchor } = stride;
|
|
210
217
|
const cadence = everyN(interval, unit);
|
|
211
218
|
const tail = anchor ? " " + anchor : "";
|
|
212
|
-
return renderStride({ start, interval, cycle }, {
|
|
219
|
+
return renderStride({ start, interval, last, cycle }, {
|
|
213
220
|
bare: () => cadence,
|
|
214
221
|
offset: () => cadence + " ab " + unit.singular + " " + start + tail,
|
|
215
222
|
bounded: () => cadence + " von " + unit.singular + " " + start + " bis " + last + tail
|
|
@@ -667,7 +674,7 @@ function openOffsetCleanStride(schedule, segment) {
|
|
|
667
674
|
function hourStrideCadence(stride) {
|
|
668
675
|
const { start, interval, last } = stride;
|
|
669
676
|
const cadence = everyN(interval, UNITS.hour);
|
|
670
|
-
return renderStride({ start, interval, cycle: 24 }, {
|
|
677
|
+
return renderStride({ start, interval, last, cycle: 24 }, {
|
|
671
678
|
bare: () => cadence,
|
|
672
679
|
offset: () => cadence + " ab " + start + " Uhr",
|
|
673
680
|
bounded: () => cadence + " von " + start + " bis " + last + " Uhr"
|
package/dist/lang/de.js
CHANGED
|
@@ -51,13 +51,20 @@ function singleValues(segments) {
|
|
|
51
51
|
function offsetCleanStride(stride) {
|
|
52
52
|
return stride.start < stride.interval && 24 % stride.interval === 0;
|
|
53
53
|
}
|
|
54
|
+
function lastTileOf(start, interval, cycle) {
|
|
55
|
+
return cycle - 1 - (cycle - 1 - start) % interval;
|
|
56
|
+
}
|
|
54
57
|
function renderStride(spec, parts) {
|
|
55
|
-
const { start, interval, cycle } = spec;
|
|
56
|
-
const
|
|
57
|
-
|
|
58
|
+
const { start, interval, last, cycle } = spec;
|
|
59
|
+
const open = cycle % interval === 0 && last === lastTileOf(
|
|
60
|
+
start,
|
|
61
|
+
interval,
|
|
62
|
+
cycle
|
|
63
|
+
);
|
|
64
|
+
if (start === 0 && open) {
|
|
58
65
|
return parts.bare();
|
|
59
66
|
}
|
|
60
|
-
if (start < interval &&
|
|
67
|
+
if (start < interval && open) {
|
|
61
68
|
return parts.offset();
|
|
62
69
|
}
|
|
63
70
|
return parts.bounded();
|
|
@@ -183,7 +190,7 @@ function renderStride2(stride) {
|
|
|
183
190
|
const { interval, start, last, cycle, unit, anchor } = stride;
|
|
184
191
|
const cadence = everyN(interval, unit);
|
|
185
192
|
const tail = anchor ? " " + anchor : "";
|
|
186
|
-
return renderStride({ start, interval, cycle }, {
|
|
193
|
+
return renderStride({ start, interval, last, cycle }, {
|
|
187
194
|
bare: () => cadence,
|
|
188
195
|
offset: () => cadence + " ab " + unit.singular + " " + start + tail,
|
|
189
196
|
bounded: () => cadence + " von " + unit.singular + " " + start + " bis " + last + tail
|
|
@@ -641,7 +648,7 @@ function openOffsetCleanStride(schedule, segment) {
|
|
|
641
648
|
function hourStrideCadence(stride) {
|
|
642
649
|
const { start, interval, last } = stride;
|
|
643
650
|
const cadence = everyN(interval, UNITS.hour);
|
|
644
|
-
return renderStride({ start, interval, cycle: 24 }, {
|
|
651
|
+
return renderStride({ start, interval, last, cycle: 24 }, {
|
|
645
652
|
bare: () => cadence,
|
|
646
653
|
offset: () => cadence + " ab " + start + " Uhr",
|
|
647
654
|
bounded: () => cadence + " von " + start + " bis " + last + " Uhr"
|
package/dist/lang/en.cjs
CHANGED
|
@@ -59,13 +59,20 @@ function singleValues(segments) {
|
|
|
59
59
|
function offsetCleanStride(stride) {
|
|
60
60
|
return stride.start < stride.interval && 24 % stride.interval === 0;
|
|
61
61
|
}
|
|
62
|
+
function lastTileOf(start, interval, cycle) {
|
|
63
|
+
return cycle - 1 - (cycle - 1 - start) % interval;
|
|
64
|
+
}
|
|
62
65
|
function renderStride(spec, parts) {
|
|
63
|
-
const { start, interval, cycle } = spec;
|
|
64
|
-
const
|
|
65
|
-
|
|
66
|
+
const { start, interval, last, cycle } = spec;
|
|
67
|
+
const open = cycle % interval === 0 && last === lastTileOf(
|
|
68
|
+
start,
|
|
69
|
+
interval,
|
|
70
|
+
cycle
|
|
71
|
+
);
|
|
72
|
+
if (start === 0 && open) {
|
|
66
73
|
return parts.bare();
|
|
67
74
|
}
|
|
68
|
-
if (start < interval &&
|
|
75
|
+
if (start < interval && open) {
|
|
69
76
|
return parts.offset();
|
|
70
77
|
}
|
|
71
78
|
return parts.bounded();
|
|
@@ -834,7 +841,7 @@ var renderers = {
|
|
|
834
841
|
function renderStride2(stride, opts) {
|
|
835
842
|
const { interval, start, last, cycle, unit, anchor } = stride;
|
|
836
843
|
const cadence = "every " + getNumber(interval, opts) + " " + unit + "s";
|
|
837
|
-
return renderStride({ start, interval, cycle }, {
|
|
844
|
+
return renderStride({ start, interval, last, cycle }, {
|
|
838
845
|
bare: () => cadence,
|
|
839
846
|
// A clean wrap from a non-zero offset: name the start, no endpoint.
|
|
840
847
|
offset: () => cadence + " from " + getNumber(start, opts) + " " + pluralize(start, unit) + " past the " + anchor,
|
|
@@ -885,7 +892,7 @@ function stepHours(segment, opts) {
|
|
|
885
892
|
function hourStrideCadence(stride, opts) {
|
|
886
893
|
const { start, interval, last } = stride;
|
|
887
894
|
const cadence = "every " + getNumber(interval, opts) + " hours";
|
|
888
|
-
return renderStride({ start, interval, cycle: 24 }, {
|
|
895
|
+
return renderStride({ start, interval, last, cycle: 24 }, {
|
|
889
896
|
bare: () => cadence,
|
|
890
897
|
offset: () => cadence + " from " + getTime({ hour: start, minute: 0 }, opts),
|
|
891
898
|
bounded: () => cadence + " from " + getTime({ hour: start, minute: 0 }, opts) + through(opts) + getTime({ hour: last, minute: 0 }, opts)
|