@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/NoopTracer.d.ts +7 -8
- package/dist/NoopTracer.d.ts.map +1 -1
- package/dist/NoopTracer.js +3 -18
- package/dist/NoopTracer.js.map +1 -1
- package/dist/NoopTracer.test.d.ts +2 -0
- package/dist/NoopTracer.test.d.ts.map +1 -0
- package/dist/NoopTracer.test.js +17 -0
- package/dist/NoopTracer.test.js.map +1 -0
- package/dist/browser/Opfs/Opfs.d.ts +179 -29
- package/dist/browser/Opfs/Opfs.d.ts.map +1 -1
- package/dist/browser/Opfs/Opfs.js +132 -307
- package/dist/browser/Opfs/Opfs.js.map +1 -1
- package/dist/browser/Opfs/debug-utils.d.ts.map +1 -1
- package/dist/browser/Opfs/debug-utils.js +5 -4
- package/dist/browser/Opfs/debug-utils.js.map +1 -1
- package/dist/browser/Opfs/utils.d.ts +8 -8
- package/dist/browser/Opfs/utils.d.ts.map +1 -1
- package/dist/browser/Opfs/utils.js +35 -26
- package/dist/browser/Opfs/utils.js.map +1 -1
- package/dist/browser/QuotaExceededError.d.ts +10 -9
- package/dist/browser/QuotaExceededError.d.ts.map +1 -1
- package/dist/browser/WebChannelBrowser.d.ts.map +1 -1
- package/dist/browser/WebChannelBrowser.js +21 -10
- package/dist/browser/WebChannelBrowser.js.map +1 -1
- package/dist/browser/WebError.d.ts +54 -86
- package/dist/browser/WebError.d.ts.map +1 -1
- package/dist/browser/WebError.js +91 -84
- package/dist/browser/WebError.js.map +1 -1
- package/dist/browser/WebError.test.js +6 -6
- package/dist/browser/WebError.test.js.map +1 -1
- package/dist/browser/WebLock.d.ts.map +1 -1
- package/dist/browser/WebLock.js +13 -13
- package/dist/browser/WebLock.js.map +1 -1
- package/dist/effect/Debug.d.ts +4 -7
- package/dist/effect/Debug.d.ts.map +1 -1
- package/dist/effect/Debug.js +32 -36
- package/dist/effect/Debug.js.map +1 -1
- package/dist/effect/Effect.d.ts +31 -22
- package/dist/effect/Effect.d.ts.map +1 -1
- package/dist/effect/Effect.js +51 -47
- package/dist/effect/Effect.js.map +1 -1
- package/dist/effect/Effect.test.d.ts +2 -0
- package/dist/effect/Effect.test.d.ts.map +1 -0
- package/dist/effect/Effect.test.js +72 -0
- package/dist/effect/Effect.test.js.map +1 -0
- package/dist/effect/Error.d.ts +4 -6
- package/dist/effect/Error.d.ts.map +1 -1
- package/dist/effect/Logger.d.ts +0 -6
- package/dist/effect/Logger.d.ts.map +1 -1
- package/dist/effect/Logger.js +0 -32
- package/dist/effect/Logger.js.map +1 -1
- package/dist/effect/OtelTracer.d.ts +1 -1
- package/dist/effect/OtelTracer.d.ts.map +1 -1
- package/dist/effect/OtelTracer.js +2 -3
- package/dist/effect/OtelTracer.js.map +1 -1
- package/dist/effect/RpcClient.d.ts +7 -7
- package/dist/effect/RpcClient.d.ts.map +1 -1
- package/dist/effect/RpcClient.js +72 -52
- package/dist/effect/RpcClient.js.map +1 -1
- package/dist/effect/Schedule.d.ts +1 -1
- package/dist/effect/Schedule.d.ts.map +1 -1
- package/dist/effect/Schedule.js +2 -2
- package/dist/effect/Schedule.js.map +1 -1
- package/dist/effect/Schema/debug-diff.d.ts +1 -1
- package/dist/effect/Schema/debug-diff.d.ts.map +1 -1
- package/dist/effect/Schema/debug-diff.js +5 -7
- package/dist/effect/Schema/debug-diff.js.map +1 -1
- package/dist/effect/Schema/debug-diff.test.js +7 -4
- package/dist/effect/Schema/debug-diff.test.js.map +1 -1
- package/dist/effect/Schema/index.d.ts +28 -20
- package/dist/effect/Schema/index.d.ts.map +1 -1
- package/dist/effect/Schema/index.js +55 -28
- package/dist/effect/Schema/index.js.map +1 -1
- package/dist/effect/Stream.d.ts +13 -5
- package/dist/effect/Stream.d.ts.map +1 -1
- package/dist/effect/Stream.js +19 -12
- package/dist/effect/Stream.js.map +1 -1
- package/dist/effect/Stream.test.js +9 -9
- package/dist/effect/Stream.test.js.map +1 -1
- package/dist/effect/Subscribable.d.ts +9 -3
- package/dist/effect/Subscribable.d.ts.map +1 -1
- package/dist/effect/Subscribable.js +20 -35
- package/dist/effect/Subscribable.js.map +1 -1
- package/dist/effect/SubscriptionRef.d.ts +5 -6
- package/dist/effect/SubscriptionRef.d.ts.map +1 -1
- package/dist/effect/SubscriptionRef.js +2 -3
- package/dist/effect/SubscriptionRef.js.map +1 -1
- package/dist/effect/TaskTracing.d.ts +1 -1
- package/dist/effect/TaskTracing.d.ts.map +1 -1
- package/dist/effect/TaskTracing.js +12 -16
- package/dist/effect/TaskTracing.js.map +1 -1
- package/dist/effect/WebChannel/WebChannel.d.ts +7 -7
- package/dist/effect/WebChannel/WebChannel.d.ts.map +1 -1
- package/dist/effect/WebChannel/WebChannel.js +64 -43
- package/dist/effect/WebChannel/WebChannel.js.map +1 -1
- package/dist/effect/WebChannel/WebChannel.test.js +15 -15
- package/dist/effect/WebChannel/WebChannel.test.js.map +1 -1
- package/dist/effect/WebChannel/broadcastChannelWithAck.d.ts.map +1 -1
- package/dist/effect/WebChannel/broadcastChannelWithAck.js +16 -9
- package/dist/effect/WebChannel/broadcastChannelWithAck.js.map +1 -1
- package/dist/effect/WebChannel/common.d.ts +16 -17
- package/dist/effect/WebChannel/common.d.ts.map +1 -1
- package/dist/effect/WebChannel/common.js +6 -6
- package/dist/effect/WebChannel/common.js.map +1 -1
- package/dist/effect/WebSocket.d.ts +4 -6
- package/dist/effect/WebSocket.d.ts.map +1 -1
- package/dist/effect/WebSocket.js +4 -4
- package/dist/effect/WebSocket.js.map +1 -1
- package/dist/effect/WebSocket.test.js +2 -2
- package/dist/effect/WebSocket.test.js.map +1 -1
- package/dist/effect/mod.browser-build.test.d.ts +2 -0
- package/dist/effect/mod.browser-build.test.d.ts.map +1 -0
- package/dist/effect/mod.browser-build.test.js +18 -0
- package/dist/effect/mod.browser-build.test.js.map +1 -0
- package/dist/effect/mod.d.ts +13 -15
- package/dist/effect/mod.d.ts.map +1 -1
- package/dist/effect/mod.js +13 -18
- package/dist/effect/mod.js.map +1 -1
- package/dist/effect/spanEvent.d.ts.map +1 -1
- package/dist/effect/spanEvent.js +2 -2
- package/dist/effect/spanEvent.js.map +1 -1
- package/dist/effect/spanEvent.test.js +10 -13
- package/dist/effect/spanEvent.test.js.map +1 -1
- package/dist/fast-deep-equal.d.ts.map +1 -1
- package/dist/fast-deep-equal.js +1 -2
- package/dist/fast-deep-equal.js.map +1 -1
- package/dist/misc.js +2 -2
- package/dist/misc.js.map +1 -1
- package/dist/mod.d.ts +0 -35
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +0 -8
- package/dist/mod.js.map +1 -1
- package/dist/node/mod.d.ts +17 -11
- package/dist/node/mod.d.ts.map +1 -1
- package/dist/node/mod.js +23 -16
- package/dist/node/mod.js.map +1 -1
- package/dist/object/index.d.ts +0 -9
- package/dist/object/index.d.ts.map +1 -1
- package/dist/object/index.js +0 -9
- package/dist/object/index.js.map +1 -1
- package/dist/string.d.ts +0 -2
- package/dist/string.d.ts.map +1 -1
- package/dist/string.js +0 -2
- package/dist/string.js.map +1 -1
- package/package.json +18 -36
- package/src/NoopTracer.test.ts +20 -0
- package/src/NoopTracer.ts +18 -41
- package/src/browser/Opfs/Opfs.ts +304 -277
- package/src/browser/Opfs/debug-utils.ts +7 -6
- package/src/browser/Opfs/utils.ts +36 -26
- package/src/browser/QuotaExceededError.ts +13 -10
- package/src/browser/WebChannelBrowser.ts +25 -11
- package/src/browser/WebError.test.ts +6 -6
- package/src/browser/WebError.ts +107 -133
- package/src/browser/WebLock.ts +13 -14
- package/src/effect/Debug.ts +66 -59
- package/src/effect/Effect.test.ts +117 -0
- package/src/effect/Effect.ts +84 -71
- package/src/effect/Logger.ts +0 -48
- package/src/effect/OtelTracer.ts +2 -3
- package/src/effect/RpcClient.ts +80 -61
- package/src/effect/Schedule.ts +4 -5
- package/src/effect/Schema/debug-diff.test.ts +6 -6
- package/src/effect/Schema/debug-diff.ts +6 -8
- package/src/effect/Schema/index.ts +122 -61
- package/src/effect/Stream.test.ts +9 -9
- package/src/effect/Stream.ts +23 -16
- package/src/effect/Subscribable.ts +31 -42
- package/src/effect/SubscriptionRef.ts +8 -12
- package/src/effect/TaskTracing.ts +13 -16
- package/src/effect/WebChannel/WebChannel.test.ts +23 -23
- package/src/effect/WebChannel/WebChannel.ts +87 -55
- package/src/effect/WebChannel/broadcastChannelWithAck.ts +21 -11
- package/src/effect/WebChannel/common.ts +14 -15
- package/src/effect/WebSocket.test.ts +2 -2
- package/src/effect/WebSocket.ts +9 -6
- package/src/effect/mod.browser-build.test.ts +19 -0
- package/src/effect/mod.ts +35 -69
- package/src/effect/spanEvent.test.ts +10 -13
- package/src/effect/spanEvent.ts +5 -3
- package/src/fast-deep-equal.ts +1 -2
- package/src/misc.ts +2 -2
- package/src/mod.ts +0 -36
- package/src/node/mod.ts +26 -20
- package/src/object/index.ts +0 -24
- package/src/string.ts +0 -3
- package/dist/effect/BucketQueue.d.ts +0 -20
- package/dist/effect/BucketQueue.d.ts.map +0 -1
- package/dist/effect/BucketQueue.js +0 -34
- package/dist/effect/BucketQueue.js.map +0 -1
- package/dist/effect/Scheduler.d.ts +0 -4
- package/dist/effect/Scheduler.d.ts.map +0 -1
- package/dist/effect/Scheduler.js +0 -9
- package/dist/effect/Scheduler.js.map +0 -1
- package/dist/effect/ServiceContext.d.ts +0 -37
- package/dist/effect/ServiceContext.d.ts.map +0 -1
- package/dist/effect/ServiceContext.js +0 -55
- package/dist/effect/ServiceContext.js.map +0 -1
- package/dist/guards.d.ts +0 -20
- package/dist/guards.d.ts.map +0 -1
- package/dist/guards.js +0 -20
- package/dist/guards.js.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts +0 -4
- package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunner.js +0 -128
- package/dist/node/ChildProcessRunner/ChildProcessRunner.js.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts +0 -10
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.d.ts.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js +0 -217
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts +0 -84
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js +0 -68
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.js.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts +0 -2
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.d.ts.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js +0 -52
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts +0 -23
- package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts.map +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessWorker.js +0 -138
- package/dist/node/ChildProcessRunner/ChildProcessWorker.js.map +0 -1
- package/dist/object/omit.d.ts +0 -3
- package/dist/object/omit.d.ts.map +0 -1
- package/dist/object/omit.js +0 -14
- package/dist/object/omit.js.map +0 -1
- package/dist/object/pick.d.ts +0 -14
- package/dist/object/pick.d.ts.map +0 -1
- package/dist/object/pick.js +0 -17
- package/dist/object/pick.js.map +0 -1
- package/dist/time.d.ts +0 -12
- package/dist/time.d.ts.map +0 -1
- package/dist/time.js +0 -22
- package/dist/time.js.map +0 -1
- package/src/effect/BucketQueue.ts +0 -49
- package/src/effect/Scheduler.ts +0 -13
- package/src/effect/ServiceContext.ts +0 -108
- package/src/guards.ts +0 -23
- package/src/node/ChildProcessRunner/ChildProcessRunner.ts +0 -148
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.ts +0 -311
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/schema.ts +0 -78
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts +0 -65
- package/src/node/ChildProcessRunner/ChildProcessWorker.ts +0 -169
- package/src/object/omit.ts +0 -17
- package/src/object/pick.ts +0 -27
- 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))
|
package/src/object/omit.ts
DELETED
|
@@ -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
|
-
}
|
package/src/object/pick.ts
DELETED
|
@@ -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
|
-
}
|