mingo
Version:
MongoDB query language for in-memory objects
83 lines (82 loc) • 2.42 kB
JavaScript
import { computeValue } from "../../../core/_internal";
import { assert, isNil } from "../../../util";
import {
adjustDate,
computeDate,
DATE_FORMAT,
DATE_FORMAT_SYM_RE,
DATE_SYM_TABLE,
formatTimezone,
padDigits,
parseTimezone
} from "./_internal";
import { $dayOfMonth } from "./dayOfMonth";
import { $dayOfWeek } from "./dayOfWeek";
import { $dayOfYear } from "./dayOfYear";
import { $hour } from "./hour";
import { $isoDayOfWeek } from "./isoDayOfWeek";
import { $isoWeek } from "./isoWeek";
import { $millisecond } from "./millisecond";
import { $minute } from "./minute";
import { $month } from "./month";
import { $second } from "./second";
import { $week } from "./week";
import { $year } from "./year";
const DATE_FUNCTIONS = {
"%Y": $year,
"%G": $year,
"%m": $month,
"%d": $dayOfMonth,
"%H": $hour,
"%M": $minute,
"%S": $second,
"%L": $millisecond,
"%u": $isoDayOfWeek,
"%U": $week,
"%V": $isoWeek,
"%j": $dayOfYear,
"%w": (o, e, p) => $dayOfWeek(o, e, p) - 1
};
const $dateToString = (obj, expr, options) => {
const args = computeValue(obj, expr, null, options);
if (isNil(args.onNull)) args.onNull = null;
if (isNil(args.date)) return args.onNull;
const date = computeDate(obj, args.date, options);
let format = args.format || DATE_FORMAT;
const minuteOffset = parseTimezone(args.timezone);
const matches = format.match(DATE_FORMAT_SYM_RE);
adjustDate(date, minuteOffset);
for (let i = 0, len = matches.length; i < len; i++) {
const formatSpecifier = matches[i];
assert(
formatSpecifier in DATE_SYM_TABLE,
`$dateToString: invalid format specifier ${formatSpecifier}`
);
const { name, padding } = DATE_SYM_TABLE[formatSpecifier];
const fn = DATE_FUNCTIONS[formatSpecifier];
let value;
if (fn) {
value = padDigits(fn(obj, date, options), padding);
} else {
switch (name) {
case "timezone":
value = formatTimezone(minuteOffset);
break;
case "minute_offset":
value = minuteOffset.toString();
break;
case "abbr_month":
case "full_month": {
const format2 = name.startsWith("abbr") ? "short" : "long";
value = date.toLocaleString("en-US", { month: format2 });
break;
}
}
}
format = format.replace(formatSpecifier, value);
}
return format;
};
export {
$dateToString
};