UNPKG

@microsoft/recognizers-text-data-types-timex-expression

Version:

Support for TIMEX-based representation of datetime entities

1,564 lines (1,354 loc) 70.8 kB
// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. class Time$2 { constructor(hour, minute, second) { if (arguments.length === 1) { this.hour = Math.floor(hour / 3600000); this.minute = Math.floor((hour - (this.hour * 3600000)) / 60000); this.second = (hour - (this.hour * 3600000) - (this.minute * 60000)) / 1000; } else { this.hour = hour; this.minute = minute; this.second = second; } } getTime () { return (this.second * 1000) + (this.minute * 60000) + (this.hour * 3600000); } } var Time_1 = Time$2; var time = { Time: Time_1 }; var time$1 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': time, __moduleExports: time, Time: Time_1 }); // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. const value = function (s) { return s; }; const isTrue = function () { return true; }; const zero = function () { return 0; }; const timexRegex = { date: [ // date { regex: /^(\d\d\d\d)-(\d\d)-(\d\d)$/, props: { year: Number, month: Number, dayOfMonth: Number } }, { regex: /^XXXX-WXX-(\d)$/, props: { dayOfWeek: Number } }, { regex: /^XXXX-(\d\d)-(\d\d)$/, props: { month: Number, dayOfMonth: Number } }, // daterange { regex: /^(\d\d\d\d)$/, props: { year: Number } }, { regex: /^(\d\d\d\d)-(\d\d)$/, props: { year: Number, month: Number } }, { regex: /^(SP|SU|FA|WI)$/, props: { season: value } }, { regex: /^(\d\d\d\d)-(SP|SU|FA|WI)$/, props: { year: Number, season: value } }, { regex: /^(\d\d\d\d)-W(\d\d)$/, props: { year: Number, weekOfYear: Number } }, { regex: /^(\d\d\d\d)-W(\d\d)-WE$/, props: { year: Number, weekOfYear: Number, weekend: isTrue } }, { regex: /^XXXX-(\d\d)$/, props: { month: Number } }, { regex: /^XXXX-(\d\d)-W(\d\d)$/, props: { month: Number, weekOfMonth: Number } }, { regex: /^XXXX-(\d\d)-WXX-(\d)-(\d)$/, props: { month: Number, weekOfMonth: Number, dayOfWeek: Number } } ], time: [ // time { regex: /^T(\d\d)$/, props: { hour: Number, minute: zero, second: zero } }, { regex: /^T(\d\d):(\d\d)$/, props: { hour: Number, minute: Number, second: zero } }, { regex: /^T(\d\d):(\d\d):(\d\d)$/, props: { hour: Number, minute: Number, second: Number } }, // timerange { regex: /^T(DT|NI|MO|AF|EV)$/, props: { partOfDay: value } } ], period: [ { regex: /^P(\d*\.?\d+)(Y|M|W|D)$/, props: { amount: Number, dateUnit: value } }, { regex: /^PT(\d*\.?\d+)(H|M|S)$/, props: { amount: Number, timeUnit: value } } ] }; const tryExtract = function (entry, timex, result) { const regexResult = timex.match(entry.regex); if (!regexResult) { return false; } let index = 1; for (const name in entry.props) { const val = regexResult[index++]; result[name] = entry.props[name](val); } return true; }; const extract = function (name, timex, result) { for (const entry of timexRegex[name]) { if (tryExtract(entry, timex, result)) { return true; } } return false; }; var extract_1 = extract; var timexRegex_1 = { extract: extract_1 }; var timexRegex$1 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': timexRegex_1, __moduleExports: timexRegex_1, extract: extract_1 }); var timexregex = ( timexRegex$1 && timexRegex_1 ) || timexRegex$1; // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. const parseString = function (timex, obj) { // a reference to the present if (timex === 'PRESENT_REF') { obj.now = true; } // duration else if (timex.startsWith('P')) { extractDuration(timex, obj); } // range indicated with start and end dates and a duration else if (timex.startsWith('(') && timex.endsWith(')')) { extractStartEndRange(timex, obj); } // date and time and their respective ranges else { extractDateTime(timex, obj); } }; const extractDuration = function (s, obj) { const extracted = {}; timexregex.extract('period', s, extracted); if (extracted.dateUnit) { obj[{ Y: 'years', M: 'months', W: 'weeks', D: 'days' }[extracted.dateUnit]] = extracted.amount; } else if (extracted.timeUnit) { obj[{ H: 'hours', M: 'minutes', S: 'seconds' }[extracted.timeUnit]] = extracted.amount; } }; const extractStartEndRange = function (s, obj) { const parts = s.substring(1, s.length - 1).split(','); if (parts.length === 3) { extractDateTime(parts[0], obj); extractDuration(parts[2], obj); } }; const extractDateTime = function (s, obj) { const indexOfT = s.indexOf('T'); if (indexOfT === -1) { timexregex.extract('date', s, obj); } else { timexregex.extract('date', s.substr(0, indexOfT), obj); timexregex.extract('time', s.substr(indexOfT), obj); } }; const fromObject = function (source, obj) { Object.assign(obj, source); if ('hour' in obj) { if (!('minute' in obj)) { obj.minute = 0; } if (!('second' in obj)) { obj.second = 0; } } }; var timexParsing$1 = { parseString: parseString, fromObject: fromObject }; var timexParsing_1 = timexParsing$1.parseString; var timexParsing_2 = timexParsing$1.fromObject; var timexParsing$2 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': timexParsing$1, __moduleExports: timexParsing$1, parseString: timexParsing_1, fromObject: timexParsing_2 }); // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. const isPresent = function (obj) { return obj.now === true; }; const isDuration = function (obj) { return 'years' in obj || 'months' in obj || 'weeks' in obj || 'days' in obj || 'hours' in obj || 'minutes' in obj || 'seconds' in obj; }; const isTime = function (obj) { return 'hour' in obj && 'minute' in obj && 'second' in obj; }; const isDate = function (obj) { return ('month' in obj && 'dayOfMonth' in obj) || 'dayOfWeek' in obj; }; const isTimeRange = function (obj) { return 'partOfDay' in obj; }; const isDateRange = function (obj) { return ('year' in obj && !('dayOfMonth' in obj)) || ('year' in obj && 'month' in obj && !('dayOfMonth' in obj)) || ('month' in obj && !('dayOfMonth' in obj)) || 'season' in obj || 'weekOfYear' in obj || 'weekOfMonth' in obj; }; const isDefinite = function (obj) { return 'year' in obj && 'month' in obj && 'dayOfMonth' in obj; }; const infer = function (obj) { const types = new Set(); if (isPresent(obj)) { types.add('present'); } if (isDefinite(obj)) { types.add('definite'); } if (isDate(obj)) { types.add('date'); } if (isDateRange(obj)) { types.add('daterange'); } if (isDuration(obj)) { types.add('duration'); } if (isTime(obj)) { types.add('time'); } if (isTimeRange(obj)) { types.add('timerange'); } if (types.has('present')) { types.add('date'); types.add('time'); } if (types.has('time') && types.has('duration')) { types.add('timerange'); } if (types.has('date') && types.has('time')) { types.add('datetime'); } if (types.has('date') && types.has('duration')) { types.add('daterange'); } if (types.has('datetime') && types.has('duration')) { types.add('datetimerange'); } if (types.has('date') && types.has('timerange')) { types.add('datetimerange'); } return types; }; var infer_1 = infer; var timexInference$1 = { infer: infer_1 }; var timexInference$2 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': timexInference$1, __moduleExports: timexInference$1, infer: infer_1 }); // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. const cloneDate = function (date) { const result = new Date(); result.setTime(date.getTime()); return result; }; const tomorrow$1 = function (date) { const result = cloneDate(date); result.setDate(result.getDate() + 1); return result; }; const yesterday$1 = function (date) { const result = cloneDate(date); result.setDate(result.getDate() - 1); return result; }; const datePartEquals = function (dateX, dateY) { return (dateX.getFullYear() === dateY.getFullYear()) && (dateX.getMonth() === dateY.getMonth()) && (dateX.getDate() === dateY.getDate()); }; const isDateInWeek = function (date, startOfWeek) { let d = cloneDate(startOfWeek); for (let i=0; i<7; i++) { if (datePartEquals(date, d)) { return true; } d = tomorrow$1(d); } return false; }; const isThisWeek = function (date, referenceDate) { const startOfThisWeek = cloneDate(referenceDate); startOfThisWeek.setDate(startOfThisWeek.getDate() - startOfThisWeek.getDay()); return isDateInWeek(date, startOfThisWeek); }; const isNextWeek = function (date, referenceDate) { const startOfNextWeek = cloneDate(referenceDate); startOfNextWeek.setDate(startOfNextWeek.getDate() + (7 - startOfNextWeek.getDay())); return isDateInWeek(date, startOfNextWeek); }; const isLastWeek = function (date, referenceDate) { const startOfLastWeek = cloneDate(referenceDate); startOfLastWeek.setDate(startOfLastWeek.getDate() - (7 + startOfLastWeek.getDay())); return isDateInWeek(date, startOfLastWeek); }; const weekOfYear = function (date) { const ds = new Date(date.getFullYear(), 0); const de = new Date(date.getFullYear(), date.getMonth(), date.getDate()); let weeks = 1; while (ds.getTime() < de.getTime()) { const jsDayOfWeek = ds.getDay(); const isoDayOfWeek = jsDayOfWeek == 0 ? 7 : jsDayOfWeek; if (isoDayOfWeek === 7) { weeks++; } ds.setDate(ds.getDate() + 1); } return weeks; }; const fixedFormatNumber$2 = function (n, size) { const s = n.toString(); let zeros = ''; const np = size - s.length; for (let i=0; i<np; i++) { zeros += '0'; } return `${zeros}${s}`; }; const dateOfLastDay$1 = function (day, referenceDate) { const result = cloneDate(referenceDate); result.setDate(result.getDate() - 1); while (result.getDay() !== day) { result.setDate(result.getDate() - 1); } return result; }; const dateOfNextDay$1 = function (day, referenceDate) { const result = cloneDate(referenceDate); do { result.setDate(result.getDate() + 1); } while (result.getDay() !== day); return result; }; const datesMatchingDay = function (day, start, end) { const result = []; const d = cloneDate(start); while (!datePartEquals(d, end)) { if (d.getDay() === day) { result.push(cloneDate(d)); } d.setDate(d.getDate() + 1); } return result; }; var timexDateHelpers = { tomorrow: tomorrow$1, yesterday: yesterday$1, datePartEquals: datePartEquals, isThisWeek: isThisWeek, isNextWeek: isNextWeek, isLastWeek: isLastWeek, weekOfYear: weekOfYear, fixedFormatNumber: fixedFormatNumber$2, dateOfLastDay: dateOfLastDay$1, dateOfNextDay: dateOfNextDay$1, datesMatchingDay: datesMatchingDay }; var timexDateHelpers_1 = timexDateHelpers.tomorrow; var timexDateHelpers_2 = timexDateHelpers.yesterday; var timexDateHelpers_3 = timexDateHelpers.datePartEquals; var timexDateHelpers_4 = timexDateHelpers.isThisWeek; var timexDateHelpers_5 = timexDateHelpers.isNextWeek; var timexDateHelpers_6 = timexDateHelpers.isLastWeek; var timexDateHelpers_7 = timexDateHelpers.weekOfYear; var timexDateHelpers_8 = timexDateHelpers.fixedFormatNumber; var timexDateHelpers_9 = timexDateHelpers.dateOfLastDay; var timexDateHelpers_10 = timexDateHelpers.dateOfNextDay; var timexDateHelpers_11 = timexDateHelpers.datesMatchingDay; var timexDateHelpers$1 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': timexDateHelpers, __moduleExports: timexDateHelpers, tomorrow: timexDateHelpers_1, yesterday: timexDateHelpers_2, datePartEquals: timexDateHelpers_3, isThisWeek: timexDateHelpers_4, isNextWeek: timexDateHelpers_5, isLastWeek: timexDateHelpers_6, weekOfYear: timexDateHelpers_7, fixedFormatNumber: timexDateHelpers_8, dateOfLastDay: timexDateHelpers_9, dateOfNextDay: timexDateHelpers_10, datesMatchingDay: timexDateHelpers_11 }); var require$$0$1 = ( time$1 && time ) || time$1; var timexInference = ( timexInference$2 && timexInference$1 ) || timexInference$2; // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. const Time$1 = require$$0$1.Time; const cloneDateTime = function (timex) { const result = Object.assign({}, timex); delete result.years; delete result.months; delete result.weeks; delete result.days; delete result.hours; delete result.minutes; delete result.seconds; return result; }; const cloneDuration = function (timex) { const result = Object.assign({}, timex); delete result.year; delete result.month; delete result.dayOfMonth; delete result.dayOfWeek; delete result.weekOfYear; delete result.weekOfMonth; delete result.season; delete result.hour; delete result.minute; delete result.second; delete result.weekend; delete result.partOfDay; return result; }; const timexDateAdd = function (start, duration) { if ('dayOfWeek' in start) { const end = Object.assign({}, start); if ('days' in duration) { end.dayOfWeek += duration.days; } return end; } if ('month' in start && 'dayOfMonth' in start) { var durationDays = duration.days; if (durationDays === undefined && duration.weeks !== undefined) { durationDays = 7 * duration.weeks; } if (durationDays !== undefined) { if ('year' in start) { const d = new Date(start.year, start.month - 1, start.dayOfMonth, 0, 0, 0); for (let i=0; i < durationDays; i++) { d.setDate(d.getDate() + 1); } return { year: d.getFullYear(), month: d.getMonth() + 1, dayOfMonth: d.getDate() }; } else { const d = new Date(2001, start.month - 1, start.dayOfMonth, 0, 0, 0); for (let i=0; i < durationDays; i++) { d.setDate(d.getDate() + 1); } return { month: d.getMonth() + 1, dayOfMonth: d.getDate() }; } } if ('years' in duration) { if ('year' in start) { return { year: start.year + duration.years, month: start.month, dayOfMonth: start.dayOfMonth }; } } if ('months' in duration) { if ('month' in start) { return { year: start.year, month: start.month + duration.months, dayOfMonth: start.dayOfMonth }; } } } return start; }; const timexTimeAdd = function (start, duration) { if ('hours' in duration) { const result = Object.assign({}, start); result.hour += duration.hours; if (result.hour > 23) { const days = Math.floor(result.hour / 24); const hour = result.hour % 24; result.hour = hour; if ('year' in result && 'month' in result && 'dayOfMonth' in result) { const d = new Date(result.year, result.month - 1, result.dayOfMonth, 0, 0, 0); for (let i=0; i<days; i++) { d.setDate(d.getDate() + 1); } result.year = d.getFullYear(); result.month = d.getMonth() + 1; result.dayOfMonth = d.getDate(); return result; } if ('dayOfWeek' in result) { result.dayOfWeek += days; return result; } } return result; } if ('minutes' in duration) { const result = Object.assign({}, start); result.minute += duration.minutes; if (result.minute > 59) { result.hour++; result.minute = 0; } return result; } return start; }; const timexDateTimeAdd = function (start, duration) { return timexTimeAdd(timexDateAdd(start, duration), duration); }; const expandDateTimeRange = function (timex) { const types = ('types' in timex) ? timex.types : timexInference.infer(timex); if (types.has('duration')) { const start = cloneDateTime(timex); const duration = cloneDuration(timex); return { start: start, end: timexDateTimeAdd(start, duration), duration: duration }; } else { if ('year' in timex) { const range = { start: { year: timex.year }, end: {} }; if ('month' in timex) { range.start.month = timex.month; range.start.dayOfMonth = 1; range.end.year = timex.year; range.end.month = timex.month + 1; range.end.dayOfMonth = 1; } else { range.start.month = 1; range.start.dayOfMonth = 1; range.end.year = timex.year + 1; range.end.month = 1; range.end.dayOfMonth = 1; } return range; } } return { start: {}, end: {} }; }; const timeAdd = function (start, duration) { const hours = duration.hours || 0; const minutes = duration.minutes || 0; const seconds = duration.seconds || 0; return { hour: start.hour + hours, minute: start.minute + minutes, second: start.second + seconds }; }; const expandTimeRange = function (timex) { if (!timex.types.has('timerange')) { throw new exception('argument must be a timerange'); } if (timex.partOfDay !== undefined) { switch (timex.partOfDay) { case 'DT': timex = { hour: 8, minute: 0, second: 0, hours: 10, minutes: 0, seconds: 0 }; break; case 'MO': timex = { hour: 8, minute: 0, second: 0, hours: 4, minutes: 0, seconds: 0 }; break; case 'AF': timex = { hour: 12, minute: 0, second: 0, hours: 4, minutes: 0, seconds: 0 }; break; case 'EV': timex = { hour: 16, minute: 0, second: 0, hours: 4, minutes: 0, seconds: 0 }; break; case 'NI': timex = { hour: 20, minute: 0, second: 0, hours: 4, minutes: 0, seconds: 0 }; break; default: throw new exception('unrecognized part of day timerange'); } } const start = { hour: timex.hour, minute: timex.minute, second: timex.second }; const duration = cloneDuration(timex); return { start: start, end: timeAdd(start, duration), duration: duration }; }; const dateFromTimex = function (timex) { const year = 'year' in timex ? timex.year : 2001; const month = 'month' in timex ? timex.month - 1 : 0; const date = 'dayOfMonth' in timex ? timex.dayOfMonth : 1; const hour = 'hour' in timex ? timex.hour : 0; const minute = 'minute' in timex ? timex.minute : 0; const second = 'second' in timex ? timex.second : 0; return new Date(year, month, date, hour, minute, second); }; const timeFromTimex = function (timex) { const hour = timex.hour || 0; const minute = timex.minute || 0; const second = timex.second || 0; return new Time$1(hour, minute, second); }; const dateRangeFromTimex = function (timex) { const expanded = expandDateTimeRange(timex); return { start: dateFromTimex(expanded.start), end: dateFromTimex(expanded.end) }; }; const timeRangeFromTimex = function (timex) { const expanded = expandTimeRange(timex); return { start: timeFromTimex(expanded.start), end: timeFromTimex(expanded.end) }; }; var timexHelpers$1 = { expandDateTimeRange: expandDateTimeRange, expandTimeRange: expandTimeRange, dateFromTimex: dateFromTimex, timeFromTimex: timeFromTimex, dateRangeFromTimex: dateRangeFromTimex, timeRangeFromTimex: timeRangeFromTimex, timexTimeAdd: timexTimeAdd, timexDateTimeAdd: timexDateTimeAdd }; var timexHelpers_1 = timexHelpers$1.expandDateTimeRange; var timexHelpers_2 = timexHelpers$1.expandTimeRange; var timexHelpers_3 = timexHelpers$1.dateFromTimex; var timexHelpers_4 = timexHelpers$1.timeFromTimex; var timexHelpers_5 = timexHelpers$1.dateRangeFromTimex; var timexHelpers_6 = timexHelpers$1.timeRangeFromTimex; var timexHelpers_7 = timexHelpers$1.timexTimeAdd; var timexHelpers_8 = timexHelpers$1.timexDateTimeAdd; var timexHelpers$2 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': timexHelpers$1, __moduleExports: timexHelpers$1, expandDateTimeRange: timexHelpers_1, expandTimeRange: timexHelpers_2, dateFromTimex: timexHelpers_3, timeFromTimex: timexHelpers_4, dateRangeFromTimex: timexHelpers_5, timeRangeFromTimex: timexHelpers_6, timexTimeAdd: timexHelpers_7, timexDateTimeAdd: timexHelpers_8 }); var require$$1$1 = ( timexDateHelpers$1 && timexDateHelpers ) || timexDateHelpers$1; var timexHelpers = ( timexHelpers$2 && timexHelpers$1 ) || timexHelpers$2; // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. const fixedFormatNumber$1 = require$$1$1.fixedFormatNumber; const formatDuration = function (timex) { if ('years' in timex) { return `P${timex.years}Y`; } if ('months' in timex) { return `P${timex.months}M`; } if ('weeks' in timex) { return `P${timex.weeks}W`; } if ('days' in timex) { return `P${timex.days}D`; } if ('hours' in timex) { return `PT${timex.hours}H`; } if ('minutes' in timex) { return `PT${timex.minutes}M`; } if ('seconds' in timex) { return `PT${timex.seconds}S`; } return ''; }; const formatTime = function (timex) { if (timex.minute === 0 && timex.second === 0) { return `T${fixedFormatNumber$1(timex.hour, 2)}`; } if (timex.second === 0) { return `T${fixedFormatNumber$1(timex.hour, 2)}:${fixedFormatNumber$1(timex.minute, 2)}`; } return `T${fixedFormatNumber$1(timex.hour, 2)}:${fixedFormatNumber$1(timex.minute, 2)}:${fixedFormatNumber$1(timex.second, 2)}`; }; const formatDate = function (timex) { if ('year' in timex && 'month' in timex && 'dayOfMonth' in timex) { return `${fixedFormatNumber$1(timex.year, 4)}-${fixedFormatNumber$1(timex.month, 2)}-${fixedFormatNumber$1(timex.dayOfMonth, 2)}`; } if ('month' in timex && 'dayOfMonth' in timex) { return `XXXX-${fixedFormatNumber$1(timex.month, 2)}-${fixedFormatNumber$1(timex.dayOfMonth, 2)}`; } if ('dayOfWeek' in timex) { return `XXXX-WXX-${timex.dayOfWeek}`; } return ''; }; const formatDateRange = function (timex) { if ('year' in timex && 'weekOfYear' in timex && 'weekend' in timex) { return `${fixedFormatNumber$1(timex.year, 4)}-W${fixedFormatNumber$1(timex.weekOfYear, 2)}-WE`; } if ('year' in timex && 'weekOfYear' in timex) { return `${fixedFormatNumber$1(timex.year, 4)}-W${fixedFormatNumber$1(timex.weekOfYear, 2)}`; } if ('year' in timex && 'season' in timex) { return `${fixedFormatNumber$1(timex.year, 4)}-${timex.season}`; } if ('season' in timex) { return `${timex.season}`; } if ('year' in timex && 'month' in timex) { return `${fixedFormatNumber$1(timex.year, 4)}-${fixedFormatNumber$1(timex.month, 2)}`; } if ('year' in timex) { return `${fixedFormatNumber$1(timex.year, 4)}`; } if ('month' in timex && 'weekOfMonth' in timex && 'dayOfWeek' in timex) { return `XXXX-${fixedFormatNumber$1(timex.month, 2)}-WXX-${timex.weekOfMonth}-${timex.dayOfWeek}`; } if ('month' in timex && 'weekOfMonth' in timex) { return `XXXX-${fixedFormatNumber$1(timex.month, 2)}-WXX-${timex.weekOfMonth}`; } if ('month' in timex) { return `XXXX-${fixedFormatNumber$1(timex.month, 2)}`; } return ''; }; const formatTimeRange = function (timex) { if ('partOfDay' in timex) { return `T${timex.partOfDay}`; } return ''; }; const format = function(timex) { const types = ('types' in timex) ? timex.types : timexInference.infer(timex); if (types.has('present')) { return 'PRESENT_REF'; } if ((types.has('datetimerange') || types.has('daterange') || types.has('timerange')) && types.has('duration')) { const range = timexHelpers.expandDateTimeRange(timex); return `(${format(range.start)},${format(range.end)},${format(range.duration)})`; } if (types.has('datetimerange')) { return `${formatDate(timex)}${formatTimeRange(timex)}`; } if (types.has('daterange')) { return `${formatDateRange(timex)}`; } if (types.has('timerange')) { return `${formatTimeRange(timex)}`; } if (types.has('datetime')) { return `${formatDate(timex)}${formatTime(timex)}`; } if (types.has('duration')) { return `${formatDuration(timex)}`; } if (types.has('date')) { return `${formatDate(timex)}`; } if (types.has('time')) { return `${formatTime(timex)}`; } return ''; }; var format_1 = format; var timexFormat$1 = { format: format_1 }; var timexFormat$2 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': timexFormat$1, __moduleExports: timexFormat$1, format: format_1 }); // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. var days = [ 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday' ]; var months = [ 'January', 'Februrary', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December' ]; var dateAbbreviation = { 0: 'th', 1: 'st', 2: 'nd', 3: 'rd', 4: 'th', 5: 'th', 6: 'th', 7: 'th', 8: 'th', 9: 'th' }; var hours = [ 'midnight', '1AM', '2AM', '3AM', '4AM', '5AM', '6AM', '7AM', '8AM', '9AM', '10AM', '11AM', 'midday', '1PM', '2PM', '3PM', '4PM', '5PM', '6PM', '7PM', '8PM', '9PM', '10PM', '11PM' ]; var seasons = { SP: 'spring', SU: 'summer', FA: 'fall', WI: 'winter' }; var weeks = [ 'first', 'second', 'third', 'forth' ]; var dayParts = { DT: 'daytime', NI: 'night', MO: 'morning', AF: 'afternoon', EV: 'evening' }; var timexConstants$1 = { days: days, months: months, dateAbbreviation: dateAbbreviation, hours: hours, seasons: seasons, weeks: weeks, dayParts: dayParts }; var timexConstants$2 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': timexConstants$1, __moduleExports: timexConstants$1, days: days, months: months, dateAbbreviation: dateAbbreviation, hours: hours, seasons: seasons, weeks: weeks, dayParts: dayParts }); var timexConstants = ( timexConstants$2 && timexConstants$1 ) || timexConstants$2; // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. const convertDate$1 = function(timex) { if ('dayOfWeek' in timex) { return timexConstants.days[timex.dayOfWeek - 1]; } const month = timexConstants.months[timex.month - 1]; const date = timex.dayOfMonth.toString(); const abbreviation = timexConstants.dateAbbreviation[date.slice(-1)]; if ('year' in timex) { return `${date}${abbreviation} ${month} ${timex.year}`.trim(); } return `${date}${abbreviation} ${month}`; }; const convertTime = function(timex) { if (timex.hour === 0 && timex.minute === 0 && timex.second === 0) { return 'midnight'; } if (timex.hour === 12 && timex.minute === 0 && timex.second === 0) { return 'midday'; } const pad = function (s) { return (s.length === 1) ? '0' + s : s; }; const hour = (timex.hour === 0) ? '12' : (timex.hour > 12) ? (timex.hour - 12).toString() : timex.hour.toString(); const minute = (timex.minute === 0 && timex.second === 0) ? '' : ':' + pad(timex.minute.toString()); const second = (timex.second === 0) ? '' : ':' + pad(timex.second.toString()); const period = timex.hour < 12 ? 'AM' : 'PM'; return `${hour}${minute}${second}${period}`; }; const convertDurationPropertyToString = function (timex, property, includeSingleCount) { const propertyName = property + 's'; const value = timex[propertyName]; if (value !== undefined) { if (value === 1) { return includeSingleCount ? '1 ' + property : property; } else { return `${value} ${property}s`; } } return false; }; const convertTimexDurationToString = function (timex, includeSingleCount) { return convertDurationPropertyToString(timex, 'year', includeSingleCount) || convertDurationPropertyToString(timex, 'month', includeSingleCount) || convertDurationPropertyToString(timex, 'week', includeSingleCount) || convertDurationPropertyToString(timex, 'day', includeSingleCount) || convertDurationPropertyToString(timex, 'hour', includeSingleCount) || convertDurationPropertyToString(timex, 'minute', includeSingleCount) || convertDurationPropertyToString(timex, 'second', includeSingleCount); }; const convertDuration = function(timex) { return convertTimexDurationToString(timex, true); }; const convertDateRange$1 = function(timex) { const season = ('season' in timex) ? timexConstants.seasons[timex.season] : ''; const year = ('year' in timex) ? timex.year.toString() : ''; if ('weekOfYear' in timex) { if (timex.weekend) { return ''; } else { return ''; } } if ('month' in timex) { const month = `${timexConstants.months[timex.month - 1]}`; if ('weekOfMonth' in timex) { return `${timexConstants.weeks[timex.weekOfMonth - 1]} week of ${month}`; } else { return `${month} ${year}`.trim(); } } return `${season} ${year}`.trim(); }; const convertTimeRange = function(timex) { return timexConstants.dayParts[timex.partOfDay]; }; const convertDateTime$1 = function(timex) { return `${convertTime(timex)} ${convertDate$1(timex)}`; }; const convertDateTimeRange$1 = function(timex) { if (timex.types.has('timerange')) { return `${convertDate$1(timex)} ${convertTimeRange(timex)}`; } // date + time + duration // - OR - // date + duration return ''; }; const convertTimexToString = function (timex) { const types = ('types' in timex) ? timex.types : timexInference.infer(timex); if (types.has('present')) { return 'now'; } if (types.has('datetimerange')) { return convertDateTimeRange$1(timex); } if (types.has('daterange')) { return convertDateRange$1(timex); } if (types.has('duration')) { return convertDuration(timex); } if (types.has('timerange')) { return convertTimeRange(timex); } // TODO: where appropriate delegate most the formatting delegate to Date.toLocaleString(options) if (types.has('datetime')) { return convertDateTime$1(timex); } if (types.has('date')) { return convertDate$1(timex); } if (types.has('time')) { return convertTime(timex); } return ''; }; const convertTimexSetToString = function(timexSet) { const timex = timexSet.timex; if (timex.types.has('duration')) { return `every ${convertTimexDurationToString(timex, false)}`; } else { return `every ${convertTimexToString(timex)}`; } }; var timexConvert$4 = { convertDate: convertDate$1, convertTime: convertTime, convertTimexToString: convertTimexToString, convertTimexSetToString: convertTimexSetToString }; var timexConvert_1$1 = timexConvert$4.convertDate; var timexConvert_2$1 = timexConvert$4.convertTime; var timexConvert_3 = timexConvert$4.convertTimexToString; var timexConvert_4 = timexConvert$4.convertTimexSetToString; var timexConvert$5 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': timexConvert$4, __moduleExports: timexConvert$4, convertDate: timexConvert_1$1, convertTime: timexConvert_2$1, convertTimexToString: timexConvert_3, convertTimexSetToString: timexConvert_4 }); var timexConvert$3 = ( timexConvert$5 && timexConvert$4 ) || timexConvert$5; // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. var timexConvert$1 = { convertTimexToString: timexConvert$3.convertTimexToString, convertTimexSetToString: timexConvert$3.convertTimexSetToString }; var timexConvert_1 = timexConvert$1.convertTimexToString; var timexConvert_2 = timexConvert$1.convertTimexSetToString; var timexConvert$2 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': timexConvert$1, __moduleExports: timexConvert$1, convertTimexToString: timexConvert_1, convertTimexSetToString: timexConvert_2 }); // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. const getDateDay = function (day) { const index = (day === 0) ? 6 : day - 1; return timexConstants.days[index]; }; const convertDate = function(timex, date) { if ('year' in timex && 'month' in timex && 'dayOfMonth' in timex) { const timexDate = new Date(timex.year, timex.month - 1, timex.dayOfMonth); if (require$$1$1.datePartEquals(timexDate, date)) { return 'today'; } const tomorrow = require$$1$1.tomorrow(date); if (require$$1$1.datePartEquals(timexDate, tomorrow)) { return 'tomorrow'; } const yesterday = require$$1$1.yesterday(date); if (require$$1$1.datePartEquals(timexDate, yesterday)) { return 'yesterday'; } if (require$$1$1.isThisWeek(timexDate, date)) { return `this ${getDateDay(timexDate.getDay())}`; } if (require$$1$1.isNextWeek(timexDate, date)) { return `next ${getDateDay(timexDate.getDay())}`; } if (require$$1$1.isLastWeek(timexDate, date)) { return `last ${getDateDay(timexDate.getDay())}`; } } return timexConvert$3.convertDate(timex); }; const convertDateTime = function (timex, date) { return `${convertDate(timex, date)} ${timexConvert$3.convertTime(timex)}`; }; const convertDateRange = function(timex, date) { if ('year' in timex) { const year = date.getFullYear(); if (timex.year === year) { if ('weekOfYear' in timex) { const thisWeek = require$$1$1.weekOfYear(date); if (thisWeek === timex.weekOfYear) { return timex.weekend ? 'this weekend' : 'this week'; } if (thisWeek === timex.weekOfYear + 1) { return timex.weekend ? 'last weekend' : 'last week'; } if (thisWeek === timex.weekOfYear - 1) { return timex.weekend ? 'next weekend' : 'next week'; } } if ('month' in timex) { const isoMonth = date.getMonth() + 1; if (timex.month === isoMonth) { return 'this month'; } if (timex.month === isoMonth + 1) { return 'next month'; } if (timex.month === isoMonth - 1) { return 'last month'; } } return ('season' in timex) ? `this ${timexConstants.seasons[timex.season]}` : 'this year'; } if (timex.year === year + 1) { return ('season' in timex) ? `next ${timexConstants.seasons[timex.season]}` : 'next year'; } if (timex.year === year - 1) { return ('season' in timex) ? `last ${timexConstants.seasons[timex.season]}` : 'last year'; } } return ''; }; const convertDateTimeRange = function(timex, date) { if ('year' in timex && 'month' in timex && 'dayOfMonth' in timex) { const timexDate = new Date(timex.year, timex.month - 1, timex.dayOfMonth); if ('partOfDay' in timex) { if (require$$1$1.datePartEquals(timexDate, date)) { if (timex.partOfDay === 'NI') { return 'tonight'; } else { return `this ${timexConstants.dayParts[timex.partOfDay]}`; } } const tomorrow = require$$1$1.tomorrow(date); if (require$$1$1.datePartEquals(timexDate, tomorrow)) { return `tomorrow ${timexConstants.dayParts[timex.partOfDay]}`; } const yesterday = require$$1$1.yesterday(date); if (require$$1$1.datePartEquals(timexDate, yesterday)) { return `yesterday ${timexConstants.dayParts[timex.partOfDay]}`; } if (require$$1$1.isNextWeek(timexDate, date)) { return `next ${getDateDay(timexDate.getDay())} ${timexConstants.dayParts[timex.partOfDay]}`; } if (require$$1$1.isLastWeek(timexDate, date)) { return `last ${getDateDay(timexDate.getDay())} ${timexConstants.dayParts[timex.partOfDay]}`; } } } return ''; }; const convertTimexToStringRelative$1 = function (timex, date) { const types = ('types' in timex) ? timex.types : timexInference.infer(timex); if (types.has('datetimerange')) { return convertDateTimeRange(timex, date); } if (types.has('daterange')) { return convertDateRange(timex, date); } if (types.has('datetime')) { return convertDateTime(timex, date); } if (types.has('date')) { return convertDate(timex, date); } return timexConvert$3.convertTimexToString(timex); }; var convertTimexToStringRelative_1 = convertTimexToStringRelative$1; var timexRelativeConvert$3 = { convertTimexToStringRelative: convertTimexToStringRelative_1 }; var timexRelativeConvert$4 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': timexRelativeConvert$3, __moduleExports: timexRelativeConvert$3, convertTimexToStringRelative: convertTimexToStringRelative_1 }); var require$$0 = ( timexRelativeConvert$4 && timexRelativeConvert$3 ) || timexRelativeConvert$4; // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. var convertTimexToStringRelative = require$$0.convertTimexToStringRelative; var timexRelativeConvert$1 = { convertTimexToStringRelative: convertTimexToStringRelative }; var timexRelativeConvert$2 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': timexRelativeConvert$1, __moduleExports: timexRelativeConvert$1, convertTimexToStringRelative: convertTimexToStringRelative }); var timexParsing = ( timexParsing$2 && timexParsing$1 ) || timexParsing$2; var timexFormat = ( timexFormat$2 && timexFormat$1 ) || timexFormat$2; var timexConvert = ( timexConvert$2 && timexConvert$1 ) || timexConvert$2; var timexRelativeConvert = ( timexRelativeConvert$2 && timexRelativeConvert$1 ) || timexRelativeConvert$2; // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. class TimexProperty$4 { constructor (timex) { if (typeof timex === 'string') { timexParsing.parseString(timex, this); } else { timexParsing.fromObject(timex, this); } // TODO: constructing a Timex from a Timex should be very cheap } get timex() { return timexFormat.format(this); } get types () { return timexInference.infer(this); } toString () { return timexConvert.convertTimexToString(this); } // TODO: consider [locales[, options]] similar to Date.toLocaleString([locales[, options]]) toNaturalLanguage (referenceDate) { return timexRelativeConvert.convertTimexToStringRelative(this, referenceDate); } static fromDate (date) { return new TimexProperty$4({ year: date.getFullYear(), month: date.getMonth() + 1, dayOfMonth: date.getDate() }); } static fromDateTime (date) { return new TimexProperty$4({ year: date.getFullYear(), month: date.getMonth() + 1, dayOfMonth: date.getDate(), hour: date.getHours(), minute: date.getMinutes(), second: date.getSeconds() }); } static fromTime (time) { return new TimexProperty$4(time); } } var TimexProperty_1 = TimexProperty$4; var timexProperty = { TimexProperty: TimexProperty_1 }; var timexProperty$1 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': timexProperty, __moduleExports: timexProperty, TimexProperty: TimexProperty_1 }); var require$$1 = ( timexProperty$1 && timexProperty ) || timexProperty$1; // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. const TimexProperty$3 = require$$1.TimexProperty; class TimexSet { constructor (timex) { this.timex = new TimexProperty$3(timex); } } var TimexSet_1 = TimexSet; var timexSet = { TimexSet: TimexSet_1 }; var timexSet$1 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': timexSet, __moduleExports: timexSet, TimexSet: TimexSet_1 }); // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. const TimexProperty$2 = require$$1.TimexProperty; const today = function (date) { return TimexProperty$2.fromDate(date || new Date()).timex; }; const tomorrow = function (date) { const d = (date === undefined) ? new Date() : new Date(date.getTime()); d.setDate(d.getDate() + 1); return TimexProperty$2.fromDate(d).timex; }; const yesterday = function (date) { const d = (date === undefined) ? new Date() : new Date(date.getTime()); d.setDate(d.getDate() - 1); return TimexProperty$2.fromDate(d).timex; }; const weekFromToday = function (date) { const d = (date === undefined) ? new Date() : new Date(date.getTime()); return (new TimexProperty$2(Object.assign(TimexProperty$2.fromDate(d), { days: 7 }))).timex; }; const weekBackFromToday = function (date) { const d = (date === undefined) ? new Date() : new Date(date.getTime()); d.setDate(d.getDate() - 7); return (new TimexProperty$2(Object.assign(TimexProperty$2.fromDate(d), { days: 7 }))).timex; }; const thisWeek = function (date) { const d = (date === undefined) ? new Date() : new Date(date.getTime()); d.setDate(d.getDate() - 7); const start = require$$1$1.dateOfNextDay(1, d); return (new TimexProperty$2(Object.assign(TimexProperty$2.fromDate(start), { days: 7 }))).timex; }; const nextWeek = function (date) { const d = (date === undefined) ? new Date() : new Date(date.getTime()); const start = require$$1$1.dateOfNextDay(1, d); return (new TimexProperty$2(Object.assign(TimexProperty$2.fromDate(start), { days: 7 }))).timex; }; const lastWeek = function (date) { const d = (date === undefined) ? new Date() : new Date(date.getTime()); const start = require$$1$1.dateOfLastDay(1, d); start.setDate(start.getDate() - 7); return (new TimexProperty$2(Object.assign(TimexProperty$2.fromDate(start), { days: 7 }))).timex; }; const nextWeeksFromToday = function (n, date) { const d = (date === undefined) ? new Date() : new Date(date.getTime()); return (new TimexProperty$2(Object.assign(TimexProperty$2.fromDate(d), { days: 7 * n }))).timex; }; // The following constants are consistent with the Recognizer results const monday = 'XXXX-WXX-1'; const tuesday = 'XXXX-WXX-2'; const wednesday = 'XXXX-WXX-3'; const thursday = 'XXXX-WXX-4'; const friday = 'XXXX-WXX-5'; const saturday = 'XXXX-WXX-6'; const sunday = 'XXXX-WXX-7'; const morning = '(T08,T12,PT4H)'; const afternoon = '(T12,T16,PT4H)'; const evening = '(T16,T20,PT4H)'; const daytime = '(T08,T18,PT10H)'; var timexCreator = { today: today, tomorrow: tomorrow, yesterday: yesterday, weekFromToday: weekFromToday, weekBackFromToday: weekBackFromToday, thisWeek: thisWeek, nextWeek: nextWeek, lastWeek: lastWeek, nextWeeksFromToday: nextWeeksFromToday, monday: monday, tuesday: tuesday, wednesday: wednesday, thursday: thursday, friday: friday, saturday: saturday, sunday: sunday, morning: morning, afternoon: afternoon, evening: evening, daytime: daytime }; var timexCreator_1 = timexCreator.today; var timexCreator_2 = timexCreator.tomorrow; var timexCreator_3 = timexCreator.yesterday; var timexCreator_4 = timexCreator.weekFromToday; var timexCreator_5 = timexCreator.weekBackFromToday; var timexCreator_6 = timexCreator.thisWeek; var timexCreator_7 = timexCreator.nextWeek; var timexCreator_8 = timexCreator.lastWeek; var timexCreator_9 = timexCreator.nextWeeksFromToday; var timexCreator_10 = timexCreator.monday; var timexCreator_11 = timexCreator.tuesday; var timexCreator_12 = timexCreator.wednesday; var timexCreator_13 = timexCreator.thursday; var timexCreator_14 = timexCreator.friday; var timexCreator_15 = timexCreator.saturday; var timexCreator_16 = timexCreator.sunday; var timexCreator_17 = timexCreator.morning; var timexCreator_18 = timexCreator.afternoon; var timexCreator_19 = timexCreator.evening; var timexCreator_20 = timexCreator.daytime; var timexCreator$1 = /*#__PURE__*/Object.freeze({ __proto__: null, 'default': timexCreator, __moduleExports: timexCreator, today: timexCreator_1, tomorrow: timexCreator_2, yesterday: timexCreator_3, weekFromToday: timexCreator_4, weekBackFromToday: timexCreator_5, thisWeek: timexCreator_6, nextWeek: timexCreator_7, lastWeek: timexCreator_8, nextWeeksFromToday: timexCreator_9, monday: timexCreator_10, tuesday: timexCreator_11, wednesday: timexCreator_12, thursday: timexCreator_13, friday: timexCreator_14, saturday: timexCreator_15, sunday: timexCreator_16, morning: timexCreator_17, afternoon: timexCreator_18, evening: timexCreator_19, daytime: timexCreator_20 }); // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. const isOverlapping = function (r1, r2) { return r1.end.getTime() > r2.start.getTime() && r1.start.getTime() <= r2.start.getTime() || r1.start.getTime() < r2.end.getTime() && r1.start.getTime() >= r2.start.getTime(); }; const collapseOverlapping = function (r1, r2, T) { return { start: new T(Math.max(r1.start.getTime(), r2.start.getTime())), end: new T(Math.min(r1.end.getTime(), r2.end.getTime())) }; }; const innerCollapse = function (ranges, T) { if (ranges.length === 1) { return false; } for (let i=0; i<ranges.length; i++) { const r1 = ranges[i]; for (let j=i+1; j<ranges.length; j++) { const r2 = ranges[j]; if (isOverlapping(r1, r2)) { ranges.splice(i, 1); ranges.splice(j - 1, 1); ranges.push(collapseOverlapping(r1, r2, T)); return true; } } } return false; }; const collapse = function (ranges, T) { const r = ranges.slice(0); while (innerCollapse(r, T)) ; r.sort((a, b) => a.start.getTime() - b.start.getTime()); return r; }; var timexConstraintsHelper$1 = { collapse: collapse, isOverlapping: isOverlapping }; var timexConstraintsHelper_1 = timexConstraintsHelper$1.collapse; var timexConstraint