cronli5 0.8.2 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/lang/en.js CHANGED
@@ -495,6 +495,45 @@ var stepOrdinals = {
495
495
  8: "eighth",
496
496
  12: "twelfth"
497
497
  };
498
+ var spelledOrdinals = {
499
+ 2: "other",
500
+ 3: "third",
501
+ 4: "fourth",
502
+ 5: "fifth",
503
+ 6: "sixth",
504
+ 7: "seventh",
505
+ 8: "eighth",
506
+ 9: "ninth",
507
+ 10: "tenth",
508
+ 11: "eleventh",
509
+ 12: "twelfth",
510
+ 15: "fifteenth",
511
+ 20: "twentieth",
512
+ 30: "thirtieth"
513
+ };
514
+ function ordinalWord(interval) {
515
+ return spelledOrdinals[interval] ?? getOrdinal(interval);
516
+ }
517
+ function minuteStrideConfinement(stride, opts) {
518
+ const base = " during every " + ordinalWord(stride.interval) + " minute";
519
+ return renderStride({ ...stride, cycle: 60 }, {
520
+ bare: () => base,
521
+ offset: () => base + " from " + getNumber(stride.start, opts) + " " + pluralize(stride.start, "minute") + " past the hour",
522
+ bounded: () => {
523
+ const num = seriesNumber();
524
+ return base + " from " + num(stride.start) + through(opts) + num(stride.last) + " " + pluralize(stride.last, "minute") + " past the hour";
525
+ }
526
+ });
527
+ }
528
+ function minuteStride(schedule) {
529
+ if (schedule.shapes.minute === "step") {
530
+ const segment = stepSegment(schedule, "minute");
531
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
532
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
533
+ }
534
+ const values = singleValues(segmentsOf(schedule, "minute"));
535
+ return values && arithmeticStep(values);
536
+ }
498
537
  function everyNthHour(segment, opts) {
499
538
  const base = "during every " + stepOrdinals[segment.interval] + " hour";
500
539
  const start = segment.startToken === "*" ? 0 : +segment.startToken;
@@ -700,9 +739,13 @@ function minuteConfinement(schedule, opts) {
700
739
  if (minute === "*") {
701
740
  return "";
702
741
  }
703
- if (isCadenceField(minute)) {
742
+ if (minute === "*/2") {
704
743
  return " of every other minute";
705
744
  }
745
+ const stride = minuteStride(schedule);
746
+ if (stride) {
747
+ return minuteStrideConfinement(stride, opts);
748
+ }
706
749
  const segments = segmentsOf(schedule, "minute");
707
750
  if (schedule.shapes.minute === "single") {
708
751
  return " during minute :" + pad(minute);
@@ -719,7 +762,7 @@ function minuteConfinement(schedule, opts) {
719
762
  function hourConfinement(schedule, opts) {
720
763
  const hour = schedule.pattern.hour;
721
764
  if (hour === "*") {
722
- const minutePinned = schedule.pattern.minute !== "*" && !isCadenceField(schedule.pattern.minute);
765
+ const minutePinned = schedule.pattern.minute !== "*" && !isCadenceField(schedule.pattern.minute) && !minuteStride(schedule);
723
766
  return minutePinned ? " of every hour" : "";
724
767
  }
725
768
  if (isCadenceField(hour)) {
@@ -768,9 +811,12 @@ function confinementEligible(schedule, lead) {
768
811
  }
769
812
  if (lead.secondLead) {
770
813
  if (minuteStep) {
771
- return minute === "*/2" && schedule.shapes.hour !== "range";
814
+ return minute === "*/2" ? schedule.shapes.hour !== "range" : schedule.pattern.hour === "*";
815
+ }
816
+ if (isMinuteStride(schedule)) {
817
+ return schedule.pattern.hour === "*";
772
818
  }
773
- if (isMinuteStride(schedule) || schedule.shapes.minute === "list" && schedule.shapes.hour === "list") {
819
+ if (schedule.shapes.minute === "list" && schedule.shapes.hour === "list") {
774
820
  return false;
775
821
  }
776
822
  return true;
package/dist/lang/es.cjs CHANGED
@@ -223,6 +223,20 @@ var weekdayNames = [
223
223
  "s\xE1bado"
224
224
  ];
225
225
  var nthWeekdayNames = [null, "primer", "segundo", "tercer", "cuarto", "quinto"];
226
+ var stepOrdinals = {
227
+ 3: "tercer",
228
+ 4: "cuarto",
229
+ 5: "quinto",
230
+ 6: "sexto",
231
+ 7: "s\xE9ptimo",
232
+ 8: "octavo",
233
+ 9: "noveno",
234
+ 10: "d\xE9cimo",
235
+ 12: "duod\xE9cimo",
236
+ 15: "decimoquinto",
237
+ 20: "vig\xE9simo",
238
+ 30: "trig\xE9simo"
239
+ };
226
240
  function normalizeOptions(options) {
227
241
  options = options || {};
228
242
  const style = resolveDialect(options.dialect);
@@ -287,6 +301,28 @@ function composeHourCadence(schedule, plan, opts) {
287
301
  function isPinnedMinuteSeconds(schedule, plan) {
288
302
  return plan.rest.kind === "clockTimes" && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step");
289
303
  }
304
+ function minuteStride(schedule) {
305
+ if (schedule.shapes.minute === "step") {
306
+ const segment = stepSegment(schedule, "minute");
307
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
308
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
309
+ }
310
+ const values = singleValues(segmentsOf(schedule, "minute"));
311
+ return values && arithmeticStep(values);
312
+ }
313
+ function minuteStepConfinement(schedule, stride, opts) {
314
+ const ordinal = stepOrdinals[stride.interval];
315
+ const head = ordinal ? "cada " + ordinal + " minuto" : "cada " + numero(stride.interval, opts) + " minutos";
316
+ const tail = renderStride({ ...stride, cycle: 60 }, {
317
+ bare: () => "",
318
+ offset: () => " a partir del minuto " + stride.start,
319
+ bounded: () => " del minuto " + stride.start + " al " + stride.last
320
+ });
321
+ return secondsLeadClause(schedule, opts) + " en " + head + tail + " de cada hora" + trailingQualifier(schedule, opts);
322
+ }
323
+ function isSteppedMinuteSeconds(schedule, plan) {
324
+ return (plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes") && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step") && schedule.shapes.hour === "wildcard" && schedule.pattern.minute !== "*/2" && minuteStride(schedule) !== null;
325
+ }
290
326
  function renderComposeSeconds(schedule, plan, opts) {
291
327
  const hourCad = composeHourCadence(schedule, plan, opts);
292
328
  if (hourCad !== null) {
@@ -305,6 +341,9 @@ function renderComposeSeconds(schedule, plan, opts) {
305
341
  const cadence = "cada " + numero(stepSegment(schedule, "second").interval, opts) + " segundos del minuto " + schedule.pattern.minute;
306
342
  return dayFrame + ", " + window + ", " + cadence;
307
343
  }
344
+ if (isSteppedMinuteSeconds(schedule, plan)) {
345
+ return minuteStepConfinement(schedule, minuteStride(schedule), opts);
346
+ }
308
347
  if (isEveryOtherMinuteSeconds(schedule, plan)) {
309
348
  return secondsLeadClause(schedule, opts) + " de " + render(schedule, plan.rest, opts);
310
349
  }
package/dist/lang/es.js CHANGED
@@ -197,6 +197,20 @@ var weekdayNames = [
197
197
  "s\xE1bado"
198
198
  ];
199
199
  var nthWeekdayNames = [null, "primer", "segundo", "tercer", "cuarto", "quinto"];
200
+ var stepOrdinals = {
201
+ 3: "tercer",
202
+ 4: "cuarto",
203
+ 5: "quinto",
204
+ 6: "sexto",
205
+ 7: "s\xE9ptimo",
206
+ 8: "octavo",
207
+ 9: "noveno",
208
+ 10: "d\xE9cimo",
209
+ 12: "duod\xE9cimo",
210
+ 15: "decimoquinto",
211
+ 20: "vig\xE9simo",
212
+ 30: "trig\xE9simo"
213
+ };
200
214
  function normalizeOptions(options) {
201
215
  options = options || {};
202
216
  const style = resolveDialect(options.dialect);
@@ -261,6 +275,28 @@ function composeHourCadence(schedule, plan, opts) {
261
275
  function isPinnedMinuteSeconds(schedule, plan) {
262
276
  return plan.rest.kind === "clockTimes" && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step");
263
277
  }
278
+ function minuteStride(schedule) {
279
+ if (schedule.shapes.minute === "step") {
280
+ const segment = stepSegment(schedule, "minute");
281
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
282
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
283
+ }
284
+ const values = singleValues(segmentsOf(schedule, "minute"));
285
+ return values && arithmeticStep(values);
286
+ }
287
+ function minuteStepConfinement(schedule, stride, opts) {
288
+ const ordinal = stepOrdinals[stride.interval];
289
+ const head = ordinal ? "cada " + ordinal + " minuto" : "cada " + numero(stride.interval, opts) + " minutos";
290
+ const tail = renderStride({ ...stride, cycle: 60 }, {
291
+ bare: () => "",
292
+ offset: () => " a partir del minuto " + stride.start,
293
+ bounded: () => " del minuto " + stride.start + " al " + stride.last
294
+ });
295
+ return secondsLeadClause(schedule, opts) + " en " + head + tail + " de cada hora" + trailingQualifier(schedule, opts);
296
+ }
297
+ function isSteppedMinuteSeconds(schedule, plan) {
298
+ return (plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes") && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step") && schedule.shapes.hour === "wildcard" && schedule.pattern.minute !== "*/2" && minuteStride(schedule) !== null;
299
+ }
264
300
  function renderComposeSeconds(schedule, plan, opts) {
265
301
  const hourCad = composeHourCadence(schedule, plan, opts);
266
302
  if (hourCad !== null) {
@@ -279,6 +315,9 @@ function renderComposeSeconds(schedule, plan, opts) {
279
315
  const cadence = "cada " + numero(stepSegment(schedule, "second").interval, opts) + " segundos del minuto " + schedule.pattern.minute;
280
316
  return dayFrame + ", " + window + ", " + cadence;
281
317
  }
318
+ if (isSteppedMinuteSeconds(schedule, plan)) {
319
+ return minuteStepConfinement(schedule, minuteStride(schedule), opts);
320
+ }
282
321
  if (isEveryOtherMinuteSeconds(schedule, plan)) {
283
322
  return secondsLeadClause(schedule, opts) + " de " + render(schedule, plan.rest, opts);
284
323
  }
package/dist/lang/fi.cjs CHANGED
@@ -224,6 +224,20 @@ var nthWeekdayNames = [
224
224
  "nelj\xE4nten\xE4",
225
225
  "viidenten\xE4"
226
226
  ];
227
+ var minuteStepOrdinals = {
228
+ 3: "kolmantena",
229
+ 4: "nelj\xE4nten\xE4",
230
+ 5: "viidenten\xE4",
231
+ 6: "kuudentena",
232
+ 7: "seitsem\xE4nten\xE4",
233
+ 8: "kahdeksantena",
234
+ 9: "yhdeks\xE4nten\xE4",
235
+ 10: "kymmenenten\xE4",
236
+ 12: "kahdentenatoista",
237
+ 15: "viidenten\xE4toista",
238
+ 20: "kahdentenakymmenenten\xE4",
239
+ 30: "kolmantenakymmenenten\xE4"
240
+ };
227
241
  var weekdays = [
228
242
  {
229
243
  ela: "sunnuntaista",
@@ -391,11 +405,37 @@ function composeHourCadence(schedule, plan, opts) {
391
405
  const minute = +schedule.pattern.minute;
392
406
  return hourCadence(schedule, minute, opts) ?? hourRangeCadence(schedule, minute, opts);
393
407
  }
408
+ function minuteStride(schedule) {
409
+ if (schedule.shapes.minute === "step") {
410
+ const segment = stepSegment(schedule, "minute");
411
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
412
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
413
+ }
414
+ const values = singleValues(segmentsOf(schedule, "minute"));
415
+ return values && arithmeticStep(values);
416
+ }
417
+ function minuteStepConfinement(schedule, stride, opts) {
418
+ const ordinalForm = minuteStepOrdinals[stride.interval];
419
+ const minute = units.minute;
420
+ const head = ordinalForm ? " joka " + ordinalForm + " minuuttina" : " " + genitive(stride.interval, opts) + " " + minute.gen + " v\xE4lein";
421
+ const tail = renderStride({ ...stride, cycle: 60 }, {
422
+ bare: () => "",
423
+ offset: () => " " + minute.anchor + " " + minute.ela + " " + stride.start + " alkaen",
424
+ bounded: () => " " + minute.ela + " " + stride.start + " " + minute.ill + " " + stride.last
425
+ });
426
+ return secondsLeadClause(schedule, opts) + head + tail + trailingQualifier(schedule, opts);
427
+ }
428
+ function isSteppedMinuteSeconds(schedule, plan) {
429
+ return (plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes") && (schedule.pattern.second === "*" || schedule.shapes.second === "step") && schedule.shapes.hour === "wildcard" && schedule.pattern.minute !== "*/2" && minuteStride(schedule) !== null;
430
+ }
394
431
  function renderComposeSeconds(schedule, plan, opts) {
395
432
  const cadence = composeHourCadence(schedule, plan, opts);
396
433
  if (cadence !== null) {
397
434
  return cadence;
398
435
  }
436
+ if (isSteppedMinuteSeconds(schedule, plan)) {
437
+ return minuteStepConfinement(schedule, minuteStride(schedule), opts);
438
+ }
399
439
  if (plan.rest.kind === "minuteFrequency" && schedule.pattern.second !== "*") {
400
440
  return composeSecondsOverMinuteStep(schedule, plan.rest, opts);
401
441
  }
package/dist/lang/fi.js CHANGED
@@ -198,6 +198,20 @@ var nthWeekdayNames = [
198
198
  "nelj\xE4nten\xE4",
199
199
  "viidenten\xE4"
200
200
  ];
201
+ var minuteStepOrdinals = {
202
+ 3: "kolmantena",
203
+ 4: "nelj\xE4nten\xE4",
204
+ 5: "viidenten\xE4",
205
+ 6: "kuudentena",
206
+ 7: "seitsem\xE4nten\xE4",
207
+ 8: "kahdeksantena",
208
+ 9: "yhdeks\xE4nten\xE4",
209
+ 10: "kymmenenten\xE4",
210
+ 12: "kahdentenatoista",
211
+ 15: "viidenten\xE4toista",
212
+ 20: "kahdentenakymmenenten\xE4",
213
+ 30: "kolmantenakymmenenten\xE4"
214
+ };
201
215
  var weekdays = [
202
216
  {
203
217
  ela: "sunnuntaista",
@@ -365,11 +379,37 @@ function composeHourCadence(schedule, plan, opts) {
365
379
  const minute = +schedule.pattern.minute;
366
380
  return hourCadence(schedule, minute, opts) ?? hourRangeCadence(schedule, minute, opts);
367
381
  }
382
+ function minuteStride(schedule) {
383
+ if (schedule.shapes.minute === "step") {
384
+ const segment = stepSegment(schedule, "minute");
385
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
386
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
387
+ }
388
+ const values = singleValues(segmentsOf(schedule, "minute"));
389
+ return values && arithmeticStep(values);
390
+ }
391
+ function minuteStepConfinement(schedule, stride, opts) {
392
+ const ordinalForm = minuteStepOrdinals[stride.interval];
393
+ const minute = units.minute;
394
+ const head = ordinalForm ? " joka " + ordinalForm + " minuuttina" : " " + genitive(stride.interval, opts) + " " + minute.gen + " v\xE4lein";
395
+ const tail = renderStride({ ...stride, cycle: 60 }, {
396
+ bare: () => "",
397
+ offset: () => " " + minute.anchor + " " + minute.ela + " " + stride.start + " alkaen",
398
+ bounded: () => " " + minute.ela + " " + stride.start + " " + minute.ill + " " + stride.last
399
+ });
400
+ return secondsLeadClause(schedule, opts) + head + tail + trailingQualifier(schedule, opts);
401
+ }
402
+ function isSteppedMinuteSeconds(schedule, plan) {
403
+ return (plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes") && (schedule.pattern.second === "*" || schedule.shapes.second === "step") && schedule.shapes.hour === "wildcard" && schedule.pattern.minute !== "*/2" && minuteStride(schedule) !== null;
404
+ }
368
405
  function renderComposeSeconds(schedule, plan, opts) {
369
406
  const cadence = composeHourCadence(schedule, plan, opts);
370
407
  if (cadence !== null) {
371
408
  return cadence;
372
409
  }
410
+ if (isSteppedMinuteSeconds(schedule, plan)) {
411
+ return minuteStepConfinement(schedule, minuteStride(schedule), opts);
412
+ }
373
413
  if (plan.rest.kind === "minuteFrequency" && schedule.pattern.second !== "*") {
374
414
  return composeSecondsOverMinuteStep(schedule, plan.rest, opts);
375
415
  }
package/dist/lang/fr.cjs CHANGED
@@ -210,6 +210,20 @@ var weekdayNames = [
210
210
  "samedi"
211
211
  ];
212
212
  var nthWeekdayMasculine = [null, "premier", "deuxi\xE8me", "troisi\xE8me", "quatri\xE8me", "cinqui\xE8me"];
213
+ var stepOrdinals = {
214
+ 3: "troisi\xE8me",
215
+ 4: "quatri\xE8me",
216
+ 5: "cinqui\xE8me",
217
+ 6: "sixi\xE8me",
218
+ 7: "septi\xE8me",
219
+ 8: "huiti\xE8me",
220
+ 9: "neuvi\xE8me",
221
+ 10: "dixi\xE8me",
222
+ 12: "douzi\xE8me",
223
+ 15: "quinzi\xE8me",
224
+ 20: "vingti\xE8me",
225
+ 30: "trenti\xE8me"
226
+ };
213
227
  function normalizeOptions(options) {
214
228
  options = options || {};
215
229
  const style = resolveDialect(options.dialect);
@@ -274,6 +288,28 @@ function composeHourCadence(schedule, plan, opts) {
274
288
  function isPinnedMinuteSeconds(schedule, plan) {
275
289
  return plan.rest.kind === "clockTimes" && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step");
276
290
  }
291
+ function minuteStride(schedule) {
292
+ if (schedule.shapes.minute === "step") {
293
+ const segment = stepSegment(schedule, "minute");
294
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
295
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
296
+ }
297
+ const values = singleValues(segmentsOf(schedule, "minute"));
298
+ return values && arithmeticStep(values);
299
+ }
300
+ function minuteStepConfinement(schedule, stride, opts) {
301
+ const ordinal = stepOrdinals[stride.interval];
302
+ const head = ordinal ? "\xE0 la " + ordinal + " minute" : "\xE0 la minute toutes les " + numero(stride.interval, opts);
303
+ const tail = renderStride({ ...stride, cycle: 60 }, {
304
+ bare: () => "",
305
+ offset: () => " \xE0 partir de la minute " + stride.start,
306
+ bounded: () => " de la minute " + stride.start + " \xE0 " + stride.last
307
+ });
308
+ return secondsLeadClause(schedule, opts) + " " + head + tail + " de chaque heure" + trailingQualifier(schedule, opts);
309
+ }
310
+ function isSteppedMinuteSeconds(schedule, plan) {
311
+ return (plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes") && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step") && schedule.shapes.hour === "wildcard" && schedule.pattern.minute !== "*/2" && minuteStride(schedule) !== null;
312
+ }
277
313
  function renderComposeSeconds(schedule, plan, opts) {
278
314
  const hourCad = composeHourCadence(schedule, plan, opts);
279
315
  if (hourCad !== null) {
@@ -292,6 +328,9 @@ function renderComposeSeconds(schedule, plan, opts) {
292
328
  const cadence = "toutes les " + numero(stepSegment(schedule, "second").interval, opts) + " secondes de la minute " + schedule.pattern.minute;
293
329
  return dayFrame + ", " + window + ", " + cadence;
294
330
  }
331
+ if (isSteppedMinuteSeconds(schedule, plan)) {
332
+ return minuteStepConfinement(schedule, minuteStride(schedule), opts);
333
+ }
295
334
  if (isEveryOtherMinuteSeconds(schedule, plan)) {
296
335
  return secondsLeadClause(schedule, opts) + " de " + render(schedule, plan.rest, opts).replace(/^toutes les /u, "chaque ");
297
336
  }
package/dist/lang/fr.js CHANGED
@@ -184,6 +184,20 @@ var weekdayNames = [
184
184
  "samedi"
185
185
  ];
186
186
  var nthWeekdayMasculine = [null, "premier", "deuxi\xE8me", "troisi\xE8me", "quatri\xE8me", "cinqui\xE8me"];
187
+ var stepOrdinals = {
188
+ 3: "troisi\xE8me",
189
+ 4: "quatri\xE8me",
190
+ 5: "cinqui\xE8me",
191
+ 6: "sixi\xE8me",
192
+ 7: "septi\xE8me",
193
+ 8: "huiti\xE8me",
194
+ 9: "neuvi\xE8me",
195
+ 10: "dixi\xE8me",
196
+ 12: "douzi\xE8me",
197
+ 15: "quinzi\xE8me",
198
+ 20: "vingti\xE8me",
199
+ 30: "trenti\xE8me"
200
+ };
187
201
  function normalizeOptions(options) {
188
202
  options = options || {};
189
203
  const style = resolveDialect(options.dialect);
@@ -248,6 +262,28 @@ function composeHourCadence(schedule, plan, opts) {
248
262
  function isPinnedMinuteSeconds(schedule, plan) {
249
263
  return plan.rest.kind === "clockTimes" && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step");
250
264
  }
265
+ function minuteStride(schedule) {
266
+ if (schedule.shapes.minute === "step") {
267
+ const segment = stepSegment(schedule, "minute");
268
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
269
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
270
+ }
271
+ const values = singleValues(segmentsOf(schedule, "minute"));
272
+ return values && arithmeticStep(values);
273
+ }
274
+ function minuteStepConfinement(schedule, stride, opts) {
275
+ const ordinal = stepOrdinals[stride.interval];
276
+ const head = ordinal ? "\xE0 la " + ordinal + " minute" : "\xE0 la minute toutes les " + numero(stride.interval, opts);
277
+ const tail = renderStride({ ...stride, cycle: 60 }, {
278
+ bare: () => "",
279
+ offset: () => " \xE0 partir de la minute " + stride.start,
280
+ bounded: () => " de la minute " + stride.start + " \xE0 " + stride.last
281
+ });
282
+ return secondsLeadClause(schedule, opts) + " " + head + tail + " de chaque heure" + trailingQualifier(schedule, opts);
283
+ }
284
+ function isSteppedMinuteSeconds(schedule, plan) {
285
+ return (plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes") && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step") && schedule.shapes.hour === "wildcard" && schedule.pattern.minute !== "*/2" && minuteStride(schedule) !== null;
286
+ }
251
287
  function renderComposeSeconds(schedule, plan, opts) {
252
288
  const hourCad = composeHourCadence(schedule, plan, opts);
253
289
  if (hourCad !== null) {
@@ -266,6 +302,9 @@ function renderComposeSeconds(schedule, plan, opts) {
266
302
  const cadence = "toutes les " + numero(stepSegment(schedule, "second").interval, opts) + " secondes de la minute " + schedule.pattern.minute;
267
303
  return dayFrame + ", " + window + ", " + cadence;
268
304
  }
305
+ if (isSteppedMinuteSeconds(schedule, plan)) {
306
+ return minuteStepConfinement(schedule, minuteStride(schedule), opts);
307
+ }
269
308
  if (isEveryOtherMinuteSeconds(schedule, plan)) {
270
309
  return secondsLeadClause(schedule, opts) + " de " + render(schedule, plan.rest, opts).replace(/^toutes les /u, "chaque ");
271
310
  }
package/dist/lang/pt.cjs CHANGED
@@ -232,6 +232,20 @@ function weekdayFeminine(number) {
232
232
  }
233
233
  var nthWeekdayMasculine = [null, "primeiro", "segundo", "terceiro", "quarto", "quinto"];
234
234
  var nthWeekdayFeminine = [null, "primeira", "segunda", "terceira", "quarta", "quinta"];
235
+ var stepOrdinals = {
236
+ 3: "terceiro",
237
+ 4: "quarto",
238
+ 5: "quinto",
239
+ 6: "sexto",
240
+ 7: "s\xE9timo",
241
+ 8: "oitavo",
242
+ 9: "nono",
243
+ 10: "d\xE9cimo",
244
+ 12: "d\xE9cimo segundo",
245
+ 15: "d\xE9cimo quinto",
246
+ 20: "vig\xE9simo",
247
+ 30: "trig\xE9simo"
248
+ };
235
249
  function noonMidnightArticle(phrase) {
236
250
  if (phrase === "meio-dia") {
237
251
  return "o";
@@ -361,6 +375,28 @@ function composeHourCadence(schedule, plan, opts) {
361
375
  function isPinnedMinuteSeconds(schedule, plan) {
362
376
  return plan.rest.kind === "clockTimes" && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step");
363
377
  }
378
+ function minuteStride(schedule) {
379
+ if (schedule.shapes.minute === "step") {
380
+ const segment = stepSegment(schedule, "minute");
381
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
382
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
383
+ }
384
+ const values = singleValues(segmentsOf(schedule, "minute"));
385
+ return values && arithmeticStep(values);
386
+ }
387
+ function minuteStepConfinement(schedule, stride, opts) {
388
+ const ordinal = stepOrdinals[stride.interval];
389
+ const head = ordinal ? "no " + ordinal + " minuto" : "a cada " + numero(stride.interval, opts) + " minutos";
390
+ const tail = renderStride({ ...stride, cycle: 60 }, {
391
+ bare: () => "",
392
+ offset: () => " a partir do minuto " + stride.start,
393
+ bounded: () => " do minuto " + stride.start + " ao " + stride.last
394
+ });
395
+ return secondsLeadClause(schedule, opts) + " " + head + tail + " de cada hora" + trailingQualifier(schedule, opts);
396
+ }
397
+ function isSteppedMinuteSeconds(schedule, plan) {
398
+ return (plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes") && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step") && schedule.shapes.hour === "wildcard" && schedule.pattern.minute !== "*/2" && minuteStride(schedule) !== null;
399
+ }
364
400
  function renderComposeSeconds(schedule, plan, opts) {
365
401
  const hourCad = composeHourCadence(schedule, plan, opts);
366
402
  if (hourCad !== null) {
@@ -379,6 +415,9 @@ function renderComposeSeconds(schedule, plan, opts) {
379
415
  const cadence = "a cada " + numero(stepSegment(schedule, "second").interval, opts) + " segundos do minuto " + schedule.pattern.minute;
380
416
  return dayFrame + ", " + window + ", " + cadence;
381
417
  }
418
+ if (isSteppedMinuteSeconds(schedule, plan)) {
419
+ return minuteStepConfinement(schedule, minuteStride(schedule), opts);
420
+ }
382
421
  if (isEveryOtherMinuteSeconds(schedule, plan)) {
383
422
  const rest = render(schedule, plan.rest, opts).replace(/^a /u, "");
384
423
  return secondsLeadClause(schedule, opts) + " de " + rest;
package/dist/lang/pt.js CHANGED
@@ -206,6 +206,20 @@ function weekdayFeminine(number) {
206
206
  }
207
207
  var nthWeekdayMasculine = [null, "primeiro", "segundo", "terceiro", "quarto", "quinto"];
208
208
  var nthWeekdayFeminine = [null, "primeira", "segunda", "terceira", "quarta", "quinta"];
209
+ var stepOrdinals = {
210
+ 3: "terceiro",
211
+ 4: "quarto",
212
+ 5: "quinto",
213
+ 6: "sexto",
214
+ 7: "s\xE9timo",
215
+ 8: "oitavo",
216
+ 9: "nono",
217
+ 10: "d\xE9cimo",
218
+ 12: "d\xE9cimo segundo",
219
+ 15: "d\xE9cimo quinto",
220
+ 20: "vig\xE9simo",
221
+ 30: "trig\xE9simo"
222
+ };
209
223
  function noonMidnightArticle(phrase) {
210
224
  if (phrase === "meio-dia") {
211
225
  return "o";
@@ -335,6 +349,28 @@ function composeHourCadence(schedule, plan, opts) {
335
349
  function isPinnedMinuteSeconds(schedule, plan) {
336
350
  return plan.rest.kind === "clockTimes" && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step");
337
351
  }
352
+ function minuteStride(schedule) {
353
+ if (schedule.shapes.minute === "step") {
354
+ const segment = stepSegment(schedule, "minute");
355
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
356
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
357
+ }
358
+ const values = singleValues(segmentsOf(schedule, "minute"));
359
+ return values && arithmeticStep(values);
360
+ }
361
+ function minuteStepConfinement(schedule, stride, opts) {
362
+ const ordinal = stepOrdinals[stride.interval];
363
+ const head = ordinal ? "no " + ordinal + " minuto" : "a cada " + numero(stride.interval, opts) + " minutos";
364
+ const tail = renderStride({ ...stride, cycle: 60 }, {
365
+ bare: () => "",
366
+ offset: () => " a partir do minuto " + stride.start,
367
+ bounded: () => " do minuto " + stride.start + " ao " + stride.last
368
+ });
369
+ return secondsLeadClause(schedule, opts) + " " + head + tail + " de cada hora" + trailingQualifier(schedule, opts);
370
+ }
371
+ function isSteppedMinuteSeconds(schedule, plan) {
372
+ return (plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes") && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step") && schedule.shapes.hour === "wildcard" && schedule.pattern.minute !== "*/2" && minuteStride(schedule) !== null;
373
+ }
338
374
  function renderComposeSeconds(schedule, plan, opts) {
339
375
  const hourCad = composeHourCadence(schedule, plan, opts);
340
376
  if (hourCad !== null) {
@@ -353,6 +389,9 @@ function renderComposeSeconds(schedule, plan, opts) {
353
389
  const cadence = "a cada " + numero(stepSegment(schedule, "second").interval, opts) + " segundos do minuto " + schedule.pattern.minute;
354
390
  return dayFrame + ", " + window + ", " + cadence;
355
391
  }
392
+ if (isSteppedMinuteSeconds(schedule, plan)) {
393
+ return minuteStepConfinement(schedule, minuteStride(schedule), opts);
394
+ }
356
395
  if (isEveryOtherMinuteSeconds(schedule, plan)) {
357
396
  const rest = render(schedule, plan.rest, opts).replace(/^a /u, "");
358
397
  return secondsLeadClause(schedule, opts) + " de " + rest;
package/dist/lang/zh.cjs CHANGED
@@ -613,7 +613,7 @@ function composeSecondsOnHour(schedule, plan, opts) {
613
613
  return "\u6BCF\u5929" + restText + secTail;
614
614
  }
615
615
  if (rest.kind === "singleMinute") {
616
- return restText + "\uFF0C" + sec;
616
+ return secondIsCadence(schedule) ? restText + confinedSecondTail(sec) : restText + "\uFF0C" + sec;
617
617
  }
618
618
  return restText + secTail;
619
619
  }
@@ -683,7 +683,7 @@ function composeSecondsListed(schedule) {
683
683
  return hourWord(hourFires(schedule)[0]) + minuteCad + "\u7684\u6BCF\u4E00\u79D2";
684
684
  }
685
685
  if (schedule.shapes.hour === "wildcard") {
686
- return minutes + "\uFF0C" + sec;
686
+ return secondIsCadence(schedule) ? minutes + confinedSecondTail(sec) : minutes + "\uFF0C" + sec;
687
687
  }
688
688
  const hourCad = unevenHourCadence(schedule);
689
689
  if (hourCad !== null) {
@@ -691,9 +691,31 @@ function composeSecondsListed(schedule) {
691
691
  }
692
692
  return hourFrame(schedule) + minutes + "\uFF0C" + sec;
693
693
  }
694
+ function isMinuteStride(schedule) {
695
+ if (schedule.shapes.minute === "step") {
696
+ return true;
697
+ }
698
+ const values = singleValues(segmentsOf(schedule, "minute"));
699
+ return values !== null && arithmeticStep(values) !== null;
700
+ }
701
+ function secondIsCadence(schedule) {
702
+ return schedule.pattern.second === "*" || schedule.shapes.second === "step";
703
+ }
704
+ function confinedSecondTail(sec) {
705
+ return sec === "\u6BCF\u79D2" ? "\u7684\u6BCF\u4E00\u79D2" : "\u7684" + sec;
706
+ }
707
+ function isSteppedMinuteSeconds(schedule, composedClock) {
708
+ return !composedClock && schedule.shapes.hour === "wildcard" && secondIsCadence(schedule) && schedule.pattern.minute !== "*/2" && isMinuteStride(schedule);
709
+ }
710
+ function minuteStrideConfinement(schedule) {
711
+ return minuteHourClause(schedule) + confinedSecondTail(secondClause(schedule));
712
+ }
694
713
  function renderComposeSeconds(schedule, plan, opts) {
695
714
  const { rest } = plan;
696
715
  const composedClock = rest.kind === "clockTimes" || rest.kind === "compactClockTimes";
716
+ if (isSteppedMinuteSeconds(schedule, composedClock)) {
717
+ return minuteStrideConfinement(schedule);
718
+ }
697
719
  if (schedule.pattern.minute === "0" || composedClock && schedule.shapes.minute === "single") {
698
720
  return composeSecondsOnHour(schedule, plan, opts);
699
721
  }
package/dist/lang/zh.js CHANGED
@@ -587,7 +587,7 @@ function composeSecondsOnHour(schedule, plan, opts) {
587
587
  return "\u6BCF\u5929" + restText + secTail;
588
588
  }
589
589
  if (rest.kind === "singleMinute") {
590
- return restText + "\uFF0C" + sec;
590
+ return secondIsCadence(schedule) ? restText + confinedSecondTail(sec) : restText + "\uFF0C" + sec;
591
591
  }
592
592
  return restText + secTail;
593
593
  }
@@ -657,7 +657,7 @@ function composeSecondsListed(schedule) {
657
657
  return hourWord(hourFires(schedule)[0]) + minuteCad + "\u7684\u6BCF\u4E00\u79D2";
658
658
  }
659
659
  if (schedule.shapes.hour === "wildcard") {
660
- return minutes + "\uFF0C" + sec;
660
+ return secondIsCadence(schedule) ? minutes + confinedSecondTail(sec) : minutes + "\uFF0C" + sec;
661
661
  }
662
662
  const hourCad = unevenHourCadence(schedule);
663
663
  if (hourCad !== null) {
@@ -665,9 +665,31 @@ function composeSecondsListed(schedule) {
665
665
  }
666
666
  return hourFrame(schedule) + minutes + "\uFF0C" + sec;
667
667
  }
668
+ function isMinuteStride(schedule) {
669
+ if (schedule.shapes.minute === "step") {
670
+ return true;
671
+ }
672
+ const values = singleValues(segmentsOf(schedule, "minute"));
673
+ return values !== null && arithmeticStep(values) !== null;
674
+ }
675
+ function secondIsCadence(schedule) {
676
+ return schedule.pattern.second === "*" || schedule.shapes.second === "step";
677
+ }
678
+ function confinedSecondTail(sec) {
679
+ return sec === "\u6BCF\u79D2" ? "\u7684\u6BCF\u4E00\u79D2" : "\u7684" + sec;
680
+ }
681
+ function isSteppedMinuteSeconds(schedule, composedClock) {
682
+ return !composedClock && schedule.shapes.hour === "wildcard" && secondIsCadence(schedule) && schedule.pattern.minute !== "*/2" && isMinuteStride(schedule);
683
+ }
684
+ function minuteStrideConfinement(schedule) {
685
+ return minuteHourClause(schedule) + confinedSecondTail(secondClause(schedule));
686
+ }
668
687
  function renderComposeSeconds(schedule, plan, opts) {
669
688
  const { rest } = plan;
670
689
  const composedClock = rest.kind === "clockTimes" || rest.kind === "compactClockTimes";
690
+ if (isSteppedMinuteSeconds(schedule, composedClock)) {
691
+ return minuteStrideConfinement(schedule);
692
+ }
671
693
  if (schedule.pattern.minute === "0" || composedClock && schedule.shapes.minute === "single") {
672
694
  return composeSecondsOnHour(schedule, plan, opts);
673
695
  }