@livestore/utils 0.4.0-dev.9 → 0.5.0-dev.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 (316) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/NoopTracer.d.ts +7 -8
  3. package/dist/NoopTracer.d.ts.map +1 -1
  4. package/dist/NoopTracer.js +13 -15
  5. package/dist/NoopTracer.js.map +1 -1
  6. package/dist/NoopTracer.test.d.ts +2 -0
  7. package/dist/NoopTracer.test.d.ts.map +1 -0
  8. package/dist/NoopTracer.test.js +17 -0
  9. package/dist/NoopTracer.test.js.map +1 -0
  10. package/dist/binary.js +1 -1
  11. package/dist/binary.js.map +1 -1
  12. package/dist/browser/Opfs/Opfs.d.ts +201 -0
  13. package/dist/browser/Opfs/Opfs.d.ts.map +1 -0
  14. package/dist/browser/Opfs/Opfs.js +170 -0
  15. package/dist/browser/Opfs/Opfs.js.map +1 -0
  16. package/dist/browser/Opfs/debug-utils.d.ts +20 -0
  17. package/dist/browser/Opfs/debug-utils.d.ts.map +1 -0
  18. package/dist/browser/Opfs/debug-utils.js +95 -0
  19. package/dist/browser/Opfs/debug-utils.js.map +1 -0
  20. package/dist/browser/Opfs/mod.d.ts +4 -0
  21. package/dist/browser/Opfs/mod.d.ts.map +1 -0
  22. package/dist/browser/Opfs/mod.js +4 -0
  23. package/dist/browser/Opfs/mod.js.map +1 -0
  24. package/dist/browser/Opfs/utils.d.ts +71 -0
  25. package/dist/browser/Opfs/utils.d.ts.map +1 -0
  26. package/dist/browser/Opfs/utils.js +227 -0
  27. package/dist/browser/Opfs/utils.js.map +1 -0
  28. package/dist/browser/QuotaExceededError.d.ts +60 -0
  29. package/dist/browser/QuotaExceededError.d.ts.map +1 -0
  30. package/dist/browser/QuotaExceededError.js +2 -0
  31. package/dist/browser/QuotaExceededError.js.map +1 -0
  32. package/dist/browser/WebChannelBrowser.d.ts +22 -0
  33. package/dist/browser/WebChannelBrowser.d.ts.map +1 -0
  34. package/dist/browser/WebChannelBrowser.js +87 -0
  35. package/dist/browser/WebChannelBrowser.js.map +1 -0
  36. package/dist/browser/WebError.d.ts +389 -0
  37. package/dist/browser/WebError.d.ts.map +1 -0
  38. package/dist/browser/WebError.js +423 -0
  39. package/dist/browser/WebError.js.map +1 -0
  40. package/dist/browser/WebError.test.d.ts +2 -0
  41. package/dist/browser/WebError.test.d.ts.map +1 -0
  42. package/dist/browser/WebError.test.js +46 -0
  43. package/dist/browser/WebError.test.js.map +1 -0
  44. package/dist/browser/WebLock.d.ts.map +1 -0
  45. package/dist/{effect → browser}/WebLock.js +21 -21
  46. package/dist/browser/WebLock.js.map +1 -0
  47. package/dist/{browser.d.ts → browser/detect.d.ts} +1 -1
  48. package/dist/browser/detect.d.ts.map +1 -0
  49. package/dist/{browser.js → browser/detect.js} +7 -7
  50. package/dist/browser/detect.js.map +1 -0
  51. package/dist/browser/mod.d.ts +8 -0
  52. package/dist/browser/mod.d.ts.map +1 -0
  53. package/dist/browser/mod.js +8 -0
  54. package/dist/browser/mod.js.map +1 -0
  55. package/dist/cuid/cuid.browser.js +1 -1
  56. package/dist/cuid/cuid.browser.js.map +1 -1
  57. package/dist/cuid/cuid.node.js +1 -1
  58. package/dist/cuid/cuid.node.js.map +1 -1
  59. package/dist/effect/Debug.d.ts +38 -0
  60. package/dist/effect/Debug.d.ts.map +1 -0
  61. package/dist/effect/Debug.js +350 -0
  62. package/dist/effect/Debug.js.map +1 -0
  63. package/dist/effect/Effect.d.ts +91 -22
  64. package/dist/effect/Effect.d.ts.map +1 -1
  65. package/dist/effect/Effect.js +126 -38
  66. package/dist/effect/Effect.js.map +1 -1
  67. package/dist/effect/Effect.test.d.ts +2 -0
  68. package/dist/effect/Effect.test.d.ts.map +1 -0
  69. package/dist/effect/Effect.test.js +72 -0
  70. package/dist/effect/Effect.test.js.map +1 -0
  71. package/dist/effect/Error.d.ts +4 -6
  72. package/dist/effect/Error.d.ts.map +1 -1
  73. package/dist/effect/Error.js +1 -1
  74. package/dist/effect/Error.js.map +1 -1
  75. package/dist/effect/Logger.d.ts +0 -6
  76. package/dist/effect/Logger.d.ts.map +1 -1
  77. package/dist/effect/Logger.js +0 -32
  78. package/dist/effect/Logger.js.map +1 -1
  79. package/dist/effect/OtelTracer.d.ts +1 -1
  80. package/dist/effect/OtelTracer.d.ts.map +1 -1
  81. package/dist/effect/OtelTracer.js +2 -3
  82. package/dist/effect/OtelTracer.js.map +1 -1
  83. package/dist/effect/RpcClient.d.ts +7 -7
  84. package/dist/effect/RpcClient.d.ts.map +1 -1
  85. package/dist/effect/RpcClient.js +74 -54
  86. package/dist/effect/RpcClient.js.map +1 -1
  87. package/dist/effect/Schedule.d.ts +1 -1
  88. package/dist/effect/Schedule.d.ts.map +1 -1
  89. package/dist/effect/Schedule.js +2 -2
  90. package/dist/effect/Schedule.js.map +1 -1
  91. package/dist/effect/Schema/debug-diff.d.ts +1 -1
  92. package/dist/effect/Schema/debug-diff.d.ts.map +1 -1
  93. package/dist/effect/Schema/debug-diff.js +9 -10
  94. package/dist/effect/Schema/debug-diff.js.map +1 -1
  95. package/dist/effect/Schema/debug-diff.test.js +7 -4
  96. package/dist/effect/Schema/debug-diff.test.js.map +1 -1
  97. package/dist/effect/Schema/index.d.ts +28 -18
  98. package/dist/effect/Schema/index.d.ts.map +1 -1
  99. package/dist/effect/Schema/index.js +55 -28
  100. package/dist/effect/Schema/index.js.map +1 -1
  101. package/dist/effect/Stream.d.ts +13 -5
  102. package/dist/effect/Stream.d.ts.map +1 -1
  103. package/dist/effect/Stream.js +19 -12
  104. package/dist/effect/Stream.js.map +1 -1
  105. package/dist/effect/Stream.test.js +12 -12
  106. package/dist/effect/Stream.test.js.map +1 -1
  107. package/dist/effect/Subscribable.d.ts +9 -3
  108. package/dist/effect/Subscribable.d.ts.map +1 -1
  109. package/dist/effect/Subscribable.js +20 -35
  110. package/dist/effect/Subscribable.js.map +1 -1
  111. package/dist/effect/SubscriptionRef.d.ts +5 -6
  112. package/dist/effect/SubscriptionRef.d.ts.map +1 -1
  113. package/dist/effect/SubscriptionRef.js +2 -3
  114. package/dist/effect/SubscriptionRef.js.map +1 -1
  115. package/dist/effect/TaskTracing.d.ts +1 -1
  116. package/dist/effect/TaskTracing.d.ts.map +1 -1
  117. package/dist/effect/TaskTracing.js +12 -16
  118. package/dist/effect/TaskTracing.js.map +1 -1
  119. package/dist/effect/WebChannel/WebChannel.d.ts +11 -30
  120. package/dist/effect/WebChannel/WebChannel.d.ts.map +1 -1
  121. package/dist/effect/WebChannel/WebChannel.js +70 -125
  122. package/dist/effect/WebChannel/WebChannel.js.map +1 -1
  123. package/dist/effect/WebChannel/WebChannel.test.js +16 -16
  124. package/dist/effect/WebChannel/WebChannel.test.js.map +1 -1
  125. package/dist/effect/WebChannel/broadcastChannelWithAck.d.ts.map +1 -1
  126. package/dist/effect/WebChannel/broadcastChannelWithAck.js +20 -13
  127. package/dist/effect/WebChannel/broadcastChannelWithAck.js.map +1 -1
  128. package/dist/effect/WebChannel/common.d.ts +17 -18
  129. package/dist/effect/WebChannel/common.d.ts.map +1 -1
  130. package/dist/effect/WebChannel/common.js +7 -7
  131. package/dist/effect/WebChannel/common.js.map +1 -1
  132. package/dist/effect/WebSocket.d.ts +4 -6
  133. package/dist/effect/WebSocket.d.ts.map +1 -1
  134. package/dist/effect/WebSocket.js +17 -17
  135. package/dist/effect/WebSocket.js.map +1 -1
  136. package/dist/effect/WebSocket.test.js +2 -2
  137. package/dist/effect/WebSocket.test.js.map +1 -1
  138. package/dist/effect/mod.browser-build.test.d.ts +2 -0
  139. package/dist/effect/mod.browser-build.test.d.ts.map +1 -0
  140. package/dist/effect/mod.browser-build.test.js +18 -0
  141. package/dist/effect/mod.browser-build.test.js.map +1 -0
  142. package/dist/effect/mod.d.ts +30 -0
  143. package/dist/effect/mod.d.ts.map +1 -0
  144. package/dist/effect/mod.js +30 -0
  145. package/dist/effect/mod.js.map +1 -0
  146. package/dist/effect/spanEvent.d.ts +12 -0
  147. package/dist/effect/spanEvent.d.ts.map +1 -0
  148. package/dist/effect/spanEvent.js +12 -0
  149. package/dist/effect/spanEvent.js.map +1 -0
  150. package/dist/effect/spanEvent.test.d.ts +2 -0
  151. package/dist/effect/spanEvent.test.d.ts.map +1 -0
  152. package/dist/effect/spanEvent.test.js +79 -0
  153. package/dist/effect/spanEvent.test.js.map +1 -0
  154. package/dist/env.d.ts.map +1 -1
  155. package/dist/env.js +1 -1
  156. package/dist/env.js.map +1 -1
  157. package/dist/fast-deep-equal.d.ts.map +1 -1
  158. package/dist/fast-deep-equal.js +9 -10
  159. package/dist/fast-deep-equal.js.map +1 -1
  160. package/dist/global.d.ts +3 -0
  161. package/dist/global.d.ts.map +1 -1
  162. package/dist/global.js.map +1 -1
  163. package/dist/misc.d.ts +9 -1
  164. package/dist/misc.d.ts.map +1 -1
  165. package/dist/misc.js +12 -4
  166. package/dist/misc.js.map +1 -1
  167. package/dist/mod.d.ts +177 -20
  168. package/dist/mod.d.ts.map +1 -1
  169. package/dist/mod.js +159 -22
  170. package/dist/mod.js.map +1 -1
  171. package/dist/node/mod.d.ts +45 -6
  172. package/dist/node/mod.d.ts.map +1 -1
  173. package/dist/node/mod.js +51 -9
  174. package/dist/node/mod.js.map +1 -1
  175. package/dist/object/index.d.ts +0 -9
  176. package/dist/object/index.d.ts.map +1 -1
  177. package/dist/object/index.js +0 -9
  178. package/dist/object/index.js.map +1 -1
  179. package/dist/object/stringify-object.js +2 -2
  180. package/dist/object/stringify-object.js.map +1 -1
  181. package/dist/object/stringify-object.test.js.map +1 -1
  182. package/dist/qr.d.ts +38 -0
  183. package/dist/qr.d.ts.map +1 -0
  184. package/dist/qr.js +109 -0
  185. package/dist/qr.js.map +1 -0
  186. package/dist/set.js +1 -1
  187. package/dist/set.js.map +1 -1
  188. package/dist/string.d.ts +0 -2
  189. package/dist/string.d.ts.map +1 -1
  190. package/dist/string.js +0 -2
  191. package/dist/string.js.map +1 -1
  192. package/package.json +61 -55
  193. package/src/NoopTracer.test.ts +20 -0
  194. package/src/NoopTracer.ts +28 -37
  195. package/src/binary.ts +1 -1
  196. package/src/browser/Opfs/Opfs.ts +463 -0
  197. package/src/browser/Opfs/debug-utils.ts +154 -0
  198. package/src/browser/Opfs/mod.ts +3 -0
  199. package/src/browser/Opfs/utils.ts +297 -0
  200. package/src/browser/QuotaExceededError.ts +60 -0
  201. package/src/browser/WebChannelBrowser.ts +145 -0
  202. package/src/browser/WebError.test.ts +66 -0
  203. package/src/browser/WebError.ts +587 -0
  204. package/src/{effect → browser}/WebLock.ts +27 -28
  205. package/src/{browser.ts → browser/detect.ts} +6 -6
  206. package/src/browser/mod.ts +8 -0
  207. package/src/cuid/cuid.browser.ts +1 -1
  208. package/src/cuid/cuid.node.ts +1 -1
  209. package/src/effect/Debug.ts +477 -0
  210. package/src/effect/Effect.test.ts +117 -0
  211. package/src/effect/Effect.ts +174 -79
  212. package/src/effect/Error.ts +1 -1
  213. package/src/effect/Logger.ts +0 -48
  214. package/src/effect/OtelTracer.ts +2 -3
  215. package/src/effect/RpcClient.ts +85 -65
  216. package/src/effect/Schedule.ts +4 -5
  217. package/src/effect/Schema/debug-diff.test.ts +7 -7
  218. package/src/effect/Schema/debug-diff.ts +11 -12
  219. package/src/effect/Schema/index.ts +121 -57
  220. package/src/effect/Stream.test.ts +14 -13
  221. package/src/effect/Stream.ts +23 -16
  222. package/src/effect/Subscribable.ts +31 -42
  223. package/src/effect/SubscriptionRef.ts +9 -13
  224. package/src/effect/TaskTracing.ts +13 -16
  225. package/src/effect/WebChannel/WebChannel.test.ts +24 -24
  226. package/src/effect/WebChannel/WebChannel.ts +102 -192
  227. package/src/effect/WebChannel/broadcastChannelWithAck.ts +25 -15
  228. package/src/effect/WebChannel/common.ts +16 -17
  229. package/src/effect/WebSocket.test.ts +2 -2
  230. package/src/effect/WebSocket.ts +20 -16
  231. package/src/effect/mod.browser-build.test.ts +19 -0
  232. package/src/effect/{index.ts → mod.ts} +43 -69
  233. package/src/effect/spanEvent.test.ts +92 -0
  234. package/src/effect/spanEvent.ts +17 -0
  235. package/src/env.ts +2 -1
  236. package/src/fast-deep-equal.ts +9 -10
  237. package/src/global.ts +4 -2
  238. package/src/misc.ts +13 -5
  239. package/src/mod.ts +188 -32
  240. package/src/node/mod.ts +57 -12
  241. package/src/object/index.ts +0 -24
  242. package/src/object/stringify-object.test.ts +1 -0
  243. package/src/object/stringify-object.ts +2 -2
  244. package/src/qr.ts +125 -0
  245. package/src/set.ts +1 -1
  246. package/src/string.ts +0 -3
  247. package/dist/.tsbuildinfo.json +0 -1
  248. package/dist/browser.d.ts.map +0 -1
  249. package/dist/browser.js.map +0 -1
  250. package/dist/effect/BucketQueue.d.ts +0 -20
  251. package/dist/effect/BucketQueue.d.ts.map +0 -1
  252. package/dist/effect/BucketQueue.js +0 -34
  253. package/dist/effect/BucketQueue.js.map +0 -1
  254. package/dist/effect/Scheduler.d.ts +0 -4
  255. package/dist/effect/Scheduler.d.ts.map +0 -1
  256. package/dist/effect/Scheduler.js +0 -9
  257. package/dist/effect/Scheduler.js.map +0 -1
  258. package/dist/effect/ServiceContext.d.ts +0 -37
  259. package/dist/effect/ServiceContext.d.ts.map +0 -1
  260. package/dist/effect/ServiceContext.js +0 -55
  261. package/dist/effect/ServiceContext.js.map +0 -1
  262. package/dist/effect/WebLock.d.ts.map +0 -1
  263. package/dist/effect/WebLock.js.map +0 -1
  264. package/dist/effect/index.d.ts +0 -32
  265. package/dist/effect/index.d.ts.map +0 -1
  266. package/dist/effect/index.js +0 -35
  267. package/dist/effect/index.js.map +0 -1
  268. package/dist/guards.d.ts +0 -6
  269. package/dist/guards.d.ts.map +0 -1
  270. package/dist/guards.js +0 -6
  271. package/dist/guards.js.map +0 -1
  272. package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts +0 -4
  273. package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts.map +0 -1
  274. package/dist/node/ChildProcessRunner/ChildProcessRunner.js +0 -122
  275. package/dist/node/ChildProcessRunner/ChildProcessRunner.js.map +0 -1
  276. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts +0 -2
  277. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts.map +0 -1
  278. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js +0 -218
  279. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js.map +0 -1
  280. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts +0 -84
  281. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts.map +0 -1
  282. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js +0 -68
  283. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js.map +0 -1
  284. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts +0 -2
  285. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts.map +0 -1
  286. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js +0 -52
  287. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js.map +0 -1
  288. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts +0 -23
  289. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts.map +0 -1
  290. package/dist/node/ChildProcessRunner/ChildProcessWorker.js +0 -138
  291. package/dist/node/ChildProcessRunner/ChildProcessWorker.js.map +0 -1
  292. package/dist/object/omit.d.ts +0 -3
  293. package/dist/object/omit.d.ts.map +0 -1
  294. package/dist/object/omit.js +0 -14
  295. package/dist/object/omit.js.map +0 -1
  296. package/dist/object/pick.d.ts +0 -14
  297. package/dist/object/pick.d.ts.map +0 -1
  298. package/dist/object/pick.js +0 -17
  299. package/dist/object/pick.js.map +0 -1
  300. package/dist/time.d.ts +0 -12
  301. package/dist/time.d.ts.map +0 -1
  302. package/dist/time.js +0 -22
  303. package/dist/time.js.map +0 -1
  304. package/src/effect/BucketQueue.ts +0 -49
  305. package/src/effect/Scheduler.ts +0 -13
  306. package/src/effect/ServiceContext.ts +0 -108
  307. package/src/guards.ts +0 -8
  308. package/src/node/ChildProcessRunner/ChildProcessRunner.ts +0 -135
  309. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.ts +0 -302
  310. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts +0 -78
  311. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts +0 -66
  312. package/src/node/ChildProcessRunner/ChildProcessWorker.ts +0 -168
  313. package/src/object/omit.ts +0 -17
  314. package/src/object/pick.ts +0 -27
  315. package/src/time.ts +0 -25
  316. /package/dist/{effect → browser}/WebLock.d.ts +0 -0
@@ -0,0 +1,587 @@
1
+ import './QuotaExceededError.ts'
2
+ import { Predicate, Schema } from 'effect'
3
+
4
+ /**
5
+ * Unique identifier for web errors.
6
+ */
7
+ const TypeId = '~@livestore/utils/WebError' as const
8
+
9
+ /**
10
+ * Type guard to check if a value is a web error.
11
+ *
12
+ * @param u - The value to check
13
+ * @returns `true` if the value is an `WebError`, `false` otherwise
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * import { WebError } from "@livestore/utils/effect"
18
+ *
19
+ * const someError = new Error("generic error")
20
+ * const webError = new WebError.UnknownError({
21
+ * module: "Test",
22
+ * method: "example"
23
+ * })
24
+ *
25
+ * console.log(WebError.isWebError(someError)) // false
26
+ * console.log(WebError.isWebError(webError)) // true
27
+ * ```
28
+ */
29
+ export const isWebError = (u: unknown): u is WebError => Predicate.hasProperty(u, TypeId)
30
+
31
+ // ============================================================================
32
+ // Simple Exception Errors
33
+ // ============================================================================
34
+ //
35
+ // [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error#standard_error_types)
36
+ // [Specification](https://webidl.spec.whatwg.org/#dfn-simple-exception)
37
+
38
+ /**
39
+ * Error for the web standard "EvalError" simple exception.
40
+ *
41
+ * Thrown when the `eval` function is used in a way that violates its usage restrictions.
42
+ *
43
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Evalerror | MDN Reference}
44
+ * @see {@link https://webidl.spec.whatwg.org/#exceptiondef-evalerror | Specification}
45
+ */
46
+ export class EvalError extends Schema.TaggedError<EvalError>(`${TypeId}/EvalError`)('EvalError', {
47
+ cause: Schema.instanceOf(globalThis.EvalError),
48
+ }) {
49
+ readonly [TypeId] = TypeId
50
+ }
51
+
52
+ /**
53
+ * Error for the web standard "RangeError" simple exception.
54
+ *
55
+ * Indicates that a numeric value is outside the permitted range.
56
+ *
57
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Rangeerror | MDN Reference}
58
+ * @see {@link https://webidl.spec.whatwg.org/#exceptiondef-rangeerror | Specification}
59
+ */
60
+ export class RangeError extends Schema.TaggedError<RangeError>(`${TypeId}/RangeError`)('RangeError', {
61
+ cause: Schema.instanceOf(globalThis.RangeError),
62
+ }) {
63
+ readonly [TypeId] = TypeId
64
+ }
65
+
66
+ /**
67
+ * Error for the web standard "ReferenceError" simple exception.
68
+ *
69
+ * Raised when code references an identifier that has not been defined.
70
+ *
71
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Referenceerror | MDN Reference}
72
+ * @see {@link https://webidl.spec.whatwg.org/#exceptiondef-referenceerror | Specification}
73
+ */
74
+ export class ReferenceError extends Schema.TaggedError<ReferenceError>(`${TypeId}/ReferenceError`)('ReferenceError', {
75
+ cause: Schema.instanceOf(globalThis.ReferenceError),
76
+ }) {
77
+ readonly [TypeId] = TypeId
78
+ }
79
+
80
+ /**
81
+ * Error for the web standard "TypeError" simple exception.
82
+ *
83
+ * Occurs when an operation is applied to a value of an inappropriate type.
84
+ *
85
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Typeerror | MDN Reference}
86
+ * @see {@link https://webidl.spec.whatwg.org/#exceptiondef-typeerror | Specification}
87
+ */
88
+ export class TypeError extends Schema.TaggedError<TypeError>(`${TypeId}/TypeError`)('TypeError', {
89
+ cause: Schema.instanceOf(globalThis.TypeError),
90
+ }) {
91
+ readonly [TypeId] = TypeId
92
+ }
93
+
94
+ /**
95
+ * Error for the web standard "URIError" simple exception.
96
+ *
97
+ * Signals incorrect usage of global URI handling functions such as `decodeURI` or `encodeURI`.
98
+ *
99
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/URIerror | MDN Reference}
100
+ * @see {@link https://webidl.spec.whatwg.org/#exceptiondef-urierror | Specification}
101
+ */
102
+ export class URIError extends Schema.TaggedError<URIError>(`${TypeId}/URIError`)('URIError', {
103
+ cause: Schema.instanceOf(globalThis.URIError),
104
+ }) {
105
+ readonly [TypeId] = TypeId
106
+ }
107
+
108
+ // ============================================================================
109
+ // Predefined DOMException Errors
110
+ // ============================================================================
111
+ //
112
+ // [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/DOMException)
113
+ // [Specification](https://webidl.spec.whatwg.org/#idl-DOMException-derived-predefineds)
114
+
115
+ const domExceptionWithName = (expectedName: string) =>
116
+ Schema.instanceOf(DOMException).check(
117
+ Schema.makeFilter((domException) =>
118
+ domException.name === expectedName
119
+ ? undefined
120
+ : `Expected DOMException with name "${expectedName}", got "${domException.name}"`,
121
+ ),
122
+ )
123
+
124
+ /**
125
+ * Error for the web standard "QuotaExceededError" DOMException-derived error.
126
+ *
127
+ * The quota has been exceeded.
128
+ *
129
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/QuotaExceededError | MDN Reference}
130
+ * @see {@link https://webidl.spec.whatwg.org/#quotaexceedederror | Specification}
131
+ */
132
+ export class QuotaExceededError extends Schema.TaggedError<QuotaExceededError>(`${TypeId}/QuotaExceededError`)(
133
+ 'QuotaExceededError',
134
+ {
135
+ cause: Schema.Union([
136
+ typeof globalThis.QuotaExceededError === 'function'
137
+ ? Schema.instanceOf(globalThis.QuotaExceededError)
138
+ : Schema.Never,
139
+ // Deprecated but still in use in some browsers
140
+ domExceptionWithName('QuotaExceededError'),
141
+ ]),
142
+ },
143
+ ) {
144
+ readonly [TypeId] = TypeId
145
+ override get message(): string {
146
+ return this.cause.message
147
+ }
148
+ }
149
+
150
+ // ============================================================================
151
+ // Base DOMException Errors
152
+ // ============================================================================
153
+ //
154
+ // [MDN Reference](https://developer.mozilla.org/en-US/docs/Web/API/DOMException#error_names)
155
+ // [Specification](https://webidl.spec.whatwg.org/#idl-DOMException-error-names)
156
+
157
+ /**
158
+ * Error for the web standard "NoModificationAllowedError" DOMException.
159
+ *
160
+ * The object can not be modified.
161
+ *
162
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#nomodificationallowederror | MDN Reference}
163
+ * @see {@link https://webidl.spec.whatwg.org/#nomodificationallowederror | Specification}
164
+ */
165
+ export class NoModificationAllowedError extends Schema.TaggedError<NoModificationAllowedError>(
166
+ `${TypeId}/NoModificationAllowedError`,
167
+ )('NoModificationAllowedError', {
168
+ cause: domExceptionWithName('NoModificationAllowedError'),
169
+ }) {
170
+ readonly [TypeId] = TypeId
171
+ override get message(): string {
172
+ return this.cause.message
173
+ }
174
+ }
175
+
176
+ /**
177
+ * Error for the web standard "NotFoundError" DOMException
178
+ *
179
+ * The object can not be found here.
180
+ *
181
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#notfounderror | MDN Reference}
182
+ * @see {@link https://webidl.spec.whatwg.org/#notfounderror | Specification}
183
+ */
184
+ export class NotFoundError extends Schema.TaggedError<NotFoundError>(`${TypeId}/NotFoundError`)('NotFoundError', {
185
+ cause: domExceptionWithName('NotFoundError'),
186
+ }) {
187
+ readonly [TypeId] = TypeId
188
+ override get message(): string {
189
+ return this.cause.message
190
+ }
191
+ }
192
+
193
+ /**
194
+ * Error for the web standard "NotAllowedError" DOMException
195
+ *
196
+ * The request is not allowed by the user agent or the platform in the current context, possibly because the user denied permission.
197
+ *
198
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#notallowederror | MDN Reference}
199
+ * @see {@link https://webidl.spec.whatwg.org/#notallowederror | Specification}
200
+ */
201
+ export class NotAllowedError extends Schema.TaggedError<NotAllowedError>(`${TypeId}/NotAllowedError`)(
202
+ 'NotAllowedError',
203
+ {
204
+ cause: domExceptionWithName('NotAllowedError'),
205
+ },
206
+ ) {
207
+ readonly [TypeId] = TypeId
208
+ override get message(): string {
209
+ return this.cause.message
210
+ }
211
+ }
212
+
213
+ /**
214
+ * Error for the web standard "TypeMismatchError" DOMException.
215
+ *
216
+ * The object can not be converted to the expected type.
217
+ *
218
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#typemismatcherror | MDN Reference}
219
+ * @see {@link https://webidl.spec.whatwg.org/#typemismatcherror | Specification}
220
+ */
221
+ export class TypeMismatchError extends Schema.TaggedError<TypeMismatchError>(`${TypeId}/TypeMismatchError`)(
222
+ 'TypeMismatchError',
223
+ {
224
+ cause: domExceptionWithName('TypeMismatchError'),
225
+ },
226
+ ) {
227
+ readonly [TypeId] = TypeId
228
+ override get message(): string {
229
+ return this.cause.message
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Error for the web standard "InvalidStateError" DOMException.
235
+ *
236
+ * The object is in an invalid state.
237
+ *
238
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#invalidstateerror | MDN Reference}
239
+ * @see {@link https://webidl.spec.whatwg.org/#invalidstateerror | Specification}
240
+ */
241
+ export class InvalidStateError extends Schema.TaggedError<InvalidStateError>(`${TypeId}/InvalidStateError`)(
242
+ 'InvalidStateError',
243
+ {
244
+ cause: domExceptionWithName('InvalidStateError'),
245
+ },
246
+ ) {
247
+ readonly [TypeId] = TypeId
248
+ override get message(): string {
249
+ return this.cause.message
250
+ }
251
+ }
252
+
253
+ /**
254
+ * Error for the web standard "AbortError" DOMException.
255
+ *
256
+ * The operation was aborted.
257
+ *
258
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#aborterror | MDN Reference}
259
+ * @see {@link https://webidl.spec.whatwg.org/#aborterror | Specification}
260
+ */
261
+ export class AbortError extends Schema.TaggedError<AbortError>(`${TypeId}/AbortError`)('AbortError', {
262
+ cause: domExceptionWithName('AbortError'),
263
+ }) {
264
+ readonly [TypeId] = TypeId
265
+ override get message(): string {
266
+ return this.cause.message
267
+ }
268
+ }
269
+
270
+ /**
271
+ * Error for the web standard "InvalidModificationError" DOMException.
272
+ *
273
+ * The object can not be modified in this way.
274
+ *
275
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#invalidmodificationerror | MDN Reference}
276
+ * @see {@link https://webidl.spec.whatwg.org/#invalidmodificationerror | Specification}
277
+ */
278
+ export class InvalidModificationError extends Schema.TaggedError<InvalidModificationError>(
279
+ `${TypeId}/InvalidModificationError`,
280
+ )('InvalidModificationError', {
281
+ cause: domExceptionWithName('InvalidModificationError'),
282
+ }) {
283
+ readonly [TypeId] = TypeId
284
+ override get message(): string {
285
+ return this.cause.message
286
+ }
287
+ }
288
+
289
+ /**
290
+ * Error for the web standard "SecurityError" DOMException.
291
+ *
292
+ * The operation is insecure.
293
+ *
294
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#securityerror | MDN Reference}
295
+ * @see {@link https://webidl.spec.whatwg.org/#securityerror | Specification}
296
+ */
297
+ export class SecurityError extends Schema.TaggedError<SecurityError>(`${TypeId}/SecurityError`)('SecurityError', {
298
+ cause: domExceptionWithName('SecurityError'),
299
+ }) {
300
+ readonly [TypeId] = TypeId
301
+ override get message(): string {
302
+ return this.cause.message
303
+ }
304
+ }
305
+
306
+ /**
307
+ * Error for the web standard "DataCloneError" DOMException.
308
+ *
309
+ * The object can not be cloned.
310
+ *
311
+ * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/DOMException#datacloneerror | MDN Reference}
312
+ * @see {@link https://webidl.spec.whatwg.org/#datacloneerror | Specification}
313
+ */
314
+ export class DataCloneError extends Schema.TaggedError<DataCloneError>(`${TypeId}/DataCloneError`)('DataCloneError', {
315
+ cause: domExceptionWithName('DataCloneError'),
316
+ }) {
317
+ readonly [TypeId] = TypeId
318
+ override get message(): string {
319
+ return this.cause.message
320
+ }
321
+ }
322
+
323
+ // ============================================================================
324
+ // Custom Errors
325
+ // ============================================================================
326
+
327
+ /**
328
+ * Catch-all error for unexpected runtime errors in web environments.
329
+ *
330
+ * This error is used when an unexpected exception occurs that doesn't fit
331
+ * into the other specific error categories. It provides context about where
332
+ * the error occurred and preserves the original cause for debugging.
333
+ *
334
+ * @example
335
+ * ```ts
336
+ * import { WebError } from "@livestore/utils/effect"
337
+ * import { Effect } from "effect"
338
+ *
339
+ * const riskyOperation = () => {
340
+ * try {
341
+ * // Some operation that might throw
342
+ * throw new Error("Unexpected runtime issue")
343
+ * } catch (cause) {
344
+ * return Effect.fail(new WebError.UnknownError({
345
+ * module: "JSON",
346
+ * method: "parse",
347
+ * description: "Could not parse string as JSON",
348
+ * cause
349
+ * }))
350
+ * }
351
+ * }
352
+ *
353
+ * const program = riskyOperation().pipe(
354
+ * Effect.catchTag("UnknownError", (error) => {
355
+ * console.log(error.message)
356
+ * // "JSON.parse: Could not parse string as JSON"
357
+ * return Effect.succeed("JSON parsing not possible")
358
+ * })
359
+ * )
360
+ * ```
361
+ */
362
+ export class UnknownError extends Schema.TaggedError<UnknownError>(`${TypeId}/UnknownError`)('UnknownError', {
363
+ module: Schema.optional(Schema.String),
364
+ method: Schema.optional(Schema.String),
365
+ description: Schema.optional(Schema.String),
366
+ cause: Schema.optional(Schema.Defect()),
367
+ }) {
368
+ readonly [TypeId] = TypeId
369
+ override get message(): string {
370
+ const messageEnd = Predicate.isUndefined(this.description) === true ? 'A web error occurred' : this.description
371
+ const moduleMethod =
372
+ Predicate.isString(this.module) === true && Predicate.isString(this.method) === true
373
+ ? `${this.module}.${this.method}`
374
+ : undefined
375
+ return Predicate.isUndefined(moduleMethod) === true ? messageEnd : `${moduleMethod}: ${messageEnd}`
376
+ }
377
+ }
378
+
379
+ /**
380
+ * Union type representing all possible web errors.
381
+ *
382
+ * @example
383
+ * ```ts
384
+ * import { WebError } from "@livestore/utils/effect"
385
+ * import { Effect, Match } from "effect"
386
+ *
387
+ * const handleAnyWebError = Match.type<WebError.WebError>().pipe(
388
+ * Match.tag("NotFoundError", (err) =>
389
+ * `Not found error: ${err.cause.message}`
390
+ * ),
391
+ * Match.tag("TypeError", (err) =>
392
+ * `Type error: ${err.cause.message}`
393
+ * ),
394
+ * Match.orElse((err) =>
395
+ * `Unknown error: ${err.message}`
396
+ * )
397
+ * )
398
+ * ```
399
+ */
400
+ export type WebError =
401
+ // Simple Exception Errors
402
+ | EvalError
403
+ | RangeError
404
+ | ReferenceError
405
+ | TypeError
406
+ | URIError
407
+ // Base DOMException Errors
408
+ | NoModificationAllowedError
409
+ | NotFoundError
410
+ | NotAllowedError
411
+ | TypeMismatchError
412
+ | InvalidStateError
413
+ | AbortError
414
+ | InvalidModificationError
415
+ | SecurityError
416
+ | DataCloneError
417
+ // Predefined DOMException Errors
418
+ | QuotaExceededError
419
+ // Custom Errors
420
+ | UnknownError
421
+
422
+ /**
423
+ * Schema for validating and parsing web errors.
424
+ *
425
+ * This schema can be used to decode unknown values into properly typed web
426
+ * errors, ensuring type safety when handling errors from external sources or
427
+ * serialized data.
428
+ */
429
+ export const WebError: Schema.Union<
430
+ [
431
+ // Simple Exception Errors
432
+ typeof EvalError,
433
+ typeof RangeError,
434
+ typeof ReferenceError,
435
+ typeof TypeError,
436
+ typeof URIError,
437
+ // Predefined DOMException Errors
438
+ typeof QuotaExceededError,
439
+ // Base DOMException Errors
440
+ typeof NoModificationAllowedError,
441
+ typeof NotFoundError,
442
+ typeof NotAllowedError,
443
+ typeof TypeMismatchError,
444
+ typeof InvalidStateError,
445
+ typeof AbortError,
446
+ typeof InvalidModificationError,
447
+ typeof SecurityError,
448
+ typeof DataCloneError,
449
+ // Custom Errors
450
+ typeof UnknownError,
451
+ ]
452
+ > = Schema.Union([
453
+ // Simple Exception Errors
454
+ EvalError,
455
+ RangeError,
456
+ ReferenceError,
457
+ TypeError,
458
+ URIError,
459
+ // Predefined DOMException Errors
460
+ QuotaExceededError,
461
+ // Base DOMException Errors
462
+ NoModificationAllowedError,
463
+ NotFoundError,
464
+ NotAllowedError,
465
+ TypeMismatchError,
466
+ InvalidStateError,
467
+ AbortError,
468
+ InvalidModificationError,
469
+ SecurityError,
470
+ DataCloneError,
471
+ // Custom Errors
472
+ UnknownError,
473
+ ])
474
+
475
+ /**
476
+ * Constructor type for any `WebError` variant exposed by the schema union.
477
+ *
478
+ * Useful when constraining APIs (e.g. `parseWebError`) to accept only
479
+ * specific web error constructors while preserving their instance types.
480
+ */
481
+ type WebErrorConstructor = (typeof WebError.members)[number]
482
+
483
+ /**
484
+ * Parses an unknown value into a typed WebError instance.
485
+ *
486
+ * This function safely attempts to parse the provided value into one of the
487
+ * known WebError types. If the value does not match any known type, it
488
+ * defaults to return an `UnknownError` that encapsulates the value and
489
+ * the original error information.
490
+ *
491
+ * @param value - The unknown value to parse
492
+ * @param expected - The errors we expect to receive. Can be used to narrow the return type.
493
+ * @returns A union of the WebError instance. UnknownError is always included in the union
494
+ * as a fallback when the specific error type cannot be determined.
495
+ *
496
+ * @example
497
+ * ```ts
498
+ * import { WebError } from "@livestore/utils/effect"
499
+ *
500
+ * // ┌─── Effect<PermissionStatus, WebError.InvalidStateError | WebError.TypeError | WebError.UnknownError>
501
+ * // ▼
502
+ * const permissionStatus = Effect.tryPromise({
503
+ * try: () => navigator.permissions.query({ name: 'geolocation' }),
504
+ * catch: (u) => WebError.parseWebError(u, [WebError.InvalidStateError, WebError.TypeError]),
505
+ * })
506
+ * ```
507
+ *
508
+ * @example
509
+ * Passing specific expected errors narrows the return type
510
+ * ```ts
511
+ * const specificError = WebError.parseWebError(error, [WebError.InvalidStateError, WebError.TypeError])
512
+ * // specificError is typed as WebError.InvalidStateError | WebError.TypeError | WebError.UnknownError
513
+ * ```
514
+ *
515
+ * @example
516
+ * Without additional arguments the full union type is returned
517
+ * ```ts
518
+ * const anyError = WebError.parseWebError(error)
519
+ * // anyError is typed as WebError (all possible error types)
520
+ * ```
521
+ */
522
+ export function classifyWebError(value: unknown): WebError
523
+ export function classifyWebError<BECs extends readonly WebErrorConstructor[]>(
524
+ value: unknown,
525
+ expected: BECs,
526
+ ): InstanceType<BECs[number]> | UnknownError
527
+ export function classifyWebError(value: unknown, expected: readonly WebErrorConstructor[] = []): WebError {
528
+ const parsed = parseWebError(value)
529
+
530
+ if (expected.length === 0) return parsed
531
+
532
+ if (expected.some((ErrorConstructor) => parsed instanceof ErrorConstructor) === true) return parsed
533
+
534
+ return parsed instanceof UnknownError ? parsed : new UnknownError({ cause: parsed })
535
+ }
536
+
537
+ /**
538
+ * Converts web-native exception shapes to LiveStore's `WebError`
539
+ * classes while preserving the original value as `cause`.
540
+ */
541
+ const parseWebError = (cause: unknown): WebError => {
542
+ if (isWebError(cause) === true) return cause
543
+
544
+ // Simple Exception Errors
545
+ if (cause instanceof globalThis.EvalError) return new EvalError({ cause: cause })
546
+ if (cause instanceof globalThis.RangeError) return new RangeError({ cause: cause })
547
+ if (cause instanceof globalThis.ReferenceError) return new ReferenceError({ cause: cause })
548
+ if (cause instanceof globalThis.TypeError) return new TypeError({ cause: cause })
549
+ if (cause instanceof globalThis.URIError) return new URIError({ cause: cause })
550
+
551
+ // Predefined DOMException Errors
552
+ if (typeof globalThis.QuotaExceededError === 'function' && cause instanceof globalThis.QuotaExceededError) {
553
+ return new QuotaExceededError({ cause: cause })
554
+ }
555
+
556
+ // Base DOMException Errors
557
+ if (cause instanceof DOMException) {
558
+ switch (cause.name) {
559
+ case 'QuotaExceededError':
560
+ return new QuotaExceededError({ cause: cause })
561
+ case 'NoModificationAllowedError':
562
+ return new NoModificationAllowedError({ cause: cause })
563
+ case 'NotFoundError':
564
+ return new NotFoundError({ cause: cause })
565
+ case 'NotAllowedError':
566
+ return new NotAllowedError({ cause: cause })
567
+ case 'TypeMismatchError':
568
+ return new TypeMismatchError({ cause: cause })
569
+ case 'InvalidStateError':
570
+ return new InvalidStateError({ cause: cause })
571
+ case 'AbortError':
572
+ return new AbortError({ cause: cause })
573
+ case 'InvalidModificationError':
574
+ return new InvalidModificationError({ cause: cause })
575
+ case 'SecurityError':
576
+ return new SecurityError({ cause: cause })
577
+ case 'DataCloneError':
578
+ return new DataCloneError({ cause: cause })
579
+ default:
580
+ break
581
+ }
582
+ }
583
+
584
+ if (cause instanceof Error) return new UnknownError({ description: cause.message, cause: cause })
585
+
586
+ return new UnknownError({ cause: cause })
587
+ }