cronli5 0.3.1 → 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.
@@ -0,0 +1,1210 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/lang/fr/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ default: () => index_default
24
+ });
25
+ module.exports = __toCommonJS(index_exports);
26
+
27
+ // src/core/format.ts
28
+ function pad(n) {
29
+ n = "" + n;
30
+ return n.length < 2 ? "0" + n : n;
31
+ }
32
+ function numeral(n, words, opts) {
33
+ return opts.short ? n : words[n] || n;
34
+ }
35
+
36
+ // src/core/specs.ts
37
+ var weekdayNumbers = {
38
+ SUN: 0,
39
+ MON: 1,
40
+ TUE: 2,
41
+ WED: 3,
42
+ THU: 4,
43
+ FRI: 5,
44
+ SAT: 6
45
+ };
46
+ var maxClockTimes = 6;
47
+
48
+ // src/core/util.ts
49
+ function isNonNegativeInteger(value) {
50
+ const digits = /^\d+$/;
51
+ return digits.test(value);
52
+ }
53
+ function toFieldNumber(token, numberMap) {
54
+ return isNonNegativeInteger(token) ? +token : numberMap[token.toUpperCase()];
55
+ }
56
+
57
+ // src/core/shapes.ts
58
+ function isOpenStep(field) {
59
+ return field.indexOf("/") !== -1 && field.indexOf("-") === -1 && field.indexOf(",") === -1;
60
+ }
61
+
62
+ // src/core/cadence.ts
63
+ function arithmeticStep(values) {
64
+ if (values.length < 5) {
65
+ return null;
66
+ }
67
+ const interval = values[1] - values[0];
68
+ if (interval < 2) {
69
+ return null;
70
+ }
71
+ for (let i = 2; i < values.length; i += 1) {
72
+ if (values[i] - values[i - 1] !== interval) {
73
+ return null;
74
+ }
75
+ }
76
+ return { start: values[0], interval, last: values[values.length - 1] };
77
+ }
78
+ function segmentsOf(schedule, field) {
79
+ return schedule.analyses.segments[field] ?? [];
80
+ }
81
+ function stepSegment(schedule, field) {
82
+ return segmentsOf(schedule, field)[0];
83
+ }
84
+ function singleValues(segments) {
85
+ const values = [];
86
+ for (const segment of segments) {
87
+ if (segment.kind !== "single") {
88
+ return null;
89
+ }
90
+ values.push(+segment.value);
91
+ }
92
+ return values;
93
+ }
94
+ function offsetCleanStride(stride) {
95
+ return stride.start < stride.interval && 24 % stride.interval === 0;
96
+ }
97
+ function lastTileOf(start, interval, cycle) {
98
+ return cycle - 1 - (cycle - 1 - start) % interval;
99
+ }
100
+ function renderStride(spec, parts) {
101
+ const { start, interval, last, cycle } = spec;
102
+ const open = cycle % interval === 0 && last === lastTileOf(
103
+ start,
104
+ interval,
105
+ cycle
106
+ );
107
+ if (start === 0 && open) {
108
+ return parts.bare();
109
+ }
110
+ if (start < interval && open) {
111
+ return parts.offset();
112
+ }
113
+ return parts.bounded();
114
+ }
115
+ function hourListStride(values) {
116
+ if (values.length < 2) {
117
+ return null;
118
+ }
119
+ const interval = values[1] - values[0];
120
+ if (interval < 2) {
121
+ return null;
122
+ }
123
+ for (let i = 2; i < values.length; i += 1) {
124
+ if (values[i] - values[i - 1] !== interval) {
125
+ return null;
126
+ }
127
+ }
128
+ if (values[0] !== 0 && values.length < 5) {
129
+ return null;
130
+ }
131
+ return { interval, last: values[values.length - 1], start: values[0] };
132
+ }
133
+
134
+ // src/core/weekday.ts
135
+ function weekdayDisplayKey(value) {
136
+ return value === 0 ? 7 : value;
137
+ }
138
+ function orderWeekdaysForDisplay(segments) {
139
+ const flattened = segments.flatMap(function flat(segment) {
140
+ return segment.kind === "step" ? segment.fires.map(function single(value) {
141
+ return { kind: "single", value: "" + value };
142
+ }) : [segment];
143
+ });
144
+ function key(segment) {
145
+ return segment.kind === "range" ? weekdayDisplayKey(+segment.bounds[0]) : weekdayDisplayKey(+segment.value);
146
+ }
147
+ return flattened.map(function index(segment, position) {
148
+ return [segment, position];
149
+ }).sort(function byDisplayKey(a, b) {
150
+ return key(a[0]) - key(b[0]) || a[1] - b[1];
151
+ }).map(function unwrap(pair) {
152
+ return pair[0];
153
+ });
154
+ }
155
+
156
+ // src/lang/fr/dialects.ts
157
+ var fr = {
158
+ sep: "h",
159
+ unspaced: false
160
+ };
161
+ var dialects = {
162
+ fr,
163
+ // France is the default; named explicitly so it is a recognized choice and
164
+ // has a home if it ever diverges.
165
+ "fr-FR": fr
166
+ };
167
+ function resolveDialect(dialect) {
168
+ if (typeof dialect === "object" && dialect !== null) {
169
+ return { ...dialects.fr, ...dialect };
170
+ }
171
+ return dialects[dialect] || dialects.fr;
172
+ }
173
+
174
+ // src/lang/fr/index.ts
175
+ var numeros = [
176
+ "z\xE9ro",
177
+ "un",
178
+ "deux",
179
+ "trois",
180
+ "quatre",
181
+ "cinq",
182
+ "six",
183
+ "sept",
184
+ "huit",
185
+ "neuf",
186
+ "dix"
187
+ ];
188
+ var monthNames = [
189
+ null,
190
+ "janvier",
191
+ "f\xE9vrier",
192
+ "mars",
193
+ "avril",
194
+ "mai",
195
+ "juin",
196
+ "juillet",
197
+ "ao\xFBt",
198
+ "septembre",
199
+ "octobre",
200
+ "novembre",
201
+ "d\xE9cembre"
202
+ ];
203
+ var weekdayNames = [
204
+ "dimanche",
205
+ "lundi",
206
+ "mardi",
207
+ "mercredi",
208
+ "jeudi",
209
+ "vendredi",
210
+ "samedi"
211
+ ];
212
+ var nthWeekdayMasculine = [null, "premier", "deuxi\xE8me", "troisi\xE8me", "quatri\xE8me", "cinqui\xE8me"];
213
+ function normalizeOptions(options) {
214
+ options = options || {};
215
+ const style = resolveDialect(options.dialect);
216
+ return {
217
+ // fr is 24-hour only; `ampm` is accepted and ignored (a documented no-op,
218
+ // notes.md). It is normalized to false so the shared option shape is
219
+ // satisfied without the 12-hour machinery the es donor carried.
220
+ ampm: false,
221
+ lenient: !!options.lenient,
222
+ seconds: !!options.seconds,
223
+ short: !!options.short,
224
+ style,
225
+ years: !!options.years
226
+ };
227
+ }
228
+ function describe(schedule, opts) {
229
+ return applyYear(render(schedule, schedule.plan, opts), schedule, opts);
230
+ }
231
+ function render(schedule, plan, opts) {
232
+ const phrase = renderers[plan.kind](schedule, plan, opts);
233
+ if (!isDateWeekdayUnion(schedule)) {
234
+ return phrase;
235
+ }
236
+ const lead = unionMonthLeadFull(schedule);
237
+ return (lead ? lead + " " : "") + phrase + unionSoitSuffix(schedule, opts);
238
+ }
239
+ function renderEverySecond(schedule, plan, opts) {
240
+ return "chaque seconde" + trailingQualifier(schedule, opts);
241
+ }
242
+ function renderStandaloneSeconds(schedule, plan, opts) {
243
+ return secondsLeadClause(schedule, opts) + trailingQualifier(schedule, opts);
244
+ }
245
+ function renderSecondPastMinute(schedule, plan, opts) {
246
+ return "\xE0 la seconde " + schedule.pattern.second + " de chaque minute" + trailingQualifier(schedule, opts);
247
+ }
248
+ function renderSecondsWithinMinute(schedule, plan, opts) {
249
+ const minuteField = schedule.pattern.minute;
250
+ if (plan.singleSecond) {
251
+ return "\xE0 la minute " + minuteField + " et \xE0 la seconde " + schedule.pattern.second + " de chaque heure" + trailingQualifier(schedule, opts);
252
+ }
253
+ return secondsLeadClause(schedule, opts) + ", \xE0 la minute " + minuteField + " de chaque heure" + trailingQualifier(schedule, opts);
254
+ }
255
+ function secondsListAtClock(schedule, rest, opts) {
256
+ const clockPhrases = rest.times.map(function clock(time) {
257
+ return timePhrase(time.hour, time.minute, null, opts);
258
+ });
259
+ const clockList = joinList(clockPhrases);
260
+ const stride = strideFromSegments(segmentsOf(schedule, "second"), "seconde", "", opts);
261
+ const secondsPhrase = stride ?? "aux secondes " + joinList(segmentWords(segmentsOf(schedule, "second")));
262
+ const dayFrame = trailingQualifier(schedule, opts);
263
+ return (dayFrame ? dayFrame.trimStart() + ", " : "") + secondsPhrase + " de " + clockList;
264
+ }
265
+ function composeHourCadence(schedule, plan, opts) {
266
+ const clockRest = plan.rest.kind === "clockTimes" || plan.rest.kind === "compactClockTimes";
267
+ if (!clockRest || schedule.shapes.minute !== "single") {
268
+ return null;
269
+ }
270
+ const minute = +schedule.pattern.minute;
271
+ return hourCadence(schedule, minute, opts) ?? hourRangeCadence(schedule, minute, opts);
272
+ }
273
+ function isPinnedMinuteSeconds(schedule, plan) {
274
+ return plan.rest.kind === "clockTimes" && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step");
275
+ }
276
+ function renderComposeSeconds(schedule, plan, opts) {
277
+ const hourCad = composeHourCadence(schedule, plan, opts);
278
+ if (hourCad !== null) {
279
+ return hourCad;
280
+ }
281
+ if (isPinnedMinuteSeconds(schedule, plan)) {
282
+ return pinnedMinuteSeconds(schedule, plan.rest, opts);
283
+ }
284
+ if (plan.rest.kind === "clockTimes" && schedule.shapes.second === "list") {
285
+ return secondsListAtClock(schedule, plan.rest, opts);
286
+ }
287
+ if (plan.rest.kind === "hourRange" && schedule.shapes.second === "step" && schedule.pattern.weekday !== "*") {
288
+ const restNode = plan.rest;
289
+ const window = hourWindow(boundedWindow(restNode), opts);
290
+ const dayFrame = weekdayQualifier(schedule) + monthScope(schedule);
291
+ const cadence = "toutes les " + numero(stepSegment(schedule, "second").interval, opts) + " secondes de la minute " + schedule.pattern.minute;
292
+ return dayFrame + ", " + window + ", " + cadence;
293
+ }
294
+ if (isEveryOtherMinuteSeconds(schedule, plan)) {
295
+ return secondsLeadClause(schedule, opts) + " de " + render(schedule, plan.rest, opts).replace(/^toutes les /u, "chaque ");
296
+ }
297
+ const restOwnsLead = plan.rest.kind === "compactClockTimes" && schedule.analyses.clockSecond;
298
+ const lead = restOwnsLead ? "" : secondsLeadClause(schedule, opts) + ", ";
299
+ return lead + render(schedule, plan.rest, opts);
300
+ }
301
+ function isEveryOtherMinuteSeconds(schedule, plan) {
302
+ if (plan.rest.kind !== "minuteFrequency" || schedule.shapes.second !== "wildcard" || schedule.shapes.hour !== "wildcard") {
303
+ return false;
304
+ }
305
+ const minuteStep = stepSegment(schedule, "minute");
306
+ return minuteStep.startToken === "*" && minuteStep.interval === 2;
307
+ }
308
+ function pinnedMinuteSeconds(schedule, rest, opts) {
309
+ const dayTrail = leadingQualifier(schedule, opts).trimEnd();
310
+ const trail = dayTrail ? ", " + dayTrail : "";
311
+ if (+rest.times[0].minute === 0 && schedule.shapes.minute === "single") {
312
+ return secondsLeadClause(schedule, opts) + " pendant une minute " + durationHourList(rest.times, opts) + trail;
313
+ }
314
+ return secondsLeadClause(schedule, opts) + " de " + explicitClockList(rest.times, opts) + trail;
315
+ }
316
+ function secondsLeadClause(schedule, opts) {
317
+ return secondsClause(schedule, "minute", opts);
318
+ }
319
+ function secondsClause(schedule, anchor, opts) {
320
+ const secondField = schedule.pattern.second;
321
+ const shape = schedule.shapes.second;
322
+ if (secondField === "*") {
323
+ return "chaque seconde";
324
+ }
325
+ if (shape === "step") {
326
+ return stepCycle60(
327
+ stepSegment(schedule, "second"),
328
+ "seconde",
329
+ anchor,
330
+ opts
331
+ );
332
+ }
333
+ if (shape === "range") {
334
+ const bounds = secondField.split("-");
335
+ return "chaque seconde de " + bounds[0] + " \xE0 " + bounds[1] + " de chaque " + anchor;
336
+ }
337
+ if (shape === "single") {
338
+ return "\xE0 la seconde " + secondField + " de chaque " + anchor;
339
+ }
340
+ return strideFromSegments(
341
+ segmentsOf(schedule, "second"),
342
+ "seconde",
343
+ anchor,
344
+ opts
345
+ ) ?? "aux secondes " + joinList(segmentWords(segmentsOf(schedule, "second"))) + " de chaque " + anchor;
346
+ }
347
+ function renderEveryMinute(schedule, plan, opts) {
348
+ return "chaque minute" + trailingQualifier(schedule, opts);
349
+ }
350
+ function renderSingleMinute(schedule, plan, opts) {
351
+ return "\xE0 la minute " + schedule.pattern.minute + " de chaque heure" + trailingQualifier(schedule, opts);
352
+ }
353
+ function renderRangeOfMinutes(schedule, plan, opts) {
354
+ return minuteRangeLead(schedule.pattern.minute) + " de chaque heure" + trailingQualifier(schedule, opts);
355
+ }
356
+ function renderMultipleMinutes(schedule, plan, opts) {
357
+ return minutesList(schedule, opts) + trailingQualifier(schedule, opts);
358
+ }
359
+ function minutesList(schedule, opts) {
360
+ return strideFromSegments(
361
+ segmentsOf(schedule, "minute"),
362
+ "minute",
363
+ "heure",
364
+ opts
365
+ ) ?? "aux minutes " + joinList(segmentWords(segmentsOf(schedule, "minute"))) + " de chaque heure";
366
+ }
367
+ function minuteRangeLead(minuteField) {
368
+ const bounds = minuteField.split("-");
369
+ return "chaque minute de " + bounds[0] + " \xE0 " + bounds[1];
370
+ }
371
+ function singleHourStep(segments) {
372
+ return segments !== null && segments.length === 1 && segments[0].kind === "step";
373
+ }
374
+ function stepHourSpan(segment, opts) {
375
+ const bounded = segment.startToken.indexOf("-") !== -1;
376
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
377
+ if (segment.interval === 2 && !bounded && start <= 1) {
378
+ return start === 0 ? "pendant les heures paires" : "pendant les heures impaires";
379
+ }
380
+ return "pendant les heures " + hourSpanList(segment.fires, opts);
381
+ }
382
+ function hourSpanList(fires, opts) {
383
+ return "de " + joinList(fires.map(function each(hour) {
384
+ return clockNumeric(hour, 0, null, opts);
385
+ }));
386
+ }
387
+ function renderMinuteFrequency(schedule, plan, opts) {
388
+ let phrase = stepCycle60(
389
+ stepSegment(schedule, "minute"),
390
+ "minute",
391
+ "heure",
392
+ opts
393
+ );
394
+ if (plan.hours.kind === "during") {
395
+ const cadence = unevenHourCadence(schedule, opts);
396
+ if (cadence) {
397
+ phrase += ", " + cadence;
398
+ } else {
399
+ phrase += singleHourStep(schedule.analyses.segments.hour) ? ", " + stepHourSpan(stepSegment(schedule, "hour"), opts) : " " + hourSpanFromTimes(schedule, plan.hours.times, opts);
400
+ }
401
+ } else if (plan.hours.kind === "window") {
402
+ phrase += " " + hourWindow(plan.hours, opts);
403
+ } else if (plan.hours.kind === "step") {
404
+ phrase += ", " + stepHourSpan(stepSegment(schedule, "hour"), opts);
405
+ }
406
+ return phrase + trailingQualifier(schedule, opts);
407
+ }
408
+ function renderMinuteSpanInHour(schedule, plan, opts) {
409
+ if (schedule.pattern.minute === "*") {
410
+ return "chaque minute de l'heure " + fromTime(timePhrase(plan.hour, 0, null, opts)) + trailingQualifier(schedule, opts);
411
+ }
412
+ return "chaque minute " + timeRange(
413
+ { hour: plan.hour, minute: plan.span[0] },
414
+ { hour: plan.hour, minute: plan.span[1] },
415
+ opts
416
+ ) + trailingQualifier(schedule, opts);
417
+ }
418
+ function renderMinutesAcrossHours(schedule, plan, opts) {
419
+ const cadence = unevenHourCadence(schedule, opts);
420
+ if (plan.form === "wildcard") {
421
+ if (cadence !== null) {
422
+ return "chaque minute, " + cadence + trailingQualifier(schedule, opts);
423
+ }
424
+ if (singleHourStep(schedule.analyses.segments.hour)) {
425
+ return "chaque minute, " + stepHourSpan(stepSegment(schedule, "hour"), opts) + trailingQualifier(schedule, opts);
426
+ }
427
+ return "chaque minute " + hourSpanFromTimes(schedule, plan.times, opts) + trailingQualifier(schedule, opts);
428
+ }
429
+ const lead = plan.form === "range" ? minuteRangeLead(schedule.pattern.minute) : minutesList(schedule, opts);
430
+ if (cadence !== null) {
431
+ return lead + ", " + cadence + trailingQualifier(schedule, opts);
432
+ }
433
+ return lead + ", " + atHourTimes(schedule, plan.times, opts) + trailingQualifier(schedule, opts);
434
+ }
435
+ function renderMinuteSpanAcrossHourStep(schedule, plan, opts) {
436
+ const segment = stepSegment(schedule, "hour");
437
+ const cadence = unevenHourCadence(schedule, opts);
438
+ if (plan.form === "wildcard") {
439
+ return "chaque minute, " + stepHourSpan(segment, opts) + trailingQualifier(schedule, opts);
440
+ }
441
+ const lead = plan.form === "list" ? minutesList(schedule, opts) : minuteRangeLead(schedule.pattern.minute);
442
+ return lead + ", " + (cadence ?? stepHours(segment, opts)) + trailingQualifier(schedule, opts);
443
+ }
444
+ function renderEveryHour(schedule, plan, opts) {
445
+ return "chaque heure" + trailingQualifier(schedule, opts);
446
+ }
447
+ function renderHourRange(schedule, plan, opts) {
448
+ const window = hourWindow(boundedWindow(plan), opts);
449
+ if (plan.minuteForm === "wildcard") {
450
+ return "chaque minute " + window + trailingQualifier(schedule, opts);
451
+ }
452
+ if (plan.minuteForm === "range") {
453
+ return minuteRangeLead(schedule.pattern.minute) + ", " + window + trailingQualifier(schedule, opts);
454
+ }
455
+ if (schedule.pattern.minute === "0") {
456
+ return "chaque heure " + window + trailingQualifier(schedule, opts);
457
+ }
458
+ const lead = schedule.shapes.minute === "single" ? "\xE0 la minute " + schedule.pattern.minute + " de chaque heure" : minutesList(schedule, opts);
459
+ return lead + ", " + window + trailingQualifier(schedule, opts);
460
+ }
461
+ function renderHourStep(schedule, plan, opts) {
462
+ const cadence = unevenHourCadence(schedule, opts);
463
+ if (cadence !== null) {
464
+ return cadence + trailingQualifier(schedule, opts);
465
+ }
466
+ return stepHours(stepSegment(schedule, "hour"), opts) + trailingQualifier(schedule, opts);
467
+ }
468
+ function boundedWindow(plan) {
469
+ const last = plan.minuteForm === "wildcard" ? plan.boundMinute ?? 0 : 0;
470
+ return { from: plan.from, last, to: plan.to };
471
+ }
472
+ function hourWindow(window, opts) {
473
+ return timeRange(
474
+ { hour: window.from, minute: 0 },
475
+ { hour: window.to, minute: window.last },
476
+ opts
477
+ );
478
+ }
479
+ function isDateWeekdayUnion(schedule) {
480
+ return schedule.pattern.date !== "*" && schedule.pattern.weekday !== "*";
481
+ }
482
+ function unionMonthLeadFull(schedule) {
483
+ if (schedule.pattern.month === "*") {
484
+ return "";
485
+ }
486
+ const lead = monthPhrase(schedule, monthRanged(schedule) ? "de " : "en ");
487
+ const segments = flattenSteps(segmentsOf(schedule, "month"));
488
+ const isEnumeration = !monthRanged(schedule) && segments.length >= 2;
489
+ return isEnumeration ? lead + "," : lead;
490
+ }
491
+ function domArm(schedule, opts) {
492
+ const date = schedule.pattern.date;
493
+ const quartz = quartzDatePhrase(date);
494
+ if (quartz) {
495
+ return quartz;
496
+ }
497
+ const parity = parityDayPredicate(date);
498
+ if (parity) {
499
+ return parity;
500
+ }
501
+ if (isOpenStep(date)) {
502
+ return stepDates(date, opts);
503
+ }
504
+ const segments = segmentsOf(schedule, "date");
505
+ if (segments.length === 1 && segments[0].kind === "range") {
506
+ return "du " + dayOrdinal(segments[0].bounds[0]) + " au " + segments[0].bounds[1] + " du mois";
507
+ }
508
+ if (segments.length === 1 && segments[0].kind === "single") {
509
+ return schedule.pattern.month === "*" ? "le " + dayOrdinal(segments[0].value) + " de chaque mois" : "le " + dayOrdinal(segments[0].value);
510
+ }
511
+ return joinList(dateWords(segments)) + " du mois";
512
+ }
513
+ function dowArm(schedule) {
514
+ const quartz = quartzWeekdayPhrase(schedule.pattern.weekday);
515
+ if (quartz) {
516
+ return quartz;
517
+ }
518
+ const segments = orderWeekdaysForDisplay(segmentsOf(schedule, "weekday"));
519
+ const allSingles = segments.every(function single(segment) {
520
+ return segment.kind === "single";
521
+ });
522
+ if (allSingles && segments.length === 1) {
523
+ return "n'importe quel " + weekdayName(segments[0].value);
524
+ }
525
+ if (allSingles) {
526
+ return recurringWeekdayList(segments);
527
+ }
528
+ if (segments.length === 1) {
529
+ return "n'importe quel jour " + weekdayRange(segments[0]);
530
+ }
531
+ return mixedWeekdayList(segments);
532
+ }
533
+ function unionSoitSuffix(schedule, opts) {
534
+ return ", soit " + domArm(schedule, opts) + ", soit " + dowArm(schedule);
535
+ }
536
+ function renderClockTimes(schedule, plan, opts) {
537
+ if (schedule.shapes.minute === "single") {
538
+ const minute = +schedule.pattern.minute;
539
+ const cadence = hourCadence(schedule, minute, opts) ?? hourRangeCadence(schedule, minute, opts);
540
+ if (cadence !== null) {
541
+ return cadence;
542
+ }
543
+ }
544
+ const phrases = plan.times.map(function clock(time) {
545
+ return atTime(timePhrase(time.hour, time.minute, time.second, opts));
546
+ });
547
+ return leadingQualifier(schedule, opts) + groupClockTimes(phrases);
548
+ }
549
+ function explicitClockList(times, opts) {
550
+ const phrases = times.map(function clock(time) {
551
+ return atTime(explicitTimePhrase(time.hour, time.minute, opts));
552
+ });
553
+ const grouped = groupClockTimes(phrases);
554
+ return grouped.startsWith("\xE0 ") ? grouped.slice(2) : grouped;
555
+ }
556
+ function durationHourList(times, opts) {
557
+ const phrases = times.map(function clock(time) {
558
+ return atTime(barePoint(time.hour, opts));
559
+ });
560
+ return groupClockTimes(phrases);
561
+ }
562
+ function explicitTimePhrase(hour, minute, opts) {
563
+ return clockNumeric(hour, minute, null, opts);
564
+ }
565
+ function groupClockTimes(phrases) {
566
+ if (phrases.length < 2) {
567
+ return joinList(phrases);
568
+ }
569
+ return groupClockTimesByArticle(phrases);
570
+ }
571
+ function groupClockTimesByArticle(phrases) {
572
+ const prefix = "\xE0 ";
573
+ const oneOclock = [];
574
+ const rest = [];
575
+ for (const phrase of phrases) {
576
+ if (!phrase.startsWith(prefix)) {
577
+ return joinList(phrases);
578
+ }
579
+ const raw = phrase.slice(prefix.length);
580
+ const value = phrases.length > 1 && raw === "midi" ? "12 h" : raw;
581
+ if (/^1( |h)/u.test(value)) {
582
+ oneOclock.push(value);
583
+ } else {
584
+ rest.push(value);
585
+ }
586
+ }
587
+ return prefix + joinList([...oneOclock, ...rest]);
588
+ }
589
+ function renderCompactClockTimes(schedule, plan, opts) {
590
+ if (plan.fold) {
591
+ const cadence2 = hourCadence(schedule, plan.minute, opts) ?? hourRangeCadence(schedule, plan.minute, opts);
592
+ if (cadence2 !== null) {
593
+ return cadence2;
594
+ }
595
+ const ranged = segmentsOf(schedule, "hour").some(function range(segment) {
596
+ return segment.kind === "range";
597
+ });
598
+ if (ranged && !schedule.analyses.clockSecond) {
599
+ return "chaque heure " + hourSegmentTimes(
600
+ schedule,
601
+ plan.minute,
602
+ schedule.analyses.clockSecond,
603
+ opts
604
+ ) + trailingQualifier(schedule, opts);
605
+ }
606
+ return leadingQualifier(schedule, opts) + hourSegmentTimes(
607
+ schedule,
608
+ plan.minute,
609
+ schedule.analyses.clockSecond,
610
+ opts
611
+ );
612
+ }
613
+ const cadence = unevenHourCadence(schedule, opts);
614
+ const phrase = cadence ? minutesList(schedule, opts) + ", " + cadence + trailingQualifier(schedule, opts) : minutesList(schedule, opts) + ", " + hourContextTimes(schedule, opts) + trailingQualifier(schedule, opts);
615
+ return schedule.analyses.clockSecond ? secondsLeadClause(schedule, opts) + ", " + phrase : phrase;
616
+ }
617
+ var renderers = {
618
+ clockTimes: renderClockTimes,
619
+ compactClockTimes: renderCompactClockTimes,
620
+ composeSeconds: renderComposeSeconds,
621
+ everyHour: renderEveryHour,
622
+ everyMinute: renderEveryMinute,
623
+ everySecond: renderEverySecond,
624
+ hourRange: renderHourRange,
625
+ hourStep: renderHourStep,
626
+ minuteFrequency: renderMinuteFrequency,
627
+ minuteSpanAcrossHourStep: renderMinuteSpanAcrossHourStep,
628
+ minuteSpanInHour: renderMinuteSpanInHour,
629
+ minutesAcrossHours: renderMinutesAcrossHours,
630
+ multipleMinutes: renderMultipleMinutes,
631
+ rangeOfMinutes: renderRangeOfMinutes,
632
+ secondPastMinute: renderSecondPastMinute,
633
+ secondsWithinMinute: renderSecondsWithinMinute,
634
+ singleMinute: renderSingleMinute,
635
+ standaloneSeconds: renderStandaloneSeconds
636
+ };
637
+ function renderStride2(stride, opts) {
638
+ const { interval, start, last, cycle, unit, anchor } = stride;
639
+ const cadence = "toutes les " + numero(interval, opts) + " " + unit + "s";
640
+ const tail = anchor ? " de chaque " + anchor : "";
641
+ return renderStride({ start, interval, last, cycle }, {
642
+ bare: () => cadence,
643
+ offset: () => cadence + " \xE0 partir de la " + unit + " " + start + tail,
644
+ bounded: () => cadence + " de la " + unit + " " + start + " \xE0 " + last + tail
645
+ });
646
+ }
647
+ function stepCycle60(segment, unit, anchor, opts) {
648
+ if (segment.startToken.indexOf("-") !== -1) {
649
+ return "aux " + unit + "s " + joinList(wordList(segment.fires)) + " de chaque " + anchor;
650
+ }
651
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
652
+ if (start !== 0 && segment.fires.length <= 3) {
653
+ return "aux " + unit + "s " + joinList(wordList(segment.fires)) + " de chaque " + anchor;
654
+ }
655
+ return renderStride2({
656
+ interval: segment.interval,
657
+ start,
658
+ last: segment.fires[segment.fires.length - 1],
659
+ cycle: 60,
660
+ unit,
661
+ anchor
662
+ }, opts);
663
+ }
664
+ function strideFromSegments(segments, unit, anchor, opts) {
665
+ const values = singleValues(segments);
666
+ const step = values && arithmeticStep(values);
667
+ return step ? renderStride2({ ...step, cycle: 60, unit, anchor }, opts) : null;
668
+ }
669
+ function stepHours(segment, opts) {
670
+ if (segment.startToken.indexOf("-") !== -1) {
671
+ return groupClockTimesByArticle(atTimes(segment.fires, opts));
672
+ }
673
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
674
+ const interval = segment.interval;
675
+ if (start === 0) {
676
+ return "toutes les " + numero(interval, opts) + " heures";
677
+ }
678
+ if (segment.fires.length <= 3) {
679
+ return groupClockTimesByArticle(atTimes(segment.fires, opts));
680
+ }
681
+ return "toutes les " + numero(interval, opts) + " heures \xE0 partir de " + timePhrase(start, 0, null, opts);
682
+ }
683
+ function hourStrideCadence(stride, opts) {
684
+ const { start, interval, last } = stride;
685
+ const cadence = "toutes les " + numero(interval, opts) + " heures";
686
+ return renderStride({ start, interval, last, cycle: 24 }, {
687
+ bare: () => cadence,
688
+ offset: () => cadence + " \xE0 partir de " + timePhrase(start, 0, null, opts),
689
+ bounded: () => cadence + " " + fromTime(timePhrase(start, 0, null, opts)) + " " + toTime(timePhrase(last, 0, null, opts))
690
+ });
691
+ }
692
+ function unevenHourCadence(schedule, opts) {
693
+ const stride = hourStride(schedule);
694
+ if (!stride || offsetCleanStride(stride)) {
695
+ return null;
696
+ }
697
+ return hourStrideCadence(stride, opts);
698
+ }
699
+ function hourStride(schedule) {
700
+ const segments = segmentsOf(schedule, "hour");
701
+ if (segments.length === 1 && segments[0].kind === "step") {
702
+ const segment = segments[0];
703
+ if (segment.fires.length < 2) {
704
+ return null;
705
+ }
706
+ const start = segment.startToken === "*" ? 0 : +segment.startToken.split("-")[0];
707
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
708
+ }
709
+ const values = singleValues(segments);
710
+ return values && hourListStride(values);
711
+ }
712
+ function subMinuteSecond(schedule) {
713
+ return schedule.pattern.second === "*" || schedule.shapes.second === "step";
714
+ }
715
+ function hourCadenceLead(schedule, minute, opts) {
716
+ if (minute === 0) {
717
+ if (subMinuteSecond(schedule)) {
718
+ return secondsClause(schedule, "minute", opts) + " pendant une minute";
719
+ }
720
+ return secondsClause(schedule, "heure", opts);
721
+ }
722
+ const minutePhrase = "\xE0 la minute " + minute;
723
+ if (schedule.pattern.second === "0") {
724
+ return minutePhrase;
725
+ }
726
+ return secondsClause(schedule, "minute", opts) + ", " + minutePhrase;
727
+ }
728
+ function hourCadence(schedule, minute, opts) {
729
+ const stride = hourStride(schedule);
730
+ if (!stride) {
731
+ return null;
732
+ }
733
+ const fires = (stride.last - stride.start) / stride.interval + 1;
734
+ if (schedule.pattern.second === "0" && fires <= maxClockTimes && offsetCleanStride(stride)) {
735
+ return null;
736
+ }
737
+ const confinement = minute === 0 && subMinuteSecond(schedule) && cleanStrideSegment(schedule);
738
+ if (confinement) {
739
+ return secondsClause(schedule, "minute", opts) + " pendant une minute, " + stepHourSpan(confinement, opts) + trailingQualifier(schedule, opts);
740
+ }
741
+ if (minute === 0 && schedule.pattern.second === "0") {
742
+ return hourStrideCadence(stride, opts) + trailingQualifier(schedule, opts);
743
+ }
744
+ return hourCadenceLead(schedule, minute, opts) + ", " + hourStrideCadence(stride, opts) + trailingQualifier(schedule, opts);
745
+ }
746
+ function cleanStrideSegment(schedule) {
747
+ const segments = segmentsOf(schedule, "hour");
748
+ const segment = segments.length === 1 && segments[0];
749
+ if (!segment || segment.kind !== "step" || segment.startToken.indexOf("-") !== -1) {
750
+ return null;
751
+ }
752
+ return segment;
753
+ }
754
+ function hasHourWindow(schedule) {
755
+ return segmentsOf(schedule, "hour").some(function range(segment) {
756
+ return segment.kind === "range";
757
+ });
758
+ }
759
+ function hourRangeCadence(schedule, minute, opts) {
760
+ if (minute !== 0 || !hasHourWindow(schedule) || schedule.pattern.second === "0") {
761
+ return null;
762
+ }
763
+ if (subMinuteSecond(schedule)) {
764
+ return secondsClause(schedule, "minute", opts) + " pendant une minute, pendant les heures " + hourSegmentTimes(schedule, 0, null, opts) + trailingQualifier(schedule, opts);
765
+ }
766
+ return hourCadenceLead(schedule, minute, opts) + ", " + hourSegmentTimes(schedule, 0, null, opts) + trailingQualifier(schedule, opts);
767
+ }
768
+ function hourContextTimes(schedule, opts) {
769
+ const segments = segmentsOf(schedule, "hour");
770
+ const points = [];
771
+ const hasRange = segments.some(function range(segment) {
772
+ return segment.kind === "range";
773
+ });
774
+ segments.forEach(function collect(segment) {
775
+ if (segment.kind === "step") {
776
+ points.push(...segment.fires);
777
+ } else if (segment.kind === "single") {
778
+ points.push(+segment.value);
779
+ }
780
+ });
781
+ function isWord(hour) {
782
+ return hour === 0 || hour === 12;
783
+ }
784
+ if (!hasRange && points.every(isWord)) {
785
+ return joinList(points.map(function each(hour) {
786
+ return atTime(barePoint(hour, opts));
787
+ }));
788
+ }
789
+ function wholeHour(hour) {
790
+ return "de l'heure " + fromTime(barePoint(hour, opts));
791
+ }
792
+ const pieces = [];
793
+ segments.forEach(function place(segment) {
794
+ if (segment.kind === "range") {
795
+ pieces.push(timeRange(
796
+ { hour: +segment.bounds[0], minute: 0 },
797
+ { hour: +segment.bounds[1], minute: 0 },
798
+ opts
799
+ ));
800
+ } else if (segment.kind === "step") {
801
+ segment.fires.forEach(function each(hour) {
802
+ pieces.push(wholeHour(hour));
803
+ });
804
+ } else {
805
+ pieces.push(wholeHour(+segment.value));
806
+ }
807
+ });
808
+ return joinList(pieces);
809
+ }
810
+ function atTimes(hours, opts) {
811
+ return hours.map(function each(hour) {
812
+ return atTime(timePhrase(hour, 0, null, opts));
813
+ });
814
+ }
815
+ function atHourTimes(schedule, times, opts) {
816
+ if (times.kind === "fires") {
817
+ return groupClockTimesByArticle(atTimes(times.fires, opts));
818
+ }
819
+ return hourSegmentTimes(schedule, 0, null, opts);
820
+ }
821
+ function hourSpanFromTimes(schedule, times, opts) {
822
+ if (times.kind === "fires" && times.fires.length > 3) {
823
+ return "pendant les heures " + hourSpanList(times.fires, opts);
824
+ }
825
+ return hourWindowsFromTimes(schedule, times, opts);
826
+ }
827
+ function hourWindowsFromTimes(schedule, times, opts) {
828
+ if (times.kind === "fires") {
829
+ return joinList(times.fires.map(function window(hour) {
830
+ return hourAsWindow(hour, opts);
831
+ }));
832
+ }
833
+ return joinList(segmentsOf(schedule, "hour").map(function window(segment) {
834
+ if (segment.kind === "range") {
835
+ return timeRange(
836
+ { hour: +segment.bounds[0], minute: 0 },
837
+ { hour: +segment.bounds[1], minute: 59 },
838
+ opts
839
+ );
840
+ }
841
+ if (segment.kind === "step") {
842
+ return joinList(segment.fires.map(function each(hour) {
843
+ return hourAsWindow(hour, opts);
844
+ }));
845
+ }
846
+ return hourAsWindow(+segment.value, opts);
847
+ }));
848
+ }
849
+ function hourSegmentTimes(schedule, minute, second, opts) {
850
+ const pieces = [];
851
+ const fromRange = [];
852
+ segmentsOf(schedule, "hour").forEach(function clock(segment) {
853
+ if (segment.kind === "step") {
854
+ segment.fires.forEach(function each(hour) {
855
+ pieces.push(atTime(timePhrase(hour, minute, second, opts)));
856
+ fromRange.push(false);
857
+ });
858
+ } else if (segment.kind === "range") {
859
+ pieces.push(timeRange(
860
+ { hour: +segment.bounds[0], minute, second },
861
+ { hour: +segment.bounds[1], minute, second },
862
+ opts
863
+ ));
864
+ fromRange.push(true);
865
+ } else {
866
+ pieces.push(atTime(timePhrase(+segment.value, minute, second, opts)));
867
+ fromRange.push(false);
868
+ }
869
+ });
870
+ const lastIdx = pieces.length - 1;
871
+ const hasRange = fromRange.some(function ranged(r) {
872
+ return r;
873
+ });
874
+ const lastIsPoint = lastIdx >= 1 && !fromRange[lastIdx] && fromRange[lastIdx - 1];
875
+ if (hasRange && lastIsPoint) {
876
+ return joinList(pieces.slice(0, lastIdx)) + " et aussi " + pieces[lastIdx];
877
+ }
878
+ return groupClockTimesByArticle(pieces);
879
+ }
880
+ function timeRange(from, to, opts) {
881
+ if (from.hour === to.hour) {
882
+ return fromTime(clockNumeric(from.hour, from.minute, from.second, opts)) + " " + toTime(clockNumeric(to.hour, to.minute, to.second, opts));
883
+ }
884
+ const fromPhrase = timePhrase(from.hour, from.minute, from.second, opts);
885
+ const toPhrase = timePhrase(to.hour, to.minute, to.second, opts);
886
+ return fromTime(fromPhrase) + " " + toTime(toPhrase);
887
+ }
888
+ function hourAsWindow(hour, opts) {
889
+ return timeRange({ hour, minute: 0 }, { hour, minute: 59 }, opts);
890
+ }
891
+ function atTime(phrase) {
892
+ return "\xE0 " + phrase;
893
+ }
894
+ function fromTime(phrase) {
895
+ return "de " + phrase;
896
+ }
897
+ function toTime(phrase) {
898
+ return atTime(phrase);
899
+ }
900
+ function timePhrase(hour, minute, second, opts) {
901
+ const showSeconds = typeof second === "number" && second > 0 ? second : 0;
902
+ if (!showSeconds && +minute === 0) {
903
+ if (+hour === 0) {
904
+ return "minuit";
905
+ }
906
+ if (+hour === 12) {
907
+ return "midi";
908
+ }
909
+ }
910
+ return clockNumeric(hour, minute, showSeconds, opts);
911
+ }
912
+ function barePoint(hour, opts) {
913
+ if (+hour === 0) {
914
+ return "minuit";
915
+ }
916
+ if (+hour === 12) {
917
+ return "midi";
918
+ }
919
+ return clockNumeric(hour, 0, null, opts);
920
+ }
921
+ function clockNumeric(hour, minute, second, opts) {
922
+ const showSeconds = typeof second === "number" && second > 0 ? second : 0;
923
+ if (opts.style.sep !== "h") {
924
+ const base = hour + opts.style.sep + pad(minute);
925
+ return showSeconds ? base + opts.style.sep + pad(showSeconds) : base;
926
+ }
927
+ const space = opts.style.unspaced ? "" : " ";
928
+ const hourPart = hour + space + "h";
929
+ if (showSeconds) {
930
+ const minutePart = minute ? space + minute + space + "min" : "";
931
+ return hourPart + minutePart + space + showSeconds + space + "s";
932
+ }
933
+ return minute ? hourPart + space + minute : hourPart;
934
+ }
935
+ function leadingQualifier(schedule, opts) {
936
+ const pattern = schedule.pattern;
937
+ if (pattern.date !== "*" && pattern.weekday !== "*") {
938
+ return "";
939
+ }
940
+ if (pattern.date !== "*") {
941
+ return datePhrase(schedule, opts) + " ";
942
+ }
943
+ if (pattern.weekday !== "*") {
944
+ return weekdayQualifier(schedule) + monthScope(schedule) + " ";
945
+ }
946
+ if (pattern.month !== "*") {
947
+ return "tous les jours " + monthPhrase(schedule, "de ") + " ";
948
+ }
949
+ return "tous les jours ";
950
+ }
951
+ function trailingQualifier(schedule, opts) {
952
+ const pattern = schedule.pattern;
953
+ if (pattern.date !== "*" && pattern.weekday !== "*") {
954
+ return "";
955
+ }
956
+ if (pattern.date !== "*") {
957
+ return " " + datePhrase(schedule, opts);
958
+ }
959
+ if (pattern.weekday !== "*") {
960
+ return " " + weekdayQualifier(schedule) + monthScope(schedule);
961
+ }
962
+ if (pattern.month !== "*") {
963
+ return " " + monthPhrase(schedule, "en ");
964
+ }
965
+ return "";
966
+ }
967
+ function datePhrase(schedule, opts) {
968
+ const pattern = schedule.pattern;
969
+ if (quartzDatePhrase(pattern.date) || isOpenStep(pattern.date)) {
970
+ return dateClause(schedule, "", opts) + monthScope(schedule);
971
+ }
972
+ return dateClause(schedule, dateMonthPart(schedule), opts);
973
+ }
974
+ function dateClause(schedule, monthPart, opts) {
975
+ const pattern = schedule.pattern;
976
+ const quartz = quartzDatePhrase(pattern.date);
977
+ if (quartz) {
978
+ return quartz;
979
+ }
980
+ if (isOpenStep(pattern.date)) {
981
+ return stepDates(pattern.date, opts);
982
+ }
983
+ const segments = segmentsOf(schedule, "date");
984
+ if (segments.length === 1 && segments[0].kind === "range") {
985
+ return "du " + dayOrdinal(segments[0].bounds[0]) + " au " + segments[0].bounds[1] + monthPart + foldedYear(schedule);
986
+ }
987
+ if (segments.length === 1 && segments[0].kind === "single") {
988
+ return "le " + dayOrdinal(segments[0].value) + monthPart + foldedYear(schedule);
989
+ }
990
+ return joinList(dateWords(segments)) + monthPart + foldedYear(schedule);
991
+ }
992
+ function monthRanged(schedule) {
993
+ return schedule.pattern.month !== "*" && segmentsOf(schedule, "month").some(function range(segment) {
994
+ return segment.kind === "range";
995
+ });
996
+ }
997
+ function dateMonthPart(schedule) {
998
+ if (schedule.pattern.month === "*") {
999
+ return " de chaque mois";
1000
+ }
1001
+ if (monthRanged(schedule)) {
1002
+ return " de chaque mois, " + monthPhrase(schedule, "de ");
1003
+ }
1004
+ return " " + monthPhrase(schedule, "");
1005
+ }
1006
+ function foldedYear(schedule) {
1007
+ const yearField = schedule.pattern.year;
1008
+ if (yearField === "*" || yearField.indexOf("/") !== -1 || yearField.indexOf("-") !== -1 || yearField.indexOf(",") !== -1) {
1009
+ return "";
1010
+ }
1011
+ return " " + yearField;
1012
+ }
1013
+ function quartzDatePhrase(dateField) {
1014
+ if (dateField === "L") {
1015
+ return "le dernier jour du mois";
1016
+ }
1017
+ if (dateField === "LW" || dateField === "WL") {
1018
+ return "le dernier jour ouvrable du mois";
1019
+ }
1020
+ const offset = /^L-(\d{1,2})$/.exec(dateField);
1021
+ if (offset) {
1022
+ return +offset[1] === 1 ? "un jour avant le dernier jour du mois" : offset[1] + " jours avant le dernier jour du mois";
1023
+ }
1024
+ const nearest = /^(\d{1,2})W$|^W(\d{1,2})$/.exec(dateField);
1025
+ if (nearest) {
1026
+ return "le jour ouvrable le plus proche du " + (nearest[1] || nearest[2]);
1027
+ }
1028
+ }
1029
+ function quartzWeekdayPhrase(weekdayField) {
1030
+ const parts = weekdayField.split("#");
1031
+ if (parts.length === 2) {
1032
+ return "le " + nthWeekdayMasculine[+parts[1]] + " " + weekdayName(parts[0]) + " du mois";
1033
+ }
1034
+ if (/L$/.test(weekdayField)) {
1035
+ return "le dernier " + weekdayName(weekdayField.slice(0, -1)) + " du mois";
1036
+ }
1037
+ }
1038
+ function weekdayQualifier(schedule) {
1039
+ const quartz = quartzWeekdayPhrase(schedule.pattern.weekday);
1040
+ if (quartz) {
1041
+ return quartz;
1042
+ }
1043
+ const segments = orderWeekdaysForDisplay(segmentsOf(schedule, "weekday"));
1044
+ const allSingles = segments.every(function single(segment) {
1045
+ return segment.kind === "single";
1046
+ });
1047
+ if (allSingles) {
1048
+ return recurringWeekdayList(segments);
1049
+ }
1050
+ if (segments.length === 1) {
1051
+ return weekdayRange(segments[0]);
1052
+ }
1053
+ return mixedWeekdayList(segments);
1054
+ }
1055
+ function recurringWeekdayList(segments) {
1056
+ return joinList(segments.map(function name(segment) {
1057
+ return "le " + weekdayName(segment.value);
1058
+ }));
1059
+ }
1060
+ function mixedWeekdayList(segments) {
1061
+ return joinList(segments.map(function name(segment) {
1062
+ return segment.kind === "range" ? weekdayRange(segment) : "le " + weekdayName(segment.value);
1063
+ }));
1064
+ }
1065
+ function weekdayRange(segment) {
1066
+ return "du " + weekdayName(segment.bounds[0]) + " au " + weekdayName(segment.bounds[1]);
1067
+ }
1068
+ function flattenSteps(segments) {
1069
+ return segments.flatMap(function flat(segment) {
1070
+ return segment.kind === "step" ? segment.fires.map(function single(value) {
1071
+ return { kind: "single", value };
1072
+ }) : [segment];
1073
+ });
1074
+ }
1075
+ function monthPhrase(schedule, lead) {
1076
+ const segments = flattenSteps(segmentsOf(schedule, "month"));
1077
+ const ranged = segments.some(function range(segment) {
1078
+ return segment.kind === "range";
1079
+ });
1080
+ if (!ranged) {
1081
+ return lead + joinList(segments.map(function name(segment) {
1082
+ return monthName(segment.value);
1083
+ }));
1084
+ }
1085
+ return joinList(segments.map(function name(segment) {
1086
+ if (segment.kind === "range") {
1087
+ return "de " + monthName(segment.bounds[0]) + " \xE0 " + monthName(segment.bounds[1]);
1088
+ }
1089
+ return lead + monthName(segment.value);
1090
+ }));
1091
+ }
1092
+ function monthScope(schedule) {
1093
+ if (schedule.pattern.month === "*") {
1094
+ return "";
1095
+ }
1096
+ return (monthRanged(schedule) ? ", " : " ") + monthPhrase(schedule, "de ");
1097
+ }
1098
+ function parityDayPredicate(dateField) {
1099
+ if (!isOpenStep(dateField)) {
1100
+ return;
1101
+ }
1102
+ const [start, step] = dateField.split("/");
1103
+ if (+step !== 2) {
1104
+ return;
1105
+ }
1106
+ if (start === "*" || start === "1") {
1107
+ return "un jour impair du mois";
1108
+ }
1109
+ if (start === "2") {
1110
+ return "un jour pair du mois";
1111
+ }
1112
+ }
1113
+ function stepDates(dateField, opts) {
1114
+ const parts = dateField.split("/");
1115
+ let phrase = "tous les " + numero(+parts[1], opts) + " jours du mois";
1116
+ if (parts[0] !== "*" && parts[0] !== "1") {
1117
+ phrase += " \xE0 partir du " + parts[0];
1118
+ }
1119
+ return phrase;
1120
+ }
1121
+ function applyYear(description, schedule, opts) {
1122
+ const yearField = schedule.pattern.year;
1123
+ if (yearField === "*") {
1124
+ return description;
1125
+ }
1126
+ if (yearField.indexOf("/") !== -1) {
1127
+ return description + " " + stepYears(yearField, opts);
1128
+ }
1129
+ if (foldedYear(schedule) && schedule.pattern.date !== "*") {
1130
+ return description;
1131
+ }
1132
+ if (yearField.indexOf(",") !== -1) {
1133
+ return description + " en " + joinList(yearField.split(","));
1134
+ }
1135
+ return description + " en " + yearField;
1136
+ }
1137
+ function stepYears(yearField, opts) {
1138
+ const parts = yearField.split("/");
1139
+ const interval = +parts[1];
1140
+ if (interval <= 1) {
1141
+ return "chaque ann\xE9e";
1142
+ }
1143
+ let phrase = "tous les " + numero(interval, opts) + " ans";
1144
+ if (parts[0] !== "*" && parts[0] !== "0") {
1145
+ phrase += " \xE0 partir de " + parts[0];
1146
+ }
1147
+ return phrase;
1148
+ }
1149
+ function segmentWords(segments) {
1150
+ return segments.flatMap(function word(segment) {
1151
+ if (segment.kind === "range") {
1152
+ return [segment.bounds[0] + " \xE0 " + segment.bounds[1]];
1153
+ }
1154
+ if (segment.kind === "step") {
1155
+ return wordList(segment.fires);
1156
+ }
1157
+ return [segment.value];
1158
+ });
1159
+ }
1160
+ function dateWords(segments) {
1161
+ return segments.flatMap(function word(segment) {
1162
+ if (segment.kind === "range") {
1163
+ return ["du " + dayOrdinal(segment.bounds[0]) + " au " + segment.bounds[1]];
1164
+ }
1165
+ if (segment.kind === "step") {
1166
+ return segment.fires.map(function fire(value) {
1167
+ return "le " + dayOrdinal(value);
1168
+ });
1169
+ }
1170
+ return ["le " + dayOrdinal(segment.value)];
1171
+ });
1172
+ }
1173
+ function dayOrdinal(value) {
1174
+ return +value === 1 ? "1er" : "" + value;
1175
+ }
1176
+ function wordList(fires) {
1177
+ return fires.map(function digit(value) {
1178
+ return "" + value;
1179
+ });
1180
+ }
1181
+ function joinList(items) {
1182
+ if (items.length <= 1) {
1183
+ return items.join("");
1184
+ }
1185
+ if (items.length === 2) {
1186
+ return items[0] + " et " + items[1];
1187
+ }
1188
+ return items.slice(0, -1).join(", ") + " et " + items[items.length - 1];
1189
+ }
1190
+ function numero(n, opts) {
1191
+ return numeral(n, numeros, opts);
1192
+ }
1193
+ function weekdayName(token) {
1194
+ const number = toFieldNumber("" + token, weekdayNumbers);
1195
+ return weekdayNames[number === 7 ? 0 : number];
1196
+ }
1197
+ function monthName(token) {
1198
+ return monthNames[+token];
1199
+ }
1200
+ var fr2 = {
1201
+ describe,
1202
+ fallback: "un motif cron non reconnu",
1203
+ options: normalizeOptions,
1204
+ reboot: "au d\xE9marrage du syst\xE8me",
1205
+ // A description ending in a period already carries it, so closing the
1206
+ // sentence must not double it.
1207
+ sentence: (description) => "S'ex\xE9cute " + description + (description.endsWith(".") ? "" : ".")
1208
+ };
1209
+ var index_default = fr2;
1210
+ module.exports = module.exports.default;