/
index.ts
43 lines (39 loc) 路 1.22 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
* moment binder
*/
import moment from 'moment';
import { parse, ParseOptions } from 'relative-time-expression';
import { startOf as dateStartOf, endOf as dateEndOf } from 'period-edge';
import { Period } from 'relative-time-expression/lib/interface';
export * from 'relative-time-expression';
function startOf(m: moment.Moment, p: Period) {
if (p.number > 1) {
return moment(dateStartOf(m.toDate(), p.number + p.unit));
}
return m.startOf(p.unit);
}
function endOf(m: moment.Moment, p: Period) {
if (p.number > 1) {
return moment(dateEndOf(m.toDate(), p.number + p.unit));
}
return m.endOf(p.unit);
}
export default function parseToMoment(exp: string, options: { forceEnd?: boolean; base?: moment.Moment } & ParseOptions = {}) {
const { forceEnd, base = moment(), ...parseOptions } = options;
const ast = parse(exp, parseOptions);
return ast.body.reduce((moment, m) => {
if (m.type === 'Offset') {
if (m.op === '+') {
return moment.add(m.number, m.unit);
} else {
return moment.subtract(m.number, m.unit);
}
} else {
if (m.op === '/' && !forceEnd) {
return startOf(moment, m);
} else {
return endOf(moment, m);
}
}
}, base);
}