0.4.1 โข Published 12 months ago
@kermank/slots v0.4.1
@kermank/slots
A TypeScript library for handling time slots, scheduling, and timezone operations. Built with functional programming principles and timezone-aware design.
Features
- ๐ Time Slot Management: Create, merge, and manipulate time slots
- ๐ Set Operations: Union, intersection, difference, and symmetric difference
- โก Performance: Optimized algorithms for slot operations
- ๐ Timezone Support: Built on Luxon for reliable timezone handling
- ๐ Overlap Detection: Flexible strategies for handling slot overlaps
- ๐ฏ Type Safety: Written in TypeScript with full type coverage
- ๐งช Well Tested: Comprehensive test suite
Installation
npm install @kermank/slotsUsage
Basic Slot Operations
import { DateTime } from 'luxon';
import { Slot, generateSlots, intersectSlots } from '@kermank/slots';
// Generate 1-hour slots for a day
const slots = generateSlots({
start: DateTime.fromISO('2024-01-01T09:00:00', { zone: 'America/Los_Angeles' }),
end: DateTime.fromISO('2024-01-01T17:00:00', { zone: 'America/Los_Angeles' }),
duration: { hours: 1 }
});
// Find overlapping slots between two sets
const overlappingSlots = intersectSlots(slots1, slots2);Applying Rules
import {
removeWeekendsRule,
allowTimeRangeRule,
createBufferRule
} from '@kermank/slots';
// Remove weekend slots
const weekdayRule = removeWeekendsRule();
const weekdaySlots = weekdayRule(slots);
// Apply working hours (9 AM - 5 PM)
const workingHours = allowTimeRangeRule(9, 17);
const workHourSlots = workingHours(slots);
// Add buffer time around slots
const bufferRule = createBufferRule(
slot => slot.metadata.type === 'meeting',
30, // 30 minutes before
30 // 30 minutes after
);Timezone Operations
import { DateTime } from 'luxon';
import { generateSlots } from '@kermank/slots';
// Generate slots in different timezones
const sydneySlots = generateSlots({
start: DateTime.fromISO('2024-01-01T09:00:00', { zone: 'Australia/Sydney' }),
end: DateTime.fromISO('2024-01-01T17:00:00', { zone: 'Australia/Sydney' }),
duration: { hours: 1 }
});
const sfSlots = generateSlots({
start: DateTime.fromISO('2024-01-01T09:00:00', { zone: 'America/Los_Angeles' }),
end: DateTime.fromISO('2024-01-01T17:00:00', { zone: 'America/Los_Angeles' }),
duration: { hours: 1 }
});
// Find overlapping availability across timezones
const globalAvailability = intersectSlots(sydneySlots, sfSlots);API Reference
Types
Slot
interface Slot {
start: DateTime; // Luxon DateTime
end: DateTime; // Luxon DateTime
metadata?: any; // Optional metadata
}Core Functions
generateSlots(options): Generate time slots with specified durationintersectSlots(slots1, slots2): Find overlapping slots between two setsremoveOverlappingSlots(slots, overlapping): Remove overlapping slots from a setaddSlots(slots1, slots2): Combine two sets of slotsremoveExactSlots(toRemove)(slots): Remove specific slots from a set
Rules
removeWeekendsRule(): Filter out weekend slotsallowTimeRangeRule(startHour, endHour): Filter slots to specific hourscreateBufferRule(predicate, beforeMinutes, afterMinutes): Add buffer time around slotsmaxSlotsPerDayRule(maxSlots): Limit the number of slots per day
Contributing
We welcome contributions! Please see our Contributing Guide for details.
License
MIT ยฉ Kerman Kohli