@autometa/datetime 0.1.15 → 1.0.0-rc.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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/dates/date-factory.ts","../src/dates/midnight.ts","../src/dates/iso-date-factory.ts","../src/dates/formatted-date-factory.ts","../src/dates/dates.ts","../src/time/time.ts"],"sourcesContent":["export * from './dates'\nexport * from './time'","import { TimeUnit, camel, convertPhrase, collapse } from \"@autometa/phrases\";\nimport { midnight } from \"./midnight\";\nimport { AutomationError, raise } from \"@autometa/errors\";\nimport { ConfirmDefined, ConfirmLengthAtLeast } from \"@autometa/asserters\";\nimport { isValidDate, isValidISODateString, isValidTime, isValidYearMonth } from \"iso-datestring-validator\";\ntype TimeShortcut =\n | \"now\"\n | \"beforeYesterday\"\n | \"yesterday\"\n | \"today\"\n | \"tomorrow\"\n | \"afterTomorrow\"\n | \"midnight\"\n | \"lastWeek\"\n | \"nextWeek\"\n | \"lastFortnight\"\n | \"nextFortnight\";\n\nfunction isTimeShortcut(text: string): text is TimeShortcut {\n const converted = convertPhrase(text, camel);\n const includes = [\n \"now\",\n \"beforeYesterday\",\n \"yesterday\",\n \"today\",\n \"tomorrow\",\n \"afterTomorrow\",\n \"midnight\",\n \"lastWeek\",\n \"nextWeek\",\n \"lastFortnight\",\n \"nextFortnight\"\n ].includes(converted);\n if (!includes) {\n return false;\n }\n return true;\n}\nexport class DateFactory {\n phraseMap = new Map<TimeShortcut, () => Date>([\n [\"now\", () => this.make(0, \"days\")],\n [\"beforeYesterday\", () => this.make(-2, \"days\")],\n [\"yesterday\", () => this.make(-1, \"days\")],\n [\"today\", () => this.make(0, \"days\")],\n [\"tomorrow\", () => this.make(1, \"days\")],\n [\"afterTomorrow\", () => this.make(2, \"days\")],\n [\"nextWeek\", () => this.make(7, \"days\")],\n [\"lastWeek\", () => this.make(-7, \"days\")],\n [\"nextFortnight\", () => this.make(14, \"days\")],\n [\"lastFortnight\", () => this.make(-14, \"days\")],\n [\"midnight\", midnight]\n ]);\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n find(name: TimeShortcut): Date {\n const result = this.phraseMap.get(name);\n if (result) {\n return result();\n }\n raise(\n `Could not find date shortcut ${name}. Please use a valid date shortcut from the following list: ${Array.from(\n this.phraseMap.keys()\n ).join(\", \")}`\n );\n }\n\n fromPhraseSafe(phrase: string) {\n const name = convertPhrase(phrase, camel);\n if (isTimeShortcut(name)) {\n if (this.phraseMap.has(name)) {\n return this.phraseMap.get(name)?.call(this);\n }\n }\n \n const matchDay = this.#extractTimeFromPhrase(phrase);\n if (matchDay) {\n return matchDay;\n }\n const first = isValidDate(phrase);\n const second = isValidISODateString(phrase);\n const third = isValidTime(phrase);\n const fourth = isValidYearMonth(phrase);\n if (!first && !second && !third && !fourth) {\n return new Date(\"null\");\n }\n const parsed = new Date(phrase);\n if (isNaN(parsed.getTime())) {\n return new Date(Date.parse(phrase));\n }\n return parsed;\n }\n fromPhrase(phrase: string) {\n const result = this.fromPhraseSafe(phrase);\n if (result) {\n return result;\n }\n raise(\n `Could not parse date from phrase ${phrase}. Please use a valid date string or a phrase from the following list: ${Array.from(\n this.phraseMap.keys()\n ).join(\", \")}`\n );\n }\n make(timeOffset: number, timeunit: TimeUnit) {\n const unit = timeunit.endsWith(\"s\") ? timeunit : `${timeunit}s`;\n switch (unit) {\n case \"years\":\n return this.#addYears(timeOffset);\n case \"months\":\n return this.#addMonths(timeOffset);\n case \"weeks\":\n return this.#addWeeks(timeOffset);\n case \"days\":\n return this.#addDays(timeOffset);\n case \"seconds\":\n return this.#addSeconds(timeOffset);\n case \"milliseconds\":\n return this.#addMilliseconds(timeOffset);\n case \"hours\":\n return this.#addHours(timeOffset);\n case \"minutes\":\n return this.#addMinutes(timeOffset);\n default:\n throw new AutomationError(\n `Invalid timeunit ${timeunit}, options are 'days', 'seconds', 'milliseconds', 'hours', 'minutes'. Non plural equivalents such as 'day' or 'week' are also accepted.`\n );\n }\n }\n #extractTimeFromPhrase(phrase: string) {\n return (\n this.#extractFutureFromPhrase(phrase) ??\n this.#extractPastFromPhrase(phrase)\n );\n }\n #extractFutureFromPhrase(phrase: string) {\n const pastPattern = /^(\\d+) (.*)s? from now?/;\n const pastMatch = pastPattern.exec(phrase);\n\n if (ConfirmDefined(pastMatch) && ConfirmLengthAtLeast(pastMatch, 3)) {\n const [_, value, unit] = pastMatch;\n const timeunit = convertPhrase(unit, collapse) as TimeUnit;\n return this.make(Number(value), timeunit);\n }\n }\n #extractPastFromPhrase(phrase: string) {\n const pastPattern = /^(\\d+) (.*)(s)? ago?/gm;\n const pastMatch = pastPattern.exec(phrase);\n if (ConfirmDefined(pastMatch) && ConfirmLengthAtLeast(pastMatch, 3)) {\n const [_, value, unit] = pastMatch;\n const timeunit = convertPhrase(unit, camel) as TimeUnit;\n return this.make(-Number(value), timeunit);\n }\n }\n #addYears(yearsOffset: number) {\n const date = new Date();\n date.setFullYear(date.getFullYear() + yearsOffset);\n return date;\n }\n #addMonths(monthOffset: number) {\n const date = new Date();\n date.setMonth(date.getMonth() + monthOffset);\n return date;\n }\n #addWeeks(weekOffset: number) {\n const date = new Date();\n date.setMonth(date.getMonth() + weekOffset / 4);\n return date;\n }\n #addDays(daysOffset: number) {\n const date = new Date();\n date.setDate(date.getDate() + daysOffset);\n return date;\n }\n\n #addSeconds(secondsOffset: number) {\n const date = new Date();\n date.setSeconds(date.getSeconds() + secondsOffset);\n return date;\n }\n\n #addMilliseconds(millisecondsOffset: number) {\n const date = new Date();\n date.setMilliseconds(date.getMilliseconds() + millisecondsOffset);\n return date;\n }\n #addHours(hoursOffset: number) {\n const date = new Date();\n date.setHours(date.getHours() + hoursOffset);\n return date;\n }\n #addMinutes(minutesOffset: number) {\n const date = new Date();\n date.setMinutes(date.getMinutes() + minutesOffset);\n return date;\n }\n}\n","\nexport function midnight() {\n const date = new Date();\n date.setDate(date.getDate() + 1);\n date.setHours(0, 0, 0, 0);\n return date;\n}\n","import { TimeUnit } from '@autometa/phrases';\nimport { midnight } from './midnight';\nimport { DateFactory } from './date-factory';\n\n\nexport class IsoDateFactory {\n constructor(readonly dateFactory: DateFactory) { }\n phraseMap = new Map<string, string>([\n ['beforeYesterday', this.make(-2, 'days')],\n ['yesterday', this.make(-1, 'days')],\n ['today', this.make(0, 'days')],\n ['tomorrow', this.make(1, 'days')],\n ['afterTomorrow', this.make(2, 'days')],\n ['nextWeek', this.make(7, 'days')],\n ['lastWeek', this.make(-7, 'days')],\n ['nextFortnight', this.make(14, 'days')],\n ['lastFortnight', this.make(-14, 'days')],\n ['midnight', midnight().toISOString()],\n ]);\n make(daysOffset: number, timeunit: TimeUnit) {\n return this.dateFactory.make(daysOffset, timeunit).toISOString();\n }\n\n /**\n * Attempts to parse a phrase into a date.\n * @param phrase\n * @returns\n */\n fromPhrase(phrase: string) {\n return this.dateFactory.fromPhrase(phrase)?.toISOString();\n }\n\n /**\n * Returns the date and time of the day before yesterday\n */\n get beforeYesterday() {\n return this.phraseMap.get('beforeYesterday');\n }\n\n /**\n * Returns the date and time of yesterday\n */\n get yesterday() {\n return this.phraseMap.get('yesterday');\n }\n\n /**\n * Returns the date and time of today\n */\n get today() {\n return this.phraseMap.get('today');\n }\n\n /**\n * Returns the date and time of tomorrow\n */\n get tomorrow() {\n return this.phraseMap.get('tomorrow');\n }\n\n /**\n * Returns the date and time of the day after tomorrow\n */\n get afterTomorrow() {\n return this.phraseMap.get('afterTomorrow');\n }\n\n /**\n * Returns the date and time of midnight today\n */\n get midnight() {\n return this.phraseMap.get('midnight');\n }\n\n /**\n * Returns the date and time of today 1 week ago\n */\n get lastWeek() {\n return this.phraseMap.get('lastWeek');\n }\n\n /**\n * Returns the date and time of today 1 week from now\n */\n get nextWeek() {\n return this.phraseMap.get('nextWeek');\n }\n get lastFortnight() {\n return this.phraseMap.get('lastFortnight');\n }\n\n /**\n * Returns the date and time of today 1 fortnight from now\n */\n get nextFortnight() {\n return this.phraseMap.get('nextFortnight');\n }\n}\n","import { TimeUnit } from '@autometa/phrases';\nimport { DateFactory } from './date-factory';\nimport { midnight } from './midnight';\n\nexport class FmtDateFactory {\n constructor(readonly dateFactory: DateFactory) { }\n phraseMap = new Map<string, string>([\n ['beforeYesterday', this.make(-2, 'days')],\n ['yesterday', this.make(-1, 'days')],\n ['today', this.make(0, 'days')],\n ['tomorrow', this.make(1, 'days')],\n ['afterTomorrow', this.make(2, 'days')],\n ['nextWeek', this.make(7, 'days')],\n ['lastWeek', this.make(-7, 'days')],\n ['nextFortnight', this.make(14, 'days')],\n ['lastFortnight', this.make(-14, 'days')],\n ['midnight', midnight().toISOString()],\n ]);\n\n make(daysOffset: number, timeunit: TimeUnit) {\n return this.dateFactory\n .make(daysOffset, timeunit)\n .toISOString()\n .split('T')[0];\n }\n \n /**\n * Attempts to parse a phrase into a date.\n * @param phrase\n * @returns\n */\n fromPhrase(phrase: string) {\n return this.dateFactory.fromPhrase(phrase)?.toISOString().split('T')[0];\n }\n\n /**\n * Returns the date and time of the day before yesterday\n */\n get beforeYesterday() {\n return this.phraseMap.get('beforeYesterday');\n }\n\n /**\n * Returns the date and time of yesterday\n */\n get yesterday() {\n return this.phraseMap.get('yesterday');\n }\n\n /**\n * Returns the date and time of today\n */\n get today() {\n return this.phraseMap.get('today');\n }\n\n /**\n * Returns the date and time of tomorrow\n */\n get tomorrow() {\n return this.phraseMap.get('tomorrow');\n }\n\n /**\n * Returns the date and time of the day after tomorrow\n */\n get afterTomorrow() {\n return this.phraseMap.get('afterTomorrow');\n }\n\n /**\n * Returns the date and time of midnight today\n */\n get midnight() {\n return this.phraseMap.get('midnight');\n }\n\n /**\n * Returns the date and time of today 1 week ago\n */\n get lastWeek() {\n return this.phraseMap.get('lastWeek');\n }\n\n /**\n * Returns the date and time of today 1 week from now\n */\n get nextWeek() {\n return this.phraseMap.get('nextWeek');\n }\n\n /**\n * Returns the date and time of today 1 fortnight ago\n */\n get lastFortnight() {\n return this.phraseMap.get('lastFortnight');\n }\n\n /**\n * Returns the date and time of today 1 fortnight from now\n */\n get nextFortnight() {\n return this.phraseMap.get('nextFortnight');\n }\n}\n","import { DateFactory } from \"./date-factory\";\nimport { IsoDateFactory } from \"./iso-date-factory\";\nimport { FmtDateFactory } from \"./formatted-date-factory\";\nimport { TimeUnit } from \"@autometa/phrases\";\n\nexport class DatesObject {\n #factory: DateFactory = new DateFactory();\n #iso = new IsoDateFactory(this.#factory);\n #fmt = new FmtDateFactory(this.#factory);\n /**\n * Switches to the ISO factory, which offers an identical interface\n * but returns ISO strings instead of Date objects.\n * \n * Example: `2020-01-01T00:00:00.000Z`\n */\n get iso() {\n return this.#iso;\n }\n\n /**\n * Switches to the formatted factory, which offers an identical interface\n * but returns formatted strings instead of Date objects.\n * \n * Example: `2020-01-01`\n */\n get fmt() {\n return this.#fmt;\n }\n\n /**\n * Returns the current date and time.\n */\n get now() {\n return this.#factory.find(\"now\");\n }\n\n /**\n * Returns the date and time of the day before yesterday\n */\n get beforeYesterday(): Date {\n return this.#factory.find(\"beforeYesterday\");\n }\n \n /**\n * Returns the date and time of yesterday\n */\n get yesterday(): Date {\n return this.#factory.find(\"yesterday\");\n }\n\n /**\n * Returns the date and time of today\n */\n get today(): Date {\n return this.#factory.find(\"today\");\n }\n\n /**\n * Returns the date and time of tomorrow\n */\n get tomorrow(): Date {\n return this.#factory.find(\"tomorrow\");\n }\n\n /**\n * Returns the date and time of the day after tomorrow\n */\n get afterTomorrow(): Date {\n return this.#factory.find(\"afterTomorrow\");\n }\n\n /**\n * Returns the date and time of midnight today\n */\n get midnight(): Date {\n return this.#factory.find(\"midnight\");\n }\n\n /**\n * Returns the date and time of today 1 week ago\n */\n get lastWeek(): Date {\n return this.#factory.find(\"lastWeek\");\n }\n\n /**\n * Returns the date and time of today 1 week from now\n */\n get nextWeek(): Date {\n return this.#factory.find(\"nextWeek\");\n }\n\n /**\n * Returns the date and time of today 2 weeks ago\n */\n get lastFortnight(): Date {\n return this.#factory.find(\"lastFortnight\");\n }\n\n /**\n * Returns the date and time of today 2 weeks from now\n */\n get nextFortnight(): Date {\n return this.#factory.find(\"nextFortnight\");\n }\n\n /**\n * Attempts to parse a phrase into a date.\n * @param phrase \n * @returns \n */\n fromPhrase(phrase: string) {\n return this.#factory.fromPhrase(phrase);\n }\n\n /**\n * Attempts to parse a phrase into a date.\n * If the phrase is invalid, it will return an invalid date instead of throwing.\n * @param phrase \n * @returns \n */\n fromPhraseSafe(phrase: string) {\n return this.#factory.fromPhraseSafe(phrase);\n }\n\n make(timeOffset: number, timeUnit: TimeUnit) {\n return this.#factory.make(timeOffset, timeUnit);\n }\n}\n\n/**\n * Date utility option to easily generate common\n * dates around the current date, like 'today', 'midnight',\n * 'tomorrow', 'nextWeek', etc.\n * \n * The Dates utility also supports certain language phrases\n * that might be natural in Cucumber's gherkin syntax, like\n * 'next week', 'last week', 'next fortnight', etc. as well\n * as more dynamic phrases like `1 day ago`, `2 weeks from now`,\n */\nexport const Dates = new DatesObject();\n","import { AssertKey } from \"@autometa/asserters\";\nimport { convertPhrase, lower } from \"@autometa/phrases\";\ntype TimeDiffFn = (date1: Date, date2: Date) => number;\n\nexport class TimeDiff {\n minutes(date1: Date, date2: Date) {\n return this.millis(date1, date2) / 60000;\n }\n seconds(date1: Date, date2: Date) {\n return this.millis(date1, date2) / 1000;\n }\n millis(date1: Date, date2: Date) {\n const d1 = new Date(date1).getTime();\n const d2 = new Date(date2).getTime();\n return Math.abs(Math.round(d2 - d1));\n }\n days(date1: Date, date2: Date) {\n return this.millis(date1, date2) / 86400000;\n }\n hours(date1: Date, date2: Date) {\n return this.millis(date1, date2) / 3600000;\n }\n weeks(date1: Date, date2: Date) {\n return this.millis(date1, date2) / 604800000;\n }\n fromPhrase(phrase: string): TimeDiffFn {\n const propertyKey = convertPhrase(phrase, lower);\n AssertKey(this, propertyKey);\n return (this[propertyKey] as TimeDiffFn).bind(this);\n }\n}\n\nexport class TimeObject {\n #diff = new TimeDiff();\n get diff() {\n return this.#diff;\n }\n}\n\nexport const Time = new TimeObject();\n"],"mappings":"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","names":["import_asserters","import_phrases"]}
1
+ {"version":3,"sources":["../src/dates/date-factory.ts","../src/dates/clock.ts","../src/dates/time-units.ts","../src/shared/phrases.ts","../src/dates/formatted-date-factory.ts","../src/dates/iso-date-factory.ts","../src/dates/object.ts","../src/time/time-diff.ts","../src/time/time.ts"],"names":["AutomationError"],"mappings":"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","sourcesContent":["import { AutomationError } from \"@autometa/errors\";\nimport {\n isValidDate,\n isValidISODateString,\n isValidTime,\n isValidYearMonth,\n} from \"iso-datestring-validator\";\nimport type { Clock } from \"./clock.js\";\nimport { cloneDate, systemClock } from \"./clock.js\";\nimport {\n resolveTimeUnit,\n type StandardTimeUnit,\n} from \"./time-units.js\";\nimport { normalizeToken, toCamelKey } from \"../shared/phrases.js\";\n\nexport type DateShortcut =\n | \"now\"\n | \"beforeYesterday\"\n | \"yesterday\"\n | \"today\"\n | \"tomorrow\"\n | \"afterTomorrow\"\n | \"midnight\"\n | \"lastWeek\"\n | \"nextWeek\"\n | \"lastFortnight\"\n | \"nextFortnight\";\n\nconst SHORTCUT_LOOKUP = new Set<DateShortcut>([\n \"now\",\n \"beforeYesterday\",\n \"yesterday\",\n \"today\",\n \"tomorrow\",\n \"afterTomorrow\",\n \"midnight\",\n \"lastWeek\",\n \"nextWeek\",\n \"lastFortnight\",\n \"nextFortnight\",\n]);\n\nexport interface DateFactoryOptions {\n clock?: Clock;\n}\n\ninterface RelativePhraseMatch {\n offset: number;\n unit: StandardTimeUnit;\n}\n\nconst FUTURE_PATTERN = /^(\\d+)\\s+([A-Za-z\\s]+?)\\s+from\\s+now$/i;\nconst PAST_PATTERN = /^(\\d+)\\s+([A-Za-z\\s]+?)\\s+ago$/i;\n\nfunction invalidDate(): Date {\n return new Date(Number.NaN);\n}\n\nfunction isDateShortcut(value: string): value is DateShortcut {\n return SHORTCUT_LOOKUP.has(value as DateShortcut);\n}\n\nexport class DateFactory {\n private readonly clock: Clock;\n\n constructor(options: DateFactoryOptions = {}) {\n this.clock = options.clock ?? systemClock;\n }\n\n find(shortcut: DateShortcut): Date {\n switch (shortcut) {\n case \"now\":\n return this.currentDate();\n case \"beforeYesterday\":\n return this.make(-2, \"days\");\n case \"yesterday\":\n return this.make(-1, \"days\");\n case \"today\":\n return this.make(0, \"days\");\n case \"tomorrow\":\n return this.make(1, \"days\");\n case \"afterTomorrow\":\n return this.make(2, \"days\");\n case \"midnight\":\n return this.midnight();\n case \"lastWeek\":\n return this.make(-1, \"weeks\");\n case \"nextWeek\":\n return this.make(1, \"weeks\");\n case \"lastFortnight\":\n return this.make(-14, \"days\");\n case \"nextFortnight\":\n return this.make(14, \"days\");\n default:\n throw new AutomationError(\n `Unsupported date shortcut '${shortcut}'.`\n );\n }\n }\n\n fromPhraseSafe(phrase: unknown): Date {\n if (typeof phrase !== \"string\") {\n return invalidDate();\n }\n\n const trimmed = phrase.trim();\n if (trimmed.length === 0) {\n return invalidDate();\n }\n\n const shortcutCandidate = toCamelKey(trimmed);\n if (isDateShortcut(shortcutCandidate)) {\n return this.find(shortcutCandidate);\n }\n\n const relative = this.extractRelative(trimmed);\n if (relative) {\n return this.make(relative.offset, relative.unit);\n }\n\n if (this.isDateLike(trimmed)) {\n return this.parseDate(trimmed);\n }\n\n return invalidDate();\n }\n\n fromPhrase(phrase: unknown): Date {\n const result = this.fromPhraseSafe(phrase);\n if (Number.isNaN(result.getTime())) {\n throw new AutomationError(\n `Could not parse date from phrase '${String(phrase)}'. ` +\n `Valid shortcuts are: ${[...SHORTCUT_LOOKUP].join(\", \")}.`\n );\n }\n return result;\n }\n\n make(timeOffset: number, timeUnit: string | StandardTimeUnit): Date {\n if (!Number.isFinite(timeOffset)) {\n throw new AutomationError(\n `Time offset must be finite. Received '${timeOffset}'.`\n );\n }\n\n const { unit, scale } = resolveTimeUnit(String(timeUnit));\n const offset = timeOffset * scale;\n const date = this.currentDate();\n\n switch (unit) {\n case \"years\":\n date.setFullYear(date.getFullYear() + offset);\n break;\n case \"months\":\n date.setMonth(date.getMonth() + offset);\n break;\n case \"weeks\":\n date.setDate(date.getDate() + offset * 7);\n break;\n case \"days\":\n date.setDate(date.getDate() + offset);\n break;\n case \"hours\":\n date.setHours(date.getHours() + offset);\n break;\n case \"minutes\":\n date.setMinutes(date.getMinutes() + offset);\n break;\n case \"seconds\":\n date.setSeconds(date.getSeconds() + offset);\n break;\n case \"milliseconds\":\n date.setMilliseconds(date.getMilliseconds() + offset);\n break;\n default:\n throw new AutomationError(`Unsupported time unit '${unit}'.`);\n }\n\n return date;\n }\n\n private currentDate(): Date {\n return cloneDate(this.clock.now());\n }\n\n private midnight(): Date {\n const date = this.currentDate();\n date.setUTCDate(date.getUTCDate() + 1);\n date.setUTCHours(0, 0, 0, 0);\n return date;\n }\n\n private parseDate(value: string): Date {\n const parsed = new Date(value);\n if (!Number.isNaN(parsed.getTime())) {\n return parsed;\n }\n return new Date(Date.parse(value));\n }\n\n private isDateLike(value: string): boolean {\n if (!Number.isNaN(new Date(value).getTime())) {\n return true;\n }\n return (\n isValidDate(value) ||\n isValidISODateString(value) ||\n isValidTime(value) ||\n isValidYearMonth(value)\n );\n }\n\n private extractRelative(phrase: string): RelativePhraseMatch | undefined {\n const futureMatch = FUTURE_PATTERN.exec(phrase);\n if (futureMatch) {\n return this.buildRelativeMatch(futureMatch, 1);\n }\n\n const pastMatch = PAST_PATTERN.exec(phrase);\n if (pastMatch) {\n return this.buildRelativeMatch(pastMatch, -1);\n }\n\n return undefined;\n }\n\n private buildRelativeMatch(\n match: RegExpExecArray,\n direction: 1 | -1\n ): RelativePhraseMatch | undefined {\n const value = match[1];\n const unit = match[2];\n if (!value || !unit) {\n return undefined;\n }\n\n const magnitude = Number.parseInt(value, 10);\n if (!Number.isFinite(magnitude)) {\n return undefined;\n }\n\n const convertedUnit = normalizeToken(unit);\n const { unit: normalisedUnit, scale } = resolveTimeUnit(convertedUnit);\n const offset = magnitude * scale * direction;\n return {\n offset,\n unit: normalisedUnit,\n };\n }\n}\n","export interface Clock {\n now(): Date;\n}\n\nexport const systemClock: Clock = {\n now: () => new Date(),\n};\n\nexport function cloneDate(date: Date): Date {\n return new Date(date.getTime());\n}\n","import { AutomationError } from \"@autometa/errors\";\n\nexport type StandardTimeUnit =\n | \"milliseconds\"\n | \"seconds\"\n | \"minutes\"\n | \"hours\"\n | \"days\"\n | \"weeks\"\n | \"months\"\n | \"years\";\n\nexport interface NormalisedTimeUnit {\n unit: StandardTimeUnit;\n scale: number;\n}\n\nconst UNIT_ALIASES: Record<string, NormalisedTimeUnit> = {\n millisecond: { unit: \"milliseconds\", scale: 1 },\n milliseconds: { unit: \"milliseconds\", scale: 1 },\n ms: { unit: \"milliseconds\", scale: 1 },\n second: { unit: \"seconds\", scale: 1 },\n seconds: { unit: \"seconds\", scale: 1 },\n sec: { unit: \"seconds\", scale: 1 },\n secs: { unit: \"seconds\", scale: 1 },\n minute: { unit: \"minutes\", scale: 1 },\n minutes: { unit: \"minutes\", scale: 1 },\n min: { unit: \"minutes\", scale: 1 },\n mins: { unit: \"minutes\", scale: 1 },\n hour: { unit: \"hours\", scale: 1 },\n hours: { unit: \"hours\", scale: 1 },\n hr: { unit: \"hours\", scale: 1 },\n hrs: { unit: \"hours\", scale: 1 },\n day: { unit: \"days\", scale: 1 },\n days: { unit: \"days\", scale: 1 },\n week: { unit: \"weeks\", scale: 1 },\n weeks: { unit: \"weeks\", scale: 1 },\n fortnight: { unit: \"days\", scale: 14 },\n fortnights: { unit: \"days\", scale: 14 },\n month: { unit: \"months\", scale: 1 },\n months: { unit: \"months\", scale: 1 },\n year: { unit: \"years\", scale: 1 },\n years: { unit: \"years\", scale: 1 },\n};\n\nexport function resolveTimeUnit(input: string): NormalisedTimeUnit {\n const key = input.trim().toLowerCase();\n const resolved = UNIT_ALIASES[key];\n if (!resolved) {\n throw new AutomationError(\n `Unsupported time unit '${input}'. Expected one of ${Object.keys(UNIT_ALIASES)\n .sort()\n .join(\", \")}.`\n );\n }\n return resolved;\n}\n","const SEPARATORS = /[\\s_-]+/g;\n\nfunction capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1);\n}\n\nfunction splitWords(phrase: string): string[] {\n return phrase\n .trim()\n .split(SEPARATORS)\n .filter(Boolean)\n .map((word) => word.toLowerCase());\n}\n\nexport function toCamelKey(phrase: string): string {\n const words = splitWords(phrase);\n if (words.length === 0) {\n return \"\";\n }\n const [first, ...rest] = words;\n return first + rest.map(capitalize).join(\"\");\n}\n\nexport function normalizeToken(phrase: string): string {\n return splitWords(phrase).join(\"\");\n}\n","import type { DateFactory, DateShortcut } from \"./date-factory.js\";\nimport type { StandardTimeUnit } from \"./time-units.js\";\n\nexport interface FormattedDateFactoryOptions {\n formatter?: (date: Date) => string;\n}\n\nexport class FormattedDateFactory {\n private readonly format: (date: Date) => string;\n\n constructor(\n private readonly dateFactory: DateFactory,\n options: FormattedDateFactoryOptions = {}\n ) {\n this.format =\n options.formatter ?? ((date) => date.toISOString().substring(0, 10));\n }\n\n make(offset: number, unit: StandardTimeUnit | string): string {\n return this.format(this.dateFactory.make(offset, unit));\n }\n\n fromPhrase(phrase: unknown): string {\n return this.format(this.dateFactory.fromPhrase(phrase));\n }\n\n get beforeYesterday(): string {\n return this.fromShortcut(\"beforeYesterday\");\n }\n\n get yesterday(): string {\n return this.fromShortcut(\"yesterday\");\n }\n\n get today(): string {\n return this.fromShortcut(\"today\");\n }\n\n get tomorrow(): string {\n return this.fromShortcut(\"tomorrow\");\n }\n\n get afterTomorrow(): string {\n return this.fromShortcut(\"afterTomorrow\");\n }\n\n get midnight(): string {\n return this.fromShortcut(\"midnight\");\n }\n\n get lastWeek(): string {\n return this.fromShortcut(\"lastWeek\");\n }\n\n get nextWeek(): string {\n return this.fromShortcut(\"nextWeek\");\n }\n\n get lastFortnight(): string {\n return this.fromShortcut(\"lastFortnight\");\n }\n\n get nextFortnight(): string {\n return this.fromShortcut(\"nextFortnight\");\n }\n\n private fromShortcut(shortcut: DateShortcut): string {\n return this.format(this.dateFactory.find(shortcut));\n }\n}\n","import type { DateFactory, DateShortcut } from \"./date-factory.js\";\nimport type { StandardTimeUnit } from \"./time-units.js\";\n\nexport interface IsoDateFactoryOptions {\n serializer?: (date: Date) => string;\n}\n\nexport class IsoDateFactory {\n private readonly serialise: (date: Date) => string;\n\n constructor(\n private readonly dateFactory: DateFactory,\n options: IsoDateFactoryOptions = {}\n ) {\n this.serialise = options.serializer ?? ((date) => date.toISOString());\n }\n\n make(offset: number, unit: StandardTimeUnit | string): string {\n return this.serialise(this.dateFactory.make(offset, unit));\n }\n\n fromPhrase(phrase: unknown): string {\n return this.serialise(this.dateFactory.fromPhrase(phrase));\n }\n\n get beforeYesterday(): string {\n return this.fromShortcut(\"beforeYesterday\");\n }\n\n get yesterday(): string {\n return this.fromShortcut(\"yesterday\");\n }\n\n get today(): string {\n return this.fromShortcut(\"today\");\n }\n\n get tomorrow(): string {\n return this.fromShortcut(\"tomorrow\");\n }\n\n get afterTomorrow(): string {\n return this.fromShortcut(\"afterTomorrow\");\n }\n\n get midnight(): string {\n return this.fromShortcut(\"midnight\");\n }\n\n get lastWeek(): string {\n return this.fromShortcut(\"lastWeek\");\n }\n\n get nextWeek(): string {\n return this.fromShortcut(\"nextWeek\");\n }\n\n get lastFortnight(): string {\n return this.fromShortcut(\"lastFortnight\");\n }\n\n get nextFortnight(): string {\n return this.fromShortcut(\"nextFortnight\");\n }\n\n private fromShortcut(shortcut: DateShortcut): string {\n return this.serialise(this.dateFactory.find(shortcut));\n }\n}\n","import { DateFactory, type DateFactoryOptions, type DateShortcut } from \"./date-factory.js\";\nimport { FormattedDateFactory } from \"./formatted-date-factory.js\";\nimport { IsoDateFactory } from \"./iso-date-factory.js\";\nimport type { StandardTimeUnit } from \"./time-units.js\";\n\nexport interface DatesOptions extends DateFactoryOptions {\n factory?: DateFactory;\n}\n\nexport interface DatesObject {\n readonly iso: IsoDateFactory;\n readonly fmt: FormattedDateFactory;\n readonly now: Date;\n readonly beforeYesterday: Date;\n readonly yesterday: Date;\n readonly today: Date;\n readonly tomorrow: Date;\n readonly afterTomorrow: Date;\n readonly midnight: Date;\n readonly lastWeek: Date;\n readonly nextWeek: Date;\n readonly lastFortnight: Date;\n readonly nextFortnight: Date;\n fromPhrase(phrase: unknown): Date;\n fromPhraseSafe(phrase: unknown): Date;\n make(offset: number, unit: StandardTimeUnit | string): Date;\n}\n\nclass DatesFacade implements DatesObject {\n readonly iso: IsoDateFactory;\n readonly fmt: FormattedDateFactory;\n\n constructor(private readonly factory: DateFactory) {\n this.iso = new IsoDateFactory(factory);\n this.fmt = new FormattedDateFactory(factory);\n }\n\n get now(): Date {\n return this.fromShortcut(\"now\");\n }\n\n get beforeYesterday(): Date {\n return this.fromShortcut(\"beforeYesterday\");\n }\n\n get yesterday(): Date {\n return this.fromShortcut(\"yesterday\");\n }\n\n get today(): Date {\n return this.fromShortcut(\"today\");\n }\n\n get tomorrow(): Date {\n return this.fromShortcut(\"tomorrow\");\n }\n\n get afterTomorrow(): Date {\n return this.fromShortcut(\"afterTomorrow\");\n }\n\n get midnight(): Date {\n return this.fromShortcut(\"midnight\");\n }\n\n get lastWeek(): Date {\n return this.fromShortcut(\"lastWeek\");\n }\n\n get nextWeek(): Date {\n return this.fromShortcut(\"nextWeek\");\n }\n\n get lastFortnight(): Date {\n return this.fromShortcut(\"lastFortnight\");\n }\n\n get nextFortnight(): Date {\n return this.fromShortcut(\"nextFortnight\");\n }\n\n fromPhrase(phrase: unknown): Date {\n return this.factory.fromPhrase(phrase);\n }\n\n fromPhraseSafe(phrase: unknown): Date {\n return this.factory.fromPhraseSafe(phrase);\n }\n\n make(offset: number, unit: StandardTimeUnit | string): Date {\n return this.factory.make(offset, unit);\n }\n\n private fromShortcut(shortcut: DateShortcut): Date {\n return this.factory.find(shortcut);\n }\n}\n\nexport function createDates(options: DatesOptions = {}): DatesObject {\n const factory = options.factory ?? new DateFactory(options);\n return new DatesFacade(factory);\n}\n\nexport const Dates = createDates();\nexport type { DateFactoryOptions };\n","import { AutomationError } from \"@autometa/errors\";\nimport { assertKey } from \"@autometa/asserters\";\nimport { normalizeToken } from \"../shared/phrases.js\";\n\nexport type TimeDiffFn = (start: Date, end: Date) => number;\n\nconst SUPPORTED_METHODS = [\n \"minutes\",\n \"seconds\",\n \"millis\",\n \"days\",\n \"hours\",\n \"weeks\",\n] as const;\ntype MethodName = (typeof SUPPORTED_METHODS)[number];\n\nfunction toTime(date: Date): number {\n return new Date(date).getTime();\n}\n\nexport class TimeDiff {\n minutes(start: Date, end: Date): number {\n return this.millis(start, end) / 60_000;\n }\n\n seconds(start: Date, end: Date): number {\n return this.millis(start, end) / 1_000;\n }\n\n millis(start: Date, end: Date): number {\n const distance = Math.abs(toTime(end) - toTime(start));\n return Math.round(distance);\n }\n\n days(start: Date, end: Date): number {\n return this.millis(start, end) / 86_400_000;\n }\n\n hours(start: Date, end: Date): number {\n return this.millis(start, end) / 3_600_000;\n }\n\n weeks(start: Date, end: Date): number {\n return this.millis(start, end) / 604_800_000;\n }\n\n fromPhrase(phrase: unknown): TimeDiffFn {\n if (typeof phrase !== \"string\") {\n throw new AutomationError(\n `TimeDiff.fromPhrase expects a string, received '${typeof phrase}'.`\n );\n }\n\n const key = normalizeToken(phrase);\n if (!this.hasMethod(key)) {\n throw new AutomationError(\n `Unsupported diff unit '${phrase}'. Expected one of ${this.supportedMethods().join(\", \")}.`\n );\n }\n\n assertKey(this, key as MethodName, \"TimeDiff.fromPhrase\");\n const method = this[key as MethodName];\n if (typeof method !== \"function\") {\n throw new AutomationError(`Diff method '${key}' is not callable.`);\n }\n return (method as TimeDiffFn).bind(this);\n }\n\n private hasMethod(name: string): boolean {\n return SUPPORTED_METHODS.includes(name as MethodName);\n }\n\n private supportedMethods(): MethodName[] {\n return [...SUPPORTED_METHODS];\n }\n}\n","import { TimeDiff, type TimeDiffFn } from \"./time-diff.js\";\n\nexport interface TimeFactory {\n readonly diff: TimeDiff;\n}\n\nclass TimeFacade implements TimeFactory {\n readonly diff: TimeDiff;\n\n constructor(diff: TimeDiff) {\n this.diff = diff;\n }\n}\n\nexport function createTime(): TimeFactory {\n return new TimeFacade(new TimeDiff());\n}\n\nexport const Time = createTime();\nexport { TimeDiff, type TimeDiffFn };\n"]}
@@ -0,0 +1,2 @@
1
+ export declare function toCamelKey(phrase: string): string;
2
+ export declare function normalizeToken(phrase: string): string;
@@ -0,0 +1,12 @@
1
+ export type TimeDiffFn = (start: Date, end: Date) => number;
2
+ export declare class TimeDiff {
3
+ minutes(start: Date, end: Date): number;
4
+ seconds(start: Date, end: Date): number;
5
+ millis(start: Date, end: Date): number;
6
+ days(start: Date, end: Date): number;
7
+ hours(start: Date, end: Date): number;
8
+ weeks(start: Date, end: Date): number;
9
+ fromPhrase(phrase: unknown): TimeDiffFn;
10
+ private hasMethod;
11
+ private supportedMethods;
12
+ }
@@ -0,0 +1,7 @@
1
+ import { TimeDiff, type TimeDiffFn } from "./time-diff.js";
2
+ export interface TimeFactory {
3
+ readonly diff: TimeDiff;
4
+ }
5
+ export declare function createTime(): TimeFactory;
6
+ export declare const Time: TimeFactory;
7
+ export { TimeDiff, type TimeDiffFn };
package/package.json CHANGED
@@ -1,49 +1,54 @@
1
1
  {
2
2
  "name": "@autometa/datetime",
3
- "version": "0.1.15",
4
- "description": "Date and Time utilities for Autometa",
3
+ "version": "1.0.0-rc.0",
4
+ "description": "Date and time utilities for Autometa tests",
5
5
  "type": "module",
6
- "main": "dist/index.js",
7
- "module": "dist/esm/index.js",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.js",
8
8
  "types": "dist/index.d.ts",
9
+ "files": [
10
+ "dist"
11
+ ],
9
12
  "exports": {
10
- "import": "./dist/esm/index.js",
11
- "require": "./dist/index.js",
12
- "default": "./dist/esm/index.js",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs",
15
+ "default": "./dist/index.js",
13
16
  "types": "./dist/index.d.ts"
14
17
  },
15
18
  "license": "MIT",
16
19
  "devDependencies": {
17
20
  "@types/node": "^18.11.18",
18
- "@types/uuid": "^9.0.5",
19
21
  "@typescript-eslint/eslint-plugin": "^5.54.1",
20
22
  "@typescript-eslint/parser": "^5.54.1",
21
- "@vitest/coverage-istanbul": "^0.31.0",
22
23
  "eslint": "^8.37.0",
23
- "eslint-config-custom": "0.6.0",
24
24
  "eslint-config-prettier": "^8.3.0",
25
- "istanbul": "^0.4.5",
26
25
  "rimraf": "^4.1.2",
27
- "tsconfig": " *",
28
26
  "tsup": "^7.2.0",
29
27
  "typescript": "^4.9.5",
30
- "vitest": "0.34.6"
28
+ "vitest": "1.4.0",
29
+ "eslint-config-custom": "0.6.0",
30
+ "tsup-config": "0.1.0",
31
+ "tsconfig": "0.7.0"
31
32
  },
32
33
  "dependencies": {
33
- "@autometa/asserters": "^0.1.7",
34
- "@autometa/errors": "^0.2.1",
35
- "@autometa/phrases": "^0.1.11",
36
- "iso-datestring-validator": "^2.2.2"
34
+ "iso-datestring-validator": "^2.2.2",
35
+ "@autometa/errors": "^1.0.0-rc.0",
36
+ "@autometa/asserters": "^1.0.0-rc.0"
37
37
  },
38
38
  "scripts": {
39
- "test": "vitest run --passWithNoTests",
39
+ "type-check": "tsc --noEmit -p tsconfig.dev.json",
40
+ "type-check:watch": "tsc --noEmit --watch -p tsconfig.dev.json",
41
+ "build": "tsup && pnpm run build:types",
42
+ "build:types": "rimraf tsconfig.types.tsbuildinfo && tsc --build tsconfig.types.json",
43
+ "build:watch": "tsup --watch",
44
+ "dev": "tsup --watch",
45
+ "test": "vitest run --coverage",
46
+ "test:watch": "vitest --coverage --watch",
47
+ "test:ui": "vitest --ui --coverage",
40
48
  "coverage": "vitest run --coverage",
41
- "prettify": "prettier --config .prettierrc 'src/**/*.ts' --write",
42
49
  "lint": "eslint . --max-warnings 0",
43
50
  "lint:fix": "eslint . --fix",
44
- "clean": "rimraf dist",
45
- "build": "tsup",
46
- "build:watch": "tsup --watch"
47
- },
48
- "readme": "# Introduction\n\nThere's nothing here yet"
51
+ "prettify": "prettier --config .prettierrc 'src/**/*.ts' --write",
52
+ "clean": "rimraf dist"
53
+ }
49
54
  }
package/.eslintignore DELETED
@@ -1,3 +0,0 @@
1
- /dist
2
- /out
3
- node_modules
package/.eslintrc.cjs DELETED
@@ -1,4 +0,0 @@
1
- module.exports = {
2
- root: true,
3
- extends: ["custom"],
4
- };
package/CHANGELOG.md DELETED
@@ -1,132 +0,0 @@
1
- # @autometa/datetime
2
-
3
- ## 0.1.15
4
-
5
- ### Patch Changes
6
-
7
- - Updated dependencies [3493bb6]
8
- - @autometa/errors@0.2.1
9
- - @autometa/asserters@0.1.7
10
- - @autometa/phrases@0.1.11
11
-
12
- ## 0.1.14
13
-
14
- ### Patch Changes
15
-
16
- - Updated dependencies [0c070cb]
17
- - @autometa/asserters@0.1.6
18
- - @autometa/phrases@0.1.10
19
-
20
- ## 0.1.13
21
-
22
- ### Patch Changes
23
-
24
- - 6fe8f64: docs: improved typedocs on public interface
25
-
26
- ## 0.1.12
27
-
28
- ### Patch Changes
29
-
30
- - Updated dependencies [b5ce008]
31
- - @autometa/errors@0.2.0
32
- - @autometa/asserters@0.1.5
33
- - @autometa/phrases@0.1.9
34
-
35
- ## 0.1.11
36
-
37
- ### Patch Changes
38
-
39
- - 04ed85d: feat: added HTP client based on axios
40
- - Updated dependencies [04ed85d]
41
- - @autometa/asserters@0.1.4
42
- - @autometa/phrases@0.1.8
43
- - @autometa/errors@0.1.4
44
-
45
- ## 0.1.10
46
-
47
- ### Patch Changes
48
-
49
- - 6dd05a6: Fix: Missing common properties on Dates.fmt
50
-
51
- ## 0.1.9
52
-
53
- ### Patch Changes
54
-
55
- - Release Bump
56
- - Updated dependencies
57
- - @autometa/phrases@0.1.7
58
-
59
- ## 0.1.8
60
-
61
- ### Patch Changes
62
-
63
- - Updated dependencies [85050386]
64
- - @autometa/phrases@0.1.6
65
-
66
- ## 0.1.7
67
-
68
- ### Patch Changes
69
-
70
- - 53f958e1: Fix: steps not executing onStepEnded event when an error was thrown
71
- - Updated dependencies [53f958e1]
72
- - @autometa/asserters@0.1.3
73
- - @autometa/errors@0.1.3
74
- - @autometa/phrases@0.1.5
75
-
76
- ## 0.1.6
77
-
78
- ### Patch Changes
79
-
80
- - Updated dependencies [12bd4b1e]
81
- - @autometa/errors@0.1.2
82
- - @autometa/asserters@0.1.2
83
- - @autometa/phrases@0.1.4
84
-
85
- ## 0.1.5
86
-
87
- ### Patch Changes
88
-
89
- - e243e8b4: fix: globally scoped hooks not executing
90
-
91
- ## 0.1.4
92
-
93
- ### Patch Changes
94
-
95
- - Updated dependencies [0cc7f6aa]
96
- - @autometa/phrases@0.1.3
97
-
98
- ## 0.1.3
99
-
100
- ### Patch Changes
101
-
102
- - Updated dependencies [e8f02f3a]
103
- - @autometa/phrases@0.1.2
104
- - @autometa/errors@0.1.1
105
- - @autometa/asserters@0.1.1
106
-
107
- ## 0.1.2
108
-
109
- ### Patch Changes
110
-
111
- - a50e99e: Fixed Dates properties returning undefine
112
-
113
- ## 0.1.1
114
-
115
- ### Patch Changes
116
-
117
- - bf23fc4: Date properties returning functions instead of Dates
118
- - Updated dependencies [bf23fc4]
119
- - @autometa/phrases@0.1.1
120
-
121
- ## 0.1.0
122
-
123
- ### Minor Changes
124
-
125
- - 554b77e: Releasing packages
126
-
127
- ### Patch Changes
128
-
129
- - Updated dependencies [554b77e]
130
- - @autometa/asserters@0.1.0
131
- - @autometa/errors@0.1.0
132
- - @autometa/phrases@0.1.0