@livestore/adapter-web 0.0.0-snapshot-a953343ad2d7468c6573bcb5e26f0eab4302078f

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 (111) hide show
  1. package/.eslintrc.cjs +6 -0
  2. package/README.md +12 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/common/connection.d.ts +7 -0
  5. package/dist/common/connection.d.ts.map +1 -0
  6. package/dist/common/connection.js +25 -0
  7. package/dist/common/connection.js.map +1 -0
  8. package/dist/devtools-bridge/background-browser-channel.d.ts +9 -0
  9. package/dist/devtools-bridge/background-browser-channel.d.ts.map +1 -0
  10. package/dist/devtools-bridge/background-browser-channel.js +31 -0
  11. package/dist/devtools-bridge/background-browser-channel.js.map +1 -0
  12. package/dist/devtools-bridge/background-message.d.ts +75 -0
  13. package/dist/devtools-bridge/background-message.d.ts.map +1 -0
  14. package/dist/devtools-bridge/background-message.js +53 -0
  15. package/dist/devtools-bridge/background-message.js.map +1 -0
  16. package/dist/devtools-bridge/bridge-shared.d.ts +14 -0
  17. package/dist/devtools-bridge/bridge-shared.d.ts.map +1 -0
  18. package/dist/devtools-bridge/bridge-shared.js +67 -0
  19. package/dist/devtools-bridge/bridge-shared.js.map +1 -0
  20. package/dist/devtools-bridge/browser-extension-bridge.d.ts +3 -0
  21. package/dist/devtools-bridge/browser-extension-bridge.d.ts.map +1 -0
  22. package/dist/devtools-bridge/browser-extension-bridge.js +59 -0
  23. package/dist/devtools-bridge/browser-extension-bridge.js.map +1 -0
  24. package/dist/devtools-bridge/iframe-message.d.ts +16 -0
  25. package/dist/devtools-bridge/iframe-message.d.ts.map +1 -0
  26. package/dist/devtools-bridge/iframe-message.js +11 -0
  27. package/dist/devtools-bridge/iframe-message.js.map +1 -0
  28. package/dist/devtools-bridge/index.d.ts +6 -0
  29. package/dist/devtools-bridge/index.d.ts.map +1 -0
  30. package/dist/devtools-bridge/index.js +5 -0
  31. package/dist/devtools-bridge/index.js.map +1 -0
  32. package/dist/devtools-bridge/web-bridge.d.ts +31 -0
  33. package/dist/devtools-bridge/web-bridge.d.ts.map +1 -0
  34. package/dist/devtools-bridge/web-bridge.js +131 -0
  35. package/dist/devtools-bridge/web-bridge.js.map +1 -0
  36. package/dist/in-memory/index.d.ts +4 -0
  37. package/dist/in-memory/index.d.ts.map +1 -0
  38. package/dist/in-memory/index.js +50 -0
  39. package/dist/in-memory/index.js.map +1 -0
  40. package/dist/index.d.ts +4 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +4 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/opfs-utils.d.ts +5 -0
  45. package/dist/opfs-utils.d.ts.map +1 -0
  46. package/dist/opfs-utils.js +43 -0
  47. package/dist/opfs-utils.js.map +1 -0
  48. package/dist/web-worker/client-session/client-session-devtools.d.ts +7 -0
  49. package/dist/web-worker/client-session/client-session-devtools.d.ts.map +1 -0
  50. package/dist/web-worker/client-session/client-session-devtools.js +107 -0
  51. package/dist/web-worker/client-session/client-session-devtools.js.map +1 -0
  52. package/dist/web-worker/client-session/index.d.ts +41 -0
  53. package/dist/web-worker/client-session/index.d.ts.map +1 -0
  54. package/dist/web-worker/client-session/index.js +299 -0
  55. package/dist/web-worker/client-session/index.js.map +1 -0
  56. package/dist/web-worker/client-session/trim-batch.d.ts +4 -0
  57. package/dist/web-worker/client-session/trim-batch.d.ts.map +1 -0
  58. package/dist/web-worker/client-session/trim-batch.js +13 -0
  59. package/dist/web-worker/client-session/trim-batch.js.map +1 -0
  60. package/dist/web-worker/client-session/trim-batch.test.d.ts +2 -0
  61. package/dist/web-worker/client-session/trim-batch.test.d.ts.map +1 -0
  62. package/dist/web-worker/client-session/trim-batch.test.js +38 -0
  63. package/dist/web-worker/client-session/trim-batch.test.js.map +1 -0
  64. package/dist/web-worker/common/persisted-sqlite.d.ts +23 -0
  65. package/dist/web-worker/common/persisted-sqlite.d.ts.map +1 -0
  66. package/dist/web-worker/common/persisted-sqlite.js +92 -0
  67. package/dist/web-worker/common/persisted-sqlite.js.map +1 -0
  68. package/dist/web-worker/common/shutdown-channel.d.ts +7 -0
  69. package/dist/web-worker/common/shutdown-channel.d.ts.map +1 -0
  70. package/dist/web-worker/common/shutdown-channel.js +7 -0
  71. package/dist/web-worker/common/shutdown-channel.js.map +1 -0
  72. package/dist/web-worker/common/worker-schema.d.ts +226 -0
  73. package/dist/web-worker/common/worker-schema.d.ts.map +1 -0
  74. package/dist/web-worker/common/worker-schema.js +176 -0
  75. package/dist/web-worker/common/worker-schema.js.map +1 -0
  76. package/dist/web-worker/leader-worker/make-leader-worker.d.ts +15 -0
  77. package/dist/web-worker/leader-worker/make-leader-worker.d.ts.map +1 -0
  78. package/dist/web-worker/leader-worker/make-leader-worker.js +144 -0
  79. package/dist/web-worker/leader-worker/make-leader-worker.js.map +1 -0
  80. package/dist/web-worker/shared-worker/make-shared-worker.d.ts +2 -0
  81. package/dist/web-worker/shared-worker/make-shared-worker.d.ts.map +1 -0
  82. package/dist/web-worker/shared-worker/make-shared-worker.js +160 -0
  83. package/dist/web-worker/shared-worker/make-shared-worker.js.map +1 -0
  84. package/dist/web-worker/vite-dev-polyfill.d.ts +2 -0
  85. package/dist/web-worker/vite-dev-polyfill.d.ts.map +1 -0
  86. package/dist/web-worker/vite-dev-polyfill.js +37 -0
  87. package/dist/web-worker/vite-dev-polyfill.js.map +1 -0
  88. package/package.json +78 -0
  89. package/src/common/connection.ts +32 -0
  90. package/src/devtools-bridge/background-browser-channel.ts +57 -0
  91. package/src/devtools-bridge/background-message.ts +42 -0
  92. package/src/devtools-bridge/bridge-shared.ts +97 -0
  93. package/src/devtools-bridge/browser-extension-bridge.ts +64 -0
  94. package/src/devtools-bridge/iframe-message.ts +9 -0
  95. package/src/devtools-bridge/index.ts +9 -0
  96. package/src/devtools-bridge/web-bridge.ts +169 -0
  97. package/src/in-memory/index.ts +66 -0
  98. package/src/index.ts +3 -0
  99. package/src/opfs-utils.ts +61 -0
  100. package/src/web-worker/ambient.d.ts +37 -0
  101. package/src/web-worker/client-session/client-session-devtools.ts +167 -0
  102. package/src/web-worker/client-session/index.ts +537 -0
  103. package/src/web-worker/client-session/trim-batch.test.ts +48 -0
  104. package/src/web-worker/client-session/trim-batch.ts +15 -0
  105. package/src/web-worker/common/persisted-sqlite.ts +136 -0
  106. package/src/web-worker/common/shutdown-channel.ts +8 -0
  107. package/src/web-worker/common/worker-schema.ts +206 -0
  108. package/src/web-worker/leader-worker/make-leader-worker.ts +276 -0
  109. package/src/web-worker/shared-worker/make-shared-worker.ts +300 -0
  110. package/src/web-worker/vite-dev-polyfill.ts +36 -0
  111. package/tsconfig.json +17 -0
@@ -0,0 +1,300 @@
1
+ import { IntentionalShutdownCause, UnexpectedError } from '@livestore/common'
2
+ import { connectViaWorker } from '@livestore/devtools-web-common/web-channel'
3
+ import * as WebMeshWorker from '@livestore/devtools-web-common/worker'
4
+ import { isDevEnv, isNotUndefined, LS_DEV } from '@livestore/utils'
5
+ import {
6
+ BrowserWorker,
7
+ BrowserWorkerRunner,
8
+ Deferred,
9
+ Duration,
10
+ Effect,
11
+ Exit,
12
+ FetchHttpClient,
13
+ identity,
14
+ Layer,
15
+ Logger,
16
+ LogLevel,
17
+ ParseResult,
18
+ Queue,
19
+ Ref,
20
+ Schema,
21
+ Scope,
22
+ Stream,
23
+ SubscriptionRef,
24
+ TaskTracing,
25
+ Worker,
26
+ WorkerError,
27
+ WorkerRunner,
28
+ } from '@livestore/utils/effect'
29
+
30
+ import { makeShutdownChannel } from '../common/shutdown-channel.js'
31
+ import * as WorkerSchema from '../common/worker-schema.js'
32
+
33
+ if (isDevEnv()) {
34
+ globalThis.__debugLiveStoreUtils = {
35
+ blobUrl: (buffer: Uint8Array) => URL.createObjectURL(new Blob([buffer], { type: 'application/octet-stream' })),
36
+ runSync: (effect: Effect.Effect<any, any, never>) => Effect.runSync(effect),
37
+ runFork: (effect: Effect.Effect<any, any, never>) => Effect.runFork(effect),
38
+ }
39
+ }
40
+
41
+ const makeWorkerRunner = Effect.gen(function* () {
42
+ const leaderWorkerContextSubRef = yield* SubscriptionRef.make<
43
+ | {
44
+ worker: Worker.SerializedWorkerPool<WorkerSchema.LeaderWorkerInner.Request>
45
+ scope: Scope.CloseableScope
46
+ }
47
+ | undefined
48
+ >(undefined)
49
+
50
+ const initialMessagePayloadDeferredRef = yield* Deferred.make<
51
+ typeof WorkerSchema.SharedWorker.InitialMessagePayloadFromClientSession.Type
52
+ >().pipe(Effect.andThen(Ref.make))
53
+
54
+ const waitForWorker = SubscriptionRef.waitUntil(leaderWorkerContextSubRef, isNotUndefined).pipe(
55
+ Effect.map((_) => _.worker),
56
+ )
57
+
58
+ const forwardRequest = <TReq extends WorkerSchema.LeaderWorkerInner.Request>(
59
+ req: TReq,
60
+ ): TReq extends Schema.WithResult<infer A, infer _I, infer _E, infer _EI, infer _R>
61
+ ? Effect.Effect<A, UnexpectedError, never>
62
+ : never =>
63
+ waitForWorker.pipe(
64
+ // Effect.logBefore(`forwardRequest: ${req._tag}`),
65
+ Effect.andThen((worker) => worker.executeEffect(req) as Effect.Effect<unknown, unknown, never>),
66
+ // Effect.tap((_) => Effect.log(`forwardRequest: ${req._tag}`, _)),
67
+ // Effect.tapError((cause) => Effect.logError(`forwardRequest err: ${req._tag}`, cause)),
68
+ Effect.logWarnIfTakesLongerThan({
69
+ label: `@livestore/adapter-web:shared-worker:forwardRequest:${req._tag}`,
70
+ duration: 500,
71
+ }),
72
+ Effect.mapError((cause) =>
73
+ Schema.is(UnexpectedError)(cause)
74
+ ? cause
75
+ : ParseResult.isParseError(cause) || Schema.is(WorkerError.WorkerError)(cause)
76
+ ? new UnexpectedError({ cause })
77
+ : cause,
78
+ ),
79
+ Effect.catchAllDefect((cause) => new UnexpectedError({ cause })),
80
+ Effect.tapCauseLogPretty,
81
+ ) as any
82
+
83
+ // const forwardRequestStream = <TReq extends WorkerSchema.DedicatedWorkerInner.Request>(
84
+ // req: TReq,
85
+ // ): TReq extends Serializable.WithResult<infer A, infer _I, infer _E, infer _EI, infer _R>
86
+ // ? Stream.Stream<A, UnexpectedError, never>
87
+ // : never =>
88
+ // waitForWorker.pipe(
89
+ // Effect.logBefore(`forwardRequestStream: ${req._tag}`),
90
+ // Effect.andThen((worker) => worker.execute(req) as Stream.Stream<unknown, unknown, never>),
91
+ // Effect.interruptible,
92
+ // UnexpectedError.mapToUnexpectedError,
93
+ // Effect.tapCauseLogPretty,
94
+ // Stream.unwrap,
95
+ // Stream.ensuring(Effect.logDebug(`shutting down stream for ${req._tag}`)),
96
+ // UnexpectedError.mapToUnexpectedErrorStream,
97
+ // ) as any
98
+
99
+ // TODO bring back the `forwardRequestStream` impl above. Needs debugging with Tim Smart
100
+ // It seems the in-progress streams are not being closed properly if the worker is closed (e.g. by closing the leader tab)
101
+ const forwardRequestStream = <TReq extends WorkerSchema.LeaderWorkerInner.Request>(
102
+ req: TReq,
103
+ ): TReq extends Schema.WithResult<infer A, infer _I, infer _E, infer _EI, infer _R>
104
+ ? Stream.Stream<A, UnexpectedError, never>
105
+ : never =>
106
+ Effect.gen(function* () {
107
+ const { worker, scope } = yield* SubscriptionRef.waitUntil(leaderWorkerContextSubRef, isNotUndefined)
108
+ const queue = yield* Queue.unbounded()
109
+
110
+ yield* Scope.addFinalizer(scope, Queue.shutdown(queue))
111
+
112
+ const workerStream = worker.execute(req) as Stream.Stream<unknown, unknown, never>
113
+
114
+ yield* workerStream.pipe(
115
+ Stream.tap((_) => Queue.offer(queue, _)),
116
+ Stream.runDrain,
117
+ Effect.interruptible,
118
+ Effect.forkIn(scope),
119
+ )
120
+
121
+ return Stream.fromQueue(queue)
122
+ }).pipe(
123
+ UnexpectedError.mapToUnexpectedError,
124
+ Effect.tapCauseLogPretty,
125
+ Stream.unwrap,
126
+ Stream.mapError((cause) =>
127
+ Schema.is(UnexpectedError)(cause)
128
+ ? cause
129
+ : ParseResult.isParseError(cause) || Schema.is(WorkerError.WorkerError)(cause)
130
+ ? new UnexpectedError({ cause })
131
+ : cause,
132
+ ),
133
+ // Stream.ensuring(Effect.logDebug(`shutting down stream for ${req._tag}`)),
134
+ ) as any
135
+
136
+ const resetCurrentWorkerCtx = Effect.gen(function* () {
137
+ const prevWorker = yield* SubscriptionRef.get(leaderWorkerContextSubRef)
138
+ if (prevWorker !== undefined) {
139
+ // NOTE we're already unsetting the current worker here, so new incoming requests are queued for the new worker
140
+ yield* SubscriptionRef.set(leaderWorkerContextSubRef, undefined)
141
+
142
+ yield* Effect.yieldNow()
143
+
144
+ yield* Scope.close(prevWorker.scope, Exit.void).pipe(
145
+ // TODO there still seem to be scenarios where it takes longer than 1 second which is leading to problems
146
+ Effect.timeout(Duration.seconds(1)),
147
+ Effect.logWarnIfTakesLongerThan({
148
+ label: '@livestore/adapter-web:shared-worker:close-previous-worker',
149
+ duration: 500,
150
+ }),
151
+ // Effect.catchTag('TimeoutException', () => Scope.close(prevWorker.scope, Exit.fail('boom'))),
152
+ Effect.ignoreLogged,
153
+ )
154
+ }
155
+ }).pipe(Effect.withSpan('@livestore/adapter-web:shared-worker:resetCurrentWorkerCtx'))
156
+
157
+ // const devtoolsWebBridge = yield* makeDevtoolsWebBridge
158
+
159
+ const reset = Effect.gen(function* () {
160
+ yield* Effect.logDebug('reset')
161
+
162
+ const initialMessagePayloadDeferred =
163
+ yield* Deferred.make<typeof WorkerSchema.SharedWorker.InitialMessagePayloadFromClientSession.Type>()
164
+ yield* Ref.set(initialMessagePayloadDeferredRef, initialMessagePayloadDeferred)
165
+
166
+ yield* resetCurrentWorkerCtx
167
+ // yield* devtoolsWebBridge.reset
168
+ })
169
+
170
+ return WorkerRunner.layerSerialized(WorkerSchema.SharedWorker.Request, {
171
+ InitialMessage: (message) =>
172
+ Effect.gen(function* () {
173
+ if (message.payload._tag === 'FromWebBridge') return
174
+
175
+ const initialMessagePayloadDeferred = yield* Ref.get(initialMessagePayloadDeferredRef)
176
+ const deferredAlreadyDone = yield* Deferred.isDone(initialMessagePayloadDeferred)
177
+ const initialMessage = message.payload.initialMessage
178
+
179
+ if (deferredAlreadyDone) {
180
+ const previousInitialMessage = yield* Deferred.await(initialMessagePayloadDeferred)
181
+ const messageSchema = WorkerSchema.LeaderWorkerInner.InitialMessage.pipe(
182
+ Schema.omit('devtoolsEnabled', 'debugInstanceId'),
183
+ )
184
+ const isEqual = Schema.equivalence(messageSchema)
185
+ if (isEqual(initialMessage, previousInitialMessage.initialMessage) === false) {
186
+ const diff = Schema.debugDiff(messageSchema)(previousInitialMessage.initialMessage, initialMessage)
187
+
188
+ yield* new UnexpectedError({
189
+ cause: 'Initial message already sent and was different now',
190
+ payload: {
191
+ diff,
192
+ previousInitialMessage,
193
+ newInitialMessage: initialMessage,
194
+ },
195
+ })
196
+ }
197
+ } else {
198
+ yield* Deferred.succeed(initialMessagePayloadDeferred, message.payload)
199
+ }
200
+ }),
201
+ // Whenever the client session leader changes (and thus creates a new leader thread), the new client session leader
202
+ // sends a new MessagePort to the shared worker which proxies messages to the new leader thread.
203
+ UpdateMessagePort: ({ port }) =>
204
+ Effect.gen(function* () {
205
+ const initialMessagePayload = yield* initialMessagePayloadDeferredRef.get.pipe(Effect.andThen(Deferred.await))
206
+
207
+ yield* resetCurrentWorkerCtx
208
+
209
+ const scope = yield* Scope.make()
210
+
211
+ const workerDeferred = yield* Deferred.make<
212
+ Worker.SerializedWorkerPool<WorkerSchema.LeaderWorkerInner.Request>,
213
+ UnexpectedError
214
+ >()
215
+ // TODO we could also keep the pool instance around to re-use it by removing the previous worker and adding a new one
216
+ yield* Worker.makePoolSerialized<WorkerSchema.LeaderWorkerInner.Request>({
217
+ size: 1,
218
+ concurrency: 100,
219
+ initialMessage: () => initialMessagePayload.initialMessage,
220
+ }).pipe(
221
+ Effect.tap((worker) => Deferred.succeed(workerDeferred, worker)),
222
+ Effect.provide(BrowserWorker.layer(() => port)),
223
+ Effect.catchAllCause((cause) => new UnexpectedError({ cause })),
224
+ Effect.tapError((cause) => Deferred.fail(workerDeferred, cause)),
225
+ Effect.withSpan('@livestore/adapter-web:shared-worker:makeWorkerProxyFromPort'),
226
+ Effect.tapCauseLogPretty,
227
+ Scope.extend(scope),
228
+ Effect.forkIn(scope),
229
+ )
230
+
231
+ yield* Effect.gen(function* () {
232
+ const shutdownChannel = yield* makeShutdownChannel(initialMessagePayload.initialMessage.storeId)
233
+
234
+ yield* shutdownChannel.listen.pipe(
235
+ Stream.flatten(),
236
+ Stream.filter(Schema.is(IntentionalShutdownCause)),
237
+ Stream.tap(() => reset),
238
+ Stream.runDrain,
239
+ )
240
+ }).pipe(Effect.tapCauseLogPretty, Scope.extend(scope), Effect.forkIn(scope))
241
+
242
+ const worker = yield* workerDeferred
243
+
244
+ // Prepare the web mesh connection for leader worker to be able to connect to the devtools
245
+ const { node } = yield* WebMeshWorker.CacheService
246
+ const { storeId, clientId } = initialMessagePayload.initialMessage
247
+
248
+ yield* connectViaWorker({ node, worker, target: `leader-${storeId}-${clientId}` }).pipe(
249
+ Effect.tapCauseLogPretty,
250
+ Scope.extend(scope),
251
+ Effect.forkIn(scope),
252
+ )
253
+
254
+ yield* SubscriptionRef.set(leaderWorkerContextSubRef, { worker, scope })
255
+ }).pipe(
256
+ Effect.withSpan('@livestore/adapter-web:shared-worker:updateMessagePort'),
257
+ UnexpectedError.mapToUnexpectedError,
258
+ Effect.tapCauseLogPretty,
259
+ ),
260
+
261
+ // Proxied requests
262
+ BootStatusStream: forwardRequestStream,
263
+ PushToLeader: forwardRequest,
264
+ PullStream: forwardRequestStream,
265
+ Export: forwardRequest,
266
+ GetRecreateSnapshot: forwardRequest,
267
+ ExportMutationlog: forwardRequest,
268
+ Setup: forwardRequest,
269
+ GetLeaderSyncState: forwardRequest,
270
+ GetLeaderHead: forwardRequest,
271
+ NetworkStatusStream: forwardRequestStream,
272
+ Shutdown: forwardRequest,
273
+ ExtraDevtoolsMessage: forwardRequest,
274
+
275
+ // Accept devtools connections (from leader and client sessions)
276
+ 'DevtoolsWebCommon.CreateConnection': WebMeshWorker.CreateConnection,
277
+
278
+ // ...devtoolsWebBridge.handlers,
279
+ })
280
+ }).pipe(Layer.unwrapScoped)
281
+
282
+ export const makeWorker = () => {
283
+ makeWorkerRunner.pipe(
284
+ Layer.provide(BrowserWorkerRunner.layer),
285
+ Layer.launch,
286
+ Effect.scoped,
287
+ Effect.tapCauseLogPretty,
288
+ Effect.annotateLogs({ thread: self.name }),
289
+ Effect.provide(Logger.prettyWithThread(self.name)),
290
+ Effect.provide(FetchHttpClient.layer),
291
+ Effect.provide(WebMeshWorker.CacheService.layer({ nodeName: 'shared-worker' })),
292
+ LS_DEV ? TaskTracing.withAsyncTaggingTracing((name) => (console as any).createTask(name)) : identity,
293
+ // TODO remove type-cast (currently needed to silence a tsc bug)
294
+ (_) => _ as any as Effect.Effect<void, any>,
295
+ Logger.withMinimumLogLevel(LogLevel.Debug),
296
+ Effect.runFork,
297
+ )
298
+ }
299
+
300
+ makeWorker()
@@ -0,0 +1,36 @@
1
+ // @ts-expect-error TODO remove when Vite does proper treeshaking during dev
2
+ globalThis.$RefreshReg$ = () => {}
3
+ // @ts-expect-error TODO remove when Vite does proper treeshaking during dev
4
+ globalThis.$RefreshSig$ = () => (type: any) => type
5
+
6
+ // // @ts-expect-error Needed for React
7
+ globalThis.process = globalThis.process ?? { env: {} }
8
+
9
+ globalThis.document = (globalThis as any)?.document ?? {
10
+ querySelectorAll: () => [],
11
+ addEventListener: () => {},
12
+ createElement: () => ({
13
+ setAttribute: () => {},
14
+ pathname: '',
15
+ style: {},
16
+ }),
17
+ body: {
18
+ addEventListener: () => {},
19
+ },
20
+ head: {
21
+ appendChild: () => {},
22
+ },
23
+ }
24
+
25
+ globalThis.window = globalThis?.window ?? {
26
+ AnimationEvent: class AnimationEvent {},
27
+ TransitionEvent: class TransitionEvent {},
28
+ addEventListener: () => {},
29
+ location: {
30
+ href: '',
31
+ pathname: '',
32
+ },
33
+ document: globalThis.document,
34
+ }
35
+
36
+ globalThis.HTMLElement = globalThis?.HTMLElement ?? class HTMLElement {}
package/tsconfig.json ADDED
@@ -0,0 +1,17 @@
1
+ {
2
+ "extends": "../../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "./dist",
5
+ "rootDir": "./src",
6
+ "resolveJsonModule": true,
7
+ "tsBuildInfoFile": "./dist/.tsbuildinfo"
8
+ },
9
+ "include": ["./src"],
10
+ "references": [
11
+ { "path": "../common" },
12
+ { "path": "../utils" },
13
+ { "path": "../sqlite-wasm" },
14
+ { "path": "../webmesh" },
15
+ { "path": "../devtools-web-common" },
16
+ ]
17
+ }