effect 4.0.0-beta.6 → 4.0.0-beta.8

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 (283) hide show
  1. package/dist/Cache.d.ts +2 -2
  2. package/dist/Cache.d.ts.map +1 -1
  3. package/dist/Cache.js +1 -1
  4. package/dist/Cache.js.map +1 -1
  5. package/dist/Combiner.d.ts +280 -13
  6. package/dist/Combiner.d.ts.map +1 -1
  7. package/dist/Combiner.js +198 -7
  8. package/dist/Combiner.js.map +1 -1
  9. package/dist/Config.d.ts +2 -2
  10. package/dist/Config.js +3 -3
  11. package/dist/Config.js.map +1 -1
  12. package/dist/DateTime.d.ts +23 -161
  13. package/dist/DateTime.d.ts.map +1 -1
  14. package/dist/DateTime.js +6 -51
  15. package/dist/DateTime.js.map +1 -1
  16. package/dist/Duration.d.ts +12 -12
  17. package/dist/Duration.d.ts.map +1 -1
  18. package/dist/Duration.js +12 -12
  19. package/dist/Duration.js.map +1 -1
  20. package/dist/Effect.d.ts +13 -13
  21. package/dist/Effect.d.ts.map +1 -1
  22. package/dist/Effect.js +1 -1
  23. package/dist/Effect.js.map +1 -1
  24. package/dist/Formatter.d.ts +131 -47
  25. package/dist/Formatter.d.ts.map +1 -1
  26. package/dist/Formatter.js +228 -50
  27. package/dist/Formatter.js.map +1 -1
  28. package/dist/JsonSchema.d.ts +299 -10
  29. package/dist/JsonSchema.d.ts.map +1 -1
  30. package/dist/JsonSchema.js +323 -4
  31. package/dist/JsonSchema.js.map +1 -1
  32. package/dist/LayerMap.d.ts +4 -4
  33. package/dist/LayerMap.d.ts.map +1 -1
  34. package/dist/LogLevel.d.ts +27 -0
  35. package/dist/LogLevel.d.ts.map +1 -1
  36. package/dist/LogLevel.js +28 -100
  37. package/dist/LogLevel.js.map +1 -1
  38. package/dist/Logger.d.ts +4 -4
  39. package/dist/Logger.d.ts.map +1 -1
  40. package/dist/Metric.d.ts +2 -2
  41. package/dist/Metric.d.ts.map +1 -1
  42. package/dist/Metric.js +1 -1
  43. package/dist/Metric.js.map +1 -1
  44. package/dist/Pool.d.ts +1 -1
  45. package/dist/Pool.d.ts.map +1 -1
  46. package/dist/Pool.js +1 -1
  47. package/dist/Pool.js.map +1 -1
  48. package/dist/Random.d.ts +1 -1
  49. package/dist/Random.d.ts.map +1 -1
  50. package/dist/Random.js +3 -12
  51. package/dist/Random.js.map +1 -1
  52. package/dist/RcMap.d.ts +2 -2
  53. package/dist/RcMap.d.ts.map +1 -1
  54. package/dist/RcMap.js +1 -1
  55. package/dist/RcMap.js.map +1 -1
  56. package/dist/RcRef.d.ts +1 -1
  57. package/dist/RcRef.d.ts.map +1 -1
  58. package/dist/Reducer.d.ts +166 -7
  59. package/dist/Reducer.d.ts.map +1 -1
  60. package/dist/Reducer.js +135 -1
  61. package/dist/Reducer.js.map +1 -1
  62. package/dist/RequestResolver.d.ts +6 -6
  63. package/dist/RequestResolver.d.ts.map +1 -1
  64. package/dist/RequestResolver.js.map +1 -1
  65. package/dist/Schedule.d.ts +20 -11
  66. package/dist/Schedule.d.ts.map +1 -1
  67. package/dist/Schedule.js +23 -9
  68. package/dist/Schedule.js.map +1 -1
  69. package/dist/Schema.d.ts +4 -4
  70. package/dist/Schema.d.ts.map +1 -1
  71. package/dist/ScopedCache.d.ts +2 -2
  72. package/dist/ScopedCache.d.ts.map +1 -1
  73. package/dist/ScopedCache.js +1 -1
  74. package/dist/ScopedCache.js.map +1 -1
  75. package/dist/Stream.d.ts +19 -19
  76. package/dist/Stream.d.ts.map +1 -1
  77. package/dist/Stream.js +3 -3
  78. package/dist/Stream.js.map +1 -1
  79. package/dist/index.d.ts +258 -0
  80. package/dist/index.d.ts.map +1 -1
  81. package/dist/index.js +258 -0
  82. package/dist/index.js.map +1 -1
  83. package/dist/internal/dateTime.js +3 -11
  84. package/dist/internal/dateTime.js.map +1 -1
  85. package/dist/internal/effect.js +2 -2
  86. package/dist/internal/effect.js.map +1 -1
  87. package/dist/internal/random.d.ts +2 -0
  88. package/dist/internal/random.d.ts.map +1 -0
  89. package/dist/internal/random.js +13 -0
  90. package/dist/internal/random.js.map +1 -0
  91. package/dist/internal/rcRef.js +1 -1
  92. package/dist/internal/rcRef.js.map +1 -1
  93. package/dist/testing/TestClock.d.ts +4 -4
  94. package/dist/testing/TestClock.d.ts.map +1 -1
  95. package/dist/testing/TestClock.js +1 -1
  96. package/dist/testing/TestClock.js.map +1 -1
  97. package/dist/testing/TestSchema.d.ts +6 -6
  98. package/dist/testing/TestSchema.d.ts.map +1 -1
  99. package/dist/unstable/ai/AiError.d.ts +10 -10
  100. package/dist/unstable/ai/AiError.d.ts.map +1 -1
  101. package/dist/unstable/ai/Chat.d.ts +3 -3
  102. package/dist/unstable/ai/Chat.d.ts.map +1 -1
  103. package/dist/unstable/ai/Chat.js +2 -2
  104. package/dist/unstable/ai/Chat.js.map +1 -1
  105. package/dist/unstable/ai/LanguageModel.d.ts +2 -2
  106. package/dist/unstable/ai/LanguageModel.d.ts.map +1 -1
  107. package/dist/unstable/ai/McpServer.d.ts +1 -1
  108. package/dist/unstable/ai/McpServer.d.ts.map +1 -1
  109. package/dist/unstable/ai/McpServer.js.map +1 -1
  110. package/dist/unstable/ai/Prompt.d.ts +17 -17
  111. package/dist/unstable/ai/Prompt.d.ts.map +1 -1
  112. package/dist/unstable/ai/Response.d.ts +23 -23
  113. package/dist/unstable/ai/Response.d.ts.map +1 -1
  114. package/dist/unstable/ai/Response.js +1 -1
  115. package/dist/unstable/ai/Response.js.map +1 -1
  116. package/dist/unstable/cluster/ClusterCron.d.ts +1 -1
  117. package/dist/unstable/cluster/ClusterCron.d.ts.map +1 -1
  118. package/dist/unstable/cluster/ClusterCron.js +1 -1
  119. package/dist/unstable/cluster/ClusterCron.js.map +1 -1
  120. package/dist/unstable/cluster/Entity.d.ts +3 -3
  121. package/dist/unstable/cluster/Entity.d.ts.map +1 -1
  122. package/dist/unstable/cluster/EntityResource.d.ts +2 -2
  123. package/dist/unstable/cluster/EntityResource.d.ts.map +1 -1
  124. package/dist/unstable/cluster/K8sHttpClient.js +1 -1
  125. package/dist/unstable/cluster/K8sHttpClient.js.map +1 -1
  126. package/dist/unstable/cluster/MessageStorage.js.map +1 -1
  127. package/dist/unstable/cluster/Sharding.d.ts +2 -2
  128. package/dist/unstable/cluster/Sharding.d.ts.map +1 -1
  129. package/dist/unstable/cluster/Sharding.js +1 -1
  130. package/dist/unstable/cluster/Sharding.js.map +1 -1
  131. package/dist/unstable/cluster/ShardingConfig.d.ts +21 -21
  132. package/dist/unstable/cluster/ShardingConfig.d.ts.map +1 -1
  133. package/dist/unstable/cluster/ShardingConfig.js.map +1 -1
  134. package/dist/unstable/cluster/SqlRunnerStorage.js +1 -1
  135. package/dist/unstable/cluster/SqlRunnerStorage.js.map +1 -1
  136. package/dist/unstable/cluster/internal/entityManager.js +1 -1
  137. package/dist/unstable/cluster/internal/entityManager.js.map +1 -1
  138. package/dist/unstable/encoding/Sse.d.ts +2 -2
  139. package/dist/unstable/encoding/Sse.d.ts.map +1 -1
  140. package/dist/unstable/encoding/Sse.js.map +1 -1
  141. package/dist/unstable/http/Cookies.d.ts +1 -1
  142. package/dist/unstable/http/Cookies.d.ts.map +1 -1
  143. package/dist/unstable/http/Cookies.js +2 -2
  144. package/dist/unstable/http/Cookies.js.map +1 -1
  145. package/dist/unstable/http/HttpClient.d.ts +4 -4
  146. package/dist/unstable/http/HttpClient.d.ts.map +1 -1
  147. package/dist/unstable/http/HttpClientRequest.d.ts +11 -11
  148. package/dist/unstable/http/HttpClientRequest.d.ts.map +1 -1
  149. package/dist/unstable/http/HttpClientRequest.js +8 -1
  150. package/dist/unstable/http/HttpClientRequest.js.map +1 -1
  151. package/dist/unstable/http/HttpMethod.d.ts +4 -4
  152. package/dist/unstable/http/HttpMethod.d.ts.map +1 -1
  153. package/dist/unstable/http/HttpMethod.js +3 -3
  154. package/dist/unstable/http/HttpMethod.js.map +1 -1
  155. package/dist/unstable/observability/Otlp.d.ts +12 -12
  156. package/dist/unstable/observability/Otlp.d.ts.map +1 -1
  157. package/dist/unstable/observability/OtlpExporter.d.ts +2 -2
  158. package/dist/unstable/observability/OtlpExporter.d.ts.map +1 -1
  159. package/dist/unstable/observability/OtlpExporter.js +1 -1
  160. package/dist/unstable/observability/OtlpExporter.js.map +1 -1
  161. package/dist/unstable/observability/OtlpLogger.d.ts +4 -4
  162. package/dist/unstable/observability/OtlpLogger.d.ts.map +1 -1
  163. package/dist/unstable/observability/OtlpMetrics.d.ts +4 -4
  164. package/dist/unstable/observability/OtlpMetrics.d.ts.map +1 -1
  165. package/dist/unstable/observability/OtlpTracer.d.ts +4 -4
  166. package/dist/unstable/observability/OtlpTracer.d.ts.map +1 -1
  167. package/dist/unstable/persistence/Persistable.d.ts +2 -2
  168. package/dist/unstable/persistence/Persistable.d.ts.map +1 -1
  169. package/dist/unstable/persistence/PersistedQueue.d.ts +12 -12
  170. package/dist/unstable/persistence/PersistedQueue.d.ts.map +1 -1
  171. package/dist/unstable/persistence/PersistedQueue.js +6 -6
  172. package/dist/unstable/persistence/PersistedQueue.js.map +1 -1
  173. package/dist/unstable/persistence/Persistence.d.ts +1 -1
  174. package/dist/unstable/persistence/Persistence.d.ts.map +1 -1
  175. package/dist/unstable/persistence/Persistence.js +2 -2
  176. package/dist/unstable/persistence/Persistence.js.map +1 -1
  177. package/dist/unstable/persistence/RateLimiter.d.ts +3 -3
  178. package/dist/unstable/persistence/RateLimiter.d.ts.map +1 -1
  179. package/dist/unstable/persistence/RateLimiter.js +1 -1
  180. package/dist/unstable/persistence/RateLimiter.js.map +1 -1
  181. package/dist/unstable/process/ChildProcess.d.ts +2 -2
  182. package/dist/unstable/process/ChildProcess.d.ts.map +1 -1
  183. package/dist/unstable/reactivity/Atom.d.ts +6 -6
  184. package/dist/unstable/reactivity/Atom.d.ts.map +1 -1
  185. package/dist/unstable/reactivity/Atom.js +3 -3
  186. package/dist/unstable/reactivity/Atom.js.map +1 -1
  187. package/dist/unstable/reactivity/AtomHttpApi.d.ts +1 -1
  188. package/dist/unstable/reactivity/AtomHttpApi.d.ts.map +1 -1
  189. package/dist/unstable/reactivity/AtomHttpApi.js +1 -1
  190. package/dist/unstable/reactivity/AtomHttpApi.js.map +1 -1
  191. package/dist/unstable/reactivity/AtomRpc.d.ts +1 -1
  192. package/dist/unstable/reactivity/AtomRpc.d.ts.map +1 -1
  193. package/dist/unstable/reactivity/AtomRpc.js +1 -1
  194. package/dist/unstable/reactivity/AtomRpc.js.map +1 -1
  195. package/dist/unstable/rpc/Rpc.d.ts +2 -2
  196. package/dist/unstable/rpc/Rpc.d.ts.map +1 -1
  197. package/dist/unstable/rpc/RpcClient.d.ts +5 -26
  198. package/dist/unstable/rpc/RpcClient.d.ts.map +1 -1
  199. package/dist/unstable/rpc/RpcClient.js +3 -11
  200. package/dist/unstable/rpc/RpcClient.js.map +1 -1
  201. package/dist/unstable/socket/Socket.d.ts +4 -4
  202. package/dist/unstable/socket/Socket.d.ts.map +1 -1
  203. package/dist/unstable/sql/SqlModel.d.ts +2 -2
  204. package/dist/unstable/sql/SqlModel.d.ts.map +1 -1
  205. package/dist/unstable/sql/SqlModel.js +3 -3
  206. package/dist/unstable/sql/SqlModel.js.map +1 -1
  207. package/dist/unstable/sql/SqlSchema.d.ts +16 -5
  208. package/dist/unstable/sql/SqlSchema.d.ts.map +1 -1
  209. package/dist/unstable/sql/SqlSchema.js +17 -7
  210. package/dist/unstable/sql/SqlSchema.js.map +1 -1
  211. package/dist/unstable/workflow/DurableClock.d.ts +3 -3
  212. package/dist/unstable/workflow/DurableClock.d.ts.map +1 -1
  213. package/dist/unstable/workflow/DurableClock.js +3 -3
  214. package/dist/unstable/workflow/DurableClock.js.map +1 -1
  215. package/package.json +1 -1
  216. package/src/Cache.ts +3 -3
  217. package/src/Combiner.ts +280 -13
  218. package/src/Config.ts +3 -3
  219. package/src/DateTime.ts +24 -164
  220. package/src/Duration.ts +15 -15
  221. package/src/Effect.ts +15 -15
  222. package/src/Formatter.ts +252 -50
  223. package/src/JsonSchema.ts +383 -10
  224. package/src/LayerMap.ts +5 -5
  225. package/src/LogLevel.ts +31 -0
  226. package/src/Logger.ts +5 -5
  227. package/src/Metric.ts +4 -4
  228. package/src/Pool.ts +4 -4
  229. package/src/Random.ts +5 -14
  230. package/src/RcMap.ts +5 -5
  231. package/src/RcRef.ts +1 -1
  232. package/src/Reducer.ts +166 -7
  233. package/src/RequestResolver.ts +9 -9
  234. package/src/Schedule.ts +44 -25
  235. package/src/Schema.ts +4 -4
  236. package/src/ScopedCache.ts +3 -3
  237. package/src/Stream.ts +34 -34
  238. package/src/index.ts +258 -0
  239. package/src/internal/dateTime.ts +9 -30
  240. package/src/internal/effect.ts +21 -21
  241. package/src/internal/random.ts +20 -0
  242. package/src/internal/rcRef.ts +2 -2
  243. package/src/testing/TestClock.ts +5 -5
  244. package/src/testing/TestSchema.ts +8 -8
  245. package/src/unstable/ai/AiError.ts +1 -1
  246. package/src/unstable/ai/Chat.ts +10 -10
  247. package/src/unstable/ai/LanguageModel.ts +3 -3
  248. package/src/unstable/ai/McpServer.ts +2 -2
  249. package/src/unstable/ai/Prompt.ts +17 -17
  250. package/src/unstable/ai/Response.ts +23 -23
  251. package/src/unstable/cluster/ClusterCron.ts +2 -2
  252. package/src/unstable/cluster/Entity.ts +5 -5
  253. package/src/unstable/cluster/EntityResource.ts +4 -4
  254. package/src/unstable/cluster/K8sHttpClient.ts +1 -1
  255. package/src/unstable/cluster/MessageStorage.ts +1 -4
  256. package/src/unstable/cluster/Sharding.ts +3 -3
  257. package/src/unstable/cluster/ShardingConfig.ts +10 -11
  258. package/src/unstable/cluster/SqlRunnerStorage.ts +1 -1
  259. package/src/unstable/cluster/internal/entityManager.ts +3 -3
  260. package/src/unstable/encoding/Sse.ts +2 -4
  261. package/src/unstable/http/Cookies.ts +3 -3
  262. package/src/unstable/http/HttpClient.ts +4 -4
  263. package/src/unstable/http/HttpClientRequest.ts +15 -11
  264. package/src/unstable/http/HttpMethod.ts +16 -4
  265. package/src/unstable/observability/Otlp.ts +12 -12
  266. package/src/unstable/observability/OtlpExporter.ts +3 -3
  267. package/src/unstable/observability/OtlpLogger.ts +4 -4
  268. package/src/unstable/observability/OtlpMetrics.ts +4 -4
  269. package/src/unstable/observability/OtlpTracer.ts +4 -4
  270. package/src/unstable/persistence/Persistable.ts +2 -2
  271. package/src/unstable/persistence/PersistedQueue.ts +18 -18
  272. package/src/unstable/persistence/Persistence.ts +3 -3
  273. package/src/unstable/persistence/RateLimiter.ts +4 -4
  274. package/src/unstable/process/ChildProcess.ts +2 -2
  275. package/src/unstable/reactivity/Atom.ts +13 -13
  276. package/src/unstable/reactivity/AtomHttpApi.ts +3 -3
  277. package/src/unstable/reactivity/AtomRpc.ts +3 -3
  278. package/src/unstable/rpc/Rpc.ts +3 -3
  279. package/src/unstable/rpc/RpcClient.ts +8 -51
  280. package/src/unstable/socket/Socket.ts +4 -4
  281. package/src/unstable/sql/SqlModel.ts +5 -5
  282. package/src/unstable/sql/SqlSchema.ts +41 -25
  283. package/src/unstable/workflow/DurableClock.ts +8 -8
package/src/Duration.ts CHANGED
@@ -90,7 +90,7 @@ export type Unit =
90
90
  * @since 2.0.0
91
91
  * @category models
92
92
  */
93
- export type DurationInput =
93
+ export type Input =
94
94
  | Duration
95
95
  | number // millis
96
96
  | bigint // nanos
@@ -100,23 +100,23 @@ export type DurationInput =
100
100
  const DURATION_REGEXP = /^(-?\d+(?:\.\d+)?)\s+(nanos?|micros?|millis?|seconds?|minutes?|hours?|days?|weeks?)$/
101
101
 
102
102
  /**
103
- * Decodes a `DurationInput` into a `Duration`.
103
+ * Decodes a `Duration.Input` into a `Duration`.
104
104
  *
105
- * If the input is not a valid `DurationInput`, it throws an error.
105
+ * If the input is not a valid `Duration.Input`, it throws an error.
106
106
  *
107
107
  * @example
108
108
  * ```ts
109
109
  * import { Duration } from "effect"
110
110
  *
111
- * const duration1 = Duration.fromDurationInputUnsafe(1000) // 1000 milliseconds
112
- * const duration2 = Duration.fromDurationInputUnsafe("5 seconds")
113
- * const duration3 = Duration.fromDurationInputUnsafe([2, 500_000_000]) // 2 seconds and 500ms
111
+ * const duration1 = Duration.fromInputUnsafe(1000) // 1000 milliseconds
112
+ * const duration2 = Duration.fromInputUnsafe("5 seconds")
113
+ * const duration3 = Duration.fromInputUnsafe([2, 500_000_000]) // 2 seconds and 500ms
114
114
  * ```
115
115
  *
116
116
  * @since 2.0.0
117
117
  * @category constructors
118
118
  */
119
- export const fromDurationInputUnsafe = (input: DurationInput): Duration => {
119
+ export const fromInputUnsafe = (input: Input): Duration => {
120
120
  if (isDuration(input)) return input
121
121
  if (isNumber(input)) return millis(input)
122
122
  if (isBigInt(input)) return nanos(input)
@@ -168,11 +168,11 @@ export const fromDurationInputUnsafe = (input: DurationInput): Duration => {
168
168
  }
169
169
  }
170
170
  }
171
- throw new Error(`Invalid DurationInput: ${input}`)
171
+ throw new Error(`Invalid Input: ${input}`)
172
172
  }
173
173
 
174
174
  /**
175
- * Safely decodes a `DurationInput` value into a `Duration`, returning
175
+ * Safely decodes a `Input` value into a `Duration`, returning
176
176
  * `undefined` if decoding fails.
177
177
  *
178
178
  * **Example**
@@ -180,16 +180,16 @@ export const fromDurationInputUnsafe = (input: DurationInput): Duration => {
180
180
  * ```ts
181
181
  * import { Duration } from "effect"
182
182
  *
183
- * Duration.fromDurationInput(1000)?.pipe(Duration.toSeconds) // 1
183
+ * Duration.fromInput(1000)?.pipe(Duration.toSeconds) // 1
184
184
  *
185
- * Duration.fromDurationInput("invalid" as any) // undefined
185
+ * Duration.fromInput("invalid" as any) // undefined
186
186
  * ```
187
187
  *
188
188
  * @category constructors
189
189
  * @since 4.0.0
190
190
  */
191
- export const fromDurationInput: (u: DurationInput) => Duration | undefined = UndefinedOr.liftThrowable(
192
- fromDurationInputUnsafe
191
+ export const fromInput: (u: Input) => Duration | undefined = UndefinedOr.liftThrowable(
192
+ fromInputUnsafe
193
193
  )
194
194
 
195
195
  const zeroDurationValue: DurationValue = { _tag: "Millis", millis: 0 }
@@ -611,8 +611,8 @@ export const weeks = (weeks: number): Duration => make(weeks * 604_800_000)
611
611
  * @since 2.0.0
612
612
  * @category getters
613
613
  */
614
- export const toMillis = (self: Duration): number =>
615
- match(self, {
614
+ export const toMillis = (self: Input): number =>
615
+ match(fromInputUnsafe(self), {
616
616
  onMillis: identity,
617
617
  onNanos: (nanos) => Number(nanos) / 1_000_000,
618
618
  onInfinity: () => Infinity,
package/src/Effect.ts CHANGED
@@ -7224,7 +7224,7 @@ export const timeout: {
7224
7224
  * @since 2.0.0
7225
7225
  * @category Delays & Timeouts
7226
7226
  */
7227
- (duration: Duration.DurationInput): <A, E, R>(self: Effect<A, E, R>) => Effect<A, E | Cause.TimeoutError, R>
7227
+ (duration: Duration.Input): <A, E, R>(self: Effect<A, E, R>) => Effect<A, E | Cause.TimeoutError, R>
7228
7228
  // -----------------------------------------------------------------------------
7229
7229
  // Delays & timeouts
7230
7230
  // -----------------------------------------------------------------------------
@@ -7275,7 +7275,7 @@ export const timeout: {
7275
7275
  * @since 2.0.0
7276
7276
  * @category Delays & Timeouts
7277
7277
  */
7278
- <A, E, R>(self: Effect<A, E, R>, duration: Duration.DurationInput): Effect<A, E | Cause.TimeoutError, R>
7278
+ <A, E, R>(self: Effect<A, E, R>, duration: Duration.Input): Effect<A, E | Cause.TimeoutError, R>
7279
7279
  } = internal.timeout
7280
7280
 
7281
7281
  /**
@@ -7377,7 +7377,7 @@ export const timeoutOption: {
7377
7377
  * @since 3.1.0
7378
7378
  * @category Delays & Timeouts
7379
7379
  */
7380
- (duration: Duration.DurationInput): <A, E, R>(self: Effect<A, E, R>) => Effect<Option<A>, E, R>
7380
+ (duration: Duration.Input): <A, E, R>(self: Effect<A, E, R>) => Effect<Option<A>, E, R>
7381
7381
  /**
7382
7382
  * Handles timeouts by returning an `Option` that represents either the result
7383
7383
  * or a timeout.
@@ -7427,7 +7427,7 @@ export const timeoutOption: {
7427
7427
  * @since 3.1.0
7428
7428
  * @category Delays & Timeouts
7429
7429
  */
7430
- <A, E, R>(self: Effect<A, E, R>, duration: Duration.DurationInput): Effect<Option<A>, E, R>
7430
+ <A, E, R>(self: Effect<A, E, R>, duration: Duration.Input): Effect<Option<A>, E, R>
7431
7431
  } = internal.timeoutOption
7432
7432
 
7433
7433
  /**
@@ -7505,7 +7505,7 @@ export const timeoutOrElse: {
7505
7505
  */
7506
7506
  <A2, E2, R2>(
7507
7507
  options: {
7508
- readonly duration: Duration.DurationInput
7508
+ readonly duration: Duration.Input
7509
7509
  readonly onTimeout: LazyArg<Effect<A2, E2, R2>>
7510
7510
  }
7511
7511
  ): <A, E, R>(self: Effect<A, E, R>) => Effect<A | A2, E | E2, R | R2>
@@ -7548,7 +7548,7 @@ export const timeoutOrElse: {
7548
7548
  <A, E, R, A2, E2, R2>(
7549
7549
  self: Effect<A, E, R>,
7550
7550
  options: {
7551
- readonly duration: Duration.DurationInput
7551
+ readonly duration: Duration.Input
7552
7552
  readonly onTimeout: LazyArg<Effect<A2, E2, R2>>
7553
7553
  }
7554
7554
  ): Effect<A | A2, E | E2, R | R2>
@@ -7595,7 +7595,7 @@ export const delay: {
7595
7595
  * @since 2.0.0
7596
7596
  * @category Delays & Timeouts
7597
7597
  */
7598
- (duration: Duration.DurationInput): <A, E, R>(self: Effect<A, E, R>) => Effect<A, E, R>
7598
+ (duration: Duration.Input): <A, E, R>(self: Effect<A, E, R>) => Effect<A, E, R>
7599
7599
  /**
7600
7600
  * Returns an effect that is delayed from this effect by the specified
7601
7601
  * `Duration`.
@@ -7616,7 +7616,7 @@ export const delay: {
7616
7616
  * @since 2.0.0
7617
7617
  * @category Delays & Timeouts
7618
7618
  */
7619
- <A, E, R>(self: Effect<A, E, R>, duration: Duration.DurationInput): Effect<A, E, R>
7619
+ <A, E, R>(self: Effect<A, E, R>, duration: Duration.Input): Effect<A, E, R>
7620
7620
  } = internal.delay
7621
7621
 
7622
7622
  /**
@@ -7641,7 +7641,7 @@ export const delay: {
7641
7641
  * @since 2.0.0
7642
7642
  * @category Delays & Timeouts
7643
7643
  */
7644
- export const sleep: (duration: Duration.DurationInput) => Effect<void> = internal.sleep
7644
+ export const sleep: (duration: Duration.Input) => Effect<void> = internal.sleep
7645
7645
 
7646
7646
  /**
7647
7647
  * Measures the runtime of an effect and returns the duration with its result.
@@ -12272,7 +12272,7 @@ export const cachedWithTTL: {
12272
12272
  * @since 2.0.0
12273
12273
  * @category Caching
12274
12274
  */
12275
- (timeToLive: Duration.DurationInput): <A, E, R>(self: Effect<A, E, R>) => Effect<Effect<A, E, R>>
12275
+ (timeToLive: Duration.Input): <A, E, R>(self: Effect<A, E, R>) => Effect<Effect<A, E, R>>
12276
12276
  /**
12277
12277
  * Returns an effect that caches its result for a specified `Duration`,
12278
12278
  * known as "timeToLive" (TTL).
@@ -12339,7 +12339,7 @@ export const cachedWithTTL: {
12339
12339
  * @since 2.0.0
12340
12340
  * @category Caching
12341
12341
  */
12342
- <A, E, R>(self: Effect<A, E, R>, timeToLive: Duration.DurationInput): Effect<Effect<A, E, R>>
12342
+ <A, E, R>(self: Effect<A, E, R>, timeToLive: Duration.Input): Effect<Effect<A, E, R>>
12343
12343
  } = internal.cachedWithTTL
12344
12344
 
12345
12345
  /**
@@ -12481,7 +12481,7 @@ export const cachedInvalidateWithTTL: {
12481
12481
  * @since 2.0.0
12482
12482
  * @category Caching
12483
12483
  */
12484
- (timeToLive: Duration.DurationInput): <A, E, R>(self: Effect<A, E, R>) => Effect<[Effect<A, E, R>, Effect<void>]>
12484
+ (timeToLive: Duration.Input): <A, E, R>(self: Effect<A, E, R>) => Effect<[Effect<A, E, R>, Effect<void>]>
12485
12485
  /**
12486
12486
  * Caches an effect's result for a specified duration and allows manual
12487
12487
  * invalidation before expiration.
@@ -12551,7 +12551,7 @@ export const cachedInvalidateWithTTL: {
12551
12551
  * @since 2.0.0
12552
12552
  * @category Caching
12553
12553
  */
12554
- <A, E, R>(self: Effect<A, E, R>, timeToLive: Duration.DurationInput): Effect<[Effect<A, E, R>, Effect<void>]>
12554
+ <A, E, R>(self: Effect<A, E, R>, timeToLive: Duration.Input): Effect<[Effect<A, E, R>, Effect<void>]>
12555
12555
  } = internal.cachedInvalidateWithTTL
12556
12556
 
12557
12557
  // -----------------------------------------------------------------------------
@@ -21905,8 +21905,8 @@ export const trackDuration: {
21905
21905
  return onExit(self, () => {
21906
21906
  const endTime = clock.currentTimeNanosUnsafe()
21907
21907
  const duration = Duration.subtract(
21908
- Duration.fromDurationInputUnsafe(endTime),
21909
- Duration.fromDurationInputUnsafe(startTime)
21908
+ Duration.fromInputUnsafe(endTime),
21909
+ Duration.fromInputUnsafe(startTime)
21910
21910
  )
21911
21911
  const input = f === undefined ? duration : internalCall(() => f(duration))
21912
21912
  return Metric.update(metric, input as any)
package/src/Formatter.ts CHANGED
@@ -1,10 +1,85 @@
1
1
  /**
2
+ * Utilities for converting arbitrary JavaScript values into human-readable
3
+ * strings, with support for circular references, redaction, and common JS
4
+ * types that `JSON.stringify` handles poorly.
5
+ *
6
+ * Mental model:
7
+ * - A `Formatter<Value, Format>` is a callable `(value: Value) => Format`.
8
+ * - {@link format} is the general-purpose pretty-printer: it handles
9
+ * primitives, arrays, objects, `BigInt`, `Symbol`, `Date`, `RegExp`,
10
+ * `Set`, `Map`, class instances, and circular references.
11
+ * - {@link formatJson} is a safe `JSON.stringify` wrapper that silently
12
+ * drops circular references and applies redaction.
13
+ * - Both functions accept a `space` option for indentation control.
14
+ *
15
+ * Common tasks:
16
+ * - Pretty-print any value for debugging / logging -> {@link format}
17
+ * - Serialize to JSON safely (no circular throws) -> {@link formatJson}
18
+ * - Format a single object property key -> {@link formatPropertyKey}
19
+ * - Format a property path like `["a"]["b"]` -> {@link formatPath}
20
+ * - Format a `Date` to ISO string safely -> {@link formatDate}
21
+ *
22
+ * Gotchas:
23
+ * - {@link format} output is **not** valid JSON; use {@link formatJson} when
24
+ * you need parseable JSON.
25
+ * - {@link format} calls `toString()` on objects by default; pass
26
+ * `ignoreToString: true` to disable.
27
+ * - {@link formatJson} silently omits circular references (the key is
28
+ * dropped from the output).
29
+ * - Values implementing the `Redactable` protocol are automatically
30
+ * redacted by both {@link format} and {@link formatJson}.
31
+ *
32
+ * **Example** (Pretty-print a value)
33
+ *
34
+ * ```ts
35
+ * import { Formatter } from "effect"
36
+ *
37
+ * const obj = { name: "Alice", scores: [100, 97] }
38
+ * console.log(Formatter.format(obj))
39
+ * // {"name":"Alice","scores":[100,97]}
40
+ *
41
+ * console.log(Formatter.format(obj, { space: 2 }))
42
+ * // {
43
+ * // "name": "Alice",
44
+ * // "scores": [
45
+ * // 100,
46
+ * // 97
47
+ * // ]
48
+ * // }
49
+ * ```
50
+ *
51
+ * See also: {@link Formatter}, {@link format}, {@link formatJson}
52
+ *
2
53
  * @since 4.0.0
3
54
  */
4
55
  import * as Predicate from "./Predicate.ts"
5
56
  import { getRedacted, redact, symbolRedactable } from "./Redactable.ts"
6
57
 
7
58
  /**
59
+ * A callable interface representing a function that converts a `Value` into a
60
+ * `Format` (defaults to `string`).
61
+ *
62
+ * When to use:
63
+ * - You want to type a formatting / rendering function generically.
64
+ * - You are building a pipeline that accepts pluggable formatters.
65
+ *
66
+ * Behavior:
67
+ * - Pure callable type; carries no runtime implementation.
68
+ * - Contravariant in `Value`, covariant in `Format`.
69
+ *
70
+ * **Example** (Define a custom formatter)
71
+ *
72
+ * ```ts
73
+ * import type { Formatter } from "effect"
74
+ *
75
+ * const upper: Formatter.Formatter<string> = (s) => s.toUpperCase()
76
+ *
77
+ * console.log(upper("hello"))
78
+ * // HELLO
79
+ * ```
80
+ *
81
+ * See also: {@link format}, {@link formatJson}
82
+ *
8
83
  * @category Model
9
84
  * @since 4.0.0
10
85
  */
@@ -15,31 +90,71 @@ export interface Formatter<in Value, out Format = string> {
15
90
  /**
16
91
  * Converts any JavaScript value into a human-readable string.
17
92
  *
18
- * For objects that don't have a `toString` method, it applies redaction to
19
- * protect sensitive information.
20
- *
21
- * Unlike `JSON.stringify`, this formatter:
22
- * - Handles circular references (printed as `"[Circular]"`).
23
- * - Supports additional types like `BigInt`, `Symbol`, `Set`, `Map`, `Date`, `RegExp`, and
24
- * objects with custom `toString` methods.
25
- * - Includes constructor names for class instances (e.g. `MyClass({"a":1})`).
26
- * - Does not guarantee valid JSON output — the result is intended for debugging and inspection.
27
- *
28
- * Formatting rules:
29
- * - Primitives are stringified naturally (`null`, `undefined`, `123`, `"abc"`, `true`).
30
- * - Strings are JSON-quoted.
31
- * - Arrays and objects with a single element/property are formatted inline.
32
- * - Larger arrays/objects are pretty-printed with optional indentation.
33
- * - Circular references are replaced with the literal `"[Circular]"`.
34
- *
35
- * **Options**:
36
- * - `space`: Indentation used when pretty-printing:
37
- * - If a number, that many spaces will be used.
38
- * - If a string, the string is used as the indentation unit (e.g. `"\t"`).
39
- * - If `0`, empty string, or `undefined`, output is compact (no indentation).
40
- * Defaults to `0`.
41
- * - `ignoreToString`: If `true`, the `toString` method is not called on the value.
42
- * Defaults to `false`.
93
+ * When to use:
94
+ * - Pretty-printing values for debugging, logging, or error messages.
95
+ * - You need to handle `BigInt`, `Symbol`, `Set`, `Map`, `Date`, `RegExp`,
96
+ * or class instances that `JSON.stringify` cannot represent.
97
+ * - You want circular references shown as `"[Circular]"` instead of
98
+ * throwing.
99
+ *
100
+ * Behavior:
101
+ * - Does not mutate input.
102
+ * - Output is **not** valid JSON; use {@link formatJson} when you need
103
+ * parseable JSON.
104
+ * - Primitives: stringified naturally (`null`, `undefined`, `123`, `true`).
105
+ * Strings are JSON-quoted.
106
+ * - Objects with a custom `toString` (not `Object.prototype.toString`):
107
+ * `toString()` is called unless `ignoreToString` is `true`.
108
+ * - Errors with a `cause`: formatted as `"<message> (cause: <cause>)"`.
109
+ * - Iterables (`Set`, `Map`, etc.): formatted as
110
+ * `ClassName([...elements])`.
111
+ * - Class instances: wrapped as `ClassName({...})`.
112
+ * - `Redactable` values are automatically redacted.
113
+ * - Arrays/objects with 0–1 entries are inline; larger ones are
114
+ * pretty-printed when `space` is set.
115
+ * - Circular references are replaced with `"[Circular]"`.
116
+ *
117
+ * Options:
118
+ * - `space` — indentation unit (number of spaces, or a string like
119
+ * `"\t"`). Defaults to `0` (compact).
120
+ * - `ignoreToString` — skip calling `toString()`. Defaults to `false`.
121
+ *
122
+ * **Example** (Compact output)
123
+ *
124
+ * ```ts
125
+ * import { Formatter } from "effect"
126
+ *
127
+ * console.log(Formatter.format({ a: 1, b: [2, 3] }))
128
+ * // {"a":1,"b":[2,3]}
129
+ * ```
130
+ *
131
+ * **Example** (Pretty-printed output)
132
+ *
133
+ * ```ts
134
+ * import { Formatter } from "effect"
135
+ *
136
+ * console.log(Formatter.format({ a: 1, b: [2, 3] }, { space: 2 }))
137
+ * // {
138
+ * // "a": 1,
139
+ * // "b": [
140
+ * // 2,
141
+ * // 3
142
+ * // ]
143
+ * // }
144
+ * ```
145
+ *
146
+ * **Example** (Circular reference handling)
147
+ *
148
+ * ```ts
149
+ * import { Formatter } from "effect"
150
+ *
151
+ * const obj: any = { name: "loop" }
152
+ * obj.self = obj
153
+ * console.log(Formatter.format(obj))
154
+ * // {"name":"loop","self":[Circular]}
155
+ * ```
156
+ *
157
+ * See also: {@link formatJson}, {@link Formatter}
43
158
  *
44
159
  * @since 4.0.0
45
160
  */
@@ -131,7 +246,29 @@ export function format(input: unknown, options?: {
131
246
  const CIRCULAR = "[Circular]"
132
247
 
133
248
  /**
134
- * Fast path for formatting property keys.
249
+ * Formats a single property key for display.
250
+ *
251
+ * When to use:
252
+ * - You are building a custom formatter that needs to render object keys.
253
+ *
254
+ * Behavior:
255
+ * - String keys are JSON-quoted (e.g. `"foo"`).
256
+ * - Symbol and number keys are converted with `String()`.
257
+ * - Pure function; does not mutate input.
258
+ *
259
+ * **Example** (Format property keys)
260
+ *
261
+ * ```ts
262
+ * import { Formatter } from "effect"
263
+ *
264
+ * console.log(Formatter.formatPropertyKey("name"))
265
+ * // "name"
266
+ *
267
+ * console.log(Formatter.formatPropertyKey(Symbol.for("id")))
268
+ * // Symbol(id)
269
+ * ```
270
+ *
271
+ * See also: {@link formatPath}, {@link format}
135
272
  *
136
273
  * @internal
137
274
  */
@@ -140,7 +277,28 @@ export function formatPropertyKey(name: PropertyKey): string {
140
277
  }
141
278
 
142
279
  /**
143
- * Fast path for formatting property paths.
280
+ * Formats an array of property keys as a bracket-notation path string.
281
+ *
282
+ * When to use:
283
+ * - You need to display a path through a nested object (e.g. in error
284
+ * messages or schema validation output).
285
+ *
286
+ * Behavior:
287
+ * - Each key is wrapped in brackets and formatted via
288
+ * {@link formatPropertyKey}.
289
+ * - Returns an empty string for an empty path.
290
+ * - Pure function; does not mutate input.
291
+ *
292
+ * **Example** (Render a property path)
293
+ *
294
+ * ```ts
295
+ * import { Formatter } from "effect"
296
+ *
297
+ * console.log(Formatter.formatPath(["users", 0, "name"]))
298
+ * // ["users"][0]["name"]
299
+ * ```
300
+ *
301
+ * See also: {@link formatPropertyKey}, {@link format}
144
302
  *
145
303
  * @internal
146
304
  */
@@ -149,7 +307,31 @@ export function formatPath(path: ReadonlyArray<PropertyKey>): string {
149
307
  }
150
308
 
151
309
  /**
152
- * Fast path for formatting dates.
310
+ * Formats a `Date` as an ISO 8601 string, returning `"Invalid Date"` for
311
+ * invalid dates instead of throwing.
312
+ *
313
+ * When to use:
314
+ * - You want a safe `toISOString()` that never throws.
315
+ *
316
+ * Behavior:
317
+ * - Returns `date.toISOString()` on success.
318
+ * - Returns `"Invalid Date"` if `toISOString()` throws (e.g. for
319
+ * `new Date(NaN)`).
320
+ * - Pure function; does not mutate input.
321
+ *
322
+ * **Example** (Safe date formatting)
323
+ *
324
+ * ```ts
325
+ * import { Formatter } from "effect"
326
+ *
327
+ * console.log(Formatter.formatDate(new Date("2024-01-15T10:30:00Z")))
328
+ * // 2024-01-15T10:30:00.000Z
329
+ *
330
+ * console.log(Formatter.formatDate(new Date("invalid")))
331
+ * // Invalid Date
332
+ * ```
333
+ *
334
+ * See also: {@link format}
153
335
  *
154
336
  * @internal
155
337
  */
@@ -171,42 +353,62 @@ function safeToString(input: any): string {
171
353
  }
172
354
 
173
355
  /**
174
- * Safely stringifies objects that may contain circular references.
356
+ * Safely stringifies a value to JSON, silently dropping circular references.
357
+ *
358
+ * When to use:
359
+ * - You need valid JSON output (unlike {@link format}).
360
+ * - The input may contain circular references and you want them silently
361
+ * omitted rather than throwing a `TypeError`.
175
362
  *
176
- * This function performs JSON.stringify with circular reference detection and handling.
177
- * It also applies redaction to sensitive values and provides a safe fallback for
178
- * any objects that can't be serialized normally.
363
+ * Behavior:
364
+ * - Does not mutate input.
365
+ * - Uses `JSON.stringify` internally with a replacer that tracks seen
366
+ * objects.
367
+ * - Circular references are replaced with `undefined` (omitted from
368
+ * output).
369
+ * - `Redactable` values are automatically redacted before serialization.
370
+ * - Types not supported by JSON (`BigInt`, `Symbol`, `undefined`,
371
+ * functions) follow standard `JSON.stringify` behavior (omitted or
372
+ * `null` in arrays).
179
373
  *
180
- * **Options**:
181
- * - `space`: Indentation used when pretty-printing:
182
- * - If a number, that many spaces will be used.
183
- * - If a string, the string is used as the indentation unit (e.g. `"\t"`).
184
- * - If `0`, empty string, or `undefined`, output is compact (no indentation).
185
- * Defaults to `0`.
374
+ * Options:
375
+ * - `space` indentation unit (number of spaces, or a string like
376
+ * `"\t"`). Defaults to `0` (compact).
377
+ *
378
+ * **Example** (Compact JSON)
186
379
  *
187
- * @example
188
380
  * ```ts
189
- * import { formatJson } from "effect/Formatter"
381
+ * import { Formatter } from "effect"
190
382
  *
191
- * // Normal object
192
- * const simple = { name: "Alice", age: 30 }
193
- * console.log(formatJson(simple))
383
+ * console.log(Formatter.formatJson({ name: "Alice", age: 30 }))
194
384
  * // {"name":"Alice","age":30}
385
+ * ```
386
+ *
387
+ * **Example** (Circular reference handling)
388
+ *
389
+ * ```ts
390
+ * import { Formatter } from "effect"
195
391
  *
196
- * // Object with circular reference
197
- * const circular: any = { name: "test" }
198
- * circular.self = circular
199
- * console.log(formatJson(circular))
200
- * // {"name":"test"} (circular reference omitted)
392
+ * const obj: any = { name: "test" }
393
+ * obj.self = obj
394
+ * console.log(Formatter.formatJson(obj))
395
+ * // {"name":"test"}
396
+ * ```
397
+ *
398
+ * **Example** (Pretty-printed JSON)
201
399
  *
202
- * // With formatting
203
- * console.log(formatJson(simple, { space: 2 }))
400
+ * ```ts
401
+ * import { Formatter } from "effect"
402
+ *
403
+ * console.log(Formatter.formatJson({ name: "Alice", age: 30 }, { space: 2 }))
204
404
  * // {
205
405
  * // "name": "Alice",
206
406
  * // "age": 30
207
407
  * // }
208
408
  * ```
209
409
  *
410
+ * See also: {@link format}, {@link Formatter}
411
+ *
210
412
  * @since 4.0.0
211
413
  */
212
414
  export function formatJson(input: unknown, options?: {