effect 3.10.19 → 3.11.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 (167) hide show
  1. package/dist/cjs/BigDecimal.js +125 -24
  2. package/dist/cjs/BigDecimal.js.map +1 -1
  3. package/dist/cjs/Channel.js +44 -4
  4. package/dist/cjs/Channel.js.map +1 -1
  5. package/dist/cjs/Config.js +8 -1
  6. package/dist/cjs/Config.js.map +1 -1
  7. package/dist/cjs/Context.js +26 -1
  8. package/dist/cjs/Context.js.map +1 -1
  9. package/dist/cjs/Cron.js +75 -67
  10. package/dist/cjs/Cron.js.map +1 -1
  11. package/dist/cjs/DateTime.js +114 -664
  12. package/dist/cjs/DateTime.js.map +1 -1
  13. package/dist/cjs/Effect.js +82 -4
  14. package/dist/cjs/Effect.js.map +1 -1
  15. package/dist/cjs/Inspectable.js +8 -4
  16. package/dist/cjs/Inspectable.js.map +1 -1
  17. package/dist/cjs/JSONSchema.js.map +1 -1
  18. package/dist/cjs/Micro.js +1099 -1072
  19. package/dist/cjs/Micro.js.map +1 -1
  20. package/dist/cjs/STM.js.map +1 -1
  21. package/dist/cjs/Schema.js +57 -8
  22. package/dist/cjs/Schema.js.map +1 -1
  23. package/dist/cjs/Sink.js +9 -1
  24. package/dist/cjs/Sink.js.map +1 -1
  25. package/dist/cjs/Stream.js +25 -7
  26. package/dist/cjs/Stream.js.map +1 -1
  27. package/dist/cjs/Utils.js +7 -1
  28. package/dist/cjs/Utils.js.map +1 -1
  29. package/dist/cjs/internal/channel/channelExecutor.js +5 -9
  30. package/dist/cjs/internal/channel/channelExecutor.js.map +1 -1
  31. package/dist/cjs/internal/channel.js +156 -130
  32. package/dist/cjs/internal/channel.js.map +1 -1
  33. package/dist/cjs/internal/config.js +13 -4
  34. package/dist/cjs/internal/config.js.map +1 -1
  35. package/dist/cjs/internal/context.js +46 -3
  36. package/dist/cjs/internal/context.js.map +1 -1
  37. package/dist/cjs/internal/dateTime.js +747 -0
  38. package/dist/cjs/internal/dateTime.js.map +1 -0
  39. package/dist/cjs/internal/fiberRuntime.js +34 -11
  40. package/dist/cjs/internal/fiberRuntime.js.map +1 -1
  41. package/dist/cjs/internal/groupBy.js +9 -3
  42. package/dist/cjs/internal/groupBy.js.map +1 -1
  43. package/dist/cjs/internal/layer.js +1 -1
  44. package/dist/cjs/internal/layer.js.map +1 -1
  45. package/dist/cjs/internal/mailbox.js +1 -1
  46. package/dist/cjs/internal/mailbox.js.map +1 -1
  47. package/dist/cjs/internal/sink.js +25 -21
  48. package/dist/cjs/internal/sink.js.map +1 -1
  49. package/dist/cjs/internal/stream.js +70 -71
  50. package/dist/cjs/internal/stream.js.map +1 -1
  51. package/dist/cjs/internal/version.js +1 -1
  52. package/dist/cjs/internal/version.js.map +1 -1
  53. package/dist/dts/BigDecimal.d.ts +56 -1
  54. package/dist/dts/BigDecimal.d.ts.map +1 -1
  55. package/dist/dts/Channel.d.ts +66 -5
  56. package/dist/dts/Channel.d.ts.map +1 -1
  57. package/dist/dts/Config.d.ts +23 -1
  58. package/dist/dts/Config.d.ts.map +1 -1
  59. package/dist/dts/Context.d.ts +111 -0
  60. package/dist/dts/Context.d.ts.map +1 -1
  61. package/dist/dts/Cron.d.ts +15 -6
  62. package/dist/dts/Cron.d.ts.map +1 -1
  63. package/dist/dts/DateTime.d.ts +40 -49
  64. package/dist/dts/DateTime.d.ts.map +1 -1
  65. package/dist/dts/Effect.d.ts +88 -1
  66. package/dist/dts/Effect.d.ts.map +1 -1
  67. package/dist/dts/Inspectable.d.ts.map +1 -1
  68. package/dist/dts/JSONSchema.d.ts +1 -0
  69. package/dist/dts/JSONSchema.d.ts.map +1 -1
  70. package/dist/dts/Micro.d.ts +875 -872
  71. package/dist/dts/Micro.d.ts.map +1 -1
  72. package/dist/dts/STM.d.ts +2 -0
  73. package/dist/dts/STM.d.ts.map +1 -1
  74. package/dist/dts/Schema.d.ts +32 -0
  75. package/dist/dts/Schema.d.ts.map +1 -1
  76. package/dist/dts/Sink.d.ts +8 -0
  77. package/dist/dts/Sink.d.ts.map +1 -1
  78. package/dist/dts/Stream.d.ts +50 -32
  79. package/dist/dts/Stream.d.ts.map +1 -1
  80. package/dist/dts/Utils.d.ts +4 -0
  81. package/dist/dts/Utils.d.ts.map +1 -1
  82. package/dist/dts/internal/context.d.ts +1 -1
  83. package/dist/dts/internal/context.d.ts.map +1 -1
  84. package/dist/dts/internal/dateTime.d.ts +2 -0
  85. package/dist/dts/internal/dateTime.d.ts.map +1 -0
  86. package/dist/dts/internal/fiberRuntime.d.ts.map +1 -1
  87. package/dist/dts/internal/stream.d.ts.map +1 -1
  88. package/dist/esm/BigDecimal.js +119 -20
  89. package/dist/esm/BigDecimal.js.map +1 -1
  90. package/dist/esm/Channel.js +42 -2
  91. package/dist/esm/Channel.js.map +1 -1
  92. package/dist/esm/Config.js +7 -0
  93. package/dist/esm/Config.js.map +1 -1
  94. package/dist/esm/Context.js +25 -0
  95. package/dist/esm/Context.js.map +1 -1
  96. package/dist/esm/Cron.js +75 -67
  97. package/dist/esm/Cron.js.map +1 -1
  98. package/dist/esm/DateTime.js +112 -627
  99. package/dist/esm/DateTime.js.map +1 -1
  100. package/dist/esm/Effect.js +77 -0
  101. package/dist/esm/Effect.js.map +1 -1
  102. package/dist/esm/Inspectable.js +8 -4
  103. package/dist/esm/Inspectable.js.map +1 -1
  104. package/dist/esm/JSONSchema.js.map +1 -1
  105. package/dist/esm/Micro.js +1077 -1047
  106. package/dist/esm/Micro.js.map +1 -1
  107. package/dist/esm/STM.js.map +1 -1
  108. package/dist/esm/Schema.js +54 -0
  109. package/dist/esm/Schema.js.map +1 -1
  110. package/dist/esm/Sink.js +8 -0
  111. package/dist/esm/Sink.js.map +1 -1
  112. package/dist/esm/Stream.js +23 -5
  113. package/dist/esm/Stream.js.map +1 -1
  114. package/dist/esm/Utils.js +5 -0
  115. package/dist/esm/Utils.js.map +1 -1
  116. package/dist/esm/internal/channel/channelExecutor.js +5 -7
  117. package/dist/esm/internal/channel/channelExecutor.js.map +1 -1
  118. package/dist/esm/internal/channel.js +152 -129
  119. package/dist/esm/internal/channel.js.map +1 -1
  120. package/dist/esm/internal/config.js +11 -3
  121. package/dist/esm/internal/config.js.map +1 -1
  122. package/dist/esm/internal/context.js +42 -2
  123. package/dist/esm/internal/context.js.map +1 -1
  124. package/dist/esm/internal/dateTime.js +704 -0
  125. package/dist/esm/internal/dateTime.js.map +1 -0
  126. package/dist/esm/internal/fiberRuntime.js +31 -9
  127. package/dist/esm/internal/fiberRuntime.js.map +1 -1
  128. package/dist/esm/internal/groupBy.js +9 -3
  129. package/dist/esm/internal/groupBy.js.map +1 -1
  130. package/dist/esm/internal/layer.js +1 -1
  131. package/dist/esm/internal/layer.js.map +1 -1
  132. package/dist/esm/internal/mailbox.js +1 -1
  133. package/dist/esm/internal/mailbox.js.map +1 -1
  134. package/dist/esm/internal/sink.js +23 -20
  135. package/dist/esm/internal/sink.js.map +1 -1
  136. package/dist/esm/internal/stream.js +66 -69
  137. package/dist/esm/internal/stream.js.map +1 -1
  138. package/dist/esm/internal/version.js +1 -1
  139. package/dist/esm/internal/version.js.map +1 -1
  140. package/package.json +1 -1
  141. package/src/BigDecimal.ts +131 -21
  142. package/src/Channel.ts +81 -5
  143. package/src/Config.ts +24 -1
  144. package/src/Context.ts +119 -0
  145. package/src/Cron.ts +85 -68
  146. package/src/DateTime.ts +155 -757
  147. package/src/Effect.ts +340 -1
  148. package/src/Inspectable.ts +11 -7
  149. package/src/JSONSchema.ts +1 -0
  150. package/src/Micro.ts +2005 -1757
  151. package/src/STM.ts +2 -0
  152. package/src/Schema.ts +60 -0
  153. package/src/Sink.ts +11 -0
  154. package/src/Stream.ts +55 -44
  155. package/src/Utils.ts +8 -0
  156. package/src/internal/channel/channelExecutor.ts +37 -33
  157. package/src/internal/channel.ts +504 -467
  158. package/src/internal/config.ts +18 -6
  159. package/src/internal/context.ts +56 -4
  160. package/src/internal/dateTime.ts +1126 -0
  161. package/src/internal/fiberRuntime.ts +35 -16
  162. package/src/internal/groupBy.ts +13 -22
  163. package/src/internal/layer.ts +5 -8
  164. package/src/internal/mailbox.ts +6 -4
  165. package/src/internal/sink.ts +55 -35
  166. package/src/internal/stream.ts +299 -299
  167. package/src/internal/version.ts +1 -1
@@ -0,0 +1,704 @@
1
+ import { IllegalArgumentException } from "../Cause.js";
2
+ import * as Clock from "../Clock.js";
3
+ import * as Duration from "../Duration.js";
4
+ import * as Either from "../Either.js";
5
+ import * as Equal from "../Equal.js";
6
+ import * as equivalence from "../Equivalence.js";
7
+ import { dual, pipe } from "../Function.js";
8
+ import { globalValue } from "../GlobalValue.js";
9
+ import * as Hash from "../Hash.js";
10
+ import * as Inspectable from "../Inspectable.js";
11
+ import * as Option from "../Option.js";
12
+ import * as order from "../Order.js";
13
+ import { pipeArguments } from "../Pipeable.js";
14
+ import * as Predicate from "../Predicate.js";
15
+ import * as internalEffect from "./core-effect.js";
16
+ import * as core from "./core.js";
17
+ /** @internal */
18
+ export const TypeId = /*#__PURE__*/Symbol.for("effect/DateTime");
19
+ /** @internal */
20
+ export const TimeZoneTypeId = /*#__PURE__*/Symbol.for("effect/DateTime/TimeZone");
21
+ const Proto = {
22
+ [TypeId]: TypeId,
23
+ pipe() {
24
+ return pipeArguments(this, arguments);
25
+ },
26
+ [Inspectable.NodeInspectSymbol]() {
27
+ return this.toString();
28
+ },
29
+ toJSON() {
30
+ return toDateUtc(this).toJSON();
31
+ }
32
+ };
33
+ const ProtoUtc = {
34
+ ...Proto,
35
+ _tag: "Utc",
36
+ [Hash.symbol]() {
37
+ return Hash.cached(this, Hash.number(this.epochMillis));
38
+ },
39
+ [Equal.symbol](that) {
40
+ return isDateTime(that) && that._tag === "Utc" && this.epochMillis === that.epochMillis;
41
+ },
42
+ toString() {
43
+ return `DateTime.Utc(${toDateUtc(this).toJSON()})`;
44
+ }
45
+ };
46
+ const ProtoZoned = {
47
+ ...Proto,
48
+ _tag: "Zoned",
49
+ [Hash.symbol]() {
50
+ return pipe(Hash.number(this.epochMillis), Hash.combine(Hash.hash(this.zone)), Hash.cached(this));
51
+ },
52
+ [Equal.symbol](that) {
53
+ return isDateTime(that) && that._tag === "Zoned" && this.epochMillis === that.epochMillis && Equal.equals(this.zone, that.zone);
54
+ },
55
+ toString() {
56
+ return `DateTime.Zoned(${formatIsoZoned(this)})`;
57
+ }
58
+ };
59
+ const ProtoTimeZone = {
60
+ [TimeZoneTypeId]: TimeZoneTypeId,
61
+ [Inspectable.NodeInspectSymbol]() {
62
+ return this.toString();
63
+ }
64
+ };
65
+ const ProtoTimeZoneNamed = {
66
+ ...ProtoTimeZone,
67
+ _tag: "Named",
68
+ [Hash.symbol]() {
69
+ return Hash.cached(this, Hash.string(`Named:${this.id}`));
70
+ },
71
+ [Equal.symbol](that) {
72
+ return isTimeZone(that) && that._tag === "Named" && this.id === that.id;
73
+ },
74
+ toString() {
75
+ return `TimeZone.Named(${this.id})`;
76
+ },
77
+ toJSON() {
78
+ return {
79
+ _id: "TimeZone",
80
+ _tag: "Named",
81
+ id: this.id
82
+ };
83
+ }
84
+ };
85
+ const ProtoTimeZoneOffset = {
86
+ ...ProtoTimeZone,
87
+ _tag: "Offset",
88
+ [Hash.symbol]() {
89
+ return Hash.cached(this, Hash.string(`Offset:${this.offset}`));
90
+ },
91
+ [Equal.symbol](that) {
92
+ return isTimeZone(that) && that._tag === "Offset" && this.offset === that.offset;
93
+ },
94
+ toString() {
95
+ return `TimeZone.Offset(${offsetToString(this.offset)})`;
96
+ },
97
+ toJSON() {
98
+ return {
99
+ _id: "TimeZone",
100
+ _tag: "Offset",
101
+ offset: this.offset
102
+ };
103
+ }
104
+ };
105
+ /** @internal */
106
+ export const makeZonedProto = (epochMillis, zone, partsUtc) => {
107
+ const self = Object.create(ProtoZoned);
108
+ self.epochMillis = epochMillis;
109
+ self.zone = zone;
110
+ self.partsUtc = partsUtc;
111
+ return self;
112
+ };
113
+ // =============================================================================
114
+ // guards
115
+ // =============================================================================
116
+ /** @internal */
117
+ export const isDateTime = u => Predicate.hasProperty(u, TypeId);
118
+ const isDateTimeArgs = args => isDateTime(args[0]);
119
+ /** @internal */
120
+ export const isTimeZone = u => Predicate.hasProperty(u, TimeZoneTypeId);
121
+ /** @internal */
122
+ export const isTimeZoneOffset = u => isTimeZone(u) && u._tag === "Offset";
123
+ /** @internal */
124
+ export const isTimeZoneNamed = u => isTimeZone(u) && u._tag === "Named";
125
+ /** @internal */
126
+ export const isUtc = self => self._tag === "Utc";
127
+ /** @internal */
128
+ export const isZoned = self => self._tag === "Zoned";
129
+ // =============================================================================
130
+ // instances
131
+ // =============================================================================
132
+ /** @internal */
133
+ export const Equivalence = /*#__PURE__*/equivalence.make((a, b) => a.epochMillis === b.epochMillis);
134
+ /** @internal */
135
+ export const Order = /*#__PURE__*/order.make((self, that) => self.epochMillis < that.epochMillis ? -1 : self.epochMillis > that.epochMillis ? 1 : 0);
136
+ /** @internal */
137
+ export const clamp = /*#__PURE__*/order.clamp(Order);
138
+ // =============================================================================
139
+ // constructors
140
+ // =============================================================================
141
+ const makeUtc = epochMillis => {
142
+ const self = Object.create(ProtoUtc);
143
+ self.epochMillis = epochMillis;
144
+ return self;
145
+ };
146
+ /** @internal */
147
+ export const unsafeFromDate = date => {
148
+ const epochMillis = date.getTime();
149
+ if (Number.isNaN(epochMillis)) {
150
+ throw new IllegalArgumentException("Invalid date");
151
+ }
152
+ return makeUtc(epochMillis);
153
+ };
154
+ /** @internal */
155
+ export const unsafeMake = input => {
156
+ if (isDateTime(input)) {
157
+ return input;
158
+ } else if (input instanceof Date) {
159
+ return unsafeFromDate(input);
160
+ } else if (typeof input === "object") {
161
+ const date = new Date(0);
162
+ setPartsDate(date, input);
163
+ return unsafeFromDate(date);
164
+ }
165
+ return unsafeFromDate(new Date(input));
166
+ };
167
+ /** @internal */
168
+ export const unsafeMakeZoned = (input, options) => {
169
+ if (options?.timeZone === undefined && isDateTime(input) && isZoned(input)) {
170
+ return input;
171
+ }
172
+ const self = unsafeMake(input);
173
+ let zone;
174
+ if (options?.timeZone === undefined) {
175
+ const offset = new Date(self.epochMillis).getTimezoneOffset() * -60 * 1000;
176
+ zone = zoneMakeOffset(offset);
177
+ } else if (isTimeZone(options?.timeZone)) {
178
+ zone = options.timeZone;
179
+ } else if (typeof options?.timeZone === "number") {
180
+ zone = zoneMakeOffset(options.timeZone);
181
+ } else {
182
+ const parsedZone = zoneFromString(options.timeZone);
183
+ if (Option.isNone(parsedZone)) {
184
+ throw new IllegalArgumentException(`Invalid time zone: ${options.timeZone}`);
185
+ }
186
+ zone = parsedZone.value;
187
+ }
188
+ if (options?.adjustForTimeZone !== true) {
189
+ return makeZonedProto(self.epochMillis, zone, self.partsUtc);
190
+ }
191
+ return makeZonedFromAdjusted(self.epochMillis, zone);
192
+ };
193
+ /** @internal */
194
+ export const makeZoned = /*#__PURE__*/Option.liftThrowable(unsafeMakeZoned);
195
+ /** @internal */
196
+ export const make = /*#__PURE__*/Option.liftThrowable(unsafeMake);
197
+ const zonedStringRegex = /^(.{17,35})\[(.+)\]$/;
198
+ /** @internal */
199
+ export const makeZonedFromString = input => {
200
+ const match = zonedStringRegex.exec(input);
201
+ if (match === null) {
202
+ const offset = parseOffset(input);
203
+ return offset !== null ? makeZoned(input, {
204
+ timeZone: offset
205
+ }) : Option.none();
206
+ }
207
+ const [, isoString, timeZone] = match;
208
+ return makeZoned(isoString, {
209
+ timeZone
210
+ });
211
+ };
212
+ /** @internal */
213
+ export const now = /*#__PURE__*/core.map(Clock.currentTimeMillis, makeUtc);
214
+ /** @internal */
215
+ export const unsafeNow = () => makeUtc(Date.now());
216
+ // =============================================================================
217
+ // time zones
218
+ // =============================================================================
219
+ /** @internal */
220
+ export const setZone = /*#__PURE__*/dual(isDateTimeArgs, (self, zone, options) => options?.adjustForTimeZone === true ? makeZonedFromAdjusted(self.epochMillis, zone) : makeZonedProto(self.epochMillis, zone, self.partsUtc));
221
+ /** @internal */
222
+ export const setZoneOffset = /*#__PURE__*/dual(isDateTimeArgs, (self, offset, options) => setZone(self, zoneMakeOffset(offset), options));
223
+ const validZoneCache = /*#__PURE__*/globalValue("effect/DateTime/validZoneCache", () => new Map());
224
+ const formatOptions = {
225
+ day: "numeric",
226
+ month: "numeric",
227
+ year: "numeric",
228
+ hour: "numeric",
229
+ minute: "numeric",
230
+ second: "numeric",
231
+ timeZoneName: "longOffset",
232
+ fractionalSecondDigits: 3,
233
+ hourCycle: "h23"
234
+ };
235
+ const zoneMakeIntl = format => {
236
+ const zoneId = format.resolvedOptions().timeZone;
237
+ if (validZoneCache.has(zoneId)) {
238
+ return validZoneCache.get(zoneId);
239
+ }
240
+ const zone = Object.create(ProtoTimeZoneNamed);
241
+ zone.id = zoneId;
242
+ zone.format = format;
243
+ validZoneCache.set(zoneId, zone);
244
+ return zone;
245
+ };
246
+ /** @internal */
247
+ export const zoneUnsafeMakeNamed = zoneId => {
248
+ if (validZoneCache.has(zoneId)) {
249
+ return validZoneCache.get(zoneId);
250
+ }
251
+ try {
252
+ return zoneMakeIntl(new Intl.DateTimeFormat("en-US", {
253
+ ...formatOptions,
254
+ timeZone: zoneId
255
+ }));
256
+ } catch (_) {
257
+ throw new IllegalArgumentException(`Invalid time zone: ${zoneId}`);
258
+ }
259
+ };
260
+ /** @internal */
261
+ export const zoneMakeOffset = offset => {
262
+ const zone = Object.create(ProtoTimeZoneOffset);
263
+ zone.offset = offset;
264
+ return zone;
265
+ };
266
+ /** @internal */
267
+ export const zoneMakeNamed = /*#__PURE__*/Option.liftThrowable(zoneUnsafeMakeNamed);
268
+ /** @internal */
269
+ export const zoneMakeNamedEffect = zoneId => internalEffect.try_({
270
+ try: () => zoneUnsafeMakeNamed(zoneId),
271
+ catch: e => e
272
+ });
273
+ /** @internal */
274
+ export const zoneMakeLocal = () => zoneMakeIntl(new Intl.DateTimeFormat("en-US", formatOptions));
275
+ const offsetZoneRegex = /^(?:GMT|[+-])/;
276
+ /** @internal */
277
+ export const zoneFromString = zone => {
278
+ if (offsetZoneRegex.test(zone)) {
279
+ const offset = parseOffset(zone);
280
+ return offset === null ? Option.none() : Option.some(zoneMakeOffset(offset));
281
+ }
282
+ return zoneMakeNamed(zone);
283
+ };
284
+ /** @internal */
285
+ export const zoneToString = self => {
286
+ if (self._tag === "Offset") {
287
+ return offsetToString(self.offset);
288
+ }
289
+ return self.id;
290
+ };
291
+ /** @internal */
292
+ export const setZoneNamed = /*#__PURE__*/dual(isDateTimeArgs, (self, zoneId, options) => Option.map(zoneMakeNamed(zoneId), zone => setZone(self, zone, options)));
293
+ /** @internal */
294
+ export const unsafeSetZoneNamed = /*#__PURE__*/dual(isDateTimeArgs, (self, zoneId, options) => setZone(self, zoneUnsafeMakeNamed(zoneId), options));
295
+ // =============================================================================
296
+ // comparisons
297
+ // =============================================================================
298
+ /** @internal */
299
+ export const distance = /*#__PURE__*/dual(2, (self, other) => toEpochMillis(other) - toEpochMillis(self));
300
+ /** @internal */
301
+ export const distanceDurationEither = /*#__PURE__*/dual(2, (self, other) => {
302
+ const diffMillis = distance(self, other);
303
+ return diffMillis > 0 ? Either.right(Duration.millis(diffMillis)) : Either.left(Duration.millis(-diffMillis));
304
+ });
305
+ /** @internal */
306
+ export const distanceDuration = /*#__PURE__*/dual(2, (self, other) => Duration.millis(Math.abs(distance(self, other))));
307
+ /** @internal */
308
+ export const min = /*#__PURE__*/order.min(Order);
309
+ /** @internal */
310
+ export const max = /*#__PURE__*/order.max(Order);
311
+ /** @internal */
312
+ export const greaterThan = /*#__PURE__*/order.greaterThan(Order);
313
+ /** @internal */
314
+ export const greaterThanOrEqualTo = /*#__PURE__*/order.greaterThanOrEqualTo(Order);
315
+ /** @internal */
316
+ export const lessThan = /*#__PURE__*/order.lessThan(Order);
317
+ /** @internal */
318
+ export const lessThanOrEqualTo = /*#__PURE__*/order.lessThanOrEqualTo(Order);
319
+ /** @internal */
320
+ export const between = /*#__PURE__*/order.between(Order);
321
+ /** @internal */
322
+ export const isFuture = self => core.map(now, lessThan(self));
323
+ /** @internal */
324
+ export const unsafeIsFuture = self => lessThan(unsafeNow(), self);
325
+ /** @internal */
326
+ export const isPast = self => core.map(now, greaterThan(self));
327
+ /** @internal */
328
+ export const unsafeIsPast = self => greaterThan(unsafeNow(), self);
329
+ // =============================================================================
330
+ // conversions
331
+ // =============================================================================
332
+ /** @internal */
333
+ export const toDateUtc = self => new Date(self.epochMillis);
334
+ /** @internal */
335
+ export const toDate = self => {
336
+ if (self._tag === "Utc") {
337
+ return new Date(self.epochMillis);
338
+ } else if (self.zone._tag === "Offset") {
339
+ return new Date(self.epochMillis + self.zone.offset);
340
+ } else if (self.adjustedEpochMillis !== undefined) {
341
+ return new Date(self.adjustedEpochMillis);
342
+ }
343
+ const parts = self.zone.format.formatToParts(self.epochMillis).filter(_ => _.type !== "literal");
344
+ const date = new Date(0);
345
+ date.setUTCFullYear(Number(parts[2].value), Number(parts[0].value) - 1, Number(parts[1].value));
346
+ date.setUTCHours(Number(parts[3].value), Number(parts[4].value), Number(parts[5].value), Number(parts[6].value));
347
+ self.adjustedEpochMillis = date.getTime();
348
+ return date;
349
+ };
350
+ /** @internal */
351
+ export const zonedOffset = self => {
352
+ const date = toDate(self);
353
+ return date.getTime() - toEpochMillis(self);
354
+ };
355
+ const offsetToString = offset => {
356
+ const abs = Math.abs(offset);
357
+ const hours = Math.floor(abs / (60 * 60 * 1000));
358
+ const minutes = Math.round(abs % (60 * 60 * 1000) / (60 * 1000));
359
+ return `${offset < 0 ? "-" : "+"}${String(hours).padStart(2, "0")}:${String(minutes).padStart(2, "0")}`;
360
+ };
361
+ /** @internal */
362
+ export const zonedOffsetIso = self => offsetToString(zonedOffset(self));
363
+ /** @internal */
364
+ export const toEpochMillis = self => self.epochMillis;
365
+ /** @internal */
366
+ export const removeTime = self => withDate(self, date => {
367
+ date.setUTCHours(0, 0, 0, 0);
368
+ return makeUtc(date.getTime());
369
+ });
370
+ // =============================================================================
371
+ // parts
372
+ // =============================================================================
373
+ const dateToParts = date => ({
374
+ millis: date.getUTCMilliseconds(),
375
+ seconds: date.getUTCSeconds(),
376
+ minutes: date.getUTCMinutes(),
377
+ hours: date.getUTCHours(),
378
+ day: date.getUTCDate(),
379
+ weekDay: date.getUTCDay(),
380
+ month: date.getUTCMonth() + 1,
381
+ year: date.getUTCFullYear()
382
+ });
383
+ /** @internal */
384
+ export const toParts = self => {
385
+ if (self._tag === "Utc") {
386
+ return toPartsUtc(self);
387
+ } else if (self.partsAdjusted !== undefined) {
388
+ return self.partsAdjusted;
389
+ }
390
+ self.partsAdjusted = withDate(self, dateToParts);
391
+ return self.partsAdjusted;
392
+ };
393
+ /** @internal */
394
+ export const toPartsUtc = self => {
395
+ if (self.partsUtc !== undefined) {
396
+ return self.partsUtc;
397
+ }
398
+ self.partsUtc = withDateUtc(self, dateToParts);
399
+ return self.partsUtc;
400
+ };
401
+ /** @internal */
402
+ export const getPartUtc = /*#__PURE__*/dual(2, (self, part) => toPartsUtc(self)[part]);
403
+ /** @internal */
404
+ export const getPart = /*#__PURE__*/dual(2, (self, part) => toParts(self)[part]);
405
+ const setPartsDate = (date, parts) => {
406
+ if (parts.year !== undefined) {
407
+ date.setUTCFullYear(parts.year);
408
+ }
409
+ if (parts.month !== undefined) {
410
+ date.setUTCMonth(parts.month - 1);
411
+ }
412
+ if (parts.day !== undefined) {
413
+ date.setUTCDate(parts.day);
414
+ }
415
+ if (parts.weekDay !== undefined) {
416
+ const diff = parts.weekDay - date.getUTCDay();
417
+ date.setUTCDate(date.getUTCDate() + diff);
418
+ }
419
+ if (parts.hours !== undefined) {
420
+ date.setUTCHours(parts.hours);
421
+ }
422
+ if (parts.minutes !== undefined) {
423
+ date.setUTCMinutes(parts.minutes);
424
+ }
425
+ if (parts.seconds !== undefined) {
426
+ date.setUTCSeconds(parts.seconds);
427
+ }
428
+ if (parts.millis !== undefined) {
429
+ date.setUTCMilliseconds(parts.millis);
430
+ }
431
+ };
432
+ /** @internal */
433
+ export const setParts = /*#__PURE__*/dual(2, (self, parts) => mutate(self, date => setPartsDate(date, parts)));
434
+ /** @internal */
435
+ export const setPartsUtc = /*#__PURE__*/dual(2, (self, parts) => mutateUtc(self, date => setPartsDate(date, parts)));
436
+ // =============================================================================
437
+ // mapping
438
+ // =============================================================================
439
+ const makeZonedFromAdjusted = (adjustedMillis, zone) => {
440
+ const offset = zone._tag === "Offset" ? zone.offset : calculateNamedOffset(adjustedMillis, zone);
441
+ return makeZonedProto(adjustedMillis - offset, zone);
442
+ };
443
+ const offsetRegex = /([+-])(\d{2}):(\d{2})$/;
444
+ const parseOffset = offset => {
445
+ const match = offsetRegex.exec(offset);
446
+ if (match === null) {
447
+ return null;
448
+ }
449
+ const [, sign, hours, minutes] = match;
450
+ return (sign === "+" ? 1 : -1) * (Number(hours) * 60 + Number(minutes)) * 60 * 1000;
451
+ };
452
+ const calculateNamedOffset = (adjustedMillis, zone) => {
453
+ const offset = zone.format.formatToParts(adjustedMillis).find(_ => _.type === "timeZoneName")?.value ?? "";
454
+ if (offset === "GMT") {
455
+ return 0;
456
+ }
457
+ const result = parseOffset(offset);
458
+ if (result === null) {
459
+ // fallback to using the adjusted date
460
+ return zonedOffset(makeZonedProto(adjustedMillis, zone));
461
+ }
462
+ return result;
463
+ };
464
+ /** @internal */
465
+ export const mutate = /*#__PURE__*/dual(2, (self, f) => {
466
+ if (self._tag === "Utc") {
467
+ const date = toDateUtc(self);
468
+ f(date);
469
+ return makeUtc(date.getTime());
470
+ }
471
+ const adjustedDate = toDate(self);
472
+ const newAdjustedDate = new Date(adjustedDate.getTime());
473
+ f(newAdjustedDate);
474
+ return makeZonedFromAdjusted(newAdjustedDate.getTime(), self.zone);
475
+ });
476
+ /** @internal */
477
+ export const mutateUtc = /*#__PURE__*/dual(2, (self, f) => mapEpochMillis(self, millis => {
478
+ const date = new Date(millis);
479
+ f(date);
480
+ return date.getTime();
481
+ }));
482
+ /** @internal */
483
+ export const mapEpochMillis = /*#__PURE__*/dual(2, (self, f) => {
484
+ const millis = f(toEpochMillis(self));
485
+ return self._tag === "Utc" ? makeUtc(millis) : makeZonedProto(millis, self.zone);
486
+ });
487
+ /** @internal */
488
+ export const withDate = /*#__PURE__*/dual(2, (self, f) => f(toDate(self)));
489
+ /** @internal */
490
+ export const withDateUtc = /*#__PURE__*/dual(2, (self, f) => f(toDateUtc(self)));
491
+ /** @internal */
492
+ export const match = /*#__PURE__*/dual(2, (self, options) => self._tag === "Utc" ? options.onUtc(self) : options.onZoned(self));
493
+ // =============================================================================
494
+ // math
495
+ // =============================================================================
496
+ /** @internal */
497
+ export const addDuration = /*#__PURE__*/dual(2, (self, duration) => mapEpochMillis(self, millis => millis + Duration.toMillis(duration)));
498
+ /** @internal */
499
+ export const subtractDuration = /*#__PURE__*/dual(2, (self, duration) => mapEpochMillis(self, millis => millis - Duration.toMillis(duration)));
500
+ const addMillis = (date, amount) => {
501
+ date.setTime(date.getTime() + amount);
502
+ };
503
+ /** @internal */
504
+ export const add = /*#__PURE__*/dual(2, (self, parts) => mutate(self, date => {
505
+ if (parts.millis) {
506
+ addMillis(date, parts.millis);
507
+ }
508
+ if (parts.seconds) {
509
+ addMillis(date, parts.seconds * 1000);
510
+ }
511
+ if (parts.minutes) {
512
+ addMillis(date, parts.minutes * 60 * 1000);
513
+ }
514
+ if (parts.hours) {
515
+ addMillis(date, parts.hours * 60 * 60 * 1000);
516
+ }
517
+ if (parts.days) {
518
+ date.setUTCDate(date.getUTCDate() + parts.days);
519
+ }
520
+ if (parts.weeks) {
521
+ date.setUTCDate(date.getUTCDate() + parts.weeks * 7);
522
+ }
523
+ if (parts.months) {
524
+ const day = date.getUTCDate();
525
+ date.setUTCMonth(date.getUTCMonth() + parts.months + 1, 0);
526
+ if (day < date.getUTCDate()) {
527
+ date.setUTCDate(day);
528
+ }
529
+ }
530
+ if (parts.years) {
531
+ const day = date.getUTCDate();
532
+ const month = date.getUTCMonth();
533
+ date.setUTCFullYear(date.getUTCFullYear() + parts.years, month + 1, 0);
534
+ if (day < date.getUTCDate()) {
535
+ date.setUTCDate(day);
536
+ }
537
+ }
538
+ }));
539
+ /** @internal */
540
+ export const subtract = /*#__PURE__*/dual(2, (self, parts) => {
541
+ const newParts = {};
542
+ for (const key in parts) {
543
+ newParts[key] = -1 * parts[key];
544
+ }
545
+ return add(self, newParts);
546
+ });
547
+ const startOfDate = (date, part, options) => {
548
+ switch (part) {
549
+ case "second":
550
+ {
551
+ date.setUTCMilliseconds(0);
552
+ break;
553
+ }
554
+ case "minute":
555
+ {
556
+ date.setUTCSeconds(0, 0);
557
+ break;
558
+ }
559
+ case "hour":
560
+ {
561
+ date.setUTCMinutes(0, 0, 0);
562
+ break;
563
+ }
564
+ case "day":
565
+ {
566
+ date.setUTCHours(0, 0, 0, 0);
567
+ break;
568
+ }
569
+ case "week":
570
+ {
571
+ const weekStartsOn = options?.weekStartsOn ?? 0;
572
+ const day = date.getUTCDay();
573
+ const diff = (day - weekStartsOn + 7) % 7;
574
+ date.setUTCDate(date.getUTCDate() - diff);
575
+ date.setUTCHours(0, 0, 0, 0);
576
+ break;
577
+ }
578
+ case "month":
579
+ {
580
+ date.setUTCDate(1);
581
+ date.setUTCHours(0, 0, 0, 0);
582
+ break;
583
+ }
584
+ case "year":
585
+ {
586
+ date.setUTCMonth(0, 1);
587
+ date.setUTCHours(0, 0, 0, 0);
588
+ break;
589
+ }
590
+ }
591
+ };
592
+ /** @internal */
593
+ export const startOf = /*#__PURE__*/dual(isDateTimeArgs, (self, part, options) => mutate(self, date => startOfDate(date, part, options)));
594
+ const endOfDate = (date, part, options) => {
595
+ switch (part) {
596
+ case "second":
597
+ {
598
+ date.setUTCMilliseconds(999);
599
+ break;
600
+ }
601
+ case "minute":
602
+ {
603
+ date.setUTCSeconds(59, 999);
604
+ break;
605
+ }
606
+ case "hour":
607
+ {
608
+ date.setUTCMinutes(59, 59, 999);
609
+ break;
610
+ }
611
+ case "day":
612
+ {
613
+ date.setUTCHours(23, 59, 59, 999);
614
+ break;
615
+ }
616
+ case "week":
617
+ {
618
+ const weekStartsOn = options?.weekStartsOn ?? 0;
619
+ const day = date.getUTCDay();
620
+ const diff = (day - weekStartsOn + 7) % 7;
621
+ date.setUTCDate(date.getUTCDate() - diff + 6);
622
+ date.setUTCHours(23, 59, 59, 999);
623
+ break;
624
+ }
625
+ case "month":
626
+ {
627
+ date.setUTCMonth(date.getUTCMonth() + 1, 0);
628
+ date.setUTCHours(23, 59, 59, 999);
629
+ break;
630
+ }
631
+ case "year":
632
+ {
633
+ date.setUTCMonth(11, 31);
634
+ date.setUTCHours(23, 59, 59, 999);
635
+ break;
636
+ }
637
+ }
638
+ };
639
+ /** @internal */
640
+ export const endOf = /*#__PURE__*/dual(isDateTimeArgs, (self, part, options) => mutate(self, date => endOfDate(date, part, options)));
641
+ /** @internal */
642
+ export const nearest = /*#__PURE__*/dual(isDateTimeArgs, (self, part, options) => mutate(self, date => {
643
+ if (part === "milli") return;
644
+ const millis = date.getTime();
645
+ const start = new Date(millis);
646
+ startOfDate(start, part, options);
647
+ const startMillis = start.getTime();
648
+ const end = new Date(millis);
649
+ endOfDate(end, part, options);
650
+ const endMillis = end.getTime() + 1;
651
+ const diffStart = millis - startMillis;
652
+ const diffEnd = endMillis - millis;
653
+ if (diffStart < diffEnd) {
654
+ date.setTime(startMillis);
655
+ } else {
656
+ date.setTime(endMillis);
657
+ }
658
+ }));
659
+ // =============================================================================
660
+ // formatting
661
+ // =============================================================================
662
+ const intlTimeZone = self => {
663
+ if (self._tag === "Named") {
664
+ return self.id;
665
+ }
666
+ return offsetToString(self.offset);
667
+ };
668
+ /** @internal */
669
+ export const format = /*#__PURE__*/dual(isDateTimeArgs, (self, options) => {
670
+ try {
671
+ return new Intl.DateTimeFormat(options?.locale, {
672
+ timeZone: self._tag === "Utc" ? "UTC" : intlTimeZone(self.zone),
673
+ ...options
674
+ }).format(self.epochMillis);
675
+ } catch (_) {
676
+ return new Intl.DateTimeFormat(options?.locale, {
677
+ timeZone: "UTC",
678
+ ...options
679
+ }).format(toDate(self));
680
+ }
681
+ });
682
+ /** @internal */
683
+ export const formatLocal = /*#__PURE__*/dual(isDateTimeArgs, (self, options) => new Intl.DateTimeFormat(options?.locale, options).format(self.epochMillis));
684
+ /** @internal */
685
+ export const formatUtc = /*#__PURE__*/dual(isDateTimeArgs, (self, options) => new Intl.DateTimeFormat(options?.locale, {
686
+ ...options,
687
+ timeZone: "UTC"
688
+ }).format(self.epochMillis));
689
+ /** @internal */
690
+ export const formatIntl = /*#__PURE__*/dual(2, (self, format) => format.format(self.epochMillis));
691
+ /** @internal */
692
+ export const formatIso = self => toDateUtc(self).toISOString();
693
+ /** @internal */
694
+ export const formatIsoDate = self => toDate(self).toISOString().slice(0, 10);
695
+ /** @internal */
696
+ export const formatIsoDateUtc = self => toDateUtc(self).toISOString().slice(0, 10);
697
+ /** @internal */
698
+ export const formatIsoOffset = self => {
699
+ const date = toDate(self);
700
+ return self._tag === "Utc" ? date.toISOString() : `${date.toISOString().slice(0, -1)}${zonedOffsetIso(self)}`;
701
+ };
702
+ /** @internal */
703
+ export const formatIsoZoned = self => self.zone._tag === "Offset" ? formatIsoOffset(self) : `${formatIsoOffset(self)}[${self.zone.id}]`;
704
+ //# sourceMappingURL=dateTime.js.map