gantt-lib 0.124.2 → 0.126.0

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.
@@ -368,9 +368,10 @@ declare function getTaskDuration(startDate: string | Date, endDate: string | Dat
368
368
 
369
369
  /**
370
370
  * Normalize predecessor dates for scheduling calculations.
371
- * For milestone tasks, the scheduling "finish" anchor is treated as the day
372
- * before startDate. This preserves the standard inclusive FS formula
373
- * (`predEnd + lag + 1`) while making milestone FS lag=0 land on the same day.
371
+ * Milestones have a real zero-duration finish anchor at startDate. The
372
+ * successor type, rather than a fabricated predecessor date, determines
373
+ * whether FS lag=0 lands on the same day (milestone successor) or the next
374
+ * day (regular successor).
374
375
  */
375
376
  declare function normalizePredecessorDates(predecessor: Pick<Task, 'startDate' | 'endDate' | 'type'>, parseDateFn: (d: string | Date) => Date): {
376
377
  predStart: Date;
@@ -388,30 +389,34 @@ declare function getDependencyLag(dep: Pick<TaskDependency, 'lag'>): number;
388
389
  */
389
390
  declare function normalizeTaskDependencyLags<TTask extends Pick<Task, 'dependencies'>>(task: TTask): TTask;
390
391
  /**
391
- * Normalize lag for FS links — clamp to >= -predecessorDuration.
392
+ * Normalize lag for FS links. Regular successors clamp to
393
+ * `-predecessorDuration`; milestone successors use one fewer day because
394
+ * their zero-duration FS anchor is the predecessor finish date itself.
392
395
  */
393
- declare function normalizeDependencyLag(linkType: LinkType, lag: number, predecessorStart: Date, predecessorEnd: Date, businessDays?: boolean, weekendPredicate?: (date: Date) => boolean): number;
396
+ declare function normalizeDependencyLag(linkType: LinkType, lag: number, predecessorStart: Date, predecessorEnd: Date, businessDays?: boolean, weekendPredicate?: (date: Date) => boolean, successorType?: Task['type']): number;
394
397
  /**
395
398
  * Compute lag (in days) from actual predecessor/successor dates.
396
399
  * This is the single source of truth for lag semantics.
397
400
  *
398
401
  * Semantics (lag=0 = natural, gap-free connection):
399
- * - FS: lag = succStart - predEnd - 1 (adjacent days = 0)
402
+ * - FS: lag = succStart - predEnd - 1 (adjacent regular-task days = 0)
403
+ * milestone successor uses succStart - predEnd (same-day = 0)
400
404
  * - SS: lag = succStart - predStart
401
405
  * - FF: lag = succEnd - predEnd
402
406
  * - SF: lag = succEnd - predStart + 1 (symmetric to FS)
403
407
  */
404
- declare function computeLagFromDates(linkType: LinkType, predStart: Date, predEnd: Date, succStart: Date, succEnd: Date, businessDays?: boolean, weekendPredicate?: (date: Date) => boolean): number;
408
+ declare function computeLagFromDates(linkType: LinkType, predStart: Date, predEnd: Date, succStart: Date, succEnd: Date, businessDays?: boolean, weekendPredicate?: (date: Date) => boolean, successorType?: Task['type']): number;
405
409
  /**
406
410
  * Calculate successor date based on predecessor dates, link type, and lag.
407
411
  *
408
412
  * Link type semantics:
409
- * - FS: Successor start = Predecessor end + lag + 1 day (lag=0 -> next day)
413
+ * - FS: Successor start = Predecessor end + lag + 1 day for regular tasks
414
+ * and Predecessor end + lag for milestone successors
410
415
  * - SS: Successor start = Predecessor start + lag
411
416
  * - FF: Successor end = Predecessor end + lag
412
417
  * - SF: Successor end = Predecessor start + lag - 1 day (lag=0 -> day before)
413
418
  */
414
- declare function calculateSuccessorDate(predecessorStart: Date, predecessorEnd: Date, linkType: LinkType, lag?: number, businessDays?: boolean, weekendPredicate?: (date: Date) => boolean): Date;
419
+ declare function calculateSuccessorDate(predecessorStart: Date, predecessorEnd: Date, linkType: LinkType, lag?: number, businessDays?: boolean, weekendPredicate?: (date: Date) => boolean, successorType?: Task['type']): Date;
415
420
 
416
421
  /**
417
422
  * Critical path (CPM) calculation over dependency links.
@@ -526,7 +531,7 @@ declare function moveTaskRange(originalStart: string | Date, originalEnd: string
526
531
  /**
527
532
  * Clamp task range start date based on incoming FS dependencies.
528
533
  */
529
- declare function clampTaskRangeForIncomingFS(task: Pick<Task, 'dependencies'>, proposedStart: Date, proposedEnd: Date, allTasks: Task[], businessDays?: boolean, weekendPredicate?: (date: Date) => boolean, taskById?: Map<string, Task>): {
534
+ declare function clampTaskRangeForIncomingFS(task: Pick<Task, 'dependencies' | 'type'>, proposedStart: Date, proposedEnd: Date, allTasks: Task[], businessDays?: boolean, weekendPredicate?: (date: Date) => boolean, taskById?: Map<string, Task>): {
530
535
  start: Date;
531
536
  end: Date;
532
537
  };