@livestore/utils 0.4.0 → 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 (247) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/NoopTracer.d.ts +7 -8
  3. package/dist/NoopTracer.d.ts.map +1 -1
  4. package/dist/NoopTracer.js +3 -18
  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/browser/Opfs/Opfs.d.ts +179 -29
  11. package/dist/browser/Opfs/Opfs.d.ts.map +1 -1
  12. package/dist/browser/Opfs/Opfs.js +132 -307
  13. package/dist/browser/Opfs/Opfs.js.map +1 -1
  14. package/dist/browser/Opfs/debug-utils.d.ts.map +1 -1
  15. package/dist/browser/Opfs/debug-utils.js +5 -4
  16. package/dist/browser/Opfs/debug-utils.js.map +1 -1
  17. package/dist/browser/Opfs/utils.d.ts +8 -8
  18. package/dist/browser/Opfs/utils.d.ts.map +1 -1
  19. package/dist/browser/Opfs/utils.js +35 -26
  20. package/dist/browser/Opfs/utils.js.map +1 -1
  21. package/dist/browser/QuotaExceededError.d.ts +10 -9
  22. package/dist/browser/QuotaExceededError.d.ts.map +1 -1
  23. package/dist/browser/WebChannelBrowser.d.ts.map +1 -1
  24. package/dist/browser/WebChannelBrowser.js +21 -10
  25. package/dist/browser/WebChannelBrowser.js.map +1 -1
  26. package/dist/browser/WebError.d.ts +54 -86
  27. package/dist/browser/WebError.d.ts.map +1 -1
  28. package/dist/browser/WebError.js +91 -84
  29. package/dist/browser/WebError.js.map +1 -1
  30. package/dist/browser/WebError.test.js +6 -6
  31. package/dist/browser/WebError.test.js.map +1 -1
  32. package/dist/browser/WebLock.d.ts.map +1 -1
  33. package/dist/browser/WebLock.js +13 -13
  34. package/dist/browser/WebLock.js.map +1 -1
  35. package/dist/effect/Debug.d.ts +4 -7
  36. package/dist/effect/Debug.d.ts.map +1 -1
  37. package/dist/effect/Debug.js +32 -36
  38. package/dist/effect/Debug.js.map +1 -1
  39. package/dist/effect/Effect.d.ts +31 -22
  40. package/dist/effect/Effect.d.ts.map +1 -1
  41. package/dist/effect/Effect.js +51 -47
  42. package/dist/effect/Effect.js.map +1 -1
  43. package/dist/effect/Effect.test.d.ts +2 -0
  44. package/dist/effect/Effect.test.d.ts.map +1 -0
  45. package/dist/effect/Effect.test.js +72 -0
  46. package/dist/effect/Effect.test.js.map +1 -0
  47. package/dist/effect/Error.d.ts +4 -6
  48. package/dist/effect/Error.d.ts.map +1 -1
  49. package/dist/effect/Logger.d.ts +0 -6
  50. package/dist/effect/Logger.d.ts.map +1 -1
  51. package/dist/effect/Logger.js +0 -32
  52. package/dist/effect/Logger.js.map +1 -1
  53. package/dist/effect/OtelTracer.d.ts +1 -1
  54. package/dist/effect/OtelTracer.d.ts.map +1 -1
  55. package/dist/effect/OtelTracer.js +2 -3
  56. package/dist/effect/OtelTracer.js.map +1 -1
  57. package/dist/effect/RpcClient.d.ts +7 -7
  58. package/dist/effect/RpcClient.d.ts.map +1 -1
  59. package/dist/effect/RpcClient.js +72 -52
  60. package/dist/effect/RpcClient.js.map +1 -1
  61. package/dist/effect/Schedule.d.ts +1 -1
  62. package/dist/effect/Schedule.d.ts.map +1 -1
  63. package/dist/effect/Schedule.js +2 -2
  64. package/dist/effect/Schedule.js.map +1 -1
  65. package/dist/effect/Schema/debug-diff.d.ts +1 -1
  66. package/dist/effect/Schema/debug-diff.d.ts.map +1 -1
  67. package/dist/effect/Schema/debug-diff.js +5 -7
  68. package/dist/effect/Schema/debug-diff.js.map +1 -1
  69. package/dist/effect/Schema/debug-diff.test.js +7 -4
  70. package/dist/effect/Schema/debug-diff.test.js.map +1 -1
  71. package/dist/effect/Schema/index.d.ts +28 -20
  72. package/dist/effect/Schema/index.d.ts.map +1 -1
  73. package/dist/effect/Schema/index.js +55 -28
  74. package/dist/effect/Schema/index.js.map +1 -1
  75. package/dist/effect/Stream.d.ts +13 -5
  76. package/dist/effect/Stream.d.ts.map +1 -1
  77. package/dist/effect/Stream.js +19 -12
  78. package/dist/effect/Stream.js.map +1 -1
  79. package/dist/effect/Stream.test.js +9 -9
  80. package/dist/effect/Stream.test.js.map +1 -1
  81. package/dist/effect/Subscribable.d.ts +9 -3
  82. package/dist/effect/Subscribable.d.ts.map +1 -1
  83. package/dist/effect/Subscribable.js +20 -35
  84. package/dist/effect/Subscribable.js.map +1 -1
  85. package/dist/effect/SubscriptionRef.d.ts +5 -6
  86. package/dist/effect/SubscriptionRef.d.ts.map +1 -1
  87. package/dist/effect/SubscriptionRef.js +2 -3
  88. package/dist/effect/SubscriptionRef.js.map +1 -1
  89. package/dist/effect/TaskTracing.d.ts +1 -1
  90. package/dist/effect/TaskTracing.d.ts.map +1 -1
  91. package/dist/effect/TaskTracing.js +12 -16
  92. package/dist/effect/TaskTracing.js.map +1 -1
  93. package/dist/effect/WebChannel/WebChannel.d.ts +7 -7
  94. package/dist/effect/WebChannel/WebChannel.d.ts.map +1 -1
  95. package/dist/effect/WebChannel/WebChannel.js +64 -43
  96. package/dist/effect/WebChannel/WebChannel.js.map +1 -1
  97. package/dist/effect/WebChannel/WebChannel.test.js +15 -15
  98. package/dist/effect/WebChannel/WebChannel.test.js.map +1 -1
  99. package/dist/effect/WebChannel/broadcastChannelWithAck.d.ts.map +1 -1
  100. package/dist/effect/WebChannel/broadcastChannelWithAck.js +16 -9
  101. package/dist/effect/WebChannel/broadcastChannelWithAck.js.map +1 -1
  102. package/dist/effect/WebChannel/common.d.ts +16 -17
  103. package/dist/effect/WebChannel/common.d.ts.map +1 -1
  104. package/dist/effect/WebChannel/common.js +6 -6
  105. package/dist/effect/WebChannel/common.js.map +1 -1
  106. package/dist/effect/WebSocket.d.ts +4 -6
  107. package/dist/effect/WebSocket.d.ts.map +1 -1
  108. package/dist/effect/WebSocket.js +4 -4
  109. package/dist/effect/WebSocket.js.map +1 -1
  110. package/dist/effect/WebSocket.test.js +2 -2
  111. package/dist/effect/WebSocket.test.js.map +1 -1
  112. package/dist/effect/mod.browser-build.test.d.ts +2 -0
  113. package/dist/effect/mod.browser-build.test.d.ts.map +1 -0
  114. package/dist/effect/mod.browser-build.test.js +18 -0
  115. package/dist/effect/mod.browser-build.test.js.map +1 -0
  116. package/dist/effect/mod.d.ts +13 -15
  117. package/dist/effect/mod.d.ts.map +1 -1
  118. package/dist/effect/mod.js +13 -18
  119. package/dist/effect/mod.js.map +1 -1
  120. package/dist/effect/spanEvent.d.ts.map +1 -1
  121. package/dist/effect/spanEvent.js +2 -2
  122. package/dist/effect/spanEvent.js.map +1 -1
  123. package/dist/effect/spanEvent.test.js +10 -13
  124. package/dist/effect/spanEvent.test.js.map +1 -1
  125. package/dist/fast-deep-equal.d.ts.map +1 -1
  126. package/dist/fast-deep-equal.js +1 -2
  127. package/dist/fast-deep-equal.js.map +1 -1
  128. package/dist/misc.js +2 -2
  129. package/dist/misc.js.map +1 -1
  130. package/dist/mod.d.ts +0 -35
  131. package/dist/mod.d.ts.map +1 -1
  132. package/dist/mod.js +0 -8
  133. package/dist/mod.js.map +1 -1
  134. package/dist/node/mod.d.ts +17 -11
  135. package/dist/node/mod.d.ts.map +1 -1
  136. package/dist/node/mod.js +23 -16
  137. package/dist/node/mod.js.map +1 -1
  138. package/dist/object/index.d.ts +0 -9
  139. package/dist/object/index.d.ts.map +1 -1
  140. package/dist/object/index.js +0 -9
  141. package/dist/object/index.js.map +1 -1
  142. package/dist/string.d.ts +0 -2
  143. package/dist/string.d.ts.map +1 -1
  144. package/dist/string.js +0 -2
  145. package/dist/string.js.map +1 -1
  146. package/package.json +18 -36
  147. package/src/NoopTracer.test.ts +20 -0
  148. package/src/NoopTracer.ts +18 -41
  149. package/src/browser/Opfs/Opfs.ts +304 -277
  150. package/src/browser/Opfs/debug-utils.ts +7 -6
  151. package/src/browser/Opfs/utils.ts +36 -26
  152. package/src/browser/QuotaExceededError.ts +13 -10
  153. package/src/browser/WebChannelBrowser.ts +25 -11
  154. package/src/browser/WebError.test.ts +6 -6
  155. package/src/browser/WebError.ts +107 -133
  156. package/src/browser/WebLock.ts +13 -14
  157. package/src/effect/Debug.ts +66 -59
  158. package/src/effect/Effect.test.ts +117 -0
  159. package/src/effect/Effect.ts +84 -71
  160. package/src/effect/Logger.ts +0 -48
  161. package/src/effect/OtelTracer.ts +2 -3
  162. package/src/effect/RpcClient.ts +80 -61
  163. package/src/effect/Schedule.ts +4 -5
  164. package/src/effect/Schema/debug-diff.test.ts +6 -6
  165. package/src/effect/Schema/debug-diff.ts +6 -8
  166. package/src/effect/Schema/index.ts +122 -61
  167. package/src/effect/Stream.test.ts +9 -9
  168. package/src/effect/Stream.ts +23 -16
  169. package/src/effect/Subscribable.ts +31 -42
  170. package/src/effect/SubscriptionRef.ts +8 -12
  171. package/src/effect/TaskTracing.ts +13 -16
  172. package/src/effect/WebChannel/WebChannel.test.ts +23 -23
  173. package/src/effect/WebChannel/WebChannel.ts +87 -55
  174. package/src/effect/WebChannel/broadcastChannelWithAck.ts +21 -11
  175. package/src/effect/WebChannel/common.ts +14 -15
  176. package/src/effect/WebSocket.test.ts +2 -2
  177. package/src/effect/WebSocket.ts +9 -6
  178. package/src/effect/mod.browser-build.test.ts +19 -0
  179. package/src/effect/mod.ts +35 -69
  180. package/src/effect/spanEvent.test.ts +10 -13
  181. package/src/effect/spanEvent.ts +5 -3
  182. package/src/fast-deep-equal.ts +1 -2
  183. package/src/misc.ts +2 -2
  184. package/src/mod.ts +0 -36
  185. package/src/node/mod.ts +26 -20
  186. package/src/object/index.ts +0 -24
  187. package/src/string.ts +0 -3
  188. package/dist/effect/BucketQueue.d.ts +0 -20
  189. package/dist/effect/BucketQueue.d.ts.map +0 -1
  190. package/dist/effect/BucketQueue.js +0 -34
  191. package/dist/effect/BucketQueue.js.map +0 -1
  192. package/dist/effect/Scheduler.d.ts +0 -4
  193. package/dist/effect/Scheduler.d.ts.map +0 -1
  194. package/dist/effect/Scheduler.js +0 -9
  195. package/dist/effect/Scheduler.js.map +0 -1
  196. package/dist/effect/ServiceContext.d.ts +0 -37
  197. package/dist/effect/ServiceContext.d.ts.map +0 -1
  198. package/dist/effect/ServiceContext.js +0 -55
  199. package/dist/effect/ServiceContext.js.map +0 -1
  200. package/dist/guards.d.ts +0 -20
  201. package/dist/guards.d.ts.map +0 -1
  202. package/dist/guards.js +0 -20
  203. package/dist/guards.js.map +0 -1
  204. package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts +0 -4
  205. package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts.map +0 -1
  206. package/dist/node/ChildProcessRunner/ChildProcessRunner.js +0 -128
  207. package/dist/node/ChildProcessRunner/ChildProcessRunner.js.map +0 -1
  208. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts +0 -10
  209. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts.map +0 -1
  210. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js +0 -217
  211. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js.map +0 -1
  212. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts +0 -84
  213. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts.map +0 -1
  214. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js +0 -68
  215. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js.map +0 -1
  216. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts +0 -2
  217. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts.map +0 -1
  218. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js +0 -52
  219. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js.map +0 -1
  220. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts +0 -23
  221. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts.map +0 -1
  222. package/dist/node/ChildProcessRunner/ChildProcessWorker.js +0 -138
  223. package/dist/node/ChildProcessRunner/ChildProcessWorker.js.map +0 -1
  224. package/dist/object/omit.d.ts +0 -3
  225. package/dist/object/omit.d.ts.map +0 -1
  226. package/dist/object/omit.js +0 -14
  227. package/dist/object/omit.js.map +0 -1
  228. package/dist/object/pick.d.ts +0 -14
  229. package/dist/object/pick.d.ts.map +0 -1
  230. package/dist/object/pick.js +0 -17
  231. package/dist/object/pick.js.map +0 -1
  232. package/dist/time.d.ts +0 -12
  233. package/dist/time.d.ts.map +0 -1
  234. package/dist/time.js +0 -22
  235. package/dist/time.js.map +0 -1
  236. package/src/effect/BucketQueue.ts +0 -49
  237. package/src/effect/Scheduler.ts +0 -13
  238. package/src/effect/ServiceContext.ts +0 -108
  239. package/src/guards.ts +0 -23
  240. package/src/node/ChildProcessRunner/ChildProcessRunner.ts +0 -148
  241. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.ts +0 -311
  242. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts +0 -78
  243. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts +0 -65
  244. package/src/node/ChildProcessRunner/ChildProcessWorker.ts +0 -169
  245. package/src/object/omit.ts +0 -17
  246. package/src/object/pick.ts +0 -27
  247. package/src/time.ts +0 -25
@@ -1,169 +0,0 @@
1
- import type * as ChildProcess from 'node:child_process'
2
-
3
- import * as Worker from '@effect/platform/Worker'
4
- import { WorkerError } from '@effect/platform/WorkerError'
5
- import * as Deferred from 'effect/Deferred'
6
- import * as Effect from 'effect/Effect'
7
- import * as Exit from 'effect/Exit'
8
- import * as Layer from 'effect/Layer'
9
- import * as Scope from 'effect/Scope'
10
-
11
- // Track child processes for cleanup on process signals
12
- const childProcesses = new Set<ChildProcess.ChildProcess>()
13
-
14
- // Force cleanup all tracked child processes
15
- const forceCleanupChildren = (signal: NodeJS.Signals = 'SIGKILL') => {
16
- for (const child of childProcesses) {
17
- try {
18
- if (child.killed === false) {
19
- child.kill(signal)
20
- }
21
- } catch {
22
- // Ignore errors during cleanup
23
- }
24
- }
25
- childProcesses.clear()
26
- }
27
-
28
- // Install signal handlers once to clean up all child processes
29
- let signalHandlersInstalled = false
30
-
31
- const installSignalHandlers = () => {
32
- if (signalHandlersInstalled === true) return
33
- signalHandlersInstalled = true
34
-
35
- // Use 'beforeExit' instead of signal handlers since tests may interfere with signals
36
- process.on('beforeExit', () => {
37
- forceCleanupChildren('SIGKILL')
38
- })
39
-
40
- // Also try to cleanup on uncaught exceptions
41
- process.on('uncaughtException', () => {
42
- forceCleanupChildren('SIGKILL')
43
- })
44
-
45
- // Install signal handlers but make them more robust
46
- const sigintHandler = () => {
47
- forceCleanupChildren('SIGINT')
48
- }
49
-
50
- const sigtermHandler = () => {
51
- forceCleanupChildren('SIGTERM')
52
- }
53
-
54
- const exitHandler = () => {
55
- forceCleanupChildren('SIGKILL')
56
- }
57
-
58
- // Add handlers that will persist even if tests remove/add other handlers
59
- process.prependListener('SIGINT', sigintHandler)
60
- process.prependListener('SIGTERM', sigtermHandler)
61
- process.prependListener('exit', exitHandler)
62
- }
63
-
64
- const platformWorkerImpl = Worker.makePlatform<ChildProcess.ChildProcess>()({
65
- setup({ scope, worker: childProcess }) {
66
- return Effect.flatMap(Deferred.make<void, WorkerError>(), (exitDeferred) => {
67
- // Install signal handlers for process-wide cleanup
68
- installSignalHandlers()
69
-
70
- // Track this child process for cleanup
71
- childProcesses.add(childProcess)
72
-
73
- childProcess.on('exit', () => {
74
- // Remove from tracking when process exits
75
- childProcesses.delete(childProcess)
76
- Deferred.unsafeDone(exitDeferred, Exit.void)
77
- })
78
-
79
- childProcess.send(['setup-parent-death-detection', { parentPid: process.pid }])
80
-
81
- return Effect.as(
82
- Scope.addFinalizer(
83
- scope,
84
- Effect.suspend(() => {
85
- // Try graceful shutdown first
86
- try {
87
- childProcess.send([1])
88
- } catch {
89
- // IPC channel might be closed, proceed to forceful termination
90
- }
91
-
92
- return Deferred.await(exitDeferred)
93
- }).pipe(
94
- Effect.timeout(3000), // Reduced timeout for faster cleanup
95
- Effect.interruptible,
96
- Effect.catchAllCause(() =>
97
- Effect.sync(() => {
98
- // Enhanced cleanup with escalating signals
99
- if (childProcess.killed === false) {
100
- try {
101
- // First try SIGTERM
102
- childProcess.kill('SIGTERM')
103
-
104
- // If still running after a short delay, use SIGKILL
105
- setTimeout(() => {
106
- if (childProcess.killed === false) {
107
- childProcess.kill('SIGKILL')
108
- }
109
- }, 1000)
110
- } catch {
111
- // Process might already be dead
112
- } finally {
113
- // Ensure it's removed from tracking
114
- childProcesses.delete(childProcess)
115
- }
116
- }
117
- }),
118
- ),
119
- ),
120
- ),
121
- {
122
- postMessage: (message: any) => childProcess.send(message),
123
- on: (event: string, handler: (message: any) => void) => childProcess.on(event, handler),
124
- },
125
- )
126
- })
127
- },
128
- listen({ deferred, emit, port }) {
129
- port.on('message', (message) => {
130
- emit(message)
131
- })
132
- port.on('messageerror', (cause) => {
133
- Deferred.unsafeDone(deferred, new WorkerError({ reason: 'decode', cause }))
134
- })
135
- port.on('error', (cause) => {
136
- Deferred.unsafeDone(deferred, new WorkerError({ reason: 'unknown', cause }))
137
- })
138
- port.on('exit', (code) => {
139
- Deferred.unsafeDone(
140
- deferred,
141
- new WorkerError({ reason: 'unknown', cause: new Error(`exited with code ${code}`) }),
142
- )
143
- })
144
- return Effect.void
145
- },
146
- })
147
-
148
- export const layerWorker = Layer.succeed(Worker.PlatformWorker, platformWorkerImpl)
149
-
150
- export const layerManager = Layer.provide(Worker.layerManager, layerWorker)
151
-
152
- /**
153
- * @example
154
- * ```ts
155
- * import * as ChildProcess from 'node:child_process'
156
- * import { Effect, Worker } from '@effect/platform/Worker'
157
- * import { ChildProcessWorker } from '@livestore/utils/node'
158
- *
159
- * Worker.makePoolSerialized<WorkerMessage>({
160
- * size: 1,
161
- * initialMessage: () => new InitialMessage({ name: 'test', data: new Uint8Array([1, 2, 3]) }),
162
- * }).pipe(
163
- * Effect.provide(ChildProcessWorker.layer(() => ChildProcess.fork(new URL('worker.ts', import.meta.url)))),
164
- * )
165
- * ```
166
- *
167
- */
168
- export const layer = (spawn: (id: number) => ChildProcess.ChildProcess) =>
169
- Layer.merge(layerManager, Worker.layerSpawner(spawn))
@@ -1,17 +0,0 @@
1
- // type ConvertUndefined<T> = OrUndefined<{ [K in keyof T as undefined extends T[K] ? K : never]-?: T[K] }>
2
- // type OrUndefined<T> = { [K in keyof T]: T[K] | undefined }
3
- // type PickRequired<T> = { [K in keyof T as undefined extends T[K] ? never : K]: T[K] }
4
- // type ConvertPick<T> = ConvertUndefined<T> & PickRequired<T>
5
-
6
- /** Returns a shallowly cloned object with the provided keys omitted */
7
- export const omit = <Obj extends Record<string, any>, Keys extends keyof Obj>(
8
- obj: Obj,
9
- keys: Keys[],
10
- ): Omit<Obj, Keys> => {
11
- return Object.keys(obj).reduce((acc, key: any) => {
12
- if (keys.includes(key) === false) {
13
- acc[key] = (obj as any)[key]
14
- }
15
- return acc
16
- }, {} as any)
17
- }
@@ -1,27 +0,0 @@
1
- type ConvertUndefined<T> = OrUndefined<{ [K in keyof T as undefined extends T[K] ? K : never]-?: T[K] }>
2
- type OrUndefined<T> = { [K in keyof T]: T[K] | undefined }
3
- type PickRequired<T> = { [K in keyof T as undefined extends T[K] ? never : K]: T[K] }
4
- type ConvertPick<T> = ConvertUndefined<T> & PickRequired<T>
5
-
6
- export const pick = <Obj, Keys extends keyof Obj>(obj: Obj, keys: Keys[]): ConvertPick<{ [K in Keys]: Obj[K] }> => {
7
- return keys.reduce((acc, key) => {
8
- acc[key] = obj[key]
9
- return acc
10
- }, {} as any)
11
- }
12
-
13
- export const pickAllOrElse = <Obj, Keys extends keyof Obj, TElse>(
14
- obj: Obj,
15
- keys: Keys[],
16
- elseValue: TElse,
17
- ): ConvertPick<{ [K in Keys]: NonNullable<Obj[K]> }> | TElse => {
18
- const ret = {} as any
19
- for (const key of keys) {
20
- if (obj[key] === undefined) {
21
- return elseValue
22
- }
23
- ret[key] = obj[key]
24
- }
25
-
26
- return ret
27
- }
package/src/time.ts DELETED
@@ -1,25 +0,0 @@
1
- export const minuteInMs = 1000 * 60
2
-
3
- export const time = {
4
- ms: 1,
5
- sec: 1000,
6
- min: 60 * 1000,
7
- hour: 60 * 60 * 1000,
8
- day: 24 * 60 * 60 * 1000,
9
- week: 7 * 24 * 60 * 60 * 1000,
10
- }
11
-
12
- /** Returns a string of format `m:ss` / `mm:ss` / `h:mm:ss` / ... */
13
- export const msAsTimeString = (ms: number) => {
14
- const seconds = Math.floor(ms / 1000)
15
- const minutes = Math.floor(seconds / 60)
16
- const hours = Math.floor(minutes / 60)
17
- const remainingSeconds = (seconds % 60).toString().padStart(2, '0')
18
- const remainingMinutes = hours > 0 ? (minutes % 60).toString().padStart(2, '0') : minutes % 60
19
-
20
- const timeString = [hours > 0 ? `${hours}:` : '', `${remainingMinutes}:`, remainingSeconds]
21
- .filter((val) => val !== '')
22
- .join('')
23
-
24
- return timeString
25
- }