UNPKG

twing

Version:

First-class Twig engine for Node.js

155 lines (154 loc) 5.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.dateSynchronously = exports.createDateTimeSynchronously = exports.date = exports.createDateTime = void 0; const luxon_1 = require("luxon"); const modify_date_1 = require("../../../helpers/modify-date"); /** * Converts an input to a DateTime instance. * * <pre> * {% if date(user.created_at) < date('+2days') %} * {# do something #} * {% endif %} * </pre> * * @param {TwingTemplate} template * @param {Date | DateTime | Duration | number | string} input A date or null to use the current time * @param {string | null | boolean} timezone The target timezone, null to use the default, false to leave unchanged * * @returns {Promise<DateTime | Duration>} */ const createDateTime = (defaultTimezone, input, timezone) => { const _do = () => { let result; if (input === null) { result = luxon_1.DateTime.local(); } else if (typeof input === 'number') { result = luxon_1.DateTime.fromMillis(input * 1000); } else if (typeof input === 'string') { if (input === 'now') { result = luxon_1.DateTime.local(); } else { result = luxon_1.DateTime.fromISO(input, { setZone: true }); if (!result.isValid) { result = luxon_1.DateTime.fromRFC2822(input, { setZone: true }); } if (!result.isValid) { result = luxon_1.DateTime.fromSQL(input, { setZone: true }); } if (!result.isValid && /^-{0,1}\d+$/.test(input)) { result = luxon_1.DateTime.fromMillis(Number.parseInt(input) * 1000, { setZone: true }); } if (!result.isValid) { result = (0, modify_date_1.modifyDate)(input); } } } else if (input instanceof luxon_1.DateTime) { result = input; } else { result = luxon_1.DateTime.fromJSDate(input); } if (!result || !result.isValid) { throw new Error(`Failed to parse date "${input}".`); } // now let's apply timezone // determine the timezone if (timezone !== false) { if (timezone === null) { timezone = defaultTimezone; } result = result.setZone(timezone); } return result; }; try { return Promise.resolve(_do()); } catch (e) { return Promise.reject(e); } }; exports.createDateTime = createDateTime; const date = (executionContext, date, timezone) => { if (date instanceof luxon_1.Duration) { return Promise.resolve(date); } return (0, exports.createDateTime)(executionContext.environment.timezone, date, timezone); }; exports.date = date; const createDateTimeSynchronously = (defaultTimezone, input, timezone) => { let result; if (input === null) { result = luxon_1.DateTime.local(); } else if (typeof input === 'number') { result = luxon_1.DateTime.fromMillis(input * 1000); } else if (typeof input === 'string') { if (input === 'now') { result = luxon_1.DateTime.local(); } else { result = luxon_1.DateTime.fromISO(input, { setZone: true }); if (!result.isValid) { result = luxon_1.DateTime.fromRFC2822(input, { setZone: true }); } if (!result.isValid) { result = luxon_1.DateTime.fromSQL(input, { setZone: true }); } if (!result.isValid && /^-{0,1}\d+$/.test(input)) { result = luxon_1.DateTime.fromMillis(Number.parseInt(input) * 1000, { setZone: true }); } if (!result.isValid) { result = (0, modify_date_1.modifyDate)(input); } } } else if (input instanceof luxon_1.DateTime) { result = input; } else { result = luxon_1.DateTime.fromJSDate(input); } if (!result || !result.isValid) { throw new Error(`Failed to parse date "${input}".`); } // now let's apply timezone // determine the timezone if (timezone !== false) { if (timezone === null) { timezone = defaultTimezone; } result = result.setZone(timezone); } return result; }; exports.createDateTimeSynchronously = createDateTimeSynchronously; const dateSynchronously = (executionContext, date, timezone) => { if (date instanceof luxon_1.Duration) { return date; } return (0, exports.createDateTimeSynchronously)(executionContext.environment.timezone, date, timezone); }; exports.dateSynchronously = dateSynchronously;