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.
Files changed (114) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.rspec +2 -0
  4. data/CHANGELOG.md +10 -0
  5. data/Gemfile +3 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +43 -0
  8. data/feelin.gemspec +22 -0
  9. data/lib/feelin/js/node_modules/.package-lock.json +67 -0
  10. data/lib/feelin/js/node_modules/@lezer/common/LICENSE +21 -0
  11. data/lib/feelin/js/node_modules/@lezer/common/README.md +14 -0
  12. data/lib/feelin/js/node_modules/@lezer/common/dist/index.cjs +2181 -0
  13. data/lib/feelin/js/node_modules/@lezer/common/dist/index.d.cts +1137 -0
  14. data/lib/feelin/js/node_modules/@lezer/common/dist/index.d.ts +1137 -0
  15. data/lib/feelin/js/node_modules/@lezer/common/dist/index.js +2168 -0
  16. data/lib/feelin/js/node_modules/@lezer/common/package.json +32 -0
  17. data/lib/feelin/js/node_modules/@lezer/highlight/LICENSE +21 -0
  18. data/lib/feelin/js/node_modules/@lezer/highlight/README.md +14 -0
  19. data/lib/feelin/js/node_modules/@lezer/highlight/dist/index.cjs +915 -0
  20. data/lib/feelin/js/node_modules/@lezer/highlight/dist/index.d.cts +621 -0
  21. data/lib/feelin/js/node_modules/@lezer/highlight/dist/index.d.ts +623 -0
  22. data/lib/feelin/js/node_modules/@lezer/highlight/dist/index.js +904 -0
  23. data/lib/feelin/js/node_modules/@lezer/highlight/package.json +31 -0
  24. data/lib/feelin/js/node_modules/@lezer/lr/LICENSE +21 -0
  25. data/lib/feelin/js/node_modules/@lezer/lr/README.md +25 -0
  26. data/lib/feelin/js/node_modules/@lezer/lr/dist/constants.d.ts +45 -0
  27. data/lib/feelin/js/node_modules/@lezer/lr/dist/constants.js +5 -0
  28. data/lib/feelin/js/node_modules/@lezer/lr/dist/index.cjs +1890 -0
  29. data/lib/feelin/js/node_modules/@lezer/lr/dist/index.d.cts +303 -0
  30. data/lib/feelin/js/node_modules/@lezer/lr/dist/index.d.ts +303 -0
  31. data/lib/feelin/js/node_modules/@lezer/lr/dist/index.js +1883 -0
  32. data/lib/feelin/js/node_modules/@lezer/lr/package.json +32 -0
  33. data/lib/feelin/js/node_modules/feelin/LICENSE +21 -0
  34. data/lib/feelin/js/node_modules/feelin/README.md +65 -0
  35. data/lib/feelin/js/node_modules/feelin/dist/builtins.d.ts +355 -0
  36. data/lib/feelin/js/node_modules/feelin/dist/index.cjs +2072 -0
  37. data/lib/feelin/js/node_modules/feelin/dist/index.cjs.map +1 -0
  38. data/lib/feelin/js/node_modules/feelin/dist/index.d.ts +3 -0
  39. data/lib/feelin/js/node_modules/feelin/dist/index.esm.js +2063 -0
  40. data/lib/feelin/js/node_modules/feelin/dist/index.esm.js.map +1 -0
  41. data/lib/feelin/js/node_modules/feelin/dist/interpreter.d.ts +26 -0
  42. data/lib/feelin/js/node_modules/feelin/dist/parser.d.ts +4 -0
  43. data/lib/feelin/js/node_modules/feelin/dist/temporal.d.ts +6 -0
  44. data/lib/feelin/js/node_modules/feelin/dist/types.d.ts +35 -0
  45. data/lib/feelin/js/node_modules/feelin/dist/utils.d.ts +12 -0
  46. data/lib/feelin/js/node_modules/feelin/package.json +63 -0
  47. data/lib/feelin/js/node_modules/lezer-feel/LICENSE +21 -0
  48. data/lib/feelin/js/node_modules/lezer-feel/README.md +94 -0
  49. data/lib/feelin/js/node_modules/lezer-feel/dist/index.cjs +1328 -0
  50. data/lib/feelin/js/node_modules/lezer-feel/dist/index.cjs.map +1 -0
  51. data/lib/feelin/js/node_modules/lezer-feel/dist/index.d.ts +32 -0
  52. data/lib/feelin/js/node_modules/lezer-feel/dist/index.js +1323 -0
  53. data/lib/feelin/js/node_modules/lezer-feel/dist/index.js.map +1 -0
  54. data/lib/feelin/js/node_modules/lezer-feel/package.json +61 -0
  55. data/lib/feelin/js/node_modules/luxon/LICENSE.md +7 -0
  56. data/lib/feelin/js/node_modules/luxon/README.md +55 -0
  57. data/lib/feelin/js/node_modules/luxon/build/amd/luxon.js +8623 -0
  58. data/lib/feelin/js/node_modules/luxon/build/amd/luxon.js.map +1 -0
  59. data/lib/feelin/js/node_modules/luxon/build/cjs-browser/luxon.js +8621 -0
  60. data/lib/feelin/js/node_modules/luxon/build/cjs-browser/luxon.js.map +1 -0
  61. data/lib/feelin/js/node_modules/luxon/build/es6/luxon.js +8011 -0
  62. data/lib/feelin/js/node_modules/luxon/build/es6/luxon.js.map +1 -0
  63. data/lib/feelin/js/node_modules/luxon/build/global/luxon.js +8626 -0
  64. data/lib/feelin/js/node_modules/luxon/build/global/luxon.js.map +1 -0
  65. data/lib/feelin/js/node_modules/luxon/build/global/luxon.min.js +1 -0
  66. data/lib/feelin/js/node_modules/luxon/build/global/luxon.min.js.map +1 -0
  67. data/lib/feelin/js/node_modules/luxon/build/node/luxon.js +7679 -0
  68. data/lib/feelin/js/node_modules/luxon/build/node/luxon.js.map +1 -0
  69. data/lib/feelin/js/node_modules/luxon/package.json +87 -0
  70. data/lib/feelin/js/node_modules/luxon/src/datetime.js +2566 -0
  71. data/lib/feelin/js/node_modules/luxon/src/duration.js +990 -0
  72. data/lib/feelin/js/node_modules/luxon/src/errors.js +61 -0
  73. data/lib/feelin/js/node_modules/luxon/src/impl/conversions.js +206 -0
  74. data/lib/feelin/js/node_modules/luxon/src/impl/diff.js +95 -0
  75. data/lib/feelin/js/node_modules/luxon/src/impl/digits.js +90 -0
  76. data/lib/feelin/js/node_modules/luxon/src/impl/english.js +233 -0
  77. data/lib/feelin/js/node_modules/luxon/src/impl/formats.js +176 -0
  78. data/lib/feelin/js/node_modules/luxon/src/impl/formatter.js +409 -0
  79. data/lib/feelin/js/node_modules/luxon/src/impl/invalid.js +14 -0
  80. data/lib/feelin/js/node_modules/luxon/src/impl/locale.js +554 -0
  81. data/lib/feelin/js/node_modules/luxon/src/impl/regexParser.js +335 -0
  82. data/lib/feelin/js/node_modules/luxon/src/impl/tokenParser.js +505 -0
  83. data/lib/feelin/js/node_modules/luxon/src/impl/util.js +316 -0
  84. data/lib/feelin/js/node_modules/luxon/src/impl/zoneUtil.js +34 -0
  85. data/lib/feelin/js/node_modules/luxon/src/info.js +205 -0
  86. data/lib/feelin/js/node_modules/luxon/src/interval.js +665 -0
  87. data/lib/feelin/js/node_modules/luxon/src/luxon.js +26 -0
  88. data/lib/feelin/js/node_modules/luxon/src/package.json +4 -0
  89. data/lib/feelin/js/node_modules/luxon/src/settings.js +180 -0
  90. data/lib/feelin/js/node_modules/luxon/src/zone.js +97 -0
  91. data/lib/feelin/js/node_modules/luxon/src/zones/IANAZone.js +231 -0
  92. data/lib/feelin/js/node_modules/luxon/src/zones/fixedOffsetZone.js +150 -0
  93. data/lib/feelin/js/node_modules/luxon/src/zones/invalidZone.js +53 -0
  94. data/lib/feelin/js/node_modules/luxon/src/zones/systemZone.js +61 -0
  95. data/lib/feelin/js/node_modules/min-dash/LICENSE +21 -0
  96. data/lib/feelin/js/node_modules/min-dash/README.md +38 -0
  97. data/lib/feelin/js/node_modules/min-dash/dist/array.d.ts +12 -0
  98. data/lib/feelin/js/node_modules/min-dash/dist/collection.d.ts +174 -0
  99. data/lib/feelin/js/node_modules/min-dash/dist/fn.d.ts +37 -0
  100. data/lib/feelin/js/node_modules/min-dash/dist/index.cjs +910 -0
  101. data/lib/feelin/js/node_modules/min-dash/dist/index.d.ts +5 -0
  102. data/lib/feelin/js/node_modules/min-dash/dist/index.esm.js +872 -0
  103. data/lib/feelin/js/node_modules/min-dash/dist/lang.d.ts +29 -0
  104. data/lib/feelin/js/node_modules/min-dash/dist/min-dash.js +916 -0
  105. data/lib/feelin/js/node_modules/min-dash/dist/min-dash.min.js +1 -0
  106. data/lib/feelin/js/node_modules/min-dash/dist/object.d.ts +112 -0
  107. data/lib/feelin/js/node_modules/min-dash/package.json +72 -0
  108. data/lib/feelin/js/package-lock.json +72 -0
  109. data/lib/feelin/js/package.json +5 -0
  110. data/lib/feelin/version.rb +3 -0
  111. data/lib/feelin.rb +63 -0
  112. data/spec/feelin/feelin_spec.rb +38 -0
  113. data/spec/spec_helper.rb +2 -0
  114. 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
+ }