react-native-roster 0.0.0 → 0.1.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.
- package/NOTICE.md +29 -0
- package/README.md +455 -2
- package/dist/src/adapters/rrule/cache.d.ts +15 -0
- package/dist/src/adapters/rrule/cache.d.ts.map +1 -0
- package/dist/src/adapters/rrule/cache.js +53 -0
- package/dist/src/adapters/rrule/cache.js.map +1 -0
- package/dist/src/adapters/rrule/envelope.d.ts +3 -0
- package/dist/src/adapters/rrule/envelope.d.ts.map +1 -0
- package/dist/src/adapters/rrule/envelope.js +9 -0
- package/dist/src/adapters/rrule/envelope.js.map +1 -0
- package/dist/src/adapters/rrule/expand.d.ts +4 -0
- package/dist/src/adapters/rrule/expand.d.ts.map +1 -0
- package/dist/src/adapters/rrule/expand.js +92 -0
- package/dist/src/adapters/rrule/expand.js.map +1 -0
- package/dist/src/adapters/rrule/hash.d.ts +3 -0
- package/dist/src/adapters/rrule/hash.d.ts.map +1 -0
- package/dist/src/adapters/rrule/hash.js +15 -0
- package/dist/src/adapters/rrule/hash.js.map +1 -0
- package/dist/src/adapters/rrule/index.d.ts +5 -0
- package/dist/src/adapters/rrule/index.d.ts.map +1 -0
- package/dist/src/adapters/rrule/index.js +12 -0
- package/dist/src/adapters/rrule/index.js.map +1 -0
- package/dist/src/adapters/rrule/net.d.ts +6 -0
- package/dist/src/adapters/rrule/net.d.ts.map +1 -0
- package/dist/src/adapters/rrule/net.js +31 -0
- package/dist/src/adapters/rrule/net.js.map +1 -0
- package/dist/src/adapters/rrule/occurrences.d.ts +6 -0
- package/dist/src/adapters/rrule/occurrences.d.ts.map +1 -0
- package/dist/src/adapters/rrule/occurrences.js +252 -0
- package/dist/src/adapters/rrule/occurrences.js.map +1 -0
- package/dist/src/adapters/rrule/types.d.ts +62 -0
- package/dist/src/adapters/rrule/types.d.ts.map +1 -0
- package/dist/src/adapters/rrule/types.js +3 -0
- package/dist/src/adapters/rrule/types.js.map +1 -0
- package/dist/src/adapters/rrule/validate.d.ts +6 -0
- package/dist/src/adapters/rrule/validate.d.ts.map +1 -0
- package/dist/src/adapters/rrule/validate.js +64 -0
- package/dist/src/adapters/rrule/validate.js.map +1 -0
- package/dist/src/components/layers/layers.types.d.ts +15 -0
- package/dist/src/components/layers/layers.types.d.ts.map +1 -0
- package/dist/src/components/layers/layers.types.js +3 -0
- package/dist/src/components/layers/layers.types.js.map +1 -0
- package/dist/src/components/layers/parts/gap.d.ts +3 -0
- package/dist/src/components/layers/parts/gap.d.ts.map +1 -0
- package/dist/src/components/layers/parts/gap.js +7 -0
- package/dist/src/components/layers/parts/gap.js.map +1 -0
- package/dist/src/components/layers/parts/interval.d.ts +3 -0
- package/dist/src/components/layers/parts/interval.d.ts.map +1 -0
- package/dist/src/components/layers/parts/interval.js +22 -0
- package/dist/src/components/layers/parts/interval.js.map +1 -0
- package/dist/src/components/layers/utils/styles.d.ts +7 -0
- package/dist/src/components/layers/utils/styles.d.ts.map +1 -0
- package/dist/src/components/layers/utils/styles.js +24 -0
- package/dist/src/components/layers/utils/styles.js.map +1 -0
- package/dist/src/components/primitives/press-point.d.ts +3 -0
- package/dist/src/components/primitives/press-point.d.ts.map +1 -0
- package/dist/src/components/primitives/press-point.js +7 -0
- package/dist/src/components/primitives/press-point.js.map +1 -0
- package/dist/src/components/primitives/press-point.types.d.ts +14 -0
- package/dist/src/components/primitives/press-point.types.d.ts.map +1 -0
- package/dist/src/components/primitives/press-point.types.js +3 -0
- package/dist/src/components/primitives/press-point.types.js.map +1 -0
- package/dist/src/components/primitives/press-point.web.d.ts +3 -0
- package/dist/src/components/primitives/press-point.web.d.ts.map +1 -0
- package/dist/src/components/primitives/press-point.web.js +17 -0
- package/dist/src/components/primitives/press-point.web.js.map +1 -0
- package/dist/src/components/primitives/region-style.d.ts +9 -0
- package/dist/src/components/primitives/region-style.d.ts.map +1 -0
- package/dist/src/components/primitives/region-style.js +20 -0
- package/dist/src/components/primitives/region-style.js.map +1 -0
- package/dist/src/components/roster/body-layout.d.ts +9 -0
- package/dist/src/components/roster/body-layout.d.ts.map +1 -0
- package/dist/src/components/roster/body-layout.js +9 -0
- package/dist/src/components/roster/body-layout.js.map +1 -0
- package/dist/src/components/roster/index.d.ts +3 -0
- package/dist/src/components/roster/index.d.ts.map +1 -0
- package/dist/src/components/roster/index.js +40 -0
- package/dist/src/components/roster/index.js.map +1 -0
- package/dist/src/components/roster/lanes/interval-hover.d.ts +3 -0
- package/dist/src/components/roster/lanes/interval-hover.d.ts.map +1 -0
- package/dist/src/components/roster/lanes/interval-hover.js +7 -0
- package/dist/src/components/roster/lanes/interval-hover.js.map +1 -0
- package/dist/src/components/roster/lanes/interval-hover.types.d.ts +15 -0
- package/dist/src/components/roster/lanes/interval-hover.types.d.ts.map +1 -0
- package/dist/src/components/roster/lanes/interval-hover.types.js +3 -0
- package/dist/src/components/roster/lanes/interval-hover.types.js.map +1 -0
- package/dist/src/components/roster/lanes/interval-hover.web.d.ts +3 -0
- package/dist/src/components/roster/lanes/interval-hover.web.d.ts.map +1 -0
- package/dist/src/components/roster/lanes/interval-hover.web.js +20 -0
- package/dist/src/components/roster/lanes/interval-hover.web.js.map +1 -0
- package/dist/src/components/roster/lanes/lane.d.ts +10 -0
- package/dist/src/components/roster/lanes/lane.d.ts.map +1 -0
- package/dist/src/components/roster/lanes/lane.js +32 -0
- package/dist/src/components/roster/lanes/lane.js.map +1 -0
- package/dist/src/components/roster/lanes/parts/incomplete.d.ts +8 -0
- package/dist/src/components/roster/lanes/parts/incomplete.d.ts.map +1 -0
- package/dist/src/components/roster/lanes/parts/incomplete.js +30 -0
- package/dist/src/components/roster/lanes/parts/incomplete.js.map +1 -0
- package/dist/src/components/roster/lanes/parts/lane-label.d.ts +3 -0
- package/dist/src/components/roster/lanes/parts/lane-label.d.ts.map +1 -0
- package/dist/src/components/roster/lanes/parts/lane-label.js +18 -0
- package/dist/src/components/roster/lanes/parts/lane-label.js.map +1 -0
- package/dist/src/components/roster/layout.d.ts +17 -0
- package/dist/src/components/roster/layout.d.ts.map +1 -0
- package/dist/src/components/roster/layout.js +24 -0
- package/dist/src/components/roster/layout.js.map +1 -0
- package/dist/src/components/roster/parts/body.d.ts +7 -0
- package/dist/src/components/roster/parts/body.d.ts.map +1 -0
- package/dist/src/components/roster/parts/body.js +14 -0
- package/dist/src/components/roster/parts/body.js.map +1 -0
- package/dist/src/components/roster/parts/corner.d.ts +2 -0
- package/dist/src/components/roster/parts/corner.d.ts.map +1 -0
- package/dist/src/components/roster/parts/corner.js +7 -0
- package/dist/src/components/roster/parts/corner.js.map +1 -0
- package/dist/src/components/roster/parts/empty.d.ts +2 -0
- package/dist/src/components/roster/parts/empty.d.ts.map +1 -0
- package/dist/src/components/roster/parts/empty.js +9 -0
- package/dist/src/components/roster/parts/empty.js.map +1 -0
- package/dist/src/components/roster/parts/grid.d.ts +3 -0
- package/dist/src/components/roster/parts/grid.d.ts.map +1 -0
- package/dist/src/components/roster/parts/grid.js +16 -0
- package/dist/src/components/roster/parts/grid.js.map +1 -0
- package/dist/src/components/roster/parts/header-cell.d.ts +3 -0
- package/dist/src/components/roster/parts/header-cell.d.ts.map +1 -0
- package/dist/src/components/roster/parts/header-cell.js +9 -0
- package/dist/src/components/roster/parts/header-cell.js.map +1 -0
- package/dist/src/components/roster/parts/header.d.ts +3 -0
- package/dist/src/components/roster/parts/header.d.ts.map +1 -0
- package/dist/src/components/roster/parts/header.js +13 -0
- package/dist/src/components/roster/parts/header.js.map +1 -0
- package/dist/src/components/roster/parts/lane-label-column.d.ts +3 -0
- package/dist/src/components/roster/parts/lane-label-column.d.ts.map +1 -0
- package/dist/src/components/roster/parts/lane-label-column.js +18 -0
- package/dist/src/components/roster/parts/lane-label-column.js.map +1 -0
- package/dist/src/components/roster/parts/lane-list.d.ts +7 -0
- package/dist/src/components/roster/parts/lane-list.d.ts.map +1 -0
- package/dist/src/components/roster/parts/lane-list.js +25 -0
- package/dist/src/components/roster/parts/lane-list.js.map +1 -0
- package/dist/src/components/roster/roster.types.d.ts +145 -0
- package/dist/src/components/roster/roster.types.d.ts.map +1 -0
- package/dist/src/components/roster/roster.types.js +3 -0
- package/dist/src/components/roster/roster.types.js.map +1 -0
- package/dist/src/components/roster/use-roster.d.ts +3 -0
- package/dist/src/components/roster/use-roster.d.ts.map +1 -0
- package/dist/src/components/roster/use-roster.js +106 -0
- package/dist/src/components/roster/use-roster.js.map +1 -0
- package/dist/src/components/roster/utils/body-content-key.d.ts +3 -0
- package/dist/src/components/roster/utils/body-content-key.d.ts.map +1 -0
- package/dist/src/components/roster/utils/body-content-key.js +29 -0
- package/dist/src/components/roster/utils/body-content-key.js.map +1 -0
- package/dist/src/components/roster/utils/ticks.d.ts +4 -0
- package/dist/src/components/roster/utils/ticks.d.ts.map +1 -0
- package/dist/src/components/roster/utils/ticks.js +60 -0
- package/dist/src/components/roster/utils/ticks.js.map +1 -0
- package/dist/src/components/schedule/days/day.d.ts +20 -0
- package/dist/src/components/schedule/days/day.d.ts.map +1 -0
- package/dist/src/components/schedule/days/day.js +17 -0
- package/dist/src/components/schedule/days/day.js.map +1 -0
- package/dist/src/components/schedule/days/header-layout.d.ts +9 -0
- package/dist/src/components/schedule/days/header-layout.d.ts.map +1 -0
- package/dist/src/components/schedule/days/header-layout.js +9 -0
- package/dist/src/components/schedule/days/header-layout.js.map +1 -0
- package/dist/src/components/schedule/days/layout.d.ts +18 -0
- package/dist/src/components/schedule/days/layout.d.ts.map +1 -0
- package/dist/src/components/schedule/days/layout.js +9 -0
- package/dist/src/components/schedule/days/layout.js.map +1 -0
- package/dist/src/components/schedule/days/parts/column.d.ts +3 -0
- package/dist/src/components/schedule/days/parts/column.d.ts.map +1 -0
- package/dist/src/components/schedule/days/parts/column.js +28 -0
- package/dist/src/components/schedule/days/parts/column.js.map +1 -0
- package/dist/src/components/schedule/days/parts/day-header.d.ts +5 -0
- package/dist/src/components/schedule/days/parts/day-header.d.ts.map +1 -0
- package/dist/src/components/schedule/days/parts/day-header.js +10 -0
- package/dist/src/components/schedule/days/parts/day-header.js.map +1 -0
- package/dist/src/components/schedule/days/parts/grid.d.ts +3 -0
- package/dist/src/components/schedule/days/parts/grid.d.ts.map +1 -0
- package/dist/src/components/schedule/days/parts/grid.js +14 -0
- package/dist/src/components/schedule/days/parts/grid.js.map +1 -0
- package/dist/src/components/schedule/days/parts/now-line.d.ts +5 -0
- package/dist/src/components/schedule/days/parts/now-line.d.ts.map +1 -0
- package/dist/src/components/schedule/days/parts/now-line.js +9 -0
- package/dist/src/components/schedule/days/parts/now-line.js.map +1 -0
- package/dist/src/components/schedule/days/parts/skipped-date.d.ts +4 -0
- package/dist/src/components/schedule/days/parts/skipped-date.d.ts.map +1 -0
- package/dist/src/components/schedule/days/parts/skipped-date.js +17 -0
- package/dist/src/components/schedule/days/parts/skipped-date.js.map +1 -0
- package/dist/src/components/schedule/days/parts/transition.d.ts +3 -0
- package/dist/src/components/schedule/days/parts/transition.d.ts.map +1 -0
- package/dist/src/components/schedule/days/parts/transition.js +42 -0
- package/dist/src/components/schedule/days/parts/transition.js.map +1 -0
- package/dist/src/components/schedule/index.d.ts +3 -0
- package/dist/src/components/schedule/index.d.ts.map +1 -0
- package/dist/src/components/schedule/index.js +44 -0
- package/dist/src/components/schedule/index.js.map +1 -0
- package/dist/src/components/schedule/layout.d.ts +15 -0
- package/dist/src/components/schedule/layout.d.ts.map +1 -0
- package/dist/src/components/schedule/layout.js +10 -0
- package/dist/src/components/schedule/layout.js.map +1 -0
- package/dist/src/components/schedule/parts/gutter.d.ts +3 -0
- package/dist/src/components/schedule/parts/gutter.d.ts.map +1 -0
- package/dist/src/components/schedule/parts/gutter.js +9 -0
- package/dist/src/components/schedule/parts/gutter.js.map +1 -0
- package/dist/src/components/schedule/parts/incomplete.d.ts +6 -0
- package/dist/src/components/schedule/parts/incomplete.d.ts.map +1 -0
- package/dist/src/components/schedule/parts/incomplete.js +9 -0
- package/dist/src/components/schedule/parts/incomplete.js.map +1 -0
- package/dist/src/components/schedule/schedule.types.d.ts +109 -0
- package/dist/src/components/schedule/schedule.types.d.ts.map +1 -0
- package/dist/src/components/schedule/schedule.types.js +3 -0
- package/dist/src/components/schedule/schedule.types.js.map +1 -0
- package/dist/src/components/schedule/use-schedule-viewport.d.ts +7 -0
- package/dist/src/components/schedule/use-schedule-viewport.d.ts.map +1 -0
- package/dist/src/components/schedule/use-schedule-viewport.js +15 -0
- package/dist/src/components/schedule/use-schedule-viewport.js.map +1 -0
- package/dist/src/components/schedule/use-schedule.d.ts +3 -0
- package/dist/src/components/schedule/use-schedule.d.ts.map +1 -0
- package/dist/src/components/schedule/use-schedule.js +71 -0
- package/dist/src/components/schedule/use-schedule.js.map +1 -0
- package/dist/src/components/schedule/utils/days.d.ts +17 -0
- package/dist/src/components/schedule/utils/days.d.ts.map +1 -0
- package/dist/src/components/schedule/utils/days.js +49 -0
- package/dist/src/components/schedule/utils/days.js.map +1 -0
- package/dist/src/core/axis.d.ts +18 -0
- package/dist/src/core/axis.d.ts.map +1 -0
- package/dist/src/core/axis.js +58 -0
- package/dist/src/core/axis.js.map +1 -0
- package/dist/src/core/cache.d.ts +29 -0
- package/dist/src/core/cache.d.ts.map +1 -0
- package/dist/src/core/cache.js +33 -0
- package/dist/src/core/cache.js.map +1 -0
- package/dist/src/core/columns.d.ts +3 -0
- package/dist/src/core/columns.d.ts.map +1 -0
- package/dist/src/core/columns.js +45 -0
- package/dist/src/core/columns.js.map +1 -0
- package/dist/src/core/coverage.d.ts +3 -0
- package/dist/src/core/coverage.d.ts.map +1 -0
- package/dist/src/core/coverage.js +60 -0
- package/dist/src/core/coverage.js.map +1 -0
- package/dist/src/core/flag.d.ts +3 -0
- package/dist/src/core/flag.d.ts.map +1 -0
- package/dist/src/core/flag.js +17 -0
- package/dist/src/core/flag.js.map +1 -0
- package/dist/src/core/hash.d.ts +5 -0
- package/dist/src/core/hash.d.ts.map +1 -0
- package/dist/src/core/hash.js +29 -0
- package/dist/src/core/hash.js.map +1 -0
- package/dist/src/core/hit-test.d.ts +6 -0
- package/dist/src/core/hit-test.d.ts.map +1 -0
- package/dist/src/core/hit-test.js +23 -0
- package/dist/src/core/hit-test.js.map +1 -0
- package/dist/src/core/index.d.ts +12 -0
- package/dist/src/core/index.d.ts.map +1 -0
- package/dist/src/core/index.js +30 -0
- package/dist/src/core/index.js.map +1 -0
- package/dist/src/core/layout.d.ts +3 -0
- package/dist/src/core/layout.d.ts.map +1 -0
- package/dist/src/core/layout.js +96 -0
- package/dist/src/core/layout.js.map +1 -0
- package/dist/src/core/order.d.ts +7 -0
- package/dist/src/core/order.d.ts.map +1 -0
- package/dist/src/core/order.js +12 -0
- package/dist/src/core/order.js.map +1 -0
- package/dist/src/core/scale.d.ts +9 -0
- package/dist/src/core/scale.d.ts.map +1 -0
- package/dist/src/core/scale.js +41 -0
- package/dist/src/core/scale.js.map +1 -0
- package/dist/src/core/snap.d.ts +10 -0
- package/dist/src/core/snap.d.ts.map +1 -0
- package/dist/src/core/snap.js +43 -0
- package/dist/src/core/snap.js.map +1 -0
- package/dist/src/core/spans.d.ts +3 -0
- package/dist/src/core/spans.d.ts.map +1 -0
- package/dist/src/core/spans.js +60 -0
- package/dist/src/core/spans.js.map +1 -0
- package/dist/src/core/types.d.ts +104 -0
- package/dist/src/core/types.d.ts.map +1 -0
- package/dist/src/core/types.js +3 -0
- package/dist/src/core/types.js.map +1 -0
- package/dist/src/core/zone.d.ts +10 -0
- package/dist/src/core/zone.d.ts.map +1 -0
- package/dist/src/core/zone.js +103 -0
- package/dist/src/core/zone.js.map +1 -0
- package/dist/src/index.d.ts +29 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +67 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/nativewind/index.d.ts +59 -0
- package/dist/src/nativewind/index.d.ts.map +1 -0
- package/dist/src/nativewind/index.js +24 -0
- package/dist/src/nativewind/index.js.map +1 -0
- package/docs/migrations.md +61 -0
- package/llms.txt +498 -0
- package/package.json +155 -8
- package/src/adapters/rrule/README.md +41 -0
- package/src/adapters/rrule/cache.ts +50 -0
- package/src/adapters/rrule/envelope.ts +7 -0
- package/src/adapters/rrule/expand.ts +105 -0
- package/src/adapters/rrule/hash.ts +13 -0
- package/src/adapters/rrule/index.ts +11 -0
- package/src/adapters/rrule/net.ts +30 -0
- package/src/adapters/rrule/occurrences.ts +288 -0
- package/src/adapters/rrule/types.ts +52 -0
- package/src/adapters/rrule/validate.ts +78 -0
- package/src/components/layers/README.md +15 -0
- package/src/components/layers/layers.types.ts +6 -0
- package/src/components/layers/parts/gap.tsx +5 -0
- package/src/components/layers/parts/interval.tsx +24 -0
- package/src/components/layers/utils/styles.ts +24 -0
- package/src/components/primitives/README.md +12 -0
- package/src/components/primitives/press-point.tsx +5 -0
- package/src/components/primitives/press-point.types.ts +5 -0
- package/src/components/primitives/press-point.web.tsx +19 -0
- package/src/components/primitives/region-style.ts +21 -0
- package/src/components/roster/README.md +29 -0
- package/src/components/roster/body-layout.tsx +32 -0
- package/src/components/roster/index.tsx +108 -0
- package/src/components/roster/lanes/interval-hover.tsx +5 -0
- package/src/components/roster/lanes/interval-hover.types.ts +11 -0
- package/src/components/roster/lanes/interval-hover.web.tsx +19 -0
- package/src/components/roster/lanes/lane.tsx +93 -0
- package/src/components/roster/lanes/parts/incomplete.tsx +44 -0
- package/src/components/roster/lanes/parts/lane-label.tsx +41 -0
- package/src/components/roster/layout.tsx +68 -0
- package/src/components/roster/parts/body.tsx +24 -0
- package/src/components/roster/parts/corner.tsx +3 -0
- package/src/components/roster/parts/empty.tsx +5 -0
- package/src/components/roster/parts/grid.tsx +26 -0
- package/src/components/roster/parts/header-cell.tsx +10 -0
- package/src/components/roster/parts/header.tsx +23 -0
- package/src/components/roster/parts/lane-label-column.tsx +31 -0
- package/src/components/roster/parts/lane-list.tsx +74 -0
- package/src/components/roster/roster.types.ts +156 -0
- package/src/components/roster/use-roster.ts +133 -0
- package/src/components/roster/utils/body-content-key.ts +46 -0
- package/src/components/roster/utils/ticks.ts +62 -0
- package/src/components/schedule/README.md +23 -0
- package/src/components/schedule/days/day.tsx +89 -0
- package/src/components/schedule/days/header-layout.tsx +12 -0
- package/src/components/schedule/days/layout.tsx +38 -0
- package/src/components/schedule/days/parts/column.tsx +59 -0
- package/src/components/schedule/days/parts/day-header.tsx +18 -0
- package/src/components/schedule/days/parts/grid.tsx +21 -0
- package/src/components/schedule/days/parts/now-line.tsx +11 -0
- package/src/components/schedule/days/parts/skipped-date.tsx +22 -0
- package/src/components/schedule/days/parts/transition.tsx +70 -0
- package/src/components/schedule/index.tsx +108 -0
- package/src/components/schedule/layout.tsx +42 -0
- package/src/components/schedule/parts/gutter.tsx +16 -0
- package/src/components/schedule/parts/incomplete.tsx +13 -0
- package/src/components/schedule/schedule.types.ts +103 -0
- package/src/components/schedule/use-schedule-viewport.ts +13 -0
- package/src/components/schedule/use-schedule.ts +75 -0
- package/src/components/schedule/utils/days.ts +54 -0
- package/src/core/README.md +25 -0
- package/src/core/axis.ts +58 -0
- package/src/core/cache.ts +38 -0
- package/src/core/columns.ts +49 -0
- package/src/core/coverage.ts +56 -0
- package/src/core/flag.ts +14 -0
- package/src/core/hash.ts +28 -0
- package/src/core/hit-test.ts +27 -0
- package/src/core/index.ts +34 -0
- package/src/core/layout.ts +101 -0
- package/src/core/order.ts +18 -0
- package/src/core/scale.ts +45 -0
- package/src/core/snap.ts +52 -0
- package/src/core/spans.ts +58 -0
- package/src/core/types.ts +92 -0
- package/src/core/zone.ts +100 -0
- package/src/index.ts +52 -0
- package/src/nativewind/README.md +14 -0
- package/src/nativewind/index.ts +30 -0
- package/index.js +0 -4
package/package.json
CHANGED
|
@@ -1,19 +1,166 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-roster",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Layered intervals with provenance across lanes and a shared time axis for React Native.
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Layered intervals with provenance across lanes and a shared time axis for React Native.",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"react-native",
|
|
7
|
+
"expo",
|
|
8
|
+
"roster",
|
|
9
|
+
"lanes",
|
|
10
|
+
"intervals",
|
|
11
|
+
"provenance",
|
|
12
|
+
"nativewind"
|
|
13
|
+
],
|
|
6
14
|
"author": "Jesse Harlin (the-simian) <info@simiancraft.com>",
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"homepage": "https://simiancraft.github.io/react-native-roster/",
|
|
7
17
|
"repository": {
|
|
8
18
|
"type": "git",
|
|
9
19
|
"url": "git+https://github.com/simiancraft/react-native-roster.git"
|
|
10
20
|
},
|
|
11
|
-
"homepage": "https://simiancraft.github.io/react-native-roster/",
|
|
12
21
|
"bugs": {
|
|
13
22
|
"url": "https://github.com/simiancraft/react-native-roster/issues"
|
|
14
23
|
},
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
|
|
24
|
+
"type": "commonjs",
|
|
25
|
+
"sideEffects": [
|
|
26
|
+
"./src/nativewind/index.ts",
|
|
27
|
+
"./dist/src/nativewind/index.js"
|
|
28
|
+
],
|
|
29
|
+
"main": "./src/index.ts",
|
|
30
|
+
"react-native": "./src/index.ts",
|
|
31
|
+
"types": "./dist/src/index.d.ts",
|
|
32
|
+
"browser": {
|
|
33
|
+
"./dist/src/components/primitives/press-point.js": "./dist/src/components/primitives/press-point.web.js",
|
|
34
|
+
"./dist/src/components/roster/lanes/interval-hover.js": "./dist/src/components/roster/lanes/interval-hover.web.js"
|
|
35
|
+
},
|
|
36
|
+
"exports": {
|
|
37
|
+
".": {
|
|
38
|
+
"types": "./dist/src/index.d.ts",
|
|
39
|
+
"bun": "./src/index.ts",
|
|
40
|
+
"react-native": "./src/index.ts",
|
|
41
|
+
"default": "./dist/src/index.js"
|
|
42
|
+
},
|
|
43
|
+
"./core": {
|
|
44
|
+
"types": "./dist/src/core/index.d.ts",
|
|
45
|
+
"bun": "./src/core/index.ts",
|
|
46
|
+
"react-native": "./src/core/index.ts",
|
|
47
|
+
"default": "./dist/src/core/index.js"
|
|
48
|
+
},
|
|
49
|
+
"./rrule": {
|
|
50
|
+
"types": "./dist/src/adapters/rrule/index.d.ts",
|
|
51
|
+
"bun": "./src/adapters/rrule/index.ts",
|
|
52
|
+
"react-native": "./src/adapters/rrule/index.ts",
|
|
53
|
+
"default": "./dist/src/adapters/rrule/index.js"
|
|
54
|
+
},
|
|
55
|
+
"./nativewind": {
|
|
56
|
+
"types": "./dist/src/nativewind/index.d.ts",
|
|
57
|
+
"bun": "./src/nativewind/index.ts",
|
|
58
|
+
"react-native": "./src/nativewind/index.ts",
|
|
59
|
+
"default": "./dist/src/nativewind/index.js"
|
|
60
|
+
},
|
|
61
|
+
"./package.json": "./package.json"
|
|
62
|
+
},
|
|
63
|
+
"files": [
|
|
64
|
+
"src",
|
|
65
|
+
"dist",
|
|
66
|
+
"README.md",
|
|
67
|
+
"LICENSE",
|
|
68
|
+
"NOTICE.md",
|
|
69
|
+
"llms.txt",
|
|
70
|
+
"docs/migrations.md"
|
|
71
|
+
],
|
|
72
|
+
"scripts": {
|
|
73
|
+
"clean": "rm -rf dist",
|
|
74
|
+
"build": "bun run clean && tsgo -p tsconfig.build.json",
|
|
75
|
+
"lint": "biome check",
|
|
76
|
+
"lint:fix": "biome check --write",
|
|
77
|
+
"format": "biome format --write .",
|
|
78
|
+
"typecheck": "tsgo --noEmit",
|
|
79
|
+
"typecheck:test": "tsgo --noEmit -p tsconfig.test.json",
|
|
80
|
+
"check:react-compiler": "eslint 'src/components/**/*.{ts,tsx}' 'demo/components/**/*.{ts,tsx}' 'demo/app/**/*.tsx' --no-error-on-unmatched-pattern",
|
|
81
|
+
"check:knip": "knip",
|
|
82
|
+
"check:package": "publint --strict",
|
|
83
|
+
"test": "bun test --coverage",
|
|
84
|
+
"check": "bun run lint && bun run typecheck && bun run typecheck:test && bun run typecheck:demo && bun run check:react-compiler && bun run build:web && bun run test && bun run check:knip && bun run check:package && bun run check:size && bun run check:web",
|
|
85
|
+
"prepare": "if command -v lefthook >/dev/null 2>&1; then lefthook install; fi",
|
|
86
|
+
"prepack": "bun run build",
|
|
87
|
+
"typecheck:demo": "tsgo --noEmit -p demo/tsconfig.json",
|
|
88
|
+
"build:web": "bun run build && cd demo && bunx expo export -p web",
|
|
89
|
+
"demo": "cd demo && bun run start",
|
|
90
|
+
"demo:ios": "cd demo && bun run ios",
|
|
91
|
+
"demo:android": "cd demo && bun run android",
|
|
92
|
+
"demo:web": "cd demo && bun run web",
|
|
93
|
+
"check:size": "size-limit",
|
|
94
|
+
"build:web:dev": "cd demo && bunx expo export -p web --dev --output-dir .cache/dev-dist",
|
|
95
|
+
"check:web": "bun run build:web:dev && bun scripts/check-web-performance.ts",
|
|
96
|
+
"bench:update": "bun scripts/update-performance-baseline.ts"
|
|
97
|
+
},
|
|
98
|
+
"peerDependencies": {
|
|
99
|
+
"@legendapp/list": ">=2.0.0",
|
|
100
|
+
"expo": ">=51.0.0",
|
|
101
|
+
"nativewind": ">=4.1.0",
|
|
102
|
+
"react": ">=18.2.0",
|
|
103
|
+
"react-native": ">=0.74.0",
|
|
104
|
+
"react-native-reanimated": ">=3.19.0"
|
|
105
|
+
},
|
|
106
|
+
"peerDependenciesMeta": {
|
|
107
|
+
"expo": {
|
|
108
|
+
"optional": true
|
|
109
|
+
},
|
|
110
|
+
"nativewind": {
|
|
111
|
+
"optional": true
|
|
112
|
+
},
|
|
113
|
+
"react-native-reanimated": {
|
|
114
|
+
"optional": true
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
"dependencies": {
|
|
118
|
+
"@js-temporal/polyfill": "0.5.1",
|
|
119
|
+
"rrule-temporal": "1.6.0"
|
|
120
|
+
},
|
|
121
|
+
"devDependencies": {
|
|
122
|
+
"@biomejs/biome": "2.5.12",
|
|
123
|
+
"@legendapp/list": "2.0.19",
|
|
124
|
+
"@semantic-release/changelog": "^7.0.0",
|
|
125
|
+
"@semantic-release/commit-analyzer": "13.0.1",
|
|
126
|
+
"@semantic-release/exec": "^7.1.0",
|
|
127
|
+
"@semantic-release/git": "^11.0.1",
|
|
128
|
+
"@semantic-release/github": "12.0.9",
|
|
129
|
+
"@semantic-release/npm": "13.1.5",
|
|
130
|
+
"@semantic-release/release-notes-generator": "14.1.1",
|
|
131
|
+
"@size-limit/preset-small-lib": "^13.0.3",
|
|
132
|
+
"@types/bun": "^1.3.12",
|
|
133
|
+
"@types/react": "~19.1.10",
|
|
134
|
+
"@types/react-test-renderer": "^19.1.0",
|
|
135
|
+
"@types/semver": "^7.7.0",
|
|
136
|
+
"@typescript-eslint/parser": "^8.60.1",
|
|
137
|
+
"@typescript/native-preview": "7.0.0-dev.20260707.2",
|
|
138
|
+
"eslint": "^10.4.1",
|
|
139
|
+
"eslint-plugin-react-compiler": "^19.1.0-rc.2",
|
|
140
|
+
"expo": "~54.0.37",
|
|
141
|
+
"knip": "^6.5.0",
|
|
142
|
+
"lefthook": "^2.1.9",
|
|
143
|
+
"nativewind": "4.1.x",
|
|
144
|
+
"playwright": "^1.63.0",
|
|
145
|
+
"publint": "^0.3.18",
|
|
146
|
+
"react": "19.1.0",
|
|
147
|
+
"react-native": "0.81.5",
|
|
148
|
+
"react-native-reanimated": "~3.19.5",
|
|
149
|
+
"react-test-renderer": "19.1.0",
|
|
150
|
+
"semantic-release": "^25.0.3",
|
|
151
|
+
"semver": "^7.7.0",
|
|
152
|
+
"size-limit": "^13.0.3",
|
|
153
|
+
"temporal-spec": "1.0.1"
|
|
154
|
+
},
|
|
155
|
+
"publishConfig": {
|
|
156
|
+
"access": "public",
|
|
157
|
+
"provenance": true
|
|
158
|
+
},
|
|
159
|
+
"engines": {
|
|
160
|
+
"node": ">=20"
|
|
161
|
+
},
|
|
162
|
+
"packageManager": "bun@1.4.2",
|
|
163
|
+
"workspaces": [
|
|
164
|
+
"demo"
|
|
165
|
+
]
|
|
19
166
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
# rrule adapter
|
|
2
|
+
|
|
3
|
+
The shipped adapter. It converts a `RuleSet` of RFC 5545 rules and dated
|
|
4
|
+
overrides into absolute intervals and gaps for one window, with exact
|
|
5
|
+
provenance per span.
|
|
6
|
+
|
|
7
|
+
- Public subpath: `react-native-roster/rrule`
|
|
8
|
+
- Exports: `expandRuleSet`, `envelopeFor`, `clearExpandCache`, `expandStats`,
|
|
9
|
+
`resetExpandStats`, and the `RosterRule`, `RosterDate`, `RuleSet`,
|
|
10
|
+
`ExpandOptions`, `ExpandResult`, and `ExpandStats` types
|
|
11
|
+
- Imports: `../../core` only; never components or another adapter
|
|
12
|
+
- Owns: `rrule-temporal` and the Temporal polyfill; root and core never load them
|
|
13
|
+
|
|
14
|
+
## Supported input
|
|
15
|
+
|
|
16
|
+
`RosterRule` covers DAILY, WEEKLY, and MONTHLY with `interval`, `count`,
|
|
17
|
+
`until`, `wkst`, `byweekday`, `bymonth`, `bymonthday`, and `bysetpos`, plus
|
|
18
|
+
`hourstart`, `hourend`, and an IANA `timezone`. `RosterDate` is a single local
|
|
19
|
+
date, whole day or with hours. Both are `include` or `exclude`. YEARLY and
|
|
20
|
+
unbounded strings are rejected by validation.
|
|
21
|
+
|
|
22
|
+
## File map
|
|
23
|
+
|
|
24
|
+
| File | Role |
|
|
25
|
+
| --- | --- |
|
|
26
|
+
| `index.ts` | the entry point; the only barrel |
|
|
27
|
+
| `types.ts` | input and result types |
|
|
28
|
+
| `validate.ts` | input rejection before any engine work |
|
|
29
|
+
| `envelope.ts` | widens a window to whole local days per rule zone |
|
|
30
|
+
| `occurrences.ts` | drives the engine and applies every calendar correction |
|
|
31
|
+
| `net.ts` | nets includes against excludes into intervals and gaps |
|
|
32
|
+
| `cache.ts`, `hash.ts` | retained occurrences and envelopes keyed by content |
|
|
33
|
+
| `expand.ts` | the orchestrator: validate, envelope, expand, cap, net, attach |
|
|
34
|
+
|
|
35
|
+
## Reference
|
|
36
|
+
|
|
37
|
+
- [Recurrence semantics](../../../docs/recurrence.md): the rules `occurrences.ts` follows
|
|
38
|
+
- [Caches](../../../docs/caches.md): retention, keys, and counters
|
|
39
|
+
- [Adapters guide](../../../docs/adapters.md): the consumer view for any upstream shape
|
|
40
|
+
- [Adding an adapter](../../../docs/adding-an-adapter.md): the contributor recipe
|
|
41
|
+
- Tests: `test/adapters/rrule`
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Window } from '../../core';
|
|
2
|
+
import { envelopeFor } from './envelope';
|
|
3
|
+
import type { ExpandStats } from './types';
|
|
4
|
+
|
|
5
|
+
export type Occurrences = { spans: Window[]; capped: boolean };
|
|
6
|
+
export const occurrences = new Map<string, Occurrences>();
|
|
7
|
+
const envelopes = new Map<string, Window>();
|
|
8
|
+
const counts: ExpandStats = { rules: 0, dates: 0, expanded: 0, cacheHits: 0, cacheMisses: 0 };
|
|
9
|
+
|
|
10
|
+
// Map insertion order is the LRU: reads move entries to the newest end.
|
|
11
|
+
// Envelope retention selects bounds only; no netted result is retained.
|
|
12
|
+
export function touch<T>(cache: Map<string, T>, key: string, value: T): T {
|
|
13
|
+
cache.delete(key);
|
|
14
|
+
cache.set(key, value);
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function trim<T>(cache: Map<string, T>, limit: number): void {
|
|
19
|
+
while (cache.size > limit) cache.delete(cache.keys().next().value as string);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function retainedEnvelope(window: Window, limit: number): Window {
|
|
23
|
+
trim(envelopes, limit);
|
|
24
|
+
for (const [id, envelope] of [...envelopes].reverse()) {
|
|
25
|
+
if (envelope.start <= window.start && envelope.end >= window.end) {
|
|
26
|
+
return touch(envelopes, id, envelope);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const envelope = envelopeFor(window);
|
|
30
|
+
touch(envelopes, JSON.stringify(envelope), envelope);
|
|
31
|
+
trim(envelopes, limit);
|
|
32
|
+
return envelope;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function recordStats(stats: ExpandStats): void {
|
|
36
|
+
for (const key of Object.keys(counts) as Array<keyof ExpandStats>) counts[key] += stats[key];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function expandStats(): ExpandStats {
|
|
40
|
+
return { ...counts };
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function resetExpandStats(): void {
|
|
44
|
+
for (const key of Object.keys(counts) as Array<keyof ExpandStats>) counts[key] = 0;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function clearExpandCache(): void {
|
|
48
|
+
occurrences.clear();
|
|
49
|
+
envelopes.clear();
|
|
50
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { Window } from '../../core';
|
|
2
|
+
|
|
3
|
+
// Absolute 48-hour padding exceeds the 26-hour difference between view zones.
|
|
4
|
+
// Includes, excludes, and dates share these bounds before subtraction.
|
|
5
|
+
export function envelopeFor(window: Window): Window {
|
|
6
|
+
return { start: window.start - 48 * 3_600_000, end: window.end + 48 * 3_600_000 };
|
|
7
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { Interval, Source, Window } from '../../core';
|
|
2
|
+
import { occurrences, recordStats, retainedEnvelope, touch, trim } from './cache';
|
|
3
|
+
import { envelopeFor } from './envelope';
|
|
4
|
+
import { bodyKey } from './hash';
|
|
5
|
+
import { net } from './net';
|
|
6
|
+
import { enumerate, validateDates } from './occurrences';
|
|
7
|
+
import type {
|
|
8
|
+
ExpandOptions,
|
|
9
|
+
ExpandResult,
|
|
10
|
+
ExpandStats,
|
|
11
|
+
RosterDate,
|
|
12
|
+
RosterRule,
|
|
13
|
+
RuleSet,
|
|
14
|
+
} from './types';
|
|
15
|
+
import { nonnegativeInteger, validateInput, validateWindow } from './validate';
|
|
16
|
+
|
|
17
|
+
export function expandRuleSet(
|
|
18
|
+
set: RuleSet,
|
|
19
|
+
window: Window,
|
|
20
|
+
options: ExpandOptions = {},
|
|
21
|
+
): ExpandResult {
|
|
22
|
+
validateWindow(window);
|
|
23
|
+
const maxEntries = nonnegativeInteger(options.cache?.maxEntries ?? 2000, 'cache.maxEntries');
|
|
24
|
+
const maxEnvelopes = nonnegativeInteger(options.cache?.maxEnvelopes ?? 4, 'cache.maxEnvelopes');
|
|
25
|
+
const cap = nonnegativeInteger(
|
|
26
|
+
options.caps?.perRuleOccurrences ?? 400,
|
|
27
|
+
'caps.perRuleOccurrences',
|
|
28
|
+
);
|
|
29
|
+
let remaining = nonnegativeInteger(
|
|
30
|
+
options.caps?.totalOccurrences ?? 10000,
|
|
31
|
+
'caps.totalOccurrences',
|
|
32
|
+
);
|
|
33
|
+
const rules = [...set.rules].sort(byId);
|
|
34
|
+
const dates = [...set.dates].sort(byId);
|
|
35
|
+
const ordered = [...rules, ...dates];
|
|
36
|
+
for (const input of ordered) {
|
|
37
|
+
validateInput(input);
|
|
38
|
+
validateDates(input);
|
|
39
|
+
}
|
|
40
|
+
const stats: ExpandStats = {
|
|
41
|
+
rules: set.rules.length,
|
|
42
|
+
dates: set.dates.length,
|
|
43
|
+
expanded: 0,
|
|
44
|
+
cacheHits: 0,
|
|
45
|
+
cacheMisses: 0,
|
|
46
|
+
};
|
|
47
|
+
if (window.start === window.end) {
|
|
48
|
+
recordStats(stats);
|
|
49
|
+
return {
|
|
50
|
+
intervals: [],
|
|
51
|
+
gaps: [],
|
|
52
|
+
envelope: envelopeFor(window),
|
|
53
|
+
complete: true,
|
|
54
|
+
truncated: [],
|
|
55
|
+
stats,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const envelope = retainedEnvelope(window, maxEnvelopes);
|
|
59
|
+
trim(occurrences, maxEntries);
|
|
60
|
+
const includes: Interval[] = [];
|
|
61
|
+
const excludes: Interval[] = [];
|
|
62
|
+
const truncated: ExpandResult['truncated'] = [];
|
|
63
|
+
let dropped = false;
|
|
64
|
+
for (const input of ordered) {
|
|
65
|
+
const key = JSON.stringify([bodyKey(input), envelope.start, envelope.end, cap]);
|
|
66
|
+
let list = occurrences.get(key);
|
|
67
|
+
if (list) {
|
|
68
|
+
touch(occurrences, key, list);
|
|
69
|
+
stats.cacheHits++;
|
|
70
|
+
} else {
|
|
71
|
+
list = enumerate(input, envelope, cap);
|
|
72
|
+
touch(occurrences, key, list);
|
|
73
|
+
trim(occurrences, maxEntries);
|
|
74
|
+
stats.expanded++;
|
|
75
|
+
stats.cacheMisses++;
|
|
76
|
+
}
|
|
77
|
+
// No partial admission: the first list that cannot fit ends the admitted
|
|
78
|
+
// prefix. Fetch all later lists anyway to report their exact retained counts.
|
|
79
|
+
dropped ||= list.spans.length > remaining;
|
|
80
|
+
if (dropped || list.capped) {
|
|
81
|
+
truncated.push({
|
|
82
|
+
id: input.id,
|
|
83
|
+
droppedAtLeast: list.capped ? 1 : list.spans.length,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
if (dropped) continue;
|
|
87
|
+
remaining -= list.spans.length;
|
|
88
|
+
const source: Source = { kind: 'date' in input ? 'date' : 'rule', id: input.id };
|
|
89
|
+
if ('date' in input && input.note !== undefined) source.label = input.note;
|
|
90
|
+
const target = input.kind === 'include' ? includes : excludes;
|
|
91
|
+
for (const span of list.spans) target.push({ ...span, sources: [source] });
|
|
92
|
+
}
|
|
93
|
+
recordStats(stats);
|
|
94
|
+
return {
|
|
95
|
+
...net(includes, excludes, window),
|
|
96
|
+
envelope: { ...envelope },
|
|
97
|
+
complete: truncated.length === 0,
|
|
98
|
+
truncated,
|
|
99
|
+
stats,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function byId(a: RosterRule | RosterDate, b: RosterRule | RosterDate): number {
|
|
104
|
+
return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
|
|
105
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { structuralKey } from '../../core/hash';
|
|
2
|
+
import type { RosterDate, RosterRule } from './types';
|
|
3
|
+
|
|
4
|
+
// Use the core's collision-free canonical encoding as the content hash.
|
|
5
|
+
// Identity and display notes are attached fresh, never cached in occurrence lists.
|
|
6
|
+
export function bodyKey(input: RosterRule | RosterDate): string {
|
|
7
|
+
const { id: _id, ...body } = input;
|
|
8
|
+
if ('date' in body) {
|
|
9
|
+
const { note: _note, ...date } = body;
|
|
10
|
+
return structuralKey(date);
|
|
11
|
+
}
|
|
12
|
+
return structuralKey(body);
|
|
13
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export { clearExpandCache, expandStats, resetExpandStats } from './cache';
|
|
2
|
+
export { envelopeFor } from './envelope';
|
|
3
|
+
export { expandRuleSet } from './expand';
|
|
4
|
+
export type {
|
|
5
|
+
ExpandOptions,
|
|
6
|
+
ExpandResult,
|
|
7
|
+
ExpandStats,
|
|
8
|
+
RosterDate,
|
|
9
|
+
RosterRule,
|
|
10
|
+
RuleSet,
|
|
11
|
+
} from './types';
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Gap, Interval, Window } from '../../core';
|
|
2
|
+
import { sourceSpans } from '../../core/spans';
|
|
3
|
+
|
|
4
|
+
export function net(
|
|
5
|
+
includes: Interval[],
|
|
6
|
+
excludes: Interval[],
|
|
7
|
+
window: Window,
|
|
8
|
+
): { intervals: Interval[]; gaps: Gap[] } {
|
|
9
|
+
const covered = sourceSpans(includes, window);
|
|
10
|
+
const removed = sourceSpans(excludes, window);
|
|
11
|
+
const intervals: Interval[] = [];
|
|
12
|
+
const gaps: Gap[] = [];
|
|
13
|
+
let first = 0;
|
|
14
|
+
for (const include of covered) {
|
|
15
|
+
let start = include.start;
|
|
16
|
+
while (first < removed.length && (removed[first] as Gap).end <= start) first++;
|
|
17
|
+
for (let i = first; i < removed.length; i++) {
|
|
18
|
+
const exclude = removed[i] as Gap;
|
|
19
|
+
if (exclude.start >= include.end) break;
|
|
20
|
+
if (start < exclude.start)
|
|
21
|
+
intervals.push({ start, end: exclude.start, sources: include.sources });
|
|
22
|
+
const end = Math.min(include.end, exclude.end);
|
|
23
|
+
gaps.push({ start: Math.max(start, exclude.start), end, sources: exclude.sources });
|
|
24
|
+
start = end;
|
|
25
|
+
}
|
|
26
|
+
if (start < include.end) intervals.push({ start, end: include.end, sources: include.sources });
|
|
27
|
+
}
|
|
28
|
+
// Include source changes cannot split an otherwise identical removed span.
|
|
29
|
+
return { intervals, gaps: sourceSpans(gaps, window) };
|
|
30
|
+
}
|