feelin 4.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +6 -0
- data/.rspec +2 -0
- data/CHANGELOG.md +10 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +21 -0
- data/README.md +43 -0
- data/feelin.gemspec +22 -0
- data/lib/feelin/js/node_modules/.package-lock.json +67 -0
- data/lib/feelin/js/node_modules/@lezer/common/LICENSE +21 -0
- data/lib/feelin/js/node_modules/@lezer/common/README.md +14 -0
- data/lib/feelin/js/node_modules/@lezer/common/dist/index.cjs +2181 -0
- data/lib/feelin/js/node_modules/@lezer/common/dist/index.d.cts +1137 -0
- data/lib/feelin/js/node_modules/@lezer/common/dist/index.d.ts +1137 -0
- data/lib/feelin/js/node_modules/@lezer/common/dist/index.js +2168 -0
- data/lib/feelin/js/node_modules/@lezer/common/package.json +32 -0
- data/lib/feelin/js/node_modules/@lezer/highlight/LICENSE +21 -0
- data/lib/feelin/js/node_modules/@lezer/highlight/README.md +14 -0
- data/lib/feelin/js/node_modules/@lezer/highlight/dist/index.cjs +915 -0
- data/lib/feelin/js/node_modules/@lezer/highlight/dist/index.d.cts +621 -0
- data/lib/feelin/js/node_modules/@lezer/highlight/dist/index.d.ts +623 -0
- data/lib/feelin/js/node_modules/@lezer/highlight/dist/index.js +904 -0
- data/lib/feelin/js/node_modules/@lezer/highlight/package.json +31 -0
- data/lib/feelin/js/node_modules/@lezer/lr/LICENSE +21 -0
- data/lib/feelin/js/node_modules/@lezer/lr/README.md +25 -0
- data/lib/feelin/js/node_modules/@lezer/lr/dist/constants.d.ts +45 -0
- data/lib/feelin/js/node_modules/@lezer/lr/dist/constants.js +5 -0
- data/lib/feelin/js/node_modules/@lezer/lr/dist/index.cjs +1890 -0
- data/lib/feelin/js/node_modules/@lezer/lr/dist/index.d.cts +303 -0
- data/lib/feelin/js/node_modules/@lezer/lr/dist/index.d.ts +303 -0
- data/lib/feelin/js/node_modules/@lezer/lr/dist/index.js +1883 -0
- data/lib/feelin/js/node_modules/@lezer/lr/package.json +32 -0
- data/lib/feelin/js/node_modules/feelin/LICENSE +21 -0
- data/lib/feelin/js/node_modules/feelin/README.md +65 -0
- data/lib/feelin/js/node_modules/feelin/dist/builtins.d.ts +355 -0
- data/lib/feelin/js/node_modules/feelin/dist/index.cjs +2072 -0
- data/lib/feelin/js/node_modules/feelin/dist/index.cjs.map +1 -0
- data/lib/feelin/js/node_modules/feelin/dist/index.d.ts +3 -0
- data/lib/feelin/js/node_modules/feelin/dist/index.esm.js +2063 -0
- data/lib/feelin/js/node_modules/feelin/dist/index.esm.js.map +1 -0
- data/lib/feelin/js/node_modules/feelin/dist/interpreter.d.ts +26 -0
- data/lib/feelin/js/node_modules/feelin/dist/parser.d.ts +4 -0
- data/lib/feelin/js/node_modules/feelin/dist/temporal.d.ts +6 -0
- data/lib/feelin/js/node_modules/feelin/dist/types.d.ts +35 -0
- data/lib/feelin/js/node_modules/feelin/dist/utils.d.ts +12 -0
- data/lib/feelin/js/node_modules/feelin/package.json +63 -0
- data/lib/feelin/js/node_modules/lezer-feel/LICENSE +21 -0
- data/lib/feelin/js/node_modules/lezer-feel/README.md +94 -0
- data/lib/feelin/js/node_modules/lezer-feel/dist/index.cjs +1328 -0
- data/lib/feelin/js/node_modules/lezer-feel/dist/index.cjs.map +1 -0
- data/lib/feelin/js/node_modules/lezer-feel/dist/index.d.ts +32 -0
- data/lib/feelin/js/node_modules/lezer-feel/dist/index.js +1323 -0
- data/lib/feelin/js/node_modules/lezer-feel/dist/index.js.map +1 -0
- data/lib/feelin/js/node_modules/lezer-feel/package.json +61 -0
- data/lib/feelin/js/node_modules/luxon/LICENSE.md +7 -0
- data/lib/feelin/js/node_modules/luxon/README.md +55 -0
- data/lib/feelin/js/node_modules/luxon/build/amd/luxon.js +8623 -0
- data/lib/feelin/js/node_modules/luxon/build/amd/luxon.js.map +1 -0
- data/lib/feelin/js/node_modules/luxon/build/cjs-browser/luxon.js +8621 -0
- data/lib/feelin/js/node_modules/luxon/build/cjs-browser/luxon.js.map +1 -0
- data/lib/feelin/js/node_modules/luxon/build/es6/luxon.js +8011 -0
- data/lib/feelin/js/node_modules/luxon/build/es6/luxon.js.map +1 -0
- data/lib/feelin/js/node_modules/luxon/build/global/luxon.js +8626 -0
- data/lib/feelin/js/node_modules/luxon/build/global/luxon.js.map +1 -0
- data/lib/feelin/js/node_modules/luxon/build/global/luxon.min.js +1 -0
- data/lib/feelin/js/node_modules/luxon/build/global/luxon.min.js.map +1 -0
- data/lib/feelin/js/node_modules/luxon/build/node/luxon.js +7679 -0
- data/lib/feelin/js/node_modules/luxon/build/node/luxon.js.map +1 -0
- data/lib/feelin/js/node_modules/luxon/package.json +87 -0
- data/lib/feelin/js/node_modules/luxon/src/datetime.js +2566 -0
- data/lib/feelin/js/node_modules/luxon/src/duration.js +990 -0
- data/lib/feelin/js/node_modules/luxon/src/errors.js +61 -0
- data/lib/feelin/js/node_modules/luxon/src/impl/conversions.js +206 -0
- data/lib/feelin/js/node_modules/luxon/src/impl/diff.js +95 -0
- data/lib/feelin/js/node_modules/luxon/src/impl/digits.js +90 -0
- data/lib/feelin/js/node_modules/luxon/src/impl/english.js +233 -0
- data/lib/feelin/js/node_modules/luxon/src/impl/formats.js +176 -0
- data/lib/feelin/js/node_modules/luxon/src/impl/formatter.js +409 -0
- data/lib/feelin/js/node_modules/luxon/src/impl/invalid.js +14 -0
- data/lib/feelin/js/node_modules/luxon/src/impl/locale.js +554 -0
- data/lib/feelin/js/node_modules/luxon/src/impl/regexParser.js +335 -0
- data/lib/feelin/js/node_modules/luxon/src/impl/tokenParser.js +505 -0
- data/lib/feelin/js/node_modules/luxon/src/impl/util.js +316 -0
- data/lib/feelin/js/node_modules/luxon/src/impl/zoneUtil.js +34 -0
- data/lib/feelin/js/node_modules/luxon/src/info.js +205 -0
- data/lib/feelin/js/node_modules/luxon/src/interval.js +665 -0
- data/lib/feelin/js/node_modules/luxon/src/luxon.js +26 -0
- data/lib/feelin/js/node_modules/luxon/src/package.json +4 -0
- data/lib/feelin/js/node_modules/luxon/src/settings.js +180 -0
- data/lib/feelin/js/node_modules/luxon/src/zone.js +97 -0
- data/lib/feelin/js/node_modules/luxon/src/zones/IANAZone.js +231 -0
- data/lib/feelin/js/node_modules/luxon/src/zones/fixedOffsetZone.js +150 -0
- data/lib/feelin/js/node_modules/luxon/src/zones/invalidZone.js +53 -0
- data/lib/feelin/js/node_modules/luxon/src/zones/systemZone.js +61 -0
- data/lib/feelin/js/node_modules/min-dash/LICENSE +21 -0
- data/lib/feelin/js/node_modules/min-dash/README.md +38 -0
- data/lib/feelin/js/node_modules/min-dash/dist/array.d.ts +12 -0
- data/lib/feelin/js/node_modules/min-dash/dist/collection.d.ts +174 -0
- data/lib/feelin/js/node_modules/min-dash/dist/fn.d.ts +37 -0
- data/lib/feelin/js/node_modules/min-dash/dist/index.cjs +910 -0
- data/lib/feelin/js/node_modules/min-dash/dist/index.d.ts +5 -0
- data/lib/feelin/js/node_modules/min-dash/dist/index.esm.js +872 -0
- data/lib/feelin/js/node_modules/min-dash/dist/lang.d.ts +29 -0
- data/lib/feelin/js/node_modules/min-dash/dist/min-dash.js +916 -0
- data/lib/feelin/js/node_modules/min-dash/dist/min-dash.min.js +1 -0
- data/lib/feelin/js/node_modules/min-dash/dist/object.d.ts +112 -0
- data/lib/feelin/js/node_modules/min-dash/package.json +72 -0
- data/lib/feelin/js/package-lock.json +72 -0
- data/lib/feelin/js/package.json +5 -0
- data/lib/feelin/version.rb +3 -0
- data/lib/feelin.rb +63 -0
- data/spec/feelin/feelin_spec.rb +38 -0
- data/spec/spec_helper.rb +2 -0
- metadata +198 -0
@@ -0,0 +1,176 @@
|
|
1
|
+
/**
|
2
|
+
* @private
|
3
|
+
*/
|
4
|
+
|
5
|
+
const n = "numeric",
|
6
|
+
s = "short",
|
7
|
+
l = "long";
|
8
|
+
|
9
|
+
export const DATE_SHORT = {
|
10
|
+
year: n,
|
11
|
+
month: n,
|
12
|
+
day: n,
|
13
|
+
};
|
14
|
+
|
15
|
+
export const DATE_MED = {
|
16
|
+
year: n,
|
17
|
+
month: s,
|
18
|
+
day: n,
|
19
|
+
};
|
20
|
+
|
21
|
+
export const DATE_MED_WITH_WEEKDAY = {
|
22
|
+
year: n,
|
23
|
+
month: s,
|
24
|
+
day: n,
|
25
|
+
weekday: s,
|
26
|
+
};
|
27
|
+
|
28
|
+
export const DATE_FULL = {
|
29
|
+
year: n,
|
30
|
+
month: l,
|
31
|
+
day: n,
|
32
|
+
};
|
33
|
+
|
34
|
+
export const DATE_HUGE = {
|
35
|
+
year: n,
|
36
|
+
month: l,
|
37
|
+
day: n,
|
38
|
+
weekday: l,
|
39
|
+
};
|
40
|
+
|
41
|
+
export const TIME_SIMPLE = {
|
42
|
+
hour: n,
|
43
|
+
minute: n,
|
44
|
+
};
|
45
|
+
|
46
|
+
export const TIME_WITH_SECONDS = {
|
47
|
+
hour: n,
|
48
|
+
minute: n,
|
49
|
+
second: n,
|
50
|
+
};
|
51
|
+
|
52
|
+
export const TIME_WITH_SHORT_OFFSET = {
|
53
|
+
hour: n,
|
54
|
+
minute: n,
|
55
|
+
second: n,
|
56
|
+
timeZoneName: s,
|
57
|
+
};
|
58
|
+
|
59
|
+
export const TIME_WITH_LONG_OFFSET = {
|
60
|
+
hour: n,
|
61
|
+
minute: n,
|
62
|
+
second: n,
|
63
|
+
timeZoneName: l,
|
64
|
+
};
|
65
|
+
|
66
|
+
export const TIME_24_SIMPLE = {
|
67
|
+
hour: n,
|
68
|
+
minute: n,
|
69
|
+
hourCycle: "h23",
|
70
|
+
};
|
71
|
+
|
72
|
+
export const TIME_24_WITH_SECONDS = {
|
73
|
+
hour: n,
|
74
|
+
minute: n,
|
75
|
+
second: n,
|
76
|
+
hourCycle: "h23",
|
77
|
+
};
|
78
|
+
|
79
|
+
export const TIME_24_WITH_SHORT_OFFSET = {
|
80
|
+
hour: n,
|
81
|
+
minute: n,
|
82
|
+
second: n,
|
83
|
+
hourCycle: "h23",
|
84
|
+
timeZoneName: s,
|
85
|
+
};
|
86
|
+
|
87
|
+
export const TIME_24_WITH_LONG_OFFSET = {
|
88
|
+
hour: n,
|
89
|
+
minute: n,
|
90
|
+
second: n,
|
91
|
+
hourCycle: "h23",
|
92
|
+
timeZoneName: l,
|
93
|
+
};
|
94
|
+
|
95
|
+
export const DATETIME_SHORT = {
|
96
|
+
year: n,
|
97
|
+
month: n,
|
98
|
+
day: n,
|
99
|
+
hour: n,
|
100
|
+
minute: n,
|
101
|
+
};
|
102
|
+
|
103
|
+
export const DATETIME_SHORT_WITH_SECONDS = {
|
104
|
+
year: n,
|
105
|
+
month: n,
|
106
|
+
day: n,
|
107
|
+
hour: n,
|
108
|
+
minute: n,
|
109
|
+
second: n,
|
110
|
+
};
|
111
|
+
|
112
|
+
export const DATETIME_MED = {
|
113
|
+
year: n,
|
114
|
+
month: s,
|
115
|
+
day: n,
|
116
|
+
hour: n,
|
117
|
+
minute: n,
|
118
|
+
};
|
119
|
+
|
120
|
+
export const DATETIME_MED_WITH_SECONDS = {
|
121
|
+
year: n,
|
122
|
+
month: s,
|
123
|
+
day: n,
|
124
|
+
hour: n,
|
125
|
+
minute: n,
|
126
|
+
second: n,
|
127
|
+
};
|
128
|
+
|
129
|
+
export const DATETIME_MED_WITH_WEEKDAY = {
|
130
|
+
year: n,
|
131
|
+
month: s,
|
132
|
+
day: n,
|
133
|
+
weekday: s,
|
134
|
+
hour: n,
|
135
|
+
minute: n,
|
136
|
+
};
|
137
|
+
|
138
|
+
export const DATETIME_FULL = {
|
139
|
+
year: n,
|
140
|
+
month: l,
|
141
|
+
day: n,
|
142
|
+
hour: n,
|
143
|
+
minute: n,
|
144
|
+
timeZoneName: s,
|
145
|
+
};
|
146
|
+
|
147
|
+
export const DATETIME_FULL_WITH_SECONDS = {
|
148
|
+
year: n,
|
149
|
+
month: l,
|
150
|
+
day: n,
|
151
|
+
hour: n,
|
152
|
+
minute: n,
|
153
|
+
second: n,
|
154
|
+
timeZoneName: s,
|
155
|
+
};
|
156
|
+
|
157
|
+
export const DATETIME_HUGE = {
|
158
|
+
year: n,
|
159
|
+
month: l,
|
160
|
+
day: n,
|
161
|
+
weekday: l,
|
162
|
+
hour: n,
|
163
|
+
minute: n,
|
164
|
+
timeZoneName: l,
|
165
|
+
};
|
166
|
+
|
167
|
+
export const DATETIME_HUGE_WITH_SECONDS = {
|
168
|
+
year: n,
|
169
|
+
month: l,
|
170
|
+
day: n,
|
171
|
+
weekday: l,
|
172
|
+
hour: n,
|
173
|
+
minute: n,
|
174
|
+
second: n,
|
175
|
+
timeZoneName: l,
|
176
|
+
};
|
@@ -0,0 +1,409 @@
|
|
1
|
+
import * as English from "./english.js";
|
2
|
+
import * as Formats from "./formats.js";
|
3
|
+
import { padStart } from "./util.js";
|
4
|
+
|
5
|
+
function stringifyTokens(splits, tokenToString) {
|
6
|
+
let s = "";
|
7
|
+
for (const token of splits) {
|
8
|
+
if (token.literal) {
|
9
|
+
s += token.val;
|
10
|
+
} else {
|
11
|
+
s += tokenToString(token.val);
|
12
|
+
}
|
13
|
+
}
|
14
|
+
return s;
|
15
|
+
}
|
16
|
+
|
17
|
+
const macroTokenToFormatOpts = {
|
18
|
+
D: Formats.DATE_SHORT,
|
19
|
+
DD: Formats.DATE_MED,
|
20
|
+
DDD: Formats.DATE_FULL,
|
21
|
+
DDDD: Formats.DATE_HUGE,
|
22
|
+
t: Formats.TIME_SIMPLE,
|
23
|
+
tt: Formats.TIME_WITH_SECONDS,
|
24
|
+
ttt: Formats.TIME_WITH_SHORT_OFFSET,
|
25
|
+
tttt: Formats.TIME_WITH_LONG_OFFSET,
|
26
|
+
T: Formats.TIME_24_SIMPLE,
|
27
|
+
TT: Formats.TIME_24_WITH_SECONDS,
|
28
|
+
TTT: Formats.TIME_24_WITH_SHORT_OFFSET,
|
29
|
+
TTTT: Formats.TIME_24_WITH_LONG_OFFSET,
|
30
|
+
f: Formats.DATETIME_SHORT,
|
31
|
+
ff: Formats.DATETIME_MED,
|
32
|
+
fff: Formats.DATETIME_FULL,
|
33
|
+
ffff: Formats.DATETIME_HUGE,
|
34
|
+
F: Formats.DATETIME_SHORT_WITH_SECONDS,
|
35
|
+
FF: Formats.DATETIME_MED_WITH_SECONDS,
|
36
|
+
FFF: Formats.DATETIME_FULL_WITH_SECONDS,
|
37
|
+
FFFF: Formats.DATETIME_HUGE_WITH_SECONDS,
|
38
|
+
};
|
39
|
+
|
40
|
+
/**
|
41
|
+
* @private
|
42
|
+
*/
|
43
|
+
|
44
|
+
export default class Formatter {
|
45
|
+
static create(locale, opts = {}) {
|
46
|
+
return new Formatter(locale, opts);
|
47
|
+
}
|
48
|
+
|
49
|
+
static parseFormat(fmt) {
|
50
|
+
// white-space is always considered a literal in user-provided formats
|
51
|
+
// the " " token has a special meaning (see unitForToken)
|
52
|
+
|
53
|
+
let current = null,
|
54
|
+
currentFull = "",
|
55
|
+
bracketed = false;
|
56
|
+
const splits = [];
|
57
|
+
for (let i = 0; i < fmt.length; i++) {
|
58
|
+
const c = fmt.charAt(i);
|
59
|
+
if (c === "'") {
|
60
|
+
if (currentFull.length > 0) {
|
61
|
+
splits.push({ literal: bracketed || /^\s+$/.test(currentFull), val: currentFull });
|
62
|
+
}
|
63
|
+
current = null;
|
64
|
+
currentFull = "";
|
65
|
+
bracketed = !bracketed;
|
66
|
+
} else if (bracketed) {
|
67
|
+
currentFull += c;
|
68
|
+
} else if (c === current) {
|
69
|
+
currentFull += c;
|
70
|
+
} else {
|
71
|
+
if (currentFull.length > 0) {
|
72
|
+
splits.push({ literal: /^\s+$/.test(currentFull), val: currentFull });
|
73
|
+
}
|
74
|
+
currentFull = c;
|
75
|
+
current = c;
|
76
|
+
}
|
77
|
+
}
|
78
|
+
|
79
|
+
if (currentFull.length > 0) {
|
80
|
+
splits.push({ literal: bracketed || /^\s+$/.test(currentFull), val: currentFull });
|
81
|
+
}
|
82
|
+
|
83
|
+
return splits;
|
84
|
+
}
|
85
|
+
|
86
|
+
static macroTokenToFormatOpts(token) {
|
87
|
+
return macroTokenToFormatOpts[token];
|
88
|
+
}
|
89
|
+
|
90
|
+
constructor(locale, formatOpts) {
|
91
|
+
this.opts = formatOpts;
|
92
|
+
this.loc = locale;
|
93
|
+
this.systemLoc = null;
|
94
|
+
}
|
95
|
+
|
96
|
+
formatWithSystemDefault(dt, opts) {
|
97
|
+
if (this.systemLoc === null) {
|
98
|
+
this.systemLoc = this.loc.redefaultToSystem();
|
99
|
+
}
|
100
|
+
const df = this.systemLoc.dtFormatter(dt, { ...this.opts, ...opts });
|
101
|
+
return df.format();
|
102
|
+
}
|
103
|
+
|
104
|
+
dtFormatter(dt, opts = {}) {
|
105
|
+
return this.loc.dtFormatter(dt, { ...this.opts, ...opts });
|
106
|
+
}
|
107
|
+
|
108
|
+
formatDateTime(dt, opts) {
|
109
|
+
return this.dtFormatter(dt, opts).format();
|
110
|
+
}
|
111
|
+
|
112
|
+
formatDateTimeParts(dt, opts) {
|
113
|
+
return this.dtFormatter(dt, opts).formatToParts();
|
114
|
+
}
|
115
|
+
|
116
|
+
formatInterval(interval, opts) {
|
117
|
+
const df = this.dtFormatter(interval.start, opts);
|
118
|
+
return df.dtf.formatRange(interval.start.toJSDate(), interval.end.toJSDate());
|
119
|
+
}
|
120
|
+
|
121
|
+
resolvedOptions(dt, opts) {
|
122
|
+
return this.dtFormatter(dt, opts).resolvedOptions();
|
123
|
+
}
|
124
|
+
|
125
|
+
num(n, p = 0) {
|
126
|
+
// we get some perf out of doing this here, annoyingly
|
127
|
+
if (this.opts.forceSimple) {
|
128
|
+
return padStart(n, p);
|
129
|
+
}
|
130
|
+
|
131
|
+
const opts = { ...this.opts };
|
132
|
+
|
133
|
+
if (p > 0) {
|
134
|
+
opts.padTo = p;
|
135
|
+
}
|
136
|
+
|
137
|
+
return this.loc.numberFormatter(opts).format(n);
|
138
|
+
}
|
139
|
+
|
140
|
+
formatDateTimeFromString(dt, fmt) {
|
141
|
+
const knownEnglish = this.loc.listingMode() === "en",
|
142
|
+
useDateTimeFormatter = this.loc.outputCalendar && this.loc.outputCalendar !== "gregory",
|
143
|
+
string = (opts, extract) => this.loc.extract(dt, opts, extract),
|
144
|
+
formatOffset = (opts) => {
|
145
|
+
if (dt.isOffsetFixed && dt.offset === 0 && opts.allowZ) {
|
146
|
+
return "Z";
|
147
|
+
}
|
148
|
+
|
149
|
+
return dt.isValid ? dt.zone.formatOffset(dt.ts, opts.format) : "";
|
150
|
+
},
|
151
|
+
meridiem = () =>
|
152
|
+
knownEnglish
|
153
|
+
? English.meridiemForDateTime(dt)
|
154
|
+
: string({ hour: "numeric", hourCycle: "h12" }, "dayperiod"),
|
155
|
+
month = (length, standalone) =>
|
156
|
+
knownEnglish
|
157
|
+
? English.monthForDateTime(dt, length)
|
158
|
+
: string(standalone ? { month: length } : { month: length, day: "numeric" }, "month"),
|
159
|
+
weekday = (length, standalone) =>
|
160
|
+
knownEnglish
|
161
|
+
? English.weekdayForDateTime(dt, length)
|
162
|
+
: string(
|
163
|
+
standalone ? { weekday: length } : { weekday: length, month: "long", day: "numeric" },
|
164
|
+
"weekday"
|
165
|
+
),
|
166
|
+
maybeMacro = (token) => {
|
167
|
+
const formatOpts = Formatter.macroTokenToFormatOpts(token);
|
168
|
+
if (formatOpts) {
|
169
|
+
return this.formatWithSystemDefault(dt, formatOpts);
|
170
|
+
} else {
|
171
|
+
return token;
|
172
|
+
}
|
173
|
+
},
|
174
|
+
era = (length) =>
|
175
|
+
knownEnglish ? English.eraForDateTime(dt, length) : string({ era: length }, "era"),
|
176
|
+
tokenToString = (token) => {
|
177
|
+
// Where possible: https://cldr.unicode.org/translation/date-time/date-time-symbols
|
178
|
+
switch (token) {
|
179
|
+
// ms
|
180
|
+
case "S":
|
181
|
+
return this.num(dt.millisecond);
|
182
|
+
case "u":
|
183
|
+
// falls through
|
184
|
+
case "SSS":
|
185
|
+
return this.num(dt.millisecond, 3);
|
186
|
+
// seconds
|
187
|
+
case "s":
|
188
|
+
return this.num(dt.second);
|
189
|
+
case "ss":
|
190
|
+
return this.num(dt.second, 2);
|
191
|
+
// fractional seconds
|
192
|
+
case "uu":
|
193
|
+
return this.num(Math.floor(dt.millisecond / 10), 2);
|
194
|
+
case "uuu":
|
195
|
+
return this.num(Math.floor(dt.millisecond / 100));
|
196
|
+
// minutes
|
197
|
+
case "m":
|
198
|
+
return this.num(dt.minute);
|
199
|
+
case "mm":
|
200
|
+
return this.num(dt.minute, 2);
|
201
|
+
// hours
|
202
|
+
case "h":
|
203
|
+
return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12);
|
204
|
+
case "hh":
|
205
|
+
return this.num(dt.hour % 12 === 0 ? 12 : dt.hour % 12, 2);
|
206
|
+
case "H":
|
207
|
+
return this.num(dt.hour);
|
208
|
+
case "HH":
|
209
|
+
return this.num(dt.hour, 2);
|
210
|
+
// offset
|
211
|
+
case "Z":
|
212
|
+
// like +6
|
213
|
+
return formatOffset({ format: "narrow", allowZ: this.opts.allowZ });
|
214
|
+
case "ZZ":
|
215
|
+
// like +06:00
|
216
|
+
return formatOffset({ format: "short", allowZ: this.opts.allowZ });
|
217
|
+
case "ZZZ":
|
218
|
+
// like +0600
|
219
|
+
return formatOffset({ format: "techie", allowZ: this.opts.allowZ });
|
220
|
+
case "ZZZZ":
|
221
|
+
// like EST
|
222
|
+
return dt.zone.offsetName(dt.ts, { format: "short", locale: this.loc.locale });
|
223
|
+
case "ZZZZZ":
|
224
|
+
// like Eastern Standard Time
|
225
|
+
return dt.zone.offsetName(dt.ts, { format: "long", locale: this.loc.locale });
|
226
|
+
// zone
|
227
|
+
case "z":
|
228
|
+
// like America/New_York
|
229
|
+
return dt.zoneName;
|
230
|
+
// meridiems
|
231
|
+
case "a":
|
232
|
+
return meridiem();
|
233
|
+
// dates
|
234
|
+
case "d":
|
235
|
+
return useDateTimeFormatter ? string({ day: "numeric" }, "day") : this.num(dt.day);
|
236
|
+
case "dd":
|
237
|
+
return useDateTimeFormatter ? string({ day: "2-digit" }, "day") : this.num(dt.day, 2);
|
238
|
+
// weekdays - standalone
|
239
|
+
case "c":
|
240
|
+
// like 1
|
241
|
+
return this.num(dt.weekday);
|
242
|
+
case "ccc":
|
243
|
+
// like 'Tues'
|
244
|
+
return weekday("short", true);
|
245
|
+
case "cccc":
|
246
|
+
// like 'Tuesday'
|
247
|
+
return weekday("long", true);
|
248
|
+
case "ccccc":
|
249
|
+
// like 'T'
|
250
|
+
return weekday("narrow", true);
|
251
|
+
// weekdays - format
|
252
|
+
case "E":
|
253
|
+
// like 1
|
254
|
+
return this.num(dt.weekday);
|
255
|
+
case "EEE":
|
256
|
+
// like 'Tues'
|
257
|
+
return weekday("short", false);
|
258
|
+
case "EEEE":
|
259
|
+
// like 'Tuesday'
|
260
|
+
return weekday("long", false);
|
261
|
+
case "EEEEE":
|
262
|
+
// like 'T'
|
263
|
+
return weekday("narrow", false);
|
264
|
+
// months - standalone
|
265
|
+
case "L":
|
266
|
+
// like 1
|
267
|
+
return useDateTimeFormatter
|
268
|
+
? string({ month: "numeric", day: "numeric" }, "month")
|
269
|
+
: this.num(dt.month);
|
270
|
+
case "LL":
|
271
|
+
// like 01, doesn't seem to work
|
272
|
+
return useDateTimeFormatter
|
273
|
+
? string({ month: "2-digit", day: "numeric" }, "month")
|
274
|
+
: this.num(dt.month, 2);
|
275
|
+
case "LLL":
|
276
|
+
// like Jan
|
277
|
+
return month("short", true);
|
278
|
+
case "LLLL":
|
279
|
+
// like January
|
280
|
+
return month("long", true);
|
281
|
+
case "LLLLL":
|
282
|
+
// like J
|
283
|
+
return month("narrow", true);
|
284
|
+
// months - format
|
285
|
+
case "M":
|
286
|
+
// like 1
|
287
|
+
return useDateTimeFormatter
|
288
|
+
? string({ month: "numeric" }, "month")
|
289
|
+
: this.num(dt.month);
|
290
|
+
case "MM":
|
291
|
+
// like 01
|
292
|
+
return useDateTimeFormatter
|
293
|
+
? string({ month: "2-digit" }, "month")
|
294
|
+
: this.num(dt.month, 2);
|
295
|
+
case "MMM":
|
296
|
+
// like Jan
|
297
|
+
return month("short", false);
|
298
|
+
case "MMMM":
|
299
|
+
// like January
|
300
|
+
return month("long", false);
|
301
|
+
case "MMMMM":
|
302
|
+
// like J
|
303
|
+
return month("narrow", false);
|
304
|
+
// years
|
305
|
+
case "y":
|
306
|
+
// like 2014
|
307
|
+
return useDateTimeFormatter ? string({ year: "numeric" }, "year") : this.num(dt.year);
|
308
|
+
case "yy":
|
309
|
+
// like 14
|
310
|
+
return useDateTimeFormatter
|
311
|
+
? string({ year: "2-digit" }, "year")
|
312
|
+
: this.num(dt.year.toString().slice(-2), 2);
|
313
|
+
case "yyyy":
|
314
|
+
// like 0012
|
315
|
+
return useDateTimeFormatter
|
316
|
+
? string({ year: "numeric" }, "year")
|
317
|
+
: this.num(dt.year, 4);
|
318
|
+
case "yyyyyy":
|
319
|
+
// like 000012
|
320
|
+
return useDateTimeFormatter
|
321
|
+
? string({ year: "numeric" }, "year")
|
322
|
+
: this.num(dt.year, 6);
|
323
|
+
// eras
|
324
|
+
case "G":
|
325
|
+
// like AD
|
326
|
+
return era("short");
|
327
|
+
case "GG":
|
328
|
+
// like Anno Domini
|
329
|
+
return era("long");
|
330
|
+
case "GGGGG":
|
331
|
+
return era("narrow");
|
332
|
+
case "kk":
|
333
|
+
return this.num(dt.weekYear.toString().slice(-2), 2);
|
334
|
+
case "kkkk":
|
335
|
+
return this.num(dt.weekYear, 4);
|
336
|
+
case "W":
|
337
|
+
return this.num(dt.weekNumber);
|
338
|
+
case "WW":
|
339
|
+
return this.num(dt.weekNumber, 2);
|
340
|
+
case "n":
|
341
|
+
return this.num(dt.localWeekNumber);
|
342
|
+
case "nn":
|
343
|
+
return this.num(dt.localWeekNumber, 2);
|
344
|
+
case "ii":
|
345
|
+
return this.num(dt.localWeekYear.toString().slice(-2), 2);
|
346
|
+
case "iiii":
|
347
|
+
return this.num(dt.localWeekYear, 4);
|
348
|
+
case "o":
|
349
|
+
return this.num(dt.ordinal);
|
350
|
+
case "ooo":
|
351
|
+
return this.num(dt.ordinal, 3);
|
352
|
+
case "q":
|
353
|
+
// like 1
|
354
|
+
return this.num(dt.quarter);
|
355
|
+
case "qq":
|
356
|
+
// like 01
|
357
|
+
return this.num(dt.quarter, 2);
|
358
|
+
case "X":
|
359
|
+
return this.num(Math.floor(dt.ts / 1000));
|
360
|
+
case "x":
|
361
|
+
return this.num(dt.ts);
|
362
|
+
default:
|
363
|
+
return maybeMacro(token);
|
364
|
+
}
|
365
|
+
};
|
366
|
+
|
367
|
+
return stringifyTokens(Formatter.parseFormat(fmt), tokenToString);
|
368
|
+
}
|
369
|
+
|
370
|
+
formatDurationFromString(dur, fmt) {
|
371
|
+
const tokenToField = (token) => {
|
372
|
+
switch (token[0]) {
|
373
|
+
case "S":
|
374
|
+
return "millisecond";
|
375
|
+
case "s":
|
376
|
+
return "second";
|
377
|
+
case "m":
|
378
|
+
return "minute";
|
379
|
+
case "h":
|
380
|
+
return "hour";
|
381
|
+
case "d":
|
382
|
+
return "day";
|
383
|
+
case "w":
|
384
|
+
return "week";
|
385
|
+
case "M":
|
386
|
+
return "month";
|
387
|
+
case "y":
|
388
|
+
return "year";
|
389
|
+
default:
|
390
|
+
return null;
|
391
|
+
}
|
392
|
+
},
|
393
|
+
tokenToString = (lildur) => (token) => {
|
394
|
+
const mapped = tokenToField(token);
|
395
|
+
if (mapped) {
|
396
|
+
return this.num(lildur.get(mapped), token.length);
|
397
|
+
} else {
|
398
|
+
return token;
|
399
|
+
}
|
400
|
+
},
|
401
|
+
tokens = Formatter.parseFormat(fmt),
|
402
|
+
realTokens = tokens.reduce(
|
403
|
+
(found, { literal, val }) => (literal ? found : found.concat(val)),
|
404
|
+
[]
|
405
|
+
),
|
406
|
+
collapsed = dur.shiftTo(...realTokens.map(tokenToField).filter((t) => t));
|
407
|
+
return stringifyTokens(tokens, tokenToString(collapsed));
|
408
|
+
}
|
409
|
+
}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
export default class Invalid {
|
2
|
+
constructor(reason, explanation) {
|
3
|
+
this.reason = reason;
|
4
|
+
this.explanation = explanation;
|
5
|
+
}
|
6
|
+
|
7
|
+
toMessage() {
|
8
|
+
if (this.explanation) {
|
9
|
+
return `${this.reason}: ${this.explanation}`;
|
10
|
+
} else {
|
11
|
+
return this.reason;
|
12
|
+
}
|
13
|
+
}
|
14
|
+
}
|