cronli5 0.8.3 → 0.8.6

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/es.cjs CHANGED
@@ -277,7 +277,10 @@ function renderSecondsWithinMinute(schedule, plan, opts) {
277
277
  if (plan.singleSecond) {
278
278
  return "en el minuto " + minuteField + " y el segundo " + schedule.pattern.second + " de cada hora" + trailingQualifier(schedule, opts);
279
279
  }
280
- return secondsLeadClause(schedule, opts) + ", en el minuto " + minuteField + " de cada hora" + trailingQualifier(schedule, opts);
280
+ if (secondsConfinesMinute(schedule)) {
281
+ return secondsBareLead(schedule) + " " + confinedMinutePhrase(schedule, opts) + trailingQualifier(schedule, opts);
282
+ }
283
+ return secondsLeadClause(schedule, opts) + " en el minuto " + minuteField + " de cada hora" + trailingQualifier(schedule, opts);
281
284
  }
282
285
  function secondsListAtClock(schedule, rest, opts) {
283
286
  const clockPhrases = rest.times.map(function clock(time) {
@@ -323,6 +326,66 @@ function minuteStepConfinement(schedule, stride, opts) {
323
326
  function isSteppedMinuteSeconds(schedule, plan) {
324
327
  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
328
  }
329
+ function secondsBareLead(schedule) {
330
+ const secondField = schedule.pattern.second;
331
+ const shape = schedule.shapes.second;
332
+ if (shape === "range") {
333
+ const bounds = secondField.split("-");
334
+ return "cada segundo del " + bounds[0] + " al " + bounds[1];
335
+ }
336
+ if (shape === "single") {
337
+ return "en el segundo " + secondField;
338
+ }
339
+ return "en los segundos " + joinList(segmentWords(segmentsOf(schedule, "second")));
340
+ }
341
+ function confinedMinutePhrase(schedule, opts) {
342
+ const stride = minuteStride(schedule);
343
+ if (stride && schedule.pattern.minute !== "*/2") {
344
+ const ordinal = stepOrdinals[stride.interval];
345
+ const head = ordinal ? "cada " + ordinal + " minuto" : "cada " + numero(stride.interval, opts) + " minutos";
346
+ const tail = renderStride({ ...stride, cycle: 60 }, {
347
+ bare: () => "",
348
+ offset: () => " a partir del minuto " + stride.start,
349
+ bounded: () => " del minuto " + stride.start + " al " + stride.last
350
+ });
351
+ return "de " + head + tail + " de cada hora";
352
+ }
353
+ if (schedule.shapes.minute === "range") {
354
+ return "de " + minuteRangeLead(schedule.pattern.minute) + " de cada hora";
355
+ }
356
+ if (schedule.shapes.minute === "list") {
357
+ return "de los minutos " + joinList(segmentWords(segmentsOf(schedule, "minute"))) + " de cada hora";
358
+ }
359
+ return "del minuto " + schedule.pattern.minute + " de cada hora";
360
+ }
361
+ function minuteConfinementRender(plan, schedule, opts) {
362
+ if (isSteppedMinuteSeconds(schedule, plan)) {
363
+ return minuteStepConfinement(schedule, minuteStride(schedule), opts);
364
+ }
365
+ const minuteRest = plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes" || plan.rest.kind === "rangeOfMinutes";
366
+ if (minuteRest && secondsConfinesMinute(schedule)) {
367
+ return secondsBareLead(schedule) + " " + confinedMinutePhrase(schedule, opts) + trailingQualifier(schedule, opts);
368
+ }
369
+ return null;
370
+ }
371
+ function secondsConfinesMinute(schedule) {
372
+ const { second, minute, hour } = schedule.shapes;
373
+ if (second === "list") {
374
+ const values = singleValues(segmentsOf(schedule, "second"));
375
+ if (values && arithmeticStep(values)) {
376
+ return false;
377
+ }
378
+ }
379
+ const clockPoint = second === "single" || second === "range" || second === "list";
380
+ return clockPoint && minute !== "wildcard" && hour === "wildcard" && !(second === "single" && minute === "single");
381
+ }
382
+ function composeConnector(schedule, plan, opts) {
383
+ if (plan.rest.kind === "compactClockTimes" && schedule.analyses.clockSecond) {
384
+ return "";
385
+ }
386
+ const locative = (plan.rest.kind === "multipleMinutes" || plan.rest.kind === "singleMinute") && schedule.shapes.hour === "wildcard";
387
+ return secondsLeadClause(schedule, opts) + (locative ? " " : ", ");
388
+ }
326
389
  function renderComposeSeconds(schedule, plan, opts) {
327
390
  const hourCad = composeHourCadence(schedule, plan, opts);
328
391
  if (hourCad !== null) {
@@ -341,14 +404,14 @@ function renderComposeSeconds(schedule, plan, opts) {
341
404
  const cadence = "cada " + numero(stepSegment(schedule, "second").interval, opts) + " segundos del minuto " + schedule.pattern.minute;
342
405
  return dayFrame + ", " + window + ", " + cadence;
343
406
  }
344
- if (isSteppedMinuteSeconds(schedule, plan)) {
345
- return minuteStepConfinement(schedule, minuteStride(schedule), opts);
407
+ const confined = minuteConfinementRender(plan, schedule, opts);
408
+ if (confined !== null) {
409
+ return confined;
346
410
  }
347
411
  if (isEveryOtherMinuteSeconds(schedule, plan)) {
348
412
  return secondsLeadClause(schedule, opts) + " de " + render(schedule, plan.rest, opts);
349
413
  }
350
- const restOwnsLead = plan.rest.kind === "compactClockTimes" && schedule.analyses.clockSecond;
351
- const lead = restOwnsLead ? "" : secondsLeadClause(schedule, opts) + ", ";
414
+ const lead = composeConnector(schedule, plan, opts);
352
415
  return lead + render(schedule, plan.rest, opts);
353
416
  }
354
417
  function isEveryOtherMinuteSeconds(schedule, plan) {
package/dist/lang/es.js CHANGED
@@ -251,7 +251,10 @@ function renderSecondsWithinMinute(schedule, plan, opts) {
251
251
  if (plan.singleSecond) {
252
252
  return "en el minuto " + minuteField + " y el segundo " + schedule.pattern.second + " de cada hora" + trailingQualifier(schedule, opts);
253
253
  }
254
- return secondsLeadClause(schedule, opts) + ", en el minuto " + minuteField + " de cada hora" + trailingQualifier(schedule, opts);
254
+ if (secondsConfinesMinute(schedule)) {
255
+ return secondsBareLead(schedule) + " " + confinedMinutePhrase(schedule, opts) + trailingQualifier(schedule, opts);
256
+ }
257
+ return secondsLeadClause(schedule, opts) + " en el minuto " + minuteField + " de cada hora" + trailingQualifier(schedule, opts);
255
258
  }
256
259
  function secondsListAtClock(schedule, rest, opts) {
257
260
  const clockPhrases = rest.times.map(function clock(time) {
@@ -297,6 +300,66 @@ function minuteStepConfinement(schedule, stride, opts) {
297
300
  function isSteppedMinuteSeconds(schedule, plan) {
298
301
  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
302
  }
303
+ function secondsBareLead(schedule) {
304
+ const secondField = schedule.pattern.second;
305
+ const shape = schedule.shapes.second;
306
+ if (shape === "range") {
307
+ const bounds = secondField.split("-");
308
+ return "cada segundo del " + bounds[0] + " al " + bounds[1];
309
+ }
310
+ if (shape === "single") {
311
+ return "en el segundo " + secondField;
312
+ }
313
+ return "en los segundos " + joinList(segmentWords(segmentsOf(schedule, "second")));
314
+ }
315
+ function confinedMinutePhrase(schedule, opts) {
316
+ const stride = minuteStride(schedule);
317
+ if (stride && schedule.pattern.minute !== "*/2") {
318
+ const ordinal = stepOrdinals[stride.interval];
319
+ const head = ordinal ? "cada " + ordinal + " minuto" : "cada " + numero(stride.interval, opts) + " minutos";
320
+ const tail = renderStride({ ...stride, cycle: 60 }, {
321
+ bare: () => "",
322
+ offset: () => " a partir del minuto " + stride.start,
323
+ bounded: () => " del minuto " + stride.start + " al " + stride.last
324
+ });
325
+ return "de " + head + tail + " de cada hora";
326
+ }
327
+ if (schedule.shapes.minute === "range") {
328
+ return "de " + minuteRangeLead(schedule.pattern.minute) + " de cada hora";
329
+ }
330
+ if (schedule.shapes.minute === "list") {
331
+ return "de los minutos " + joinList(segmentWords(segmentsOf(schedule, "minute"))) + " de cada hora";
332
+ }
333
+ return "del minuto " + schedule.pattern.minute + " de cada hora";
334
+ }
335
+ function minuteConfinementRender(plan, schedule, opts) {
336
+ if (isSteppedMinuteSeconds(schedule, plan)) {
337
+ return minuteStepConfinement(schedule, minuteStride(schedule), opts);
338
+ }
339
+ const minuteRest = plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes" || plan.rest.kind === "rangeOfMinutes";
340
+ if (minuteRest && secondsConfinesMinute(schedule)) {
341
+ return secondsBareLead(schedule) + " " + confinedMinutePhrase(schedule, opts) + trailingQualifier(schedule, opts);
342
+ }
343
+ return null;
344
+ }
345
+ function secondsConfinesMinute(schedule) {
346
+ const { second, minute, hour } = schedule.shapes;
347
+ if (second === "list") {
348
+ const values = singleValues(segmentsOf(schedule, "second"));
349
+ if (values && arithmeticStep(values)) {
350
+ return false;
351
+ }
352
+ }
353
+ const clockPoint = second === "single" || second === "range" || second === "list";
354
+ return clockPoint && minute !== "wildcard" && hour === "wildcard" && !(second === "single" && minute === "single");
355
+ }
356
+ function composeConnector(schedule, plan, opts) {
357
+ if (plan.rest.kind === "compactClockTimes" && schedule.analyses.clockSecond) {
358
+ return "";
359
+ }
360
+ const locative = (plan.rest.kind === "multipleMinutes" || plan.rest.kind === "singleMinute") && schedule.shapes.hour === "wildcard";
361
+ return secondsLeadClause(schedule, opts) + (locative ? " " : ", ");
362
+ }
300
363
  function renderComposeSeconds(schedule, plan, opts) {
301
364
  const hourCad = composeHourCadence(schedule, plan, opts);
302
365
  if (hourCad !== null) {
@@ -315,14 +378,14 @@ function renderComposeSeconds(schedule, plan, opts) {
315
378
  const cadence = "cada " + numero(stepSegment(schedule, "second").interval, opts) + " segundos del minuto " + schedule.pattern.minute;
316
379
  return dayFrame + ", " + window + ", " + cadence;
317
380
  }
318
- if (isSteppedMinuteSeconds(schedule, plan)) {
319
- return minuteStepConfinement(schedule, minuteStride(schedule), opts);
381
+ const confined = minuteConfinementRender(plan, schedule, opts);
382
+ if (confined !== null) {
383
+ return confined;
320
384
  }
321
385
  if (isEveryOtherMinuteSeconds(schedule, plan)) {
322
386
  return secondsLeadClause(schedule, opts) + " de " + render(schedule, plan.rest, opts);
323
387
  }
324
- const restOwnsLead = plan.rest.kind === "compactClockTimes" && schedule.analyses.clockSecond;
325
- const lead = restOwnsLead ? "" : secondsLeadClause(schedule, opts) + ", ";
388
+ const lead = composeConnector(schedule, plan, opts);
326
389
  return lead + render(schedule, plan.rest, opts);
327
390
  }
328
391
  function isEveryOtherMinuteSeconds(schedule, plan) {
package/dist/lang/fi.cjs CHANGED
@@ -378,6 +378,9 @@ function renderSecondsWithinMinute(schedule, plan, opts) {
378
378
  if (plan.singleSecond) {
379
379
  return units.minute.mark + " " + minuteField + " " + units.minute.gen + " ja " + schedule.pattern.second + " " + units.second.gen + " kohdalla" + trailingQualifier(schedule, opts);
380
380
  }
381
+ if (secondsConfinesMinute(schedule)) {
382
+ return secondsConfinement(schedule, opts);
383
+ }
381
384
  return secondsLeadClause(schedule, opts) + ", " + atMarks(minuteField, units.minute, true) + trailingQualifier(schedule, opts);
382
385
  }
383
386
  function composeSecondsOverMinuteStep(schedule, freq, opts) {
@@ -428,6 +431,30 @@ function minuteStepConfinement(schedule, stride, opts) {
428
431
  function isSteppedMinuteSeconds(schedule, plan) {
429
432
  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
433
  }
434
+ function secondsConfinesMinute(schedule) {
435
+ const { second, minute, hour } = schedule.shapes;
436
+ if (second === "list") {
437
+ const values = singleValues(segmentsOf(schedule, "second"));
438
+ if (values && arithmeticStep(values)) {
439
+ return false;
440
+ }
441
+ }
442
+ const clockPoint = second === "single" || second === "range" || second === "list";
443
+ return clockPoint && minute !== "wildcard" && hour === "wildcard" && !(second === "single" && minute === "single");
444
+ }
445
+ function composeConfinesMinute(plan, schedule) {
446
+ const minuteRest = plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes" || plan.rest.kind === "rangeOfMinutes";
447
+ return minuteRest && secondsConfinesMinute(schedule);
448
+ }
449
+ function secondsConfinement(schedule, opts) {
450
+ const stride = minuteStride(schedule);
451
+ if (stride && schedule.pattern.minute !== "*/2") {
452
+ return minuteStepConfinement(schedule, stride, opts);
453
+ }
454
+ const minuteDigits = joinList(segmentWords(segmentsOf(schedule, "minute")));
455
+ const secondDigits = joinList(segmentWords(segmentsOf(schedule, "second")));
456
+ return units.minute.mark + " " + minuteDigits + " " + units.minute.gen + " ja " + secondDigits + " " + units.second.gen + " kohdalla" + trailingQualifier(schedule, opts);
457
+ }
431
458
  function renderComposeSeconds(schedule, plan, opts) {
432
459
  const cadence = composeHourCadence(schedule, plan, opts);
433
460
  if (cadence !== null) {
@@ -436,6 +463,9 @@ function renderComposeSeconds(schedule, plan, opts) {
436
463
  if (isSteppedMinuteSeconds(schedule, plan)) {
437
464
  return minuteStepConfinement(schedule, minuteStride(schedule), opts);
438
465
  }
466
+ if (composeConfinesMinute(plan, schedule)) {
467
+ return secondsConfinement(schedule, opts);
468
+ }
439
469
  if (plan.rest.kind === "minuteFrequency" && schedule.pattern.second !== "*") {
440
470
  return composeSecondsOverMinuteStep(schedule, plan.rest, opts);
441
471
  }
package/dist/lang/fi.js CHANGED
@@ -352,6 +352,9 @@ function renderSecondsWithinMinute(schedule, plan, opts) {
352
352
  if (plan.singleSecond) {
353
353
  return units.minute.mark + " " + minuteField + " " + units.minute.gen + " ja " + schedule.pattern.second + " " + units.second.gen + " kohdalla" + trailingQualifier(schedule, opts);
354
354
  }
355
+ if (secondsConfinesMinute(schedule)) {
356
+ return secondsConfinement(schedule, opts);
357
+ }
355
358
  return secondsLeadClause(schedule, opts) + ", " + atMarks(minuteField, units.minute, true) + trailingQualifier(schedule, opts);
356
359
  }
357
360
  function composeSecondsOverMinuteStep(schedule, freq, opts) {
@@ -402,6 +405,30 @@ function minuteStepConfinement(schedule, stride, opts) {
402
405
  function isSteppedMinuteSeconds(schedule, plan) {
403
406
  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
407
  }
408
+ function secondsConfinesMinute(schedule) {
409
+ const { second, minute, hour } = schedule.shapes;
410
+ if (second === "list") {
411
+ const values = singleValues(segmentsOf(schedule, "second"));
412
+ if (values && arithmeticStep(values)) {
413
+ return false;
414
+ }
415
+ }
416
+ const clockPoint = second === "single" || second === "range" || second === "list";
417
+ return clockPoint && minute !== "wildcard" && hour === "wildcard" && !(second === "single" && minute === "single");
418
+ }
419
+ function composeConfinesMinute(plan, schedule) {
420
+ const minuteRest = plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes" || plan.rest.kind === "rangeOfMinutes";
421
+ return minuteRest && secondsConfinesMinute(schedule);
422
+ }
423
+ function secondsConfinement(schedule, opts) {
424
+ const stride = minuteStride(schedule);
425
+ if (stride && schedule.pattern.minute !== "*/2") {
426
+ return minuteStepConfinement(schedule, stride, opts);
427
+ }
428
+ const minuteDigits = joinList(segmentWords(segmentsOf(schedule, "minute")));
429
+ const secondDigits = joinList(segmentWords(segmentsOf(schedule, "second")));
430
+ return units.minute.mark + " " + minuteDigits + " " + units.minute.gen + " ja " + secondDigits + " " + units.second.gen + " kohdalla" + trailingQualifier(schedule, opts);
431
+ }
405
432
  function renderComposeSeconds(schedule, plan, opts) {
406
433
  const cadence = composeHourCadence(schedule, plan, opts);
407
434
  if (cadence !== null) {
@@ -410,6 +437,9 @@ function renderComposeSeconds(schedule, plan, opts) {
410
437
  if (isSteppedMinuteSeconds(schedule, plan)) {
411
438
  return minuteStepConfinement(schedule, minuteStride(schedule), opts);
412
439
  }
440
+ if (composeConfinesMinute(plan, schedule)) {
441
+ return secondsConfinement(schedule, opts);
442
+ }
413
443
  if (plan.rest.kind === "minuteFrequency" && schedule.pattern.second !== "*") {
414
444
  return composeSecondsOverMinuteStep(schedule, plan.rest, opts);
415
445
  }
package/dist/lang/fr.cjs CHANGED
@@ -210,20 +210,6 @@ 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
- };
227
213
  function normalizeOptions(options) {
228
214
  options = options || {};
229
215
  const style = resolveDialect(options.dialect);
@@ -265,6 +251,9 @@ function renderSecondsWithinMinute(schedule, plan, opts) {
265
251
  if (plan.singleSecond) {
266
252
  return "\xE0 la minute " + minuteField + " et \xE0 la seconde " + schedule.pattern.second + " de chaque heure" + trailingQualifier(schedule, opts);
267
253
  }
254
+ if (secondsConfinesMinute(schedule)) {
255
+ return secondsBareLead(schedule) + " " + confinedMinutePhrase(schedule) + trailingQualifier(schedule, opts);
256
+ }
268
257
  return secondsLeadClause(schedule, opts) + ", \xE0 la minute " + minuteField + " de chaque heure" + trailingQualifier(schedule, opts);
269
258
  }
270
259
  function secondsListAtClock(schedule, rest, opts) {
@@ -297,19 +286,67 @@ function minuteStride(schedule) {
297
286
  const values = singleValues(segmentsOf(schedule, "minute"));
298
287
  return values && arithmeticStep(values);
299
288
  }
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);
289
+ function steppedMinuteConfinement(schedule, plan, lead, opts) {
290
+ return lead + ", " + render(schedule, plan.rest, opts) + trailingQualifier(schedule, opts);
309
291
  }
310
292
  function isSteppedMinuteSeconds(schedule, plan) {
311
293
  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
294
  }
295
+ function secondsBareLead(schedule) {
296
+ const secondField = schedule.pattern.second;
297
+ const shape = schedule.shapes.second;
298
+ if (shape === "range") {
299
+ const bounds = secondField.split("-");
300
+ return "chaque seconde de " + bounds[0] + " \xE0 " + bounds[1];
301
+ }
302
+ if (shape === "single") {
303
+ return "\xE0 la seconde " + secondField;
304
+ }
305
+ return "aux secondes " + joinList(segmentWords(segmentsOf(schedule, "second")));
306
+ }
307
+ function confinedMinutePhrase(schedule) {
308
+ if (schedule.shapes.minute === "range") {
309
+ return "de " + minuteRangeLead(schedule.pattern.minute) + " de chaque heure";
310
+ }
311
+ if (schedule.shapes.minute === "list") {
312
+ return "des minutes " + joinList(segmentWords(segmentsOf(schedule, "minute"))) + " de chaque heure";
313
+ }
314
+ return "de la minute " + schedule.pattern.minute + " de chaque heure";
315
+ }
316
+ function secondsConfinesMinute(schedule) {
317
+ const { second, minute, hour } = schedule.shapes;
318
+ if (second === "list") {
319
+ const values = singleValues(segmentsOf(schedule, "second"));
320
+ if (values && arithmeticStep(values)) {
321
+ return false;
322
+ }
323
+ }
324
+ const clockPoint = second === "single" || second === "range" || second === "list";
325
+ return clockPoint && minute !== "wildcard" && hour === "wildcard" && !(second === "single" && minute === "single");
326
+ }
327
+ function minuteConfinementRender(plan, schedule, opts) {
328
+ if (isSteppedMinuteSeconds(schedule, plan)) {
329
+ return steppedMinuteConfinement(
330
+ schedule,
331
+ plan,
332
+ secondsLeadClause(schedule, opts),
333
+ opts
334
+ );
335
+ }
336
+ const minuteRest = plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes" || plan.rest.kind === "rangeOfMinutes";
337
+ if (minuteRest && secondsConfinesMinute(schedule)) {
338
+ if (minuteStride(schedule) && schedule.pattern.minute !== "*/2") {
339
+ return steppedMinuteConfinement(
340
+ schedule,
341
+ plan,
342
+ secondsBareLead(schedule),
343
+ opts
344
+ );
345
+ }
346
+ return secondsBareLead(schedule) + " " + confinedMinutePhrase(schedule) + trailingQualifier(schedule, opts);
347
+ }
348
+ return null;
349
+ }
313
350
  function renderComposeSeconds(schedule, plan, opts) {
314
351
  const hourCad = composeHourCadence(schedule, plan, opts);
315
352
  if (hourCad !== null) {
@@ -328,8 +365,9 @@ function renderComposeSeconds(schedule, plan, opts) {
328
365
  const cadence = "toutes les " + numero(stepSegment(schedule, "second").interval, opts) + " secondes de la minute " + schedule.pattern.minute;
329
366
  return dayFrame + ", " + window + ", " + cadence;
330
367
  }
331
- if (isSteppedMinuteSeconds(schedule, plan)) {
332
- return minuteStepConfinement(schedule, minuteStride(schedule), opts);
368
+ const confined = minuteConfinementRender(plan, schedule, opts);
369
+ if (confined !== null) {
370
+ return confined;
333
371
  }
334
372
  if (isEveryOtherMinuteSeconds(schedule, plan)) {
335
373
  return secondsLeadClause(schedule, opts) + " de " + render(schedule, plan.rest, opts).replace(/^toutes les /u, "chaque ");
package/dist/lang/fr.js CHANGED
@@ -184,20 +184,6 @@ 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
- };
201
187
  function normalizeOptions(options) {
202
188
  options = options || {};
203
189
  const style = resolveDialect(options.dialect);
@@ -239,6 +225,9 @@ function renderSecondsWithinMinute(schedule, plan, opts) {
239
225
  if (plan.singleSecond) {
240
226
  return "\xE0 la minute " + minuteField + " et \xE0 la seconde " + schedule.pattern.second + " de chaque heure" + trailingQualifier(schedule, opts);
241
227
  }
228
+ if (secondsConfinesMinute(schedule)) {
229
+ return secondsBareLead(schedule) + " " + confinedMinutePhrase(schedule) + trailingQualifier(schedule, opts);
230
+ }
242
231
  return secondsLeadClause(schedule, opts) + ", \xE0 la minute " + minuteField + " de chaque heure" + trailingQualifier(schedule, opts);
243
232
  }
244
233
  function secondsListAtClock(schedule, rest, opts) {
@@ -271,19 +260,67 @@ function minuteStride(schedule) {
271
260
  const values = singleValues(segmentsOf(schedule, "minute"));
272
261
  return values && arithmeticStep(values);
273
262
  }
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);
263
+ function steppedMinuteConfinement(schedule, plan, lead, opts) {
264
+ return lead + ", " + render(schedule, plan.rest, opts) + trailingQualifier(schedule, opts);
283
265
  }
284
266
  function isSteppedMinuteSeconds(schedule, plan) {
285
267
  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
268
  }
269
+ function secondsBareLead(schedule) {
270
+ const secondField = schedule.pattern.second;
271
+ const shape = schedule.shapes.second;
272
+ if (shape === "range") {
273
+ const bounds = secondField.split("-");
274
+ return "chaque seconde de " + bounds[0] + " \xE0 " + bounds[1];
275
+ }
276
+ if (shape === "single") {
277
+ return "\xE0 la seconde " + secondField;
278
+ }
279
+ return "aux secondes " + joinList(segmentWords(segmentsOf(schedule, "second")));
280
+ }
281
+ function confinedMinutePhrase(schedule) {
282
+ if (schedule.shapes.minute === "range") {
283
+ return "de " + minuteRangeLead(schedule.pattern.minute) + " de chaque heure";
284
+ }
285
+ if (schedule.shapes.minute === "list") {
286
+ return "des minutes " + joinList(segmentWords(segmentsOf(schedule, "minute"))) + " de chaque heure";
287
+ }
288
+ return "de la minute " + schedule.pattern.minute + " de chaque heure";
289
+ }
290
+ function secondsConfinesMinute(schedule) {
291
+ const { second, minute, hour } = schedule.shapes;
292
+ if (second === "list") {
293
+ const values = singleValues(segmentsOf(schedule, "second"));
294
+ if (values && arithmeticStep(values)) {
295
+ return false;
296
+ }
297
+ }
298
+ const clockPoint = second === "single" || second === "range" || second === "list";
299
+ return clockPoint && minute !== "wildcard" && hour === "wildcard" && !(second === "single" && minute === "single");
300
+ }
301
+ function minuteConfinementRender(plan, schedule, opts) {
302
+ if (isSteppedMinuteSeconds(schedule, plan)) {
303
+ return steppedMinuteConfinement(
304
+ schedule,
305
+ plan,
306
+ secondsLeadClause(schedule, opts),
307
+ opts
308
+ );
309
+ }
310
+ const minuteRest = plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes" || plan.rest.kind === "rangeOfMinutes";
311
+ if (minuteRest && secondsConfinesMinute(schedule)) {
312
+ if (minuteStride(schedule) && schedule.pattern.minute !== "*/2") {
313
+ return steppedMinuteConfinement(
314
+ schedule,
315
+ plan,
316
+ secondsBareLead(schedule),
317
+ opts
318
+ );
319
+ }
320
+ return secondsBareLead(schedule) + " " + confinedMinutePhrase(schedule) + trailingQualifier(schedule, opts);
321
+ }
322
+ return null;
323
+ }
287
324
  function renderComposeSeconds(schedule, plan, opts) {
288
325
  const hourCad = composeHourCadence(schedule, plan, opts);
289
326
  if (hourCad !== null) {
@@ -302,8 +339,9 @@ function renderComposeSeconds(schedule, plan, opts) {
302
339
  const cadence = "toutes les " + numero(stepSegment(schedule, "second").interval, opts) + " secondes de la minute " + schedule.pattern.minute;
303
340
  return dayFrame + ", " + window + ", " + cadence;
304
341
  }
305
- if (isSteppedMinuteSeconds(schedule, plan)) {
306
- return minuteStepConfinement(schedule, minuteStride(schedule), opts);
342
+ const confined = minuteConfinementRender(plan, schedule, opts);
343
+ if (confined !== null) {
344
+ return confined;
307
345
  }
308
346
  if (isEveryOtherMinuteSeconds(schedule, plan)) {
309
347
  return secondsLeadClause(schedule, opts) + " de " + render(schedule, plan.rest, opts).replace(/^toutes les /u, "chaque ");
package/dist/lang/pt.cjs CHANGED
@@ -232,20 +232,6 @@ 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
- };
249
235
  function noonMidnightArticle(phrase) {
250
236
  if (phrase === "meio-dia") {
251
237
  return "o";
@@ -351,6 +337,9 @@ function renderSecondsWithinMinute(schedule, plan, opts) {
351
337
  if (plan.singleSecond) {
352
338
  return "no minuto " + minuteField + " e no segundo " + schedule.pattern.second + " de cada hora" + trailingQualifier(schedule, opts);
353
339
  }
340
+ if (secondsConfinesMinute(schedule)) {
341
+ return secondsBareLead(schedule) + " " + confinedMinutePhrase(schedule) + trailingQualifier(schedule, opts);
342
+ }
354
343
  return secondsLeadClause(schedule, opts) + ", no minuto " + minuteField + " de cada hora" + trailingQualifier(schedule, opts);
355
344
  }
356
345
  function secondsListAtClock(schedule, rest, opts) {
@@ -384,19 +373,68 @@ function minuteStride(schedule) {
384
373
  const values = singleValues(segmentsOf(schedule, "minute"));
385
374
  return values && arithmeticStep(values);
386
375
  }
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);
376
+ function steppedMinuteConfinement(schedule, plan, lead, opts) {
377
+ return lead + ", " + render(schedule, plan.rest, opts) + trailingQualifier(schedule, opts);
396
378
  }
397
379
  function isSteppedMinuteSeconds(schedule, plan) {
398
380
  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
381
  }
382
+ function secondsBareLead(schedule) {
383
+ const secondField = schedule.pattern.second;
384
+ const shape = schedule.shapes.second;
385
+ if (shape === "range") {
386
+ const bounds = secondField.split("-");
387
+ return "a cada segundo do " + bounds[0] + " ao " + bounds[1];
388
+ }
389
+ if (shape === "single") {
390
+ return "no segundo " + secondField;
391
+ }
392
+ return "nos segundos " + joinList(segmentWords(segmentsOf(schedule, "second")));
393
+ }
394
+ function confinedMinutePhrase(schedule) {
395
+ if (schedule.shapes.minute === "range") {
396
+ const range = minuteRangeLead(schedule.pattern.minute).replace(/^a /u, "");
397
+ return "de " + range + " de cada hora";
398
+ }
399
+ if (schedule.shapes.minute === "list") {
400
+ return "dos minutos " + joinList(segmentWords(segmentsOf(schedule, "minute"))) + " de cada hora";
401
+ }
402
+ return "do minuto " + schedule.pattern.minute + " de cada hora";
403
+ }
404
+ function secondsConfinesMinute(schedule) {
405
+ const { second, minute, hour } = schedule.shapes;
406
+ if (second === "list") {
407
+ const values = singleValues(segmentsOf(schedule, "second"));
408
+ if (values && arithmeticStep(values)) {
409
+ return false;
410
+ }
411
+ }
412
+ const clockPoint = second === "single" || second === "range" || second === "list";
413
+ return clockPoint && minute !== "wildcard" && hour === "wildcard" && !(second === "single" && minute === "single");
414
+ }
415
+ function minuteConfinementRender(plan, schedule, opts) {
416
+ if (isSteppedMinuteSeconds(schedule, plan)) {
417
+ return steppedMinuteConfinement(
418
+ schedule,
419
+ plan,
420
+ secondsLeadClause(schedule, opts),
421
+ opts
422
+ );
423
+ }
424
+ const minuteRest = plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes" || plan.rest.kind === "rangeOfMinutes";
425
+ if (minuteRest && secondsConfinesMinute(schedule)) {
426
+ if (minuteStride(schedule) && schedule.pattern.minute !== "*/2") {
427
+ return steppedMinuteConfinement(
428
+ schedule,
429
+ plan,
430
+ secondsBareLead(schedule),
431
+ opts
432
+ );
433
+ }
434
+ return secondsBareLead(schedule) + " " + confinedMinutePhrase(schedule) + trailingQualifier(schedule, opts);
435
+ }
436
+ return null;
437
+ }
400
438
  function renderComposeSeconds(schedule, plan, opts) {
401
439
  const hourCad = composeHourCadence(schedule, plan, opts);
402
440
  if (hourCad !== null) {
@@ -415,8 +453,9 @@ function renderComposeSeconds(schedule, plan, opts) {
415
453
  const cadence = "a cada " + numero(stepSegment(schedule, "second").interval, opts) + " segundos do minuto " + schedule.pattern.minute;
416
454
  return dayFrame + ", " + window + ", " + cadence;
417
455
  }
418
- if (isSteppedMinuteSeconds(schedule, plan)) {
419
- return minuteStepConfinement(schedule, minuteStride(schedule), opts);
456
+ const confined = minuteConfinementRender(plan, schedule, opts);
457
+ if (confined !== null) {
458
+ return confined;
420
459
  }
421
460
  if (isEveryOtherMinuteSeconds(schedule, plan)) {
422
461
  const rest = render(schedule, plan.rest, opts).replace(/^a /u, "");