UNPKG

nhb-toolbox

Version:

A versatile collection of smart, efficient, and reusable utility functions, classes and types for everyday development needs.

617 lines (616 loc) 36.8 kB
import type { $BnOnes, BanglaDigit, Enumerate, LocaleCode, NumberRange } from '../number/types'; import type { Maybe } from '../types/index'; import type { LooseLiteral, RangeTuple, Repeat, Split } from '../utils/types'; import type { Chronos } from './Chronos'; import type { ChronosStatics } from './chronos-statics'; import type { BN_DAYS, BN_MONTH_TABLES, BN_MONTHS, BN_SEASONS, DATE_FORMATS, DAY_FORMATS, DAYS, HOUR_FORMATS, LOCALE_CALENDARS, LOCALE_NUMBERING_SYSTEMS, MILLISECOND_FORMATS, MINUTE_FORMATS, MONTH_FORMATS, MONTHS, SECOND_FORMATS, TIME_FORMATS, TIME_UNIT_VARIANTS, WESTERN_ZODIAC_SIGNS, YEAR_FORMATS, ZODIAC_PRESETS } from './constants'; import type { SEASON_PRESETS } from './seasons'; import type { TIME_ZONE_IDS, TIME_ZONE_LABELS, TIME_ZONES, TIME_ZONES_NATIVE } from './timezone'; export type { ChronosStatics, UTCOffset as UTCOffSet }; /** - Minute in numeric string from `00` to `23` */ export type ClockHour = `0${Enumerate<10>}` | `${NumberRange<10, 23>}`; /** - Minute in numeric string from `00` to `59` */ export type ClockMinute = `0${Enumerate<10>}` | `${NumberRange<10, 59>}`; /** - Second in numeric string from `00` to `59` */ export type ClockSecond = `0${Enumerate<10>}` | `${NumberRange<10, 59>}`; /** - Time in "HH:MM" format. */ export type ClockTime = `${ClockHour}:${ClockMinute}`; /** Normal time in `H:mm` format which does not follow the strict limit up to 23 hours, hour can be any number and minute can be numeric string from `00` to `59` */ export type HourMinutes = `${number}:${ClockMinute}`; /** - Configuration options for greeting. */ export interface GreetingConfigs { /** Time when the morning period ends (HH:MM format). Defaults to `11:59` */ morningEnds?: ClockTime; /** Time when the noon period ends (HH:MM format). Defaults to `12:59` */ noonEnds?: ClockTime; /** Time when the afternoon period ends (HH:MM format). Defaults to `17:59` */ afternoonEnds?: ClockTime; /** Time when the evening period ends (HH:MM format). Defaults to `23:59` */ eveningEnds?: ClockTime; /** Time when the midnight period ends (HH:MM format). Defaults to `02:59` */ midnightEnds?: ClockTime; /** Current time in "HH:MM" format for some weird reason. Defaults to current time `new Date()` */ currentTime?: ClockTime; /** Optional string to append after each message */ appendToMsg?: string; /** Optional string to prepend before each message */ prependToMsg?: string; /** Custom greeting message for the morning period. */ morningMessage?: string; /** Custom greeting message for the noon period. */ noonMessage?: string; /** Custom greeting message for the afternoon period. */ afternoonMessage?: string; /** Custom greeting message for the evening period. */ eveningMessage?: string; /** Custom greeting message for the midnight period. */ midnightMessage?: string; /** Default greeting message if no period matches. */ defaultMessage?: string; } /** Time zone details object */ export type TimeZoneDetails = { /** IANA time zone identifier */ tzIdentifier: $TimeZoneIdentifier; /** Long localized form (e.g., `'Pacific Standard Time'`, `'Nordamerikanische Westküsten-Normalzeit'`) */ tzNameLong: Maybe<LooseLiteral<TimeZoneName>>; /** Long generic non-location format (e.g.: `'Pacific Time'`, `'Nordamerikanische Westküstenzeit'`) */ tzNameLongGeneric: Maybe<LooseLiteral<TimeZoneName>>; /** Long localized GMT format, prefixed with `"GMT"` (e.g., `"GMT-08:00"`) */ tzNameLongOffset: Maybe<LooseLiteral<$GMTOffset>>; }; /** Options for `formatDate` utility */ export interface DateFormatOptions extends FormatOptions { /** - Date to format, must be parsable by {@link Date} constructor. Can be string, number or `Date`. Defaults to current time. */ date?: DateArgs; format?: StrictFormat; } /** Name of time unit from `year` to `millisecond` */ export type TimeUnit = 'year' | 'month' | 'day' | 'week' | 'hour' | 'minute' | 'second' | 'millisecond'; /** Name of time unit from `year` to `millisecond`, excluding `week` */ export type FromNowUnit = Exclude<TimeUnit, 'week'>; /** Conditional value for {@link TimeUnit} */ export type TimeUnitValue<Unit extends TimeUnit> = Unit extends 'month' ? NumberRange<1, 12> : Unit extends 'week' ? NumberRange<1, 53> : Unit extends 'day' ? NumberRange<1, 31> : Unit extends 'hour' ? Enumerate<24> : Unit extends 'minute' | 'second' ? Enumerate<60> : Unit extends 'millisecond' ? Milliseconds : number; /** Year in either 4 or 2 digits format */ export type YearToken = (typeof YEAR_FORMATS)[number]; /** Month in either 1 or 2 digits or 3 letters or full word format */ export type MonthToken = (typeof MONTH_FORMATS)[number]; /** Day in either 2 letters or full word format */ export type DayToken = (typeof DAY_FORMATS)[number]; /** Date in either 1 or 2 digits format */ export type DateToken = (typeof DATE_FORMATS)[number]; /** Second in either 1 or 2 digits format */ export type HourToken = (typeof HOUR_FORMATS)[number]; /** Second in either 1 or 2 digits format */ export type MinuteToken = (typeof MINUTE_FORMATS)[number]; /** Second in either 1 or 2 digits format */ export type SecondToken = (typeof SECOND_FORMATS)[number]; /** Millisecond in either 1 or 2 digits format */ export type MSToken = (typeof MILLISECOND_FORMATS)[number]; /** Time formats in either capital or lowercase `am/pm` format */ export type TimeToken = (typeof TIME_FORMATS)[number]; /** Unit suffix for {@link Date} getter methods (e.g., `'FullYear'` in `'getFullYear'`, `'Month'` in `'getMonth'` etc.). */ export type $DateUnit = 'FullYear' | 'Month' | 'Day' | 'Date' | 'Hours' | 'Minutes' | 'Seconds' | 'Milliseconds'; /** Standard date/time format tokens for `Chronos`. */ export type FormatToken = YearToken | MonthToken | DayToken | DateToken | HourToken | MinuteToken | SecondToken | MSToken | TimeToken | 'Z' | 'ZZ'; /** Standard date formats. */ export type DateFormatToken = `${DateToken} ${Exclude<MonthToken, 'M' | 'MM'>}` | `${Exclude<MonthToken, 'M' | 'MM'>} ${DateToken}` | `${DayToken}, ${DateToken} ${Exclude<MonthToken, 'M' | 'MM'>}` | `${DayToken}, ${Exclude<MonthToken, 'M' | 'MM'>} ${DateToken}` | `${Exclude<MonthToken, 'M' | 'MM'>} ${DateToken}, ${YearToken}` | `${DateToken} ${Exclude<MonthToken, 'M' | 'MM'>}, ${YearToken}` | `${Exclude<MonthToken, 'M' | 'MM'>} ${DateToken} ${YearToken}` | `${DateToken} ${Exclude<MonthToken, 'M' | 'MM'>} ${YearToken}` | `${DayToken}, ${Exclude<MonthToken, 'M' | 'MM'>} ${DateToken}, ${YearToken}` | `${DayToken}, ${DateToken} ${Exclude<MonthToken, 'M' | 'MM'>}, ${YearToken}` | `${DayToken}, ${Exclude<MonthToken, 'M' | 'MM'>} ${DateToken} ${YearToken}` | `${DayToken}, ${DateToken} ${Exclude<MonthToken, 'M' | 'MM'>} ${YearToken}` | `${Exclude<DateToken, 'Do'>}.${Exclude<MonthToken, 'mmm' | 'mmmm'>}.${YearToken}` | `${YearToken}.${Exclude<MonthToken, 'mmm' | 'mmmm'>}.${Exclude<DateToken, 'Do'>}` | `${Exclude<DateToken, 'Do'>}/${Exclude<MonthToken, 'mmm' | 'mmmm'>}/${YearToken}` | `${Exclude<DateToken, 'Do'>}-${Exclude<MonthToken, 'mmm' | 'mmmm'>}-${YearToken}` | `${Exclude<MonthToken, 'mmm' | 'mmmm'>}/${Exclude<DateToken, 'Do'>}/${YearToken}` | `${Exclude<MonthToken, 'mmm' | 'mmmm'>}-${Exclude<DateToken, 'Do'>}-${YearToken}` | `${YearToken}-${Exclude<MonthToken, 'mmm' | 'mmmm'>}-${Exclude<DateToken, 'Do'>}` | `${YearToken}/${Exclude<MonthToken, 'mmm' | 'mmmm'>}/${Exclude<DateToken, 'Do'>}` | `${YearToken}-${Exclude<DateToken, 'Do'>}-${Exclude<MonthToken, 'mmm' | 'mmmm'>}` | `${YearToken}/${Exclude<DateToken, 'Do'>}/${Exclude<MonthToken, 'mmm' | 'mmmm'>}`; /** Standard Time Formats */ export type TimeFormatToken = `${Exclude<HourToken, 'h' | 'hh' | 'H'>}:${Exclude<MinuteToken, 'm'>}` | `${Exclude<HourToken, 'H' | 'HH' | 'h'>}:${Exclude<MinuteToken, 'm'>} ${TimeToken}` | `${Exclude<HourToken, 'h' | 'hh' | 'H'>}:${Exclude<MinuteToken, 'm'>}:${Exclude<SecondToken, 's'>}` | `${Exclude<HourToken, 'H' | 'HH' | 'h'>}:${Exclude<MinuteToken, 'm'>}:${Exclude<SecondToken, 's'>} ${TimeToken}` | `${Exclude<HourToken, 'h' | 'hh' | 'H'>}:${Exclude<MinuteToken, 'm'>}:${Exclude<SecondToken, 's'>}:${Exclude<MSToken, 'ms'>}` | `${Exclude<HourToken, 'H' | 'HH' | 'h'>}:${Exclude<MinuteToken, 'm'>}:${Exclude<SecondToken, 's'>}:${Exclude<MSToken, 'ms'>} ${TimeToken}`; type DateTimeISO = 'YYYY-MM-DDTHH:mm:ss.mssZZ'; type TokenConnector = ' ' | ', ' | '; ' | ' - '; /** Format tokens for time only string */ export type TimeOnlyFormat = LooseLiteral<TimeFormatToken>; /** Pre-defined literal types for formatting date and time. Optionally can pass any string. */ export type StrictFormat = LooseLiteral<DateTimeISO | DateFormatToken | TimeFormatToken | `${DateFormatToken}${TokenConnector}${TimeFormatToken}`>; /** `BCP47` locale string or {@link Intl.Locale} object that contain one or more language or locale tags */ export type $LocalArguments = LooseLiteral<LocaleCode | Split<LocaleCode, '-'>[0]> | Intl.Locale; /** `BCP47` locale string, array of locale strings, {@link Intl.Locale} object, or array of {@link Intl.Locale} objects that contain one or more language or locale tags. */ export type LocalesArguments = $LocalArguments | $LocalArguments[]; /** Locale calendars supported by {@link Intl} API */ export type LocaleCalendar = (typeof LOCALE_CALENDARS)[number]; /** Locale numbering systems supported by {@link Intl} API */ export type NumberingSystem = (typeof LOCALE_NUMBERING_SYSTEMS)[number]; /** Extends {@link Intl.DateTimeFormatOptions} with improved type system. */ export interface DateTimeFormatOptions extends Intl.DateTimeFormatOptions { /** {@link https://en.wikipedia.org/wiki/List_of_tz_database_time_zones Time zone identifier} to use (excluding `'Factory'`). */ timeZone?: $TimeZoneIdentifier; /** Locale calendar system to use. */ calendar?: LocaleCalendar; /** Locale numbering system to use. */ numberingSystem?: NumberingSystem; } /** Iterable `Chronos` object properties */ export interface ChronosObject { /** Full year (e.g., 2025). */ year: number; /** Month index starting from 0 (January = 0). */ month: Enumerate<12>; /** ISO month number starting from 1 (January = 1). */ isoMonth: NumberRange<1, 12>; /** Day of the month (1–31). */ date: NumberRange<1, 31>; /** Day of the week index (0–6, Sunday = 0). */ weekDay: Enumerate<7>; /** ISO day of the week number (1–7, Monday = 1). */ isoWeekDay: NumberRange<1, 7>; /** Hour of the day (0–23). */ hour: Enumerate<24>; /** Minute of the hour (0–59). */ minute: Enumerate<60>; /** Second of the minute (0–59). */ second: Enumerate<60>; /** Milliseconds within the second. */ millisecond: Milliseconds; /** Timestamp in milliseconds since the Unix epoch. */ timestamp: number; /** Unix timestamp in seconds since the epoch. */ unix: number; } /** Return object type of `duration` method of `Chronos`. */ export interface TimeDuration { /** Total number of years. */ years: number; /** Number of months remaining after full years are counted. */ months: number; /** Number of days remaining after full months are counted. */ days: number; /** Number of hours remaining after full days are counted. */ hours: number; /** Number of minutes remaining after full hours are counted. */ minutes: number; /** Number of seconds remaining after full minutes are counted. */ seconds: number; /** Number of milliseconds remaining after full seconds are counted. */ milliseconds: number; } /** Key of {@link TimeDuration} */ export type DurationKey = keyof TimeDuration; /** Options for formatting duration string */ export interface DurationOptions { /** The time to compare with. Defaults to `now`. */ toTime?: ChronosInput; /** If true, returns all values as positive numbers. Defaults to `true`. */ absolute?: boolean; /** Maximum number of units to display, e.g. 2 → "1 hour, 20 minutes" */ maxUnits?: NumberRange<1, 7>; /** Separator between units (default: `", "`) */ separator?: string; /** Display mode: `"full"` (default) → "2 hours", `"short"` → "2h" */ style?: 'full' | 'short'; /** Whether to include zero values (default: `false`) */ showZero?: boolean; } /** Interface for accessing internal private properties in extended `Chronos` class */ export interface ChronosInternals { /** * * Access to `#withOrigin` private method. * * Creates a new `Chronos` instance with `origin` and other properties. * * @param instance The `Chronos` instance to which attach the `origin` and other properties. * @param origin Origin of the instance, the method name from where it was created. * @param offset Optional UTC offset in `UTC±HH:mm` format. * @param tzName Optional time zone name to set. * @param tzId Optional time zone identifier(s) to set. * @param tzTracker Optional tracker to identify the instance created by {@link https://toolbox.nazmul-nhb.dev/docs/classes/Chronos/conversion#timezone timeZone} method. * @returns The `Chronos` instance with the specified origin and other properties. */ withOrigin(instance: Chronos, method: PluginMethods, offset?: UTCOffset, tzName?: LooseLiteral<TimeZoneName>, tzId?: TimeZoneId, tzTracker?: $TimeZoneIdentifier | TimeZone | UTCOffset): Chronos; /** * * Access to `#toNewDate` private method * * Creates a new `Date` object from a `Chronos` input * @param instance - `Chronos` instance to operate on * @param value - Input value to convert (optional, uses current date if omitted) * @returns A new JavaScript `Date` object */ toNewDate(instance: Chronos, value?: ChronosInput): Date; /** * * Gets the internal `#date`, a readonly private property (core `Date` object) * @param instance - `Chronos` instance to access * @returns The core internal `Date` object */ internalDate(instance: Chronos): Date; /** * * Gets current UTC Offset internally stored as `#offset` private property * @param instance - `Chronos` instance to access * @returns The stored formatted UTC offset */ offset(instance: Chronos): UTCOffset; /** * Ensures the input is a `Chronos` instance, creating one if necessary. */ cast(date: ChronosInput): Chronos; } /** @internal Helper type to assign instance origin when creating new `Chronos` instance. */ export type WithoutOrigin = Omit<Chronos, '#ORIGIN' | 'origin'>; /** Alias for `typeof Chronos` */ export type $Chronos = typeof Chronos; /** * Instance methods that return `Chronos` instance */ export type $InstanceMethods = { [Method in keyof WithoutOrigin]: Chronos extends { [Instance in Method]: (...args: any[]) => Chronos; } ? Method : never; }[keyof WithoutOrigin]; /** * Static methods that return `Chronos` instance */ export type $StaticMethods = { [Method in keyof $Chronos]: $Chronos extends { [Instance in Method]: (...args: any[]) => Chronos; } ? Method : never; }[keyof $Chronos]; /** * Plugin methods that return `Chronos` instance */ export type $PluginMethods = 'round' | `timeZone` | 'nextWorkday' | 'nextWeekend' | 'previousWorkday' | 'previousWeekend'; /** * Plugin methods that return `Chronos` instance + any custom name */ export type PluginMethods = LooseLiteral<$PluginMethods>; /** Both instance and static methods (including built-in plugin methods) in `Chronos` class that return `Chronos` instance. */ export type ChronosMethods = $InstanceMethods | $StaticMethods | $PluginMethods; /** * * Accepted Input type for `Chronos` * * **Note**: *If a date is provided **without a time component**, the instance will default to `00:00:00.000` UTC * and convert it to the **equivalent local time** using the current environment's UTC offset.* */ export type ChronosInput = number | string | Date | Chronos; /** Properties required to reconstruct a `Chronos` instance. */ export interface ChronosProperties { /** The method or plugin name from which the instance was created. */ origin: LooseLiteral<ChronosMethods>; /** The native date value, either as a `Date` object or a date string. */ native: Date | string; /** The UTC offset in `UTC±HH:mm` format. */ utcOffset: UTCOffset; /** The full time zone name (e.g., `"Pacific Standard Time"`). */ timeZoneName: LooseLiteral<TimeZoneName>; /** The time zone identifier(s) associated with the instance (e.g., `"Asia/Dhaka"`). */ timeZoneId: TimeZoneId; /** Optional tracker to identify the instance created by `timeZone` method. */ $tzTracker?: $TimeZoneIdentifier | TimeZone | UTCOffset; } /** Represents key of `ChronosStatics` (each static method and property) */ export type ChronosStaticKey = keyof ChronosStatics; /** Key of {@link TIME_ZONE_LABELS} ({@link UTCOffset}) */ export type $TZLabelKey = keyof typeof TIME_ZONE_LABELS; /** Abbreviated time zone names (from {@link https://en.wikipedia.org/wiki/List_of_time_zone_abbreviations time zone abbreviations on Wikipedia}). */ export type TimeZone = keyof typeof TIME_ZONES; /** Time zone identifier (from {@link https://en.wikipedia.org/wiki/List_of_tz_database_time_zones IANA TZ Database on Wikipedia}) excluding `'Factory'`. */ export type $TimeZoneIdentifier = Exclude<keyof typeof TIME_ZONE_IDS, 'Factory'>; /** Time zone identifier (from {@link https://en.wikipedia.org/wiki/List_of_tz_database_time_zones IANA TZ Database on Wikipedia}) excluding `'Factory'` & abbreviations present in {@link TimeZone}. */ export type TimeZoneIdentifier = Exclude<$TimeZoneIdentifier, TimeZone>; /** Time zone identifier, array of timezone identifiers or UTC offset. */ export type TimeZoneId = $TimeZoneIdentifier | $TimeZoneIdentifier[] | UTCOffset; /** JavaScript native time zone identifier (from {@link Intl.supportedValuesOf} API) */ export type TimeZoneIdNative = keyof typeof TIME_ZONES_NATIVE; /** JavaScript native time zone name (from {@link Intl.supportedValuesOf} API) */ export type TimeZoneNameNative = (typeof TIME_ZONES_NATIVE)[TimeZoneIdNative]['tzName']; /** Native time zone name or IANA time zone identifier */ export type $NativeTzNameOrId = TimeZoneNameNative | $TimeZoneIdentifier; /** Full time zone names from {@link https://en.wikipedia.org/wiki/List_of_time_zone_abbreviations Wikipedia}, {@link https://en.wikipedia.org/wiki/List_of_tz_database_time_zones IANA TZ Database on Wikipedia} and JavaScript native API ({@link Intl.supportedValuesOf}). */ export type TimeZoneName = NonNullable<(typeof TIME_ZONE_LABELS)[$TZLabelKey] | (typeof TIME_ZONES)[TimeZone]['tzName'] | (typeof TIME_ZONE_IDS)[$TimeZoneIdentifier]['tzName'] | TimeZoneNameNative>; /** Positive UTC hours */ export type PositiveUTCHour = `+0${Enumerate<10>}` | `+${NumberRange<10, 14>}`; /** Negative UTC hours */ export type NegativeUTCHour = `-0${Enumerate<10>}` | `-${NumberRange<10, 14>}`; /** UTC Minutes as quarters */ export type UTCMinute = '00' | '15' | '30' | '45'; /** UTC offset in `±HH:mm` format */ export type $UTCOffset = `${PositiveUTCHour | NegativeUTCHour}:${UTCMinute}`; /** UTC offset in `UTC±HH:mm` format */ export type UTCOffset = `UTC${$UTCOffset}`; /** GMT offset in `GMT±HH:mm` or simply `GMT` format */ export type $GMTOffset = `GMT${$UTCOffset}` | 'GMT'; export type $ISOTimeString = `${number}-${number}-${number}T${number}:${number}:${number}.${number}`; export type ISODateTimeString = `${$ISOTimeString}Z`; /** ISO timestamp string type in ISO 8601 format */ export type ISOTimeString = `${$ISOTimeString}${'Z' | $UTCOffset}`; /** Valid argument type accepted by `Date` constructor */ export type DateArgs = string | number | Date; /** Type for ISO date format options */ export type ISODateFormat = 'local' | 'utc'; /** Options for `getTimestamp` utility */ export interface TimestampOptions { /** * Optional date input (string, number, or `Date` object). * Defaults to {@link Date new Date()}. */ value?: DateArgs; /** * Output format for the timestamp. * - `'utc'` (default) → returns ISO string in UTC (`...Z`). * - `'local'` → returns ISO string with current system offset (`...+05:30`). */ format?: ISODateFormat; } /** `Chronos` Date Format options */ export interface FormatOptions { /** * * The desired format (Default format is `'dd, mmm DD, YYYY HH:mm:ss'` = `'Sun, Apr 06, 2025 16:11:55'`). * * - To output raw text (i.e., not interpreted as a date token), wrap it in square brackets. * - For example, `[Today is] ddd` results in `Today is Sunday`, and `YYYY[ year]` results in `2025 year`. * * - Supported format tokens include: `YYYY`, `YY`, `mmmm`, `mmm`, `MM`, `M`, `DD`, `D`, `dd`, `ddd`, `Do`, `HH`, `H`, `hh`, `h`, `mm`, `m`, `ss`, `s`, `ms`, `mss`, `a`, `A`, and `ZZ`. * - *Any token not wrapped in brackets will be parsed and replaced with its corresponding date component.* * - Please refer to {@link https://toolbox.nazmul-nhb.dev/docs/classes/Chronos/format#format-tokens format tokens} for details. */ format?: string; /** - Whether to use UTC time. Defaults to `false`. */ useUTC?: boolean; } /** Definition of day part names. */ export type DayPart = 'night' | 'midnight' | 'lateNight' | 'morning' | 'afternoon' | 'evening'; /** Object type for extracting day parts. */ export type DayPartConfig = Record<DayPart, [ClockHour, ClockHour]>; /** Quarters of the year */ export type Quarter = 1 | 2 | 3 | 4; /** Academic year, e.g. `2024-2025` */ export type AcademicYear = `${number}-${number}`; /** Names of standard Zodiac signs */ export type ZodiacSign = (typeof WESTERN_ZODIAC_SIGNS)[number][0]; /** Presets for Zodiac Sign Configuration */ export type ZodiacPreset = keyof typeof ZODIAC_PRESETS; /** Shape of Zodiac signs array */ export type ZodiacArray<Sign extends string = ZodiacSign> = Array<[Sign, [NumberRange<1, 12>, NumberRange<1, 31>]] | Readonly<[Sign, Readonly<[NumberRange<1, 12>, NumberRange<1, 31>]>]>>; /** Zodiac metadata options */ export interface ZodiacMetaOptions<Sign extends string = ZodiacSign> { /** * Optional Zodiac preset to use. Default is `western`. * - **Note:** `western` and `tropical`, `vedic` and `sidereal` are same. */ preset?: ZodiacPreset; /** Custom Zodiac date ranges, overrides {@link preset presets}. */ custom?: ZodiacArray<Sign> | Readonly<ZodiacArray<Sign>>; } /** Options for configuring Zodiac sign getter */ export interface ZodiacOptions<Sign extends string = ZodiacSign> extends ZodiacMetaOptions<Sign> { /** - Optional birthdate in `MM-DD` format (`1`-based month). */ birthDate?: MonthDateString; } /** Represents resolved metadata for a zodiac sign */ export interface ZodiacMeta<Sign extends string = ZodiacSign> { /** * Index (`0`-based) of the zodiac sign within the resolved and chronologically sorted zodiac list. * * ⚠️ **Notes:** * - The `index` is determined by the Gregorian month–day order of zodiac start dates and may differ between variants (e.g. Western vs Vedic). * - This `index` should not be interpreted as a traditional or mythological zodiac ordering. */ index: number; /** The zodiac sign name. */ sign: Sign; /** Inclusive start date of the zodiac sign in `MM-DD` format. */ start: MonthDateString; /** Inclusive end date of the zodiac sign in `MM-DD` format. */ end: MonthDateString; } /** - Represents the full name of a weekday, e.g., 'Monday', 'Tuesday' etc. */ export type WeekDay = (typeof DAYS)[number]; /** - Represents the full name of a month, e.g., 'January', 'February' etc. */ export type MonthName = (typeof MONTHS)[number]; /** Common options for formatting and rounding dates */ interface $CommonRangeOptions { /** - Output format: return ISO strings in `'local'` or `'utc'` format. Defaults to `'local'`. */ format?: ISODateFormat; /** - Whether to round the dates in the range to the start of the day. Default is `false`. */ roundDate?: boolean; } /** - Options to define a **fixed date range** using explicit `from` and `to` dates. */ export interface DateRangeOptions extends $CommonRangeOptions { /** - Start date of the range (inclusive). Defaults to **now** if not provided. */ from?: ChronosInput; /** - End date of the range (inclusive). Defaults to **4 weeks from now** if not provided. */ to?: ChronosInput; } /** - Options to define a **relative date range** starting from the current date. */ export interface RelativeRangeOptions extends $CommonRangeOptions { /** * The number of time units to move **forward from `now`**. * * - Determines the size of the range. * - `now` → `start`, and `start + span` → `end`. * - Both `start` and `end` are included in the result. * - Controlled by the {@link unit} option. * - Defaults to `4`. */ span?: number; /** * The time unit used to advance the range. * * - Works together with {@link span} to calculate the final date range. * - For example: `span: 2, unit: 'week'` → 2-week range. * - Defaults to `'week'`. */ unit?: 'year' | 'month' | 'week' | 'day'; } /** - Unified type that supports either a fixed or relative date range configuration. */ export type WeekdayOptions = RelativeRangeOptions | DateRangeOptions; /** Common options to either skip or keep days */ interface $SkipOrKeepDays { /** * An array of weekdays to exclude from the date range. * - Accepts either weekday names (e.g., `'Saturday'`, `'Sunday'`) or numeric indices (0 for Sunday to 6 for Saturday). * - Ignored if {@link onlyDays} is provided. * * @example * skipDays: ['Saturday', 'Sunday'] * skipDays: [0, 6] // Sunday and Saturday */ skipDays?: Array<WeekDay> | Array<Enumerate<7>>; /** * An array of weekdays to explicitly include in the date range. * - Accepts either weekday names (e.g., `'Monday'`, `'Wednesday'`) or numeric indices (0 for Sunday to 6 for Saturday). * - When provided, this overrides {@link skipDays} and includes only the specified days. * * @example * onlyDays: ['Monday', 'Wednesday'] * onlyDays: [1, 3] // Monday and Wednesday */ onlyDays?: Array<WeekDay> | Array<Enumerate<7>>; } /** - Options to define a **fixed date range** using explicit `from` and `to` dates. */ export interface RangeWithDates extends DateRangeOptions, $SkipOrKeepDays { } /** - Options to define a **relative date range** starting from the current date. */ export interface RelativeDateRange extends RelativeRangeOptions, $SkipOrKeepDays { } /** - Unified type that supports either a fixed or relative date range configuration. */ export type DatesInRangeOptions = RangeWithDates | RelativeDateRange; /** Millisecond from `0-999` */ export type Milliseconds = Enumerate<999> | 999; /** Date of the month as `0` padded numeric string e.g. `01`, `18` */ export type DateString = `0${NumberRange<1, 9>}` | `${NumberRange<10, 31>}`; /** Month as `0` padded numeric string, e.g. `02`, `01` etc. */ export type MonthString = `0${NumberRange<1, 9>}` | '10' | '11' | '12'; /** Date and month in `MM-DD` format, e.g. `01-12` means 'January 18' */ export type MonthDateString = Exclude<`${MonthString}-${DateString}`, '02-30' | '02-31' | '04-31' | '06-31' | '09-31' | '11-31'>; /** ISO date-based range (format: `MM-DD`) e.g. `01-14` for 'January 14' */ export type DateBoundary = { /** Start date in `MM-DD` format, e.g. `01-18` means 'January 18' */ startDate: MonthDateString; /** End date in `MM-DD` format, e.g. `03-17` means 'March 17' */ endDate: MonthDateString; }; /** Inclusive month index-based range `0-11` (0 = January) */ export type MonthBoundary = { startMonth: Enumerate<12>; endMonth: Enumerate<12>; }; /** Season definition for season configuration */ export interface SeasonDefinition { /** Name of the season */ name: string; /** Inclusive date/month boundary of the season */ boundary: MonthBoundary | DateBoundary; } /** Name of a predefined season preset */ export type SeasonPreset = keyof typeof SEASON_PRESETS; /** Options for configuring seasons */ export interface SeasonOptions { /** Custom season list to override or define seasons manually */ seasons?: SeasonDefinition[]; /** Predefined preset to use for season calculation */ preset?: SeasonPreset; } /** * A plugin that augments the `Chronos` class with methods or properties. */ export type ChronosPlugin = (Chronos: $Chronos) => void; export interface $BusinessHourBaseOptions { /** - Optional starting hour of business time (0–23). Defaults to `9` (9 AM). */ businessStartHour?: Enumerate<24>; /** - Optional ending hour of business time (0–23). Defaults to `17` (5 PM). */ businessEndHour?: Enumerate<24>; } /** Options for configuring business hour with `weekStartsOn` and `weekendLength` */ export interface BusinessOptionsBasic extends $BusinessHourBaseOptions { /** - Optional day the week starts on (0–6). Default is `0` (Sunday). */ weekStartsOn?: Enumerate<7>; /** - Optional weekend length (1-4). Default is `2`.*/ weekendLength?: NumberRange<1, 4>; } /** Options for configuring business hour with `weekendDays` tuple */ export interface BusinessOptionsWeekends extends $BusinessHourBaseOptions { /** - Tuple of indices (0-6) of weekend days. Can pass only 1-4 elements. Default is `undefined`. */ weekendDays?: RangeTuple<Enumerate<7>, 1, 4>; } /** Options for configuring business hour */ export type $BusinessHourOptions = BusinessOptionsBasic | BusinessOptionsWeekends; /** Interface representing a date-like object. */ export interface DateLike { toJSON?(): string; toISOString?(): string; toString?(): string; format?(): string; toISO?(): string; toFormat?(format: string): string; plus?(...args: unknown[]): unknown; minus?(...args: unknown[]): unknown; equals?(...args: unknown[]): boolean; getClass?(): unknown; constructor?: { name: string; }; } /** * * Options for `Chronos` _static_ method `with()` * * @remarks Should provide at least one property, otherwise use the current date and time. */ export type ChronosWithOptions = Partial<{ /** The full year (e.g., 2025). Years 0–99 are interpreted as 1900–1999. */ year: number; /** Month number from 1 (January) to 12 (December). */ month: NumberRange<1, 12>; /** Day of the month, from 1 to 31. */ date: NumberRange<1, 31>; /** Hour of the day, from 0 (midnight) to 23 (11 PM). */ hour: Enumerate<24>; /** Minutes of the hour, from 0 to 59. */ minute: Enumerate<60>; /** Seconds of the minute, from 0 to 59. */ second: Enumerate<60>; /** Milliseconds of the second, from 0 to 999. */ millisecond: Milliseconds; }>; /** Mapped type to {@link TIME_UNIT_VARIANTS} */ export type $TimeUnitVarMap = typeof TIME_UNIT_VARIANTS; /** Key of {@link TIME_UNIT_VARIANTS} */ export type $TimeUnitKey = keyof typeof TIME_UNIT_VARIANTS; /** Variants of different time units in lowercase */ export type $TimeUnitVar<U extends $TimeUnitKey = $TimeUnitKey> = $TimeUnitVarMap[U][number]; /** Variants of different time units in lowercase, uppercase and capitalized */ export type $UnitAnyCase = Capitalize<$TimeUnitVar> | Uppercase<$TimeUnitVar> | $TimeUnitVar; /** Number (time value) with variants of different time units */ export type TimeWithUnit = `${number}${$UnitAnyCase}` | `${number} ${$UnitAnyCase}`; export type $BnEn = 'bn' | 'en'; type $BnOnesPadded = `০${$BnOnes}`; /** Bangla month from `১-১২` */ export type BanglaMonth = $BnOnes | $BnOnesPadded | '১০' | '১১' | '১২'; /** Bangla date of month from `১-৩১` */ export type BanglaDate = $BnOnes | $BnOnesPadded | `১${BanglaDigit}` | `২${BanglaDigit}` | '৩০' | '৩১'; export type $BnYearPadded = Repeat<BanglaDigit, 4>; export type $BnMonthPadded = $BnOnesPadded | '১০' | '১১' | '১২'; export type $BnDatePadded = $BnOnesPadded | `১${BanglaDigit}` | `২${BanglaDigit}` | '৩০' | '৩১'; /** Bangla year from `০-৯৯৯৯` */ export type BanglaYear = BanglaDigit | `${$BnOnes}${BanglaDigit}` | `${$BnOnes}${BanglaDigit}${BanglaDigit}` | Repeat<BanglaDigit, 4>; /** Token for Bangla season format */ type $SeasonToken = 'S' | 'SS'; /** Standard format tokens for Bangla date with seasons */ export type DateWithSeasonToken = `${Exclude<MonthToken, 'M' | 'MM'>} ${DateToken}, ${YearToken} ${$SeasonToken}` | `${DateToken} ${Exclude<MonthToken, 'M' | 'MM'>}, ${YearToken} ${$SeasonToken}` | `${Exclude<MonthToken, 'M' | 'MM'>} ${DateToken} ${YearToken} ${$SeasonToken}` | `${DateToken} ${Exclude<MonthToken, 'M' | 'MM'>} ${YearToken} ${$SeasonToken}` | `${DayToken}, ${Exclude<MonthToken, 'M' | 'MM'>} ${DateToken}, ${YearToken}, ${$SeasonToken}` | `${DayToken}, ${DateToken} ${Exclude<MonthToken, 'M' | 'MM'>}, ${YearToken}, ${$SeasonToken}` | `${DayToken}, ${Exclude<MonthToken, 'M' | 'MM'>} ${DateToken} ${YearToken}, ${$SeasonToken}` | `${DayToken}, ${DateToken} ${Exclude<MonthToken, 'M' | 'MM'>} ${YearToken}, ${$SeasonToken}` | `${Exclude<DateToken, 'Do'>}/${Exclude<MonthToken, 'mmm' | 'mmmm'>}/${YearToken} (${$SeasonToken})` | `${Exclude<DateToken, 'Do'>}-${Exclude<MonthToken, 'mmm' | 'mmmm'>}-${YearToken} (${$SeasonToken})` | `${Exclude<MonthToken, 'mmm' | 'mmmm'>}/${Exclude<DateToken, 'Do'>}/${YearToken} (${$SeasonToken})` | `${Exclude<MonthToken, 'mmm' | 'mmmm'>}-${Exclude<DateToken, 'Do'>}-${YearToken} (${$SeasonToken})` | `${YearToken}-${Exclude<MonthToken, 'mmm' | 'mmmm'>}-${Exclude<DateToken, 'Do'>} (${$SeasonToken})` | `${YearToken}/${Exclude<MonthToken, 'mmm' | 'mmmm'>}/${Exclude<DateToken, 'Do'>} (${$SeasonToken})` | `${YearToken}-${Exclude<DateToken, 'Do'>}-${Exclude<MonthToken, 'mmm' | 'mmmm'>} (${$SeasonToken})` | `${YearToken}/${Exclude<DateToken, 'Do'>}/${Exclude<MonthToken, 'mmm' | 'mmmm'>} (${$SeasonToken})`; /** Standard format tokens for Bangla date along with any string */ export type BanglaDateFormat = LooseLiteral<DateFormatToken | DateWithSeasonToken>; /** Bangla name of the weekday either in Bangla or Latin */ export type BanglaDayName<Locale extends $BnEn = 'bn'> = (typeof BN_DAYS)[number][Locale]; /** Bangla name of the month either in Bangla or Latin */ export type BanglaMonthName<Locale extends $BnEn = 'bn'> = (typeof BN_MONTHS)[number][Locale]; /** Bangla name of the season either in Bangla or Latin */ export type BanglaSeasonName<Locale extends $BnEn = 'bn'> = (typeof BN_SEASONS)[number][Locale]; /** Represents Bangla year either in Bangla digit or Latin from 1-12 */ export type $BanglaYear<Locale extends $BnEn = 'bn'> = Locale extends 'en' ? number : BanglaYear; /** Represents Bangla month either in Bangla digit or Latin from 0-9999 */ export type $BanglaMonth<Locale extends $BnEn = 'bn'> = Locale extends 'en' ? NumberRange<1, 12> : BanglaMonth; /** Represents Bangla date of the month either in Bangla digit or Latin from 1-31 */ export type $BanglaMonthDate<Locale extends $BnEn = 'bn'> = Locale extends 'en' ? NumberRange<1, 31> : BanglaDate; /** Represents a Bangla date object for `Chronos` plugin */ export type BanglaDateObject<Locale extends $BnEn = 'bn'> = { /** Represents Bangla year either in Bangla digit or Latin from 1-12 */ year: $BanglaYear<Locale>; /** Represents Bangla month either in Bangla digit or Latin from 1-12 */ month: $BanglaMonth<Locale>; /** Represents Bangla date of the month either in Bangla digit or Latin from 1-31 */ date: $BanglaMonthDate<Locale>; /** Bangla name of the weekday either in Bangla or Latin */ dayName: BanglaDayName<Locale>; /** Bangla name of the month either in Bangla or Latin */ monthName: BanglaMonthName<Locale>; /** Bangla name of the season either in Bangla or Latin */ seasonName: BanglaSeasonName<Locale>; /** Leap year status of the current year */ isLeapYear: boolean; }; /** Variant of Bangla calendar system */ export type BnCalendarVariant = keyof typeof BN_MONTH_TABLES; /** Configuration object for Bangla Calendar system */ export interface BnCalendarConfig { /** - Calendar variant to use. Defaults to `'revised-2019'`. */ variant?: BnCalendarVariant; } /** Bangla date options for `Chronos` plugin (`banglaPlugin`) */ export interface BanglaDateOptions<Locale extends $BnEn> extends BnCalendarConfig { /** - Locale to use for output values. Defaults to `'bn'`. */ locale?: Locale | $BnEn; }