@annotorious/core 3.3.0 → 3.3.2
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.
|
@@ -98,24 +98,24 @@ const V = { selected: [] }, De = (e, t, n) => {
|
|
|
98
98
|
}
|
|
99
99
|
T = [d];
|
|
100
100
|
}
|
|
101
|
-
const
|
|
101
|
+
const a = T.reduce((d, g) => {
|
|
102
102
|
const v = W(g, p, n);
|
|
103
103
|
return v === "EDIT" ? [...d, { id: g.id, editable: !0 }] : v === "SELECT" ? [...d, { id: g.id }] : d;
|
|
104
104
|
}, []);
|
|
105
|
-
s({ selected:
|
|
105
|
+
s({ selected: a, event: C });
|
|
106
106
|
}, l = (m, C) => {
|
|
107
|
-
const T = Array.isArray(m) ? m : [m],
|
|
107
|
+
const T = Array.isArray(m) ? m : [m], a = T.map((d) => e.getAnnotation(d)).filter((d) => !!d);
|
|
108
108
|
s({
|
|
109
|
-
selected:
|
|
109
|
+
selected: a.map((d) => {
|
|
110
110
|
const g = C === void 0 ? W(d, p, n) === "EDIT" : C;
|
|
111
111
|
return { id: d.id, editable: g };
|
|
112
112
|
})
|
|
113
|
-
}),
|
|
113
|
+
}), a.length !== T.length && console.warn("Invalid selection", m);
|
|
114
114
|
}, w = (m) => {
|
|
115
115
|
if (E())
|
|
116
116
|
return !1;
|
|
117
117
|
const { selected: C } = A;
|
|
118
|
-
C.some(({ id:
|
|
118
|
+
C.some(({ id: a }) => m.includes(a)) && s({ selected: C.filter(({ id: a }) => !m.includes(a)) });
|
|
119
119
|
}, D = (m) => {
|
|
120
120
|
p = m, l(A.selected.map(({ id: C }) => C));
|
|
121
121
|
};
|
|
@@ -212,8 +212,8 @@ const Be = (e) => {
|
|
|
212
212
|
targetUpdated: re(e, t) ? { oldTarget: e.target, newTarget: t.target } : void 0
|
|
213
213
|
};
|
|
214
214
|
};
|
|
215
|
-
var
|
|
216
|
-
const
|
|
215
|
+
var ce = /* @__PURE__ */ ((e) => (e.BODY_ONLY = "BODY_ONLY", e.TARGET_ONLY = "TARGET_ONLY", e))(ce || {}), O = /* @__PURE__ */ ((e) => (e.LOCAL = "LOCAL", e.REMOTE = "REMOTE", e.SILENT = "SILENT", e))(O || {});
|
|
216
|
+
const ae = (e, t) => {
|
|
217
217
|
var p, A;
|
|
218
218
|
const { changes: n, origin: o } = t;
|
|
219
219
|
if (!(e.options.origin ? e.options.origin === o : o !== "SILENT"))
|
|
@@ -269,62 +269,62 @@ const ce = (e, t) => {
|
|
|
269
269
|
}
|
|
270
270
|
};
|
|
271
271
|
}, ue = (e) => e.id !== void 0, xe = () => {
|
|
272
|
-
const e = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Map(), n = [], o = (i,
|
|
273
|
-
n.push({ onChange: i, options:
|
|
272
|
+
const e = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Map(), n = [], o = (i, r = {}) => {
|
|
273
|
+
n.push({ onChange: i, options: r });
|
|
274
274
|
}, s = (i) => {
|
|
275
|
-
const
|
|
276
|
-
|
|
277
|
-
}, p = (i,
|
|
275
|
+
const r = n.findIndex((u) => u.onChange == i);
|
|
276
|
+
r > -1 && n.splice(r, 1);
|
|
277
|
+
}, p = (i, r) => {
|
|
278
278
|
const u = {
|
|
279
279
|
origin: i,
|
|
280
280
|
changes: {
|
|
281
|
-
created:
|
|
282
|
-
updated:
|
|
283
|
-
deleted:
|
|
281
|
+
created: r.created || [],
|
|
282
|
+
updated: r.updated || [],
|
|
283
|
+
deleted: r.deleted || []
|
|
284
284
|
},
|
|
285
285
|
state: [...e.values()]
|
|
286
286
|
};
|
|
287
287
|
n.forEach((f) => {
|
|
288
|
-
|
|
288
|
+
ae(f, u) && f.onChange(u);
|
|
289
289
|
});
|
|
290
|
-
}, A = (i,
|
|
290
|
+
}, A = (i, r = O.LOCAL) => {
|
|
291
291
|
if (i.id && e.get(i.id))
|
|
292
292
|
throw Error(`Cannot add annotation ${i.id} - exists already`);
|
|
293
293
|
{
|
|
294
294
|
const f = $(i);
|
|
295
|
-
e.set(f.id, f), f.bodies.forEach((L) => t.set(L.id, f.id)), p(
|
|
295
|
+
e.set(f.id, f), f.bodies.forEach((L) => t.set(L.id, f.id)), p(r, { created: [f] });
|
|
296
296
|
}
|
|
297
|
-
}, b = (i,
|
|
298
|
-
const u = $(typeof i == "string" ?
|
|
297
|
+
}, b = (i, r) => {
|
|
298
|
+
const u = $(typeof i == "string" ? r : i), f = typeof i == "string" ? i : i.id, L = f && e.get(f);
|
|
299
299
|
if (L) {
|
|
300
300
|
const y = J(L, u);
|
|
301
301
|
return f === u.id ? e.set(f, u) : (e.delete(f), e.set(u.id, u)), L.bodies.forEach((B) => t.delete(B.id)), u.bodies.forEach((B) => t.set(B.id, u.id)), y;
|
|
302
302
|
} else
|
|
303
303
|
console.warn(`Cannot update annotation ${f} - does not exist`);
|
|
304
|
-
}, E = (i,
|
|
305
|
-
const f = ue(
|
|
304
|
+
}, E = (i, r = O.LOCAL, u = O.LOCAL) => {
|
|
305
|
+
const f = ue(r) ? u : r, L = b(i, r);
|
|
306
306
|
L && p(f, { updated: [L] });
|
|
307
|
-
}, h = (i,
|
|
308
|
-
!!e.get(i.id) ? E(i) : A(i);
|
|
309
|
-
}, S = (i,
|
|
307
|
+
}, h = (i, r = O.LOCAL) => {
|
|
308
|
+
!!e.get(i.id) ? E(i, r) : A(i, r);
|
|
309
|
+
}, S = (i, r = O.LOCAL) => {
|
|
310
310
|
const u = i.reduce((f, L) => {
|
|
311
311
|
const y = b(L);
|
|
312
312
|
return y ? [...f, y] : f;
|
|
313
313
|
}, []);
|
|
314
|
-
u.length > 0 && p(
|
|
315
|
-
}, l = (i,
|
|
316
|
-
const u = i.map($), { toAdd: f, toUpdate: L } = u.reduce((B, I) => e.get(I.id) ? { ...B, toUpdate: [...B.toUpdate, I] } : { ...B, toAdd: [...B.toAdd, I] }, { toAdd: [], toUpdate: [] }), y = L.map((B) => b(B,
|
|
314
|
+
u.length > 0 && p(r, { updated: u });
|
|
315
|
+
}, l = (i, r = O.LOCAL) => {
|
|
316
|
+
const u = i.map($), { toAdd: f, toUpdate: L } = u.reduce((B, I) => e.get(I.id) ? { ...B, toUpdate: [...B.toUpdate, I] } : { ...B, toAdd: [...B.toAdd, I] }, { toAdd: [], toUpdate: [] }), y = L.map((B) => b(B, r)).filter(Boolean);
|
|
317
317
|
f.forEach((B) => {
|
|
318
318
|
e.set(B.id, B), B.bodies.forEach((I) => t.set(I.id, B.id));
|
|
319
|
-
}), p(
|
|
320
|
-
}, w = (i,
|
|
319
|
+
}), p(r, { created: f, updated: y });
|
|
320
|
+
}, w = (i, r = O.LOCAL) => {
|
|
321
321
|
const u = e.get(i.annotation);
|
|
322
322
|
if (u) {
|
|
323
323
|
const f = {
|
|
324
324
|
...u,
|
|
325
325
|
bodies: [...u.bodies, i]
|
|
326
326
|
};
|
|
327
|
-
e.set(u.id, f), t.set(i.id, f.id), p(
|
|
327
|
+
e.set(u.id, f), t.set(i.id, f.id), p(r, { updated: [{
|
|
328
328
|
oldValue: u,
|
|
329
329
|
newValue: f,
|
|
330
330
|
bodiesCreated: [i]
|
|
@@ -332,11 +332,11 @@ const ce = (e, t) => {
|
|
|
332
332
|
} else
|
|
333
333
|
console.warn(`Attempt to add body to missing annotation: ${i.annotation}`);
|
|
334
334
|
}, D = () => [...e.values()], m = (i = O.LOCAL) => {
|
|
335
|
-
const
|
|
336
|
-
e.clear(), t.clear(), p(i, { deleted:
|
|
337
|
-
}, C = (i,
|
|
335
|
+
const r = [...e.values()];
|
|
336
|
+
e.clear(), t.clear(), p(i, { deleted: r });
|
|
337
|
+
}, C = (i, r = !0, u = O.LOCAL) => {
|
|
338
338
|
const f = i.map($);
|
|
339
|
-
if (
|
|
339
|
+
if (r) {
|
|
340
340
|
const L = [...e.values()];
|
|
341
341
|
e.clear(), t.clear(), f.forEach((y) => {
|
|
342
342
|
e.set(y.id, y), y.bodies.forEach((B) => t.set(B.id, y.id));
|
|
@@ -353,31 +353,31 @@ const ce = (e, t) => {
|
|
|
353
353
|
}), p(u, { created: f });
|
|
354
354
|
}
|
|
355
355
|
}, T = (i) => {
|
|
356
|
-
const
|
|
356
|
+
const r = typeof i == "string" ? i : i.id, u = e.get(r);
|
|
357
357
|
if (u)
|
|
358
|
-
return e.delete(
|
|
359
|
-
console.warn(`Attempt to delete missing annotation: ${
|
|
360
|
-
},
|
|
358
|
+
return e.delete(r), u.bodies.forEach((f) => t.delete(f.id)), u;
|
|
359
|
+
console.warn(`Attempt to delete missing annotation: ${r}`);
|
|
360
|
+
}, a = (i, r = O.LOCAL) => {
|
|
361
361
|
const u = T(i);
|
|
362
|
-
u && p(
|
|
363
|
-
}, d = (i,
|
|
362
|
+
u && p(r, { deleted: [u] });
|
|
363
|
+
}, d = (i, r = O.LOCAL) => {
|
|
364
364
|
const u = i.reduce((f, L) => {
|
|
365
365
|
const y = T(L);
|
|
366
366
|
return y ? [...f, y] : f;
|
|
367
367
|
}, []);
|
|
368
|
-
u.length > 0 && p(
|
|
368
|
+
u.length > 0 && p(r, { deleted: u });
|
|
369
369
|
}, g = (i) => {
|
|
370
|
-
const
|
|
371
|
-
if (
|
|
372
|
-
const u =
|
|
370
|
+
const r = e.get(i.annotation);
|
|
371
|
+
if (r) {
|
|
372
|
+
const u = r.bodies.find((f) => f.id === i.id);
|
|
373
373
|
if (u) {
|
|
374
374
|
t.delete(u.id);
|
|
375
375
|
const f = {
|
|
376
|
-
...
|
|
377
|
-
bodies:
|
|
376
|
+
...r,
|
|
377
|
+
bodies: r.bodies.filter((y) => y.id !== i.id)
|
|
378
378
|
};
|
|
379
|
-
return e.set(
|
|
380
|
-
oldValue:
|
|
379
|
+
return e.set(r.id, f), {
|
|
380
|
+
oldValue: r,
|
|
381
381
|
newValue: f,
|
|
382
382
|
bodiesDeleted: [u]
|
|
383
383
|
};
|
|
@@ -385,61 +385,61 @@ const ce = (e, t) => {
|
|
|
385
385
|
console.warn(`Attempt to delete missing body ${i.id} from annotation ${i.annotation}`);
|
|
386
386
|
} else
|
|
387
387
|
console.warn(`Attempt to delete body from missing annotation ${i.annotation}`);
|
|
388
|
-
}, v = (i,
|
|
388
|
+
}, v = (i, r = O.LOCAL) => {
|
|
389
389
|
const u = g(i);
|
|
390
|
-
u && p(
|
|
391
|
-
},
|
|
390
|
+
u && p(r, { updated: [u] });
|
|
391
|
+
}, c = (i, r = O.LOCAL) => {
|
|
392
392
|
const u = i.map((f) => g(f)).filter(Boolean);
|
|
393
|
-
u.length > 0 && p(
|
|
393
|
+
u.length > 0 && p(r, { updated: u });
|
|
394
394
|
}, U = (i) => {
|
|
395
|
-
const
|
|
396
|
-
return
|
|
395
|
+
const r = e.get(i);
|
|
396
|
+
return r ? { ...r } : void 0;
|
|
397
397
|
}, x = (i) => {
|
|
398
|
-
const
|
|
399
|
-
if (
|
|
400
|
-
const f = U(
|
|
398
|
+
const r = t.get(i);
|
|
399
|
+
if (r) {
|
|
400
|
+
const f = U(r).bodies.find((L) => L.id === i);
|
|
401
401
|
if (f)
|
|
402
402
|
return f;
|
|
403
403
|
console.error(`Store integrity error: body ${i} in index, but not in annotation`);
|
|
404
404
|
} else
|
|
405
405
|
console.warn(`Attempt to retrieve missing body: ${i}`);
|
|
406
|
-
}, k = (i,
|
|
407
|
-
if (i.annotation !==
|
|
406
|
+
}, k = (i, r) => {
|
|
407
|
+
if (i.annotation !== r.annotation)
|
|
408
408
|
throw "Annotation integrity violation: annotation ID must be the same when updating bodies";
|
|
409
409
|
const u = e.get(i.annotation);
|
|
410
410
|
if (u) {
|
|
411
411
|
const f = u.bodies.find((y) => y.id === i.id), L = {
|
|
412
412
|
...u,
|
|
413
|
-
bodies: u.bodies.map((y) => y.id === f.id ?
|
|
413
|
+
bodies: u.bodies.map((y) => y.id === f.id ? r : y)
|
|
414
414
|
};
|
|
415
|
-
return e.set(u.id, L), f.id !==
|
|
415
|
+
return e.set(u.id, L), f.id !== r.id && (t.delete(f.id), t.set(r.id, L.id)), {
|
|
416
416
|
oldValue: u,
|
|
417
417
|
newValue: L,
|
|
418
|
-
bodiesUpdated: [{ oldBody: f, newBody:
|
|
418
|
+
bodiesUpdated: [{ oldBody: f, newBody: r }]
|
|
419
419
|
};
|
|
420
420
|
} else
|
|
421
421
|
console.warn(`Attempt to add body to missing annotation ${i.annotation}`);
|
|
422
|
-
}, X = (i,
|
|
423
|
-
const f = k(i,
|
|
422
|
+
}, X = (i, r, u = O.LOCAL) => {
|
|
423
|
+
const f = k(i, r);
|
|
424
424
|
f && p(u, { updated: [f] });
|
|
425
|
-
}, Z = (i,
|
|
425
|
+
}, Z = (i, r = O.LOCAL) => {
|
|
426
426
|
const u = i.map((f) => k({ id: f.id, annotation: f.annotation }, f)).filter(Boolean);
|
|
427
|
-
p(
|
|
427
|
+
p(r, { updated: u });
|
|
428
428
|
}, H = (i) => {
|
|
429
|
-
const
|
|
430
|
-
if (
|
|
429
|
+
const r = e.get(i.annotation);
|
|
430
|
+
if (r) {
|
|
431
431
|
const u = {
|
|
432
|
-
...
|
|
432
|
+
...r,
|
|
433
433
|
target: {
|
|
434
|
-
...
|
|
434
|
+
...r.target,
|
|
435
435
|
...i
|
|
436
436
|
}
|
|
437
437
|
};
|
|
438
|
-
return e.set(
|
|
439
|
-
oldValue:
|
|
438
|
+
return e.set(r.id, u), {
|
|
439
|
+
oldValue: r,
|
|
440
440
|
newValue: u,
|
|
441
441
|
targetUpdated: {
|
|
442
|
-
oldTarget:
|
|
442
|
+
oldTarget: r.target,
|
|
443
443
|
newTarget: i
|
|
444
444
|
}
|
|
445
445
|
};
|
|
@@ -452,16 +452,16 @@ const ce = (e, t) => {
|
|
|
452
452
|
all: D,
|
|
453
453
|
bulkAddAnnotations: C,
|
|
454
454
|
bulkDeleteAnnotations: d,
|
|
455
|
-
bulkDeleteBodies:
|
|
455
|
+
bulkDeleteBodies: c,
|
|
456
456
|
bulkUpdateAnnotations: S,
|
|
457
457
|
bulkUpdateBodies: Z,
|
|
458
|
-
bulkUpdateTargets: (i,
|
|
458
|
+
bulkUpdateTargets: (i, r = O.LOCAL) => {
|
|
459
459
|
const u = i.map((f) => H(f)).filter(Boolean);
|
|
460
|
-
u.length > 0 && p(
|
|
460
|
+
u.length > 0 && p(r, { updated: u });
|
|
461
461
|
},
|
|
462
462
|
bulkUpsertAnnotations: l,
|
|
463
463
|
clear: m,
|
|
464
|
-
deleteAnnotation:
|
|
464
|
+
deleteAnnotation: a,
|
|
465
465
|
deleteBody: v,
|
|
466
466
|
getAnnotation: U,
|
|
467
467
|
getBody: x,
|
|
@@ -469,9 +469,9 @@ const ce = (e, t) => {
|
|
|
469
469
|
unobserve: s,
|
|
470
470
|
updateAnnotation: E,
|
|
471
471
|
updateBody: X,
|
|
472
|
-
updateTarget: (i,
|
|
472
|
+
updateTarget: (i, r = O.LOCAL) => {
|
|
473
473
|
const u = H(i);
|
|
474
|
-
u && p(
|
|
474
|
+
u && p(r, { updated: [u] });
|
|
475
475
|
},
|
|
476
476
|
upsertAnnotation: h
|
|
477
477
|
};
|
|
@@ -499,9 +499,9 @@ let Q = () => ({
|
|
|
499
499
|
const fe = 250, Ie = (e, t) => {
|
|
500
500
|
const n = Q(), o = (t == null ? void 0 : t.changes) || [];
|
|
501
501
|
let s = t ? t.pointer : -1, p = !1, A = 0;
|
|
502
|
-
const b = (
|
|
502
|
+
const b = (c) => {
|
|
503
503
|
if (!p) {
|
|
504
|
-
const { changes: U } =
|
|
504
|
+
const { changes: U } = c, x = performance.now();
|
|
505
505
|
if (x - A > fe)
|
|
506
506
|
o.splice(s + 1), o.push(U), s = o.length - 1;
|
|
507
507
|
else {
|
|
@@ -513,25 +513,25 @@ const fe = 250, Ie = (e, t) => {
|
|
|
513
513
|
p = !1;
|
|
514
514
|
};
|
|
515
515
|
e.observe(b, { origin: O.LOCAL });
|
|
516
|
-
const E = (
|
|
516
|
+
const E = (c) => c && c.length > 0 && e.bulkDeleteAnnotations(c), h = (c) => c && c.length > 0 && e.bulkAddAnnotations(c, !1), S = (c) => c && c.length > 0 && e.bulkUpdateAnnotations(c.map(({ oldValue: U }) => U)), l = (c) => c && c.length > 0 && e.bulkUpdateAnnotations(c.map(({ newValue: U }) => U)), w = (c) => c && c.length > 0 && e.bulkAddAnnotations(c, !1), D = (c) => c && c.length > 0 && e.bulkDeleteAnnotations(c);
|
|
517
517
|
return {
|
|
518
518
|
canRedo: () => o.length - 1 > s,
|
|
519
519
|
canUndo: () => s > -1,
|
|
520
520
|
destroy: () => e.unobserve(b),
|
|
521
521
|
getHistory: () => ({ changes: [...o], pointer: s }),
|
|
522
|
-
on: (
|
|
522
|
+
on: (c, U) => n.on(c, U),
|
|
523
523
|
redo: () => {
|
|
524
524
|
if (o.length - 1 > s) {
|
|
525
525
|
p = !0;
|
|
526
|
-
const { created:
|
|
527
|
-
h(
|
|
526
|
+
const { created: c, updated: U, deleted: x } = o[s + 1];
|
|
527
|
+
h(c), l(U), D(x), n.emit("redo", o[s + 1]), s += 1;
|
|
528
528
|
}
|
|
529
529
|
},
|
|
530
530
|
undo: () => {
|
|
531
531
|
if (s > -1) {
|
|
532
532
|
p = !0;
|
|
533
|
-
const { created:
|
|
534
|
-
E(
|
|
533
|
+
const { created: c, updated: U, deleted: x } = o[s];
|
|
534
|
+
E(c), S(U), w(x), n.emit("undo", o[s]), s -= 1;
|
|
535
535
|
}
|
|
536
536
|
}
|
|
537
537
|
};
|
|
@@ -544,82 +544,82 @@ const fe = 250, Ie = (e, t) => {
|
|
|
544
544
|
}, ze = (e, t, n, o) => {
|
|
545
545
|
const { hover: s, selection: p, store: A, viewport: b } = e, E = /* @__PURE__ */ new Map();
|
|
546
546
|
let h = [], S, l;
|
|
547
|
-
const w = (
|
|
548
|
-
E.has(
|
|
549
|
-
}, D = (
|
|
550
|
-
const g = E.get(
|
|
547
|
+
const w = (a, d) => {
|
|
548
|
+
E.has(a) ? E.get(a).push(d) : E.set(a, [d]);
|
|
549
|
+
}, D = (a, d) => {
|
|
550
|
+
const g = E.get(a);
|
|
551
551
|
if (g) {
|
|
552
552
|
const v = g.indexOf(d);
|
|
553
553
|
v !== -1 && g.splice(v, 1);
|
|
554
554
|
}
|
|
555
|
-
}, m = (
|
|
556
|
-
E.has(
|
|
557
|
-
E.get(
|
|
555
|
+
}, m = (a, d, g) => {
|
|
556
|
+
E.has(a) && setTimeout(() => {
|
|
557
|
+
E.get(a).forEach((v) => {
|
|
558
558
|
if (n) {
|
|
559
|
-
const
|
|
560
|
-
v(
|
|
559
|
+
const c = Array.isArray(d) ? d.map((x) => n.serialize(x)) : n.serialize(d), U = g ? g instanceof PointerEvent ? g : n.serialize(g) : void 0;
|
|
560
|
+
v(c, U);
|
|
561
561
|
} else
|
|
562
562
|
v(d, g);
|
|
563
563
|
});
|
|
564
564
|
}, 1);
|
|
565
565
|
}, C = () => {
|
|
566
|
-
const { selected:
|
|
566
|
+
const { selected: a } = p, d = (a || []).map(({ id: g }) => A.getAnnotation(g));
|
|
567
567
|
d.forEach((g) => {
|
|
568
|
-
const v = h.find((
|
|
568
|
+
const v = h.find((c) => c.id === g.id);
|
|
569
569
|
(!v || !N(v, g)) && m("updateAnnotation", g, v);
|
|
570
570
|
}), h = h.map((g) => {
|
|
571
|
-
const v = d.find(({ id:
|
|
571
|
+
const v = d.find(({ id: c }) => c === g.id);
|
|
572
572
|
return v || g;
|
|
573
573
|
});
|
|
574
574
|
};
|
|
575
|
-
p.subscribe(({ selected:
|
|
576
|
-
if (!(h.length === 0 &&
|
|
577
|
-
if (h.length === 0 &&
|
|
578
|
-
h =
|
|
579
|
-
else if (h.length > 0 &&
|
|
575
|
+
p.subscribe(({ selected: a }) => {
|
|
576
|
+
if (!(h.length === 0 && a.length === 0)) {
|
|
577
|
+
if (h.length === 0 && a.length > 0)
|
|
578
|
+
h = a.map(({ id: d }) => A.getAnnotation(d));
|
|
579
|
+
else if (h.length > 0 && a.length === 0)
|
|
580
580
|
h.forEach((d) => {
|
|
581
581
|
const g = A.getAnnotation(d.id);
|
|
582
582
|
g && !N(g, d) && m("updateAnnotation", g, d);
|
|
583
583
|
}), h = [];
|
|
584
584
|
else {
|
|
585
|
-
const d = new Set(h.map((
|
|
586
|
-
h.filter((
|
|
587
|
-
const U = A.getAnnotation(
|
|
588
|
-
U && !N(U,
|
|
585
|
+
const d = new Set(h.map((c) => c.id)), g = new Set(a.map(({ id: c }) => c));
|
|
586
|
+
h.filter((c) => !g.has(c.id)).forEach((c) => {
|
|
587
|
+
const U = A.getAnnotation(c.id);
|
|
588
|
+
U && !N(U, c) && m("updateAnnotation", U, c);
|
|
589
589
|
}), h = [
|
|
590
590
|
// Remove annotations that were deselected
|
|
591
|
-
...h.filter((
|
|
591
|
+
...h.filter((c) => g.has(c.id)),
|
|
592
592
|
// Add editable annotations that were selected
|
|
593
|
-
...
|
|
593
|
+
...a.filter(({ id: c }) => !d.has(c)).map(({ id: c }) => A.getAnnotation(c))
|
|
594
594
|
];
|
|
595
595
|
}
|
|
596
596
|
m("selectionChanged", h);
|
|
597
597
|
}
|
|
598
|
-
}), s.subscribe((
|
|
599
|
-
!S &&
|
|
600
|
-
}), b == null || b.subscribe((
|
|
598
|
+
}), s.subscribe((a) => {
|
|
599
|
+
!S && a ? m("mouseEnterAnnotation", A.getAnnotation(a)) : S && !a ? m("mouseLeaveAnnotation", A.getAnnotation(S)) : S && a && (m("mouseLeaveAnnotation", A.getAnnotation(S)), m("mouseEnterAnnotation", A.getAnnotation(a))), S = a;
|
|
600
|
+
}), b == null || b.subscribe((a) => m("viewportIntersect", a.map((d) => A.getAnnotation(d)))), A.observe((a) => {
|
|
601
601
|
o && (l && clearTimeout(l), l = setTimeout(C, 1e3));
|
|
602
|
-
const { created: d, deleted: g } =
|
|
603
|
-
(d || []).forEach((
|
|
604
|
-
...
|
|
605
|
-
...
|
|
606
|
-
...
|
|
607
|
-
].length > 0).forEach(({ oldValue:
|
|
608
|
-
const x = h.find((k) => k.id ===
|
|
609
|
-
h = h.map((k) => k.id ===
|
|
602
|
+
const { created: d, deleted: g } = a.changes;
|
|
603
|
+
(d || []).forEach((c) => m("createAnnotation", c)), (g || []).forEach((c) => m("deleteAnnotation", c)), (a.changes.updated || []).filter((c) => [
|
|
604
|
+
...c.bodiesCreated || [],
|
|
605
|
+
...c.bodiesDeleted || [],
|
|
606
|
+
...c.bodiesUpdated || []
|
|
607
|
+
].length > 0).forEach(({ oldValue: c, newValue: U }) => {
|
|
608
|
+
const x = h.find((k) => k.id === c.id) || c;
|
|
609
|
+
h = h.map((k) => k.id === c.id ? U : k), m("updateAnnotation", U, x);
|
|
610
610
|
});
|
|
611
|
-
}, { origin: O.LOCAL }), A.observe((
|
|
611
|
+
}, { origin: O.LOCAL }), A.observe((a) => {
|
|
612
612
|
if (h) {
|
|
613
|
-
const d = new Set(h.map((v) => v.id)), g = (
|
|
613
|
+
const d = new Set(h.map((v) => v.id)), g = (a.changes.updated || []).filter(({ newValue: v }) => d.has(v.id)).map(({ newValue: v }) => v);
|
|
614
614
|
g.length > 0 && (h = h.map((v) => {
|
|
615
|
-
const
|
|
616
|
-
return
|
|
615
|
+
const c = g.find((U) => U.id === v.id);
|
|
616
|
+
return c || v;
|
|
617
617
|
}));
|
|
618
618
|
}
|
|
619
619
|
}, { origin: O.REMOTE });
|
|
620
|
-
const T = (
|
|
620
|
+
const T = (a) => (d) => {
|
|
621
621
|
const { updated: g } = d;
|
|
622
|
-
|
|
622
|
+
a ? (g || []).forEach((v) => m("updateAnnotation", v.oldValue, v.newValue)) : (g || []).forEach((v) => m("updateAnnotation", v.newValue, v.oldValue));
|
|
623
623
|
};
|
|
624
624
|
return t.on("undo", T(!0)), t.on("redo", T(!1)), { on: w, off: D, emit: m };
|
|
625
625
|
}, $e = (e) => (t) => t.map((n) => e.serialize(n)), pe = (e) => (t) => t.reduce((n, o) => {
|
|
@@ -634,46 +634,46 @@ const fe = 250, Ie = (e, t) => {
|
|
|
634
634
|
...n
|
|
635
635
|
};
|
|
636
636
|
}, { parsed: [], failed: [] }), Ve = (e, t, n) => {
|
|
637
|
-
const { store: o, selection: s } = e, p = (
|
|
637
|
+
const { store: o, selection: s } = e, p = (a) => {
|
|
638
638
|
if (n) {
|
|
639
|
-
const { parsed: d, error: g } = n.parse(
|
|
639
|
+
const { parsed: d, error: g } = n.parse(a);
|
|
640
640
|
d ? o.addAnnotation(d, O.REMOTE) : console.error(g);
|
|
641
641
|
} else
|
|
642
|
-
o.addAnnotation(j(
|
|
643
|
-
}, A = () => s.clear(), b = () => o.clear(), E = (
|
|
644
|
-
const d = o.getAnnotation(
|
|
642
|
+
o.addAnnotation(j(a), O.REMOTE);
|
|
643
|
+
}, A = () => s.clear(), b = () => o.clear(), E = (a) => {
|
|
644
|
+
const d = o.getAnnotation(a);
|
|
645
645
|
return n && d ? n.serialize(d) : d;
|
|
646
646
|
}, h = () => n ? o.all().map(n.serialize) : o.all(), S = () => {
|
|
647
647
|
var g;
|
|
648
648
|
const d = (((g = s.selected) == null ? void 0 : g.map((v) => v.id)) || []).map((v) => o.getAnnotation(v)).filter(Boolean);
|
|
649
649
|
return n ? d.map(n.serialize) : d;
|
|
650
|
-
}, l = (
|
|
651
|
-
if (typeof
|
|
652
|
-
const d = o.getAnnotation(
|
|
653
|
-
if (o.deleteAnnotation(
|
|
650
|
+
}, l = (a, d = !0) => fetch(a).then((g) => g.json()).then((g) => (D(g, d), g)), w = (a) => {
|
|
651
|
+
if (typeof a == "string") {
|
|
652
|
+
const d = o.getAnnotation(a);
|
|
653
|
+
if (o.deleteAnnotation(a), d)
|
|
654
654
|
return n ? n.serialize(d) : d;
|
|
655
655
|
} else {
|
|
656
|
-
const d = n ? n.parse(
|
|
656
|
+
const d = n ? n.parse(a).parsed : a;
|
|
657
657
|
if (d)
|
|
658
|
-
return o.deleteAnnotation(d),
|
|
658
|
+
return o.deleteAnnotation(d), a;
|
|
659
659
|
}
|
|
660
|
-
}, D = (
|
|
660
|
+
}, D = (a, d = !0) => {
|
|
661
661
|
if (n) {
|
|
662
|
-
const g = n.parseAll || pe(n), { parsed: v, failed:
|
|
663
|
-
|
|
662
|
+
const g = n.parseAll || pe(n), { parsed: v, failed: c } = g(a);
|
|
663
|
+
c.length > 0 && console.warn(`Discarded ${c.length} invalid annotations`, c), o.bulkAddAnnotations(v, d, O.REMOTE);
|
|
664
664
|
} else
|
|
665
|
-
o.bulkAddAnnotations(
|
|
666
|
-
}, m = (
|
|
667
|
-
|
|
668
|
-
}, C = (
|
|
669
|
-
s.clear(), s.setUserSelectAction(
|
|
670
|
-
}, T = (
|
|
665
|
+
o.bulkAddAnnotations(a.map(j), d, O.REMOTE);
|
|
666
|
+
}, m = (a, d) => {
|
|
667
|
+
a ? s.setSelected(a, d) : s.clear();
|
|
668
|
+
}, C = (a) => {
|
|
669
|
+
s.clear(), s.setUserSelectAction(a);
|
|
670
|
+
}, T = (a) => {
|
|
671
671
|
if (n) {
|
|
672
|
-
const d = n.parse(
|
|
672
|
+
const d = n.parse(a).parsed, g = n.serialize(o.getAnnotation(d.id));
|
|
673
673
|
return o.updateAnnotation(d), g;
|
|
674
674
|
} else {
|
|
675
|
-
const d = o.getAnnotation(
|
|
676
|
-
return o.updateAnnotation(j(
|
|
675
|
+
const d = o.getAnnotation(a.id);
|
|
676
|
+
return o.updateAnnotation(j(a)), d;
|
|
677
677
|
}
|
|
678
678
|
};
|
|
679
679
|
return {
|
|
@@ -835,7 +835,7 @@ const je = () => ({ isGuest: !0, id: Ae("1234567890abcdefghijklmnopqrstuvwxyzABC
|
|
|
835
835
|
};
|
|
836
836
|
};
|
|
837
837
|
export {
|
|
838
|
-
|
|
838
|
+
ce as Ignore,
|
|
839
839
|
O as Origin,
|
|
840
840
|
Me as PRESENCE_KEY,
|
|
841
841
|
K as UserSelectAction,
|
|
@@ -863,7 +863,7 @@ export {
|
|
|
863
863
|
j as reviveDates,
|
|
864
864
|
$e as serializeAll,
|
|
865
865
|
He as serializeW3CBodies,
|
|
866
|
-
|
|
866
|
+
ae as shouldNotify,
|
|
867
867
|
ke as toSvelteStore
|
|
868
868
|
};
|
|
869
869
|
//# sourceMappingURL=annotorious-core.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"annotorious-core.es.js","sources":["../../../node_modules/dequal/lite/index.mjs","../../../node_modules/svelte/src/runtime/internal/utils.js","../../../node_modules/svelte/src/runtime/store/index.js","../src/state/Hover.ts","../src/state/Selection.ts","../../../node_modules/uuid/dist/esm-browser/stringify.js","../../../node_modules/uuid/dist/esm-browser/rng.js","../../../node_modules/uuid/dist/esm-browser/native.js","../../../node_modules/uuid/dist/esm-browser/v4.js","../src/utils/annotationUtils.ts","../src/utils/diffAnnotations.ts","../src/state/StoreObserver.ts","../src/state/Store.ts","../src/state/SvelteStore.ts","../../../node_modules/nanoevents/index.js","../src/state/UndoStack.ts","../src/state/Viewport.ts","../src/lifecycle/Lifecycle.ts","../src/model/FormatAdapter.ts","../src/model/Annotator.ts","../src/model/DrawingStyle.ts","../../../node_modules/nanoid/url-alphabet/index.js","../../../node_modules/nanoid/index.browser.js","../src/model/User.ts","../src/model/W3CAnnotation.ts","../src/presence/ColorPalette.ts","../src/presence/AppearanceProvider.ts","../src/presence/PresenceState.ts"],"sourcesContent":["var has = Object.prototype.hasOwnProperty;\n\nexport function dequal(foo, bar) {\n\tvar ctor, len;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","/** @returns {void} */\nexport function noop() {}\n\nexport const identity = (x) => x;\n\n/**\n * @template T\n * @template S\n * @param {T} tar\n * @param {S} src\n * @returns {T & S}\n */\nexport function assign(tar, src) {\n\t// @ts-ignore\n\tfor (const k in src) tar[k] = src[k];\n\treturn /** @type {T & S} */ (tar);\n}\n\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\n/**\n * @param {any} value\n * @returns {value is PromiseLike<any>}\n */\nexport function is_promise(value) {\n\treturn (\n\t\t!!value &&\n\t\t(typeof value === 'object' || typeof value === 'function') &&\n\t\ttypeof (/** @type {any} */ (value).then) === 'function'\n\t);\n}\n\n/** @returns {void} */\nexport function add_location(element, file, line, column, char) {\n\telement.__svelte_meta = {\n\t\tloc: { file, line, column, char }\n\t};\n}\n\nexport function run(fn) {\n\treturn fn();\n}\n\nexport function blank_object() {\n\treturn Object.create(null);\n}\n\n/**\n * @param {Function[]} fns\n * @returns {void}\n */\nexport function run_all(fns) {\n\tfns.forEach(run);\n}\n\n/**\n * @param {any} thing\n * @returns {thing is Function}\n */\nexport function is_function(thing) {\n\treturn typeof thing === 'function';\n}\n\n/** @returns {boolean} */\nexport function safe_not_equal(a, b) {\n\treturn a != a ? b == b : a !== b || (a && typeof a === 'object') || typeof a === 'function';\n}\n\nlet src_url_equal_anchor;\n\n/**\n * @param {string} element_src\n * @param {string} url\n * @returns {boolean}\n */\nexport function src_url_equal(element_src, url) {\n\tif (element_src === url) return true;\n\tif (!src_url_equal_anchor) {\n\t\tsrc_url_equal_anchor = document.createElement('a');\n\t}\n\t// This is actually faster than doing URL(..).href\n\tsrc_url_equal_anchor.href = url;\n\treturn element_src === src_url_equal_anchor.href;\n}\n\n/** @param {string} srcset */\nfunction split_srcset(srcset) {\n\treturn srcset.split(',').map((src) => src.trim().split(' ').filter(Boolean));\n}\n\n/**\n * @param {HTMLSourceElement | HTMLImageElement} element_srcset\n * @param {string | undefined | null} srcset\n * @returns {boolean}\n */\nexport function srcset_url_equal(element_srcset, srcset) {\n\tconst element_urls = split_srcset(element_srcset.srcset);\n\tconst urls = split_srcset(srcset || '');\n\n\treturn (\n\t\turls.length === element_urls.length &&\n\t\turls.every(\n\t\t\t([url, width], i) =>\n\t\t\t\twidth === element_urls[i][1] &&\n\t\t\t\t// We need to test both ways because Vite will create an a full URL with\n\t\t\t\t// `new URL(asset, import.meta.url).href` for the client when `base: './'`, and the\n\t\t\t\t// relative URLs inside srcset are not automatically resolved to absolute URLs by\n\t\t\t\t// browsers (in contrast to img.src). This means both SSR and DOM code could\n\t\t\t\t// contain relative or absolute URLs.\n\t\t\t\t(src_url_equal(element_urls[i][0], url) || src_url_equal(url, element_urls[i][0]))\n\t\t)\n\t);\n}\n\n/** @returns {boolean} */\nexport function not_equal(a, b) {\n\treturn a != a ? b == b : a !== b;\n}\n\n/** @returns {boolean} */\nexport function is_empty(obj) {\n\treturn Object.keys(obj).length === 0;\n}\n\n/** @returns {void} */\nexport function validate_store(store, name) {\n\tif (store != null && typeof store.subscribe !== 'function') {\n\t\tthrow new Error(`'${name}' is not a store with a 'subscribe' method`);\n\t}\n}\n\nexport function subscribe(store, ...callbacks) {\n\tif (store == null) {\n\t\tfor (const callback of callbacks) {\n\t\t\tcallback(undefined);\n\t\t}\n\t\treturn noop;\n\t}\n\tconst unsub = store.subscribe(...callbacks);\n\treturn unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\n\n/**\n * Get the current value from a store by subscribing and immediately unsubscribing.\n *\n * https://svelte.dev/docs/svelte-store#get\n * @template T\n * @param {import('../store/public.js').Readable<T>} store\n * @returns {T}\n */\nexport function get_store_value(store) {\n\tlet value;\n\tsubscribe(store, (_) => (value = _))();\n\treturn value;\n}\n\n/** @returns {void} */\nexport function component_subscribe(component, store, callback) {\n\tcomponent.$$.on_destroy.push(subscribe(store, callback));\n}\n\nexport function create_slot(definition, ctx, $$scope, fn) {\n\tif (definition) {\n\t\tconst slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n\t\treturn definition[0](slot_ctx);\n\t}\n}\n\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n\treturn definition[1] && fn ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) : $$scope.ctx;\n}\n\nexport function get_slot_changes(definition, $$scope, dirty, fn) {\n\tif (definition[2] && fn) {\n\t\tconst lets = definition[2](fn(dirty));\n\t\tif ($$scope.dirty === undefined) {\n\t\t\treturn lets;\n\t\t}\n\t\tif (typeof lets === 'object') {\n\t\t\tconst merged = [];\n\t\t\tconst len = Math.max($$scope.dirty.length, lets.length);\n\t\t\tfor (let i = 0; i < len; i += 1) {\n\t\t\t\tmerged[i] = $$scope.dirty[i] | lets[i];\n\t\t\t}\n\t\t\treturn merged;\n\t\t}\n\t\treturn $$scope.dirty | lets;\n\t}\n\treturn $$scope.dirty;\n}\n\n/** @returns {void} */\nexport function update_slot_base(\n\tslot,\n\tslot_definition,\n\tctx,\n\t$$scope,\n\tslot_changes,\n\tget_slot_context_fn\n) {\n\tif (slot_changes) {\n\t\tconst slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n\t\tslot.p(slot_context, slot_changes);\n\t}\n}\n\n/** @returns {void} */\nexport function update_slot(\n\tslot,\n\tslot_definition,\n\tctx,\n\t$$scope,\n\tdirty,\n\tget_slot_changes_fn,\n\tget_slot_context_fn\n) {\n\tconst slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n\tupdate_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\n\n/** @returns {any[] | -1} */\nexport function get_all_dirty_from_scope($$scope) {\n\tif ($$scope.ctx.length > 32) {\n\t\tconst dirty = [];\n\t\tconst length = $$scope.ctx.length / 32;\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tdirty[i] = -1;\n\t\t}\n\t\treturn dirty;\n\t}\n\treturn -1;\n}\n\n/** @returns {{}} */\nexport function exclude_internal_props(props) {\n\tconst result = {};\n\tfor (const k in props) if (k[0] !== '$') result[k] = props[k];\n\treturn result;\n}\n\n/** @returns {{}} */\nexport function compute_rest_props(props, keys) {\n\tconst rest = {};\n\tkeys = new Set(keys);\n\tfor (const k in props) if (!keys.has(k) && k[0] !== '$') rest[k] = props[k];\n\treturn rest;\n}\n\n/** @returns {{}} */\nexport function compute_slots(slots) {\n\tconst result = {};\n\tfor (const key in slots) {\n\t\tresult[key] = true;\n\t}\n\treturn result;\n}\n\n/** @returns {(this: any, ...args: any[]) => void} */\nexport function once(fn) {\n\tlet ran = false;\n\treturn function (...args) {\n\t\tif (ran) return;\n\t\tran = true;\n\t\tfn.call(this, ...args);\n\t};\n}\n\nexport function null_to_empty(value) {\n\treturn value == null ? '' : value;\n}\n\nexport function set_store_value(store, ret, value) {\n\tstore.set(value);\n\treturn ret;\n}\n\nexport const has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\n\nexport function action_destroyer(action_result) {\n\treturn action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\n/** @param {number | string} value\n * @returns {[number, string]}\n */\nexport function split_css_unit(value) {\n\tconst split = typeof value === 'string' && value.match(/^\\s*(-?[\\d.]+)([^\\s]*)\\s*$/);\n\treturn split ? [parseFloat(split[1]), split[2] || 'px'] : [/** @type {number} */ (value), 'px'];\n}\n\nexport const contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable'];\n","import {\n\trun_all,\n\tsubscribe,\n\tnoop,\n\tsafe_not_equal,\n\tis_function,\n\tget_store_value\n} from '../internal/index.js';\n\nconst subscriber_queue = [];\n\n/**\n * Creates a `Readable` store that allows reading by subscription.\n *\n * https://svelte.dev/docs/svelte-store#readable\n * @template T\n * @param {T} [value] initial value\n * @param {import('./public.js').StartStopNotifier<T>} [start]\n * @returns {import('./public.js').Readable<T>}\n */\nexport function readable(value, start) {\n\treturn {\n\t\tsubscribe: writable(value, start).subscribe\n\t};\n}\n\n/**\n * Create a `Writable` store that allows both updating and reading by subscription.\n *\n * https://svelte.dev/docs/svelte-store#writable\n * @template T\n * @param {T} [value] initial value\n * @param {import('./public.js').StartStopNotifier<T>} [start]\n * @returns {import('./public.js').Writable<T>}\n */\nexport function writable(value, start = noop) {\n\t/** @type {import('./public.js').Unsubscriber} */\n\tlet stop;\n\t/** @type {Set<import('./private.js').SubscribeInvalidateTuple<T>>} */\n\tconst subscribers = new Set();\n\t/** @param {T} new_value\n\t * @returns {void}\n\t */\n\tfunction set(new_value) {\n\t\tif (safe_not_equal(value, new_value)) {\n\t\t\tvalue = new_value;\n\t\t\tif (stop) {\n\t\t\t\t// store is ready\n\t\t\t\tconst run_queue = !subscriber_queue.length;\n\t\t\t\tfor (const subscriber of subscribers) {\n\t\t\t\t\tsubscriber[1]();\n\t\t\t\t\tsubscriber_queue.push(subscriber, value);\n\t\t\t\t}\n\t\t\t\tif (run_queue) {\n\t\t\t\t\tfor (let i = 0; i < subscriber_queue.length; i += 2) {\n\t\t\t\t\t\tsubscriber_queue[i][0](subscriber_queue[i + 1]);\n\t\t\t\t\t}\n\t\t\t\t\tsubscriber_queue.length = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @param {import('./public.js').Updater<T>} fn\n\t * @returns {void}\n\t */\n\tfunction update(fn) {\n\t\tset(fn(value));\n\t}\n\n\t/**\n\t * @param {import('./public.js').Subscriber<T>} run\n\t * @param {import('./private.js').Invalidator<T>} [invalidate]\n\t * @returns {import('./public.js').Unsubscriber}\n\t */\n\tfunction subscribe(run, invalidate = noop) {\n\t\t/** @type {import('./private.js').SubscribeInvalidateTuple<T>} */\n\t\tconst subscriber = [run, invalidate];\n\t\tsubscribers.add(subscriber);\n\t\tif (subscribers.size === 1) {\n\t\t\tstop = start(set, update) || noop;\n\t\t}\n\t\trun(value);\n\t\treturn () => {\n\t\t\tsubscribers.delete(subscriber);\n\t\t\tif (subscribers.size === 0 && stop) {\n\t\t\t\tstop();\n\t\t\t\tstop = null;\n\t\t\t}\n\t\t};\n\t}\n\treturn { set, update, subscribe };\n}\n\n/**\n * Derived value store by synchronizing one or more readable stores and\n * applying an aggregation function over its input values.\n *\n * https://svelte.dev/docs/svelte-store#derived\n * @template {import('./private.js').Stores} S\n * @template T\n * @overload\n * @param {S} stores - input stores\n * @param {(values: import('./private.js').StoresValues<S>, set: (value: T) => void, update: (fn: import('./public.js').Updater<T>) => void) => import('./public.js').Unsubscriber | void} fn - function callback that aggregates the values\n * @param {T} [initial_value] - initial value\n * @returns {import('./public.js').Readable<T>}\n */\n\n/**\n * Derived value store by synchronizing one or more readable stores and\n * applying an aggregation function over its input values.\n *\n * https://svelte.dev/docs/svelte-store#derived\n * @template {import('./private.js').Stores} S\n * @template T\n * @overload\n * @param {S} stores - input stores\n * @param {(values: import('./private.js').StoresValues<S>) => T} fn - function callback that aggregates the values\n * @param {T} [initial_value] - initial value\n * @returns {import('./public.js').Readable<T>}\n */\n\n/**\n * @template {import('./private.js').Stores} S\n * @template T\n * @param {S} stores\n * @param {Function} fn\n * @param {T} [initial_value]\n * @returns {import('./public.js').Readable<T>}\n */\nexport function derived(stores, fn, initial_value) {\n\tconst single = !Array.isArray(stores);\n\t/** @type {Array<import('./public.js').Readable<any>>} */\n\tconst stores_array = single ? [stores] : stores;\n\tif (!stores_array.every(Boolean)) {\n\t\tthrow new Error('derived() expects stores as input, got a falsy value');\n\t}\n\tconst auto = fn.length < 2;\n\treturn readable(initial_value, (set, update) => {\n\t\tlet started = false;\n\t\tconst values = [];\n\t\tlet pending = 0;\n\t\tlet cleanup = noop;\n\t\tconst sync = () => {\n\t\t\tif (pending) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcleanup();\n\t\t\tconst result = fn(single ? values[0] : values, set, update);\n\t\t\tif (auto) {\n\t\t\t\tset(result);\n\t\t\t} else {\n\t\t\t\tcleanup = is_function(result) ? result : noop;\n\t\t\t}\n\t\t};\n\t\tconst unsubscribers = stores_array.map((store, i) =>\n\t\t\tsubscribe(\n\t\t\t\tstore,\n\t\t\t\t(value) => {\n\t\t\t\t\tvalues[i] = value;\n\t\t\t\t\tpending &= ~(1 << i);\n\t\t\t\t\tif (started) {\n\t\t\t\t\t\tsync();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tpending |= 1 << i;\n\t\t\t\t}\n\t\t\t)\n\t\t);\n\t\tstarted = true;\n\t\tsync();\n\t\treturn function stop() {\n\t\t\trun_all(unsubscribers);\n\t\t\tcleanup();\n\t\t\t// We need to set this to false because callbacks can still happen despite having unsubscribed:\n\t\t\t// Callbacks might already be placed in the queue which doesn't know it should no longer\n\t\t\t// invoke this derived store.\n\t\t\tstarted = false;\n\t\t};\n\t});\n}\n\n/**\n * Takes a store and returns a new one derived from the old one that is readable.\n *\n * https://svelte.dev/docs/svelte-store#readonly\n * @template T\n * @param {import('./public.js').Readable<T>} store - store to make readonly\n * @returns {import('./public.js').Readable<T>}\n */\nexport function readonly(store) {\n\treturn {\n\t\tsubscribe: store.subscribe.bind(store)\n\t};\n}\n\nexport { get_store_value as get };\n","import { writable } from 'svelte/store';\nimport type { Annotation } from '../model';\nimport type { Store } from './Store';\n\nexport type HoverState<T extends Annotation> = ReturnType<typeof createHoverState<T>>;\n\nexport const createHoverState = <T extends Annotation>(store: Store<T>) => {\n\n const { subscribe, set } = writable<string | undefined>();\n\n let currentHover: string | undefined;\n\n subscribe(updated => currentHover = updated);\n\n // Track store delete and update events\n store.observe(( { changes }) => { \n if (currentHover) {\n const isDeleted = (changes.deleted || []).some(a => a.id === currentHover);\n if (isDeleted)\n set(undefined);\n \n const updated = (changes.updated || []).find(({ oldValue }) => oldValue.id === currentHover);\n if (updated)\n set(updated.newValue.id);\n }\n });\n\n return { \n get current() { return currentHover },\n subscribe, \n set \n };\n\n}\n","import { writable } from 'svelte/store';\nimport { dequal } from 'dequal/lite';\nimport type { Annotation, FormatAdapter } from '../model';\nimport type { Store } from './Store';\n\nexport interface Selection {\n\n selected: { id: string, editable?: boolean }[],\n\n event?: PointerEvent | KeyboardEvent;\n\n}\n\nexport type SelectionState<I extends Annotation, E extends unknown> = ReturnType<typeof createSelectionState<I, E>>;\n\nexport enum UserSelectAction {\n\n EDIT = 'EDIT', // Make annotation target(s) editable on pointer select\n\n SELECT = 'SELECT', // Just select, but don't make editable\n\n NONE = 'NONE' // Click won't select - the annotation is completely inert\n\n}\n\nexport type UserSelectActionExpression<T extends unknown> = UserSelectAction | ((a: T) => UserSelectAction);\n\nconst EMPTY: Selection = { selected: [] };\n\nexport const createSelectionState = <I extends Annotation, E extends unknown>(\n store: Store<I>,\n defaultSelectionAction?: UserSelectActionExpression<E>,\n adapter?: FormatAdapter<I, E>\n) => {\n const { subscribe, set } = writable<Selection>(EMPTY);\n\n let currentUserSelectAction = defaultSelectionAction;\n\n let currentSelection: Selection = EMPTY;\n\n subscribe(updated => currentSelection = updated);\n\n const clear = () => {\n if (!dequal(currentSelection, EMPTY)) {\n set(EMPTY);\n }\n };\n\n const isEmpty = () => currentSelection.selected?.length === 0;\n\n const isSelected = (annotationOrId: I | string) => {\n if (isEmpty())\n return false;\n\n const id = typeof annotationOrId === 'string' ? annotationOrId : annotationOrId.id;\n return currentSelection.selected.some(i => i.id === id);\n }\n\n const userSelect = (idOrIds: string | string[], event?: Selection['event']) => {\n let annotations: I[];\n\n if (Array.isArray(idOrIds)) {\n annotations = idOrIds.map(id => store.getAnnotation(id)!).filter(Boolean);\n\n if (annotations.length < idOrIds.length) {\n console.warn('Invalid selection: ' + idOrIds.filter(id => !annotations.some(a => a.id === id)));\n return;\n }\n } else {\n const annotation = store.getAnnotation(idOrIds);\n if (!annotation) {\n console.warn('Invalid selection: ' + idOrIds);\n return;\n }\n\n annotations = [annotation];\n }\n\n const selected = annotations.reduce<{ id: string, editable?: boolean }[]>((sel, a) => {\n const action = onUserSelect(a, currentUserSelectAction, adapter);\n if (action === UserSelectAction.EDIT)\n return [...sel, { id: a.id, editable: true }];\n else if (action === UserSelectAction.SELECT) \n return [...sel, { id: a.id }];\n else\n return sel;\n }, []);\n\n set({ selected, event });\n }\n\n const setSelected = (idOrIds: string | string[], editable?: boolean) => {\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\n\n // Remove invalid\n const annotations = ids\n .map(id => store.getAnnotation(id))\n .filter((a): a is I => Boolean(a));\n\n set({\n selected: annotations.map(annotation => {\n\n // If editable isn't set, use the default behavior\n const isEditable = editable === undefined\n ? onUserSelect(annotation, currentUserSelectAction, adapter) === UserSelectAction.EDIT\n : editable;\n\n return { id: annotation.id, editable: isEditable }\n })\n });\n\n if (annotations.length !== ids.length)\n console.warn('Invalid selection', idOrIds);\n }\n\n const removeFromSelection = (ids: string[]) => {\n if (isEmpty())\n return false;\n\n const { selected } = currentSelection;\n\n // Checks which of the given annotations are actually in the selection\n const shouldRemove = selected.some(({ id }) => ids.includes(id));\n if (shouldRemove)\n set({ selected: selected.filter(({ id }) => !ids.includes(id)) });\n }\n\n const setUserSelectAction = (action: UserSelectActionExpression<E> | undefined) => {\n currentUserSelectAction = action;\n setSelected(currentSelection.selected.map(({ id }) => id));\n };\n\n // Track store delete and update events\n store.observe(\n ({ changes }) => removeFromSelection((changes.deleted || []).map(a => a.id))\n );\n\n return {\n get event() {\n return currentSelection ? currentSelection.event : null;\n },\n get selected() {\n return currentSelection ? [...currentSelection.selected] : null;\n },\n get userSelectAction() {\n return currentUserSelectAction;\n },\n clear,\n isEmpty,\n isSelected,\n setSelected,\n setUserSelectAction,\n subscribe,\n userSelect\n };\n\n}\n\nexport const onUserSelect = <I extends Annotation, E extends unknown>(\n annotation: I,\n action?: UserSelectActionExpression<E>,\n adapter?: FormatAdapter<I, E>\n): UserSelectAction => {\n const crosswalked = adapter ? adapter.serialize(annotation) : annotation as unknown as E;\n return (typeof action === 'function') ? action(crosswalked) : (action || UserSelectAction.EDIT)\n}\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","import { v4 as uuidv4 } from 'uuid';\nimport type { Annotation, AnnotationBody } from '../model/Annotation';\nimport type { User } from '../model/User';\n\n/**\n * Returns all users listed as creators or updaters in any parts of this\n * annotation.\n */\nexport const getContributors = (annotation: Annotation): User[] => {\n const { creator, updatedBy } = annotation.target;\n\n const bodyCollaborators = annotation.bodies.reduce((users, body) => (\n [...users, body.creator, body.updatedBy].filter(Boolean) as User[]\n ), [] as User[]);\n\n return [\n creator,\n updatedBy,\n ...bodyCollaborators\n ].filter(u => u) as User[] // Remove undefined\n}\n\ntype HasTime = { created?: string | Date; updated?: string | Date; };\n\n/** \n * Converts any string dates in the given annotation(-like) \n * object to proper Date objects.\n */\nexport const reviveDates = <A extends Annotation = Annotation>(annotation: any): A => {\n const revive = <T extends HasTime>(body: T): T => {\n const revived = {...body};\n\n if (body.created && typeof body.created === 'string')\n revived.created = new Date(body.created);\n\n if (body.updated && typeof body.updated === 'string')\n revived.updated = new Date(body.updated);\n\n return revived;\n }\n\n return {\n ...annotation,\n bodies: (annotation.bodies || []).map(revive),\n target: revive(annotation.target)\n } as A;\n}\n\n/**\n * Shorthand/helper.\n */\nexport const createBody = (\n annotationOrId: string | Annotation, \n payload: { [key: string]: any },\n created?: Date,\n creator?: User\n): AnnotationBody => ({\n id: uuidv4(),\n annotation: typeof annotationOrId === 'string' ? annotationOrId : annotationOrId.id,\n created: created || new Date(),\n creator,\n ...payload\n});","import { dequal } from 'dequal/lite';\nimport type { Update } from '../state/StoreObserver';\nimport type { Annotation } from '../model/Annotation';\n\nconst getAddedBodies = (oldValue: Annotation, newValue: Annotation) => {\n const oldBodyIds = new Set(oldValue.bodies.map(b => b.id));\n return newValue.bodies.filter(b => !oldBodyIds.has(b.id));\n}\n\nconst getRemovedBodies = (oldValue: Annotation, newValue: Annotation) => {\n const newBodyIds = new Set(newValue.bodies.map(b => b.id));\n return oldValue.bodies.filter(b => !newBodyIds.has(b.id));\n}\n\nconst getChangedBodies = (oldValue: Annotation, newValue: Annotation) => \n newValue.bodies\n .map(newBody => {\n const oldBody = oldValue.bodies.find(b => b.id === newBody.id);\n return { newBody, oldBody: oldBody && !dequal(oldBody, newBody) ? oldBody : undefined }\n })\n .filter(({ oldBody }) => oldBody)\n .map(({ oldBody, newBody }) => ({ oldBody: oldBody!, newBody }));\n\nconst hasTargetChanged = (oldValue: Annotation, newValue: Annotation) => \n !dequal(oldValue.target, newValue.target);\n\nexport const diffAnnotations = <T extends Annotation = Annotation>(oldValue: T, newValue: T): Update<T> => {\n const bodiesCreated = getAddedBodies(oldValue, newValue);\n const bodiesDeleted = getRemovedBodies(oldValue, newValue);\n const bodiesUpdated = getChangedBodies(oldValue, newValue);\n\n return {\n oldValue, \n newValue,\n bodiesCreated: bodiesCreated.length > 0 ? bodiesCreated : undefined,\n bodiesDeleted: bodiesDeleted.length > 0 ? bodiesDeleted : undefined,\n bodiesUpdated: bodiesUpdated.length > 0 ? bodiesUpdated : undefined,\n targetUpdated: hasTargetChanged(oldValue, newValue) ? { oldTarget: oldValue.target, newTarget: newValue.target } : undefined\n }\n}","import type { Annotation, AnnotationBody, AnnotationTarget } from '../model/Annotation';\nimport { diffAnnotations } from '../utils';\n\n/** Interface for listening to changes in the annotation store **/\nexport interface StoreObserver<T extends Annotation> { \n\n onChange: { (event: StoreChangeEvent<T>): void };\n\n options: StoreObserveOptions;\n\n}\n\n/** A change event fired when the store state changes **/\nexport interface StoreChangeEvent<T extends Annotation> {\n\n origin: Origin;\n\n changes: ChangeSet<T>;\n\n state: T[];\n\n}\n\nexport interface ChangeSet<T extends Annotation> {\n\n created?: T[];\n\n deleted?: T[];\n\n updated?: Update<T>[];\n\n}\n\nexport interface Update<T extends Annotation> {\n\n oldValue: T;\n\n newValue: T;\n\n bodiesCreated?: T['bodies'];\n\n bodiesDeleted?: T['bodies'];\n\n bodiesUpdated?: Array<{ oldBody: T['bodies'][number], newBody: T['bodies'][number] }>;\n\n targetUpdated?: { oldTarget: T['target'], newTarget: T['target'] };\n\n}\n\n/** Options to control which events the observer wants to get notified about **/\nexport interface StoreObserveOptions {\n\n // Observe changes on targets, bodies or both?\n ignore?: Ignore;\n\n // Observe changes on one more specific annotations\n annotations?: string | string[];\n\n // Observer changes only for a specific origin\n origin?: Origin\n\n}\n\n/** Allows the observer to ignore certain event types **/\nexport enum Ignore { \n\n // Don't notify this observer for changes that involve bodies only\n BODY_ONLY = 'BODY_ONLY',\n\n // Don't notify for changes on targets only\n TARGET_ONLY = 'TARGET_ONLY'\n\n}\n\n/** \n * Allows the observer to listen only for events that originated locally or from a remote source.\n * \n * SILENT should be used for updates that are not supposed to trigger an event. Remember that \n * with great power comes great responsibility: SILENT is really for Annotorious plugins and\n * extensions ONLY.\n */\nexport enum Origin { \n \n LOCAL = 'LOCAL', \n \n REMOTE = 'REMOTE',\n \n SILENT = 'SILENT'\n\n}\n\n/** Tests if this observer should be notified about this event **/\nexport const shouldNotify = <T extends Annotation>(observer: StoreObserver<T>, event: StoreChangeEvent<T>) => {\n const { changes, origin } = event;\n\n const isRelevantOrigin = observer.options.origin \n ? observer.options.origin === origin \n : origin !== Origin.SILENT;\n\n if (!isRelevantOrigin)\n return false;\n\n if (observer.options.ignore) {\n const { ignore } = observer.options;\n\n // Shorthand\n const has = (arg: any[] | undefined) => arg && arg.length > 0;\n\n const hasAnnotationChanges =\n has(changes.created) || has(changes.deleted);\n\n if (!hasAnnotationChanges) {\n const hasBodyChanges =\n changes.updated?.some(u => has(u.bodiesCreated) || has(u.bodiesDeleted) || has(u.bodiesUpdated));\n \n const hasTargetChanges = \n changes.updated?.some(u => u.targetUpdated);\n\n if (ignore === Ignore.BODY_ONLY && hasBodyChanges && !hasTargetChanges)\n return false;\n\n if (ignore === Ignore.TARGET_ONLY && hasTargetChanges && !hasBodyChanges)\n return false;\n }\n }\n\n if (observer.options.annotations) {\n // This observer has a filter set on specific annotations - check affected\n const affectedAnnotations = new Set([\n ...(changes.created || []).map(a => a.id),\n ...(changes.deleted || []).map(a => a.id),\n ...(changes.updated || []).map(({ oldValue }) => oldValue.id)\n ]);\n\n const observed = Array.isArray(observer.options.annotations) ?\n observer.options.annotations : [ observer.options.annotations ];\n\n return Boolean(observed.find(id => affectedAnnotations.has(id)));\n } else {\n return true;\n }\n\n}\n\nexport const mergeChanges = <T extends Annotation>(changes: ChangeSet<T>, toMerge: ChangeSet<T>) => {\n const previouslyCreatedIds = new Set((changes.created || []).map(a => a.id));\n const previouslyUpdatedIds = new Set((changes.updated || []).map(({ newValue })=> newValue.id));\n\n const createdIds = new Set((toMerge.created || []).map(a => a.id));\n const deletedIds = new Set((toMerge.deleted || []).map(a => a.id));\n const updatedIds = new Set((toMerge.updated || []).map(({ oldValue }) => oldValue.id));\n\n // Updates that will be merged into create or previous update events\n const mergeableUpdates = new Set((toMerge.updated || [])\n .filter(({ oldValue }) => previouslyCreatedIds.has(oldValue.id) || previouslyUpdatedIds.has(oldValue.id))\n .map(({ oldValue }) => oldValue.id ));\n\n // * created *\n // - drop created that were then deleted\n // - merge any updates on created\n // - append newly created\n const created = [\n ...(changes.created || [])\n .filter(a => !deletedIds.has(a.id))\n .map(a => updatedIds.has(a.id) \n ? toMerge.updated!.find(({ oldValue }) => oldValue.id === a.id)!.newValue\n : a),\n ...(toMerge.created || [])\n ];\n\n // * deleted *\n // - drop deleted that were later re-created (redo action!)\n // - append newly deleted, but remove any that delete annotations \n // that were created in the same round\n const deleted = [\n ...(changes.deleted || [])\n .filter(a => !createdIds.has(a.id)),\n ...(toMerge.deleted || []) \n .filter(a => !previouslyCreatedIds.has(a.id))\n ] \n\n // * updated *\n // - drop updates on deleted annotations\n // - merge any updates that override previous ones\n // - append new updates, but remove any that were merged\n const updated = [\n ...(changes.updated || [])\n .filter(({ newValue }) => !deletedIds.has(newValue.id))\n .map(update => {\n const { oldValue, newValue } = update;\n if (updatedIds.has(newValue.id)) {\n const updated = toMerge.updated!.find(u => u.oldValue.id === newValue.id)!.newValue;\n return diffAnnotations(oldValue, updated);\n } else {\n return update;\n }\n }),\n ...(toMerge.updated || []).filter(({ oldValue }) => !mergeableUpdates.has(oldValue.id))\n ]\n\n return { created, deleted, updated };\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport type { Annotation } from '../model';\nimport { diffAnnotations } from '../utils';\nimport { Origin, shouldNotify, type Update, type ChangeSet } from './StoreObserver';\nimport type { StoreObserver, StoreChangeEvent, StoreObserveOptions } from './StoreObserver';\n\n// Shorthand\ntype AnnotationBodyIdentifier = { id: string, annotation: string }; \n\nconst sanitize = <T extends Annotation>(a: Partial<T>): T => {\n const id = a.id === undefined ? uuidv4() : a.id;\n\n return {\n ...a,\n id,\n bodies: a.bodies === undefined ? [] : a.bodies.map(b => ({\n ...b,\n annotation: id \n })),\n target: {\n ...a.target,\n annotation: id\n }\n } as T;\n}\n\nexport type Store<T extends Annotation> = ReturnType<typeof createStore<T>>;\n\nconst isAnnotation = <T extends Annotation>(arg: any): arg is T => arg.id !== undefined;\n\nexport const createStore = <T extends Annotation>() => {\n\n const annotationIndex = new Map<string, T>();\n\n const bodyIndex = new Map<string, string>();\n\n const observers: StoreObserver<T>[] = [];\n\n const observe = (onChange: { (event: StoreChangeEvent<T>): void }, options: StoreObserveOptions = {}) => {\n observers.push({ onChange, options });\n }\n\n const unobserve = (onChange: { (event: StoreChangeEvent<T>): void }) => {\n const idx = observers.findIndex(observer => observer.onChange == onChange);\n if (idx > -1)\n observers.splice(idx, 1);\n }\n\n const emit = (origin: Origin, changes: ChangeSet<T>) => {\n const event: StoreChangeEvent<T> = {\n origin,\n changes: {\n created: changes.created || [],\n updated: changes.updated || [],\n deleted: changes.deleted || []\n },\n state: [...annotationIndex.values()]\n };\n\n observers.forEach(observer => {\n if (shouldNotify(observer, event))\n observer.onChange(event);\n });\n }\n\n const addAnnotation = (annotation: Partial<T>, origin = Origin.LOCAL) => {\n const existing = annotation.id && annotationIndex.get(annotation.id);\n\n if (existing) {\n throw Error(`Cannot add annotation ${annotation.id} - exists already`);\n } else {\n const sanitized = sanitize(annotation);\n\n annotationIndex.set(sanitized.id, sanitized);\n sanitized.bodies.forEach(b => bodyIndex.set(b.id, sanitized.id));\n emit(origin, { created: [sanitized] });\n }\n }\n\n const updateOneAnnotation = (arg1: string | Partial<T>, arg2?: Partial<T> | Origin) => {\n const updated: T = typeof arg1 === 'string' ? sanitize(arg2 as Partial<T>) : sanitize(arg1);\n\n const oldId: string | undefined = typeof arg1 === 'string' ? arg1 : arg1.id;\n const oldValue = oldId && annotationIndex.get(oldId);\n\n if (oldValue) {\n const update: Update<T> = diffAnnotations(oldValue, updated);\n\n if (oldId === updated.id) {\n annotationIndex.set(oldId, updated);\n } else {\n annotationIndex.delete(oldId);\n annotationIndex.set(updated.id, updated);\n }\n\n oldValue.bodies.forEach(b => bodyIndex.delete(b.id));\n updated.bodies.forEach(b => bodyIndex.set(b.id, updated.id));\n\n return update;\n } else {\n console.warn(`Cannot update annotation ${oldId} - does not exist`);\n }\n }\n \n const updateAnnotation = (arg1: string | T, arg2: T | Origin = Origin.LOCAL, arg3 = Origin.LOCAL) => {\n const origin: Origin = isAnnotation(arg2) ? arg3 : arg2;\n\n const update = updateOneAnnotation(arg1, arg2);\n if (update)\n emit(origin, { updated: [update] })\n }\n\n const upsertAnnotation = (arg1: T, arg2 = Origin.LOCAL) => {\n const exists = Boolean(annotationIndex.get(arg1.id));\n if (exists) {\n updateAnnotation(arg1);\n } else {\n addAnnotation(arg1);\n }\n }\n\n const bulkUpdateAnnotations = (annotations: T[], origin = Origin.LOCAL) => {\n const updated = annotations.reduce((updated, annotation) => {\n const u = updateOneAnnotation(annotation);\n return u ? [...updated, u] : updated;\n }, [] as Update<T>[]);\n\n if (updated.length > 0)\n emit(origin, { updated });\n }\n\n const bulkUpsertAnnotations = (annotations: Partial<T>[], origin = Origin.LOCAL) => {\n const sanitized = annotations.map(sanitize);\n\n const { toAdd, toUpdate } = sanitized.reduce<{ toAdd: T[], toUpdate: T[] }>((agg, annotation) => {\n const exists = Boolean(annotationIndex.get(annotation.id));\n if (exists) {\n return {...agg, toUpdate: [...agg.toUpdate, annotation]};\n } else {\n return {...agg, toAdd: [...agg.toAdd, annotation]}\n }\n }, { toAdd: [], toUpdate: [] });\n\n const updated = toUpdate.map(a => updateOneAnnotation(a, origin)!).filter(Boolean);\n\n toAdd.forEach(annotation => {\n annotationIndex.set(annotation.id, annotation);\n annotation.bodies.forEach(b => bodyIndex.set(b.id, annotation.id));\n });\n\n emit(origin, { created: toAdd, updated });\n }\n\n const addBody = (body: T['bodies'][number], origin = Origin.LOCAL) => {\n const oldValue = annotationIndex.get(body.annotation);\n if (oldValue) {\n const newValue = { \n ...oldValue,\n bodies: [ ...oldValue.bodies, body ]\n };\n\n annotationIndex.set(oldValue.id, newValue);\n\n bodyIndex.set(body.id, newValue.id);\n\n const update: Update<T> = {\n oldValue, newValue, bodiesCreated: [ body ]\n };\n\n emit(origin, { updated: [update] });\n } else {\n console.warn(`Attempt to add body to missing annotation: ${body.annotation}`);\n }\n }\n\n const all = () => [...annotationIndex.values()];\n\n const clear = (origin = Origin.LOCAL) => { \n const all = [...annotationIndex.values()];\n\n annotationIndex.clear();\n bodyIndex.clear();\n\n emit(origin, { deleted: all });\n }\n\n const bulkAddAnnotations = (annotations: Partial<T>[], replace = true, origin = Origin.LOCAL) => {\n const sanitized = annotations.map(sanitize);\n\n if (replace) {\n // Delete existing first\n const deleted = [...annotationIndex.values()];\n annotationIndex.clear();\n bodyIndex.clear();\n\n sanitized.forEach(annotation => {\n annotationIndex.set(annotation.id, annotation);\n annotation.bodies.forEach(b => bodyIndex.set(b.id, annotation.id));\n });\n\n emit(origin, { created: sanitized, deleted });\n } else {\n // Don't allow overwriting of existing annotations\n const existing = annotations.reduce((all, next) => {\n const existing = next.id && annotationIndex.get(next.id);\n return existing ? [...all, existing ] : all;\n }, [] as T[]);\n\n if (existing.length > 0)\n throw Error(`Bulk insert would overwrite the following annotations: ${existing.map(a => a.id).join(', ')}`);\n\n sanitized.forEach(annotation => {\n annotationIndex.set(annotation.id, annotation);\n annotation.bodies.forEach(b => bodyIndex.set(b.id, annotation.id));\n });\n\n emit(origin, { created: sanitized });\n }\n }\n\n const deleteOneAnnotation = (annotationOrId: T | string) => {\n const id = typeof annotationOrId === 'string' ? annotationOrId : annotationOrId.id;\n\n const existing = annotationIndex.get(id);\n if (existing) {\n annotationIndex.delete(id);\n existing.bodies.forEach(b => bodyIndex.delete(b.id));\n return existing;\n } else {\n console.warn(`Attempt to delete missing annotation: ${id}`);\n }\n }\n\n const deleteAnnotation = (annotationOrId: T | string, origin = Origin.LOCAL) => {\n const deleted = deleteOneAnnotation(annotationOrId);\n if (deleted)\n emit(origin, { deleted: [ deleted ]});\n }\n\n const bulkDeleteAnnotations = (annotationsOrIds: (T | string)[], origin = Origin.LOCAL) => {\n const deleted = annotationsOrIds.reduce((deleted, arg) => {\n const existing = deleteOneAnnotation(arg);\n return existing ? [...deleted, existing] : deleted;\n }, [] as T[]);\n\n if (deleted.length > 0)\n emit(origin, { deleted });\n }\n\n const deleteOneBody = (body: AnnotationBodyIdentifier) => {\n const oldAnnotation = annotationIndex.get(body.annotation);\n\n if (oldAnnotation) {\n const oldBody = oldAnnotation.bodies.find(b => b.id === body.id);\n\n if (oldBody) {\n bodyIndex.delete(oldBody.id);\n\n const newAnnotation = {\n ...oldAnnotation,\n bodies: oldAnnotation.bodies.filter(b => b.id !== body.id)\n };\n\n annotationIndex.set(oldAnnotation.id, newAnnotation);\n\n const update: Update<T> = {\n oldValue: oldAnnotation, newValue: newAnnotation, bodiesDeleted: [oldBody]\n };\n\n return update;\n } else {\n console.warn(`Attempt to delete missing body ${body.id} from annotation ${body.annotation}`);\n }\n } else {\n console.warn(`Attempt to delete body from missing annotation ${body.annotation}`);\n }\n }\n \n const deleteBody = (body: AnnotationBodyIdentifier, origin = Origin.LOCAL) => {\n const updated = deleteOneBody(body);\n if (updated)\n emit(origin, { updated: [ updated ]});\n }\n\n const bulkDeleteBodies = (bodies: AnnotationBodyIdentifier[], origin = Origin.LOCAL) => {\n const updated = bodies\n .map(b => deleteOneBody(b)!)\n .filter(Boolean);\n\n if (updated.length > 0)\n emit(origin, { updated });\n }\n\n const getAnnotation = (id: string): T | undefined => {\n const a = annotationIndex.get(id);\n return a ? {...a} : undefined;\n }\n\n const getBody = (id: string): T['bodies'][number] | undefined => {\n const annotationId = bodyIndex.get(id);\n if (annotationId) {\n const annotation = getAnnotation(annotationId);\n const body = annotation!.bodies.find(b => b.id === id);\n if (body) {\n return body;\n } else {\n console.error(`Store integrity error: body ${id} in index, but not in annotation`);\n }\n } else {\n console.warn(`Attempt to retrieve missing body: ${id}`);\n }\n }\n\n const updateOneBody = (oldBodyId: AnnotationBodyIdentifier, newBody: T['bodies'][number]) => {\n if (oldBodyId.annotation !== newBody.annotation)\n throw 'Annotation integrity violation: annotation ID must be the same when updating bodies';\n\n const oldAnnotation = annotationIndex.get(oldBodyId.annotation);\n if (oldAnnotation) {\n const oldBody = oldAnnotation.bodies.find(b => b.id === oldBodyId.id)!;\n\n const newAnnotation = { \n ...oldAnnotation,\n bodies: oldAnnotation.bodies.map(b => b.id === oldBody.id ? newBody : b)\n };\n\n annotationIndex.set(oldAnnotation.id, newAnnotation);\n\n if (oldBody.id !== newBody.id) {\n bodyIndex.delete(oldBody.id);\n bodyIndex.set(newBody.id, newAnnotation.id);\n }\n\n return {\n oldValue: oldAnnotation, \n newValue: newAnnotation,\n bodiesUpdated: [{ oldBody, newBody }]\n }\n } else {\n console.warn(`Attempt to add body to missing annotation ${oldBodyId.annotation}`);\n }\n }\n\n const updateBody = (oldBodyId: AnnotationBodyIdentifier, newBody: T['bodies'][number], origin = Origin.LOCAL) => {\n const update = updateOneBody(oldBodyId, newBody);\n if (update)\n emit(origin, { updated: [ update ]} );\n }\n\n const bulkUpdateBodies = (bodies: Array<T['bodies'][number]>, origin = Origin.LOCAL) => {\n const updated = bodies\n .map(b => updateOneBody({ id: b.id, annotation: b.annotation }, b)!)\n .filter(Boolean);\n\n emit(origin, { updated });\n }\n\n const updateOneTarget = (target: T['target']): Update<T> | undefined => {\n const oldValue = annotationIndex.get(target.annotation);\n \n if (oldValue) {\n const newValue = { \n ...oldValue, \n target: {\n ...oldValue.target,\n ...target \n }\n };\n\n annotationIndex.set(oldValue.id, newValue);\n\n return {\n oldValue, newValue, targetUpdated: { \n oldTarget: oldValue.target,\n newTarget: target\n }\n };\n } else {\n console.warn(`Attempt to update target on missing annotation: ${target.annotation}`);\n }\n }\n\n const updateTarget = (target: T['target'], origin = Origin.LOCAL) => {\n const update = updateOneTarget(target);\n if (update)\n emit(origin, { updated: [ update ]} );\n }\n\n const bulkUpdateTargets = (targets: Array<T['target']>, origin = Origin.LOCAL) => {\n const updated = \n targets.map(t => updateOneTarget(t)!).filter(Boolean);\n if (updated.length > 0)\n emit(origin, { updated });\n }\n\n\treturn {\n addAnnotation,\n addBody,\n all,\n bulkAddAnnotations,\n bulkDeleteAnnotations,\n bulkDeleteBodies,\n bulkUpdateAnnotations,\n bulkUpdateBodies,\n bulkUpdateTargets,\n bulkUpsertAnnotations,\n clear,\n deleteAnnotation,\n deleteBody,\n getAnnotation,\n getBody,\n observe,\n unobserve,\n updateAnnotation,\n updateBody,\n updateTarget,\n upsertAnnotation\n\t};\n\n}\n","import type { Annotation, Annotator, AnnotatorState } from '../model';\nimport type { Store } from './Store';\nimport type { StoreChangeEvent } from './StoreObserver';\n\ntype Subscriber<T extends Annotation> = (annotation: T[]) => void; \n\nexport interface SvelteStore<T extends Annotation> extends Store<T> {\n\n subscribe(onChange: Subscriber<T>): void;\n\n}\n\nexport interface SvelteAnnotatorState<I extends Annotation, E extends unknown> extends AnnotatorState<I, E> {\n\n store: SvelteStore<I>\n\n}\n\nexport interface SvelteAnnotator<I extends Annotation, E extends unknown> extends Annotator<I, E> {\n\n state: SvelteAnnotatorState<I, E>\n\n}\n\n/** \n * A simple wrapper around the event-based store implementation\n * that adds a Svelte shim, for use with the reactive '$' notation.\n * Other frameworks might not actually need this. But it's pretty\n * convenient for everyone using Svelte, as well as for the\n * basic (Svelte-based) Annotorious standard implementation.\n */\nexport const toSvelteStore = <T extends Annotation = Annotation>(store: Store<T>): SvelteStore<T> => {\n\n const subscribe = (onChange: Subscriber<T>) => {\n\n // Register a store observer on behalf of the subscriber\n const shim = (event: StoreChangeEvent<T>) => onChange(event.state);\n store.observe(shim);\n\n // Immediately call the subscriber function with the\n // current store value, according to the Svelte contract.\n // https://stackoverflow.com/questions/68220955/how-does-svelte-unsubscribe-actually-work\n onChange(store.all());\n\n // Return the unsubscribe function\n return () => store.unobserve(shim);\n }\n\n return {\n ...store,\n subscribe\n }\n\n}","export let createNanoEvents = () => ({\n emit(event, ...args) {\n for (\n let callbacks = this.events[event] || [],\n i = 0,\n length = callbacks.length;\n i < length;\n i++\n ) {\n callbacks[i](...args)\n }\n },\n events: {},\n on(event, cb) {\n ;(this.events[event] ||= []).push(cb)\n return () => {\n this.events[event] = this.events[event]?.filter(i => cb !== i)\n }\n }\n})\n","import { createNanoEvents, type Unsubscribe } from 'nanoevents';\nimport type { Annotation } from '../model';\nimport type { Store } from './Store';\nimport { Origin } from './StoreObserver';\nimport { mergeChanges, type ChangeSet, type StoreChangeEvent, type Update } from './StoreObserver';\n\n// Duration with fast successive changes get merged \n// with the last event in the stack, rather than getting stacked\n// as a new undo/redo step.\nconst DEBOUNCE = 250;\n\nexport interface UndoStack <T extends Annotation> {\n\n canRedo(): boolean;\n\n canUndo(): boolean;\n\n destroy(): void;\n\n getHistory(): History<T>;\n\n on<E extends keyof UndoStackEvents<T>>(event: E, callback: UndoStackEvents<T>[E]): Unsubscribe;\n\n undo(): void;\n\n redo(): void;\n\n}\n\nexport interface UndoStackEvents <T extends Annotation> {\n\n redo(change: ChangeSet<T>): void;\n\n undo(change: ChangeSet<T>): void;\n\n}\n\nexport interface History <T extends Annotation> {\n\n changes: ChangeSet<T>[];\n \n pointer: number;\n\n}\n\nexport const createUndoStack = <T extends Annotation>(store: Store<T>, history?: History<T>): UndoStack<T> => {\n\n const emitter = createNanoEvents<UndoStackEvents<T>>();\n\n const changeStack: ChangeSet<T>[] = history?.changes || [];\n\n let pointer = history ? history.pointer : - 1;\n\n let muteEvents = false;\n\n let lastEvent = 0;\n\n const onChange = (event: StoreChangeEvent<T>) => {\n if (!muteEvents) {\n const { changes } = event;\n\n const now = performance.now();\n\n if (now - lastEvent > DEBOUNCE) {\n // Put this change on the stack...\n changeStack.splice(pointer + 1);\n changeStack.push(changes);\n\n // ...and update the pointer\n pointer = changeStack.length - 1;\n } else {\n // Merge this change with the last in the stack\n const last = changeStack.length - 1;\n changeStack[last] = mergeChanges(changeStack[last], changes);\n }\n\n lastEvent = now;\n }\n\n muteEvents = false;\n }\n\n store.observe(onChange, { origin: Origin.LOCAL });\n\n const undoCreated = (created?: T[]) =>\n created && created.length > 0 && store.bulkDeleteAnnotations(created);\n\n const redoCreated = (created?: T[]) =>\n created && created.length > 0 && store.bulkAddAnnotations(created, false);\n\n const undoUpdated = (updated?: Update<T>[]) =>\n updated && updated.length > 0 && store.bulkUpdateAnnotations(updated.map(({ oldValue }) => oldValue));\n \n const redoUpdated = (updated?: Update<T>[]) =>\n updated && updated.length > 0 && store.bulkUpdateAnnotations(updated.map(({ newValue }) => newValue));\n\n const undoDeleted = (deleted?: T[]) => \n deleted && deleted.length > 0 && store.bulkAddAnnotations(deleted, false);\n\n const redoDeleted = (deleted?: T[]) =>\n deleted && deleted.length > 0 && store.bulkDeleteAnnotations(deleted);\n\n const undo = () => {\n if (pointer > -1) {\n muteEvents = true;\n\n const { created, updated, deleted } = changeStack[pointer];\n\n undoCreated(created);\n undoUpdated(updated);\n undoDeleted(deleted);\n\n emitter.emit('undo', changeStack[pointer]);\n\n pointer -= 1;\n }\n }\n\n const canUndo = () => pointer > -1;\n\n const redo = () => {\n if (changeStack.length - 1 > pointer) {\n muteEvents = true;\n\n const { created, updated, deleted } = changeStack[pointer + 1];\n\n redoCreated(created);\n redoUpdated(updated);\n redoDeleted(deleted);\n\n emitter.emit('redo', changeStack[pointer + 1]);\n\n pointer += 1;\n }\n }\n\n const canRedo = () => changeStack.length - 1 > pointer;\n\n const destroy = () => store.unobserve(onChange);\n\n const getHistory = () => ({ changes: [...changeStack], pointer });\n\n const on = <E extends keyof UndoStackEvents<T>>(event: E, callback: UndoStackEvents<T>[E]) => \n emitter.on(event, callback);\n\n return {\n canRedo,\n canUndo,\n destroy,\n getHistory,\n on,\n redo,\n undo\n }\n\n}","import { writable } from 'svelte/store';\n\nexport type ViewportState = ReturnType<typeof createViewportState>;\n\nexport const createViewportState = () => {\n\n const { subscribe, set } = writable<string[]>([]);\n\n return { \n subscribe, \n set\n };\n\n}\n","import { dequal } from 'dequal/lite';\nimport type { Annotation, AnnotatorState, FormatAdapter } from '../model';\nimport { Origin } from '../state';\nimport type { ChangeSet, SelectionState, UndoStack } from '../state';\nimport type { LifecycleEvents } from './LifecycleEvents';\n\nexport type Lifecycle<I extends Annotation, E extends unknown> = \n ReturnType<typeof createLifecycleObserver<I, E>>;\n\nexport const createLifecycleObserver = <I extends Annotation, E extends unknown>(\n state: AnnotatorState<I, E>,\n undoStack: UndoStack<I>,\n adapter?: FormatAdapter<I, E>,\n autoSave?: boolean\n) => {\n const { hover, selection, store, viewport } = state;\n\n const observers: Map<keyof LifecycleEvents, Function[]> = new Map();\n\n // The currently selected annotations, in the state when they were selected \n let initialSelection: I[] = [];\n\n let currentHover: string | undefined;\n\n let idleTimeout: ReturnType<typeof setTimeout>;\n\n const on = <T extends keyof LifecycleEvents>(event: T, callback: LifecycleEvents<E>[T]) => {\n if (observers.has(event)) {\n observers.get(event)!.push(callback);\n } else {\n observers.set(event, [callback]);\n }\n }\n\n const off = <T extends keyof LifecycleEvents<E>>(event: T, callback: LifecycleEvents<E>[T]) => {\n const callbacks = observers.get(event);\n if (callbacks) {\n const idx = callbacks.indexOf(callback);\n if (idx !== -1)\n callbacks.splice(idx, 1);\n }\n }\n\n const emit = (event: keyof LifecycleEvents<E>, arg0: I | I[], arg1?: I | PointerEvent) => {\n if (observers.has(event)) {\n setTimeout(() => {\n observers.get(event)!.forEach(callback => { \n if (adapter) {\n const serialized0 = Array.isArray(arg0) ? \n arg0.map(a => adapter.serialize(a)) : adapter.serialize(arg0);\n \n const serialized1: E | PointerEvent | undefined =\n arg1 ? arg1 instanceof PointerEvent ? arg1 : adapter.serialize(arg1) : undefined;\n\n callback(serialized0 as E & E[], serialized1); \n } else {\n callback(arg0 as E & E[], arg1 as unknown as E); \n }\n });\n }, 1);\n }\n }\n\n const onIdleUpdate = () => {\n const { selected } = selection;\n\n // User idle after activity - fire update events for selected\n // annotations that changed\n const updatedSelected = (selected || []).map(({ id }) => store.getAnnotation(id)!);\n\n updatedSelected.forEach(updated => {\n const initial = initialSelection.find(a => a.id === updated.id);\n if (!initial || !dequal(initial, updated)) {\n emit('updateAnnotation', updated, initial);\n }\n });\n\n initialSelection = initialSelection.map(initial => {\n const updated = updatedSelected.find(({ id }) => id === initial.id);\n return updated ? updated : initial\n });\n }\n\n selection.subscribe(({ selected })=> {\n if (initialSelection.length === 0 && selected.length === 0)\n return;\n\n if (initialSelection.length === 0 && selected.length > 0) {\n // A new selection was made - store the editable annotation as initial state\n initialSelection = selected.map(({ id }) => store.getAnnotation(id)!);\n } else if (initialSelection.length > 0 && selected.length === 0) {\n // Deselect!\n initialSelection.forEach(initial => {\n const updatedState = store.getAnnotation(initial.id); \n \n if (updatedState && !dequal(updatedState, initial)) {\n emit('updateAnnotation', updatedState, initial);\n }\n });\n\n initialSelection = [];\n } else {\n // Changed selection\n const initialIds = new Set(initialSelection.map(a => a.id));\n const selectedIds = new Set(selected.map(({ id }) => id));\n\n // Fire update events for deselected annotations that have changed\n const deselected = initialSelection.filter(a => !selectedIds.has(a.id));\n deselected.forEach(initial => {\n const updatedState = store.getAnnotation(initial.id);\n\n if (updatedState && !dequal(updatedState, initial))\n emit('updateAnnotation', updatedState, initial);\n });\n\n initialSelection = [\n // Remove annotations that were deselected\n ...initialSelection.filter(a => selectedIds.has(a.id)),\n // Add editable annotations that were selected\n ...selected\n .filter(({ id }) => !initialIds.has(id))\n .map(({ id }) => store.getAnnotation(id)!)\n ];\n }\n\n emit('selectionChanged', initialSelection);\n });\n\n hover.subscribe(id => {\n if (!currentHover && id) {\n emit('mouseEnterAnnotation', store.getAnnotation(id)!);\n } else if (currentHover && !id) {\n emit('mouseLeaveAnnotation', store.getAnnotation(currentHover)!);\n } else if (currentHover && id) {\n emit('mouseLeaveAnnotation', store.getAnnotation(currentHover)!);\n emit('mouseEnterAnnotation', store.getAnnotation(id)!);\n }\n\n currentHover = id;\n });\n\n viewport?.subscribe(ids => \n emit('viewportIntersect', ids.map(id => store.getAnnotation(id)!)));\n\n store.observe(event => {\n // autoSave option triggers update events on idleness\n if (autoSave) {\n if (idleTimeout)\n clearTimeout(idleTimeout);\n\n idleTimeout = setTimeout(onIdleUpdate, 1000);\n }\n\n // Local CREATE and DELETE events are applied immediately\n const { created, deleted } = event.changes;\n (created || []).forEach(a => emit('createAnnotation', a));\n (deleted || []).forEach(a => emit('deleteAnnotation', a));\n\n // Updates are only applied immediately if they involve body changes\n const updatesWithBody = (event.changes.updated || []).filter(u => [\n ...(u.bodiesCreated || []),\n ...(u.bodiesDeleted || []),\n ...(u.bodiesUpdated || [])\n ].length > 0);\n\n // Emit an update with the new annototation and the stored initial state\n updatesWithBody.forEach(({ oldValue, newValue }) => {\n const initial = initialSelection.find(a => a.id === oldValue.id) || oldValue;\n\n // Record the update as the new last known state\n initialSelection = initialSelection\n .map(a => a.id === oldValue.id ? newValue : a);\n\n emit('updateAnnotation', newValue, initial);\n });\n }, { origin: Origin.LOCAL });\n\n // Track remote changes - these should update the initial state\n store.observe(event => {\n if (initialSelection) {\n const selectedIds = new Set(initialSelection.map(a => a.id));\n\n const relevantUpdates = (event.changes.updated || [])\n .filter(({ newValue }) => selectedIds.has(newValue.id))\n .map(({ newValue }) => newValue);\n\n if (relevantUpdates.length > 0) {\n initialSelection = initialSelection.map(selected => {\n const updated = relevantUpdates.find(updated => updated.id === selected.id);\n return updated ? updated : selected;\n })\n }\n }\n }, { origin: Origin.REMOTE });\n\n const onUndoOrRedo = (undo: boolean) => (changes: ChangeSet<I>) => {\n // Undo/redo of created/delete will cause lifecycle events automatically,\n // but we need to handle updates specifically!\n const { updated } = changes;\n\n if (undo)\n (updated || []).forEach(t => emit('updateAnnotation', t.oldValue, t.newValue));\n else\n (updated || []).forEach(t => emit('updateAnnotation', t.newValue, t.oldValue));\n }\n\n undoStack.on('undo', onUndoOrRedo(true));\n undoStack.on('redo', onUndoOrRedo(false));\n\n return { on, off, emit }\n\n}\n","import type { Annotation } from './Annotation';\n\nexport interface FormatAdapter<A extends Annotation, T extends unknown> {\n\n parse(serialized: T): ParseResult<A>;\n\n parseAll?(serialized: unknown[]): { parsed: A[], failed: T[] };\n\n serialize(core: A): T;\n\n}\n\nexport interface ParseResult<A extends Annotation> {\n\n parsed?: A;\n \n error?: Error;\n\n}\n\nexport const serializeAll = \n <A extends Annotation, T extends unknown>(adapter: FormatAdapter<A, T>) =>\n (annotations: A[]) => annotations.map(a => adapter.serialize(a));\n\nexport const parseAll = \n <A extends Annotation, T extends unknown>(adapter: FormatAdapter<A, T>) =>\n (serialized: T[]) => serialized.reduce((result, next) => {\n const { parsed, error } = adapter.parse(next);\n \n return error ? {\n parsed: result.parsed,\n failed: [...result.failed, next ]\n } : parsed ? {\n parsed: [...result.parsed, parsed ],\n failed: result.failed\n } : {\n ...result\n }\n }, { parsed: [] as A[], failed: [] as T[]});\n ","import type { Annotation } from './Annotation';\nimport type { User } from './User';\nimport type { PresenceProvider } from '../presence';\nimport type {\n History,\n HoverState,\n SelectionState,\n Store,\n UndoStack,\n UserSelectActionExpression,\n ViewportState\n} from '../state';\nimport { Origin } from '../state';\nimport type { LifecycleEvents } from '../lifecycle';\nimport { reviveDates } from '../utils';\nimport { type FormatAdapter, parseAll } from './FormatAdapter';\nimport type { DrawingStyleExpression } from './DrawingStyle';\nimport type { Filter } from './Filter';\n\n/**\n * Base annotator interface\n * @template I - internal core data model\n * @template E - external adapted representation\n */\nexport interface Annotator<I extends Annotation = Annotation, E extends unknown = Annotation> {\n\n addAnnotation(annotation: Partial<E>): void;\n\n cancelSelected(): void;\n\n canRedo(): boolean;\n\n canUndo(): boolean;\n\n clearAnnotations(): void;\n\n destroy(): void;\n\n getAnnotationById(id: string): E | undefined;\n\n getAnnotations(): E[];\n\n getHistory(): History<I>;\n\n getSelected(): E[];\n\n getUser(): User;\n\n loadAnnotations(url: string, replace?: boolean): Promise<E[]>;\n\n redo(): void;\n\n removeAnnotation(arg: Partial<E> | string): E | undefined;\n\n setAnnotations(annotations: Partial<E>[], replace?: boolean): void;\n\n setFilter(filter: Filter<I> | undefined): void;\n\n setPresenceProvider?(provider: PresenceProvider): void;\n\n setSelected(arg?: string | string[], editable?: boolean): void;\n\n setStyle(style: DrawingStyleExpression<I> | undefined): void;\n\n setUser(user: User): void;\n\n setUserSelectAction(action: UserSelectActionExpression<E>): void;\n\n setVisible(visible: boolean): void;\n\n undo(): void;\n\n updateAnnotation(annotation: Partial<E>): E;\n \n on<T extends keyof LifecycleEvents<E>>(event: T, callback: LifecycleEvents<E>[T]): void;\n\n off<T extends keyof LifecycleEvents<E>>(event: T, callback: LifecycleEvents<E>[T]): void;\n\n state: AnnotatorState<I, E>;\n\n}\n\nexport interface AnnotatorState<I extends Annotation, E extends unknown> {\n\n store: Store<I>;\n\n selection: SelectionState<I, E>;\n\n hover: HoverState<I>;\n\n viewport: ViewportState;\n\n}\n\nexport const createBaseAnnotator = <I extends Annotation, E extends unknown>(\n state: AnnotatorState<I, E>, \n undoStack: UndoStack<I>,\n adapter?: FormatAdapter<I, E>\n) => {\n\n const { store, selection } = state;\n\n const addAnnotation = (annotation: E) => {\n if (adapter) {\n const { parsed, error } = adapter.parse(annotation);\n if (parsed) {\n store.addAnnotation(parsed, Origin.REMOTE);\n } else {\n console.error(error);\n }\n } else {\n store.addAnnotation(reviveDates<I>(annotation), Origin.REMOTE);\n }\n }\n\n const cancelSelected = () => selection.clear();\n\n const clearAnnotations = () => store.clear();\n\n const getAnnotationById = (id: string): E | undefined => {\n const annotation = store.getAnnotation(id);\n return (adapter && annotation) ?\n adapter.serialize(annotation) as E : annotation as unknown as E;\n }\n\n const getAnnotations = () =>\n (adapter ? store.all().map(adapter.serialize) : store.all()) as E[];\n\n const getSelected = () => {\n const selectedIds = selection.selected?.map(s => s.id) || [];\n\n const selected = selectedIds.map(id => store.getAnnotation(id)!).filter(Boolean);\n\n return adapter \n ? selected.map(adapter.serialize) \n : selected as unknown as E[];\n }\n\n const loadAnnotations = (url: string, replace = true) =>\n fetch(url)\n .then((response) => response.json())\n .then((annotations) => {\n setAnnotations(annotations, replace);\n return annotations;\n });\n\n const removeAnnotation = (arg: E | string): E | undefined => {\n if (typeof arg === 'string') {\n const annotation = store.getAnnotation(arg);\n store.deleteAnnotation(arg);\n\n if (annotation)\n return adapter ? adapter.serialize(annotation) : annotation as unknown as E;\n } else {\n const annotation = adapter ? adapter.parse(arg).parsed : (arg as unknown as I);\n\n if (annotation) {\n store.deleteAnnotation(annotation);\n return arg;\n }\n }\n }\n\n const setAnnotations = (annotations: E[], replace = true) => {\n if (adapter) {\n const parseFn = adapter.parseAll || parseAll(adapter);\n const { parsed, failed } = parseFn(annotations);\n\n if (failed.length > 0)\n console.warn(`Discarded ${failed.length} invalid annotations`, failed);\n\n store.bulkAddAnnotations(parsed, replace, Origin.REMOTE);\n } else {\n store.bulkAddAnnotations(annotations.map(reviveDates<I>), replace, Origin.REMOTE);\n }\n }\n\n const setSelected = (arg?: string | string[], editable?: boolean) => {\n if (arg) {\n selection.setSelected(arg, editable);\n } else {\n selection.clear();\n }\n }\n\n const setUserSelectAction = (action: UserSelectActionExpression<E>) => {\n selection.clear();\n selection.setUserSelectAction(action);\n }\n\n const updateAnnotation = (updated: E): E => {\n if (adapter) {\n const crosswalked = adapter.parse(updated).parsed!;\n const previous = adapter.serialize(store.getAnnotation(crosswalked.id)!);\n store.updateAnnotation(crosswalked);\n return previous;\n } else {\n const previous = store.getAnnotation((updated as unknown as I).id);\n store.updateAnnotation(reviveDates<I>(updated));\n return previous as unknown as E;\n }\n }\n\n // Note that we don't spread the undoStack - it has a .destroy()\n // method that would likely get overwritten by other Annotator implementations\n // if people are not careful.\n return { \n addAnnotation,\n cancelSelected,\n canRedo: undoStack.canRedo,\n canUndo: undoStack.canUndo,\n clearAnnotations,\n getAnnotationById,\n getAnnotations,\n getHistory: undoStack.getHistory,\n getSelected,\n loadAnnotations,\n redo: undoStack.redo,\n removeAnnotation,\n setAnnotations,\n setSelected,\n setUserSelectAction,\n undo: undoStack.undo,\n updateAnnotation\n }\n\n}\n","import type { Annotation } from \"./Annotation\";\nimport type { AnnotationState } from \"./AnnotationState\";\n\ntype RGB = `rgb(${number}, ${number}, ${number})`;\n\ntype RGBA = `rgba(${number}, ${number}, ${number}, ${number})`;\n\ntype HEX = `#${string}`;\n\nexport type Color = RGB | RGBA | HEX;\n\nexport interface DrawingStyle {\n\n fill?: Color;\n\n fillOpacity?: number;\n\n stroke?: Color;\n\n strokeOpacity?: number;\n\n strokeWidth?: number;\n\n}\n\nexport type DrawingStyleExpression<T extends Annotation = Annotation> =\n DrawingStyle | ((annotation: T, state?: AnnotationState) => DrawingStyle | undefined);\n\n/** Utility functions **/\n\nexport const computeStyle = <T extends Annotation = Annotation>(\n annotation: T,\n style: DrawingStyleExpression<T>,\n state?: AnnotationState\n) => {\n return typeof style === 'function' ? style(annotation, state) : style;\n};\n\nexport const chainStyles = <T extends Annotation = Annotation>(\n applyFirst: DrawingStyleExpression<T>,\n applySecond: DrawingStyleExpression<T>\n) => {\n if (typeof applyFirst !== 'function' && typeof applySecond !== 'function') {\n // Simple case: just two objects\n return {\n ...(applyFirst || {}),\n ...(applySecond || {})\n };\n } else {\n // Return a function\n return (a: T, state: AnnotationState) => {\n const first = typeof applyFirst === 'function' ? applyFirst(a, state) : applyFirst;\n const second = typeof applySecond === 'function' ? applySecond(a, state) : applySecond;\n\n return {\n ...(first || {}),\n ...(second || {})\n }\n }\n }\n}\n \n","export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","import { customAlphabet } from 'nanoid';\n\nexport interface User {\n\n id: string;\n\n isGuest?: boolean;\n\n name?: string;\n\n avatar?: string;\n\n}\n\nexport const createAnonymousGuest = () => {\n const nanoid = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_', 20);\n \n return { isGuest: true, id: nanoid() }\n}","import type { AnnotationBody } from './Annotation';\n\nexport interface W3CAnnotation {\n\n '@context': 'http://www.w3.org/ns/anno.jsonld';\n\n type: 'Annotation';\n\n id: string;\n\n creator?: W3CUser;\n\n created?: string;\n\n modified?: string;\n\n body: W3CAnnotationBody | W3CAnnotationBody[];\n\n target: W3CAnnotationTarget | W3CAnnotationTarget[];\n\n [key: string]: any;\n\n}\n\nexport interface W3CUser {\n\n type?: string;\n\n id: string;\n\n name?: string;\n\n}\n\nexport interface W3CAnnotationBody {\n\n type?: string;\n\n id?: string;\n\n purpose?: string;\n\n value?: string;\n\n source?: string;\n\n creator?: W3CUser;\n\n created?: string;\n\n modified?: string;\n\n}\n\nexport interface W3CAnnotationTarget {\n\n id?: string;\n\n source: string;\n\n selector?: AbstractW3CSelector;\n\n}\n\nexport interface AbstractW3CSelector { }\n\n// https://stackoverflow.com/questions/6122571/simple-non-secure-hash-function-for-javascript\nconst hashCode = (obj: Object): string => {\n const str = JSON.stringify(obj);\n\n let hash = 0;\n\n for (let i = 0, len = str.length; i < len; i++) {\n let chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n\n return `${hash}`;\n}\n\nexport const parseW3CUser = (user?: any) => user\n ? typeof user === 'object' ? { ...user } : user : undefined;\n\n/**\n * Helper to crosswalk the W3C annotation body to a list of core AnnotationBody objects.\n */\nexport const parseW3CBodies = (\n body: W3CAnnotationBody | W3CAnnotationBody[],\n annotationId: string\n) : AnnotationBody[] => (Array.isArray(body) ? body : [body]).map(body => {\n\n // Extract properties that conform to the internal model, but keep custom props\n const { id, type, purpose, value, created, modified, creator, ...rest } = body;\n\n // The internal model strictly requires IDs. (Because multi-user scenarios\n // will have problems without them.) In the W3C model, bodys *may* have IDs.\n // We'll create ad-hoc IDs for bodies without IDs, but want to make sure that\n // generating the ID is idempotent: the same body should always get the same ID.\n // This will avoid unexpected results when checking for equality. \n return {\n id: id || `temp-${hashCode(body)}`,\n annotation: annotationId,\n type,\n purpose,\n value,\n creator: parseW3CUser(creator),\n created: created ? new Date(created) : undefined,\n updated: modified ? new Date(modified) : undefined,\n ...rest\n }\n\n});\n\n/** Serialization helper to remove core-specific fields from the annotation body **/\nexport const serializeW3CBodies = (bodies: AnnotationBody[]): W3CAnnotationBody[] =>\n bodies.map(b => {\n const { annotation: _a, created, updated, ...bodyRest } = b;\n\n const w3cBody: W3CAnnotationBody = {\n ...bodyRest,\n created: created?.toISOString(),\n modified: updated?.toISOString()\n }\n if (w3cBody.id?.startsWith('temp-')) {\n delete w3cBody.id;\n }\n\n return w3cBody;\n });\n","// SEABORN_BRIGHT\nexport const DEFAULT_PALETTE: Palette = [\n '#ff7c00', // orange\n '#1ac938', // green\n '#e8000b', // red\n '#8b2be2', // purple\n '#9f4800', // brown\n '#f14cc1', // pink\n '#ffc400', // khaki\n '#00d7ff', // cyan\n '#023eff' // blue\n];\n\nexport type Palette = string[];","import type { User } from '../model/User';\nimport type { Appearance } from './Appearance';\nimport type { PresentUser } from './PresentUser';\nimport { DEFAULT_PALETTE } from './ColorPalette';\n\nexport interface AppearanceProvider {\n\n addUser(presenceKey: string, user: User): Appearance;\n\n removeUser(user: PresentUser): void;\n\n}\n\nexport const defaultColorProvider = () => {\n\n const unassignedColors = [...DEFAULT_PALETTE];\n\n const assignRandomColor = () => {\n const rnd = Math.floor(Math.random() * unassignedColors.length);\n const color = unassignedColors[rnd];\n\n unassignedColors.splice(rnd, 1);\n\n return color;\n }\n\n const releaseColor = (color: string) =>\n unassignedColors.push(color);\n\n return { assignRandomColor, releaseColor };\n\n}\n\nexport const createDefaultAppearanceProvider = () => {\n\n const colorProvider = defaultColorProvider();\n\n const addUser = (presenceKey: string, user: User): Appearance => {\n const color = colorProvider.assignRandomColor();\n\n return {\n label: user.name || user.id,\n avatar: user.avatar,\n color\n };\n }\n\n const removeUser = (user: PresentUser) =>\n colorProvider.releaseColor(user.appearance.color);\n\n return { addUser, removeUser }\n \n}","import { nanoid } from 'nanoid';\nimport { createNanoEvents, type Unsubscribe } from 'nanoevents';\nimport type { User } from '../model/User';\nimport type { PresentUser } from './PresentUser';\nimport type { PresenceEvents } from './PresenceEvents';\nimport { createDefaultAppearanceProvider } from './AppearanceProvider';\nimport type { AppearanceProvider } from './AppearanceProvider';\n\nexport interface PresenceState {\n\n // Get users currently present to this room\n getPresentUsers(): PresentUser[];\n\n // Notify of a given present user's activity on the given annotations\n notifyActivity(presenceKey: string, annotationIds: string[]): void;\n\n // Add a listener for the given presence event\n on<E extends keyof PresenceEvents>(event: E, callback: PresenceEvents[E]): Unsubscribe;\n\n // Initial sync - which users are present under which keys\n syncUsers(state: { presenceKey: string, user: User }[]): void;\n\n // Update the selection state for the given prresent user\n updateSelection(presenceKey: string, selection: string[] | null): void;\n\n}\n\nconst isListEqual = (listA: any[], listB: any[]) => \n listA.every(a => listA.includes(a)) && listB.every(b => listA.includes(b));\n\n// This client's presence key\nexport const PRESENCE_KEY = nanoid();\n\nexport const createPresenceState = (\n appearanceProvider: AppearanceProvider = createDefaultAppearanceProvider()\n): PresenceState => {\n\n const emitter = createNanoEvents<PresenceEvents>();\n\n const presentUsers = new Map<string, PresentUser>();\n\n const selectionStates = new Map<string, string[]>();\n\n const addUser = (presenceKey: string, user: User) => {\n if (presentUsers.has(presenceKey)) {\n console.warn('Attempt to add user that is already present', presenceKey, user);\n return; \n }\n\n const appearance = appearanceProvider.addUser(presenceKey, user);\n\n presentUsers.set(presenceKey, { \n ...user,\n presenceKey,\n appearance\n });\n }\n\n const removeUser = (presenceKey: string) => {\n const user = presentUsers.get(presenceKey);\n if (!user) {\n console.warn('Attempt to remove user that is not present', presenceKey);\n return;\n }\n\n appearanceProvider.removeUser(user);\n\n presentUsers.delete(presenceKey);\n }\n\n const syncUsers = (state: { presenceKey: string, user: User }[]) => {\n // const keys = new Set(others.map(s => s.presenceKey));\n const keys = new Set(state.map(s => s.presenceKey));\n\n // These users need to be added to the presentUsers list\n // const toAdd = others.filter(({ presenceKey }) => !presentUsers.has(presenceKey));\n const toAdd = state.filter(({ presenceKey }) => !presentUsers.has(presenceKey));\n\n // These users need to be dropped from the list\n const toRemove = Array.from(presentUsers.values()).filter(presentUser =>\n !keys.has(presentUser.presenceKey));\n\n toAdd.forEach(({ presenceKey, user }) => addUser(presenceKey, user));\n\n toRemove.forEach(user => {\n const { presenceKey } = user;\n\n // If this user has a selection, fire deselect event\n if (selectionStates.has(presenceKey))\n emitter.emit('selectionChange', user, null);\n\n removeUser(presenceKey)\n });\n\n if (toAdd.length > 0 || toRemove.length > 0)\n emitter.emit('presence', getPresentUsers());\n }\n\n const notifyActivity = (presenceKey: string, annotationIds: string[]) => { \n const user = presentUsers.get(presenceKey);\n \n if (!user) {\n console.warn('Activity notification from user that is not present');\n return;\n }\n\n const currentSelection = selectionStates.get(presenceKey);\n\n // Was there a selection change we might have missed?\n if (!currentSelection || !isListEqual(currentSelection, annotationIds)) {\n selectionStates.set(presenceKey, annotationIds);\n emitter.emit('selectionChange', user, annotationIds);\n }\n }\n\n const updateSelection = (presenceKey: string, selection: string[] | null) => {\n const from = presentUsers.get(presenceKey);\n if (!from) {\n console.warn('Selection change for user that is not present', presenceKey);\n return;\n }\n\n if (selection)\n selectionStates.set(presenceKey, selection);\n else \n selectionStates.delete(presenceKey);\n\n emitter.emit('selectionChange', from, selection);\n }\n\n const getPresentUsers = () =>\n [...Array.from(presentUsers.values())];\n \n const on = <E extends keyof PresenceEvents>(event: E, callback: PresenceEvents[E]) =>\n emitter.on(event, callback);\n\n return {\n getPresentUsers,\n notifyActivity,\n on,\n syncUsers,\n updateSelection\n }\n\n}"],"names":["has","dequal","foo","bar","ctor","len","noop","safe_not_equal","a","b","subscriber_queue","writable","value","start","stop","subscribers","set","new_value","run_queue","subscriber","i","update","fn","subscribe","run","invalidate","createHoverState","store","currentHover","updated","changes","oldValue","UserSelectAction","EMPTY","createSelectionState","defaultSelectionAction","adapter","currentUserSelectAction","currentSelection","clear","isEmpty","_a","isSelected","annotationOrId","id","userSelect","idOrIds","event","annotations","annotation","selected","sel","action","onUserSelect","setSelected","editable","ids","isEditable","removeFromSelection","setUserSelectAction","crosswalked","byteToHex","unsafeStringify","arr","offset","getRandomValues","rnds8","rng","randomUUID","native","v4","options","buf","rnds","getContributors","creator","updatedBy","bodyCollaborators","users","body","u","reviveDates","revive","revived","createBody","payload","created","uuidv4","getAddedBodies","newValue","oldBodyIds","getRemovedBodies","newBodyIds","getChangedBodies","newBody","oldBody","hasTargetChanged","diffAnnotations","bodiesCreated","bodiesDeleted","bodiesUpdated","Ignore","Origin","shouldNotify","observer","_b","origin","ignore","arg","hasBodyChanges","hasTargetChanges","affectedAnnotations","mergeChanges","toMerge","previouslyCreatedIds","previouslyUpdatedIds","createdIds","deletedIds","updatedIds","mergeableUpdates","deleted","sanitize","isAnnotation","createStore","annotationIndex","bodyIndex","observers","observe","onChange","unobserve","idx","emit","addAnnotation","sanitized","updateOneAnnotation","arg1","arg2","oldId","updateAnnotation","arg3","upsertAnnotation","bulkUpdateAnnotations","bulkUpsertAnnotations","toAdd","toUpdate","agg","addBody","all","bulkAddAnnotations","replace","existing","next","deleteOneAnnotation","deleteAnnotation","bulkDeleteAnnotations","annotationsOrIds","deleteOneBody","oldAnnotation","newAnnotation","deleteBody","bulkDeleteBodies","bodies","getAnnotation","getBody","annotationId","updateOneBody","oldBodyId","updateBody","bulkUpdateBodies","updateOneTarget","target","targets","t","toSvelteStore","shim","createNanoEvents","args","callbacks","length","cb","DEBOUNCE","createUndoStack","history","emitter","changeStack","pointer","muteEvents","lastEvent","now","last","undoCreated","redoCreated","undoUpdated","redoUpdated","undoDeleted","redoDeleted","callback","createViewportState","createLifecycleObserver","state","undoStack","autoSave","hover","selection","viewport","initialSelection","idleTimeout","on","off","arg0","serialized0","serialized1","onIdleUpdate","updatedSelected","initial","updatedState","initialIds","selectedIds","relevantUpdates","onUndoOrRedo","undo","serializeAll","parseAll","serialized","result","parsed","error","createBaseAnnotator","cancelSelected","clearAnnotations","getAnnotationById","getAnnotations","getSelected","s","loadAnnotations","url","response","setAnnotations","removeAnnotation","parseFn","failed","previous","computeStyle","style","chainStyles","applyFirst","applySecond","first","second","urlAlphabet","random","bytes","customRandom","alphabet","defaultSize","getRandom","mask","step","size","j","customAlphabet","nanoid","scopedUrlAlphabet","createAnonymousGuest","hashCode","obj","str","hash","chr","parseW3CUser","user","parseW3CBodies","type","purpose","modified","rest","serializeW3CBodies","bodyRest","w3cBody","DEFAULT_PALETTE","defaultColorProvider","unassignedColors","rnd","color","createDefaultAppearanceProvider","colorProvider","presenceKey","isListEqual","listA","listB","PRESENCE_KEY","createPresenceState","appearanceProvider","presentUsers","selectionStates","addUser","appearance","removeUser","syncUsers","keys","toRemove","presentUser","getPresentUsers","notifyActivity","annotationIds","updateSelection","from"],"mappings":"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","x_google_ignoreList":[0,1,2,5,6,7,8,14,21,22]}
|
|
1
|
+
{"version":3,"file":"annotorious-core.es.js","sources":["../../../node_modules/dequal/lite/index.mjs","../../../node_modules/svelte/src/runtime/internal/utils.js","../../../node_modules/svelte/src/runtime/store/index.js","../src/state/Hover.ts","../src/state/Selection.ts","../../../node_modules/uuid/dist/esm-browser/stringify.js","../../../node_modules/uuid/dist/esm-browser/rng.js","../../../node_modules/uuid/dist/esm-browser/native.js","../../../node_modules/uuid/dist/esm-browser/v4.js","../src/utils/annotationUtils.ts","../src/utils/diffAnnotations.ts","../src/state/StoreObserver.ts","../src/state/Store.ts","../src/state/SvelteStore.ts","../../../node_modules/nanoevents/index.js","../src/state/UndoStack.ts","../src/state/Viewport.ts","../src/lifecycle/Lifecycle.ts","../src/model/FormatAdapter.ts","../src/model/Annotator.ts","../src/model/DrawingStyle.ts","../../../node_modules/nanoid/url-alphabet/index.js","../../../node_modules/nanoid/index.browser.js","../src/model/User.ts","../src/model/W3CAnnotation.ts","../src/presence/ColorPalette.ts","../src/presence/AppearanceProvider.ts","../src/presence/PresenceState.ts"],"sourcesContent":["var has = Object.prototype.hasOwnProperty;\n\nexport function dequal(foo, bar) {\n\tvar ctor, len;\n\tif (foo === bar) return true;\n\n\tif (foo && bar && (ctor=foo.constructor) === bar.constructor) {\n\t\tif (ctor === Date) return foo.getTime() === bar.getTime();\n\t\tif (ctor === RegExp) return foo.toString() === bar.toString();\n\n\t\tif (ctor === Array) {\n\t\t\tif ((len=foo.length) === bar.length) {\n\t\t\t\twhile (len-- && dequal(foo[len], bar[len]));\n\t\t\t}\n\t\t\treturn len === -1;\n\t\t}\n\n\t\tif (!ctor || typeof foo === 'object') {\n\t\t\tlen = 0;\n\t\t\tfor (ctor in foo) {\n\t\t\t\tif (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n\t\t\t\tif (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n\t\t\t}\n\t\t\treturn Object.keys(bar).length === len;\n\t\t}\n\t}\n\n\treturn foo !== foo && bar !== bar;\n}\n","/** @returns {void} */\nexport function noop() {}\n\nexport const identity = (x) => x;\n\n/**\n * @template T\n * @template S\n * @param {T} tar\n * @param {S} src\n * @returns {T & S}\n */\nexport function assign(tar, src) {\n\t// @ts-ignore\n\tfor (const k in src) tar[k] = src[k];\n\treturn /** @type {T & S} */ (tar);\n}\n\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\n/**\n * @param {any} value\n * @returns {value is PromiseLike<any>}\n */\nexport function is_promise(value) {\n\treturn (\n\t\t!!value &&\n\t\t(typeof value === 'object' || typeof value === 'function') &&\n\t\ttypeof (/** @type {any} */ (value).then) === 'function'\n\t);\n}\n\n/** @returns {void} */\nexport function add_location(element, file, line, column, char) {\n\telement.__svelte_meta = {\n\t\tloc: { file, line, column, char }\n\t};\n}\n\nexport function run(fn) {\n\treturn fn();\n}\n\nexport function blank_object() {\n\treturn Object.create(null);\n}\n\n/**\n * @param {Function[]} fns\n * @returns {void}\n */\nexport function run_all(fns) {\n\tfns.forEach(run);\n}\n\n/**\n * @param {any} thing\n * @returns {thing is Function}\n */\nexport function is_function(thing) {\n\treturn typeof thing === 'function';\n}\n\n/** @returns {boolean} */\nexport function safe_not_equal(a, b) {\n\treturn a != a ? b == b : a !== b || (a && typeof a === 'object') || typeof a === 'function';\n}\n\nlet src_url_equal_anchor;\n\n/**\n * @param {string} element_src\n * @param {string} url\n * @returns {boolean}\n */\nexport function src_url_equal(element_src, url) {\n\tif (element_src === url) return true;\n\tif (!src_url_equal_anchor) {\n\t\tsrc_url_equal_anchor = document.createElement('a');\n\t}\n\t// This is actually faster than doing URL(..).href\n\tsrc_url_equal_anchor.href = url;\n\treturn element_src === src_url_equal_anchor.href;\n}\n\n/** @param {string} srcset */\nfunction split_srcset(srcset) {\n\treturn srcset.split(',').map((src) => src.trim().split(' ').filter(Boolean));\n}\n\n/**\n * @param {HTMLSourceElement | HTMLImageElement} element_srcset\n * @param {string | undefined | null} srcset\n * @returns {boolean}\n */\nexport function srcset_url_equal(element_srcset, srcset) {\n\tconst element_urls = split_srcset(element_srcset.srcset);\n\tconst urls = split_srcset(srcset || '');\n\n\treturn (\n\t\turls.length === element_urls.length &&\n\t\turls.every(\n\t\t\t([url, width], i) =>\n\t\t\t\twidth === element_urls[i][1] &&\n\t\t\t\t// We need to test both ways because Vite will create an a full URL with\n\t\t\t\t// `new URL(asset, import.meta.url).href` for the client when `base: './'`, and the\n\t\t\t\t// relative URLs inside srcset are not automatically resolved to absolute URLs by\n\t\t\t\t// browsers (in contrast to img.src). This means both SSR and DOM code could\n\t\t\t\t// contain relative or absolute URLs.\n\t\t\t\t(src_url_equal(element_urls[i][0], url) || src_url_equal(url, element_urls[i][0]))\n\t\t)\n\t);\n}\n\n/** @returns {boolean} */\nexport function not_equal(a, b) {\n\treturn a != a ? b == b : a !== b;\n}\n\n/** @returns {boolean} */\nexport function is_empty(obj) {\n\treturn Object.keys(obj).length === 0;\n}\n\n/** @returns {void} */\nexport function validate_store(store, name) {\n\tif (store != null && typeof store.subscribe !== 'function') {\n\t\tthrow new Error(`'${name}' is not a store with a 'subscribe' method`);\n\t}\n}\n\nexport function subscribe(store, ...callbacks) {\n\tif (store == null) {\n\t\tfor (const callback of callbacks) {\n\t\t\tcallback(undefined);\n\t\t}\n\t\treturn noop;\n\t}\n\tconst unsub = store.subscribe(...callbacks);\n\treturn unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\n\n/**\n * Get the current value from a store by subscribing and immediately unsubscribing.\n *\n * https://svelte.dev/docs/svelte-store#get\n * @template T\n * @param {import('../store/public.js').Readable<T>} store\n * @returns {T}\n */\nexport function get_store_value(store) {\n\tlet value;\n\tsubscribe(store, (_) => (value = _))();\n\treturn value;\n}\n\n/** @returns {void} */\nexport function component_subscribe(component, store, callback) {\n\tcomponent.$$.on_destroy.push(subscribe(store, callback));\n}\n\nexport function create_slot(definition, ctx, $$scope, fn) {\n\tif (definition) {\n\t\tconst slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n\t\treturn definition[0](slot_ctx);\n\t}\n}\n\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n\treturn definition[1] && fn ? assign($$scope.ctx.slice(), definition[1](fn(ctx))) : $$scope.ctx;\n}\n\nexport function get_slot_changes(definition, $$scope, dirty, fn) {\n\tif (definition[2] && fn) {\n\t\tconst lets = definition[2](fn(dirty));\n\t\tif ($$scope.dirty === undefined) {\n\t\t\treturn lets;\n\t\t}\n\t\tif (typeof lets === 'object') {\n\t\t\tconst merged = [];\n\t\t\tconst len = Math.max($$scope.dirty.length, lets.length);\n\t\t\tfor (let i = 0; i < len; i += 1) {\n\t\t\t\tmerged[i] = $$scope.dirty[i] | lets[i];\n\t\t\t}\n\t\t\treturn merged;\n\t\t}\n\t\treturn $$scope.dirty | lets;\n\t}\n\treturn $$scope.dirty;\n}\n\n/** @returns {void} */\nexport function update_slot_base(\n\tslot,\n\tslot_definition,\n\tctx,\n\t$$scope,\n\tslot_changes,\n\tget_slot_context_fn\n) {\n\tif (slot_changes) {\n\t\tconst slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n\t\tslot.p(slot_context, slot_changes);\n\t}\n}\n\n/** @returns {void} */\nexport function update_slot(\n\tslot,\n\tslot_definition,\n\tctx,\n\t$$scope,\n\tdirty,\n\tget_slot_changes_fn,\n\tget_slot_context_fn\n) {\n\tconst slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n\tupdate_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\n\n/** @returns {any[] | -1} */\nexport function get_all_dirty_from_scope($$scope) {\n\tif ($$scope.ctx.length > 32) {\n\t\tconst dirty = [];\n\t\tconst length = $$scope.ctx.length / 32;\n\t\tfor (let i = 0; i < length; i++) {\n\t\t\tdirty[i] = -1;\n\t\t}\n\t\treturn dirty;\n\t}\n\treturn -1;\n}\n\n/** @returns {{}} */\nexport function exclude_internal_props(props) {\n\tconst result = {};\n\tfor (const k in props) if (k[0] !== '$') result[k] = props[k];\n\treturn result;\n}\n\n/** @returns {{}} */\nexport function compute_rest_props(props, keys) {\n\tconst rest = {};\n\tkeys = new Set(keys);\n\tfor (const k in props) if (!keys.has(k) && k[0] !== '$') rest[k] = props[k];\n\treturn rest;\n}\n\n/** @returns {{}} */\nexport function compute_slots(slots) {\n\tconst result = {};\n\tfor (const key in slots) {\n\t\tresult[key] = true;\n\t}\n\treturn result;\n}\n\n/** @returns {(this: any, ...args: any[]) => void} */\nexport function once(fn) {\n\tlet ran = false;\n\treturn function (...args) {\n\t\tif (ran) return;\n\t\tran = true;\n\t\tfn.call(this, ...args);\n\t};\n}\n\nexport function null_to_empty(value) {\n\treturn value == null ? '' : value;\n}\n\nexport function set_store_value(store, ret, value) {\n\tstore.set(value);\n\treturn ret;\n}\n\nexport const has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\n\nexport function action_destroyer(action_result) {\n\treturn action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\n/** @param {number | string} value\n * @returns {[number, string]}\n */\nexport function split_css_unit(value) {\n\tconst split = typeof value === 'string' && value.match(/^\\s*(-?[\\d.]+)([^\\s]*)\\s*$/);\n\treturn split ? [parseFloat(split[1]), split[2] || 'px'] : [/** @type {number} */ (value), 'px'];\n}\n\nexport const contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable'];\n","import {\n\trun_all,\n\tsubscribe,\n\tnoop,\n\tsafe_not_equal,\n\tis_function,\n\tget_store_value\n} from '../internal/index.js';\n\nconst subscriber_queue = [];\n\n/**\n * Creates a `Readable` store that allows reading by subscription.\n *\n * https://svelte.dev/docs/svelte-store#readable\n * @template T\n * @param {T} [value] initial value\n * @param {import('./public.js').StartStopNotifier<T>} [start]\n * @returns {import('./public.js').Readable<T>}\n */\nexport function readable(value, start) {\n\treturn {\n\t\tsubscribe: writable(value, start).subscribe\n\t};\n}\n\n/**\n * Create a `Writable` store that allows both updating and reading by subscription.\n *\n * https://svelte.dev/docs/svelte-store#writable\n * @template T\n * @param {T} [value] initial value\n * @param {import('./public.js').StartStopNotifier<T>} [start]\n * @returns {import('./public.js').Writable<T>}\n */\nexport function writable(value, start = noop) {\n\t/** @type {import('./public.js').Unsubscriber} */\n\tlet stop;\n\t/** @type {Set<import('./private.js').SubscribeInvalidateTuple<T>>} */\n\tconst subscribers = new Set();\n\t/** @param {T} new_value\n\t * @returns {void}\n\t */\n\tfunction set(new_value) {\n\t\tif (safe_not_equal(value, new_value)) {\n\t\t\tvalue = new_value;\n\t\t\tif (stop) {\n\t\t\t\t// store is ready\n\t\t\t\tconst run_queue = !subscriber_queue.length;\n\t\t\t\tfor (const subscriber of subscribers) {\n\t\t\t\t\tsubscriber[1]();\n\t\t\t\t\tsubscriber_queue.push(subscriber, value);\n\t\t\t\t}\n\t\t\t\tif (run_queue) {\n\t\t\t\t\tfor (let i = 0; i < subscriber_queue.length; i += 2) {\n\t\t\t\t\t\tsubscriber_queue[i][0](subscriber_queue[i + 1]);\n\t\t\t\t\t}\n\t\t\t\t\tsubscriber_queue.length = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @param {import('./public.js').Updater<T>} fn\n\t * @returns {void}\n\t */\n\tfunction update(fn) {\n\t\tset(fn(value));\n\t}\n\n\t/**\n\t * @param {import('./public.js').Subscriber<T>} run\n\t * @param {import('./private.js').Invalidator<T>} [invalidate]\n\t * @returns {import('./public.js').Unsubscriber}\n\t */\n\tfunction subscribe(run, invalidate = noop) {\n\t\t/** @type {import('./private.js').SubscribeInvalidateTuple<T>} */\n\t\tconst subscriber = [run, invalidate];\n\t\tsubscribers.add(subscriber);\n\t\tif (subscribers.size === 1) {\n\t\t\tstop = start(set, update) || noop;\n\t\t}\n\t\trun(value);\n\t\treturn () => {\n\t\t\tsubscribers.delete(subscriber);\n\t\t\tif (subscribers.size === 0 && stop) {\n\t\t\t\tstop();\n\t\t\t\tstop = null;\n\t\t\t}\n\t\t};\n\t}\n\treturn { set, update, subscribe };\n}\n\n/**\n * Derived value store by synchronizing one or more readable stores and\n * applying an aggregation function over its input values.\n *\n * https://svelte.dev/docs/svelte-store#derived\n * @template {import('./private.js').Stores} S\n * @template T\n * @overload\n * @param {S} stores - input stores\n * @param {(values: import('./private.js').StoresValues<S>, set: (value: T) => void, update: (fn: import('./public.js').Updater<T>) => void) => import('./public.js').Unsubscriber | void} fn - function callback that aggregates the values\n * @param {T} [initial_value] - initial value\n * @returns {import('./public.js').Readable<T>}\n */\n\n/**\n * Derived value store by synchronizing one or more readable stores and\n * applying an aggregation function over its input values.\n *\n * https://svelte.dev/docs/svelte-store#derived\n * @template {import('./private.js').Stores} S\n * @template T\n * @overload\n * @param {S} stores - input stores\n * @param {(values: import('./private.js').StoresValues<S>) => T} fn - function callback that aggregates the values\n * @param {T} [initial_value] - initial value\n * @returns {import('./public.js').Readable<T>}\n */\n\n/**\n * @template {import('./private.js').Stores} S\n * @template T\n * @param {S} stores\n * @param {Function} fn\n * @param {T} [initial_value]\n * @returns {import('./public.js').Readable<T>}\n */\nexport function derived(stores, fn, initial_value) {\n\tconst single = !Array.isArray(stores);\n\t/** @type {Array<import('./public.js').Readable<any>>} */\n\tconst stores_array = single ? [stores] : stores;\n\tif (!stores_array.every(Boolean)) {\n\t\tthrow new Error('derived() expects stores as input, got a falsy value');\n\t}\n\tconst auto = fn.length < 2;\n\treturn readable(initial_value, (set, update) => {\n\t\tlet started = false;\n\t\tconst values = [];\n\t\tlet pending = 0;\n\t\tlet cleanup = noop;\n\t\tconst sync = () => {\n\t\t\tif (pending) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tcleanup();\n\t\t\tconst result = fn(single ? values[0] : values, set, update);\n\t\t\tif (auto) {\n\t\t\t\tset(result);\n\t\t\t} else {\n\t\t\t\tcleanup = is_function(result) ? result : noop;\n\t\t\t}\n\t\t};\n\t\tconst unsubscribers = stores_array.map((store, i) =>\n\t\t\tsubscribe(\n\t\t\t\tstore,\n\t\t\t\t(value) => {\n\t\t\t\t\tvalues[i] = value;\n\t\t\t\t\tpending &= ~(1 << i);\n\t\t\t\t\tif (started) {\n\t\t\t\t\t\tsync();\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t() => {\n\t\t\t\t\tpending |= 1 << i;\n\t\t\t\t}\n\t\t\t)\n\t\t);\n\t\tstarted = true;\n\t\tsync();\n\t\treturn function stop() {\n\t\t\trun_all(unsubscribers);\n\t\t\tcleanup();\n\t\t\t// We need to set this to false because callbacks can still happen despite having unsubscribed:\n\t\t\t// Callbacks might already be placed in the queue which doesn't know it should no longer\n\t\t\t// invoke this derived store.\n\t\t\tstarted = false;\n\t\t};\n\t});\n}\n\n/**\n * Takes a store and returns a new one derived from the old one that is readable.\n *\n * https://svelte.dev/docs/svelte-store#readonly\n * @template T\n * @param {import('./public.js').Readable<T>} store - store to make readonly\n * @returns {import('./public.js').Readable<T>}\n */\nexport function readonly(store) {\n\treturn {\n\t\tsubscribe: store.subscribe.bind(store)\n\t};\n}\n\nexport { get_store_value as get };\n","import { writable } from 'svelte/store';\nimport type { Annotation } from '../model';\nimport type { Store } from './Store';\n\nexport type HoverState<T extends Annotation> = ReturnType<typeof createHoverState<T>>;\n\nexport const createHoverState = <T extends Annotation>(store: Store<T>) => {\n\n const { subscribe, set } = writable<string | undefined>();\n\n let currentHover: string | undefined;\n\n subscribe(updated => currentHover = updated);\n\n // Track store delete and update events\n store.observe(( { changes }) => { \n if (currentHover) {\n const isDeleted = (changes.deleted || []).some(a => a.id === currentHover);\n if (isDeleted)\n set(undefined);\n \n const updated = (changes.updated || []).find(({ oldValue }) => oldValue.id === currentHover);\n if (updated)\n set(updated.newValue.id);\n }\n });\n\n return { \n get current() { return currentHover },\n subscribe, \n set \n };\n\n}\n","import { writable } from 'svelte/store';\nimport { dequal } from 'dequal/lite';\nimport type { Annotation, FormatAdapter } from '../model';\nimport type { Store } from './Store';\n\nexport interface Selection {\n\n selected: { id: string, editable?: boolean }[],\n\n event?: PointerEvent | KeyboardEvent;\n\n}\n\nexport type SelectionState<I extends Annotation, E extends unknown> = ReturnType<typeof createSelectionState<I, E>>;\n\nexport enum UserSelectAction {\n\n EDIT = 'EDIT', // Make annotation target(s) editable on pointer select\n\n SELECT = 'SELECT', // Just select, but don't make editable\n\n NONE = 'NONE' // Click won't select - the annotation is completely inert\n\n}\n\nexport type UserSelectActionExpression<T extends unknown> = UserSelectAction | ((a: T) => UserSelectAction);\n\nconst EMPTY: Selection = { selected: [] };\n\nexport const createSelectionState = <I extends Annotation, E extends unknown>(\n store: Store<I>,\n defaultSelectionAction?: UserSelectActionExpression<E>,\n adapter?: FormatAdapter<I, E>\n) => {\n const { subscribe, set } = writable<Selection>(EMPTY);\n\n let currentUserSelectAction = defaultSelectionAction;\n\n let currentSelection: Selection = EMPTY;\n\n subscribe(updated => currentSelection = updated);\n\n const clear = () => {\n if (!dequal(currentSelection, EMPTY)) {\n set(EMPTY);\n }\n };\n\n const isEmpty = () => currentSelection.selected?.length === 0;\n\n const isSelected = (annotationOrId: I | string) => {\n if (isEmpty())\n return false;\n\n const id = typeof annotationOrId === 'string' ? annotationOrId : annotationOrId.id;\n return currentSelection.selected.some(i => i.id === id);\n }\n\n const userSelect = (idOrIds: string | string[], event?: Selection['event']) => {\n let annotations: I[];\n\n if (Array.isArray(idOrIds)) {\n annotations = idOrIds.map(id => store.getAnnotation(id)!).filter(Boolean);\n\n if (annotations.length < idOrIds.length) {\n console.warn('Invalid selection: ' + idOrIds.filter(id => !annotations.some(a => a.id === id)));\n return;\n }\n } else {\n const annotation = store.getAnnotation(idOrIds);\n if (!annotation) {\n console.warn('Invalid selection: ' + idOrIds);\n return;\n }\n\n annotations = [annotation];\n }\n\n const selected = annotations.reduce<{ id: string, editable?: boolean }[]>((sel, a) => {\n const action = onUserSelect(a, currentUserSelectAction, adapter);\n if (action === UserSelectAction.EDIT)\n return [...sel, { id: a.id, editable: true }];\n else if (action === UserSelectAction.SELECT) \n return [...sel, { id: a.id }];\n else\n return sel;\n }, []);\n\n set({ selected, event });\n }\n\n const setSelected = (idOrIds: string | string[], editable?: boolean) => {\n const ids = Array.isArray(idOrIds) ? idOrIds : [idOrIds];\n\n // Remove invalid\n const annotations = ids\n .map(id => store.getAnnotation(id))\n .filter((a): a is I => Boolean(a));\n\n set({\n selected: annotations.map(annotation => {\n\n // If editable isn't set, use the default behavior\n const isEditable = editable === undefined\n ? onUserSelect(annotation, currentUserSelectAction, adapter) === UserSelectAction.EDIT\n : editable;\n\n return { id: annotation.id, editable: isEditable }\n })\n });\n\n if (annotations.length !== ids.length)\n console.warn('Invalid selection', idOrIds);\n }\n\n const removeFromSelection = (ids: string[]) => {\n if (isEmpty())\n return false;\n\n const { selected } = currentSelection;\n\n // Checks which of the given annotations are actually in the selection\n const shouldRemove = selected.some(({ id }) => ids.includes(id));\n if (shouldRemove)\n set({ selected: selected.filter(({ id }) => !ids.includes(id)) });\n }\n\n const setUserSelectAction = (action: UserSelectActionExpression<E> | undefined) => {\n currentUserSelectAction = action;\n setSelected(currentSelection.selected.map(({ id }) => id));\n };\n\n // Track store delete and update events\n store.observe(\n ({ changes }) => removeFromSelection((changes.deleted || []).map(a => a.id))\n );\n\n return {\n get event() {\n return currentSelection ? currentSelection.event : null;\n },\n get selected() {\n return currentSelection ? [...currentSelection.selected] : null;\n },\n get userSelectAction() {\n return currentUserSelectAction;\n },\n clear,\n isEmpty,\n isSelected,\n setSelected,\n setUserSelectAction,\n subscribe,\n userSelect\n };\n\n}\n\nexport const onUserSelect = <I extends Annotation, E extends unknown>(\n annotation: I,\n action?: UserSelectActionExpression<E>,\n adapter?: FormatAdapter<I, E>\n): UserSelectAction => {\n const crosswalked = adapter ? adapter.serialize(annotation) : annotation as unknown as E;\n return (typeof action === 'function') ? action(crosswalked) : (action || UserSelectAction.EDIT)\n}\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","import { v4 as uuidv4 } from 'uuid';\nimport type { Annotation, AnnotationBody } from '../model/Annotation';\nimport type { User } from '../model/User';\n\n/**\n * Returns all users listed as creators or updaters in any parts of this\n * annotation.\n */\nexport const getContributors = (annotation: Annotation): User[] => {\n const { creator, updatedBy } = annotation.target;\n\n const bodyCollaborators = annotation.bodies.reduce((users, body) => (\n [...users, body.creator, body.updatedBy].filter(Boolean) as User[]\n ), [] as User[]);\n\n return [\n creator,\n updatedBy,\n ...bodyCollaborators\n ].filter(u => u) as User[] // Remove undefined\n}\n\ntype HasTime = { created?: string | Date; updated?: string | Date; };\n\n/** \n * Converts any string dates in the given annotation(-like) \n * object to proper Date objects.\n */\nexport const reviveDates = <A extends Annotation = Annotation>(annotation: any): A => {\n const revive = <T extends HasTime>(body: T): T => {\n const revived = {...body};\n\n if (body.created && typeof body.created === 'string')\n revived.created = new Date(body.created);\n\n if (body.updated && typeof body.updated === 'string')\n revived.updated = new Date(body.updated);\n\n return revived;\n }\n\n return {\n ...annotation,\n bodies: (annotation.bodies || []).map(revive),\n target: revive(annotation.target)\n } as A;\n}\n\n/**\n * Shorthand/helper.\n */\nexport const createBody = (\n annotationOrId: string | Annotation, \n payload: { [key: string]: any },\n created?: Date,\n creator?: User\n): AnnotationBody => ({\n id: uuidv4(),\n annotation: typeof annotationOrId === 'string' ? annotationOrId : annotationOrId.id,\n created: created || new Date(),\n creator,\n ...payload\n});","import { dequal } from 'dequal/lite';\nimport type { Update } from '../state/StoreObserver';\nimport type { Annotation } from '../model/Annotation';\n\nconst getAddedBodies = (oldValue: Annotation, newValue: Annotation) => {\n const oldBodyIds = new Set(oldValue.bodies.map(b => b.id));\n return newValue.bodies.filter(b => !oldBodyIds.has(b.id));\n}\n\nconst getRemovedBodies = (oldValue: Annotation, newValue: Annotation) => {\n const newBodyIds = new Set(newValue.bodies.map(b => b.id));\n return oldValue.bodies.filter(b => !newBodyIds.has(b.id));\n}\n\nconst getChangedBodies = (oldValue: Annotation, newValue: Annotation) => \n newValue.bodies\n .map(newBody => {\n const oldBody = oldValue.bodies.find(b => b.id === newBody.id);\n return { newBody, oldBody: oldBody && !dequal(oldBody, newBody) ? oldBody : undefined }\n })\n .filter(({ oldBody }) => oldBody)\n .map(({ oldBody, newBody }) => ({ oldBody: oldBody!, newBody }));\n\nconst hasTargetChanged = (oldValue: Annotation, newValue: Annotation) => \n !dequal(oldValue.target, newValue.target);\n\nexport const diffAnnotations = <T extends Annotation = Annotation>(oldValue: T, newValue: T): Update<T> => {\n const bodiesCreated = getAddedBodies(oldValue, newValue);\n const bodiesDeleted = getRemovedBodies(oldValue, newValue);\n const bodiesUpdated = getChangedBodies(oldValue, newValue);\n\n return {\n oldValue, \n newValue,\n bodiesCreated: bodiesCreated.length > 0 ? bodiesCreated : undefined,\n bodiesDeleted: bodiesDeleted.length > 0 ? bodiesDeleted : undefined,\n bodiesUpdated: bodiesUpdated.length > 0 ? bodiesUpdated : undefined,\n targetUpdated: hasTargetChanged(oldValue, newValue) ? { oldTarget: oldValue.target, newTarget: newValue.target } : undefined\n }\n}","import type { Annotation, AnnotationBody, AnnotationTarget } from '../model/Annotation';\nimport { diffAnnotations } from '../utils';\n\n/** Interface for listening to changes in the annotation store **/\nexport interface StoreObserver<T extends Annotation> { \n\n onChange: { (event: StoreChangeEvent<T>): void };\n\n options: StoreObserveOptions;\n\n}\n\n/** A change event fired when the store state changes **/\nexport interface StoreChangeEvent<T extends Annotation> {\n\n origin: Origin;\n\n changes: ChangeSet<T>;\n\n state: T[];\n\n}\n\nexport interface ChangeSet<T extends Annotation> {\n\n created?: T[];\n\n deleted?: T[];\n\n updated?: Update<T>[];\n\n}\n\nexport interface Update<T extends Annotation> {\n\n oldValue: T;\n\n newValue: T;\n\n bodiesCreated?: T['bodies'];\n\n bodiesDeleted?: T['bodies'];\n\n bodiesUpdated?: Array<{ oldBody: T['bodies'][number], newBody: T['bodies'][number] }>;\n\n targetUpdated?: { oldTarget: T['target'], newTarget: T['target'] };\n\n}\n\n/** Options to control which events the observer wants to get notified about **/\nexport interface StoreObserveOptions {\n\n // Observe changes on targets, bodies or both?\n ignore?: Ignore;\n\n // Observe changes on one more specific annotations\n annotations?: string | string[];\n\n // Observer changes only for a specific origin\n origin?: Origin\n\n}\n\n/** Allows the observer to ignore certain event types **/\nexport enum Ignore { \n\n // Don't notify this observer for changes that involve bodies only\n BODY_ONLY = 'BODY_ONLY',\n\n // Don't notify for changes on targets only\n TARGET_ONLY = 'TARGET_ONLY'\n\n}\n\n/** \n * Allows the observer to listen only for events that originated locally or from a remote source.\n * \n * SILENT should be used for updates that are not supposed to trigger an event. Remember that \n * with great power comes great responsibility: SILENT is really for Annotorious plugins and\n * extensions ONLY.\n */\nexport enum Origin { \n \n LOCAL = 'LOCAL', \n \n REMOTE = 'REMOTE',\n \n SILENT = 'SILENT'\n\n}\n\n/** Tests if this observer should be notified about this event **/\nexport const shouldNotify = <T extends Annotation>(observer: StoreObserver<T>, event: StoreChangeEvent<T>) => {\n const { changes, origin } = event;\n\n const isRelevantOrigin = observer.options.origin \n ? observer.options.origin === origin \n : origin !== Origin.SILENT;\n\n if (!isRelevantOrigin)\n return false;\n\n if (observer.options.ignore) {\n const { ignore } = observer.options;\n\n // Shorthand\n const has = (arg: any[] | undefined) => arg && arg.length > 0;\n\n const hasAnnotationChanges =\n has(changes.created) || has(changes.deleted);\n\n if (!hasAnnotationChanges) {\n const hasBodyChanges =\n changes.updated?.some(u => has(u.bodiesCreated) || has(u.bodiesDeleted) || has(u.bodiesUpdated));\n \n const hasTargetChanges = \n changes.updated?.some(u => u.targetUpdated);\n\n if (ignore === Ignore.BODY_ONLY && hasBodyChanges && !hasTargetChanges)\n return false;\n\n if (ignore === Ignore.TARGET_ONLY && hasTargetChanges && !hasBodyChanges)\n return false;\n }\n }\n\n if (observer.options.annotations) {\n // This observer has a filter set on specific annotations - check affected\n const affectedAnnotations = new Set([\n ...(changes.created || []).map(a => a.id),\n ...(changes.deleted || []).map(a => a.id),\n ...(changes.updated || []).map(({ oldValue }) => oldValue.id)\n ]);\n\n const observed = Array.isArray(observer.options.annotations) ?\n observer.options.annotations : [ observer.options.annotations ];\n\n return Boolean(observed.find(id => affectedAnnotations.has(id)));\n } else {\n return true;\n }\n\n}\n\nexport const mergeChanges = <T extends Annotation>(changes: ChangeSet<T>, toMerge: ChangeSet<T>) => {\n const previouslyCreatedIds = new Set((changes.created || []).map(a => a.id));\n const previouslyUpdatedIds = new Set((changes.updated || []).map(({ newValue })=> newValue.id));\n\n const createdIds = new Set((toMerge.created || []).map(a => a.id));\n const deletedIds = new Set((toMerge.deleted || []).map(a => a.id));\n const updatedIds = new Set((toMerge.updated || []).map(({ oldValue }) => oldValue.id));\n\n // Updates that will be merged into create or previous update events\n const mergeableUpdates = new Set((toMerge.updated || [])\n .filter(({ oldValue }) => previouslyCreatedIds.has(oldValue.id) || previouslyUpdatedIds.has(oldValue.id))\n .map(({ oldValue }) => oldValue.id ));\n\n // * created *\n // - drop created that were then deleted\n // - merge any updates on created\n // - append newly created\n const created = [\n ...(changes.created || [])\n .filter(a => !deletedIds.has(a.id))\n .map(a => updatedIds.has(a.id) \n ? toMerge.updated!.find(({ oldValue }) => oldValue.id === a.id)!.newValue\n : a),\n ...(toMerge.created || [])\n ];\n\n // * deleted *\n // - drop deleted that were later re-created (redo action!)\n // - append newly deleted, but remove any that delete annotations \n // that were created in the same round\n const deleted = [\n ...(changes.deleted || [])\n .filter(a => !createdIds.has(a.id)),\n ...(toMerge.deleted || []) \n .filter(a => !previouslyCreatedIds.has(a.id))\n ] \n\n // * updated *\n // - drop updates on deleted annotations\n // - merge any updates that override previous ones\n // - append new updates, but remove any that were merged\n const updated = [\n ...(changes.updated || [])\n .filter(({ newValue }) => !deletedIds.has(newValue.id))\n .map(update => {\n const { oldValue, newValue } = update;\n if (updatedIds.has(newValue.id)) {\n const updated = toMerge.updated!.find(u => u.oldValue.id === newValue.id)!.newValue;\n return diffAnnotations(oldValue, updated);\n } else {\n return update;\n }\n }),\n ...(toMerge.updated || []).filter(({ oldValue }) => !mergeableUpdates.has(oldValue.id))\n ]\n\n return { created, deleted, updated };\n}\n","import { v4 as uuidv4 } from 'uuid';\nimport type { Annotation } from '../model';\nimport { diffAnnotations } from '../utils';\nimport { Origin, shouldNotify, type Update, type ChangeSet } from './StoreObserver';\nimport type { StoreObserver, StoreChangeEvent, StoreObserveOptions } from './StoreObserver';\n\n// Shorthand\ntype AnnotationBodyIdentifier = { id: string, annotation: string }; \n\nconst sanitize = <T extends Annotation>(a: Partial<T>): T => {\n const id = a.id === undefined ? uuidv4() : a.id;\n\n return {\n ...a,\n id,\n bodies: a.bodies === undefined ? [] : a.bodies.map(b => ({\n ...b,\n annotation: id \n })),\n target: {\n ...a.target,\n annotation: id\n }\n } as T;\n}\n\nexport type Store<T extends Annotation> = ReturnType<typeof createStore<T>>;\n\nconst isAnnotation = <T extends Annotation>(arg: any): arg is T => arg.id !== undefined;\n\nexport const createStore = <T extends Annotation>() => {\n\n const annotationIndex = new Map<string, T>();\n\n const bodyIndex = new Map<string, string>();\n\n const observers: StoreObserver<T>[] = [];\n\n const observe = (onChange: { (event: StoreChangeEvent<T>): void }, options: StoreObserveOptions = {}) => {\n observers.push({ onChange, options });\n }\n\n const unobserve = (onChange: { (event: StoreChangeEvent<T>): void }) => {\n const idx = observers.findIndex(observer => observer.onChange == onChange);\n if (idx > -1)\n observers.splice(idx, 1);\n }\n\n const emit = (origin: Origin, changes: ChangeSet<T>) => {\n const event: StoreChangeEvent<T> = {\n origin,\n changes: {\n created: changes.created || [],\n updated: changes.updated || [],\n deleted: changes.deleted || []\n },\n state: [...annotationIndex.values()]\n };\n\n observers.forEach(observer => {\n if (shouldNotify(observer, event))\n observer.onChange(event);\n });\n }\n\n const addAnnotation = (annotation: Partial<T>, origin = Origin.LOCAL) => {\n const existing = annotation.id && annotationIndex.get(annotation.id);\n\n if (existing) {\n throw Error(`Cannot add annotation ${annotation.id} - exists already`);\n } else {\n const sanitized = sanitize(annotation);\n\n annotationIndex.set(sanitized.id, sanitized);\n sanitized.bodies.forEach(b => bodyIndex.set(b.id, sanitized.id));\n emit(origin, { created: [sanitized] });\n }\n }\n\n const updateOneAnnotation = (arg1: string | Partial<T>, arg2?: Partial<T> | Origin) => {\n const updated: T = typeof arg1 === 'string' ? sanitize(arg2 as Partial<T>) : sanitize(arg1);\n\n const oldId: string | undefined = typeof arg1 === 'string' ? arg1 : arg1.id;\n const oldValue = oldId && annotationIndex.get(oldId);\n\n if (oldValue) {\n const update: Update<T> = diffAnnotations(oldValue, updated);\n\n if (oldId === updated.id) {\n annotationIndex.set(oldId, updated);\n } else {\n annotationIndex.delete(oldId);\n annotationIndex.set(updated.id, updated);\n }\n\n oldValue.bodies.forEach(b => bodyIndex.delete(b.id));\n updated.bodies.forEach(b => bodyIndex.set(b.id, updated.id));\n\n return update;\n } else {\n console.warn(`Cannot update annotation ${oldId} - does not exist`);\n }\n }\n \n const updateAnnotation = (arg1: string | T, arg2: T | Origin = Origin.LOCAL, arg3 = Origin.LOCAL) => {\n const origin: Origin = isAnnotation(arg2) ? arg3 : arg2;\n\n const update = updateOneAnnotation(arg1, arg2);\n if (update)\n emit(origin, { updated: [update] })\n }\n\n const upsertAnnotation = (annotation: T, origin = Origin.LOCAL) => {\n const exists = Boolean(annotationIndex.get(annotation.id));\n if (exists) {\n updateAnnotation(annotation, origin);\n } else {\n addAnnotation(annotation, origin);\n }\n }\n\n const bulkUpdateAnnotations = (annotations: T[], origin = Origin.LOCAL) => {\n const updated = annotations.reduce((updated, annotation) => {\n const u = updateOneAnnotation(annotation);\n return u ? [...updated, u] : updated;\n }, [] as Update<T>[]);\n\n if (updated.length > 0)\n emit(origin, { updated });\n }\n\n const bulkUpsertAnnotations = (annotations: Partial<T>[], origin = Origin.LOCAL) => {\n const sanitized = annotations.map(sanitize);\n\n const { toAdd, toUpdate } = sanitized.reduce<{ toAdd: T[], toUpdate: T[] }>((agg, annotation) => {\n const exists = Boolean(annotationIndex.get(annotation.id));\n if (exists) {\n return {...agg, toUpdate: [...agg.toUpdate, annotation]};\n } else {\n return {...agg, toAdd: [...agg.toAdd, annotation]}\n }\n }, { toAdd: [], toUpdate: [] });\n\n const updated = toUpdate.map(a => updateOneAnnotation(a, origin)!).filter(Boolean);\n\n toAdd.forEach(annotation => {\n annotationIndex.set(annotation.id, annotation);\n annotation.bodies.forEach(b => bodyIndex.set(b.id, annotation.id));\n });\n\n emit(origin, { created: toAdd, updated });\n }\n\n const addBody = (body: T['bodies'][number], origin = Origin.LOCAL) => {\n const oldValue = annotationIndex.get(body.annotation);\n if (oldValue) {\n const newValue = { \n ...oldValue,\n bodies: [ ...oldValue.bodies, body ]\n };\n\n annotationIndex.set(oldValue.id, newValue);\n\n bodyIndex.set(body.id, newValue.id);\n\n const update: Update<T> = {\n oldValue, newValue, bodiesCreated: [ body ]\n };\n\n emit(origin, { updated: [update] });\n } else {\n console.warn(`Attempt to add body to missing annotation: ${body.annotation}`);\n }\n }\n\n const all = () => [...annotationIndex.values()];\n\n const clear = (origin = Origin.LOCAL) => { \n const all = [...annotationIndex.values()];\n\n annotationIndex.clear();\n bodyIndex.clear();\n\n emit(origin, { deleted: all });\n }\n\n const bulkAddAnnotations = (annotations: Partial<T>[], replace = true, origin = Origin.LOCAL) => {\n const sanitized = annotations.map(sanitize);\n\n if (replace) {\n // Delete existing first\n const deleted = [...annotationIndex.values()];\n annotationIndex.clear();\n bodyIndex.clear();\n\n sanitized.forEach(annotation => {\n annotationIndex.set(annotation.id, annotation);\n annotation.bodies.forEach(b => bodyIndex.set(b.id, annotation.id));\n });\n\n emit(origin, { created: sanitized, deleted });\n } else {\n // Don't allow overwriting of existing annotations\n const existing = annotations.reduce((all, next) => {\n const existing = next.id && annotationIndex.get(next.id);\n return existing ? [...all, existing ] : all;\n }, [] as T[]);\n\n if (existing.length > 0)\n throw Error(`Bulk insert would overwrite the following annotations: ${existing.map(a => a.id).join(', ')}`);\n\n sanitized.forEach(annotation => {\n annotationIndex.set(annotation.id, annotation);\n annotation.bodies.forEach(b => bodyIndex.set(b.id, annotation.id));\n });\n\n emit(origin, { created: sanitized });\n }\n }\n\n const deleteOneAnnotation = (annotationOrId: T | string) => {\n const id = typeof annotationOrId === 'string' ? annotationOrId : annotationOrId.id;\n\n const existing = annotationIndex.get(id);\n if (existing) {\n annotationIndex.delete(id);\n existing.bodies.forEach(b => bodyIndex.delete(b.id));\n return existing;\n } else {\n console.warn(`Attempt to delete missing annotation: ${id}`);\n }\n }\n\n const deleteAnnotation = (annotationOrId: T | string, origin = Origin.LOCAL) => {\n const deleted = deleteOneAnnotation(annotationOrId);\n if (deleted)\n emit(origin, { deleted: [ deleted ]});\n }\n\n const bulkDeleteAnnotations = (annotationsOrIds: (T | string)[], origin = Origin.LOCAL) => {\n const deleted = annotationsOrIds.reduce((deleted, arg) => {\n const existing = deleteOneAnnotation(arg);\n return existing ? [...deleted, existing] : deleted;\n }, [] as T[]);\n\n if (deleted.length > 0)\n emit(origin, { deleted });\n }\n\n const deleteOneBody = (body: AnnotationBodyIdentifier) => {\n const oldAnnotation = annotationIndex.get(body.annotation);\n\n if (oldAnnotation) {\n const oldBody = oldAnnotation.bodies.find(b => b.id === body.id);\n\n if (oldBody) {\n bodyIndex.delete(oldBody.id);\n\n const newAnnotation = {\n ...oldAnnotation,\n bodies: oldAnnotation.bodies.filter(b => b.id !== body.id)\n };\n\n annotationIndex.set(oldAnnotation.id, newAnnotation);\n\n const update: Update<T> = {\n oldValue: oldAnnotation, newValue: newAnnotation, bodiesDeleted: [oldBody]\n };\n\n return update;\n } else {\n console.warn(`Attempt to delete missing body ${body.id} from annotation ${body.annotation}`);\n }\n } else {\n console.warn(`Attempt to delete body from missing annotation ${body.annotation}`);\n }\n }\n \n const deleteBody = (body: AnnotationBodyIdentifier, origin = Origin.LOCAL) => {\n const updated = deleteOneBody(body);\n if (updated)\n emit(origin, { updated: [ updated ]});\n }\n\n const bulkDeleteBodies = (bodies: AnnotationBodyIdentifier[], origin = Origin.LOCAL) => {\n const updated = bodies\n .map(b => deleteOneBody(b)!)\n .filter(Boolean);\n\n if (updated.length > 0)\n emit(origin, { updated });\n }\n\n const getAnnotation = (id: string): T | undefined => {\n const a = annotationIndex.get(id);\n return a ? {...a} : undefined;\n }\n\n const getBody = (id: string): T['bodies'][number] | undefined => {\n const annotationId = bodyIndex.get(id);\n if (annotationId) {\n const annotation = getAnnotation(annotationId);\n const body = annotation!.bodies.find(b => b.id === id);\n if (body) {\n return body;\n } else {\n console.error(`Store integrity error: body ${id} in index, but not in annotation`);\n }\n } else {\n console.warn(`Attempt to retrieve missing body: ${id}`);\n }\n }\n\n const updateOneBody = (oldBodyId: AnnotationBodyIdentifier, newBody: T['bodies'][number]) => {\n if (oldBodyId.annotation !== newBody.annotation)\n throw 'Annotation integrity violation: annotation ID must be the same when updating bodies';\n\n const oldAnnotation = annotationIndex.get(oldBodyId.annotation);\n if (oldAnnotation) {\n const oldBody = oldAnnotation.bodies.find(b => b.id === oldBodyId.id)!;\n\n const newAnnotation = { \n ...oldAnnotation,\n bodies: oldAnnotation.bodies.map(b => b.id === oldBody.id ? newBody : b)\n };\n\n annotationIndex.set(oldAnnotation.id, newAnnotation);\n\n if (oldBody.id !== newBody.id) {\n bodyIndex.delete(oldBody.id);\n bodyIndex.set(newBody.id, newAnnotation.id);\n }\n\n return {\n oldValue: oldAnnotation, \n newValue: newAnnotation,\n bodiesUpdated: [{ oldBody, newBody }]\n }\n } else {\n console.warn(`Attempt to add body to missing annotation ${oldBodyId.annotation}`);\n }\n }\n\n const updateBody = (oldBodyId: AnnotationBodyIdentifier, newBody: T['bodies'][number], origin = Origin.LOCAL) => {\n const update = updateOneBody(oldBodyId, newBody);\n if (update)\n emit(origin, { updated: [ update ]} );\n }\n\n const bulkUpdateBodies = (bodies: Array<T['bodies'][number]>, origin = Origin.LOCAL) => {\n const updated = bodies\n .map(b => updateOneBody({ id: b.id, annotation: b.annotation }, b)!)\n .filter(Boolean);\n\n emit(origin, { updated });\n }\n\n const updateOneTarget = (target: T['target']): Update<T> | undefined => {\n const oldValue = annotationIndex.get(target.annotation);\n \n if (oldValue) {\n const newValue = { \n ...oldValue, \n target: {\n ...oldValue.target,\n ...target \n }\n };\n\n annotationIndex.set(oldValue.id, newValue);\n\n return {\n oldValue, newValue, targetUpdated: { \n oldTarget: oldValue.target,\n newTarget: target\n }\n };\n } else {\n console.warn(`Attempt to update target on missing annotation: ${target.annotation}`);\n }\n }\n\n const updateTarget = (target: T['target'], origin = Origin.LOCAL) => {\n const update = updateOneTarget(target);\n if (update)\n emit(origin, { updated: [ update ]} );\n }\n\n const bulkUpdateTargets = (targets: Array<T['target']>, origin = Origin.LOCAL) => {\n const updated = \n targets.map(t => updateOneTarget(t)!).filter(Boolean);\n if (updated.length > 0)\n emit(origin, { updated });\n }\n\n\treturn {\n addAnnotation,\n addBody,\n all,\n bulkAddAnnotations,\n bulkDeleteAnnotations,\n bulkDeleteBodies,\n bulkUpdateAnnotations,\n bulkUpdateBodies,\n bulkUpdateTargets,\n bulkUpsertAnnotations,\n clear,\n deleteAnnotation,\n deleteBody,\n getAnnotation,\n getBody,\n observe,\n unobserve,\n updateAnnotation,\n updateBody,\n updateTarget,\n upsertAnnotation\n\t};\n\n}\n","import type { Annotation, Annotator, AnnotatorState } from '../model';\nimport type { Store } from './Store';\nimport type { StoreChangeEvent } from './StoreObserver';\n\ntype Subscriber<T extends Annotation> = (annotation: T[]) => void; \n\nexport interface SvelteStore<T extends Annotation> extends Store<T> {\n\n subscribe(onChange: Subscriber<T>): void;\n\n}\n\nexport interface SvelteAnnotatorState<I extends Annotation, E extends unknown> extends AnnotatorState<I, E> {\n\n store: SvelteStore<I>\n\n}\n\nexport interface SvelteAnnotator<I extends Annotation, E extends unknown> extends Annotator<I, E> {\n\n state: SvelteAnnotatorState<I, E>\n\n}\n\n/** \n * A simple wrapper around the event-based store implementation\n * that adds a Svelte shim, for use with the reactive '$' notation.\n * Other frameworks might not actually need this. But it's pretty\n * convenient for everyone using Svelte, as well as for the\n * basic (Svelte-based) Annotorious standard implementation.\n */\nexport const toSvelteStore = <T extends Annotation = Annotation>(store: Store<T>): SvelteStore<T> => {\n\n const subscribe = (onChange: Subscriber<T>) => {\n\n // Register a store observer on behalf of the subscriber\n const shim = (event: StoreChangeEvent<T>) => onChange(event.state);\n store.observe(shim);\n\n // Immediately call the subscriber function with the\n // current store value, according to the Svelte contract.\n // https://stackoverflow.com/questions/68220955/how-does-svelte-unsubscribe-actually-work\n onChange(store.all());\n\n // Return the unsubscribe function\n return () => store.unobserve(shim);\n }\n\n return {\n ...store,\n subscribe\n }\n\n}","export let createNanoEvents = () => ({\n emit(event, ...args) {\n for (\n let callbacks = this.events[event] || [],\n i = 0,\n length = callbacks.length;\n i < length;\n i++\n ) {\n callbacks[i](...args)\n }\n },\n events: {},\n on(event, cb) {\n ;(this.events[event] ||= []).push(cb)\n return () => {\n this.events[event] = this.events[event]?.filter(i => cb !== i)\n }\n }\n})\n","import { createNanoEvents, type Unsubscribe } from 'nanoevents';\nimport type { Annotation } from '../model';\nimport type { Store } from './Store';\nimport { Origin } from './StoreObserver';\nimport { mergeChanges, type ChangeSet, type StoreChangeEvent, type Update } from './StoreObserver';\n\n// Duration with fast successive changes get merged \n// with the last event in the stack, rather than getting stacked\n// as a new undo/redo step.\nconst DEBOUNCE = 250;\n\nexport interface UndoStack <T extends Annotation> {\n\n canRedo(): boolean;\n\n canUndo(): boolean;\n\n destroy(): void;\n\n getHistory(): History<T>;\n\n on<E extends keyof UndoStackEvents<T>>(event: E, callback: UndoStackEvents<T>[E]): Unsubscribe;\n\n undo(): void;\n\n redo(): void;\n\n}\n\nexport interface UndoStackEvents <T extends Annotation> {\n\n redo(change: ChangeSet<T>): void;\n\n undo(change: ChangeSet<T>): void;\n\n}\n\nexport interface History <T extends Annotation> {\n\n changes: ChangeSet<T>[];\n \n pointer: number;\n\n}\n\nexport const createUndoStack = <T extends Annotation>(store: Store<T>, history?: History<T>): UndoStack<T> => {\n\n const emitter = createNanoEvents<UndoStackEvents<T>>();\n\n const changeStack: ChangeSet<T>[] = history?.changes || [];\n\n let pointer = history ? history.pointer : - 1;\n\n let muteEvents = false;\n\n let lastEvent = 0;\n\n const onChange = (event: StoreChangeEvent<T>) => {\n if (!muteEvents) {\n const { changes } = event;\n\n const now = performance.now();\n\n if (now - lastEvent > DEBOUNCE) {\n // Put this change on the stack...\n changeStack.splice(pointer + 1);\n changeStack.push(changes);\n\n // ...and update the pointer\n pointer = changeStack.length - 1;\n } else {\n // Merge this change with the last in the stack\n const last = changeStack.length - 1;\n changeStack[last] = mergeChanges(changeStack[last], changes);\n }\n\n lastEvent = now;\n }\n\n muteEvents = false;\n }\n\n store.observe(onChange, { origin: Origin.LOCAL });\n\n const undoCreated = (created?: T[]) =>\n created && created.length > 0 && store.bulkDeleteAnnotations(created);\n\n const redoCreated = (created?: T[]) =>\n created && created.length > 0 && store.bulkAddAnnotations(created, false);\n\n const undoUpdated = (updated?: Update<T>[]) =>\n updated && updated.length > 0 && store.bulkUpdateAnnotations(updated.map(({ oldValue }) => oldValue));\n \n const redoUpdated = (updated?: Update<T>[]) =>\n updated && updated.length > 0 && store.bulkUpdateAnnotations(updated.map(({ newValue }) => newValue));\n\n const undoDeleted = (deleted?: T[]) => \n deleted && deleted.length > 0 && store.bulkAddAnnotations(deleted, false);\n\n const redoDeleted = (deleted?: T[]) =>\n deleted && deleted.length > 0 && store.bulkDeleteAnnotations(deleted);\n\n const undo = () => {\n if (pointer > -1) {\n muteEvents = true;\n\n const { created, updated, deleted } = changeStack[pointer];\n\n undoCreated(created);\n undoUpdated(updated);\n undoDeleted(deleted);\n\n emitter.emit('undo', changeStack[pointer]);\n\n pointer -= 1;\n }\n }\n\n const canUndo = () => pointer > -1;\n\n const redo = () => {\n if (changeStack.length - 1 > pointer) {\n muteEvents = true;\n\n const { created, updated, deleted } = changeStack[pointer + 1];\n\n redoCreated(created);\n redoUpdated(updated);\n redoDeleted(deleted);\n\n emitter.emit('redo', changeStack[pointer + 1]);\n\n pointer += 1;\n }\n }\n\n const canRedo = () => changeStack.length - 1 > pointer;\n\n const destroy = () => store.unobserve(onChange);\n\n const getHistory = () => ({ changes: [...changeStack], pointer });\n\n const on = <E extends keyof UndoStackEvents<T>>(event: E, callback: UndoStackEvents<T>[E]) => \n emitter.on(event, callback);\n\n return {\n canRedo,\n canUndo,\n destroy,\n getHistory,\n on,\n redo,\n undo\n }\n\n}","import { writable } from 'svelte/store';\n\nexport type ViewportState = ReturnType<typeof createViewportState>;\n\nexport const createViewportState = () => {\n\n const { subscribe, set } = writable<string[]>([]);\n\n return { \n subscribe, \n set\n };\n\n}\n","import { dequal } from 'dequal/lite';\nimport type { Annotation, AnnotatorState, FormatAdapter } from '../model';\nimport { Origin } from '../state';\nimport type { ChangeSet, SelectionState, UndoStack } from '../state';\nimport type { LifecycleEvents } from './LifecycleEvents';\n\nexport type Lifecycle<I extends Annotation, E extends unknown> = \n ReturnType<typeof createLifecycleObserver<I, E>>;\n\nexport const createLifecycleObserver = <I extends Annotation, E extends unknown>(\n state: AnnotatorState<I, E>,\n undoStack: UndoStack<I>,\n adapter?: FormatAdapter<I, E>,\n autoSave?: boolean\n) => {\n const { hover, selection, store, viewport } = state;\n\n const observers: Map<keyof LifecycleEvents, Function[]> = new Map();\n\n // The currently selected annotations, in the state when they were selected \n let initialSelection: I[] = [];\n\n let currentHover: string | undefined;\n\n let idleTimeout: ReturnType<typeof setTimeout>;\n\n const on = <T extends keyof LifecycleEvents>(event: T, callback: LifecycleEvents<E>[T]) => {\n if (observers.has(event)) {\n observers.get(event)!.push(callback);\n } else {\n observers.set(event, [callback]);\n }\n }\n\n const off = <T extends keyof LifecycleEvents<E>>(event: T, callback: LifecycleEvents<E>[T]) => {\n const callbacks = observers.get(event);\n if (callbacks) {\n const idx = callbacks.indexOf(callback);\n if (idx !== -1)\n callbacks.splice(idx, 1);\n }\n }\n\n const emit = (event: keyof LifecycleEvents<E>, arg0: I | I[], arg1?: I | PointerEvent) => {\n if (observers.has(event)) {\n setTimeout(() => {\n observers.get(event)!.forEach(callback => { \n if (adapter) {\n const serialized0 = Array.isArray(arg0) ? \n arg0.map(a => adapter.serialize(a)) : adapter.serialize(arg0);\n \n const serialized1: E | PointerEvent | undefined =\n arg1 ? arg1 instanceof PointerEvent ? arg1 : adapter.serialize(arg1) : undefined;\n\n callback(serialized0 as E & E[], serialized1); \n } else {\n callback(arg0 as E & E[], arg1 as unknown as E); \n }\n });\n }, 1);\n }\n }\n\n const onIdleUpdate = () => {\n const { selected } = selection;\n\n // User idle after activity - fire update events for selected\n // annotations that changed\n const updatedSelected = (selected || []).map(({ id }) => store.getAnnotation(id)!);\n\n updatedSelected.forEach(updated => {\n const initial = initialSelection.find(a => a.id === updated.id);\n if (!initial || !dequal(initial, updated)) {\n emit('updateAnnotation', updated, initial);\n }\n });\n\n initialSelection = initialSelection.map(initial => {\n const updated = updatedSelected.find(({ id }) => id === initial.id);\n return updated ? updated : initial\n });\n }\n\n selection.subscribe(({ selected })=> {\n if (initialSelection.length === 0 && selected.length === 0)\n return;\n\n if (initialSelection.length === 0 && selected.length > 0) {\n // A new selection was made - store the editable annotation as initial state\n initialSelection = selected.map(({ id }) => store.getAnnotation(id)!);\n } else if (initialSelection.length > 0 && selected.length === 0) {\n // Deselect!\n initialSelection.forEach(initial => {\n const updatedState = store.getAnnotation(initial.id); \n \n if (updatedState && !dequal(updatedState, initial)) {\n emit('updateAnnotation', updatedState, initial);\n }\n });\n\n initialSelection = [];\n } else {\n // Changed selection\n const initialIds = new Set(initialSelection.map(a => a.id));\n const selectedIds = new Set(selected.map(({ id }) => id));\n\n // Fire update events for deselected annotations that have changed\n const deselected = initialSelection.filter(a => !selectedIds.has(a.id));\n deselected.forEach(initial => {\n const updatedState = store.getAnnotation(initial.id);\n\n if (updatedState && !dequal(updatedState, initial))\n emit('updateAnnotation', updatedState, initial);\n });\n\n initialSelection = [\n // Remove annotations that were deselected\n ...initialSelection.filter(a => selectedIds.has(a.id)),\n // Add editable annotations that were selected\n ...selected\n .filter(({ id }) => !initialIds.has(id))\n .map(({ id }) => store.getAnnotation(id)!)\n ];\n }\n\n emit('selectionChanged', initialSelection);\n });\n\n hover.subscribe(id => {\n if (!currentHover && id) {\n emit('mouseEnterAnnotation', store.getAnnotation(id)!);\n } else if (currentHover && !id) {\n emit('mouseLeaveAnnotation', store.getAnnotation(currentHover)!);\n } else if (currentHover && id) {\n emit('mouseLeaveAnnotation', store.getAnnotation(currentHover)!);\n emit('mouseEnterAnnotation', store.getAnnotation(id)!);\n }\n\n currentHover = id;\n });\n\n viewport?.subscribe(ids => \n emit('viewportIntersect', ids.map(id => store.getAnnotation(id)!)));\n\n store.observe(event => {\n // autoSave option triggers update events on idleness\n if (autoSave) {\n if (idleTimeout)\n clearTimeout(idleTimeout);\n\n idleTimeout = setTimeout(onIdleUpdate, 1000);\n }\n\n // Local CREATE and DELETE events are applied immediately\n const { created, deleted } = event.changes;\n (created || []).forEach(a => emit('createAnnotation', a));\n (deleted || []).forEach(a => emit('deleteAnnotation', a));\n\n // Updates are only applied immediately if they involve body changes\n const updatesWithBody = (event.changes.updated || []).filter(u => [\n ...(u.bodiesCreated || []),\n ...(u.bodiesDeleted || []),\n ...(u.bodiesUpdated || [])\n ].length > 0);\n\n // Emit an update with the new annototation and the stored initial state\n updatesWithBody.forEach(({ oldValue, newValue }) => {\n const initial = initialSelection.find(a => a.id === oldValue.id) || oldValue;\n\n // Record the update as the new last known state\n initialSelection = initialSelection\n .map(a => a.id === oldValue.id ? newValue : a);\n\n emit('updateAnnotation', newValue, initial);\n });\n }, { origin: Origin.LOCAL });\n\n // Track remote changes - these should update the initial state\n store.observe(event => {\n if (initialSelection) {\n const selectedIds = new Set(initialSelection.map(a => a.id));\n\n const relevantUpdates = (event.changes.updated || [])\n .filter(({ newValue }) => selectedIds.has(newValue.id))\n .map(({ newValue }) => newValue);\n\n if (relevantUpdates.length > 0) {\n initialSelection = initialSelection.map(selected => {\n const updated = relevantUpdates.find(updated => updated.id === selected.id);\n return updated ? updated : selected;\n })\n }\n }\n }, { origin: Origin.REMOTE });\n\n const onUndoOrRedo = (undo: boolean) => (changes: ChangeSet<I>) => {\n // Undo/redo of created/delete will cause lifecycle events automatically,\n // but we need to handle updates specifically!\n const { updated } = changes;\n\n if (undo)\n (updated || []).forEach(t => emit('updateAnnotation', t.oldValue, t.newValue));\n else\n (updated || []).forEach(t => emit('updateAnnotation', t.newValue, t.oldValue));\n }\n\n undoStack.on('undo', onUndoOrRedo(true));\n undoStack.on('redo', onUndoOrRedo(false));\n\n return { on, off, emit }\n\n}\n","import type { Annotation } from './Annotation';\n\nexport interface FormatAdapter<A extends Annotation, T extends unknown> {\n\n parse(serialized: T): ParseResult<A>;\n\n parseAll?(serialized: unknown[]): { parsed: A[], failed: T[] };\n\n serialize(core: A): T;\n\n}\n\nexport interface ParseResult<A extends Annotation> {\n\n parsed?: A;\n \n error?: Error;\n\n}\n\nexport const serializeAll = \n <A extends Annotation, T extends unknown>(adapter: FormatAdapter<A, T>) =>\n (annotations: A[]) => annotations.map(a => adapter.serialize(a));\n\nexport const parseAll = \n <A extends Annotation, T extends unknown>(adapter: FormatAdapter<A, T>) =>\n (serialized: T[]) => serialized.reduce((result, next) => {\n const { parsed, error } = adapter.parse(next);\n \n return error ? {\n parsed: result.parsed,\n failed: [...result.failed, next ]\n } : parsed ? {\n parsed: [...result.parsed, parsed ],\n failed: result.failed\n } : {\n ...result\n }\n }, { parsed: [] as A[], failed: [] as T[]});\n ","import type { Annotation } from './Annotation';\nimport type { User } from './User';\nimport type { PresenceProvider } from '../presence';\nimport type {\n History,\n HoverState,\n SelectionState,\n Store,\n UndoStack,\n UserSelectActionExpression,\n ViewportState\n} from '../state';\nimport { Origin } from '../state';\nimport type { LifecycleEvents } from '../lifecycle';\nimport { reviveDates } from '../utils';\nimport { type FormatAdapter, parseAll } from './FormatAdapter';\nimport type { DrawingStyleExpression } from './DrawingStyle';\nimport type { Filter } from './Filter';\n\n/**\n * Base annotator interface\n * @template I - internal core data model\n * @template E - external adapted representation\n */\nexport interface Annotator<I extends Annotation = Annotation, E extends unknown = Annotation> {\n\n addAnnotation(annotation: Partial<E>): void;\n\n cancelSelected(): void;\n\n canRedo(): boolean;\n\n canUndo(): boolean;\n\n clearAnnotations(): void;\n\n destroy(): void;\n\n getAnnotationById(id: string): E | undefined;\n\n getAnnotations(): E[];\n\n getHistory(): History<I>;\n\n getSelected(): E[];\n\n getUser(): User;\n\n loadAnnotations(url: string, replace?: boolean): Promise<E[]>;\n\n redo(): void;\n\n removeAnnotation(arg: Partial<E> | string): E | undefined;\n\n setAnnotations(annotations: Partial<E>[], replace?: boolean): void;\n\n setFilter(filter: Filter<I> | undefined): void;\n\n setPresenceProvider?(provider: PresenceProvider): void;\n\n setSelected(arg?: string | string[], editable?: boolean): void;\n\n setStyle(style: DrawingStyleExpression<I> | undefined): void;\n\n setUser(user: User): void;\n\n setUserSelectAction(action: UserSelectActionExpression<E>): void;\n\n setVisible(visible: boolean): void;\n\n undo(): void;\n\n updateAnnotation(annotation: Partial<E>): E;\n \n on<T extends keyof LifecycleEvents<E>>(event: T, callback: LifecycleEvents<E>[T]): void;\n\n off<T extends keyof LifecycleEvents<E>>(event: T, callback: LifecycleEvents<E>[T]): void;\n\n state: AnnotatorState<I, E>;\n\n}\n\nexport interface AnnotatorState<I extends Annotation, E extends unknown> {\n\n store: Store<I>;\n\n selection: SelectionState<I, E>;\n\n hover: HoverState<I>;\n\n viewport: ViewportState;\n\n}\n\nexport const createBaseAnnotator = <I extends Annotation, E extends unknown>(\n state: AnnotatorState<I, E>, \n undoStack: UndoStack<I>,\n adapter?: FormatAdapter<I, E>\n) => {\n\n const { store, selection } = state;\n\n const addAnnotation = (annotation: E) => {\n if (adapter) {\n const { parsed, error } = adapter.parse(annotation);\n if (parsed) {\n store.addAnnotation(parsed, Origin.REMOTE);\n } else {\n console.error(error);\n }\n } else {\n store.addAnnotation(reviveDates<I>(annotation), Origin.REMOTE);\n }\n }\n\n const cancelSelected = () => selection.clear();\n\n const clearAnnotations = () => store.clear();\n\n const getAnnotationById = (id: string): E | undefined => {\n const annotation = store.getAnnotation(id);\n return (adapter && annotation) ?\n adapter.serialize(annotation) as E : annotation as unknown as E;\n }\n\n const getAnnotations = () =>\n (adapter ? store.all().map(adapter.serialize) : store.all()) as E[];\n\n const getSelected = () => {\n const selectedIds = selection.selected?.map(s => s.id) || [];\n\n const selected = selectedIds.map(id => store.getAnnotation(id)!).filter(Boolean);\n\n return adapter \n ? selected.map(adapter.serialize) \n : selected as unknown as E[];\n }\n\n const loadAnnotations = (url: string, replace = true) =>\n fetch(url)\n .then((response) => response.json())\n .then((annotations) => {\n setAnnotations(annotations, replace);\n return annotations;\n });\n\n const removeAnnotation = (arg: E | string): E | undefined => {\n if (typeof arg === 'string') {\n const annotation = store.getAnnotation(arg);\n store.deleteAnnotation(arg);\n\n if (annotation)\n return adapter ? adapter.serialize(annotation) : annotation as unknown as E;\n } else {\n const annotation = adapter ? adapter.parse(arg).parsed : (arg as unknown as I);\n\n if (annotation) {\n store.deleteAnnotation(annotation);\n return arg;\n }\n }\n }\n\n const setAnnotations = (annotations: E[], replace = true) => {\n if (adapter) {\n const parseFn = adapter.parseAll || parseAll(adapter);\n const { parsed, failed } = parseFn(annotations);\n\n if (failed.length > 0)\n console.warn(`Discarded ${failed.length} invalid annotations`, failed);\n\n store.bulkAddAnnotations(parsed, replace, Origin.REMOTE);\n } else {\n store.bulkAddAnnotations(annotations.map(reviveDates<I>), replace, Origin.REMOTE);\n }\n }\n\n const setSelected = (arg?: string | string[], editable?: boolean) => {\n if (arg) {\n selection.setSelected(arg, editable);\n } else {\n selection.clear();\n }\n }\n\n const setUserSelectAction = (action: UserSelectActionExpression<E>) => {\n selection.clear();\n selection.setUserSelectAction(action);\n }\n\n const updateAnnotation = (updated: E): E => {\n if (adapter) {\n const crosswalked = adapter.parse(updated).parsed!;\n const previous = adapter.serialize(store.getAnnotation(crosswalked.id)!);\n store.updateAnnotation(crosswalked);\n return previous;\n } else {\n const previous = store.getAnnotation((updated as unknown as I).id);\n store.updateAnnotation(reviveDates<I>(updated));\n return previous as unknown as E;\n }\n }\n\n // Note that we don't spread the undoStack - it has a .destroy()\n // method that would likely get overwritten by other Annotator implementations\n // if people are not careful.\n return { \n addAnnotation,\n cancelSelected,\n canRedo: undoStack.canRedo,\n canUndo: undoStack.canUndo,\n clearAnnotations,\n getAnnotationById,\n getAnnotations,\n getHistory: undoStack.getHistory,\n getSelected,\n loadAnnotations,\n redo: undoStack.redo,\n removeAnnotation,\n setAnnotations,\n setSelected,\n setUserSelectAction,\n undo: undoStack.undo,\n updateAnnotation\n }\n\n}\n","import type { Annotation } from \"./Annotation\";\nimport type { AnnotationState } from \"./AnnotationState\";\n\ntype RGB = `rgb(${number}, ${number}, ${number})`;\n\ntype RGBA = `rgba(${number}, ${number}, ${number}, ${number})`;\n\ntype HEX = `#${string}`;\n\nexport type Color = RGB | RGBA | HEX;\n\nexport interface DrawingStyle {\n\n fill?: Color;\n\n fillOpacity?: number;\n\n stroke?: Color;\n\n strokeOpacity?: number;\n\n strokeWidth?: number;\n\n}\n\nexport type DrawingStyleExpression<T extends Annotation = Annotation> =\n DrawingStyle | ((annotation: T, state?: AnnotationState) => DrawingStyle | undefined);\n\n/** Utility functions **/\n\nexport const computeStyle = <T extends Annotation = Annotation>(\n annotation: T,\n style: DrawingStyleExpression<T>,\n state?: AnnotationState\n) => {\n return typeof style === 'function' ? style(annotation, state) : style;\n};\n\nexport const chainStyles = <T extends Annotation = Annotation>(\n applyFirst: DrawingStyleExpression<T>,\n applySecond: DrawingStyleExpression<T>\n) => {\n if (typeof applyFirst !== 'function' && typeof applySecond !== 'function') {\n // Simple case: just two objects\n return {\n ...(applyFirst || {}),\n ...(applySecond || {})\n };\n } else {\n // Return a function\n return (a: T, state: AnnotationState) => {\n const first = typeof applyFirst === 'function' ? applyFirst(a, state) : applyFirst;\n const second = typeof applySecond === 'function' ? applySecond(a, state) : applySecond;\n\n return {\n ...(first || {}),\n ...(second || {})\n }\n }\n }\n}\n \n","export const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n","/* @ts-self-types=\"./index.d.ts\" */\nimport { urlAlphabet as scopedUrlAlphabet } from './url-alphabet/index.js'\nexport { urlAlphabet } from './url-alphabet/index.js'\nexport let random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\nexport let customRandom = (alphabet, defaultSize, getRandom) => {\n let mask = (2 << Math.log2(alphabet.length - 1)) - 1\n let step = -~((1.6 * mask * defaultSize) / alphabet.length)\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n let bytes = getRandom(step)\n let j = step | 0\n while (j--) {\n id += alphabet[bytes[j] & mask] || ''\n if (id.length >= size) return id\n }\n }\n }\n}\nexport let customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size | 0, random)\nexport let nanoid = (size = 21) => {\n let id = ''\n let bytes = crypto.getRandomValues(new Uint8Array((size |= 0)))\n while (size--) {\n id += scopedUrlAlphabet[bytes[size] & 63]\n }\n return id\n}\n","import { customAlphabet } from 'nanoid';\n\nexport interface User {\n\n id: string;\n\n isGuest?: boolean;\n\n name?: string;\n\n avatar?: string;\n\n}\n\nexport const createAnonymousGuest = () => {\n const nanoid = customAlphabet('1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_', 20);\n \n return { isGuest: true, id: nanoid() }\n}","import type { AnnotationBody } from './Annotation';\n\nexport interface W3CAnnotation {\n\n '@context': 'http://www.w3.org/ns/anno.jsonld';\n\n type: 'Annotation';\n\n id: string;\n\n creator?: W3CUser;\n\n created?: string;\n\n modified?: string;\n\n body: W3CAnnotationBody | W3CAnnotationBody[];\n\n target: W3CAnnotationTarget | W3CAnnotationTarget[];\n\n [key: string]: any;\n\n}\n\nexport interface W3CUser {\n\n type?: string;\n\n id: string;\n\n name?: string;\n\n}\n\nexport interface W3CAnnotationBody {\n\n type?: string;\n\n id?: string;\n\n purpose?: string;\n\n value?: string;\n\n source?: string;\n\n creator?: W3CUser;\n\n created?: string;\n\n modified?: string;\n\n}\n\nexport interface W3CAnnotationTarget {\n\n id?: string;\n\n source: string;\n\n selector?: AbstractW3CSelector;\n\n}\n\nexport interface AbstractW3CSelector { }\n\n// https://stackoverflow.com/questions/6122571/simple-non-secure-hash-function-for-javascript\nconst hashCode = (obj: Object): string => {\n const str = JSON.stringify(obj);\n\n let hash = 0;\n\n for (let i = 0, len = str.length; i < len; i++) {\n let chr = str.charCodeAt(i);\n hash = (hash << 5) - hash + chr;\n hash |= 0; // Convert to 32bit integer\n }\n\n return `${hash}`;\n}\n\nexport const parseW3CUser = (user?: any) => user\n ? typeof user === 'object' ? { ...user } : user : undefined;\n\n/**\n * Helper to crosswalk the W3C annotation body to a list of core AnnotationBody objects.\n */\nexport const parseW3CBodies = (\n body: W3CAnnotationBody | W3CAnnotationBody[],\n annotationId: string\n) : AnnotationBody[] => (Array.isArray(body) ? body : [body]).map(body => {\n\n // Extract properties that conform to the internal model, but keep custom props\n const { id, type, purpose, value, created, modified, creator, ...rest } = body;\n\n // The internal model strictly requires IDs. (Because multi-user scenarios\n // will have problems without them.) In the W3C model, bodys *may* have IDs.\n // We'll create ad-hoc IDs for bodies without IDs, but want to make sure that\n // generating the ID is idempotent: the same body should always get the same ID.\n // This will avoid unexpected results when checking for equality. \n return {\n id: id || `temp-${hashCode(body)}`,\n annotation: annotationId,\n type,\n purpose,\n value,\n creator: parseW3CUser(creator),\n created: created ? new Date(created) : undefined,\n updated: modified ? new Date(modified) : undefined,\n ...rest\n }\n\n});\n\n/** Serialization helper to remove core-specific fields from the annotation body **/\nexport const serializeW3CBodies = (bodies: AnnotationBody[]): W3CAnnotationBody[] =>\n bodies.map(b => {\n const { annotation: _a, created, updated, ...bodyRest } = b;\n\n const w3cBody: W3CAnnotationBody = {\n ...bodyRest,\n created: created?.toISOString(),\n modified: updated?.toISOString()\n }\n if (w3cBody.id?.startsWith('temp-')) {\n delete w3cBody.id;\n }\n\n return w3cBody;\n });\n","// SEABORN_BRIGHT\nexport const DEFAULT_PALETTE: Palette = [\n '#ff7c00', // orange\n '#1ac938', // green\n '#e8000b', // red\n '#8b2be2', // purple\n '#9f4800', // brown\n '#f14cc1', // pink\n '#ffc400', // khaki\n '#00d7ff', // cyan\n '#023eff' // blue\n];\n\nexport type Palette = string[];","import type { User } from '../model/User';\nimport type { Appearance } from './Appearance';\nimport type { PresentUser } from './PresentUser';\nimport { DEFAULT_PALETTE } from './ColorPalette';\n\nexport interface AppearanceProvider {\n\n addUser(presenceKey: string, user: User): Appearance;\n\n removeUser(user: PresentUser): void;\n\n}\n\nexport const defaultColorProvider = () => {\n\n const unassignedColors = [...DEFAULT_PALETTE];\n\n const assignRandomColor = () => {\n const rnd = Math.floor(Math.random() * unassignedColors.length);\n const color = unassignedColors[rnd];\n\n unassignedColors.splice(rnd, 1);\n\n return color;\n }\n\n const releaseColor = (color: string) =>\n unassignedColors.push(color);\n\n return { assignRandomColor, releaseColor };\n\n}\n\nexport const createDefaultAppearanceProvider = () => {\n\n const colorProvider = defaultColorProvider();\n\n const addUser = (presenceKey: string, user: User): Appearance => {\n const color = colorProvider.assignRandomColor();\n\n return {\n label: user.name || user.id,\n avatar: user.avatar,\n color\n };\n }\n\n const removeUser = (user: PresentUser) =>\n colorProvider.releaseColor(user.appearance.color);\n\n return { addUser, removeUser }\n \n}","import { nanoid } from 'nanoid';\nimport { createNanoEvents, type Unsubscribe } from 'nanoevents';\nimport type { User } from '../model/User';\nimport type { PresentUser } from './PresentUser';\nimport type { PresenceEvents } from './PresenceEvents';\nimport { createDefaultAppearanceProvider } from './AppearanceProvider';\nimport type { AppearanceProvider } from './AppearanceProvider';\n\nexport interface PresenceState {\n\n // Get users currently present to this room\n getPresentUsers(): PresentUser[];\n\n // Notify of a given present user's activity on the given annotations\n notifyActivity(presenceKey: string, annotationIds: string[]): void;\n\n // Add a listener for the given presence event\n on<E extends keyof PresenceEvents>(event: E, callback: PresenceEvents[E]): Unsubscribe;\n\n // Initial sync - which users are present under which keys\n syncUsers(state: { presenceKey: string, user: User }[]): void;\n\n // Update the selection state for the given prresent user\n updateSelection(presenceKey: string, selection: string[] | null): void;\n\n}\n\nconst isListEqual = (listA: any[], listB: any[]) => \n listA.every(a => listA.includes(a)) && listB.every(b => listA.includes(b));\n\n// This client's presence key\nexport const PRESENCE_KEY = nanoid();\n\nexport const createPresenceState = (\n appearanceProvider: AppearanceProvider = createDefaultAppearanceProvider()\n): PresenceState => {\n\n const emitter = createNanoEvents<PresenceEvents>();\n\n const presentUsers = new Map<string, PresentUser>();\n\n const selectionStates = new Map<string, string[]>();\n\n const addUser = (presenceKey: string, user: User) => {\n if (presentUsers.has(presenceKey)) {\n console.warn('Attempt to add user that is already present', presenceKey, user);\n return; \n }\n\n const appearance = appearanceProvider.addUser(presenceKey, user);\n\n presentUsers.set(presenceKey, { \n ...user,\n presenceKey,\n appearance\n });\n }\n\n const removeUser = (presenceKey: string) => {\n const user = presentUsers.get(presenceKey);\n if (!user) {\n console.warn('Attempt to remove user that is not present', presenceKey);\n return;\n }\n\n appearanceProvider.removeUser(user);\n\n presentUsers.delete(presenceKey);\n }\n\n const syncUsers = (state: { presenceKey: string, user: User }[]) => {\n // const keys = new Set(others.map(s => s.presenceKey));\n const keys = new Set(state.map(s => s.presenceKey));\n\n // These users need to be added to the presentUsers list\n // const toAdd = others.filter(({ presenceKey }) => !presentUsers.has(presenceKey));\n const toAdd = state.filter(({ presenceKey }) => !presentUsers.has(presenceKey));\n\n // These users need to be dropped from the list\n const toRemove = Array.from(presentUsers.values()).filter(presentUser =>\n !keys.has(presentUser.presenceKey));\n\n toAdd.forEach(({ presenceKey, user }) => addUser(presenceKey, user));\n\n toRemove.forEach(user => {\n const { presenceKey } = user;\n\n // If this user has a selection, fire deselect event\n if (selectionStates.has(presenceKey))\n emitter.emit('selectionChange', user, null);\n\n removeUser(presenceKey)\n });\n\n if (toAdd.length > 0 || toRemove.length > 0)\n emitter.emit('presence', getPresentUsers());\n }\n\n const notifyActivity = (presenceKey: string, annotationIds: string[]) => { \n const user = presentUsers.get(presenceKey);\n \n if (!user) {\n console.warn('Activity notification from user that is not present');\n return;\n }\n\n const currentSelection = selectionStates.get(presenceKey);\n\n // Was there a selection change we might have missed?\n if (!currentSelection || !isListEqual(currentSelection, annotationIds)) {\n selectionStates.set(presenceKey, annotationIds);\n emitter.emit('selectionChange', user, annotationIds);\n }\n }\n\n const updateSelection = (presenceKey: string, selection: string[] | null) => {\n const from = presentUsers.get(presenceKey);\n if (!from) {\n console.warn('Selection change for user that is not present', presenceKey);\n return;\n }\n\n if (selection)\n selectionStates.set(presenceKey, selection);\n else \n selectionStates.delete(presenceKey);\n\n emitter.emit('selectionChange', from, selection);\n }\n\n const getPresentUsers = () =>\n [...Array.from(presentUsers.values())];\n \n const on = <E extends keyof PresenceEvents>(event: E, callback: PresenceEvents[E]) =>\n emitter.on(event, callback);\n\n return {\n getPresentUsers,\n notifyActivity,\n on,\n syncUsers,\n updateSelection\n }\n\n}"],"names":["has","dequal","foo","bar","ctor","len","noop","safe_not_equal","a","b","subscriber_queue","writable","value","start","stop","subscribers","set","new_value","run_queue","subscriber","i","update","fn","subscribe","run","invalidate","createHoverState","store","currentHover","updated","changes","oldValue","UserSelectAction","EMPTY","createSelectionState","defaultSelectionAction","adapter","currentUserSelectAction","currentSelection","clear","isEmpty","_a","isSelected","annotationOrId","id","userSelect","idOrIds","event","annotations","annotation","selected","sel","action","onUserSelect","setSelected","editable","ids","isEditable","removeFromSelection","setUserSelectAction","crosswalked","byteToHex","unsafeStringify","arr","offset","getRandomValues","rnds8","rng","randomUUID","native","v4","options","buf","rnds","getContributors","creator","updatedBy","bodyCollaborators","users","body","u","reviveDates","revive","revived","createBody","payload","created","uuidv4","getAddedBodies","newValue","oldBodyIds","getRemovedBodies","newBodyIds","getChangedBodies","newBody","oldBody","hasTargetChanged","diffAnnotations","bodiesCreated","bodiesDeleted","bodiesUpdated","Ignore","Origin","shouldNotify","observer","_b","origin","ignore","arg","hasBodyChanges","hasTargetChanges","affectedAnnotations","mergeChanges","toMerge","previouslyCreatedIds","previouslyUpdatedIds","createdIds","deletedIds","updatedIds","mergeableUpdates","deleted","sanitize","isAnnotation","createStore","annotationIndex","bodyIndex","observers","observe","onChange","unobserve","idx","emit","addAnnotation","sanitized","updateOneAnnotation","arg1","arg2","oldId","updateAnnotation","arg3","upsertAnnotation","bulkUpdateAnnotations","bulkUpsertAnnotations","toAdd","toUpdate","agg","addBody","all","bulkAddAnnotations","replace","existing","next","deleteOneAnnotation","deleteAnnotation","bulkDeleteAnnotations","annotationsOrIds","deleteOneBody","oldAnnotation","newAnnotation","deleteBody","bulkDeleteBodies","bodies","getAnnotation","getBody","annotationId","updateOneBody","oldBodyId","updateBody","bulkUpdateBodies","updateOneTarget","target","targets","t","toSvelteStore","shim","createNanoEvents","args","callbacks","length","cb","DEBOUNCE","createUndoStack","history","emitter","changeStack","pointer","muteEvents","lastEvent","now","last","undoCreated","redoCreated","undoUpdated","redoUpdated","undoDeleted","redoDeleted","callback","createViewportState","createLifecycleObserver","state","undoStack","autoSave","hover","selection","viewport","initialSelection","idleTimeout","on","off","arg0","serialized0","serialized1","onIdleUpdate","updatedSelected","initial","updatedState","initialIds","selectedIds","relevantUpdates","onUndoOrRedo","undo","serializeAll","parseAll","serialized","result","parsed","error","createBaseAnnotator","cancelSelected","clearAnnotations","getAnnotationById","getAnnotations","getSelected","s","loadAnnotations","url","response","setAnnotations","removeAnnotation","parseFn","failed","previous","computeStyle","style","chainStyles","applyFirst","applySecond","first","second","urlAlphabet","random","bytes","customRandom","alphabet","defaultSize","getRandom","mask","step","size","j","customAlphabet","nanoid","scopedUrlAlphabet","createAnonymousGuest","hashCode","obj","str","hash","chr","parseW3CUser","user","parseW3CBodies","type","purpose","modified","rest","serializeW3CBodies","bodyRest","w3cBody","DEFAULT_PALETTE","defaultColorProvider","unassignedColors","rnd","color","createDefaultAppearanceProvider","colorProvider","presenceKey","isListEqual","listA","listB","PRESENCE_KEY","createPresenceState","appearanceProvider","presentUsers","selectionStates","addUser","appearance","removeUser","syncUsers","keys","toRemove","presentUser","getPresentUsers","notifyActivity","annotationIds","updateSelection","from"],"mappings":"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","x_google_ignoreList":[0,1,2,5,6,7,8,14,21,22]}
|
package/dist/state/Store.d.ts
CHANGED
|
@@ -30,7 +30,7 @@ export declare const createStore: <T extends Annotation>() => {
|
|
|
30
30
|
updateAnnotation: (arg1: string | T, arg2?: T | Origin, arg3?: Origin) => void;
|
|
31
31
|
updateBody: (oldBodyId: AnnotationBodyIdentifier, newBody: T["bodies"][number], origin?: Origin) => void;
|
|
32
32
|
updateTarget: (target: T["target"], origin?: Origin) => void;
|
|
33
|
-
upsertAnnotation: (
|
|
33
|
+
upsertAnnotation: (annotation: T, origin?: Origin) => void;
|
|
34
34
|
};
|
|
35
35
|
export {};
|
|
36
36
|
//# sourceMappingURL=Store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../../src/state/Store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,MAAM,EAA6C,MAAM,iBAAiB,CAAC;AACpF,OAAO,KAAK,EAAiB,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG5F,KAAK,wBAAwB,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAmBnE,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,UAAU,IAAI,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAI5E,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,UAAU;gCAmCX,OAAO,CAAC,CAAC,CAAC;oBAwFtB,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;;sCAiCD,OAAO,CAAC,CAAC,CAAC,EAAE;8CAqDJ,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE;+BA6C7B,wBAAwB,EAAE;yCAnKhB,CAAC,EAAE;+BAoOb,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;iCAuCxB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;yCAjQV,OAAO,CAAC,CAAC,CAAC,EAAE;;uCAsGd,CAAC,GAAG,MAAM;uBA6C1B,wBAAwB;wBAevB,MAAM,KAAG,CAAC,GAAG,SAAS;kBAK5B,MAAM,KAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS;wBApQlC;QAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;KAAE,YAAW,mBAAmB;0BAIlE;QAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;KAAE;6BA8DnC,MAAM,GAAG,CAAC,SAAQ,CAAC,GAAG,MAAM;4BA+O7B,wBAAwB,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;2BAuCvD,CAAC,CAAC,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"Store.d.ts","sourceRoot":"","sources":["../../src/state/Store.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,OAAO,EAAE,MAAM,EAA6C,MAAM,iBAAiB,CAAC;AACpF,OAAO,KAAK,EAAiB,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAG5F,KAAK,wBAAwB,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAmBnE,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,UAAU,IAAI,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAI5E,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,UAAU;gCAmCX,OAAO,CAAC,CAAC,CAAC;oBAwFtB,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;;sCAiCD,OAAO,CAAC,CAAC,CAAC,EAAE;8CAqDJ,CAAC,CAAC,GAAG,MAAM,CAAC,EAAE;+BA6C7B,wBAAwB,EAAE;yCAnKhB,CAAC,EAAE;+BAoOb,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC;iCAuCxB,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;yCAjQV,OAAO,CAAC,CAAC,CAAC,EAAE;;uCAsGd,CAAC,GAAG,MAAM;uBA6C1B,wBAAwB;wBAevB,MAAM,KAAG,CAAC,GAAG,SAAS;kBAK5B,MAAM,KAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,SAAS;wBApQlC;QAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;KAAE,YAAW,mBAAmB;0BAIlE;QAAE,CAAC,KAAK,EAAE,gBAAgB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;KAAE;6BA8DnC,MAAM,GAAG,CAAC,SAAQ,CAAC,GAAG,MAAM;4BA+O7B,wBAAwB,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;2BAuCvD,CAAC,CAAC,QAAQ,CAAC;mCA9QH,CAAC;CAmTxC,CAAA"}
|