@livestore/utils 0.3.1 → 0.3.2-dev.1
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.json +1 -1
- package/dist/NoopTracer.d.ts +1 -0
- package/dist/NoopTracer.d.ts.map +1 -1
- package/dist/NoopTracer.js +1 -1
- package/dist/NoopTracer.js.map +1 -1
- package/dist/base64.d.ts.map +1 -1
- package/dist/base64.js +2 -2
- package/dist/base64.js.map +1 -1
- package/dist/cuid/cuid.browser.d.ts.map +1 -1
- package/dist/cuid/cuid.browser.js +12 -10
- package/dist/cuid/cuid.browser.js.map +1 -1
- package/dist/cuid/cuid.node.d.ts.map +1 -1
- package/dist/cuid/cuid.node.js +17 -11
- package/dist/cuid/cuid.node.js.map +1 -1
- package/dist/effect/Effect.d.ts.map +1 -1
- package/dist/effect/Effect.js +3 -3
- package/dist/effect/Effect.js.map +1 -1
- package/dist/effect/Scheduler.d.ts.map +1 -1
- package/dist/effect/Scheduler.js +0 -1
- package/dist/effect/Scheduler.js.map +1 -1
- package/dist/effect/Schema/debug-diff.test.js +1 -1
- package/dist/effect/Schema/index.d.ts +2 -2
- package/dist/effect/Schema/index.js +3 -3
- package/dist/effect/Subscribable.d.ts.map +1 -1
- package/dist/effect/Subscribable.js +2 -3
- package/dist/effect/Subscribable.js.map +1 -1
- package/dist/effect/WebChannel/WebChannel.d.ts +13 -17
- package/dist/effect/WebChannel/WebChannel.d.ts.map +1 -1
- package/dist/effect/WebChannel/WebChannel.js +5 -6
- package/dist/effect/WebChannel/WebChannel.js.map +1 -1
- package/dist/effect/WebChannel/WebChannel.test.js +1 -1
- package/dist/effect/WebChannel/broadcastChannelWithAck.d.ts +2 -2
- package/dist/effect/WebChannel/broadcastChannelWithAck.js +2 -2
- package/dist/effect/WebChannel/mod.d.ts +3 -3
- package/dist/effect/WebChannel/mod.d.ts.map +1 -1
- package/dist/effect/WebChannel/mod.js +3 -3
- package/dist/effect/WebChannel/mod.js.map +1 -1
- package/dist/effect/WebLock.d.ts +1 -1
- package/dist/effect/WebLock.d.ts.map +1 -1
- package/dist/effect/WebLock.js.map +1 -1
- package/dist/effect/WebSocket.test.js +1 -1
- package/dist/effect/index.d.ts +22 -23
- package/dist/effect/index.d.ts.map +1 -1
- package/dist/effect/index.js +25 -26
- package/dist/effect/index.js.map +1 -1
- package/dist/env.js +1 -1
- package/dist/fast-deep-equal.d.ts.map +1 -1
- package/dist/fast-deep-equal.js +9 -8
- package/dist/fast-deep-equal.js.map +1 -1
- package/dist/global.js.map +1 -1
- package/dist/index.d.ts +18 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -17
- package/dist/index.js.map +1 -1
- package/dist/misc.d.ts.map +1 -1
- package/dist/misc.js +3 -3
- package/dist/misc.js.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunner.js +3 -2
- package/dist/node/ChildProcessRunner/ChildProcessRunner.js.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js +2 -2
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts +4 -4
- package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js +3 -3
- package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts.map +1 -1
- package/dist/node/ChildProcessRunner/ChildProcessWorker.js +0 -1
- package/dist/node/ChildProcessRunner/ChildProcessWorker.js.map +1 -1
- package/dist/node/mod.d.ts +4 -4
- package/dist/node/mod.d.ts.map +1 -1
- package/dist/node/mod.js +5 -5
- package/dist/node/mod.js.map +1 -1
- package/dist/object/index.d.ts +3 -2
- package/dist/object/index.d.ts.map +1 -1
- package/dist/object/index.js +3 -2
- package/dist/object/index.js.map +1 -1
- package/dist/object/stringify-object.d.ts +9 -0
- package/dist/object/stringify-object.d.ts.map +1 -0
- package/dist/object/stringify-object.js +27 -0
- package/dist/object/stringify-object.js.map +1 -0
- package/dist/object/stringify-object.test.d.ts +2 -0
- package/dist/object/stringify-object.test.d.ts.map +1 -0
- package/dist/object/stringify-object.test.js +38 -0
- package/dist/object/stringify-object.test.js.map +1 -0
- package/package.json +43 -35
- package/src/NoopTracer.ts +2 -2
- package/src/base64.ts +2 -3
- package/src/cuid/cuid.browser.ts +20 -21
- package/src/cuid/cuid.node.ts +33 -34
- package/src/effect/Effect.ts +6 -3
- package/src/effect/Scheduler.ts +0 -1
- package/src/effect/Schema/debug-diff.test.ts +2 -2
- package/src/effect/Schema/index.ts +3 -3
- package/src/effect/Subscribable.ts +6 -5
- package/src/effect/WebChannel/WebChannel.test.ts +1 -1
- package/src/effect/WebChannel/WebChannel.ts +17 -21
- package/src/effect/WebChannel/broadcastChannelWithAck.ts +3 -3
- package/src/effect/WebChannel/mod.ts +3 -3
- package/src/effect/WebLock.ts +2 -2
- package/src/effect/WebSocket.test.ts +1 -1
- package/src/effect/index.ts +104 -110
- package/src/env.ts +1 -1
- package/src/fast-deep-equal.ts +9 -10
- package/src/index.ts +27 -17
- package/src/misc.ts +3 -3
- package/src/node/ChildProcessRunner/ChildProcessRunner.ts +1 -1
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.ts +3 -3
- package/src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts +3 -3
- package/src/node/ChildProcessRunner/ChildProcessWorker.ts +1 -4
- package/src/node/mod.ts +6 -6
- package/src/object/index.ts +3 -2
- package/src/object/stringify-object.test.ts +44 -0
- package/src/object/stringify-object.ts +27 -0
package/src/index.ts
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
export * from './string.js'
|
|
2
|
-
export * from './guards.js'
|
|
3
|
-
export * from './object/index.js'
|
|
4
|
-
export * from './promise.js'
|
|
5
|
-
export * from './time.js'
|
|
6
|
-
export * from './NoopTracer.js'
|
|
7
|
-
export * from './set.js'
|
|
8
|
-
export * from './browser.js'
|
|
9
|
-
export * from './Deferred.js'
|
|
10
|
-
export * from './misc.js'
|
|
11
|
-
export * from './env.js'
|
|
12
|
-
export * from './fast-deep-equal.js'
|
|
13
|
-
export * as base64 from './base64.js'
|
|
14
1
|
export { default as prettyBytes } from 'pretty-bytes'
|
|
2
|
+
export * as base64 from './base64.ts'
|
|
3
|
+
export * from './browser.ts'
|
|
4
|
+
export * from './Deferred.ts'
|
|
5
|
+
export * from './env.ts'
|
|
6
|
+
export * from './fast-deep-equal.ts'
|
|
7
|
+
export * from './guards.ts'
|
|
8
|
+
export * from './misc.ts'
|
|
9
|
+
export * from './NoopTracer.ts'
|
|
10
|
+
export * from './object/index.ts'
|
|
11
|
+
export * from './promise.ts'
|
|
12
|
+
export * from './set.ts'
|
|
13
|
+
export * from './string.ts'
|
|
14
|
+
export * from './time.ts'
|
|
15
15
|
|
|
16
16
|
import type * as otel from '@opentelemetry/api'
|
|
17
17
|
import type { Types } from 'effect'
|
|
18
18
|
|
|
19
|
-
import { objectToString } from './misc.
|
|
19
|
+
import { objectToString } from './misc.ts'
|
|
20
20
|
|
|
21
21
|
export type Prettify<T> = T extends infer U ? { [K in keyof U]: Prettify<U[K]> } : never
|
|
22
22
|
|
|
@@ -53,6 +53,7 @@ export const debugCatch = <T>(try_: () => T): T => {
|
|
|
53
53
|
try {
|
|
54
54
|
return try_()
|
|
55
55
|
} catch (e: any) {
|
|
56
|
+
// biome-ignore lint/suspicious/noDebugger: debugging
|
|
56
57
|
debugger
|
|
57
58
|
throw e
|
|
58
59
|
}
|
|
@@ -72,6 +73,11 @@ export const recRemoveUndefinedValues = (val: any): void => {
|
|
|
72
73
|
}
|
|
73
74
|
}
|
|
74
75
|
|
|
76
|
+
/**
|
|
77
|
+
* Replace non-alphanumeric characters with a dash.
|
|
78
|
+
*/
|
|
79
|
+
export const sluggify = (str: string, separator = '-') => str.replace(/[^a-zA-Z0-9]/g, separator)
|
|
80
|
+
|
|
75
81
|
export const prop =
|
|
76
82
|
<T extends {}, K extends keyof T>(key: K) =>
|
|
77
83
|
(obj: T): T[K] =>
|
|
@@ -85,33 +91,37 @@ export const isReadonlyArray = <I, T>(value: ReadonlyArray<I> | T): value is Rea
|
|
|
85
91
|
* Use this to make assertion at end of if-else chain that all members of a
|
|
86
92
|
* union have been accounted for.
|
|
87
93
|
*/
|
|
88
|
-
|
|
94
|
+
|
|
89
95
|
export function casesHandled(unexpectedCase: never): never {
|
|
96
|
+
// biome-ignore lint/suspicious/noDebugger: debugging
|
|
90
97
|
debugger
|
|
91
98
|
throw new Error(`A case was not handled for value: ${truncate(objectToString(unexpectedCase), 1000)}`)
|
|
92
99
|
}
|
|
93
100
|
|
|
94
101
|
export const assertNever = (failIfFalse: boolean, msg?: string): void => {
|
|
95
102
|
if (failIfFalse === false) {
|
|
103
|
+
// biome-ignore lint/suspicious/noDebugger: debugging
|
|
96
104
|
debugger
|
|
97
105
|
throw new Error(`This should never happen: ${msg}`)
|
|
98
106
|
}
|
|
99
107
|
}
|
|
100
108
|
|
|
101
109
|
export const debuggerPipe = <T>(val: T): T => {
|
|
110
|
+
// biome-ignore lint/suspicious/noDebugger: debugging
|
|
102
111
|
debugger
|
|
103
112
|
return val
|
|
104
113
|
}
|
|
105
114
|
|
|
106
115
|
const truncate = (str: string, length: number): string => {
|
|
107
116
|
if (str.length > length) {
|
|
108
|
-
return str.slice(0, length)
|
|
117
|
+
return `${str.slice(0, length)}...`
|
|
109
118
|
} else {
|
|
110
119
|
return str
|
|
111
120
|
}
|
|
112
121
|
}
|
|
113
122
|
|
|
114
123
|
export const notYetImplemented = (msg?: string): never => {
|
|
124
|
+
// biome-ignore lint/suspicious/noDebugger: debugging
|
|
115
125
|
debugger
|
|
116
126
|
throw new Error(`Not yet implemented: ${msg}`)
|
|
117
127
|
}
|
|
@@ -223,4 +233,4 @@ export const isPromise = (value: any): value is Promise<unknown> => typeof value
|
|
|
223
233
|
|
|
224
234
|
export const isIterable = <T>(value: any): value is Iterable<T> => typeof value?.[Symbol.iterator] === 'function'
|
|
225
235
|
|
|
226
|
-
export { objectToString as errorToString } from './misc.
|
|
236
|
+
export { objectToString as errorToString } from './misc.ts'
|
package/src/misc.ts
CHANGED
|
@@ -26,7 +26,7 @@ export const objectToString = (error: any): string => {
|
|
|
26
26
|
} catch (e: any) {
|
|
27
27
|
console.log(error)
|
|
28
28
|
|
|
29
|
-
return
|
|
29
|
+
return `Error while printing error: ${e}`
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
32
|
|
|
@@ -37,8 +37,7 @@ export const tryAsFunctionAndNew = <TArg, TResult>(
|
|
|
37
37
|
try {
|
|
38
38
|
// @ts-expect-error try out as constructor
|
|
39
39
|
return new fnOrConstructor(arg)
|
|
40
|
-
|
|
41
|
-
} catch (e) {
|
|
40
|
+
} catch (_e) {
|
|
42
41
|
// @ts-expect-error try out as function
|
|
43
42
|
return fnOrConstructor(arg)
|
|
44
43
|
}
|
|
@@ -50,6 +49,7 @@ export const envTruish = (env: string | undefined) =>
|
|
|
50
49
|
export const shouldNeverHappen = (msg?: string, ...args: any[]): never => {
|
|
51
50
|
console.error(msg, ...args)
|
|
52
51
|
if (isDevEnv()) {
|
|
52
|
+
// biome-ignore lint/suspicious/noDebugger: debugging
|
|
53
53
|
debugger
|
|
54
54
|
}
|
|
55
55
|
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/* eslint-disable prefer-arrow/prefer-arrow-functions */
|
|
2
1
|
import process from 'node:process'
|
|
3
2
|
|
|
4
3
|
import { WorkerError } from '@effect/platform/WorkerError'
|
|
@@ -30,6 +29,7 @@ const platformRunnerImpl = Runner.PlatformRunner.of({
|
|
|
30
29
|
Effect.sync(() => port.postMessage([1, message] /*, transfers as any*/))
|
|
31
30
|
|
|
32
31
|
const run = Effect.fnUntraced(function* <A, E, R>(
|
|
32
|
+
// biome-ignore lint/suspicious/noConfusingVoidType: need to support void
|
|
33
33
|
handler: (portId: number, message: I) => Effect.Effect<A, E, R> | void,
|
|
34
34
|
) {
|
|
35
35
|
const runtime = (yield* Effect.interruptible(Effect.runtime<R | Scope.Scope>())).pipe(
|
|
@@ -5,9 +5,9 @@ import * as EffectWorker from '@effect/platform/Worker'
|
|
|
5
5
|
import { assert, describe, it } from '@effect/vitest'
|
|
6
6
|
import { Chunk, Effect, Stream } from 'effect'
|
|
7
7
|
|
|
8
|
-
import * as ChildProcessWorker from '../ChildProcessWorker.
|
|
9
|
-
import type { WorkerMessage } from './schema.
|
|
10
|
-
import { GetPersonById, GetUserById, InitialMessage, Person, User } from './schema.
|
|
8
|
+
import * as ChildProcessWorker from '../ChildProcessWorker.ts'
|
|
9
|
+
import type { WorkerMessage } from './schema.ts'
|
|
10
|
+
import { GetPersonById, GetUserById, InitialMessage, Person, User } from './schema.ts'
|
|
11
11
|
|
|
12
12
|
const WorkerLive = ChildProcessWorker.layer(() =>
|
|
13
13
|
ChildProcess.fork(
|
|
@@ -2,9 +2,9 @@ import * as Runner from '@effect/platform/WorkerRunner'
|
|
|
2
2
|
import { Context, Effect, Layer, Option, Stream } from 'effect'
|
|
3
3
|
|
|
4
4
|
// import { NodeRuntime, NodeWorkerRunner } from '@effect/platform-node'
|
|
5
|
-
import { PlatformNode } from '../../mod.
|
|
6
|
-
import * as ChildProcessRunner from '../ChildProcessRunner.
|
|
7
|
-
import { Person, User, WorkerMessage } from './schema.
|
|
5
|
+
import { PlatformNode } from '../../mod.ts'
|
|
6
|
+
import * as ChildProcessRunner from '../ChildProcessRunner.ts'
|
|
7
|
+
import { Person, User, WorkerMessage } from './schema.ts'
|
|
8
8
|
|
|
9
9
|
interface Name {
|
|
10
10
|
readonly _: unique symbol
|
|
@@ -1,9 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import type * as ChildProcess from 'node:child_process'
|
|
3
2
|
import * as Worker from '@effect/platform/Worker'
|
|
4
3
|
import { WorkerError } from '@effect/platform/WorkerError'
|
|
5
|
-
// eslint-disable-next-line unicorn/prefer-node-protocol
|
|
6
|
-
import type * as ChildProcess from 'child_process'
|
|
7
4
|
import * as Deferred from 'effect/Deferred'
|
|
8
5
|
import * as Effect from 'effect/Effect'
|
|
9
6
|
import * as Exit from 'effect/Exit'
|
package/src/node/mod.ts
CHANGED
|
@@ -2,15 +2,15 @@ import * as http from 'node:http'
|
|
|
2
2
|
|
|
3
3
|
import { Effect, Layer } from 'effect'
|
|
4
4
|
|
|
5
|
-
import { OtelTracer, UnknownError } from '../effect/index.
|
|
6
|
-
import { makeNoopTracer } from '../NoopTracer.
|
|
5
|
+
import { OtelTracer, UnknownError } from '../effect/index.ts'
|
|
6
|
+
import { makeNoopTracer } from '../NoopTracer.ts'
|
|
7
7
|
|
|
8
8
|
export * as Cli from '@effect/cli'
|
|
9
|
-
export * as PlatformNode from '@effect/platform-node'
|
|
10
9
|
export * as SocketServer from '@effect/platform/SocketServer'
|
|
10
|
+
export * as PlatformNode from '@effect/platform-node'
|
|
11
11
|
|
|
12
|
-
export * as ChildProcessRunner from './ChildProcessRunner/ChildProcessRunner.
|
|
13
|
-
export * as ChildProcessWorker from './ChildProcessRunner/ChildProcessWorker.
|
|
12
|
+
export * as ChildProcessRunner from './ChildProcessRunner/ChildProcessRunner.ts'
|
|
13
|
+
export * as ChildProcessWorker from './ChildProcessRunner/ChildProcessWorker.ts'
|
|
14
14
|
|
|
15
15
|
// Enable debug logging for OpenTelemetry
|
|
16
16
|
// otel.diag.setLogger(new otel.DiagConsoleLogger(), otel.DiagLogLevel.ERROR)
|
|
@@ -47,7 +47,7 @@ export const OtelLiveDummy: Layer.Layer<OtelTracer.OtelTracer> = Layer.suspend((
|
|
|
47
47
|
|
|
48
48
|
const TracingLive = Layer.unwrapEffect(Effect.map(OtelTracer.make, Layer.setTracer)).pipe(
|
|
49
49
|
Layer.provideMerge(OtelTracerLive),
|
|
50
|
-
)
|
|
50
|
+
)
|
|
51
51
|
|
|
52
52
|
return TracingLive
|
|
53
53
|
})
|
package/src/object/index.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { pipe } from 'effect'
|
|
2
2
|
|
|
3
|
-
export * from './
|
|
4
|
-
export * from './
|
|
3
|
+
export * from './omit.ts'
|
|
4
|
+
export * from './pick.ts'
|
|
5
|
+
export * from './stringify-object.ts'
|
|
5
6
|
|
|
6
7
|
type ValueOfRecord<R extends Record<any, any>> = R extends Record<any, infer V> ? V : never
|
|
7
8
|
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
import { stringifyObject } from './stringify-object.ts'
|
|
3
|
+
|
|
4
|
+
describe('stringifyObject', () => {
|
|
5
|
+
it('stringifies a flat object', () => {
|
|
6
|
+
const obj = { a: 1, b: 'test', c: true }
|
|
7
|
+
expect(stringifyObject(obj)).toBe('a=1 b=test c=true')
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
it('stringifies a nested object with dot notation', () => {
|
|
11
|
+
const obj = { a: 1, b: { c: 2, d: 'x' } }
|
|
12
|
+
expect(stringifyObject(obj)).toBe('a=1 b.c=2 b.d=x')
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
it('stringifies an object with array values', () => {
|
|
16
|
+
const obj = { a: [1, 2, 3], b: 'x' }
|
|
17
|
+
expect(stringifyObject(obj)).toBe('a=1,2,3 b=x')
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
it('handles objects with undefined and null values', () => {
|
|
21
|
+
const obj = { a: undefined, b: null, c: 1 }
|
|
22
|
+
expect(stringifyObject(obj)).toBe('a=undefined b=null c=1')
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it('handles deeply nested objects', () => {
|
|
26
|
+
const obj = { a: { b: { c: { d: 1 } } } }
|
|
27
|
+
expect(stringifyObject(obj)).toBe('a.b.c.d=1')
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
it('handles complex nested objects with arrays', () => {
|
|
31
|
+
const obj = {
|
|
32
|
+
config: {
|
|
33
|
+
values: [1, 2],
|
|
34
|
+
settings: { enabled: true },
|
|
35
|
+
},
|
|
36
|
+
name: 'test',
|
|
37
|
+
}
|
|
38
|
+
expect(stringifyObject(obj)).toBe('config.values=1,2 config.settings.enabled=true name=test')
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('handles empty object', () => {
|
|
42
|
+
expect(stringifyObject({})).toBe('')
|
|
43
|
+
})
|
|
44
|
+
})
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stringifies object into the following format:
|
|
3
|
+
*
|
|
4
|
+
* `prop1=value prop2=value prop3.key1=value prop3.key2=value prop4.key1=[value1, value2]`
|
|
5
|
+
*
|
|
6
|
+
* This is useful for logging and debugging.
|
|
7
|
+
*/
|
|
8
|
+
export const stringifyObject = (obj: object, prefix = ''): string => {
|
|
9
|
+
const entries: string[] = []
|
|
10
|
+
|
|
11
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
12
|
+
const fullKey = prefix !== '' ? `${prefix}.${key}` : key
|
|
13
|
+
|
|
14
|
+
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
15
|
+
// Recursively stringify nested objects with dot notation
|
|
16
|
+
entries.push(stringifyObject(value, fullKey))
|
|
17
|
+
} else if (Array.isArray(value)) {
|
|
18
|
+
// Arrays get converted to comma-separated values
|
|
19
|
+
entries.push(`${fullKey}=${value.join(',')}`)
|
|
20
|
+
} else {
|
|
21
|
+
// Primitive values
|
|
22
|
+
entries.push(`${fullKey}=${value}`)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return entries.join(' ')
|
|
27
|
+
}
|