@absolutejs/sync 2.2.1 → 2.3.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/README.md +89 -32
- package/dist/connectionBroker.d.ts +147 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +322 -55
- package/dist/index.js.map +5 -4
- package/dist/manifest.d.ts +17 -0
- package/dist/manifest.js +8882 -0
- package/dist/manifest.js.map +123 -0
- package/dist/manifest.json +390 -0
- package/package.json +18 -3
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
{
|
|
2
|
+
"contract": 1,
|
|
3
|
+
"identity": {
|
|
4
|
+
"accent": "#10b981",
|
|
5
|
+
"category": "sync",
|
|
6
|
+
"description": "Reactive data over your own database and ORM — no new backend. Three tiers ship in one package: push-on-change over SSE (`createReactiveHub` + the `sync` plugin), ORM-derived topics + `createLiveQuery` (Drizzle/Prisma), and the full sync engine (`/engine`): row-level live collections over WebSocket with optimistic mutations, offline queue, declarative permissions and schemas, CRDT collaborative editing, live full-text/vector search, scheduled functions, CDC for Postgres/MySQL/SQLite, incremental joins/aggregations, point-in-time replay, and cluster fan-out. CRDT backends (`sync/crdt-adapter`) and cluster buses (`sync/cluster-bus`) are pluggable.",
|
|
7
|
+
"docsUrl": "https://github.com/absolutejs/sync",
|
|
8
|
+
"name": "@absolutejs/sync",
|
|
9
|
+
"tagline": "Live data everywhere — changes appear instantly, no refresh."
|
|
10
|
+
},
|
|
11
|
+
"implements": [
|
|
12
|
+
{
|
|
13
|
+
"contract": "sync/crdt-adapter",
|
|
14
|
+
"factory": "rgaText",
|
|
15
|
+
"from": "@absolutejs/sync/crdt",
|
|
16
|
+
"title": "Built-in collaborative text (zero dependencies)",
|
|
17
|
+
"wiring": {
|
|
18
|
+
"code": "rgaText",
|
|
19
|
+
"imports": [
|
|
20
|
+
{
|
|
21
|
+
"from": "@absolutejs/sync/crdt",
|
|
22
|
+
"names": [
|
|
23
|
+
"rgaText"
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"contract": "sync/cluster-bus",
|
|
31
|
+
"factory": "createInMemoryClusterBus",
|
|
32
|
+
"from": "@absolutejs/sync/engine",
|
|
33
|
+
"title": "In process (development only — does not span machines)",
|
|
34
|
+
"wiring": {
|
|
35
|
+
"code": "createInMemoryClusterBus()",
|
|
36
|
+
"imports": [
|
|
37
|
+
{
|
|
38
|
+
"from": "@absolutejs/sync/engine",
|
|
39
|
+
"names": [
|
|
40
|
+
"createInMemoryClusterBus"
|
|
41
|
+
]
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
],
|
|
47
|
+
"lifecycle": [
|
|
48
|
+
{
|
|
49
|
+
"docsUrl": "https://github.com/absolutejs/sync#live-collections--the-sync-engine-tier-3",
|
|
50
|
+
"id": "cdc-triggers",
|
|
51
|
+
"idempotent": true,
|
|
52
|
+
"kind": "migration",
|
|
53
|
+
"title": "Optional: install Postgres notify triggers so writes that bypass mutations still go live (postgresNotifyTrigger + postgresChangeSource)",
|
|
54
|
+
"when": "manual"
|
|
55
|
+
}
|
|
56
|
+
],
|
|
57
|
+
"requires": {
|
|
58
|
+
"peers": [
|
|
59
|
+
{
|
|
60
|
+
"name": "elysia",
|
|
61
|
+
"range": ">= 1.4.26",
|
|
62
|
+
"reason": "plugin host for the SSE, WebSocket, and devtools plugins"
|
|
63
|
+
}
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
"settings": {
|
|
67
|
+
"type": "object",
|
|
68
|
+
"properties": {
|
|
69
|
+
"devtools": {
|
|
70
|
+
"title": "Devtools dashboard",
|
|
71
|
+
"x-group": "devtools",
|
|
72
|
+
"type": "object",
|
|
73
|
+
"properties": {
|
|
74
|
+
"path": {
|
|
75
|
+
"description": "Route the live devtools dashboard is served from. Default /sync/devtools.",
|
|
76
|
+
"title": "Devtools route",
|
|
77
|
+
"type": "string"
|
|
78
|
+
},
|
|
79
|
+
"snapshotMs": {
|
|
80
|
+
"description": "How often the dashboard refreshes its counters, in milliseconds. Default 2000.",
|
|
81
|
+
"minimum": 100,
|
|
82
|
+
"title": "Dashboard refresh interval",
|
|
83
|
+
"type": "number"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"engine": {
|
|
88
|
+
"title": "Sync engine",
|
|
89
|
+
"x-group": "engine",
|
|
90
|
+
"type": "object",
|
|
91
|
+
"properties": {
|
|
92
|
+
"changeLogRetainMs": {
|
|
93
|
+
"description": "Also drop change-log entries older than this many milliseconds — bounds memory and reconnect catch-up work on high-throughput engines.",
|
|
94
|
+
"minimum": 1000,
|
|
95
|
+
"title": "Change history age limit",
|
|
96
|
+
"type": "number"
|
|
97
|
+
},
|
|
98
|
+
"changeLogSize": {
|
|
99
|
+
"description": "How many recent changes are kept so a briefly-disconnected visitor catches up with a small diff instead of a full reload. Default 1024.",
|
|
100
|
+
"minimum": 1,
|
|
101
|
+
"title": "Change history size",
|
|
102
|
+
"type": "integer"
|
|
103
|
+
},
|
|
104
|
+
"instanceId": {
|
|
105
|
+
"description": "Stable name for this server instance. Only needed when running several servers behind a cluster bus, so reconnecting visitors can resume across shards.",
|
|
106
|
+
"title": "Server instance name",
|
|
107
|
+
"type": "string"
|
|
108
|
+
},
|
|
109
|
+
"mutationConcurrency": {
|
|
110
|
+
"description": "How many writes may run at the same time. Extra writes wait their turn — protects the server from a flood.",
|
|
111
|
+
"minimum": 1,
|
|
112
|
+
"title": "Writes running at once",
|
|
113
|
+
"type": "integer"
|
|
114
|
+
},
|
|
115
|
+
"mutationQueueLimit": {
|
|
116
|
+
"description": "How many writes may wait in line once the limit above is full. Beyond this, writes are rejected cleanly instead of piling up.",
|
|
117
|
+
"minimum": 0,
|
|
118
|
+
"title": "Waiting writes limit",
|
|
119
|
+
"type": "integer"
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
},
|
|
123
|
+
"push": {
|
|
124
|
+
"title": "Reactive push (SSE)",
|
|
125
|
+
"x-group": "push",
|
|
126
|
+
"type": "object",
|
|
127
|
+
"properties": {
|
|
128
|
+
"heartbeatMs": {
|
|
129
|
+
"description": "Keep-alive ping interval so idle proxies don’t drop the update stream, in milliseconds. Default 25000.",
|
|
130
|
+
"minimum": 1000,
|
|
131
|
+
"title": "Keep-alive interval",
|
|
132
|
+
"type": "number"
|
|
133
|
+
},
|
|
134
|
+
"path": {
|
|
135
|
+
"description": "Route browsers connect to for instant updates. Default /sync.",
|
|
136
|
+
"title": "Update stream route",
|
|
137
|
+
"type": "string"
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
"socket": {
|
|
142
|
+
"title": "Live-collection socket",
|
|
143
|
+
"x-group": "socket",
|
|
144
|
+
"type": "object",
|
|
145
|
+
"properties": {
|
|
146
|
+
"closeOnSlow": {
|
|
147
|
+
"description": "Disconnect clients that can’t keep up with the update stream (they reconnect and reload fresh). Default off.",
|
|
148
|
+
"title": "Drop slow connections",
|
|
149
|
+
"type": "boolean"
|
|
150
|
+
},
|
|
151
|
+
"maxBufferedBytes": {
|
|
152
|
+
"description": "How many bytes may queue for one connection before it counts as slow.",
|
|
153
|
+
"minimum": 1,
|
|
154
|
+
"title": "Slow-connection threshold",
|
|
155
|
+
"type": "number"
|
|
156
|
+
},
|
|
157
|
+
"path": {
|
|
158
|
+
"description": "WebSocket route live collections connect to. Default /sync/ws.",
|
|
159
|
+
"title": "Live-collection route",
|
|
160
|
+
"type": "string"
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
},
|
|
166
|
+
"slots": {
|
|
167
|
+
"clusterBus": {
|
|
168
|
+
"configPath": "$self",
|
|
169
|
+
"contract": "sync/cluster-bus",
|
|
170
|
+
"description": "How changes fan out across your server instances when you scale horizontally",
|
|
171
|
+
"known": [
|
|
172
|
+
"@absolutejs/sync#memory-bus",
|
|
173
|
+
"@absolutejs/sync-bus-pg",
|
|
174
|
+
"@absolutejs/sync-bus-redis"
|
|
175
|
+
]
|
|
176
|
+
},
|
|
177
|
+
"crdt": {
|
|
178
|
+
"configPath": "$self",
|
|
179
|
+
"contract": "sync/crdt-adapter",
|
|
180
|
+
"description": "The engine that merges simultaneous edits in collaborative text",
|
|
181
|
+
"known": [
|
|
182
|
+
"@absolutejs/sync#rga-text",
|
|
183
|
+
"@absolutejs/sync-yjs",
|
|
184
|
+
"@absolutejs/sync-automerge",
|
|
185
|
+
"@absolutejs/sync-loro"
|
|
186
|
+
]
|
|
187
|
+
}
|
|
188
|
+
},
|
|
189
|
+
"wiring": [
|
|
190
|
+
{
|
|
191
|
+
"description": "Push-on-change over SSE: a mutation publishes the topics it touched and every subscribed view refetches instantly — no polling loops.",
|
|
192
|
+
"id": "default",
|
|
193
|
+
"server": {
|
|
194
|
+
"code": "const hub = createReactiveHub();\n\n// Mount with .use(syncPush). After a durable write, publish the topics\n// it changed and subscribed browsers refetch instantly:\n// hub.publish('orders'); hub.publish('orders:' + order.id);\n// Browsers subscribe with createSyncSubscriber (or createLiveQuery)\n// from '@absolutejs/sync/client'.\nconst syncPush = sync({ heartbeatMs: ${settings.push.heartbeatMs}, hub, path: ${settings.push.path} });",
|
|
195
|
+
"imports": [
|
|
196
|
+
{
|
|
197
|
+
"from": "@absolutejs/sync",
|
|
198
|
+
"names": [
|
|
199
|
+
"createReactiveHub",
|
|
200
|
+
"sync"
|
|
201
|
+
]
|
|
202
|
+
}
|
|
203
|
+
],
|
|
204
|
+
"placement": "module-scope"
|
|
205
|
+
},
|
|
206
|
+
"title": "Instant updates over SSE (kill polling)"
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
"client": {
|
|
210
|
+
"client": {
|
|
211
|
+
"code": "const orders = createLiveQuery({\n\tfetcher: jsonFetcher('/api/orders'),\n\ttopics: ['orders']\n});\n\norders.subscribe((state) => {\n\t// TODO: render state.data — refetched the instant an order changes.\n});",
|
|
212
|
+
"imports": [
|
|
213
|
+
{
|
|
214
|
+
"from": "@absolutejs/sync/client",
|
|
215
|
+
"names": [
|
|
216
|
+
"createLiveQuery",
|
|
217
|
+
"jsonFetcher"
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
],
|
|
221
|
+
"placement": "client-entry"
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
"description": "The ORM adapters derive topics from queries so reads and writes line up automatically — a read of a table subscribes to it, a write publishes it.",
|
|
225
|
+
"id": "live-query",
|
|
226
|
+
"server": {
|
|
227
|
+
"code": "const hub = createReactiveHub();\n\n// Mount with .use(syncPush). Reads map to topics automatically\n// (a list read of `orders` -> topic 'orders'; a primary-key lookup\n// -> 'orders:<id>'). After a write, publish from the same filter:\n// publishWhere(hub, orders, eq(orders.id, id), { op: 'update' });\n// (same function names on '@absolutejs/sync/prisma' for Prisma.)\nconst syncPush = sync({ heartbeatMs: ${settings.push.heartbeatMs}, hub, path: ${settings.push.path} });",
|
|
228
|
+
"imports": [
|
|
229
|
+
{
|
|
230
|
+
"from": "@absolutejs/sync",
|
|
231
|
+
"names": [
|
|
232
|
+
"createReactiveHub",
|
|
233
|
+
"sync"
|
|
234
|
+
]
|
|
235
|
+
},
|
|
236
|
+
{
|
|
237
|
+
"from": "@absolutejs/sync/drizzle",
|
|
238
|
+
"names": [
|
|
239
|
+
"deriveReadTopics",
|
|
240
|
+
"publishWhere"
|
|
241
|
+
]
|
|
242
|
+
}
|
|
243
|
+
],
|
|
244
|
+
"placement": "module-scope"
|
|
245
|
+
},
|
|
246
|
+
"title": "Auto-reactive queries from your ORM (Drizzle / Prisma)"
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
"client": {
|
|
250
|
+
"react": {
|
|
251
|
+
"code": "const { data, mutate, status } = useSyncCollection({\n\tcollection: 'orders',\n\t// TODO: your server's WebSocket URL (syncSocket path).\n\turl: 'ws://localhost:3000/sync/ws'\n});",
|
|
252
|
+
"imports": [
|
|
253
|
+
{
|
|
254
|
+
"from": "@absolutejs/sync/react",
|
|
255
|
+
"names": [
|
|
256
|
+
"useSyncCollection"
|
|
257
|
+
]
|
|
258
|
+
}
|
|
259
|
+
],
|
|
260
|
+
"placement": "client-entry"
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
"description": "Row-level live collections: the client hydrates once, then the server pushes {added, removed, changed} diffs over WebSocket, with optimistic mutations and an offline queue. Declares the module-scope `engine` binding other sync packages wire against.",
|
|
264
|
+
"id": "engine",
|
|
265
|
+
"server": {
|
|
266
|
+
"code": "// The sync engine. The module-scope `engine` binding is the documented\n// anchor @absolutejs/sync-pack-* wiring snippets reference by name.\nconst engine = createSyncEngine({\n\tchangeLogRetainMs: ${settings.engine.changeLogRetainMs},\n\tchangeLogSize: ${settings.engine.changeLogSize},\n\tinstanceId: ${settings.engine.instanceId},\n\tmutationConcurrency: ${settings.engine.mutationConcurrency},\n\tmutationQueueLimit: ${settings.engine.mutationQueueLimit}\n});\n\n// TODO: register your first live table — a collection (what clients\n// subscribe to), a writer (how rows persist), and a mutation.\n// See https://github.com/absolutejs/sync#live-collections--the-sync-engine-tier-3\n\n// Mount with .use(liveSync) (and .use(liveDevtools) in development).\nconst liveSync = syncSocket({ closeOnSlow: ${settings.socket.closeOnSlow}, engine, maxBufferedBytes: ${settings.socket.maxBufferedBytes}, path: ${settings.socket.path} });\nconst liveDevtools = syncDevtools({ engine, path: ${settings.devtools.path}, snapshotMs: ${settings.devtools.snapshotMs} });",
|
|
267
|
+
"imports": [
|
|
268
|
+
{
|
|
269
|
+
"from": "@absolutejs/sync",
|
|
270
|
+
"names": [
|
|
271
|
+
"syncDevtools",
|
|
272
|
+
"syncSocket"
|
|
273
|
+
]
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
"from": "@absolutejs/sync/engine",
|
|
277
|
+
"names": [
|
|
278
|
+
"createSyncEngine"
|
|
279
|
+
]
|
|
280
|
+
}
|
|
281
|
+
],
|
|
282
|
+
"placement": "module-scope"
|
|
283
|
+
},
|
|
284
|
+
"title": "Live collections (the sync engine)"
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
"description": "Conflict-free collaborative editing: the engine merges the declared CRDT fields on write instead of overwriting, and auto-registers the merge mutation the useCollaborativeText hooks call. Rides the engine recipe.",
|
|
288
|
+
"id": "collaborative-text",
|
|
289
|
+
"server": {
|
|
290
|
+
"code": "// Rides the 'engine' recipe: `engine` is its module-scope binding.\nconst textCrdt = ${slot.crdt};\n\n// TODO: replace 'docs'/'body' with your table and CRDT field.\nengine.registerCrdt('docs', { body: textCrdt });",
|
|
291
|
+
"imports": [],
|
|
292
|
+
"placement": "module-scope"
|
|
293
|
+
},
|
|
294
|
+
"title": "Collaborative text (CRDT merge on write)"
|
|
295
|
+
},
|
|
296
|
+
{
|
|
297
|
+
"description": "Horizontal scale: committed changes fan out across server instances over a cluster bus, so a mutation on one shard reaches subscribers on every shard. Rides the engine recipe.",
|
|
298
|
+
"id": "cluster",
|
|
299
|
+
"server": {
|
|
300
|
+
"code": "// Rides the 'engine' recipe: `engine` is its module-scope binding.\nawait engine.connectCluster(${slot.clusterBus});",
|
|
301
|
+
"imports": [],
|
|
302
|
+
"placement": "module-scope"
|
|
303
|
+
},
|
|
304
|
+
"title": "Fan out across server instances (cluster bus)"
|
|
305
|
+
}
|
|
306
|
+
],
|
|
307
|
+
"tools": {
|
|
308
|
+
"engine_metrics": {
|
|
309
|
+
"annotations": {
|
|
310
|
+
"readOnlyHint": true
|
|
311
|
+
},
|
|
312
|
+
"description": "Operator-shaped engine health: uptime, subscription/mutation/change counters, memory estimates, and throughput since start.",
|
|
313
|
+
"input": {
|
|
314
|
+
"type": "object",
|
|
315
|
+
"properties": {}
|
|
316
|
+
},
|
|
317
|
+
"kind": "runtime"
|
|
318
|
+
},
|
|
319
|
+
"engine_overview": {
|
|
320
|
+
"annotations": {
|
|
321
|
+
"readOnlyHint": true
|
|
322
|
+
},
|
|
323
|
+
"description": "What this sync engine serves: registered collections with live subscription counts, mutations, schedules, readers/writers, installed packs, and the most recent changes.",
|
|
324
|
+
"input": {
|
|
325
|
+
"type": "object",
|
|
326
|
+
"properties": {}
|
|
327
|
+
},
|
|
328
|
+
"kind": "runtime"
|
|
329
|
+
},
|
|
330
|
+
"publish_topic": {
|
|
331
|
+
"description": "Publish a reactive topic on the hub so every subscribed view refetches now. Useful after out-of-band data changes. Reports how many subscribers were listening.",
|
|
332
|
+
"input": {
|
|
333
|
+
"type": "object",
|
|
334
|
+
"required": [
|
|
335
|
+
"topic"
|
|
336
|
+
],
|
|
337
|
+
"properties": {
|
|
338
|
+
"topic": {
|
|
339
|
+
"minLength": 1,
|
|
340
|
+
"type": "string"
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
},
|
|
344
|
+
"kind": "runtime"
|
|
345
|
+
},
|
|
346
|
+
"replay_at": {
|
|
347
|
+
"annotations": {
|
|
348
|
+
"readOnlyHint": true
|
|
349
|
+
},
|
|
350
|
+
"description": "Point-in-time replay: reconstruct table state as of a past timestamp from the change log. Returns per-table row counts plus asOfVersion/asOfAt; truncated=true means the log doesn’t reach back that far (widen changeLogRetainMs for forensics).",
|
|
351
|
+
"input": {
|
|
352
|
+
"type": "object",
|
|
353
|
+
"required": [
|
|
354
|
+
"atMs"
|
|
355
|
+
],
|
|
356
|
+
"properties": {
|
|
357
|
+
"atMs": {
|
|
358
|
+
"description": "Target timestamp, Unix epoch milliseconds.",
|
|
359
|
+
"minimum": 0,
|
|
360
|
+
"type": "integer"
|
|
361
|
+
},
|
|
362
|
+
"tables": {
|
|
363
|
+
"type": "array",
|
|
364
|
+
"items": {
|
|
365
|
+
"minLength": 1,
|
|
366
|
+
"type": "string"
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
},
|
|
371
|
+
"kind": "runtime"
|
|
372
|
+
},
|
|
373
|
+
"run_schedule": {
|
|
374
|
+
"description": "Fire one registered scheduled function now instead of waiting for its cron pattern. Whatever it writes goes live through the change feed.",
|
|
375
|
+
"input": {
|
|
376
|
+
"type": "object",
|
|
377
|
+
"required": [
|
|
378
|
+
"name"
|
|
379
|
+
],
|
|
380
|
+
"properties": {
|
|
381
|
+
"name": {
|
|
382
|
+
"minLength": 1,
|
|
383
|
+
"type": "string"
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
},
|
|
387
|
+
"kind": "runtime"
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
}
|
package/package.json
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@absolutejs/sync",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.3.0",
|
|
4
4
|
"description": "Lightweight reactive-push and write-behind-cache primitives for Elysia and the AbsoluteJS ecosystem — kill polling and keep a remote store off your hot path, without adopting a whole sync-engine backend.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "git+https://github.com/absolutejs/sync.git"
|
|
8
8
|
},
|
|
9
|
+
"homepage": "https://github.com/absolutejs/sync",
|
|
10
|
+
"bugs": {
|
|
11
|
+
"url": "https://github.com/absolutejs/sync/issues"
|
|
12
|
+
},
|
|
9
13
|
"type": "module",
|
|
10
14
|
"main": "./dist/index.js",
|
|
11
15
|
"module": "./dist/index.js",
|
|
@@ -107,7 +111,16 @@
|
|
|
107
111
|
"types": "./dist/angular/index.d.ts",
|
|
108
112
|
"import": "./dist/angular/index.js",
|
|
109
113
|
"default": "./dist/angular/index.js"
|
|
110
|
-
}
|
|
114
|
+
},
|
|
115
|
+
"./manifest": {
|
|
116
|
+
"types": "./dist/manifest.d.ts",
|
|
117
|
+
"import": "./dist/manifest.js",
|
|
118
|
+
"default": "./dist/manifest.js"
|
|
119
|
+
},
|
|
120
|
+
"./manifest.json": "./dist/manifest.json"
|
|
121
|
+
},
|
|
122
|
+
"absolutejs": {
|
|
123
|
+
"manifestContract": 1
|
|
111
124
|
},
|
|
112
125
|
"files": [
|
|
113
126
|
"dist",
|
|
@@ -189,7 +202,9 @@
|
|
|
189
202
|
}
|
|
190
203
|
},
|
|
191
204
|
"dependencies": {
|
|
192
|
-
"@absolutejs/
|
|
205
|
+
"@absolutejs/manifest": "^0.1.0",
|
|
206
|
+
"@absolutejs/telemetry": "^0.0.2",
|
|
207
|
+
"@sinclair/typebox": "^0.34.0"
|
|
193
208
|
},
|
|
194
209
|
"devDependencies": {
|
|
195
210
|
"@absolutejs/absolute": "^0.19.0-beta.1051",
|