@jinntec/jinntap 1.33.0 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,30 +1,45 @@
1
- const C = "jinntap";
2
- const D = "documents";
3
- class O {
1
+ const pe = "jinntap";
2
+ const re = "documents", ne = "assets";
3
+ function He(t, e) {
4
+ if (!t.objectStoreNames.contains(re)) {
5
+ const r = t.createObjectStore(re, { keyPath: "id" });
6
+ r.createIndex("updatedAt", "updatedAt", { unique: !1 }), r.createIndex("format", "format", { unique: !1 });
7
+ }
8
+ if (e < 2 && !t.objectStoreNames.contains(ne)) {
9
+ const r = t.createObjectStore(ne, { keyPath: "path" });
10
+ r.createIndex("updatedAt", "updatedAt", { unique: !1 }), r.createIndex("mimeType", "mimeType", { unique: !1 });
11
+ }
12
+ }
13
+ function Ce(t = pe) {
14
+ return new Promise((e, r) => {
15
+ const n = indexedDB.open(t, 2);
16
+ n.onerror = () => r(n.error ?? new Error("Failed to open IndexedDB")), n.onsuccess = () => e(n.result), n.onupgradeneeded = (a) => {
17
+ const o = (
18
+ /** @type {IDBOpenDBRequest} */
19
+ a.target.result
20
+ );
21
+ He(o, a.oldVersion);
22
+ };
23
+ });
24
+ }
25
+ function H(t) {
26
+ return new Promise((e, r) => {
27
+ t.onsuccess = () => e(t.result), t.onerror = () => r(t.error ?? new Error("IndexedDB request failed"));
28
+ });
29
+ }
30
+ class Ve {
4
31
  /**
5
32
  * @param {string} [dbName]
6
33
  */
7
- constructor(n = C) {
8
- this.dbName = n, this._db = null;
34
+ constructor(e = pe) {
35
+ this.dbName = e, this._db = null;
9
36
  }
10
37
  /**
11
38
  * Open (or create) the database.
12
39
  * @returns {Promise<DocumentStore>}
13
40
  */
14
41
  async open() {
15
- return this._db ? this : (this._db = await new Promise((n, a) => {
16
- const s = indexedDB.open(this.dbName, 1);
17
- s.onerror = () => a(s.error ?? new Error("Failed to open IndexedDB")), s.onsuccess = () => n(s.result), s.onupgradeneeded = (c) => {
18
- const u = (
19
- /** @type {IDBOpenDBRequest} */
20
- c.target.result
21
- );
22
- if (!u.objectStoreNames.contains(D)) {
23
- const l = u.createObjectStore(D, { keyPath: "id" });
24
- l.createIndex("updatedAt", "updatedAt", { unique: !1 }), l.createIndex("format", "format", { unique: !1 });
25
- }
26
- };
27
- }), this);
42
+ return this._db ? this : (this._db = await Ce(this.dbName), this);
28
43
  }
29
44
  /**
30
45
  * @returns {IDBDatabase}
@@ -38,52 +53,42 @@ class O {
38
53
  * @param {IDBTransactionMode} mode
39
54
  * @returns {IDBObjectStore}
40
55
  */
41
- _store(n) {
42
- return this._requireDb().transaction(D, n).objectStore(D);
43
- }
44
- /**
45
- * @template T
46
- * @param {IDBRequest<T>} request
47
- * @returns {Promise<T>}
48
- */
49
- _request(n) {
50
- return new Promise((a, s) => {
51
- n.onsuccess = () => a(n.result), n.onerror = () => s(n.error ?? new Error("IndexedDB request failed"));
52
- });
56
+ _store(e) {
57
+ return this._requireDb().transaction(re, e).objectStore(re);
53
58
  }
54
59
  /**
55
60
  * @param {string} id
56
61
  * @returns {Promise<StoredDocument|undefined>}
57
62
  */
58
- async get(n) {
59
- return await this._request(this._store("readonly").get(n)) ?? void 0;
63
+ async get(e) {
64
+ return await H(this._store("readonly").get(e)) ?? void 0;
60
65
  }
61
66
  /**
62
67
  * @returns {Promise<StoredDocument[]>}
63
68
  */
64
69
  async list() {
65
- return (await this._request(this._store("readonly").getAll()) ?? []).sort((a, s) => (s.updatedAt ?? 0) - (a.updatedAt ?? 0));
70
+ return (await H(this._store("readonly").getAll()) ?? []).sort((r, n) => (n.updatedAt ?? 0) - (r.updatedAt ?? 0));
66
71
  }
67
72
  /**
68
73
  * Insert or replace a document record.
69
74
  * @param {StoredDocument} doc
70
75
  * @returns {Promise<StoredDocument>}
71
76
  */
72
- async put(n) {
73
- if (!(n != null && n.id))
77
+ async put(e) {
78
+ if (!(e != null && e.id))
74
79
  throw new Error("DocumentStore.put requires a document with an id");
75
- const a = {
76
- ...n,
77
- updatedAt: n.updatedAt ?? Date.now()
80
+ const r = {
81
+ ...e,
82
+ updatedAt: e.updatedAt ?? Date.now()
78
83
  };
79
- return await this._request(this._store("readwrite").put(a)), a;
84
+ return await H(this._store("readwrite").put(r)), r;
80
85
  }
81
86
  /**
82
87
  * @param {string} id
83
88
  * @returns {Promise<void>}
84
89
  */
85
- async delete(n) {
86
- await this._request(this._store("readwrite").delete(n));
90
+ async delete(e) {
91
+ await H(this._store("readwrite").delete(e));
87
92
  }
88
93
  /**
89
94
  * Close the database connection.
@@ -92,170 +97,993 @@ class O {
92
97
  this._db && (this._db.close(), this._db = null);
93
98
  }
94
99
  }
95
- const U = /* @__PURE__ */ new Set(["untitled document", "untitled article", "untitled"]);
96
- function T(t) {
97
- return !t || U.has(t.trim().toLowerCase());
100
+ const We = /* @__PURE__ */ new Set(["untitled document", "untitled article", "untitled"]);
101
+ function ee(t) {
102
+ return !t || We.has(t.trim().toLowerCase());
103
+ }
104
+ function fe(t) {
105
+ if (!t || ee(t))
106
+ return !0;
107
+ const e = t.trim().split(/\s+/).filter(Boolean);
108
+ return e.length < 2 ? !0 : e[e.length - 1].length < 3;
98
109
  }
99
- function S(t, n = 80) {
100
- const a = t.replace(/\s+/g, " ").trim();
101
- return a.length <= n ? a : `${a.slice(0, n - 1).trimEnd()}…`;
110
+ function te(t, e = 80) {
111
+ const r = t.replace(/\s+/g, " ").trim();
112
+ return r.length <= e ? r : `${r.slice(0, e - 1).trimEnd()}…`;
102
113
  }
103
- function j(t) {
104
- var n, a;
114
+ function Ge(t) {
115
+ var e, r;
105
116
  if (!t || typeof t != "string")
106
117
  return null;
107
118
  try {
108
- const s = new DOMParser().parseFromString(t, "application/xml");
109
- if (s.querySelector("parsererror"))
119
+ const n = new DOMParser().parseFromString(t, "application/xml");
120
+ if (n.querySelector("parsererror"))
110
121
  return null;
111
- const c = s.getElementsByTagName("*");
112
- let u = null, l = null, i = null;
113
- for (const o of c) {
114
- const m = o.localName;
115
- if (m === "title" && ((n = o.parentElement) == null ? void 0 : n.localName) === "titleStmt") {
116
- u = o;
122
+ const a = n.getElementsByTagName("*");
123
+ let o = null, s = null, l = null;
124
+ for (const i of a) {
125
+ const f = i.localName;
126
+ if (f === "title" && ((e = i.parentElement) == null ? void 0 : e.localName) === "titleStmt") {
127
+ o = i;
117
128
  break;
118
129
  }
119
- m === "article-title" && !l && (l = o), m === "title" && !i && (i = o);
130
+ f === "article-title" && !s && (s = i), f === "title" && !l && (l = i);
120
131
  }
121
- const f = u || l || i, d = (a = f == null ? void 0 : f.textContent) == null ? void 0 : a.trim();
122
- return d && !T(d) ? S(d) : null;
132
+ const c = o || s || l, h = (r = c == null ? void 0 : c.textContent) == null ? void 0 : r.trim();
133
+ return h && !ee(h) ? te(h) : null;
123
134
  } catch {
124
135
  return null;
125
136
  }
126
137
  }
127
- function k({ xml: t, metadata: n, plainText: a, fallback: s = "Untitled Document" } = {}) {
128
- var i;
129
- const c = (i = n == null ? void 0 : n.title) == null ? void 0 : i.trim();
130
- if (c && !T(c))
131
- return S(c);
132
- const u = j(t);
133
- if (u)
134
- return u;
135
- const l = a == null ? void 0 : a.trim().split(/\r?\n/).find((f) => f.trim());
136
- return l ? S(l) : s;
138
+ function Te({ xml: t, metadata: e, plainText: r, fallback: n = "Untitled Document" } = {}) {
139
+ var c;
140
+ const a = r == null ? void 0 : r.trim().split(/\r?\n/).find((h) => h.trim()), o = a ? te(a) : null, s = (c = e == null ? void 0 : e.title) == null ? void 0 : c.trim();
141
+ if (s && !ee(s) && !fe(s))
142
+ return te(s);
143
+ const l = Ge(t);
144
+ return l && !fe(l) ? l : o || l || (s && !ee(s) ? te(s) : n);
137
145
  }
138
- async function M(t, n = {}) {
139
- const { debounceMs: a = 500, force: s = !1, autoRestore: c = !1, onDraftAvailable: u, onNameChange: l, onRestore: i } = n;
140
- if (!s && t.hasAttribute("server"))
146
+ async function mt(t, e = {}) {
147
+ const { debounceMs: r = 1200, force: n = !1, autoRestore: a = !1, onDraftAvailable: o, onNameChange: s, onRestore: l } = e;
148
+ if (!n && t.hasAttribute("server"))
141
149
  return null;
142
- const f = (t.getAttribute("format") || t.format || "tei").toLowerCase(), d = n.documentId || `current-${f}`, o = n.store || new O();
143
- await o.open();
144
- let m = !1, g = "Untitled Document", p = null, E = !1, A = !1, y = !1, _;
145
- const b = (e) => {
146
- g = e, l == null || l(e);
147
- }, N = (e, r = {}) => {
148
- var q;
149
- const h = t.metadata || {};
150
- let w = g;
151
- return m || (w = k({
152
- xml: e,
153
- metadata: h,
150
+ const c = (t.getAttribute("format") || t.format || "tei").toLowerCase(), h = e.documentId || `current-${c}`, i = e.store || new Ve();
151
+ await i.open();
152
+ let f = !1, p = "Untitled Document", w = null, A = !1, g = !1, U = !1, k;
153
+ const S = (u) => {
154
+ p = u, s == null || s(u);
155
+ }, $ = (u, v = {}) => {
156
+ var T;
157
+ const y = t.metadata || {};
158
+ let x = p;
159
+ return f || (x = Te({
160
+ xml: u,
161
+ metadata: y,
154
162
  plainText: typeof t.content == "string" ? t.content : void 0
155
- }), !T(w) && h.title !== w && (t.metadata = { ...h, title: w })), b(w), {
156
- id: d,
157
- name: w,
158
- format: f,
159
- xml: e,
163
+ }), !ee(x) && !fe(x) && y.title !== x && (t.metadata = { ...y, title: x })), S(x), {
164
+ id: h,
165
+ name: x,
166
+ format: c,
167
+ xml: u,
160
168
  updatedAt: Date.now(),
161
- nameLocked: m,
162
- filename: (q = t.metadata) == null ? void 0 : q.name,
163
- ...r
169
+ nameLocked: f,
170
+ filename: (T = t.metadata) == null ? void 0 : T.name,
171
+ ...v
164
172
  };
165
- }, L = async (e) => {
166
- if (E || y || !e)
173
+ }, D = async (u) => {
174
+ if (A || U || !u)
167
175
  return;
168
- const r = N(e);
169
- return await o.put(r), r;
170
- }, I = (e) => {
171
- E || y || (clearTimeout(p), p = setTimeout(() => {
172
- L(e).catch((r) => console.error("jinntap local store save failed", r));
173
- }, a));
174
- }, R = (e) => {
175
- var r;
176
- I((r = e.detail) == null ? void 0 : r.xml);
177
- }, v = async (e) => {
178
- var r;
179
- if (!(e != null && e.xml))
176
+ const v = $(u);
177
+ return await i.put(v), v;
178
+ }, j = (u) => {
179
+ A || U || (clearTimeout(w), w = setTimeout(() => {
180
+ D(u).catch((v) => console.error("jinntap local store save failed", v));
181
+ }, r));
182
+ }, L = (u) => {
183
+ var v;
184
+ j((v = u.detail) == null ? void 0 : v.xml);
185
+ }, _ = async (u) => {
186
+ var v;
187
+ if (!(u != null && u.xml))
180
188
  return !1;
181
- y = !0;
189
+ U = !0;
182
190
  try {
183
- t.hasAttribute("url") && t.removeAttribute("url"), t.xml = e.xml, m = !!e.nameLocked;
184
- const h = e.filename || ((r = t.metadata) == null ? void 0 : r.name) || "untitled.xml";
191
+ t.hasAttribute("url") && t.removeAttribute("url"), t.xml = u.xml, f = !!u.nameLocked;
192
+ const y = u.filename || ((v = t.metadata) == null ? void 0 : v.name) || "untitled.xml";
185
193
  return t.metadata = {
186
194
  ...t.metadata || {},
187
- title: e.name,
188
- name: h
189
- }, b(e.name), A = !0, _ = void 0, i == null || i(e), !0;
195
+ title: u.name,
196
+ name: y
197
+ }, S(u.name), g = !0, k = void 0, l == null || l(u), !0;
190
198
  } finally {
191
199
  setTimeout(() => {
192
- y = !1;
193
- }, a + 50);
200
+ U = !1;
201
+ }, r + 50);
194
202
  }
195
- }, B = async () => {
196
- const e = await o.get(d);
197
- if (!(e != null && e.xml))
203
+ }, d = async () => {
204
+ const u = await i.get(h);
205
+ if (!(u != null && u.xml))
198
206
  return !1;
199
- _ = e;
200
- let r = c;
201
- return !c && u && (r = !!await u(e)), r ? v(e) : !1;
207
+ k = u;
208
+ let v = a;
209
+ return !a && o && (v = !!await o(u), !v) ? (await i.delete(h), k = void 0, !1) : v ? _(u) : !1;
202
210
  };
203
- return await new Promise((e) => {
211
+ return await new Promise((u) => {
204
212
  if (t._initialized || t.editor) {
205
- e();
213
+ u();
206
214
  return;
207
215
  }
208
- const r = () => e();
209
- t.addEventListener("ready", r, { once: !0 }), (t._initialized || t.editor) && (t.removeEventListener("ready", r), e());
210
- }), await B(), t.addEventListener("content-change", R), {
211
- store: o,
212
- documentId: d,
216
+ const v = () => u();
217
+ t.addEventListener("ready", v, { once: !0 }), (t._initialized || t.editor) && (t.removeEventListener("ready", v), u());
218
+ }), await d(), t.addEventListener("content-change", L), {
219
+ store: i,
220
+ documentId: h,
213
221
  get restored() {
214
- return A;
222
+ return g;
215
223
  },
216
224
  get pendingDraft() {
217
- return _;
225
+ return k;
218
226
  },
219
227
  detach() {
220
- E = !0, clearTimeout(p), t.removeEventListener("content-change", R);
228
+ A = !0, clearTimeout(w), t.removeEventListener("content-change", L);
221
229
  },
222
- async restore(e) {
223
- const r = e || _ || await o.get(d);
224
- return v(r);
230
+ async restore(u) {
231
+ const v = u || k || await i.get(h);
232
+ return _(v);
225
233
  },
226
- async rename(e) {
227
- const r = e == null ? void 0 : e.trim();
228
- if (!r)
234
+ async rename(u) {
235
+ const v = u == null ? void 0 : u.trim();
236
+ if (!v)
229
237
  throw new Error("Document name must not be empty");
230
- m = !0, b(r), t.metadata = {
238
+ f = !0, S(v), t.metadata = {
231
239
  ...t.metadata || {},
232
- title: r
240
+ title: v
233
241
  };
234
- const h = t.xml;
235
- return o.put(
236
- N(h, {
237
- name: r,
242
+ const y = t.xml;
243
+ return i.put(
244
+ $(y, {
245
+ name: v,
238
246
  nameLocked: !0
239
247
  })
240
248
  );
241
249
  },
250
+ /**
251
+ * Replace editor content with newly loaded XML (e.g. file upload).
252
+ * Unlocks the display name and re-deduces it from the new document —
253
+ * does not keep a previous `metadata.title` or `nameLocked` value.
254
+ *
255
+ * @param {string} xml
256
+ * @param {{ filename?: string }} [opts]
257
+ * @returns {Promise<StoredDocument>}
258
+ */
259
+ async loadDocument(u, { filename: v } = {}) {
260
+ var y;
261
+ if (!u)
262
+ throw new Error("Document XML must not be empty");
263
+ f = !1, U = !0;
264
+ try {
265
+ t.hasAttribute("url") && t.removeAttribute("url"), t.xml = u;
266
+ const x = v && v.replace(/\.xml$/i, "").trim() || "Untitled Document", T = Te({
267
+ xml: u,
268
+ // Ignore stale metadata from the previous document
269
+ metadata: {},
270
+ plainText: typeof t.content == "string" ? t.content : void 0,
271
+ fallback: x
272
+ });
273
+ t.metadata = {
274
+ name: v || ((y = t.metadata) == null ? void 0 : y.name) || "untitled.xml",
275
+ title: T
276
+ }, S(T), clearTimeout(w);
277
+ const z = $(t.xml);
278
+ return await i.put(z), z;
279
+ } finally {
280
+ setTimeout(() => {
281
+ U = !1;
282
+ }, r + 50);
283
+ }
284
+ },
242
285
  async clear() {
243
- clearTimeout(p), await o.delete(d), m = !1, b("Untitled Document");
286
+ clearTimeout(w), await i.delete(h), f = !1, S("Untitled Document");
244
287
  },
245
288
  async getRecord() {
246
- return o.get(d);
289
+ return i.get(h);
247
290
  },
248
291
  async saveNow() {
249
- return clearTimeout(p), L(t.xml);
292
+ return clearTimeout(w), D(t.xml);
293
+ }
294
+ };
295
+ }
296
+ function ge(t) {
297
+ return /^(https?:|data:|blob:)/i.test((t == null ? void 0 : t.trim()) ?? "");
298
+ }
299
+ function K(t) {
300
+ return (t || "image").replace(/\\/g, "/").split("/").pop().trim() || "image";
301
+ }
302
+ class dt {
303
+ /**
304
+ * @param {string} [dbName]
305
+ */
306
+ constructor(e = pe) {
307
+ this.dbName = e, this._db = null, this._objectUrls = /* @__PURE__ */ new Map();
308
+ }
309
+ /**
310
+ * @returns {Promise<IndexedDbAssetStore>}
311
+ */
312
+ async open() {
313
+ return this._db ? this : (this._db = await Ce(this.dbName), this);
314
+ }
315
+ /**
316
+ * @returns {IDBDatabase}
317
+ */
318
+ _requireDb() {
319
+ if (!this._db)
320
+ throw new Error("IndexedDbAssetStore is not open; call open() first");
321
+ return this._db;
322
+ }
323
+ /**
324
+ * @param {IDBTransactionMode} mode
325
+ * @returns {IDBObjectStore}
326
+ */
327
+ _store(e) {
328
+ return this._requireDb().transaction(ne, e).objectStore(ne);
329
+ }
330
+ /**
331
+ * @returns {Promise<AssetMeta[]>}
332
+ */
333
+ async list() {
334
+ return (await H(this._store("readonly").getAll()) ?? []).map(({ path: r, mimeType: n, updatedAt: a, size: o }) => ({ path: r, mimeType: n, updatedAt: a, size: o })).sort((r, n) => (n.updatedAt ?? 0) - (r.updatedAt ?? 0));
335
+ }
336
+ /**
337
+ * @param {string} path
338
+ * @returns {Promise<StoredAsset|undefined>}
339
+ */
340
+ async get(e) {
341
+ return await H(this._store("readonly").get(e)) ?? void 0;
342
+ }
343
+ /**
344
+ * Insert or replace an asset. Same `path` overwrites.
345
+ * @param {{ path: string, blob: Blob, mimeType?: string }} asset
346
+ * @returns {Promise<StoredAsset>}
347
+ */
348
+ async put(e) {
349
+ const r = K(e.path);
350
+ if (!e.blob)
351
+ throw new Error("IndexedDbAssetStore.put requires a blob");
352
+ const n = {
353
+ path: r,
354
+ blob: e.blob,
355
+ mimeType: e.mimeType || e.blob.type || "application/octet-stream",
356
+ updatedAt: Date.now(),
357
+ size: e.blob.size
358
+ };
359
+ return await H(this._store("readwrite").put(n)), this._revokeCached(r), n;
360
+ }
361
+ /**
362
+ * @param {string} path
363
+ * @returns {Promise<void>}
364
+ */
365
+ async delete(e) {
366
+ await H(this._store("readwrite").delete(e)), this._revokeCached(e);
367
+ }
368
+ /**
369
+ * Resolve a graphic href to a displayable URL.
370
+ * Absolute URLs pass through; relative paths load from IndexedDB.
371
+ * @param {string} href
372
+ * @returns {Promise<string>}
373
+ */
374
+ async resolve(e) {
375
+ const r = (e == null ? void 0 : e.trim()) ?? "";
376
+ if (!r)
377
+ return "";
378
+ if (ge(r))
379
+ return r;
380
+ const n = this._objectUrls.get(r);
381
+ if (n)
382
+ return n;
383
+ const a = await this.get(r);
384
+ if (!(a != null && a.blob))
385
+ return r;
386
+ const o = URL.createObjectURL(a.blob);
387
+ return this._objectUrls.set(r, o), o;
388
+ }
389
+ /**
390
+ * @param {string} url
391
+ */
392
+ revoke(e) {
393
+ if (e != null && e.startsWith("blob:")) {
394
+ for (const [r, n] of this._objectUrls)
395
+ if (n === e) {
396
+ URL.revokeObjectURL(e), this._objectUrls.delete(r);
397
+ return;
398
+ }
399
+ URL.revokeObjectURL(e);
400
+ }
401
+ }
402
+ _revokeCached(e) {
403
+ const r = this._objectUrls.get(e);
404
+ r && (URL.revokeObjectURL(r), this._objectUrls.delete(e));
405
+ }
406
+ close() {
407
+ for (const e of this._objectUrls.values())
408
+ URL.revokeObjectURL(e);
409
+ this._objectUrls.clear(), this._db && (this._db.close(), this._db = null);
410
+ }
411
+ }
412
+ class Je {
413
+ /**
414
+ * @param {object} options
415
+ * @param {string} options.contextPath - App context path (e.g. `/exist/apps/workbench`)
416
+ * @param {string} [options.collection=''] - Subcollection relative to data-default
417
+ * @param {string} [options.dataDefaultRel=''] - data-default path relative to data-root (e.g. `annotate`), used when deriving collection from a document path
418
+ * @param {RequestCredentials} [options.credentials='same-origin']
419
+ */
420
+ constructor({
421
+ contextPath: e,
422
+ collection: r = "",
423
+ dataDefaultRel: n = "",
424
+ credentials: a = "same-origin"
425
+ } = {}) {
426
+ if (!e)
427
+ throw new Error("HttpAssetStore requires contextPath");
428
+ this.contextPath = e.replace(/\/+$/, ""), this.collection = (r || "").replace(/^\/+|\/+$/g, ""), this.dataDefaultRel = (n || "").replace(/^\/+|\/+$/g, ""), this.credentials = a, this._objectUrls = /* @__PURE__ */ new Map();
429
+ }
430
+ /**
431
+ * Change the collection (e.g. after saving a new document to a path).
432
+ * @param {string} collection - Relative to data-default
433
+ */
434
+ setCollection(e) {
435
+ this.collection = (e || "").replace(/^\/+|\/+$/g, ""), this._revokeAll();
436
+ }
437
+ /**
438
+ * Update collection from a document path (relative to data-root).
439
+ * @param {string} docPath
440
+ */
441
+ setCollectionFromDoc(e) {
442
+ this.setCollection(Me(e, this.dataDefaultRel));
443
+ }
444
+ /**
445
+ * Id relative to data-default for an asset path.
446
+ * @param {string} path
447
+ * @returns {string}
448
+ */
449
+ assetId(e) {
450
+ const r = K(e);
451
+ return this.collection ? `${this.collection}/${r}` : r;
452
+ }
453
+ /**
454
+ * @param {string} path
455
+ * @returns {string}
456
+ */
457
+ assetUrl(e) {
458
+ return `${this.contextPath}/api/jinntap/assets/${encodeURIComponent(this.assetId(e))}`;
459
+ }
460
+ /**
461
+ * @returns {Promise<AssetMeta[]>}
462
+ */
463
+ async list() {
464
+ const e = `${this.contextPath}/api/jinntap/assets?collection=${encodeURIComponent(this.collection)}`, r = await fetch(e, { credentials: this.credentials });
465
+ if (!r.ok)
466
+ throw new Error(`Failed to list assets (${r.status})`);
467
+ const n = await r.json();
468
+ return Array.isArray(n) ? n : [];
469
+ }
470
+ /**
471
+ * @param {string} path
472
+ * @returns {Promise<StoredAsset|undefined>}
473
+ */
474
+ async get(e) {
475
+ const r = await fetch(this.assetUrl(e), { credentials: this.credentials });
476
+ if (r.status === 404)
477
+ return;
478
+ if (!r.ok)
479
+ throw new Error(`Failed to get asset (${r.status})`);
480
+ const n = await r.blob(), a = n.type || r.headers.get("content-type") || "application/octet-stream";
481
+ return {
482
+ path: K(e),
483
+ blob: n,
484
+ mimeType: a,
485
+ size: n.size,
486
+ updatedAt: Date.now()
487
+ };
488
+ }
489
+ /**
490
+ * @param {{ path: string, blob: Blob, mimeType?: string }} asset
491
+ * @returns {Promise<StoredAsset>}
492
+ */
493
+ async put(e) {
494
+ const r = K(e.path), n = e.mimeType || e.blob.type || "application/octet-stream", a = await fetch(this.assetUrl(r), {
495
+ method: "PUT",
496
+ credentials: this.credentials,
497
+ headers: {
498
+ "Content-Type": n
499
+ },
500
+ body: e.blob
501
+ });
502
+ if (!a.ok)
503
+ throw new Error(`Failed to store asset (${a.status})`);
504
+ const o = await a.json().catch(() => ({}));
505
+ return this._revokeCached(r), {
506
+ path: r,
507
+ blob: e.blob,
508
+ mimeType: o.mimeType || n,
509
+ size: o.size ?? e.blob.size,
510
+ updatedAt: o.updatedAt ?? Date.now()
511
+ };
512
+ }
513
+ /**
514
+ * @param {string} path
515
+ * @returns {Promise<void>}
516
+ */
517
+ async delete(e) {
518
+ const r = await fetch(this.assetUrl(e), {
519
+ method: "DELETE",
520
+ credentials: this.credentials
521
+ });
522
+ if (r.status !== 404) {
523
+ if (!r.ok && r.status !== 204)
524
+ throw new Error(`Failed to delete asset (${r.status})`);
525
+ this._revokeCached(K(e));
526
+ }
527
+ }
528
+ /**
529
+ * Resolve to a displayable URL. Relative paths use the assets API (with cache-busting
530
+ * via object URL when already fetched is not needed — direct API URL works for <img>).
531
+ * @param {string} href
532
+ * @returns {Promise<string>}
533
+ */
534
+ async resolve(e) {
535
+ const r = (e == null ? void 0 : e.trim()) ?? "";
536
+ return r ? ge(r) ? r : this.assetUrl(r) : "";
537
+ }
538
+ /**
539
+ * @param {string} url
540
+ */
541
+ revoke(e) {
542
+ if (e != null && e.startsWith("blob:")) {
543
+ for (const [r, n] of this._objectUrls)
544
+ if (n === e) {
545
+ URL.revokeObjectURL(e), this._objectUrls.delete(r);
546
+ return;
547
+ }
548
+ URL.revokeObjectURL(e);
549
+ }
550
+ }
551
+ _revokeCached(e) {
552
+ const r = this._objectUrls.get(e);
553
+ r && (URL.revokeObjectURL(r), this._objectUrls.delete(e));
554
+ }
555
+ _revokeAll() {
556
+ for (const e of this._objectUrls.values())
557
+ URL.revokeObjectURL(e);
558
+ this._objectUrls.clear();
559
+ }
560
+ }
561
+ function Me(t, e = "") {
562
+ const r = (t || "").replace(/^\/+|\/+$/g, ""), n = (e || "").replace(/^\/+|\/+$/g, "");
563
+ if (!r)
564
+ return "";
565
+ let a = r;
566
+ if (n)
567
+ if (r === n || r.startsWith(`${n}/`))
568
+ a = r === n ? "" : r.slice(n.length + 1);
569
+ else
570
+ return "";
571
+ return a.includes("/") ? a.split("/").slice(0, -1).join("/") : "";
572
+ }
573
+ function wt(t, { contextPath: e, docPath: r = "", dataDefaultRel: n = "" } = {}) {
574
+ const a = Me(r, n), o = new Je({ contextPath: e, collection: a, dataDefaultRel: n });
575
+ return t.assets = o, o;
576
+ }
577
+ async function pt(t, e) {
578
+ if (!t || !e)
579
+ throw new Error("attachAssetStore requires an editor and a store");
580
+ return typeof e.open == "function" && await e.open(), t.assets = e, e;
581
+ }
582
+ var M = Uint8Array, F = Uint16Array, be = Int32Array, ye = new M([
583
+ 0,
584
+ 0,
585
+ 0,
586
+ 0,
587
+ 0,
588
+ 0,
589
+ 0,
590
+ 0,
591
+ 1,
592
+ 1,
593
+ 1,
594
+ 1,
595
+ 2,
596
+ 2,
597
+ 2,
598
+ 2,
599
+ 3,
600
+ 3,
601
+ 3,
602
+ 3,
603
+ 4,
604
+ 4,
605
+ 4,
606
+ 4,
607
+ 5,
608
+ 5,
609
+ 5,
610
+ 5,
611
+ 0,
612
+ /* unused */
613
+ 0,
614
+ 0,
615
+ /* impossible */
616
+ 0
617
+ ]), Ae = new M([
618
+ 0,
619
+ 0,
620
+ 0,
621
+ 0,
622
+ 1,
623
+ 1,
624
+ 2,
625
+ 2,
626
+ 3,
627
+ 3,
628
+ 4,
629
+ 4,
630
+ 5,
631
+ 5,
632
+ 6,
633
+ 6,
634
+ 7,
635
+ 7,
636
+ 8,
637
+ 8,
638
+ 9,
639
+ 9,
640
+ 10,
641
+ 10,
642
+ 11,
643
+ 11,
644
+ 12,
645
+ 12,
646
+ 13,
647
+ 13,
648
+ /* unused */
649
+ 0,
650
+ 0
651
+ ]), Ee = new M([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]), $e = function(t, e) {
652
+ for (var r = new F(31), n = 0; n < 31; ++n)
653
+ r[n] = e += 1 << t[n - 1];
654
+ for (var a = new be(r[30]), n = 1; n < 30; ++n)
655
+ for (var o = r[n]; o < r[n + 1]; ++o)
656
+ a[o] = o - r[n] << 5 | n;
657
+ return { b: r, r: a };
658
+ }, ze = $e(ye, 2), Ze = ze.b, he = ze.r;
659
+ Ze[28] = 258, he[258] = 28;
660
+ var Ye = $e(Ae, 0), Re = Ye.r, ve = new F(32768);
661
+ for (var b = 0; b < 32768; ++b) {
662
+ var X = (b & 43690) >> 1 | (b & 21845) << 1;
663
+ X = (X & 52428) >> 2 | (X & 13107) << 2, X = (X & 61680) >> 4 | (X & 3855) << 4, ve[b] = ((X & 65280) >> 8 | (X & 255) << 8) >> 1;
664
+ }
665
+ var Q = function(t, e, r) {
666
+ for (var n = t.length, a = 0, o = new F(e); a < n; ++a)
667
+ t[a] && ++o[t[a] - 1];
668
+ var s = new F(e);
669
+ for (a = 1; a < e; ++a)
670
+ s[a] = s[a - 1] + o[a - 1] << 1;
671
+ var l;
672
+ if (r) {
673
+ l = new F(1 << e);
674
+ var c = 15 - e;
675
+ for (a = 0; a < n; ++a)
676
+ if (t[a])
677
+ for (var h = a << 4 | t[a], i = e - t[a], f = s[t[a] - 1]++ << i, p = f | (1 << i) - 1; f <= p; ++f)
678
+ l[ve[f] >> c] = h;
679
+ } else
680
+ for (l = new F(n), a = 0; a < n; ++a)
681
+ t[a] && (l[a] = ve[s[t[a] - 1]++] >> 15 - t[a]);
682
+ return l;
683
+ }, V = new M(288);
684
+ for (var b = 0; b < 144; ++b)
685
+ V[b] = 8;
686
+ for (var b = 144; b < 256; ++b)
687
+ V[b] = 9;
688
+ for (var b = 256; b < 280; ++b)
689
+ V[b] = 7;
690
+ for (var b = 280; b < 288; ++b)
691
+ V[b] = 8;
692
+ var ae = new M(32);
693
+ for (var b = 0; b < 32; ++b)
694
+ ae[b] = 5;
695
+ var Ke = /* @__PURE__ */ Q(V, 9, 0), Qe = /* @__PURE__ */ Q(ae, 5, 0), Fe = function(t) {
696
+ return (t + 7) / 8 | 0;
697
+ }, Ie = function(t, e, r) {
698
+ return (r == null || r > t.length) && (r = t.length), new M(t.subarray(e, r));
699
+ }, et = [
700
+ "unexpected EOF",
701
+ "invalid block type",
702
+ "invalid length/literal",
703
+ "invalid distance",
704
+ "stream finished",
705
+ "no stream handler",
706
+ ,
707
+ // determined by compression function
708
+ "no callback",
709
+ "invalid UTF-8 data",
710
+ "extra field too long",
711
+ "date not in range 1980-2099",
712
+ "filename too long",
713
+ "stream finishing",
714
+ "invalid zip data"
715
+ // determined by unknown compression method
716
+ ], oe = function(t, e, r) {
717
+ var n = new Error(e || et[t]);
718
+ if (n.code = t, Error.captureStackTrace && Error.captureStackTrace(n, oe), !r)
719
+ throw n;
720
+ return n;
721
+ }, P = function(t, e, r) {
722
+ r <<= e & 7;
723
+ var n = e / 8 | 0;
724
+ t[n] |= r, t[n + 1] |= r >> 8;
725
+ }, Z = function(t, e, r) {
726
+ r <<= e & 7;
727
+ var n = e / 8 | 0;
728
+ t[n] |= r, t[n + 1] |= r >> 8, t[n + 2] |= r >> 16;
729
+ }, ue = function(t, e) {
730
+ for (var r = [], n = 0; n < t.length; ++n)
731
+ t[n] && r.push({ s: n, f: t[n] });
732
+ var a = r.length, o = r.slice();
733
+ if (!a)
734
+ return { t: Ne, l: 0 };
735
+ if (a == 1) {
736
+ var s = new M(r[0].s + 1);
737
+ return s[r[0].s] = 1, { t: s, l: 1 };
738
+ }
739
+ r.sort(function(j, L) {
740
+ return j.f - L.f;
741
+ }), r.push({ s: -1, f: 25001 });
742
+ var l = r[0], c = r[1], h = 0, i = 1, f = 2;
743
+ for (r[0] = { s: -1, f: l.f + c.f, l, r: c }; i != a - 1; )
744
+ l = r[r[h].f < r[f].f ? h++ : f++], c = r[h != i && r[h].f < r[f].f ? h++ : f++], r[i++] = { s: -1, f: l.f + c.f, l, r: c };
745
+ for (var p = o[0].s, n = 1; n < a; ++n)
746
+ o[n].s > p && (p = o[n].s);
747
+ var w = new F(p + 1), A = me(r[i - 1], w, 0);
748
+ if (A > e) {
749
+ var n = 0, g = 0, U = A - e, k = 1 << U;
750
+ for (o.sort(function(L, _) {
751
+ return w[_.s] - w[L.s] || L.f - _.f;
752
+ }); n < a; ++n) {
753
+ var S = o[n].s;
754
+ if (w[S] > e)
755
+ g += k - (1 << A - w[S]), w[S] = e;
756
+ else
757
+ break;
758
+ }
759
+ for (g >>= U; g > 0; ) {
760
+ var $ = o[n].s;
761
+ w[$] < e ? g -= 1 << e - w[$]++ - 1 : ++n;
762
+ }
763
+ for (; n >= 0 && g; --n) {
764
+ var D = o[n].s;
765
+ w[D] == e && (--w[D], ++g);
766
+ }
767
+ A = e;
768
+ }
769
+ return { t: new M(w), l: A };
770
+ }, me = function(t, e, r) {
771
+ return t.s == -1 ? Math.max(me(t.l, e, r + 1), me(t.r, e, r + 1)) : e[t.s] = r;
772
+ }, ke = function(t) {
773
+ for (var e = t.length; e && !t[--e]; )
774
+ ;
775
+ for (var r = new F(++e), n = 0, a = t[0], o = 1, s = function(c) {
776
+ r[n++] = c;
777
+ }, l = 1; l <= e; ++l)
778
+ if (t[l] == a && l != e)
779
+ ++o;
780
+ else {
781
+ if (!a && o > 2) {
782
+ for (; o > 138; o -= 138)
783
+ s(32754);
784
+ o > 2 && (s(o > 10 ? o - 11 << 5 | 28690 : o - 3 << 5 | 12305), o = 0);
785
+ } else if (o > 3) {
786
+ for (s(a), --o; o > 6; o -= 6)
787
+ s(8304);
788
+ o > 2 && (s(o - 3 << 5 | 8208), o = 0);
789
+ }
790
+ for (; o--; )
791
+ s(a);
792
+ o = 1, a = t[l];
793
+ }
794
+ return { c: r.subarray(0, n), n: e };
795
+ }, Y = function(t, e) {
796
+ for (var r = 0, n = 0; n < e.length; ++n)
797
+ r += t[n] * e[n];
798
+ return r;
799
+ }, Oe = function(t, e, r) {
800
+ var n = r.length, a = Fe(e + 2);
801
+ t[a] = n & 255, t[a + 1] = n >> 8, t[a + 2] = t[a] ^ 255, t[a + 3] = t[a + 1] ^ 255;
802
+ for (var o = 0; o < n; ++o)
803
+ t[a + o + 4] = r[o];
804
+ return (a + 4 + n) * 8;
805
+ }, je = function(t, e, r, n, a, o, s, l, c, h, i) {
806
+ P(e, i++, r), ++a[256];
807
+ for (var f = ue(a, 15), p = f.t, w = f.l, A = ue(o, 15), g = A.t, U = A.l, k = ke(p), S = k.c, $ = k.n, D = ke(g), j = D.c, L = D.n, _ = new F(19), d = 0; d < S.length; ++d)
808
+ ++_[S[d] & 31];
809
+ for (var d = 0; d < j.length; ++d)
810
+ ++_[j[d] & 31];
811
+ for (var m = ue(_, 7), u = m.t, v = m.l, y = 19; y > 4 && !u[Ee[y - 1]]; --y)
812
+ ;
813
+ var x = h + 5 << 3, T = Y(a, V) + Y(o, ae) + s, z = Y(a, p) + Y(o, g) + s + 14 + 3 * y + Y(_, u) + 2 * _[16] + 3 * _[17] + 7 * _[18];
814
+ if (c >= 0 && x <= T && x <= z)
815
+ return Oe(e, i, t.subarray(c, c + h));
816
+ var O, E, I, q;
817
+ if (P(e, i, 1 + (z < T)), i += 2, z < T) {
818
+ O = Q(p, w, 0), E = p, I = Q(g, U, 0), q = g;
819
+ var se = Q(u, v, 0);
820
+ P(e, i, $ - 257), P(e, i + 5, L - 1), P(e, i + 10, y - 4), i += 14;
821
+ for (var d = 0; d < y; ++d)
822
+ P(e, i + 3 * d, u[Ee[d]]);
823
+ i += 3 * y;
824
+ for (var N = [S, j], J = 0; J < 2; ++J)
825
+ for (var W = N[J], d = 0; d < W.length; ++d) {
826
+ var B = W[d] & 31;
827
+ P(e, i, se[B]), i += u[B], B > 15 && (P(e, i, W[d] >> 5 & 127), i += W[d] >> 12);
828
+ }
829
+ } else
830
+ O = Ke, E = V, I = Qe, q = ae;
831
+ for (var d = 0; d < l; ++d) {
832
+ var C = n[d];
833
+ if (C > 255) {
834
+ var B = C >> 18 & 31;
835
+ Z(e, i, O[B + 257]), i += E[B + 257], B > 7 && (P(e, i, C >> 23 & 31), i += ye[B]);
836
+ var G = C & 31;
837
+ Z(e, i, I[G]), i += q[G], G > 3 && (Z(e, i, C >> 5 & 8191), i += Ae[G]);
838
+ } else
839
+ Z(e, i, O[C]), i += E[C];
840
+ }
841
+ return Z(e, i, O[256]), i + E[256];
842
+ }, tt = /* @__PURE__ */ new be([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]), Ne = /* @__PURE__ */ new M(0), rt = function(t, e, r, n, a, o) {
843
+ var s = o.z || t.length, l = new M(n + s + 5 * (1 + Math.ceil(s / 7e3)) + a), c = l.subarray(n, l.length - a), h = o.l, i = (o.r || 0) & 7;
844
+ if (e) {
845
+ i && (c[0] = o.r >> 3);
846
+ for (var f = tt[e - 1], p = f >> 13, w = f & 8191, A = (1 << r) - 1, g = o.p || new F(32768), U = o.h || new F(A + 1), k = Math.ceil(r / 3), S = 2 * k, $ = function(ce) {
847
+ return (t[ce] ^ t[ce + 1] << k ^ t[ce + 2] << S) & A;
848
+ }, D = new be(25e3), j = new F(288), L = new F(32), _ = 0, d = 0, m = o.i || 0, u = 0, v = o.w || 0, y = 0; m + 2 < s; ++m) {
849
+ var x = $(m), T = m & 32767, z = U[x];
850
+ if (g[T] = z, U[x] = T, v <= m) {
851
+ var O = s - m;
852
+ if ((_ > 7e3 || u > 24576) && (O > 423 || !h)) {
853
+ i = je(t, c, 0, D, j, L, d, u, y, m - y, i), u = _ = d = 0, y = m;
854
+ for (var E = 0; E < 286; ++E)
855
+ j[E] = 0;
856
+ for (var E = 0; E < 30; ++E)
857
+ L[E] = 0;
858
+ }
859
+ var I = 2, q = 0, se = w, N = T - z & 32767;
860
+ if (O > 2 && x == $(m - N))
861
+ for (var J = Math.min(p, O) - 1, W = Math.min(32767, m), B = Math.min(258, O); N <= W && --se && T != z; ) {
862
+ if (t[m + I] == t[m + I - N]) {
863
+ for (var C = 0; C < B && t[m + C] == t[m + C - N]; ++C)
864
+ ;
865
+ if (C > I) {
866
+ if (I = C, q = N, C > J)
867
+ break;
868
+ for (var G = Math.min(N, C - 2), Ue = 0, E = 0; E < G; ++E) {
869
+ var ie = m - N + E & 32767, Xe = g[ie], _e = ie - Xe & 32767;
870
+ _e > Ue && (Ue = _e, z = ie);
871
+ }
872
+ }
873
+ }
874
+ T = z, z = g[T], N += T - z & 32767;
875
+ }
876
+ if (q) {
877
+ D[u++] = 268435456 | he[I] << 18 | Re[q];
878
+ var De = he[I] & 31, Se = Re[q] & 31;
879
+ d += ye[De] + Ae[Se], ++j[257 + De], ++L[Se], v = m + I, ++_;
880
+ } else
881
+ D[u++] = t[m], ++j[t[m]];
882
+ }
883
+ }
884
+ for (m = Math.max(m, v); m < s; ++m)
885
+ D[u++] = t[m], ++j[t[m]];
886
+ i = je(t, c, h, D, j, L, d, u, y, m - y, i), h || (o.r = i & 7 | c[i / 8 | 0] << 3, i -= 7, o.h = U, o.p = g, o.i = m, o.w = v);
887
+ } else {
888
+ for (var m = o.w || 0; m < s + h; m += 65535) {
889
+ var le = m + 65535;
890
+ le >= s && (c[i / 8 | 0] = h, le = s), i = Oe(c, i + 1, t.subarray(m, le));
891
+ }
892
+ o.i = s;
893
+ }
894
+ return Ie(l, 0, n + Fe(i) + a);
895
+ }, nt = /* @__PURE__ */ function() {
896
+ for (var t = new Int32Array(256), e = 0; e < 256; ++e) {
897
+ for (var r = e, n = 9; --n; )
898
+ r = (r & 1 && -306674912) ^ r >>> 1;
899
+ t[e] = r;
900
+ }
901
+ return t;
902
+ }(), at = function() {
903
+ var t = -1;
904
+ return {
905
+ p: function(e) {
906
+ for (var r = t, n = 0; n < e.length; ++n)
907
+ r = nt[r & 255 ^ e[n]] ^ r >>> 8;
908
+ t = r;
909
+ },
910
+ d: function() {
911
+ return ~t;
250
912
  }
251
913
  };
914
+ }, ot = function(t, e, r, n, a) {
915
+ if (!a && (a = { l: 1 }, e.dictionary)) {
916
+ var o = e.dictionary.subarray(-32768), s = new M(o.length + t.length);
917
+ s.set(o), s.set(t, o.length), t = s, a.w = o.length;
918
+ }
919
+ return rt(t, e.level == null ? 6 : e.level, e.mem == null ? a.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(t.length))) * 1.5) : 20 : 12 + e.mem, r, n, a);
920
+ }, Be = function(t, e) {
921
+ var r = {};
922
+ for (var n in t)
923
+ r[n] = t[n];
924
+ for (var n in e)
925
+ r[n] = e[n];
926
+ return r;
927
+ }, R = function(t, e, r) {
928
+ for (; r; ++e)
929
+ t[e] = r, r >>>= 8;
930
+ };
931
+ function st(t, e) {
932
+ return ot(t, e || {}, 0, 0);
933
+ }
934
+ var Pe = function(t, e, r, n) {
935
+ for (var a in t) {
936
+ var o = t[a], s = e + a, l = n;
937
+ Array.isArray(o) && (l = Be(n, o[1]), o = o[0]), ArrayBuffer.isView(o) ? r[s] = [o, l] : (r[s += "/"] = [new M(0), l], Pe(o, s, r, n));
938
+ }
939
+ }, Le = typeof TextEncoder < "u" && /* @__PURE__ */ new TextEncoder(), it = typeof TextDecoder < "u" && /* @__PURE__ */ new TextDecoder(), lt = 0;
940
+ try {
941
+ it.decode(Ne, { stream: !0 }), lt = 1;
942
+ } catch {
943
+ }
944
+ function de(t, e) {
945
+ var r;
946
+ if (Le)
947
+ return Le.encode(t);
948
+ for (var n = t.length, a = new M(t.length + (t.length >> 1)), o = 0, s = function(h) {
949
+ a[o++] = h;
950
+ }, r = 0; r < n; ++r) {
951
+ if (o + 5 > a.length) {
952
+ var l = new M(o + 8 + (n - r << 1));
953
+ l.set(a), a = l;
954
+ }
955
+ var c = t.charCodeAt(r);
956
+ c < 128 || e ? s(c) : c < 2048 ? (s(192 | c >> 6), s(128 | c & 63)) : c > 55295 && c < 57344 ? (c = 65536 + (c & 1047552) | t.charCodeAt(++r) & 1023, s(240 | c >> 18), s(128 | c >> 12 & 63), s(128 | c >> 6 & 63), s(128 | c & 63)) : (s(224 | c >> 12), s(128 | c >> 6 & 63), s(128 | c & 63));
957
+ }
958
+ return Ie(a, 0, o);
959
+ }
960
+ var we = function(t) {
961
+ var e = 0;
962
+ if (t)
963
+ for (var r in t) {
964
+ var n = t[r].length;
965
+ n > 65535 && oe(9), e += n + 4;
966
+ }
967
+ return e;
968
+ }, xe = function(t, e, r, n, a, o, s, l) {
969
+ var c = n.length, h = r.extra, i = l && l.length, f = we(h);
970
+ R(t, e, s != null ? 33639248 : 67324752), e += 4, s != null && (t[e++] = 20, t[e++] = r.os), t[e] = 20, e += 2, t[e++] = r.flag << 1 | (o < 0 && 8), t[e++] = a && 8, t[e++] = r.compression & 255, t[e++] = r.compression >> 8;
971
+ var p = new Date(r.mtime == null ? Date.now() : r.mtime), w = p.getFullYear() - 1980;
972
+ if ((w < 0 || w > 119) && oe(10), R(t, e, w << 25 | p.getMonth() + 1 << 21 | p.getDate() << 16 | p.getHours() << 11 | p.getMinutes() << 5 | p.getSeconds() >> 1), e += 4, o != -1 && (R(t, e, r.crc), R(t, e + 4, o < 0 ? -o - 2 : o), R(t, e + 8, r.size)), R(t, e + 12, c), R(t, e + 14, f), e += 16, s != null && (R(t, e, i), R(t, e + 6, r.attrs), R(t, e + 10, s), e += 14), t.set(n, e), e += c, f)
973
+ for (var A in h) {
974
+ var g = h[A], U = g.length;
975
+ R(t, e, +A), R(t, e + 2, U), t.set(g, e + 4), e += 4 + U;
976
+ }
977
+ return i && (t.set(l, e), e += i), e;
978
+ }, ct = function(t, e, r, n, a) {
979
+ R(t, e, 101010256), R(t, e + 8, r), R(t, e + 10, r), R(t, e + 12, n), R(t, e + 16, a);
980
+ };
981
+ function ut(t, e) {
982
+ e || (e = {});
983
+ var r = {}, n = [];
984
+ Pe(t, "", r, e);
985
+ var a = 0, o = 0;
986
+ for (var s in r) {
987
+ var l = r[s], c = l[0], h = l[1], i = h.level == 0 ? 0 : 8, f = de(s), p = f.length, w = h.comment, A = w && de(w), g = A && A.length, U = we(h.extra);
988
+ p > 65535 && oe(11);
989
+ var k = i ? st(c, h) : c, S = k.length, $ = at();
990
+ $.p(c), n.push(Be(h, {
991
+ size: c.length,
992
+ crc: $.d(),
993
+ c: k,
994
+ f,
995
+ m: A,
996
+ u: p != s.length || A && w.length != g,
997
+ o: a,
998
+ compression: i
999
+ })), a += 30 + p + U + S, o += 76 + 2 * (p + U) + (g || 0) + S;
1000
+ }
1001
+ for (var D = new M(o + 22), j = a, L = o - a, _ = 0; _ < n.length; ++_) {
1002
+ var f = n[_];
1003
+ xe(D, f.o, f, f.f, f.u, f.c.length);
1004
+ var d = 30 + f.f.length + we(f.extra);
1005
+ D.set(f.c, f.o + d), xe(D, a, f, f.f, f.u, f.c.length, f.o, f.m), a += 16 + d + (f.m ? f.m.length : 0);
1006
+ }
1007
+ return ct(D, a, n.length, L, j), D;
1008
+ }
1009
+ function ft(t) {
1010
+ var e;
1011
+ if (!t || typeof t != "string")
1012
+ return [];
1013
+ try {
1014
+ const r = new DOMParser().parseFromString(t, "application/xml");
1015
+ if (r.querySelector("parsererror"))
1016
+ return [];
1017
+ const n = /* @__PURE__ */ new Set(), a = [];
1018
+ for (const o of r.getElementsByTagName("*"))
1019
+ for (const s of ["url", "href"]) {
1020
+ let l = null;
1021
+ s === "href" ? l = ((e = o.getAttributeNS) == null ? void 0 : e.call(o, "http://www.w3.org/1999/xlink", "href")) || o.getAttribute("xlink:href") || o.getAttribute("href") : l = o.getAttribute(s);
1022
+ const c = l == null ? void 0 : l.trim();
1023
+ !c || ge(c) || n.has(c) || (n.add(c), a.push(c));
1024
+ }
1025
+ return a;
1026
+ } catch {
1027
+ return [];
1028
+ }
1029
+ }
1030
+ async function gt(t, e) {
1031
+ if (!(e != null && e.get))
1032
+ return [];
1033
+ const r = ft(t), n = [];
1034
+ for (const a of r) {
1035
+ const o = await e.get(a);
1036
+ o != null && o.blob && n.push(o);
1037
+ }
1038
+ return n;
1039
+ }
1040
+ function qe(t, e) {
1041
+ const r = URL.createObjectURL(t), n = document.createElement("a");
1042
+ n.href = r, n.download = e, document.body.appendChild(n), n.click(), document.body.removeChild(n), URL.revokeObjectURL(r);
1043
+ }
1044
+ function ht(t) {
1045
+ return `${(t || "document.xml").replace(/\.xml$/i, "") || "document"}.zip`;
1046
+ }
1047
+ function bt(t, e = "document.xml") {
1048
+ const r = new Blob([t], { type: "application/xml" });
1049
+ qe(r, e);
1050
+ }
1051
+ async function vt(t, e, r = "document.xml") {
1052
+ const n = {
1053
+ [r]: de(t)
1054
+ };
1055
+ for (const s of e) {
1056
+ const l = s.path.replace(/^\/+/, "");
1057
+ !l || l === r || (n[l] = new Uint8Array(await s.blob.arrayBuffer()));
1058
+ }
1059
+ const a = ut(n, { level: 6 }), o = new Uint8Array(a.byteLength);
1060
+ return o.set(a), new Blob([o.buffer], { type: "application/zip" });
1061
+ }
1062
+ async function yt(t, e, r = "document.xml") {
1063
+ const n = await vt(t, e, r);
1064
+ qe(n, ht(r));
252
1065
  }
253
1066
  export {
254
- O as DocumentStore,
255
- M as attachLocalStore,
256
- k as deduceDocumentName,
257
- j as extractTitleFromXml,
258
- T as isGenericTitle,
259
- S as truncateTitle
1067
+ Ve as DocumentStore,
1068
+ Je as HttpAssetStore,
1069
+ dt as IndexedDbAssetStore,
1070
+ pt as attachAssetStore,
1071
+ mt as attachLocalStore,
1072
+ wt as attachPublisherAssetStore,
1073
+ vt as buildDocumentZip,
1074
+ gt as collectReferencedAssets,
1075
+ Me as collectionFromDocPath,
1076
+ Te as deduceDocumentName,
1077
+ yt as downloadDocumentZip,
1078
+ bt as downloadXml,
1079
+ Ge as extractTitleFromXml,
1080
+ ft as findReferencedAssetPaths,
1081
+ ge as isAbsoluteAssetHref,
1082
+ ee as isGenericTitle,
1083
+ fe as isProvisionalTitle,
1084
+ K as sanitizeAssetPath,
1085
+ qe as triggerDownload,
1086
+ te as truncateTitle,
1087
+ ht as zipFilenameForXml
260
1088
  };
261
1089
  //# sourceMappingURL=storage.es.js.map