cronli5 0.8.2 → 0.8.5

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/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",
@@ -364,6 +378,9 @@ function renderSecondsWithinMinute(schedule, plan, opts) {
364
378
  if (plan.singleSecond) {
365
379
  return units.minute.mark + " " + minuteField + " " + units.minute.gen + " ja " + schedule.pattern.second + " " + units.second.gen + " kohdalla" + trailingQualifier(schedule, opts);
366
380
  }
381
+ if (secondsConfinesMinute(schedule)) {
382
+ return secondsConfinement(schedule, opts);
383
+ }
367
384
  return secondsLeadClause(schedule, opts) + ", " + atMarks(minuteField, units.minute, true) + trailingQualifier(schedule, opts);
368
385
  }
369
386
  function composeSecondsOverMinuteStep(schedule, freq, opts) {
@@ -391,11 +408,64 @@ function composeHourCadence(schedule, plan, opts) {
391
408
  const minute = +schedule.pattern.minute;
392
409
  return hourCadence(schedule, minute, opts) ?? hourRangeCadence(schedule, minute, opts);
393
410
  }
411
+ function minuteStride(schedule) {
412
+ if (schedule.shapes.minute === "step") {
413
+ const segment = stepSegment(schedule, "minute");
414
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
415
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
416
+ }
417
+ const values = singleValues(segmentsOf(schedule, "minute"));
418
+ return values && arithmeticStep(values);
419
+ }
420
+ function minuteStepConfinement(schedule, stride, opts) {
421
+ const ordinalForm = minuteStepOrdinals[stride.interval];
422
+ const minute = units.minute;
423
+ const head = ordinalForm ? " joka " + ordinalForm + " minuuttina" : " " + genitive(stride.interval, opts) + " " + minute.gen + " v\xE4lein";
424
+ const tail = renderStride({ ...stride, cycle: 60 }, {
425
+ bare: () => "",
426
+ offset: () => " " + minute.anchor + " " + minute.ela + " " + stride.start + " alkaen",
427
+ bounded: () => " " + minute.ela + " " + stride.start + " " + minute.ill + " " + stride.last
428
+ });
429
+ return secondsLeadClause(schedule, opts) + head + tail + trailingQualifier(schedule, opts);
430
+ }
431
+ function isSteppedMinuteSeconds(schedule, plan) {
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;
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
+ }
394
458
  function renderComposeSeconds(schedule, plan, opts) {
395
459
  const cadence = composeHourCadence(schedule, plan, opts);
396
460
  if (cadence !== null) {
397
461
  return cadence;
398
462
  }
463
+ if (isSteppedMinuteSeconds(schedule, plan)) {
464
+ return minuteStepConfinement(schedule, minuteStride(schedule), opts);
465
+ }
466
+ if (composeConfinesMinute(plan, schedule)) {
467
+ return secondsConfinement(schedule, opts);
468
+ }
399
469
  if (plan.rest.kind === "minuteFrequency" && schedule.pattern.second !== "*") {
400
470
  return composeSecondsOverMinuteStep(schedule, plan.rest, opts);
401
471
  }
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",
@@ -338,6 +352,9 @@ function renderSecondsWithinMinute(schedule, plan, opts) {
338
352
  if (plan.singleSecond) {
339
353
  return units.minute.mark + " " + minuteField + " " + units.minute.gen + " ja " + schedule.pattern.second + " " + units.second.gen + " kohdalla" + trailingQualifier(schedule, opts);
340
354
  }
355
+ if (secondsConfinesMinute(schedule)) {
356
+ return secondsConfinement(schedule, opts);
357
+ }
341
358
  return secondsLeadClause(schedule, opts) + ", " + atMarks(minuteField, units.minute, true) + trailingQualifier(schedule, opts);
342
359
  }
343
360
  function composeSecondsOverMinuteStep(schedule, freq, opts) {
@@ -365,11 +382,64 @@ function composeHourCadence(schedule, plan, opts) {
365
382
  const minute = +schedule.pattern.minute;
366
383
  return hourCadence(schedule, minute, opts) ?? hourRangeCadence(schedule, minute, opts);
367
384
  }
385
+ function minuteStride(schedule) {
386
+ if (schedule.shapes.minute === "step") {
387
+ const segment = stepSegment(schedule, "minute");
388
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
389
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
390
+ }
391
+ const values = singleValues(segmentsOf(schedule, "minute"));
392
+ return values && arithmeticStep(values);
393
+ }
394
+ function minuteStepConfinement(schedule, stride, opts) {
395
+ const ordinalForm = minuteStepOrdinals[stride.interval];
396
+ const minute = units.minute;
397
+ const head = ordinalForm ? " joka " + ordinalForm + " minuuttina" : " " + genitive(stride.interval, opts) + " " + minute.gen + " v\xE4lein";
398
+ const tail = renderStride({ ...stride, cycle: 60 }, {
399
+ bare: () => "",
400
+ offset: () => " " + minute.anchor + " " + minute.ela + " " + stride.start + " alkaen",
401
+ bounded: () => " " + minute.ela + " " + stride.start + " " + minute.ill + " " + stride.last
402
+ });
403
+ return secondsLeadClause(schedule, opts) + head + tail + trailingQualifier(schedule, opts);
404
+ }
405
+ function isSteppedMinuteSeconds(schedule, plan) {
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;
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
+ }
368
432
  function renderComposeSeconds(schedule, plan, opts) {
369
433
  const cadence = composeHourCadence(schedule, plan, opts);
370
434
  if (cadence !== null) {
371
435
  return cadence;
372
436
  }
437
+ if (isSteppedMinuteSeconds(schedule, plan)) {
438
+ return minuteStepConfinement(schedule, minuteStride(schedule), opts);
439
+ }
440
+ if (composeConfinesMinute(plan, schedule)) {
441
+ return secondsConfinement(schedule, opts);
442
+ }
373
443
  if (plan.rest.kind === "minuteFrequency" && schedule.pattern.second !== "*") {
374
444
  return composeSecondsOverMinuteStep(schedule, plan.rest, opts);
375
445
  }
package/dist/lang/fr.cjs CHANGED
@@ -251,6 +251,9 @@ function renderSecondsWithinMinute(schedule, plan, opts) {
251
251
  if (plan.singleSecond) {
252
252
  return "\xE0 la minute " + minuteField + " et \xE0 la seconde " + schedule.pattern.second + " de chaque heure" + trailingQualifier(schedule, opts);
253
253
  }
254
+ if (secondsConfinesMinute(schedule)) {
255
+ return secondsBareLead(schedule) + " " + confinedMinutePhrase(schedule) + trailingQualifier(schedule, opts);
256
+ }
254
257
  return secondsLeadClause(schedule, opts) + ", \xE0 la minute " + minuteField + " de chaque heure" + trailingQualifier(schedule, opts);
255
258
  }
256
259
  function secondsListAtClock(schedule, rest, opts) {
@@ -274,6 +277,76 @@ function composeHourCadence(schedule, plan, opts) {
274
277
  function isPinnedMinuteSeconds(schedule, plan) {
275
278
  return plan.rest.kind === "clockTimes" && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step");
276
279
  }
280
+ function minuteStride(schedule) {
281
+ if (schedule.shapes.minute === "step") {
282
+ const segment = stepSegment(schedule, "minute");
283
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
284
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
285
+ }
286
+ const values = singleValues(segmentsOf(schedule, "minute"));
287
+ return values && arithmeticStep(values);
288
+ }
289
+ function steppedMinuteConfinement(schedule, plan, lead, opts) {
290
+ return lead + ", " + render(schedule, plan.rest, opts) + trailingQualifier(schedule, opts);
291
+ }
292
+ function isSteppedMinuteSeconds(schedule, plan) {
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;
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
+ }
277
350
  function renderComposeSeconds(schedule, plan, opts) {
278
351
  const hourCad = composeHourCadence(schedule, plan, opts);
279
352
  if (hourCad !== null) {
@@ -292,6 +365,10 @@ function renderComposeSeconds(schedule, plan, opts) {
292
365
  const cadence = "toutes les " + numero(stepSegment(schedule, "second").interval, opts) + " secondes de la minute " + schedule.pattern.minute;
293
366
  return dayFrame + ", " + window + ", " + cadence;
294
367
  }
368
+ const confined = minuteConfinementRender(plan, schedule, opts);
369
+ if (confined !== null) {
370
+ return confined;
371
+ }
295
372
  if (isEveryOtherMinuteSeconds(schedule, plan)) {
296
373
  return secondsLeadClause(schedule, opts) + " de " + render(schedule, plan.rest, opts).replace(/^toutes les /u, "chaque ");
297
374
  }
package/dist/lang/fr.js CHANGED
@@ -225,6 +225,9 @@ function renderSecondsWithinMinute(schedule, plan, opts) {
225
225
  if (plan.singleSecond) {
226
226
  return "\xE0 la minute " + minuteField + " et \xE0 la seconde " + schedule.pattern.second + " de chaque heure" + trailingQualifier(schedule, opts);
227
227
  }
228
+ if (secondsConfinesMinute(schedule)) {
229
+ return secondsBareLead(schedule) + " " + confinedMinutePhrase(schedule) + trailingQualifier(schedule, opts);
230
+ }
228
231
  return secondsLeadClause(schedule, opts) + ", \xE0 la minute " + minuteField + " de chaque heure" + trailingQualifier(schedule, opts);
229
232
  }
230
233
  function secondsListAtClock(schedule, rest, opts) {
@@ -248,6 +251,76 @@ function composeHourCadence(schedule, plan, opts) {
248
251
  function isPinnedMinuteSeconds(schedule, plan) {
249
252
  return plan.rest.kind === "clockTimes" && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step");
250
253
  }
254
+ function minuteStride(schedule) {
255
+ if (schedule.shapes.minute === "step") {
256
+ const segment = stepSegment(schedule, "minute");
257
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
258
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
259
+ }
260
+ const values = singleValues(segmentsOf(schedule, "minute"));
261
+ return values && arithmeticStep(values);
262
+ }
263
+ function steppedMinuteConfinement(schedule, plan, lead, opts) {
264
+ return lead + ", " + render(schedule, plan.rest, opts) + trailingQualifier(schedule, opts);
265
+ }
266
+ function isSteppedMinuteSeconds(schedule, plan) {
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;
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
+ }
251
324
  function renderComposeSeconds(schedule, plan, opts) {
252
325
  const hourCad = composeHourCadence(schedule, plan, opts);
253
326
  if (hourCad !== null) {
@@ -266,6 +339,10 @@ function renderComposeSeconds(schedule, plan, opts) {
266
339
  const cadence = "toutes les " + numero(stepSegment(schedule, "second").interval, opts) + " secondes de la minute " + schedule.pattern.minute;
267
340
  return dayFrame + ", " + window + ", " + cadence;
268
341
  }
342
+ const confined = minuteConfinementRender(plan, schedule, opts);
343
+ if (confined !== null) {
344
+ return confined;
345
+ }
269
346
  if (isEveryOtherMinuteSeconds(schedule, plan)) {
270
347
  return secondsLeadClause(schedule, opts) + " de " + render(schedule, plan.rest, opts).replace(/^toutes les /u, "chaque ");
271
348
  }
package/dist/lang/pt.cjs CHANGED
@@ -337,6 +337,9 @@ function renderSecondsWithinMinute(schedule, plan, opts) {
337
337
  if (plan.singleSecond) {
338
338
  return "no minuto " + minuteField + " e no segundo " + schedule.pattern.second + " de cada hora" + trailingQualifier(schedule, opts);
339
339
  }
340
+ if (secondsConfinesMinute(schedule)) {
341
+ return secondsBareLead(schedule) + " " + confinedMinutePhrase(schedule) + trailingQualifier(schedule, opts);
342
+ }
340
343
  return secondsLeadClause(schedule, opts) + ", no minuto " + minuteField + " de cada hora" + trailingQualifier(schedule, opts);
341
344
  }
342
345
  function secondsListAtClock(schedule, rest, opts) {
@@ -361,6 +364,77 @@ function composeHourCadence(schedule, plan, opts) {
361
364
  function isPinnedMinuteSeconds(schedule, plan) {
362
365
  return plan.rest.kind === "clockTimes" && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step");
363
366
  }
367
+ function minuteStride(schedule) {
368
+ if (schedule.shapes.minute === "step") {
369
+ const segment = stepSegment(schedule, "minute");
370
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
371
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
372
+ }
373
+ const values = singleValues(segmentsOf(schedule, "minute"));
374
+ return values && arithmeticStep(values);
375
+ }
376
+ function steppedMinuteConfinement(schedule, plan, lead, opts) {
377
+ return lead + ", " + render(schedule, plan.rest, opts) + trailingQualifier(schedule, opts);
378
+ }
379
+ function isSteppedMinuteSeconds(schedule, plan) {
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;
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
+ }
364
438
  function renderComposeSeconds(schedule, plan, opts) {
365
439
  const hourCad = composeHourCadence(schedule, plan, opts);
366
440
  if (hourCad !== null) {
@@ -379,6 +453,10 @@ function renderComposeSeconds(schedule, plan, opts) {
379
453
  const cadence = "a cada " + numero(stepSegment(schedule, "second").interval, opts) + " segundos do minuto " + schedule.pattern.minute;
380
454
  return dayFrame + ", " + window + ", " + cadence;
381
455
  }
456
+ const confined = minuteConfinementRender(plan, schedule, opts);
457
+ if (confined !== null) {
458
+ return confined;
459
+ }
382
460
  if (isEveryOtherMinuteSeconds(schedule, plan)) {
383
461
  const rest = render(schedule, plan.rest, opts).replace(/^a /u, "");
384
462
  return secondsLeadClause(schedule, opts) + " de " + rest;
package/dist/lang/pt.js CHANGED
@@ -311,6 +311,9 @@ function renderSecondsWithinMinute(schedule, plan, opts) {
311
311
  if (plan.singleSecond) {
312
312
  return "no minuto " + minuteField + " e no segundo " + schedule.pattern.second + " de cada hora" + trailingQualifier(schedule, opts);
313
313
  }
314
+ if (secondsConfinesMinute(schedule)) {
315
+ return secondsBareLead(schedule) + " " + confinedMinutePhrase(schedule) + trailingQualifier(schedule, opts);
316
+ }
314
317
  return secondsLeadClause(schedule, opts) + ", no minuto " + minuteField + " de cada hora" + trailingQualifier(schedule, opts);
315
318
  }
316
319
  function secondsListAtClock(schedule, rest, opts) {
@@ -335,6 +338,77 @@ function composeHourCadence(schedule, plan, opts) {
335
338
  function isPinnedMinuteSeconds(schedule, plan) {
336
339
  return plan.rest.kind === "clockTimes" && (schedule.shapes.second === "wildcard" || schedule.shapes.second === "step");
337
340
  }
341
+ function minuteStride(schedule) {
342
+ if (schedule.shapes.minute === "step") {
343
+ const segment = stepSegment(schedule, "minute");
344
+ const start = segment.startToken === "*" ? 0 : +segment.startToken;
345
+ return { interval: segment.interval, last: segment.fires[segment.fires.length - 1], start };
346
+ }
347
+ const values = singleValues(segmentsOf(schedule, "minute"));
348
+ return values && arithmeticStep(values);
349
+ }
350
+ function steppedMinuteConfinement(schedule, plan, lead, opts) {
351
+ return lead + ", " + render(schedule, plan.rest, opts) + trailingQualifier(schedule, opts);
352
+ }
353
+ function isSteppedMinuteSeconds(schedule, plan) {
354
+ 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;
355
+ }
356
+ function secondsBareLead(schedule) {
357
+ const secondField = schedule.pattern.second;
358
+ const shape = schedule.shapes.second;
359
+ if (shape === "range") {
360
+ const bounds = secondField.split("-");
361
+ return "a cada segundo do " + bounds[0] + " ao " + bounds[1];
362
+ }
363
+ if (shape === "single") {
364
+ return "no segundo " + secondField;
365
+ }
366
+ return "nos segundos " + joinList(segmentWords(segmentsOf(schedule, "second")));
367
+ }
368
+ function confinedMinutePhrase(schedule) {
369
+ if (schedule.shapes.minute === "range") {
370
+ const range = minuteRangeLead(schedule.pattern.minute).replace(/^a /u, "");
371
+ return "de " + range + " de cada hora";
372
+ }
373
+ if (schedule.shapes.minute === "list") {
374
+ return "dos minutos " + joinList(segmentWords(segmentsOf(schedule, "minute"))) + " de cada hora";
375
+ }
376
+ return "do minuto " + schedule.pattern.minute + " de cada hora";
377
+ }
378
+ function secondsConfinesMinute(schedule) {
379
+ const { second, minute, hour } = schedule.shapes;
380
+ if (second === "list") {
381
+ const values = singleValues(segmentsOf(schedule, "second"));
382
+ if (values && arithmeticStep(values)) {
383
+ return false;
384
+ }
385
+ }
386
+ const clockPoint = second === "single" || second === "range" || second === "list";
387
+ return clockPoint && minute !== "wildcard" && hour === "wildcard" && !(second === "single" && minute === "single");
388
+ }
389
+ function minuteConfinementRender(plan, schedule, opts) {
390
+ if (isSteppedMinuteSeconds(schedule, plan)) {
391
+ return steppedMinuteConfinement(
392
+ schedule,
393
+ plan,
394
+ secondsLeadClause(schedule, opts),
395
+ opts
396
+ );
397
+ }
398
+ const minuteRest = plan.rest.kind === "minuteFrequency" || plan.rest.kind === "multipleMinutes" || plan.rest.kind === "rangeOfMinutes";
399
+ if (minuteRest && secondsConfinesMinute(schedule)) {
400
+ if (minuteStride(schedule) && schedule.pattern.minute !== "*/2") {
401
+ return steppedMinuteConfinement(
402
+ schedule,
403
+ plan,
404
+ secondsBareLead(schedule),
405
+ opts
406
+ );
407
+ }
408
+ return secondsBareLead(schedule) + " " + confinedMinutePhrase(schedule) + trailingQualifier(schedule, opts);
409
+ }
410
+ return null;
411
+ }
338
412
  function renderComposeSeconds(schedule, plan, opts) {
339
413
  const hourCad = composeHourCadence(schedule, plan, opts);
340
414
  if (hourCad !== null) {
@@ -353,6 +427,10 @@ function renderComposeSeconds(schedule, plan, opts) {
353
427
  const cadence = "a cada " + numero(stepSegment(schedule, "second").interval, opts) + " segundos do minuto " + schedule.pattern.minute;
354
428
  return dayFrame + ", " + window + ", " + cadence;
355
429
  }
430
+ const confined = minuteConfinementRender(plan, schedule, opts);
431
+ if (confined !== null) {
432
+ return confined;
433
+ }
356
434
  if (isEveryOtherMinuteSeconds(schedule, plan)) {
357
435
  const rest = render(schedule, plan.rest, opts).replace(/^a /u, "");
358
436
  return secondsLeadClause(schedule, opts) + " de " + rest;
package/dist/lang/zh.cjs CHANGED
@@ -573,8 +573,8 @@ function secondClause(schedule) {
573
573
  return "\u6BCF\u79D2";
574
574
  }
575
575
  const first = segs[0];
576
- if (segs.length === 1 && first.kind === "step" && first.startToken === "*") {
577
- return cadence(first.interval, UNITS.second);
576
+ if (segs.length === 1 && first.kind === "step") {
577
+ return stepClause(first, "\u79D2", "\u79D2", "\u6BCF\u5206\u949F");
578
578
  }
579
579
  return strideFromSegments(segs, "\u79D2", "\u79D2", "\u6BCF\u5206\u949F") ?? "\u7B2C" + valueText(segs) + "\u79D2";
580
580
  }
@@ -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
  }
@@ -670,6 +670,9 @@ function composeSecondsCadence(schedule) {
670
670
  return "\u6BCF\u5076\u6570\u5206\u949F\u7684\u6BCF\u4E00\u79D2";
671
671
  }
672
672
  }
673
+ if (!secondIsCadence(schedule) && !secondIsStride(schedule)) {
674
+ return minuteClause(schedule) + "\u7684" + sec;
675
+ }
673
676
  return sec + "\uFF0C" + minuteClause(schedule);
674
677
  }
675
678
  return hourFrame(schedule) + tail;
@@ -683,7 +686,7 @@ function composeSecondsListed(schedule) {
683
686
  return hourWord(hourFires(schedule)[0]) + minuteCad + "\u7684\u6BCF\u4E00\u79D2";
684
687
  }
685
688
  if (schedule.shapes.hour === "wildcard") {
686
- return minutes + "\uFF0C" + sec;
689
+ return secondIsStride(schedule) ? minutes + "\uFF0C" + sec : minutes + confinedSecondTail(sec);
687
690
  }
688
691
  const hourCad = unevenHourCadence(schedule);
689
692
  if (hourCad !== null) {
@@ -691,9 +694,38 @@ function composeSecondsListed(schedule) {
691
694
  }
692
695
  return hourFrame(schedule) + minutes + "\uFF0C" + sec;
693
696
  }
697
+ function isMinuteStride(schedule) {
698
+ if (schedule.shapes.minute === "step") {
699
+ return true;
700
+ }
701
+ const values = singleValues(segmentsOf(schedule, "minute"));
702
+ return values !== null && arithmeticStep(values) !== null;
703
+ }
704
+ function secondIsCadence(schedule) {
705
+ return schedule.pattern.second === "*" || schedule.shapes.second === "step";
706
+ }
707
+ function secondIsStride(schedule) {
708
+ if (schedule.shapes.second !== "list") {
709
+ return false;
710
+ }
711
+ const values = singleValues(segmentsOf(schedule, "second"));
712
+ return values !== null && arithmeticStep(values) !== null;
713
+ }
714
+ function confinedSecondTail(sec) {
715
+ return sec === "\u6BCF\u79D2" ? "\u7684\u6BCF\u4E00\u79D2" : "\u7684" + sec;
716
+ }
717
+ function isSteppedMinuteSeconds(schedule, composedClock) {
718
+ return !composedClock && schedule.shapes.hour === "wildcard" && secondIsCadence(schedule) && schedule.pattern.minute !== "*/2" && isMinuteStride(schedule);
719
+ }
720
+ function minuteStrideConfinement(schedule) {
721
+ return minuteHourClause(schedule) + confinedSecondTail(secondClause(schedule));
722
+ }
694
723
  function renderComposeSeconds(schedule, plan, opts) {
695
724
  const { rest } = plan;
696
725
  const composedClock = rest.kind === "clockTimes" || rest.kind === "compactClockTimes";
726
+ if (isSteppedMinuteSeconds(schedule, composedClock)) {
727
+ return minuteStrideConfinement(schedule);
728
+ }
697
729
  if (schedule.pattern.minute === "0" || composedClock && schedule.shapes.minute === "single") {
698
730
  return composeSecondsOnHour(schedule, plan, opts);
699
731
  }