@kermank/nldp
Version:
A modular date/time parser for converting natural language into dates and times
88 lines • 3.81 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createNLDP = void 0;
const parser_engine_1 = require("./parser/parser-engine");
const absolute_dates_1 = require("./rules/absolute-dates");
const date_only_1 = require("./rules/date-only");
const time_only_1 = require("./rules/time-only");
const relative_days_1 = require("./rules/relative-days");
const ordinal_days_1 = require("./rules/ordinal-days");
const partial_month_1 = require("./rules/partial-month");
const ordinal_weeks_1 = require("./rules/ordinal-weeks");
const relative_weeks_1 = require("./rules/relative-weeks");
const fuzzy_ranges_1 = require("./rules/fuzzy-ranges");
const time_ranges_1 = require("./rules/time-ranges");
const time_of_day_1 = require("./rules/time-of-day");
const defaultRules = [
absolute_dates_1.absoluteDatesRule, // ISO dates, YYYY-MM-DD etc
date_only_1.dateOnlyRule, // Date parsing
time_only_1.timeOnlyRule, // Time expressions
time_ranges_1.timeRangesRule, // Time ranges (3 PM to 5 PM)
time_of_day_1.timeOfDayRule, // Time of day expressions (morning, afternoon, etc.)
relative_days_1.relativeDaysRule, // today, tomorrow, etc
ordinal_days_1.ordinalDaysRule, // 1st of March, etc
partial_month_1.partialMonthRule, // early/mid/late month
ordinal_weeks_1.ordinalWeeksRule, // first week of March
relative_weeks_1.relativeWeeksRule, // next week, last week
fuzzy_ranges_1.fuzzyRangesRule // beginning of year, etc
];
function componentToResult(component) {
var _a, _b;
if (!component)
return null;
// Map component type to ParseResult type
const resultType = component.type === 'range' ? 'range' : 'single';
if (component.type === 'range') {
const range = component.value;
// Preserve original timezone
const startZone = range.start.zoneName || 'UTC';
const endZone = range.end.zoneName || 'UTC';
return {
type: resultType,
confidence: component.confidence,
start: range.start.setZone(startZone),
end: range.end.setZone(endZone),
text: ((_a = component.metadata) === null || _a === void 0 ? void 0 : _a.originalText) || '',
debugTrace: component.debugTrace
};
}
const date = component.value;
// Preserve original timezone
const zone = date.zoneName || 'UTC';
return {
type: resultType,
confidence: component.confidence,
start: date.setZone(zone),
end: undefined,
text: ((_b = component.metadata) === null || _b === void 0 ? void 0 : _b.originalText) || '',
debugTrace: component.debugTrace
};
}
const createNLDP = (preferences = {}) => {
// If useLocalTimezone is true, set the timeZone to the system's local timezone
if (preferences.useLocalTimezone) {
preferences.timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
}
else {
preferences.timeZone = preferences.timeZone || 'UTC';
}
let state = (0, parser_engine_1.createParserState)(preferences);
// Register default rules
defaultRules.forEach(rule => {
state = (0, parser_engine_1.registerRule)(state, rule);
});
return {
parse: (input, parsePreferences = {}) => {
// Also handle useLocalTimezone in parse calls
if (parsePreferences.useLocalTimezone) {
parsePreferences.timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;
}
return componentToResult((0, parser_engine_1.parse)(state, input, parsePreferences));
},
registerRule: (rule) => {
state = (0, parser_engine_1.registerRule)(state, rule);
}
};
};
exports.createNLDP = createNLDP;
//# sourceMappingURL=nldp.js.map