@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.
Files changed (112) hide show
  1. package/dist/.tsbuildinfo.json +1 -1
  2. package/dist/NoopTracer.d.ts +1 -0
  3. package/dist/NoopTracer.d.ts.map +1 -1
  4. package/dist/NoopTracer.js +1 -1
  5. package/dist/NoopTracer.js.map +1 -1
  6. package/dist/base64.d.ts.map +1 -1
  7. package/dist/base64.js +2 -2
  8. package/dist/base64.js.map +1 -1
  9. package/dist/cuid/cuid.browser.d.ts.map +1 -1
  10. package/dist/cuid/cuid.browser.js +12 -10
  11. package/dist/cuid/cuid.browser.js.map +1 -1
  12. package/dist/cuid/cuid.node.d.ts.map +1 -1
  13. package/dist/cuid/cuid.node.js +17 -11
  14. package/dist/cuid/cuid.node.js.map +1 -1
  15. package/dist/effect/Effect.d.ts.map +1 -1
  16. package/dist/effect/Effect.js +3 -3
  17. package/dist/effect/Effect.js.map +1 -1
  18. package/dist/effect/Scheduler.d.ts.map +1 -1
  19. package/dist/effect/Scheduler.js +0 -1
  20. package/dist/effect/Scheduler.js.map +1 -1
  21. package/dist/effect/Schema/debug-diff.test.js +1 -1
  22. package/dist/effect/Schema/index.d.ts +2 -2
  23. package/dist/effect/Schema/index.js +3 -3
  24. package/dist/effect/Subscribable.d.ts.map +1 -1
  25. package/dist/effect/Subscribable.js +2 -3
  26. package/dist/effect/Subscribable.js.map +1 -1
  27. package/dist/effect/WebChannel/WebChannel.d.ts +13 -17
  28. package/dist/effect/WebChannel/WebChannel.d.ts.map +1 -1
  29. package/dist/effect/WebChannel/WebChannel.js +5 -6
  30. package/dist/effect/WebChannel/WebChannel.js.map +1 -1
  31. package/dist/effect/WebChannel/WebChannel.test.js +1 -1
  32. package/dist/effect/WebChannel/broadcastChannelWithAck.d.ts +2 -2
  33. package/dist/effect/WebChannel/broadcastChannelWithAck.js +2 -2
  34. package/dist/effect/WebChannel/mod.d.ts +3 -3
  35. package/dist/effect/WebChannel/mod.d.ts.map +1 -1
  36. package/dist/effect/WebChannel/mod.js +3 -3
  37. package/dist/effect/WebChannel/mod.js.map +1 -1
  38. package/dist/effect/WebLock.d.ts +1 -1
  39. package/dist/effect/WebLock.d.ts.map +1 -1
  40. package/dist/effect/WebLock.js.map +1 -1
  41. package/dist/effect/WebSocket.test.js +1 -1
  42. package/dist/effect/index.d.ts +22 -23
  43. package/dist/effect/index.d.ts.map +1 -1
  44. package/dist/effect/index.js +25 -26
  45. package/dist/effect/index.js.map +1 -1
  46. package/dist/env.js +1 -1
  47. package/dist/fast-deep-equal.d.ts.map +1 -1
  48. package/dist/fast-deep-equal.js +9 -8
  49. package/dist/fast-deep-equal.js.map +1 -1
  50. package/dist/global.js.map +1 -1
  51. package/dist/index.d.ts +18 -14
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +25 -17
  54. package/dist/index.js.map +1 -1
  55. package/dist/misc.d.ts.map +1 -1
  56. package/dist/misc.js +3 -3
  57. package/dist/misc.js.map +1 -1
  58. package/dist/node/ChildProcessRunner/ChildProcessRunner.d.ts.map +1 -1
  59. package/dist/node/ChildProcessRunner/ChildProcessRunner.js +3 -2
  60. package/dist/node/ChildProcessRunner/ChildProcessRunner.js.map +1 -1
  61. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.js +2 -2
  62. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/schema.d.ts +4 -4
  63. package/dist/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.js +3 -3
  64. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts +1 -1
  65. package/dist/node/ChildProcessRunner/ChildProcessWorker.d.ts.map +1 -1
  66. package/dist/node/ChildProcessRunner/ChildProcessWorker.js +0 -1
  67. package/dist/node/ChildProcessRunner/ChildProcessWorker.js.map +1 -1
  68. package/dist/node/mod.d.ts +4 -4
  69. package/dist/node/mod.d.ts.map +1 -1
  70. package/dist/node/mod.js +5 -5
  71. package/dist/node/mod.js.map +1 -1
  72. package/dist/object/index.d.ts +3 -2
  73. package/dist/object/index.d.ts.map +1 -1
  74. package/dist/object/index.js +3 -2
  75. package/dist/object/index.js.map +1 -1
  76. package/dist/object/stringify-object.d.ts +9 -0
  77. package/dist/object/stringify-object.d.ts.map +1 -0
  78. package/dist/object/stringify-object.js +27 -0
  79. package/dist/object/stringify-object.js.map +1 -0
  80. package/dist/object/stringify-object.test.d.ts +2 -0
  81. package/dist/object/stringify-object.test.d.ts.map +1 -0
  82. package/dist/object/stringify-object.test.js +38 -0
  83. package/dist/object/stringify-object.test.js.map +1 -0
  84. package/package.json +43 -35
  85. package/src/NoopTracer.ts +2 -2
  86. package/src/base64.ts +2 -3
  87. package/src/cuid/cuid.browser.ts +20 -21
  88. package/src/cuid/cuid.node.ts +33 -34
  89. package/src/effect/Effect.ts +6 -3
  90. package/src/effect/Scheduler.ts +0 -1
  91. package/src/effect/Schema/debug-diff.test.ts +2 -2
  92. package/src/effect/Schema/index.ts +3 -3
  93. package/src/effect/Subscribable.ts +6 -5
  94. package/src/effect/WebChannel/WebChannel.test.ts +1 -1
  95. package/src/effect/WebChannel/WebChannel.ts +17 -21
  96. package/src/effect/WebChannel/broadcastChannelWithAck.ts +3 -3
  97. package/src/effect/WebChannel/mod.ts +3 -3
  98. package/src/effect/WebLock.ts +2 -2
  99. package/src/effect/WebSocket.test.ts +1 -1
  100. package/src/effect/index.ts +104 -110
  101. package/src/env.ts +1 -1
  102. package/src/fast-deep-equal.ts +9 -10
  103. package/src/index.ts +27 -17
  104. package/src/misc.ts +3 -3
  105. package/src/node/ChildProcessRunner/ChildProcessRunner.ts +1 -1
  106. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/ChildProcessRunner.test.ts +3 -3
  107. package/src/node/ChildProcessRunner/ChildProcessRunnerTest/serializedWorker.ts +3 -3
  108. package/src/node/ChildProcessRunner/ChildProcessWorker.ts +1 -4
  109. package/src/node/mod.ts +6 -6
  110. package/src/object/index.ts +3 -2
  111. package/src/object/stringify-object.test.ts +44 -0
  112. 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.js'
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
- /* eslint-disable-next-line prefer-arrow/prefer-arrow-functions */
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.js'
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 'Error while printing error: ' + e
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
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
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.js'
9
- import type { WorkerMessage } from './schema.js'
10
- import { GetPersonById, GetUserById, InitialMessage, Person, User } from './schema.js'
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.js'
6
- import * as ChildProcessRunner from '../ChildProcessRunner.js'
7
- import { Person, User, WorkerMessage } from './schema.js'
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
- /* eslint-disable prefer-arrow/prefer-arrow-functions */
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.js'
6
- import { makeNoopTracer } from '../NoopTracer.js'
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.js'
13
- export * as ChildProcessWorker from './ChildProcessRunner/ChildProcessWorker.js'
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
- ) as any as Layer.Layer<OtelTracer.OtelTracer>
50
+ )
51
51
 
52
52
  return TracingLive
53
53
  })
@@ -1,7 +1,8 @@
1
1
  import { pipe } from 'effect'
2
2
 
3
- export * from './pick.js'
4
- export * from './omit.js'
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
+ }