@prose-reader/streamer 1.8.0 → 1.9.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.
@@ -2,7 +2,7 @@ import { Archive } from "./types";
2
2
  /**
3
3
  * Useful to create archive from txt content
4
4
  */
5
- export declare const createArchiveFromText: (content: string | Blob, { mimeType, direction }?: {
5
+ export declare const createArchiveFromText: (content: string | Blob, { mimeType, direction, }?: {
6
6
  direction?: "ltr" | "rtl" | undefined;
7
7
  mimeType?: string | undefined;
8
8
  }) => Promise<Archive>;
@@ -1,6 +1,6 @@
1
1
  import h from "xmldoc";
2
2
  import { urlJoin as w, isXmlBasedMimeType as G, detectMimeTypeFromName as P } from "@prose-reader/shared";
3
- const z = (e, { opfBasePath: r, baseUrl: i }) => {
3
+ const z = (e, { opfBasePath: i, baseUrl: r }) => {
4
4
  const a = {
5
5
  contents: [],
6
6
  path: "",
@@ -10,46 +10,46 @@ const z = (e, { opfBasePath: r, baseUrl: i }) => {
10
10
  let n = e.childNamed("span") || e.childNamed("a");
11
11
  a.title = (n == null ? void 0 : n.attr.title) || (n == null ? void 0 : n.val.trim()) || a.title;
12
12
  let t = n == null ? void 0 : n.name;
13
- t !== "a" && (n = e.descendantWithPath(`${t}.a`), n && (t = n.name.toLowerCase())), t === "a" && (n != null && n.attr.href) && (a.path = w(r, n.attr.href), a.href = w(i, r, n.attr.href));
13
+ t !== "a" && (n = e.descendantWithPath(`${t}.a`), n && (t = n.name.toLowerCase())), t === "a" && (n != null && n.attr.href) && (a.path = w(i, n.attr.href), a.href = w(r, i, n.attr.href));
14
14
  const o = e.childNamed("ol");
15
15
  if (o) {
16
16
  const s = o.childrenNamed("li");
17
- s && s.length > 0 && (a.contents = s.map((d) => z(d, { opfBasePath: r, baseUrl: i })));
17
+ s && s.length > 0 && (a.contents = s.map((d) => z(d, { opfBasePath: i, baseUrl: r })));
18
18
  }
19
19
  return a;
20
- }, J = (e, { opfBasePath: r, baseUrl: i }) => {
20
+ }, J = (e, { opfBasePath: i, baseUrl: r }) => {
21
21
  var t, o;
22
22
  const a = [];
23
23
  let n;
24
- return e.descendantWithPath("body.nav.ol") ? n = (t = e.descendantWithPath("body.nav.ol")) == null ? void 0 : t.children : e.descendantWithPath("body.section.nav.ol") && (n = (o = e.descendantWithPath("body.section.nav.ol")) == null ? void 0 : o.children), n && n.length > 0 && n.filter((s) => s.name === "li").forEach((s) => a.push(z(s, { opfBasePath: r, baseUrl: i }))), a;
25
- }, K = async (e, r, { opfBasePath: i, baseUrl: a }) => {
24
+ return e.descendantWithPath("body.nav.ol") ? n = (t = e.descendantWithPath("body.nav.ol")) == null ? void 0 : t.children : e.descendantWithPath("body.section.nav.ol") && (n = (o = e.descendantWithPath("body.section.nav.ol")) == null ? void 0 : o.children), n && n.length > 0 && n.filter((s) => s.name === "li").forEach((s) => a.push(z(s, { opfBasePath: i, baseUrl: r }))), a;
25
+ }, K = async (e, i, { opfBasePath: r, baseUrl: a }) => {
26
26
  var t;
27
27
  const n = (t = e.childNamed("manifest")) == null ? void 0 : t.childrenNamed("item").find((o) => o.attr.properties === "nav");
28
28
  if (n) {
29
- const o = Object.values(r.files).find((s) => s.uri.endsWith(n.attr.href || ""));
29
+ const o = Object.values(i.files).find((s) => s.uri.endsWith(n.attr.href || ""));
30
30
  if (o) {
31
31
  const s = new h.XmlDocument(await o.string());
32
- return J(s, { opfBasePath: i, baseUrl: a });
32
+ return J(s, { opfBasePath: r, baseUrl: a });
33
33
  }
34
34
  }
35
- }, O = (e, { opfBasePath: r, baseUrl: i, prefix: a }) => {
35
+ }, O = (e, { opfBasePath: i, baseUrl: r, prefix: a }) => {
36
36
  var s, d;
37
37
  const n = ((s = e == null ? void 0 : e.childNamed(`${a}content`)) == null ? void 0 : s.attr.src) || "", t = {
38
38
  title: ((d = e == null ? void 0 : e.descendantWithPath(`${a}navLabel.${a}text`)) == null ? void 0 : d.val) || "",
39
- path: w(r, n),
40
- href: w(i, r, n),
39
+ path: w(i, n),
40
+ href: w(r, i, n),
41
41
  contents: []
42
42
  }, o = e.childrenNamed(`${a}navPoint`);
43
- return o && o.length > 0 && (t.contents = o.map((p) => O(p, { opfBasePath: r, baseUrl: i, prefix: a }))), t;
44
- }, Y = (e, { opfBasePath: r, baseUrl: i }) => {
43
+ return o && o.length > 0 && (t.contents = o.map((p) => O(p, { opfBasePath: i, baseUrl: r, prefix: a }))), t;
44
+ }, Y = (e, { opfBasePath: i, baseUrl: r }) => {
45
45
  var o;
46
46
  const a = [], n = e.name;
47
47
  let t = "";
48
- return n.indexOf(":") !== -1 && (t = n.split(":")[0] + ":"), (o = e.childNamed(`${t}navMap`)) == null || o.childrenNamed(`${t}navPoint`).forEach((s) => a.push(O(s, { opfBasePath: r, baseUrl: i, prefix: t }))), a;
48
+ return n.indexOf(":") !== -1 && (t = n.split(":")[0] + ":"), (o = e.childNamed(`${t}navMap`)) == null || o.childrenNamed(`${t}navPoint`).forEach((s) => a.push(O(s, { opfBasePath: i, baseUrl: r, prefix: t }))), a;
49
49
  }, Q = async ({
50
50
  opfData: e,
51
- opfBasePath: r,
52
- baseUrl: i,
51
+ opfBasePath: i,
52
+ baseUrl: r,
53
53
  archive: a
54
54
  }) => {
55
55
  var o;
@@ -57,34 +57,34 @@ const z = (e, { opfBasePath: r, baseUrl: i }) => {
57
57
  if (t) {
58
58
  const s = (o = e.childNamed("manifest")) == null ? void 0 : o.childrenNamed("item").find((d) => d.attr.id === t);
59
59
  if (s) {
60
- const d = `${r}${r === "" ? "" : "/"}${s.attr.href}`, p = Object.values(a.files).find((m) => m.uri.endsWith(d));
60
+ const d = `${i}${i === "" ? "" : "/"}${s.attr.href}`, p = Object.values(a.files).find((m) => m.uri.endsWith(d));
61
61
  if (p) {
62
62
  const m = new h.XmlDocument(await p.string());
63
- return Y(m, { opfBasePath: r, baseUrl: i });
63
+ return Y(m, { opfBasePath: i, baseUrl: r });
64
64
  }
65
65
  }
66
66
  }
67
- }, Z = async (e, r, { baseUrl: i }) => {
68
- const { basePath: a } = v(r) || {}, n = await Q({
67
+ }, Z = async (e, i, { baseUrl: r }) => {
68
+ const { basePath: a } = v(i) || {}, n = await Q({
69
69
  opfData: e,
70
70
  opfBasePath: a,
71
- archive: r,
72
- baseUrl: i
71
+ archive: i,
72
+ baseUrl: r
73
73
  });
74
- return n || await K(e, r, { opfBasePath: a, baseUrl: i });
74
+ return n || await K(e, i, { opfBasePath: a, baseUrl: r });
75
75
  }, E = async (e) => {
76
- const r = {
76
+ const i = {
77
77
  renditionLayout: void 0
78
78
  };
79
79
  return await Promise.all(
80
- e.files.map(async (i) => {
80
+ e.files.map(async (r) => {
81
81
  var a, n;
82
- if (i.uri.endsWith("com.kobobooks.display-options.xml")) {
83
- const o = (a = new h.XmlDocument(await i.string()).childNamed("platform")) == null ? void 0 : a.childNamed("option");
84
- ((n = o == null ? void 0 : o.attr) == null ? void 0 : n.name) === "fixed-layout" && o.val === "true" && (r.renditionLayout = "pre-paginated");
82
+ if (r.uri.endsWith("com.kobobooks.display-options.xml")) {
83
+ const o = (a = new h.XmlDocument(await r.string()).childNamed("platform")) == null ? void 0 : a.childNamed("option");
84
+ ((n = o == null ? void 0 : o.attr) == null ? void 0 : n.name) === "fixed-layout" && o.val === "true" && (i.renditionLayout = "pre-paginated");
85
85
  }
86
86
  })
87
- ), r;
87
+ ), i;
88
88
  };
89
89
  let b = !1;
90
90
  const y = {
@@ -106,51 +106,51 @@ const y = {
106
106
  timeEnd: (e) => {
107
107
  b && console.timeEnd(`[prose-reader-streamer] [metric] ${e}`);
108
108
  },
109
- metric: (e, r = 1 / 0) => {
110
- const i = typeof e == "number" ? e : e.duration;
111
- b && (e.duration <= r ? console.log("[prose-reader-streamer] [metric] ", `${e.name} took ${i}ms`) : console.warn(
109
+ metric: (e, i = 1 / 0) => {
110
+ const r = typeof e == "number" ? e : e.duration;
111
+ b && (e.duration <= i ? console.log("[prose-reader-streamer] [metric] ", `${e.name} took ${r}ms`) : console.warn(
112
112
  "[prose-reader-streamer] [metric] ",
113
- `${e.name} took ${e.duration}ms which is above the ${r}ms target for this function`
113
+ `${e.name} took ${e.duration}ms which is above the ${i}ms target for this function`
114
114
  ));
115
115
  },
116
- measurePerformance: (e, r = 10, i) => (...a) => {
117
- const n = performance.now(), t = i(...a);
116
+ measurePerformance: (e, i = 10, r) => (...a) => {
117
+ const n = performance.now(), t = r(...a);
118
118
  if (t && t.then)
119
119
  return t.then((s) => {
120
120
  const d = performance.now();
121
- return y.metric({ name: e, duration: d - n }, r), s;
121
+ return y.metric({ name: e, duration: d - n }, i), s;
122
122
  });
123
123
  const o = performance.now();
124
- return y.metric({ name: e, duration: o - n }, r), t;
124
+ return y.metric({ name: e, duration: o - n }, i), t;
125
125
  }
126
126
  }, v = (e) => {
127
- const i = Object.values(e.files).filter((a) => !a.dir).find((a) => a.uri.endsWith(".opf"));
127
+ const r = Object.values(e.files).filter((a) => !a.dir).find((a) => a.uri.endsWith(".opf"));
128
128
  return {
129
- data: i,
130
- basePath: (i == null ? void 0 : i.uri.substring(0, i.uri.lastIndexOf("/"))) || ""
129
+ data: r,
130
+ basePath: (r == null ? void 0 : r.uri.substring(0, r.uri.lastIndexOf("/"))) || ""
131
131
  };
132
132
  }, X = async ({ archive: e }) => {
133
- const { data: r, basePath: i } = v(e) || {}, a = await (r == null ? void 0 : r.string());
133
+ const { data: i, basePath: r } = v(e) || {}, a = await (i == null ? void 0 : i.string());
134
134
  if (!a)
135
135
  return [];
136
136
  const n = new h.XmlDocument(a), t = n.childNamed("manifest"), o = n.childNamed("spine"), s = o == null ? void 0 : o.childrenNamed("itemref").map((m) => m.attr.idref), d = (t == null ? void 0 : t.childrenNamed("item").filter((m) => s.includes(m.attr.id || ""))) || [];
137
- return e.files.filter((m) => d.find((f) => i ? `${i}/${f.attr.href}` === m.uri : `${f.attr.href}` === m.uri));
137
+ return e.files.filter((m) => d.find((f) => r ? `${r}/${f.attr.href}` === m.uri : `${f.attr.href}` === m.uri));
138
138
  }, j = (e) => {
139
- var i;
140
- const r = e.childNamed("manifest");
141
- return ((i = r == null ? void 0 : r.childrenNamed("item")) == null ? void 0 : i.map((a) => ({
139
+ var r;
140
+ const i = e.childNamed("manifest");
141
+ return ((r = i == null ? void 0 : i.childrenNamed("item")) == null ? void 0 : r.map((a) => ({
142
142
  href: a.attr.href || "",
143
143
  id: a.attr.id || "",
144
144
  mediaType: a.attr["media-type"]
145
145
  }))) || [];
146
- }, ee = ({ archive: e, baseUrl: r }) => async (i) => {
146
+ }, ee = ({ archive: e, baseUrl: i }) => async (r) => {
147
147
  var I;
148
148
  const { data: a, basePath: n } = v(e) || {}, t = await E(e);
149
149
  if (!a)
150
- return i;
150
+ return r;
151
151
  const o = await a.string();
152
152
  y.log(o, t);
153
- const s = new h.XmlDocument(o), d = await Z(s, e, { baseUrl: r }) || [], p = s.childNamed("metadata"), m = s.childNamed("manifest"), f = s.childNamed("spine"), $ = s.childNamed("guide"), x = p == null ? void 0 : p.childNamed("dc:title"), F = (p == null ? void 0 : p.childrenNamed("meta")) || [], N = F.find((l) => l.attr.property === "rendition:layout"), T = F.find((l) => l.attr.property === "rendition:flow"), D = F.find((l) => l.attr.property === "rendition:spread"), A = N == null ? void 0 : N.val, M = T == null ? void 0 : T.val, B = D == null ? void 0 : D.val, H = (x == null ? void 0 : x.val) || ((I = e.files.find(({ dir: l }) => l)) == null ? void 0 : I.basename) || "", V = f == null ? void 0 : f.attr["page-progression-direction"], _ = (await X({ archive: e })).reduce((l, c) => c.size + l, 0);
153
+ const s = new h.XmlDocument(o), d = await Z(s, e, { baseUrl: i }) || [], p = s.childNamed("metadata"), m = s.childNamed("manifest"), f = s.childNamed("spine"), $ = s.childNamed("guide"), x = p == null ? void 0 : p.childNamed("dc:title"), F = (p == null ? void 0 : p.childrenNamed("meta")) || [], N = F.find((l) => l.attr.property === "rendition:layout"), T = F.find((l) => l.attr.property === "rendition:flow"), D = F.find((l) => l.attr.property === "rendition:spread"), A = N == null ? void 0 : N.val, M = T == null ? void 0 : T.val, B = D == null ? void 0 : D.val, H = (x == null ? void 0 : x.val) || ((I = e.files.find(({ dir: l }) => l)) == null ? void 0 : I.basename) || "", V = f == null ? void 0 : f.attr["page-progression-direction"], _ = (await X({ archive: e })).reduce((l, c) => c.size + l, 0);
154
154
  return {
155
155
  filename: e.filename,
156
156
  nav: {
@@ -163,7 +163,7 @@ const y = {
163
163
  readingDirection: V || "ltr",
164
164
  spineItems: (f == null ? void 0 : f.childrenNamed("itemref").map((l) => {
165
165
  var C, S, W;
166
- const c = m == null ? void 0 : m.childrenNamed("item").find((u) => u.attr.id === (l == null ? void 0 : l.attr.idref)), U = (c == null ? void 0 : c.attr.href) || "", L = ((C = l == null ? void 0 : l.attr.properties) == null ? void 0 : C.split(" ")) || [], q = ((S = e.files.find((u) => u.uri.endsWith(U))) == null ? void 0 : S.size) || 0, k = r ?? "";
166
+ const c = m == null ? void 0 : m.childrenNamed("item").find((u) => u.attr.id === (l == null ? void 0 : l.attr.idref)), U = (c == null ? void 0 : c.attr.href) || "", L = ((C = l == null ? void 0 : l.attr.properties) == null ? void 0 : C.split(" ")) || [], q = ((S = e.files.find((u) => u.uri.endsWith(U))) == null ? void 0 : S.size) || 0, k = i ?? "";
167
167
  return {
168
168
  id: (c == null ? void 0 : c.attr.id) || "",
169
169
  href: (W = c == null ? void 0 : c.attr.href) != null && W.startsWith("https://") ? c == null ? void 0 : c.attr.href : n ? `${k}${n}/${c == null ? void 0 : c.attr.href}` : `${k}${c == null ? void 0 : c.attr.href}`,
@@ -184,11 +184,11 @@ const y = {
184
184
  type: l.attr.type
185
185
  }))
186
186
  };
187
- }, fe = async (e, r) => {
188
- const i = Object.values(e.files).find((t) => t.uri === r), a = await te(e, r);
189
- if (!i)
187
+ }, fe = async (e, i) => {
188
+ const r = Object.values(e.files).find((t) => t.uri === i), a = await te(e, i);
189
+ if (!r)
190
190
  throw new Error("no file found");
191
- const n = await i.blob();
191
+ const n = await r.blob();
192
192
  return {
193
193
  body: n,
194
194
  params: {
@@ -196,8 +196,8 @@ const y = {
196
196
  ...n.type && {
197
197
  "Content-Type": n.type
198
198
  },
199
- ...i.encodingFormat && {
200
- "Content-Type": i.encodingFormat
199
+ ...r.encodingFormat && {
200
+ "Content-Type": r.encodingFormat
201
201
  },
202
202
  ...a.mediaType && {
203
203
  "Content-Type": a.mediaType
@@ -205,17 +205,17 @@ const y = {
205
205
  }
206
206
  }
207
207
  };
208
- }, te = async (e, r) => {
208
+ }, te = async (e, i) => {
209
209
  var n, t;
210
210
  const a = await ((n = v(e).data) == null ? void 0 : n.string());
211
211
  if (a) {
212
212
  const o = new h.XmlDocument(a);
213
213
  return {
214
- mediaType: (t = j(o).find((d) => r.endsWith(d.href))) == null ? void 0 : t.mediaType
214
+ mediaType: (t = j(o).find((d) => i.endsWith(d.href))) == null ? void 0 : t.mediaType
215
215
  };
216
216
  }
217
217
  return {
218
- mediaType: ne(r)
218
+ mediaType: ne(i)
219
219
  };
220
220
  }, ne = (e) => {
221
221
  if (e.endsWith(".css"))
@@ -228,7 +228,7 @@ const y = {
228
228
  return "video/mp4";
229
229
  if (e.endsWith(".svg"))
230
230
  return "image/svg+xml";
231
- }, ae = ({ archive: e, baseUrl: r }) => async (i) => {
231
+ }, ae = ({ archive: e, baseUrl: i }) => async (r) => {
232
232
  var n;
233
233
  const a = Object.values(e.files).filter((t) => !t.dir);
234
234
  return {
@@ -242,7 +242,7 @@ const y = {
242
242
  readingDirection: "ltr",
243
243
  spineItems: a.map((t, o) => ({
244
244
  id: `${o}.${t.basename}`,
245
- href: `${r}${t.uri}`,
245
+ href: `${i}${t.uri}`,
246
246
  renditionLayout: "pre-paginated",
247
247
  progressionWeight: 1 / a.length,
248
248
  pageSpreadLeft: void 0,
@@ -251,42 +251,46 @@ const y = {
251
251
  })),
252
252
  items: a.map((t, o) => ({
253
253
  id: `${o}.${t.basename}`,
254
- href: `${r}${t.uri}`
254
+ href: `${i}${t.uri}`
255
255
  }))
256
256
  };
257
- }, re = ({ archive: e, baseUrl: r }) => async (i) => {
257
+ }, re = ({ archive: e, baseUrl: i }) => async (r) => {
258
258
  var s;
259
259
  const a = e.files.find((d) => d.basename.toLowerCase() === "comicinfo.xml");
260
260
  if (!a)
261
- return i;
261
+ return r;
262
262
  const n = await a.string(), o = ((s = new h.XmlDocument(n).childNamed("Manga")) == null ? void 0 : s.val) || "unknown";
263
263
  return {
264
- ...i,
265
- spineItems: i.spineItems.filter((d) => d.id.toLowerCase() !== "comicinfo.xml"),
264
+ ...r,
265
+ spineItems: r.spineItems.filter((d) => d.id.toLowerCase() !== "comicinfo.xml"),
266
266
  readingDirection: o === "YesAndRightToLeft" ? "rtl" : "ltr"
267
267
  };
268
268
  }, ie = (e) => {
269
- const r = e.descendantWithPath("head.meta");
270
- return !!(r && r.attr.name === "viewport");
271
- }, oe = (e) => e.reduce(async (r, i) => {
272
- if (!await r || !G({ mimeType: i.encodingFormat, uri: i.uri }))
269
+ var r;
270
+ const i = (r = e.descendantWithPath("head")) == null ? void 0 : r.childrenNamed("meta").find((a) => a.attr.name === "viewport");
271
+ return !!(i && i.attr.name === "viewport");
272
+ }, oe = (e) => e.reduce(async (i, r) => {
273
+ if (!await i || !G({
274
+ mimeType: r.encodingFormat,
275
+ uri: r.uri
276
+ }))
273
277
  return !1;
274
- const n = await i.string();
278
+ const n = await r.string();
275
279
  return n ? ie(new h.XmlDocument(n)) : !1;
276
- }, Promise.resolve(!0)), se = ({ archive: e, baseUrl: r }) => async (i) => {
277
- if (i.renditionLayout === "reflowable" && i.spineItems.every((n) => n.renditionLayout === "reflowable")) {
280
+ }, Promise.resolve(!0)), se = ({ archive: e, baseUrl: i }) => async (r) => {
281
+ if (r.renditionLayout === "reflowable" && r.spineItems.every((n) => n.renditionLayout === "reflowable")) {
278
282
  const n = await X({ archive: e });
279
283
  if (await oe(n))
280
284
  return {
281
- ...i,
282
- spineItems: i.spineItems.map((o) => ({
285
+ ...r,
286
+ spineItems: r.spineItems.map((o) => ({
283
287
  ...o,
284
288
  renditionLayout: "pre-paginated"
285
289
  })),
286
290
  renditionLayout: "pre-paginated"
287
291
  };
288
292
  }
289
- return i;
293
+ return r;
290
294
  }, ce = {
291
295
  filename: "",
292
296
  items: [],
@@ -298,25 +302,25 @@ const y = {
298
302
  renditionSpread: "auto",
299
303
  spineItems: [],
300
304
  title: ""
301
- }, ue = async (e, { baseUrl: r = "" } = {}) => {
302
- const i = [
303
- ae({ archive: e, baseUrl: r }),
304
- ee({ archive: e, baseUrl: r }),
305
- se({ archive: e, baseUrl: r }),
306
- re({ archive: e, baseUrl: r })
305
+ }, ue = async (e, { baseUrl: i = "" } = {}) => {
306
+ const r = [
307
+ ae({ archive: e, baseUrl: i }),
308
+ ee({ archive: e, baseUrl: i }),
309
+ se({ archive: e, baseUrl: i }),
310
+ re({ archive: e, baseUrl: i })
307
311
  ];
308
312
  try {
309
- const a = await i.reduce(async (n, t) => await t(await n), Promise.resolve(ce));
313
+ const a = await r.reduce(async (n, t) => await t(await n), Promise.resolve(ce));
310
314
  return y.log("Generated manifest", a), a;
311
315
  } catch (a) {
312
316
  throw y.error(a), a;
313
317
  }
314
- }, g = (e) => e.substring(e.lastIndexOf("/") + 1) || e, he = async (e, r) => {
315
- const i = `
318
+ }, g = (e) => e.substring(e.lastIndexOf("/") + 1) || e, he = async (e, i) => {
319
+ const r = `
316
320
  <?xml version="1.0" encoding="UTF-8"?><package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid">
317
321
  <metadata>
318
- <meta property="rendition:layout">${r != null && r.useRenditionFlow ? "reflowable" : "pre-paginated"}</meta>
319
- ${r != null && r.useRenditionFlow ? '<meta property="rendition:flow">scrolled-continuous</meta>' : ""}
322
+ <meta property="rendition:layout">${i != null && i.useRenditionFlow ? "reflowable" : "pre-paginated"}</meta>
323
+ ${i != null && i.useRenditionFlow ? '<meta property="rendition:flow">scrolled-continuous</meta>' : ""}
320
324
  </metadata>
321
325
  <manifest>
322
326
  ${e.map((t) => `<item id="${g(t)}" href="${t}" media-type="${P(t)}"/>`).join(`
@@ -344,20 +348,20 @@ const y = {
344
348
  basename: "content.opf",
345
349
  uri: "content.opf",
346
350
  size: 0,
347
- base64: async () => i,
351
+ base64: async () => r,
348
352
  blob: async () => new Blob(),
349
- string: async () => i
353
+ string: async () => r
350
354
  }, ...a]
351
355
  };
352
- }, de = async (e) => new Promise((r) => {
353
- const i = new FileReader();
354
- i.readAsDataURL(e), i.onloadend = function() {
355
- const a = i.result;
356
- r(a);
356
+ }, de = async (e) => new Promise((i) => {
357
+ const r = new FileReader();
358
+ r.readAsDataURL(e), r.onloadend = function() {
359
+ const a = r.result;
360
+ i(a);
357
361
  };
358
362
  }), ge = async (e, {
359
- mimeType: r,
360
- direction: i
363
+ mimeType: i,
364
+ direction: r
361
365
  } = { mimeType: "text/plain" }) => {
362
366
  const a = `
363
367
  <?xml version="1.0" encoding="UTF-8"?>
@@ -370,7 +374,7 @@ const y = {
370
374
  <manifest>
371
375
  <item id="p01" href="p01.txt" media-type="text/plain"/>
372
376
  </manifest>
373
- <spine page-progression-direction="${i ?? "ltr"}">
377
+ <spine page-progression-direction="${r ?? "ltr"}">
374
378
  <itemref idref="p01" />
375
379
  </spine>
376
380
  </package>
@@ -395,22 +399,22 @@ const y = {
395
399
  string: async () => typeof e == "string" ? e : e.text(),
396
400
  base64: async () => typeof e == "string" ? btoa(e) : de(e),
397
401
  size: typeof e == "string" ? e.length : e.size,
398
- encodingFormat: r
402
+ encodingFormat: i
399
403
  }
400
404
  ]
401
405
  };
402
- }, R = (e, r) => {
406
+ }, R = (e, i) => {
403
407
  var n;
404
- const i = e.split(/(\d+)/), a = r.split(/(\d+)/);
405
- for (let t = 0, o = i.length; t < o; t++)
406
- if (i[t] !== a[t])
407
- return (n = i[t]) != null && n.match(/\d/) ? +(i[t] || "") - +(a[t] || "") : (i[t] || "").localeCompare(a[t] || "");
408
+ const r = e.split(/(\d+)/), a = i.split(/(\d+)/);
409
+ for (let t = 0, o = r.length; t < o; t++)
410
+ if (r[t] !== a[t])
411
+ return (n = r[t]) != null && n.match(/\d/) ? +(r[t] || "") - +(a[t] || "") : (r[t] || "").localeCompare(a[t] || "");
408
412
  return 1;
409
- }, ye = async (e, { orderByAlpha: r, name: i } = {}) => {
413
+ }, ye = async (e, { orderByAlpha: i, name: r } = {}) => {
410
414
  let a = Object.values(e.files);
411
- r && (a = a.sort((t, o) => R(t.name, o.name)));
415
+ i && (a = a.sort((t, o) => R(t.name, o.name)));
412
416
  const n = {
413
- filename: i || "",
417
+ filename: r || "",
414
418
  files: a.map((t) => ({
415
419
  dir: t.dir,
416
420
  basename: g(t.name),
@@ -425,10 +429,10 @@ const y = {
425
429
  }))
426
430
  };
427
431
  return y.log("Generated archive", n), n;
428
- }, be = async (e, { orderByAlpha: r, name: i } = {}) => {
432
+ }, be = async (e, { orderByAlpha: i, name: r } = {}) => {
429
433
  let a = e;
430
- return r && (a = a.sort((n, t) => R(n.name, t.name))), {
431
- filename: i || "",
434
+ return i && (a = a.sort((n, t) => R(n.name, t.name))), {
435
+ filename: r || "",
432
436
  files: a.map((n) => ({
433
437
  dir: n.isDir,
434
438
  basename: g(n.name),
@@ -1 +1 @@
1
- {"version":3,"file":"prose-streamer.js","sources":["../src/parsers/nav.ts","../src/parsers/kobo.ts","../src/report.ts","../src/archives/getArchiveOpfInfo.ts","../src/epub/getSpineItemFilesFromArchive.ts","../src/generators/manifest/hooks/epub.ts","../src/generators/resources.ts","../src/generators/manifest/hooks/default.ts","../src/generators/manifest/hooks/comicInfo.ts","../src/generators/manifest/hooks/epubOptimizer.ts","../src/generators/manifest/index.ts","../src/utils/uri.ts","../src/archives/createArchiveFromUrls.ts","../src/utils/blobToBAse64.ts","../src/archives/createArchiveFromText.ts","../src/utils/sortByTitleComparator.ts","../src/archives/createArchiveFromJszip.ts","../src/archives/createArchiveFromArrayBufferList.ts","../src/configure.ts"],"sourcesContent":["import xmldoc, { XmlElement } from \"xmldoc\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { urlJoin } from \"@prose-reader/shared\"\n\ntype Toc = Manifest[`nav`][`toc`]\ntype TocItem = Manifest[`nav`][`toc`][number]\n\nconst extractNavChapter = (li: XmlElement, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const chp: TocItem = {\n contents: [],\n path: ``,\n href: ``,\n title: ``\n }\n let contentNode = li.childNamed(`span`) || li.childNamed(`a`)\n chp.title = contentNode?.attr.title || contentNode?.val.trim() || chp.title\n let node = contentNode?.name\n if (node !== `a`) {\n contentNode = li.descendantWithPath(`${node}.a`)\n if (contentNode) {\n node = contentNode.name.toLowerCase()\n }\n }\n if (node === `a` && contentNode?.attr.href) {\n chp.path = urlJoin(opfBasePath, contentNode.attr.href)\n chp.href = urlJoin(baseUrl, opfBasePath, contentNode.attr.href)\n }\n const sublistNode = li.childNamed(`ol`)\n if (sublistNode) {\n const children = sublistNode.childrenNamed(`li`)\n if (children && children.length > 0) {\n chp.contents = children.map((child) => extractNavChapter(child, { opfBasePath, baseUrl }))\n }\n }\n\n return chp\n}\n\nconst buildTOCFromNav = (doc: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: Toc = []\n\n let navDataChildren\n if (doc.descendantWithPath(`body.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.nav.ol`)?.children\n } else if (doc.descendantWithPath(`body.section.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.section.nav.ol`)?.children\n }\n\n if (navDataChildren && navDataChildren.length > 0) {\n navDataChildren\n .filter((li) => (li as XmlElement).name === `li`)\n .forEach((li) => toc.push(extractNavChapter(li as XmlElement, { opfBasePath, baseUrl })))\n }\n\n return toc\n}\n\nconst parseTocFromNavPath = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }\n) => {\n // Try to detect if there is a nav item\n const navItem = opfXmlDoc\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((child) => child.attr.properties === `nav`)\n\n if (navItem) {\n const tocFile = Object.values(archive.files).find((item) => item.uri.endsWith(navItem.attr.href || ``))\n if (tocFile) {\n const doc = new xmldoc.XmlDocument(await tocFile.string())\n return buildTOCFromNav(doc, { opfBasePath, baseUrl })\n }\n }\n}\n\nconst mapNcxChapter = (\n point: xmldoc.XmlElement,\n { opfBasePath, baseUrl, prefix }: { opfBasePath: string; baseUrl: string; prefix: string }\n) => {\n const src = point?.childNamed(`${prefix}content`)?.attr.src || ``\n\n const out: TocItem = {\n title: point?.descendantWithPath(`${prefix}navLabel.${prefix}text`)?.val || ``,\n path: urlJoin(opfBasePath, src),\n href: urlJoin(baseUrl, opfBasePath, src),\n contents: []\n }\n const children = point.childrenNamed(`${prefix}navPoint`)\n if (children && children.length > 0) {\n out.contents = children.map((pt) => mapNcxChapter(pt, { opfBasePath, baseUrl, prefix }))\n }\n\n return out\n}\n\nconst buildTOCFromNCX = (ncxData: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: Manifest[`nav`][`toc`] = []\n\n const rootTagName = ncxData.name\n let prefix = ``\n if (rootTagName.indexOf(`:`) !== -1) {\n prefix = rootTagName.split(`:`)[0] + `:`\n }\n\n ncxData\n .childNamed(`${prefix}navMap`)\n ?.childrenNamed(`${prefix}navPoint`)\n .forEach((point) => toc.push(mapNcxChapter(point, { opfBasePath, baseUrl, prefix })))\n\n return toc\n}\n\nconst parseTocFromNcx = async ({\n opfData,\n opfBasePath,\n baseUrl,\n archive\n}: {\n opfData: xmldoc.XmlDocument\n opfBasePath: string\n archive: Archive\n baseUrl: string\n}) => {\n const spine = opfData.childNamed(`spine`)\n const ncxId = spine && spine.attr.toc\n\n if (ncxId) {\n const ncxItem = opfData\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === ncxId)\n\n if (ncxItem) {\n const ncxPath = `${opfBasePath}${opfBasePath === `` ? `` : `/`}${ncxItem.attr.href}`\n\n const file = Object.values(archive.files).find((item) => item.uri.endsWith(ncxPath))\n\n if (file) {\n const ncxData = new xmldoc.XmlDocument(await file.string())\n\n return buildTOCFromNCX(ncxData, { opfBasePath, baseUrl })\n }\n }\n }\n}\n\nexport const parseToc = async (opfXmlDoc: xmldoc.XmlDocument, archive: Archive, { baseUrl }: { baseUrl: string }) => {\n const { basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const tocFromNcx = await parseTocFromNcx({\n opfData: opfXmlDoc,\n opfBasePath,\n archive,\n baseUrl\n })\n\n if (tocFromNcx) {\n return tocFromNcx\n }\n\n return await parseTocFromNavPath(opfXmlDoc, archive, { opfBasePath, baseUrl })\n}\n","import xmldoc from \"xmldoc\"\nimport { Archive } from \"..\"\n\ntype KoboInformation = {\n renditionLayout?: `reflowable` | `pre-paginated` | undefined\n}\n\nexport const extractKoboInformationFromArchive = async (archive: Archive) => {\n const koboInformation: KoboInformation = {\n renditionLayout: undefined\n }\n\n await Promise.all(\n archive.files.map(async (file) => {\n if (file.uri.endsWith(`com.kobobooks.display-options.xml`)) {\n const opfXmlDoc = new xmldoc.XmlDocument(await file.string())\n const optionElement = opfXmlDoc.childNamed(`platform`)?.childNamed(`option`)\n if (optionElement?.attr?.name === `fixed-layout` && optionElement.val === `true`) {\n koboInformation.renditionLayout = `pre-paginated`\n }\n }\n })\n )\n\n return koboInformation\n}\n","let enabled = false\n\nexport const Report = {\n enable: (enable: boolean) => {\n enabled = enable\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.warn(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: (...data: any[]) => {\n // eslint-disable-next-line no-console\n console.error(...data)\n },\n time: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.time(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n timeEnd: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.timeEnd(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n metric: (performanceEntry: { name: string; duration: number }, targetDuration = Infinity) => {\n const duration = typeof performanceEntry === `number` ? performanceEntry : performanceEntry.duration\n if (enabled) {\n if (performanceEntry.duration <= targetDuration) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer] [metric] `, `${performanceEntry.name} took ${duration}ms`)\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${performanceEntry.duration}ms which is above the ${targetDuration}ms target for this function`\n )\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measurePerformance: <F extends (...args: any[]) => any>(name: string, targetDuration = 10, functionToMeasure: F) => {\n return (...args: Parameters<F>): ReturnType<F> => {\n const t0 = performance.now()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = functionToMeasure(...(args as any))\n\n if (response && response.then) {\n return response.then((res: any) => {\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n return res\n })\n }\n\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n\n return response\n }\n }\n}\n","import { Archive } from \"./types\"\n\nexport const getArchiveOpfInfo = (archive: Archive) => {\n const filesAsArray = Object.values(archive.files).filter((file) => !file.dir)\n const file = filesAsArray.find((file) => file.uri.endsWith(`.opf`))\n\n return {\n data: file,\n basePath: file?.uri.substring(0, file.uri.lastIndexOf(`/`)) || ``\n }\n}\n","import xmldoc from \"xmldoc\"\nimport { getArchiveOpfInfo } from \"../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../archives/types\"\n\nexport const getSpineItemFilesFromArchive = async ({ archive }: { archive: Archive }) => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const data = await opsFile?.string()\n\n if (!data) return []\n\n const _opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const manifestElm = _opfXmlDoc.childNamed(`manifest`)\n const spineElm = _opfXmlDoc.childNamed(`spine`)\n\n const spineItemIds = spineElm?.childrenNamed(`itemref`).map((item) => item.attr.idref) as string[]\n const manifestItemsFromSpine =\n manifestElm?.childrenNamed(`item`).filter((item) => spineItemIds.includes(item.attr.id || ``)) || []\n\n const archiveSpineItems = archive.files.filter((file) => {\n return manifestItemsFromSpine.find((item) => {\n if (!opfBasePath) return `${item.attr.href}` === file.uri\n return `${opfBasePath}/${item.attr.href}` === file.uri\n })\n })\n\n return archiveSpineItems\n}\n","import xmldoc from \"xmldoc\"\nimport { parseToc } from \"../../../parsers/nav\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { extractKoboInformationFromArchive } from \"../../../parsers/kobo\"\nimport { Report } from \"../../../report\"\nimport { Archive } from \"../../../archives/types\"\nimport { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\ntype SpineItemProperties = `rendition:layout-reflowable` | `page-spread-left` | `page-spread-right`\n\nexport const getItemsFromDoc = (doc: xmldoc.XmlDocument) => {\n const manifestElm = doc.childNamed(`manifest`)\n\n return (\n manifestElm?.childrenNamed(`item`)?.map((el) => ({\n href: el.attr.href || ``,\n id: el.attr.id || ``,\n mediaType: el.attr[`media-type`]\n })) || []\n )\n}\n\nexport const epubHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n const koboInformation = await extractKoboInformationFromArchive(archive)\n\n if (!opsFile) {\n return manifest\n }\n\n const data = await opsFile.string()\n\n Report.log(data, koboInformation)\n\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const toc = (await parseToc(opfXmlDoc, archive, { baseUrl })) || []\n\n const metadataElm = opfXmlDoc.childNamed(`metadata`)\n const manifestElm = opfXmlDoc.childNamed(`manifest`)\n const spineElm = opfXmlDoc.childNamed(`spine`)\n const guideElm = opfXmlDoc.childNamed(`guide`)\n const titleElm = metadataElm?.childNamed(`dc:title`)\n const metaElmChildren = metadataElm?.childrenNamed(`meta`) || []\n const metaElmWithRendition = metaElmChildren.find((meta) => meta.attr.property === `rendition:layout`)\n const metaElmWithRenditionFlow = metaElmChildren.find((meta) => meta.attr.property === `rendition:flow`)\n const metaElmWithRenditionSpread = metaElmChildren.find((meta) => meta.attr.property === `rendition:spread`)\n\n const publisherRenditionLayout = metaElmWithRendition?.val as `reflowable` | `pre-paginated` | undefined\n const publisherRenditionFlow = metaElmWithRenditionFlow?.val as\n | `scrolled-continuous`\n | `scrolled-doc`\n | `paginated`\n | `auto`\n | undefined\n const renditionSpread = metaElmWithRenditionSpread?.val as `auto` | undefined\n\n const title = titleElm?.val || archive.files.find(({ dir }) => dir)?.basename || ``\n const pageProgressionDirection = spineElm?.attr[`page-progression-direction`] as `ltr` | `rtl` | undefined\n\n const archiveSpineItems = await getSpineItemFilesFromArchive({ archive })\n\n const totalSize = archiveSpineItems.reduce((size, file) => file.size + size, 0)\n\n return {\n filename: archive.filename,\n nav: {\n toc\n },\n renditionLayout: publisherRenditionLayout || koboInformation.renditionLayout || `reflowable`,\n renditionFlow: publisherRenditionFlow || `auto`,\n renditionSpread,\n title,\n readingDirection: pageProgressionDirection || `ltr`,\n spineItems:\n spineElm?.childrenNamed(`itemref`).map((itemrefElm) => {\n const manifestItem = manifestElm?.childrenNamed(`item`).find((item) => item.attr.id === itemrefElm?.attr.idref)\n const href = manifestItem?.attr.href || ``\n const properties = (itemrefElm?.attr.properties?.split(` `) || []) as SpineItemProperties[]\n const itemSize = archive.files.find((file) => file.uri.endsWith(href))?.size || 0\n\n // we use base url or nothing (and stay relative)\n const hrefBaseUri = baseUrl ?? \"\"\n\n return {\n id: manifestItem?.attr.id || ``,\n href: manifestItem?.attr.href?.startsWith(`https://`)\n ? manifestItem?.attr.href\n : opfBasePath\n ? `${hrefBaseUri}${opfBasePath}/${manifestItem?.attr.href}`\n : `${hrefBaseUri}${manifestItem?.attr.href}`,\n renditionLayout: publisherRenditionLayout || `reflowable`,\n ...(properties.find((property) => property === `rendition:layout-reflowable`) && {\n renditionLayout: `reflowable`\n }),\n progressionWeight: itemSize / totalSize,\n pageSpreadLeft: properties.some((property) => property === `page-spread-left`) || undefined,\n pageSpreadRight: properties.some((property) => property === `page-spread-right`) || undefined,\n // size: itemSize\n mediaType: manifestItem?.attr[`media-type`]\n }\n }) || [],\n items: getItemsFromDoc(opfXmlDoc),\n guide: guideElm?.childrenNamed(`reference`).map((elm) => {\n return {\n href: elm.attr.href || ``,\n title: elm.attr.title || ``,\n type: elm.attr.type as NonNullable<Manifest[`guide`]>[number][`type`]\n }\n })\n }\n }\n","import xmldoc from \"xmldoc\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { getItemsFromDoc } from \"./manifest/hooks/epub\"\n\nexport const generateResourceFromArchive = async (archive: Archive, resourcePath: string) => {\n const file = Object.values(archive.files).find((file) => file.uri === resourcePath)\n\n const metadata = await getMetadata(archive, resourcePath)\n\n if (!file) {\n throw new Error(`no file found`)\n }\n\n const blob = await file.blob()\n\n // if (file.stream) {\n // const stream = file.stream()\n\n // console.log(file, stream)\n // stream.on(`data`, data => {\n // console.log(`data`, data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // console.log(`end`)\n // })\n\n // }\n\n // const stream = file.stream!()\n\n // const readableStream = new ReadableStream({\n // start(controller) {\n // function push() {\n // stream.on(`data`, data => {\n // controller.enqueue(data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // controller.close()\n // })\n\n // stream.resume()\n // }\n\n // push();\n // }\n // })\n\n return {\n body: blob,\n params: {\n headers: {\n ...(blob.type && {\n \"Content-Type\": blob.type\n }),\n ...(file.encodingFormat && {\n \"Content-Type\": file.encodingFormat\n }),\n ...(metadata.mediaType && {\n \"Content-Type\": metadata.mediaType\n })\n // 'Cache-Control': `no-cache, no-store, no-transform`\n }\n }\n }\n}\n\nconst getMetadata = async (archive: Archive, resourcePath: string) => {\n const opfInfo = getArchiveOpfInfo(archive)\n const data = await opfInfo.data?.string()\n\n if (data) {\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n const items = getItemsFromDoc(opfXmlDoc)\n\n return {\n mediaType: items.find((item) => resourcePath.endsWith(item.href))?.mediaType\n }\n }\n\n return {\n mediaType: getContentTypeFromExtension(resourcePath)\n }\n}\n\nconst getContentTypeFromExtension = (uri: string) => {\n if (uri.endsWith(`.css`)) {\n return `text/css; charset=UTF-8`\n }\n if (uri.endsWith(`.jpg`)) {\n return `image/jpg`\n }\n if (uri.endsWith(`.xhtml`)) {\n return `application/xhtml+xml`\n }\n if (uri.endsWith(`.mp4`)) {\n return `video/mp4`\n }\n if (uri.endsWith(`.svg`)) {\n return `image/svg+xml`\n }\n}\n","import { Manifest } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\n\nexport const defaultHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const files = Object.values(archive.files).filter((file) => !file.dir)\n\n return {\n filename: archive.filename,\n nav: {\n toc: []\n },\n title: archive.files.find(({ dir }) => dir)?.basename.replace(/\\/$/, ``) || ``,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n readingDirection: `ltr`,\n spineItems: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n renditionLayout: `pre-paginated`,\n progressionWeight: 1 / files.length,\n pageSpreadLeft: undefined,\n pageSpreadRight: undefined,\n mediaType: file.encodingFormat\n })),\n items: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`\n }))\n }\n }\n","import { Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\n\n/**\n * Handle archive which contains ComicInfo.xml. This is a meta file\n * used to define cbz, etc. I believe it comes from some sites or apps.\n */\nexport const comicInfoHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const comicInfoFile = archive.files.find((file) => file.basename.toLowerCase() === `comicinfo.xml`)\n\n if (!comicInfoFile) {\n return manifest\n }\n\n // @todo handle more meta\n const content = await comicInfoFile.string()\n const xmlDoc = new xmldoc.XmlDocument(content)\n\n const mangaVal = (xmlDoc.childNamed(`Manga`)?.val as `YesAndRightToLeft`) || `unknown`\n\n return {\n ...manifest,\n spineItems: manifest.spineItems.filter((item) => item.id.toLowerCase() !== `comicinfo.xml`),\n readingDirection: mangaVal === `YesAndRightToLeft` ? `rtl` : `ltr`\n }\n }\n","import { isXmlBasedMimeType, Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\nconst hasDocMetaViewport = (doc: xmldoc.XmlDocument) => {\n const metaElm = doc.descendantWithPath(\"head.meta\")\n\n return !!(metaElm && metaElm.attr.name === \"viewport\")\n}\n\nconst allFilesHaveViewportMeta = (files: Archive[\"files\"]) =>\n files.reduce(async (result, current) => {\n const _result = await result\n\n if (!_result) return false\n\n if (!isXmlBasedMimeType({ mimeType: current.encodingFormat, uri: current.uri })) {\n return false\n }\n\n const file = await current.string()\n\n if (!file) return false\n\n return hasDocMetaViewport(new xmldoc.XmlDocument(file))\n }, Promise.resolve(true))\n\nexport const epubOptimizerHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const bookIsFullReflowable =\n manifest.renditionLayout === \"reflowable\" && manifest.spineItems.every((item) => item.renditionLayout === \"reflowable\")\n\n if (bookIsFullReflowable) {\n const files = await getSpineItemFilesFromArchive({ archive })\n\n const hasAllViewport = await allFilesHaveViewportMeta(files)\n\n if (hasAllViewport) {\n return {\n ...manifest,\n spineItems: manifest.spineItems.map((item) => ({\n ...item,\n renditionLayout: \"pre-paginated\"\n })),\n renditionLayout: \"pre-paginated\"\n }\n }\n }\n\n return manifest\n }\n","import type { Manifest } from \"@prose-reader/shared\"\nimport { Report } from \"../../report\"\nimport { Archive } from \"../../archives/types\"\nimport { defaultHook } from \"./hooks/default\"\nimport { epubHook } from \"./hooks/epub\"\nimport { comicInfoHook } from \"./hooks/comicInfo\"\nimport { epubOptimizerHook } from \"./hooks/epubOptimizer\"\n\nconst baseManifest: Manifest = {\n filename: ``,\n items: [],\n nav: {\n toc: []\n },\n readingDirection: `ltr`,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n spineItems: [],\n title: ``\n}\n\nexport const generateManifestFromArchive = async (archive: Archive, { baseUrl = `` }: { baseUrl?: string } = {}) => {\n const hooks = [\n defaultHook({ archive, baseUrl }),\n epubHook({ archive, baseUrl }),\n epubOptimizerHook({ archive, baseUrl }),\n comicInfoHook({ archive, baseUrl })\n ]\n\n try {\n const manifest = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(baseManifest))\n\n Report.log(\"Generated manifest\", manifest)\n\n return manifest\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n","export const getUriBasename = (uri: string) => uri.substring(uri.lastIndexOf(`/`) + 1) || uri\n","import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromUrls = async (urls: string[], options?: { useRenditionFlow: boolean }): Promise<Archive> => {\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">${options?.useRenditionFlow ? `reflowable` : `pre-paginated`}</meta>\n ${options?.useRenditionFlow ? `<meta property=\"rendition:flow\">scrolled-continuous</meta>` : ``}\n </metadata>\n <manifest>\n ${urls\n .map((url) => `<item id=\"${getUriBasename(url)}\" href=\"${url}\" media-type=\"${detectMimeTypeFromName(url)}\"/>`)\n .join(`\\n`)}\n </manifest>\n <spine>\n ${urls.map((url) => `<itemref idref=\"${getUriBasename(url)}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const filesFromUrl: Archive[`files`] = urls.map((url) => ({\n dir: false,\n basename: getUriBasename(url),\n encodingFormat: detectMimeTypeFromName(url),\n uri: url,\n size: 100 / urls.length,\n base64: async () => ``,\n blob: async () => new Blob(),\n string: async () => ``\n }))\n\n const opfFile: Archive[`files`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n base64: async () => opfFileData,\n blob: async () => new Blob(),\n string: async () => opfFileData\n }\n\n return {\n filename: ``,\n files: [opfFile, ...filesFromUrl]\n }\n}\n","export const blobToBase64 = async (blob: Blob) =>\n new Promise<string>((resolve) => {\n const reader = new FileReader()\n reader.readAsDataURL(blob)\n reader.onloadend = function () {\n const base64data = reader.result as string\n resolve(base64data)\n }\n })\n","import { blobToBase64 } from \"../utils/blobToBAse64\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * Useful to create archive from txt content\n */\nexport const createArchiveFromText = async (\n content: string | Blob,\n {\n mimeType,\n direction\n }: {\n direction?: `ltr` | `rtl`\n mimeType?: string\n } = { mimeType: \"text/plain\" }\n) => {\n const txtOpfContent = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" xml:lang=\"ja\" prefix=\"rendition: http://www.idpf.org/vocab/rendition/#\"\n unique-identifier=\"ootuya-id\">\n <metadata xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\">\n <meta property=\"rendition:layout\">reflowable</meta>\n </metadata>\n <manifest>\n <item id=\"p01\" href=\"p01.txt\" media-type=\"text/plain\"/>\n </manifest>\n <spine page-progression-direction=\"${direction ?? `ltr`}\">\n <itemref idref=\"p01\" />\n </spine>\n </package>\n `\n\n const archive: Archive = {\n filename: `content.txt`,\n files: [\n {\n dir: false,\n basename: getUriBasename(`generated.opf`),\n uri: `generated.opf`,\n blob: async () => new Blob([txtOpfContent]),\n string: async () => txtOpfContent,\n base64: async () => btoa(txtOpfContent),\n size: 0\n },\n {\n dir: false,\n basename: getUriBasename(`p01.txt`),\n uri: `p01.txt`,\n blob: async () => {\n if (typeof content === `string`) return new Blob([content])\n return content\n },\n string: async () => {\n if (typeof content === `string`) return content\n return content.text()\n },\n base64: async () => {\n if (typeof content === `string`) return btoa(content)\n return blobToBase64(content)\n },\n size: typeof content === `string` ? content.length : content.size,\n encodingFormat: mimeType\n }\n ]\n }\n\n return archive\n}\n","export const sortByTitleComparator = (a: string, b: string) => {\n const alist = a.split(/(\\d+)/)\n const blist = b.split(/(\\d+)/)\n\n for (let i = 0, len = alist.length; i < len; i++) {\n if (alist[i] !== blist[i]) {\n if (alist[i]?.match(/\\d/)) {\n return +(alist[i] || ``) - +(blist[i] || ``)\n } else {\n return (alist[i] || ``).localeCompare(blist[i] || ``)\n }\n }\n }\n\n return 1\n}\n","import { Report } from \"../report\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive, StreamResult } from \"./types\"\n\ninterface OutputByType {\n base64: string\n string: string\n text: string\n binarystring: string\n array: number[]\n uint8array: Uint8Array\n arraybuffer: ArrayBuffer\n blob: Blob\n nodebuffer: Buffer\n}\n\ntype OutputType = keyof OutputByType\ninterface JSZipObject {\n name: string\n dir: boolean\n date: Date\n comment: string\n unixPermissions: number | string | null\n dosPermissions: number | null\n async<T extends OutputType>(type: T): Promise<OutputByType[T]>\n // nodeStream(type?: `nodebuffer`): NodeJS.ReadableStream;\n internalStream?: (type?: `uint8array`) => StreamResult\n}\n\ninterface JSZip {\n files: { [key: string]: JSZipObject }\n}\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {}\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n const archive = {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.dir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: () => file.async(`blob`),\n string: () => file.async(`string`),\n base64: () => file.async(`base64`),\n ...(file.internalStream && {\n stream: file.internalStream\n }),\n // this is private API\n // @ts-ignore\n size: file._data.uncompressedSize\n }))\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","import { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\nexport const createArchiveFromArrayBufferList = async (\n list: {\n isDir: boolean\n name: string\n size: number\n data: () => Promise<ArrayBuffer>\n }[],\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {}\n): Promise<Archive> => {\n let files = list\n\n if (orderByAlpha) {\n files = files.sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.isDir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: async () => new Blob([await file.data()]),\n string: async () => {\n const data = await file.data()\n return String.fromCharCode.apply(null, Array.from(new Uint16Array(data)))\n },\n base64: async () => {\n // @todo not used for now, lets implement it later if needed\n return ``\n },\n size: file.size\n }))\n }\n}\n","import { Report } from \"./report\"\n\nexport const configure = ({ enableReport }: { enableReport?: boolean } = {}) => {\n Report.enable(!!enableReport)\n}\n"],"names":["extractNavChapter","li","opfBasePath","baseUrl","chp","contentNode","node","urlJoin","sublistNode","children","child","buildTOCFromNav","doc","toc","navDataChildren","_a","_b","parseTocFromNavPath","opfXmlDoc","archive","navItem","tocFile","item","xmldoc","mapNcxChapter","point","prefix","src","out","pt","buildTOCFromNCX","ncxData","rootTagName","parseTocFromNcx","opfData","spine","ncxId","ncxItem","ncxPath","file","parseToc","getArchiveOpfInfo","tocFromNcx","extractKoboInformationFromArchive","koboInformation","optionElement","enabled","Report","enable","data","label","performanceEntry","targetDuration","duration","name","functionToMeasure","args","t0","response","res","t1","getSpineItemFilesFromArchive","opsFile","_opfXmlDoc","manifestElm","spineElm","spineItemIds","manifestItemsFromSpine","getItemsFromDoc","el","epubHook","manifest","metadataElm","guideElm","titleElm","metaElmChildren","metaElmWithRendition","meta","metaElmWithRenditionFlow","metaElmWithRenditionSpread","publisherRenditionLayout","publisherRenditionFlow","renditionSpread","title","dir","pageProgressionDirection","totalSize","size","itemrefElm","manifestItem","href","properties","itemSize","hrefBaseUri","_c","property","elm","generateResourceFromArchive","resourcePath","metadata","getMetadata","blob","getContentTypeFromExtension","uri","defaultHook","files","index","comicInfoHook","comicInfoFile","content","mangaVal","hasDocMetaViewport","metaElm","allFilesHaveViewportMeta","result","current","isXmlBasedMimeType","epubOptimizerHook","baseManifest","generateManifestFromArchive","hooks","gen","e","getUriBasename","createArchiveFromUrls","urls","options","opfFileData","url","detectMimeTypeFromName","filesFromUrl","blobToBase64","resolve","reader","base64data","createArchiveFromText","mimeType","direction","txtOpfContent","sortByTitleComparator","a","b","alist","blist","i","len","createArchiveFromJszip","jszip","orderByAlpha","createArchiveFromArrayBufferList","list","configure","enableReport"],"mappings":"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"}
1
+ {"version":3,"file":"prose-streamer.js","sources":["../src/parsers/nav.ts","../src/parsers/kobo.ts","../src/report.ts","../src/archives/getArchiveOpfInfo.ts","../src/epub/getSpineItemFilesFromArchive.ts","../src/generators/manifest/hooks/epub.ts","../src/generators/resources.ts","../src/generators/manifest/hooks/default.ts","../src/generators/manifest/hooks/comicInfo.ts","../src/generators/manifest/hooks/epubOptimizer.ts","../src/generators/manifest/index.ts","../src/utils/uri.ts","../src/archives/createArchiveFromUrls.ts","../src/utils/blobToBAse64.ts","../src/archives/createArchiveFromText.ts","../src/utils/sortByTitleComparator.ts","../src/archives/createArchiveFromJszip.ts","../src/archives/createArchiveFromArrayBufferList.ts","../src/configure.ts"],"sourcesContent":["import xmldoc, { XmlElement } from \"xmldoc\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { urlJoin } from \"@prose-reader/shared\"\n\ntype Toc = Manifest[`nav`][`toc`]\ntype TocItem = Manifest[`nav`][`toc`][number]\n\nconst extractNavChapter = (li: XmlElement, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const chp: TocItem = {\n contents: [],\n path: ``,\n href: ``,\n title: ``,\n }\n let contentNode = li.childNamed(`span`) || li.childNamed(`a`)\n chp.title = contentNode?.attr.title || contentNode?.val.trim() || chp.title\n let node = contentNode?.name\n if (node !== `a`) {\n contentNode = li.descendantWithPath(`${node}.a`)\n if (contentNode) {\n node = contentNode.name.toLowerCase()\n }\n }\n if (node === `a` && contentNode?.attr.href) {\n chp.path = urlJoin(opfBasePath, contentNode.attr.href)\n chp.href = urlJoin(baseUrl, opfBasePath, contentNode.attr.href)\n }\n const sublistNode = li.childNamed(`ol`)\n if (sublistNode) {\n const children = sublistNode.childrenNamed(`li`)\n if (children && children.length > 0) {\n chp.contents = children.map((child) => extractNavChapter(child, { opfBasePath, baseUrl }))\n }\n }\n\n return chp\n}\n\nconst buildTOCFromNav = (doc: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: Toc = []\n\n let navDataChildren\n if (doc.descendantWithPath(`body.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.nav.ol`)?.children\n } else if (doc.descendantWithPath(`body.section.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.section.nav.ol`)?.children\n }\n\n if (navDataChildren && navDataChildren.length > 0) {\n navDataChildren\n .filter((li) => (li as XmlElement).name === `li`)\n .forEach((li) => toc.push(extractNavChapter(li as XmlElement, { opfBasePath, baseUrl })))\n }\n\n return toc\n}\n\nconst parseTocFromNavPath = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }\n) => {\n // Try to detect if there is a nav item\n const navItem = opfXmlDoc\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((child) => child.attr.properties === `nav`)\n\n if (navItem) {\n const tocFile = Object.values(archive.files).find((item) => item.uri.endsWith(navItem.attr.href || ``))\n if (tocFile) {\n const doc = new xmldoc.XmlDocument(await tocFile.string())\n return buildTOCFromNav(doc, { opfBasePath, baseUrl })\n }\n }\n}\n\nconst mapNcxChapter = (\n point: xmldoc.XmlElement,\n { opfBasePath, baseUrl, prefix }: { opfBasePath: string; baseUrl: string; prefix: string }\n) => {\n const src = point?.childNamed(`${prefix}content`)?.attr.src || ``\n\n const out: TocItem = {\n title: point?.descendantWithPath(`${prefix}navLabel.${prefix}text`)?.val || ``,\n path: urlJoin(opfBasePath, src),\n href: urlJoin(baseUrl, opfBasePath, src),\n contents: [],\n }\n const children = point.childrenNamed(`${prefix}navPoint`)\n if (children && children.length > 0) {\n out.contents = children.map((pt) => mapNcxChapter(pt, { opfBasePath, baseUrl, prefix }))\n }\n\n return out\n}\n\nconst buildTOCFromNCX = (ncxData: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: Manifest[`nav`][`toc`] = []\n\n const rootTagName = ncxData.name\n let prefix = ``\n if (rootTagName.indexOf(`:`) !== -1) {\n prefix = rootTagName.split(`:`)[0] + `:`\n }\n\n ncxData\n .childNamed(`${prefix}navMap`)\n ?.childrenNamed(`${prefix}navPoint`)\n .forEach((point) => toc.push(mapNcxChapter(point, { opfBasePath, baseUrl, prefix })))\n\n return toc\n}\n\nconst parseTocFromNcx = async ({\n opfData,\n opfBasePath,\n baseUrl,\n archive,\n}: {\n opfData: xmldoc.XmlDocument\n opfBasePath: string\n archive: Archive\n baseUrl: string\n}) => {\n const spine = opfData.childNamed(`spine`)\n const ncxId = spine && spine.attr.toc\n\n if (ncxId) {\n const ncxItem = opfData\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === ncxId)\n\n if (ncxItem) {\n const ncxPath = `${opfBasePath}${opfBasePath === `` ? `` : `/`}${ncxItem.attr.href}`\n\n const file = Object.values(archive.files).find((item) => item.uri.endsWith(ncxPath))\n\n if (file) {\n const ncxData = new xmldoc.XmlDocument(await file.string())\n\n return buildTOCFromNCX(ncxData, { opfBasePath, baseUrl })\n }\n }\n }\n}\n\nexport const parseToc = async (opfXmlDoc: xmldoc.XmlDocument, archive: Archive, { baseUrl }: { baseUrl: string }) => {\n const { basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const tocFromNcx = await parseTocFromNcx({\n opfData: opfXmlDoc,\n opfBasePath,\n archive,\n baseUrl,\n })\n\n if (tocFromNcx) {\n return tocFromNcx\n }\n\n return await parseTocFromNavPath(opfXmlDoc, archive, { opfBasePath, baseUrl })\n}\n","import xmldoc from \"xmldoc\"\nimport { Archive } from \"..\"\n\ntype KoboInformation = {\n renditionLayout?: `reflowable` | `pre-paginated` | undefined\n}\n\nexport const extractKoboInformationFromArchive = async (archive: Archive) => {\n const koboInformation: KoboInformation = {\n renditionLayout: undefined,\n }\n\n await Promise.all(\n archive.files.map(async (file) => {\n if (file.uri.endsWith(`com.kobobooks.display-options.xml`)) {\n const opfXmlDoc = new xmldoc.XmlDocument(await file.string())\n const optionElement = opfXmlDoc.childNamed(`platform`)?.childNamed(`option`)\n if (optionElement?.attr?.name === `fixed-layout` && optionElement.val === `true`) {\n koboInformation.renditionLayout = `pre-paginated`\n }\n }\n })\n )\n\n return koboInformation\n}\n","let enabled = false\n\nexport const Report = {\n enable: (enable: boolean) => {\n enabled = enable\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.warn(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: (...data: any[]) => {\n // eslint-disable-next-line no-console\n console.error(...data)\n },\n time: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.time(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n timeEnd: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.timeEnd(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n metric: (performanceEntry: { name: string; duration: number }, targetDuration = Infinity) => {\n const duration = typeof performanceEntry === `number` ? performanceEntry : performanceEntry.duration\n if (enabled) {\n if (performanceEntry.duration <= targetDuration) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer] [metric] `, `${performanceEntry.name} took ${duration}ms`)\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${performanceEntry.duration}ms which is above the ${targetDuration}ms target for this function`\n )\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measurePerformance: <F extends (...args: any[]) => any>(name: string, targetDuration = 10, functionToMeasure: F) => {\n return (...args: Parameters<F>): ReturnType<F> => {\n const t0 = performance.now()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = functionToMeasure(...(args as any))\n\n if (response && response.then) {\n return response.then((res: any) => {\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n return res\n })\n }\n\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n\n return response\n }\n },\n}\n","import { Archive } from \"./types\"\n\nexport const getArchiveOpfInfo = (archive: Archive) => {\n const filesAsArray = Object.values(archive.files).filter((file) => !file.dir)\n const file = filesAsArray.find((file) => file.uri.endsWith(`.opf`))\n\n return {\n data: file,\n basePath: file?.uri.substring(0, file.uri.lastIndexOf(`/`)) || ``,\n }\n}\n","import xmldoc from \"xmldoc\"\nimport { getArchiveOpfInfo } from \"../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../archives/types\"\n\nexport const getSpineItemFilesFromArchive = async ({ archive }: { archive: Archive }) => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const data = await opsFile?.string()\n\n if (!data) return []\n\n const _opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const manifestElm = _opfXmlDoc.childNamed(`manifest`)\n const spineElm = _opfXmlDoc.childNamed(`spine`)\n\n const spineItemIds = spineElm?.childrenNamed(`itemref`).map((item) => item.attr.idref) as string[]\n const manifestItemsFromSpine =\n manifestElm?.childrenNamed(`item`).filter((item) => spineItemIds.includes(item.attr.id || ``)) || []\n\n const archiveSpineItems = archive.files.filter((file) => {\n return manifestItemsFromSpine.find((item) => {\n if (!opfBasePath) return `${item.attr.href}` === file.uri\n return `${opfBasePath}/${item.attr.href}` === file.uri\n })\n })\n\n return archiveSpineItems\n}\n","import xmldoc from \"xmldoc\"\nimport { parseToc } from \"../../../parsers/nav\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { extractKoboInformationFromArchive } from \"../../../parsers/kobo\"\nimport { Report } from \"../../../report\"\nimport { Archive } from \"../../../archives/types\"\nimport { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\ntype SpineItemProperties = `rendition:layout-reflowable` | `page-spread-left` | `page-spread-right`\n\nexport const getItemsFromDoc = (doc: xmldoc.XmlDocument) => {\n const manifestElm = doc.childNamed(`manifest`)\n\n return (\n manifestElm?.childrenNamed(`item`)?.map((el) => ({\n href: el.attr.href || ``,\n id: el.attr.id || ``,\n mediaType: el.attr[`media-type`],\n })) || []\n )\n}\n\nexport const epubHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n const koboInformation = await extractKoboInformationFromArchive(archive)\n\n if (!opsFile) {\n return manifest\n }\n\n const data = await opsFile.string()\n\n Report.log(data, koboInformation)\n\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const toc = (await parseToc(opfXmlDoc, archive, { baseUrl })) || []\n\n const metadataElm = opfXmlDoc.childNamed(`metadata`)\n const manifestElm = opfXmlDoc.childNamed(`manifest`)\n const spineElm = opfXmlDoc.childNamed(`spine`)\n const guideElm = opfXmlDoc.childNamed(`guide`)\n const titleElm = metadataElm?.childNamed(`dc:title`)\n const metaElmChildren = metadataElm?.childrenNamed(`meta`) || []\n const metaElmWithRendition = metaElmChildren.find((meta) => meta.attr.property === `rendition:layout`)\n const metaElmWithRenditionFlow = metaElmChildren.find((meta) => meta.attr.property === `rendition:flow`)\n const metaElmWithRenditionSpread = metaElmChildren.find((meta) => meta.attr.property === `rendition:spread`)\n\n const publisherRenditionLayout = metaElmWithRendition?.val as `reflowable` | `pre-paginated` | undefined\n const publisherRenditionFlow = metaElmWithRenditionFlow?.val as\n | `scrolled-continuous`\n | `scrolled-doc`\n | `paginated`\n | `auto`\n | undefined\n const renditionSpread = metaElmWithRenditionSpread?.val as `auto` | undefined\n\n const title = titleElm?.val || archive.files.find(({ dir }) => dir)?.basename || ``\n const pageProgressionDirection = spineElm?.attr[`page-progression-direction`] as `ltr` | `rtl` | undefined\n\n const archiveSpineItems = await getSpineItemFilesFromArchive({ archive })\n\n const totalSize = archiveSpineItems.reduce((size, file) => file.size + size, 0)\n\n return {\n filename: archive.filename,\n nav: {\n toc,\n },\n renditionLayout: publisherRenditionLayout || koboInformation.renditionLayout || `reflowable`,\n renditionFlow: publisherRenditionFlow || `auto`,\n renditionSpread,\n title,\n readingDirection: pageProgressionDirection || `ltr`,\n spineItems:\n spineElm?.childrenNamed(`itemref`).map((itemrefElm) => {\n const manifestItem = manifestElm?.childrenNamed(`item`).find((item) => item.attr.id === itemrefElm?.attr.idref)\n const href = manifestItem?.attr.href || ``\n const properties = (itemrefElm?.attr.properties?.split(` `) || []) as SpineItemProperties[]\n const itemSize = archive.files.find((file) => file.uri.endsWith(href))?.size || 0\n\n // we use base url or nothing (and stay relative)\n const hrefBaseUri = baseUrl ?? \"\"\n\n return {\n id: manifestItem?.attr.id || ``,\n href: manifestItem?.attr.href?.startsWith(`https://`)\n ? manifestItem?.attr.href\n : opfBasePath\n ? `${hrefBaseUri}${opfBasePath}/${manifestItem?.attr.href}`\n : `${hrefBaseUri}${manifestItem?.attr.href}`,\n renditionLayout: publisherRenditionLayout || `reflowable`,\n ...(properties.find((property) => property === `rendition:layout-reflowable`) && {\n renditionLayout: `reflowable`,\n }),\n progressionWeight: itemSize / totalSize,\n pageSpreadLeft: properties.some((property) => property === `page-spread-left`) || undefined,\n pageSpreadRight: properties.some((property) => property === `page-spread-right`) || undefined,\n // size: itemSize\n mediaType: manifestItem?.attr[`media-type`],\n }\n }) || [],\n items: getItemsFromDoc(opfXmlDoc),\n guide: guideElm?.childrenNamed(`reference`).map((elm) => {\n return {\n href: elm.attr.href || ``,\n title: elm.attr.title || ``,\n type: elm.attr.type as NonNullable<Manifest[`guide`]>[number][`type`],\n }\n }),\n }\n }\n","import xmldoc from \"xmldoc\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { getItemsFromDoc } from \"./manifest/hooks/epub\"\n\nexport const generateResourceFromArchive = async (archive: Archive, resourcePath: string) => {\n const file = Object.values(archive.files).find((file) => file.uri === resourcePath)\n\n const metadata = await getMetadata(archive, resourcePath)\n\n if (!file) {\n throw new Error(`no file found`)\n }\n\n const blob = await file.blob()\n\n // if (file.stream) {\n // const stream = file.stream()\n\n // console.log(file, stream)\n // stream.on(`data`, data => {\n // console.log(`data`, data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // console.log(`end`)\n // })\n\n // }\n\n // const stream = file.stream!()\n\n // const readableStream = new ReadableStream({\n // start(controller) {\n // function push() {\n // stream.on(`data`, data => {\n // controller.enqueue(data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // controller.close()\n // })\n\n // stream.resume()\n // }\n\n // push();\n // }\n // })\n\n return {\n body: blob,\n params: {\n headers: {\n ...(blob.type && {\n \"Content-Type\": blob.type,\n }),\n ...(file.encodingFormat && {\n \"Content-Type\": file.encodingFormat,\n }),\n ...(metadata.mediaType && {\n \"Content-Type\": metadata.mediaType,\n }),\n // 'Cache-Control': `no-cache, no-store, no-transform`\n },\n },\n }\n}\n\nconst getMetadata = async (archive: Archive, resourcePath: string) => {\n const opfInfo = getArchiveOpfInfo(archive)\n const data = await opfInfo.data?.string()\n\n if (data) {\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n const items = getItemsFromDoc(opfXmlDoc)\n\n return {\n mediaType: items.find((item) => resourcePath.endsWith(item.href))?.mediaType,\n }\n }\n\n return {\n mediaType: getContentTypeFromExtension(resourcePath),\n }\n}\n\nconst getContentTypeFromExtension = (uri: string) => {\n if (uri.endsWith(`.css`)) {\n return `text/css; charset=UTF-8`\n }\n if (uri.endsWith(`.jpg`)) {\n return `image/jpg`\n }\n if (uri.endsWith(`.xhtml`)) {\n return `application/xhtml+xml`\n }\n if (uri.endsWith(`.mp4`)) {\n return `video/mp4`\n }\n if (uri.endsWith(`.svg`)) {\n return `image/svg+xml`\n }\n}\n","import { Manifest } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\n\nexport const defaultHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const files = Object.values(archive.files).filter((file) => !file.dir)\n\n return {\n filename: archive.filename,\n nav: {\n toc: [],\n },\n title: archive.files.find(({ dir }) => dir)?.basename.replace(/\\/$/, ``) || ``,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n readingDirection: `ltr`,\n spineItems: files.map((file, index) => ({\n // some books such as cbz can have same basename inside different sub folder\n // we need to make sure to have unique index\n // /chap01/01.png, /chap02/01.png, etc\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n renditionLayout: `pre-paginated`,\n progressionWeight: 1 / files.length,\n pageSpreadLeft: undefined,\n pageSpreadRight: undefined,\n mediaType: file.encodingFormat,\n })),\n items: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n })),\n }\n }\n","import { Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\n\n/**\n * Handle archive which contains ComicInfo.xml. This is a meta file\n * used to define cbz, etc. I believe it comes from some sites or apps.\n */\nexport const comicInfoHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const comicInfoFile = archive.files.find((file) => file.basename.toLowerCase() === `comicinfo.xml`)\n\n if (!comicInfoFile) {\n return manifest\n }\n\n // @todo handle more meta\n const content = await comicInfoFile.string()\n const xmlDoc = new xmldoc.XmlDocument(content)\n\n const mangaVal = (xmlDoc.childNamed(`Manga`)?.val as `YesAndRightToLeft`) || `unknown`\n\n return {\n ...manifest,\n spineItems: manifest.spineItems.filter((item) => item.id.toLowerCase() !== `comicinfo.xml`),\n readingDirection: mangaVal === `YesAndRightToLeft` ? `rtl` : `ltr`,\n }\n }\n","import { isXmlBasedMimeType, Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\nconst hasDocMetaViewport = (doc: xmldoc.XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"viewport\")\n\n return !!(metaElm && metaElm.attr.name === \"viewport\")\n}\n\nconst allFilesHaveViewportMeta = (files: Archive[\"files\"]) =>\n files.reduce(async (result, current) => {\n const _result = await result\n\n if (!_result) return false\n\n if (\n !isXmlBasedMimeType({\n mimeType: current.encodingFormat,\n uri: current.uri,\n })\n ) {\n return false\n }\n\n const file = await current.string()\n\n if (!file) return false\n\n return hasDocMetaViewport(new xmldoc.XmlDocument(file))\n }, Promise.resolve(true))\n\nexport const epubOptimizerHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const bookIsFullReflowable =\n manifest.renditionLayout === \"reflowable\" && manifest.spineItems.every((item) => item.renditionLayout === \"reflowable\")\n\n if (bookIsFullReflowable) {\n const files = await getSpineItemFilesFromArchive({ archive })\n\n const hasAllViewport = await allFilesHaveViewportMeta(files)\n\n if (hasAllViewport) {\n return {\n ...manifest,\n spineItems: manifest.spineItems.map((item) => ({\n ...item,\n renditionLayout: \"pre-paginated\",\n })),\n renditionLayout: \"pre-paginated\",\n }\n }\n }\n\n return manifest\n }\n","import type { Manifest } from \"@prose-reader/shared\"\nimport { Report } from \"../../report\"\nimport { Archive } from \"../../archives/types\"\nimport { defaultHook } from \"./hooks/default\"\nimport { epubHook } from \"./hooks/epub\"\nimport { comicInfoHook } from \"./hooks/comicInfo\"\nimport { epubOptimizerHook } from \"./hooks/epubOptimizer\"\n\nconst baseManifest: Manifest = {\n filename: ``,\n items: [],\n nav: {\n toc: [],\n },\n readingDirection: `ltr`,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n spineItems: [],\n title: ``,\n}\n\nexport const generateManifestFromArchive = async (archive: Archive, { baseUrl = `` }: { baseUrl?: string } = {}) => {\n const hooks = [\n defaultHook({ archive, baseUrl }),\n epubHook({ archive, baseUrl }),\n epubOptimizerHook({ archive, baseUrl }),\n comicInfoHook({ archive, baseUrl }),\n ]\n\n try {\n const manifest = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(baseManifest))\n\n Report.log(\"Generated manifest\", manifest)\n\n return manifest\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n","export const getUriBasename = (uri: string) => uri.substring(uri.lastIndexOf(`/`) + 1) || uri\n","import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromUrls = async (urls: string[], options?: { useRenditionFlow: boolean }): Promise<Archive> => {\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">${options?.useRenditionFlow ? `reflowable` : `pre-paginated`}</meta>\n ${options?.useRenditionFlow ? `<meta property=\"rendition:flow\">scrolled-continuous</meta>` : ``}\n </metadata>\n <manifest>\n ${urls\n .map((url) => `<item id=\"${getUriBasename(url)}\" href=\"${url}\" media-type=\"${detectMimeTypeFromName(url)}\"/>`)\n .join(`\\n`)}\n </manifest>\n <spine>\n ${urls.map((url) => `<itemref idref=\"${getUriBasename(url)}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const filesFromUrl: Archive[`files`] = urls.map((url) => ({\n dir: false,\n basename: getUriBasename(url),\n encodingFormat: detectMimeTypeFromName(url),\n uri: url,\n size: 100 / urls.length,\n base64: async () => ``,\n blob: async () => new Blob(),\n string: async () => ``,\n }))\n\n const opfFile: Archive[`files`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n base64: async () => opfFileData,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n return {\n filename: ``,\n files: [opfFile, ...filesFromUrl],\n }\n}\n","export const blobToBase64 = async (blob: Blob) =>\n new Promise<string>((resolve) => {\n const reader = new FileReader()\n reader.readAsDataURL(blob)\n reader.onloadend = function () {\n const base64data = reader.result as string\n resolve(base64data)\n }\n })\n","import { blobToBase64 } from \"../utils/blobToBAse64\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * Useful to create archive from txt content\n */\nexport const createArchiveFromText = async (\n content: string | Blob,\n {\n mimeType,\n direction,\n }: {\n direction?: `ltr` | `rtl`\n mimeType?: string\n } = { mimeType: \"text/plain\" }\n) => {\n const txtOpfContent = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" xml:lang=\"ja\" prefix=\"rendition: http://www.idpf.org/vocab/rendition/#\"\n unique-identifier=\"ootuya-id\">\n <metadata xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\">\n <meta property=\"rendition:layout\">reflowable</meta>\n </metadata>\n <manifest>\n <item id=\"p01\" href=\"p01.txt\" media-type=\"text/plain\"/>\n </manifest>\n <spine page-progression-direction=\"${direction ?? `ltr`}\">\n <itemref idref=\"p01\" />\n </spine>\n </package>\n `\n\n const archive: Archive = {\n filename: `content.txt`,\n files: [\n {\n dir: false,\n basename: getUriBasename(`generated.opf`),\n uri: `generated.opf`,\n blob: async () => new Blob([txtOpfContent]),\n string: async () => txtOpfContent,\n base64: async () => btoa(txtOpfContent),\n size: 0,\n },\n {\n dir: false,\n basename: getUriBasename(`p01.txt`),\n uri: `p01.txt`,\n blob: async () => {\n if (typeof content === `string`) return new Blob([content])\n return content\n },\n string: async () => {\n if (typeof content === `string`) return content\n return content.text()\n },\n base64: async () => {\n if (typeof content === `string`) return btoa(content)\n return blobToBase64(content)\n },\n size: typeof content === `string` ? content.length : content.size,\n encodingFormat: mimeType,\n },\n ],\n }\n\n return archive\n}\n","export const sortByTitleComparator = (a: string, b: string) => {\n const alist = a.split(/(\\d+)/)\n const blist = b.split(/(\\d+)/)\n\n for (let i = 0, len = alist.length; i < len; i++) {\n if (alist[i] !== blist[i]) {\n if (alist[i]?.match(/\\d/)) {\n return +(alist[i] || ``) - +(blist[i] || ``)\n } else {\n return (alist[i] || ``).localeCompare(blist[i] || ``)\n }\n }\n }\n\n return 1\n}\n","import { Report } from \"../report\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive, StreamResult } from \"./types\"\n\ninterface OutputByType {\n base64: string\n string: string\n text: string\n binarystring: string\n array: number[]\n uint8array: Uint8Array\n arraybuffer: ArrayBuffer\n blob: Blob\n nodebuffer: Buffer\n}\n\ntype OutputType = keyof OutputByType\ninterface JSZipObject {\n name: string\n dir: boolean\n date: Date\n comment: string\n unixPermissions: number | string | null\n dosPermissions: number | null\n async<T extends OutputType>(type: T): Promise<OutputByType[T]>\n // nodeStream(type?: `nodebuffer`): NodeJS.ReadableStream;\n internalStream?: (type?: `uint8array`) => StreamResult\n}\n\ninterface JSZip {\n files: { [key: string]: JSZipObject }\n}\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {}\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n const archive = {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.dir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: () => file.async(`blob`),\n string: () => file.async(`string`),\n base64: () => file.async(`base64`),\n ...(file.internalStream && {\n stream: file.internalStream,\n }),\n // this is private API\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n size: file._data.uncompressedSize,\n })),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","import { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\nexport const createArchiveFromArrayBufferList = async (\n list: {\n isDir: boolean\n name: string\n size: number\n data: () => Promise<ArrayBuffer>\n }[],\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {}\n): Promise<Archive> => {\n let files = list\n\n if (orderByAlpha) {\n files = files.sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.isDir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: async () => new Blob([await file.data()]),\n string: async () => {\n const data = await file.data()\n return String.fromCharCode.apply(null, Array.from(new Uint16Array(data)))\n },\n base64: async () => {\n // @todo not used for now, lets implement it later if needed\n return ``\n },\n size: file.size,\n })),\n }\n}\n","import { Report } from \"./report\"\n\nexport const configure = ({ enableReport }: { enableReport?: boolean } = {}) => {\n Report.enable(!!enableReport)\n}\n"],"names":["extractNavChapter","li","opfBasePath","baseUrl","chp","contentNode","node","urlJoin","sublistNode","children","child","buildTOCFromNav","doc","toc","navDataChildren","_a","_b","parseTocFromNavPath","opfXmlDoc","archive","navItem","tocFile","item","xmldoc","mapNcxChapter","point","prefix","src","out","pt","buildTOCFromNCX","ncxData","rootTagName","parseTocFromNcx","opfData","spine","ncxId","ncxItem","ncxPath","file","parseToc","getArchiveOpfInfo","tocFromNcx","extractKoboInformationFromArchive","koboInformation","optionElement","enabled","Report","enable","data","label","performanceEntry","targetDuration","duration","name","functionToMeasure","args","t0","response","res","t1","getSpineItemFilesFromArchive","opsFile","_opfXmlDoc","manifestElm","spineElm","spineItemIds","manifestItemsFromSpine","getItemsFromDoc","el","epubHook","manifest","metadataElm","guideElm","titleElm","metaElmChildren","metaElmWithRendition","meta","metaElmWithRenditionFlow","metaElmWithRenditionSpread","publisherRenditionLayout","publisherRenditionFlow","renditionSpread","title","dir","pageProgressionDirection","totalSize","size","itemrefElm","manifestItem","href","properties","itemSize","hrefBaseUri","_c","property","elm","generateResourceFromArchive","resourcePath","metadata","getMetadata","blob","getContentTypeFromExtension","uri","defaultHook","files","index","comicInfoHook","comicInfoFile","content","mangaVal","hasDocMetaViewport","metaElm","allFilesHaveViewportMeta","result","current","isXmlBasedMimeType","epubOptimizerHook","baseManifest","generateManifestFromArchive","hooks","gen","e","getUriBasename","createArchiveFromUrls","urls","options","opfFileData","url","detectMimeTypeFromName","filesFromUrl","blobToBase64","resolve","reader","base64data","createArchiveFromText","mimeType","direction","txtOpfContent","sortByTitleComparator","a","b","alist","blist","i","len","createArchiveFromJszip","jszip","orderByAlpha","createArchiveFromArrayBufferList","list","configure","enableReport"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- (function(m,p){typeof exports=="object"&&typeof module<"u"?p(exports,require("xmldoc"),require("@prose-reader/shared")):typeof define=="function"&&define.amd?define(["exports","xmldoc","@prose-reader/shared"],p):(m=typeof globalThis<"u"?globalThis:m||self,p(m["prose-streamer"]={},m.xmldoc,m["@prose-reader/shared"]))})(this,function(m,p,y){"use strict";const I=(e,{opfBasePath:a,baseUrl:i})=>{const r={contents:[],path:"",href:"",title:""};let n=e.childNamed("span")||e.childNamed("a");r.title=(n==null?void 0:n.attr.title)||(n==null?void 0:n.val.trim())||r.title;let t=n==null?void 0:n.name;t!=="a"&&(n=e.descendantWithPath(`${t}.a`),n&&(t=n.name.toLowerCase())),t==="a"&&(n!=null&&n.attr.href)&&(r.path=y.urlJoin(a,n.attr.href),r.href=y.urlJoin(i,a,n.attr.href));const o=e.childNamed("ol");if(o){const s=o.childrenNamed("li");s&&s.length>0&&(r.contents=s.map(d=>I(d,{opfBasePath:a,baseUrl:i})))}return r},R=(e,{opfBasePath:a,baseUrl:i})=>{var t,o;const r=[];let n;return e.descendantWithPath("body.nav.ol")?n=(t=e.descendantWithPath("body.nav.ol"))==null?void 0:t.children:e.descendantWithPath("body.section.nav.ol")&&(n=(o=e.descendantWithPath("body.section.nav.ol"))==null?void 0:o.children),n&&n.length>0&&n.filter(s=>s.name==="li").forEach(s=>r.push(I(s,{opfBasePath:a,baseUrl:i}))),r},B=async(e,a,{opfBasePath:i,baseUrl:r})=>{var t;const n=(t=e.childNamed("manifest"))==null?void 0:t.childrenNamed("item").find(o=>o.attr.properties==="nav");if(n){const o=Object.values(a.files).find(s=>s.uri.endsWith(n.attr.href||""));if(o){const s=new p.XmlDocument(await o.string());return R(s,{opfBasePath:i,baseUrl:r})}}},S=(e,{opfBasePath:a,baseUrl:i,prefix:r})=>{var s,d;const n=((s=e==null?void 0:e.childNamed(`${r}content`))==null?void 0:s.attr.src)||"",t={title:((d=e==null?void 0:e.descendantWithPath(`${r}navLabel.${r}text`))==null?void 0:d.val)||"",path:y.urlJoin(a,n),href:y.urlJoin(i,a,n),contents:[]},o=e.childrenNamed(`${r}navPoint`);return o&&o.length>0&&(t.contents=o.map(u=>S(u,{opfBasePath:a,baseUrl:i,prefix:r}))),t},J=(e,{opfBasePath:a,baseUrl:i})=>{var o;const r=[],n=e.name;let t="";return n.indexOf(":")!==-1&&(t=n.split(":")[0]+":"),(o=e.childNamed(`${t}navMap`))==null||o.childrenNamed(`${t}navPoint`).forEach(s=>r.push(S(s,{opfBasePath:a,baseUrl:i,prefix:t}))),r},H=async({opfData:e,opfBasePath:a,baseUrl:i,archive:r})=>{var o;const n=e.childNamed("spine"),t=n&&n.attr.toc;if(t){const s=(o=e.childNamed("manifest"))==null?void 0:o.childrenNamed("item").find(d=>d.attr.id===t);if(s){const d=`${a}${a===""?"":"/"}${s.attr.href}`,u=Object.values(r.files).find(f=>f.uri.endsWith(d));if(u){const f=new p.XmlDocument(await u.string());return J(f,{opfBasePath:a,baseUrl:i})}}}},V=async(e,a,{baseUrl:i})=>{const{basePath:r}=F(a)||{},n=await H({opfData:e,opfBasePath:r,archive:a,baseUrl:i});return n||await B(e,a,{opfBasePath:r,baseUrl:i})},q=async e=>{const a={renditionLayout:void 0};return await Promise.all(e.files.map(async i=>{var r,n;if(i.uri.endsWith("com.kobobooks.display-options.xml")){const o=(r=new p.XmlDocument(await i.string()).childNamed("platform"))==null?void 0:r.childNamed("option");((n=o==null?void 0:o.attr)==null?void 0:n.name)==="fixed-layout"&&o.val==="true"&&(a.renditionLayout="pre-paginated")}})),a};let v=!1;const b={enable:e=>{v=e},log:(...e)=>{v&&console.log("[prose-reader-streamer]",...e)},warn:(...e)=>{v&&console.warn("[prose-reader-streamer]",...e)},error:(...e)=>{console.error(...e)},time:e=>{v&&console.time(`[prose-reader-streamer] [metric] ${e}`)},timeEnd:e=>{v&&console.timeEnd(`[prose-reader-streamer] [metric] ${e}`)},metric:(e,a=1/0)=>{const i=typeof e=="number"?e:e.duration;v&&(e.duration<=a?console.log("[prose-reader-streamer] [metric] ",`${e.name} took ${i}ms`):console.warn("[prose-reader-streamer] [metric] ",`${e.name} took ${e.duration}ms which is above the ${a}ms target for this function`))},measurePerformance:(e,a=10,i)=>(...r)=>{const n=performance.now(),t=i(...r);if(t&&t.then)return t.then(s=>{const d=performance.now();return b.metric({name:e,duration:d-n},a),s});const o=performance.now();return b.metric({name:e,duration:o-n},a),t}},F=e=>{const i=Object.values(e.files).filter(r=>!r.dir).find(r=>r.uri.endsWith(".opf"));return{data:i,basePath:(i==null?void 0:i.uri.substring(0,i.uri.lastIndexOf("/")))||""}},k=async({archive:e})=>{const{data:a,basePath:i}=F(e)||{},r=await(a==null?void 0:a.string());if(!r)return[];const n=new p.XmlDocument(r),t=n.childNamed("manifest"),o=n.childNamed("spine"),s=o==null?void 0:o.childrenNamed("itemref").map(f=>f.attr.idref),d=(t==null?void 0:t.childrenNamed("item").filter(f=>s.includes(f.attr.id||"")))||[];return e.files.filter(f=>d.find(h=>i?`${i}/${h.attr.href}`===f.uri:`${h.attr.href}`===f.uri))},C=e=>{var i;const a=e.childNamed("manifest");return((i=a==null?void 0:a.childrenNamed("item"))==null?void 0:i.map(r=>({href:r.attr.href||"",id:r.attr.id||"",mediaType:r.attr["media-type"]})))||[]},U=({archive:e,baseUrl:a})=>async i=>{var z;const{data:r,basePath:n}=F(e)||{},t=await q(e);if(!r)return i;const o=await r.string();b.log(o,t);const s=new p.XmlDocument(o),d=await V(s,e,{baseUrl:a})||[],u=s.childNamed("metadata"),f=s.childNamed("manifest"),h=s.childNamed("spine"),$=s.childNamed("guide"),N=u==null?void 0:u.childNamed("dc:title"),T=(u==null?void 0:u.childrenNamed("meta"))||[],x=T.find(l=>l.attr.property==="rendition:layout"),A=T.find(l=>l.attr.property==="rendition:flow"),L=T.find(l=>l.attr.property==="rendition:spread"),P=x==null?void 0:x.val,de=A==null?void 0:A.val,le=L==null?void 0:L.val,me=(N==null?void 0:N.val)||((z=e.files.find(({dir:l})=>l))==null?void 0:z.basename)||"",fe=h==null?void 0:h.attr["page-progression-direction"],pe=(await k({archive:e})).reduce((l,c)=>c.size+l,0);return{filename:e.filename,nav:{toc:d},renditionLayout:P||t.renditionLayout||"reflowable",renditionFlow:de||"auto",renditionSpread:le,title:me,readingDirection:fe||"ltr",spineItems:(h==null?void 0:h.childrenNamed("itemref").map(l=>{var X,j,M;const c=f==null?void 0:f.childrenNamed("item").find(g=>g.attr.id===(l==null?void 0:l.attr.idref)),ue=(c==null?void 0:c.attr.href)||"",D=((X=l==null?void 0:l.attr.properties)==null?void 0:X.split(" "))||[],he=((j=e.files.find(g=>g.uri.endsWith(ue)))==null?void 0:j.size)||0,O=a??"";return{id:(c==null?void 0:c.attr.id)||"",href:(M=c==null?void 0:c.attr.href)!=null&&M.startsWith("https://")?c==null?void 0:c.attr.href:n?`${O}${n}/${c==null?void 0:c.attr.href}`:`${O}${c==null?void 0:c.attr.href}`,renditionLayout:P||"reflowable",...D.find(g=>g==="rendition:layout-reflowable")&&{renditionLayout:"reflowable"},progressionWeight:he/pe,pageSpreadLeft:D.some(g=>g==="page-spread-left")||void 0,pageSpreadRight:D.some(g=>g==="page-spread-right")||void 0,mediaType:c==null?void 0:c.attr["media-type"]}}))||[],items:C(s),guide:$==null?void 0:$.childrenNamed("reference").map(l=>({href:l.attr.href||"",title:l.attr.title||"",type:l.attr.type}))}},_=async(e,a)=>{const i=Object.values(e.files).find(t=>t.uri===a),r=await G(e,a);if(!i)throw new Error("no file found");const n=await i.blob();return{body:n,params:{headers:{...n.type&&{"Content-Type":n.type},...i.encodingFormat&&{"Content-Type":i.encodingFormat},...r.mediaType&&{"Content-Type":r.mediaType}}}}},G=async(e,a)=>{var n,t;const r=await((n=F(e).data)==null?void 0:n.string());if(r){const o=new p.XmlDocument(r);return{mediaType:(t=C(o).find(d=>a.endsWith(d.href)))==null?void 0:t.mediaType}}return{mediaType:K(a)}},K=e=>{if(e.endsWith(".css"))return"text/css; charset=UTF-8";if(e.endsWith(".jpg"))return"image/jpg";if(e.endsWith(".xhtml"))return"application/xhtml+xml";if(e.endsWith(".mp4"))return"video/mp4";if(e.endsWith(".svg"))return"image/svg+xml"},Y=({archive:e,baseUrl:a})=>async i=>{var n;const r=Object.values(e.files).filter(t=>!t.dir);return{filename:e.filename,nav:{toc:[]},title:((n=e.files.find(({dir:t})=>t))==null?void 0:n.basename.replace(/\/$/,""))||"",renditionLayout:"pre-paginated",renditionSpread:"auto",readingDirection:"ltr",spineItems:r.map((t,o)=>({id:`${o}.${t.basename}`,href:`${a}${t.uri}`,renditionLayout:"pre-paginated",progressionWeight:1/r.length,pageSpreadLeft:void 0,pageSpreadRight:void 0,mediaType:t.encodingFormat})),items:r.map((t,o)=>({id:`${o}.${t.basename}`,href:`${a}${t.uri}`}))}},Q=({archive:e,baseUrl:a})=>async i=>{var s;const r=e.files.find(d=>d.basename.toLowerCase()==="comicinfo.xml");if(!r)return i;const n=await r.string(),o=((s=new p.XmlDocument(n).childNamed("Manga"))==null?void 0:s.val)||"unknown";return{...i,spineItems:i.spineItems.filter(d=>d.id.toLowerCase()!=="comicinfo.xml"),readingDirection:o==="YesAndRightToLeft"?"rtl":"ltr"}},Z=e=>{const a=e.descendantWithPath("head.meta");return!!(a&&a.attr.name==="viewport")},E=e=>e.reduce(async(a,i)=>{if(!await a||!y.isXmlBasedMimeType({mimeType:i.encodingFormat,uri:i.uri}))return!1;const n=await i.string();return n?Z(new p.XmlDocument(n)):!1},Promise.resolve(!0)),ee=({archive:e,baseUrl:a})=>async i=>{if(i.renditionLayout==="reflowable"&&i.spineItems.every(n=>n.renditionLayout==="reflowable")){const n=await k({archive:e});if(await E(n))return{...i,spineItems:i.spineItems.map(o=>({...o,renditionLayout:"pre-paginated"})),renditionLayout:"pre-paginated"}}return i},te={filename:"",items:[],nav:{toc:[]},readingDirection:"ltr",renditionLayout:"pre-paginated",renditionSpread:"auto",spineItems:[],title:""},ne=async(e,{baseUrl:a=""}={})=>{const i=[Y({archive:e,baseUrl:a}),U({archive:e,baseUrl:a}),ee({archive:e,baseUrl:a}),Q({archive:e,baseUrl:a})];try{const r=await i.reduce(async(n,t)=>await t(await n),Promise.resolve(te));return b.log("Generated manifest",r),r}catch(r){throw b.error(r),r}},w=e=>e.substring(e.lastIndexOf("/")+1)||e,re=async(e,a)=>{const i=`
1
+ (function(m,p){typeof exports=="object"&&typeof module<"u"?p(exports,require("xmldoc"),require("@prose-reader/shared")):typeof define=="function"&&define.amd?define(["exports","xmldoc","@prose-reader/shared"],p):(m=typeof globalThis<"u"?globalThis:m||self,p(m["prose-streamer"]={},m.xmldoc,m["@prose-reader/shared"]))})(this,function(m,p,y){"use strict";const I=(e,{opfBasePath:i,baseUrl:a})=>{const r={contents:[],path:"",href:"",title:""};let n=e.childNamed("span")||e.childNamed("a");r.title=(n==null?void 0:n.attr.title)||(n==null?void 0:n.val.trim())||r.title;let t=n==null?void 0:n.name;t!=="a"&&(n=e.descendantWithPath(`${t}.a`),n&&(t=n.name.toLowerCase())),t==="a"&&(n!=null&&n.attr.href)&&(r.path=y.urlJoin(i,n.attr.href),r.href=y.urlJoin(a,i,n.attr.href));const o=e.childNamed("ol");if(o){const s=o.childrenNamed("li");s&&s.length>0&&(r.contents=s.map(d=>I(d,{opfBasePath:i,baseUrl:a})))}return r},R=(e,{opfBasePath:i,baseUrl:a})=>{var t,o;const r=[];let n;return e.descendantWithPath("body.nav.ol")?n=(t=e.descendantWithPath("body.nav.ol"))==null?void 0:t.children:e.descendantWithPath("body.section.nav.ol")&&(n=(o=e.descendantWithPath("body.section.nav.ol"))==null?void 0:o.children),n&&n.length>0&&n.filter(s=>s.name==="li").forEach(s=>r.push(I(s,{opfBasePath:i,baseUrl:a}))),r},B=async(e,i,{opfBasePath:a,baseUrl:r})=>{var t;const n=(t=e.childNamed("manifest"))==null?void 0:t.childrenNamed("item").find(o=>o.attr.properties==="nav");if(n){const o=Object.values(i.files).find(s=>s.uri.endsWith(n.attr.href||""));if(o){const s=new p.XmlDocument(await o.string());return R(s,{opfBasePath:a,baseUrl:r})}}},S=(e,{opfBasePath:i,baseUrl:a,prefix:r})=>{var s,d;const n=((s=e==null?void 0:e.childNamed(`${r}content`))==null?void 0:s.attr.src)||"",t={title:((d=e==null?void 0:e.descendantWithPath(`${r}navLabel.${r}text`))==null?void 0:d.val)||"",path:y.urlJoin(i,n),href:y.urlJoin(a,i,n),contents:[]},o=e.childrenNamed(`${r}navPoint`);return o&&o.length>0&&(t.contents=o.map(u=>S(u,{opfBasePath:i,baseUrl:a,prefix:r}))),t},J=(e,{opfBasePath:i,baseUrl:a})=>{var o;const r=[],n=e.name;let t="";return n.indexOf(":")!==-1&&(t=n.split(":")[0]+":"),(o=e.childNamed(`${t}navMap`))==null||o.childrenNamed(`${t}navPoint`).forEach(s=>r.push(S(s,{opfBasePath:i,baseUrl:a,prefix:t}))),r},H=async({opfData:e,opfBasePath:i,baseUrl:a,archive:r})=>{var o;const n=e.childNamed("spine"),t=n&&n.attr.toc;if(t){const s=(o=e.childNamed("manifest"))==null?void 0:o.childrenNamed("item").find(d=>d.attr.id===t);if(s){const d=`${i}${i===""?"":"/"}${s.attr.href}`,u=Object.values(r.files).find(f=>f.uri.endsWith(d));if(u){const f=new p.XmlDocument(await u.string());return J(f,{opfBasePath:i,baseUrl:a})}}}},V=async(e,i,{baseUrl:a})=>{const{basePath:r}=F(i)||{},n=await H({opfData:e,opfBasePath:r,archive:i,baseUrl:a});return n||await B(e,i,{opfBasePath:r,baseUrl:a})},q=async e=>{const i={renditionLayout:void 0};return await Promise.all(e.files.map(async a=>{var r,n;if(a.uri.endsWith("com.kobobooks.display-options.xml")){const o=(r=new p.XmlDocument(await a.string()).childNamed("platform"))==null?void 0:r.childNamed("option");((n=o==null?void 0:o.attr)==null?void 0:n.name)==="fixed-layout"&&o.val==="true"&&(i.renditionLayout="pre-paginated")}})),i};let v=!1;const b={enable:e=>{v=e},log:(...e)=>{v&&console.log("[prose-reader-streamer]",...e)},warn:(...e)=>{v&&console.warn("[prose-reader-streamer]",...e)},error:(...e)=>{console.error(...e)},time:e=>{v&&console.time(`[prose-reader-streamer] [metric] ${e}`)},timeEnd:e=>{v&&console.timeEnd(`[prose-reader-streamer] [metric] ${e}`)},metric:(e,i=1/0)=>{const a=typeof e=="number"?e:e.duration;v&&(e.duration<=i?console.log("[prose-reader-streamer] [metric] ",`${e.name} took ${a}ms`):console.warn("[prose-reader-streamer] [metric] ",`${e.name} took ${e.duration}ms which is above the ${i}ms target for this function`))},measurePerformance:(e,i=10,a)=>(...r)=>{const n=performance.now(),t=a(...r);if(t&&t.then)return t.then(s=>{const d=performance.now();return b.metric({name:e,duration:d-n},i),s});const o=performance.now();return b.metric({name:e,duration:o-n},i),t}},F=e=>{const a=Object.values(e.files).filter(r=>!r.dir).find(r=>r.uri.endsWith(".opf"));return{data:a,basePath:(a==null?void 0:a.uri.substring(0,a.uri.lastIndexOf("/")))||""}},k=async({archive:e})=>{const{data:i,basePath:a}=F(e)||{},r=await(i==null?void 0:i.string());if(!r)return[];const n=new p.XmlDocument(r),t=n.childNamed("manifest"),o=n.childNamed("spine"),s=o==null?void 0:o.childrenNamed("itemref").map(f=>f.attr.idref),d=(t==null?void 0:t.childrenNamed("item").filter(f=>s.includes(f.attr.id||"")))||[];return e.files.filter(f=>d.find(h=>a?`${a}/${h.attr.href}`===f.uri:`${h.attr.href}`===f.uri))},C=e=>{var a;const i=e.childNamed("manifest");return((a=i==null?void 0:i.childrenNamed("item"))==null?void 0:a.map(r=>({href:r.attr.href||"",id:r.attr.id||"",mediaType:r.attr["media-type"]})))||[]},U=({archive:e,baseUrl:i})=>async a=>{var z;const{data:r,basePath:n}=F(e)||{},t=await q(e);if(!r)return a;const o=await r.string();b.log(o,t);const s=new p.XmlDocument(o),d=await V(s,e,{baseUrl:i})||[],u=s.childNamed("metadata"),f=s.childNamed("manifest"),h=s.childNamed("spine"),$=s.childNamed("guide"),N=u==null?void 0:u.childNamed("dc:title"),T=(u==null?void 0:u.childrenNamed("meta"))||[],x=T.find(l=>l.attr.property==="rendition:layout"),A=T.find(l=>l.attr.property==="rendition:flow"),L=T.find(l=>l.attr.property==="rendition:spread"),P=x==null?void 0:x.val,de=A==null?void 0:A.val,le=L==null?void 0:L.val,me=(N==null?void 0:N.val)||((z=e.files.find(({dir:l})=>l))==null?void 0:z.basename)||"",fe=h==null?void 0:h.attr["page-progression-direction"],pe=(await k({archive:e})).reduce((l,c)=>c.size+l,0);return{filename:e.filename,nav:{toc:d},renditionLayout:P||t.renditionLayout||"reflowable",renditionFlow:de||"auto",renditionSpread:le,title:me,readingDirection:fe||"ltr",spineItems:(h==null?void 0:h.childrenNamed("itemref").map(l=>{var X,j,M;const c=f==null?void 0:f.childrenNamed("item").find(g=>g.attr.id===(l==null?void 0:l.attr.idref)),ue=(c==null?void 0:c.attr.href)||"",D=((X=l==null?void 0:l.attr.properties)==null?void 0:X.split(" "))||[],he=((j=e.files.find(g=>g.uri.endsWith(ue)))==null?void 0:j.size)||0,O=i??"";return{id:(c==null?void 0:c.attr.id)||"",href:(M=c==null?void 0:c.attr.href)!=null&&M.startsWith("https://")?c==null?void 0:c.attr.href:n?`${O}${n}/${c==null?void 0:c.attr.href}`:`${O}${c==null?void 0:c.attr.href}`,renditionLayout:P||"reflowable",...D.find(g=>g==="rendition:layout-reflowable")&&{renditionLayout:"reflowable"},progressionWeight:he/pe,pageSpreadLeft:D.some(g=>g==="page-spread-left")||void 0,pageSpreadRight:D.some(g=>g==="page-spread-right")||void 0,mediaType:c==null?void 0:c.attr["media-type"]}}))||[],items:C(s),guide:$==null?void 0:$.childrenNamed("reference").map(l=>({href:l.attr.href||"",title:l.attr.title||"",type:l.attr.type}))}},_=async(e,i)=>{const a=Object.values(e.files).find(t=>t.uri===i),r=await G(e,i);if(!a)throw new Error("no file found");const n=await a.blob();return{body:n,params:{headers:{...n.type&&{"Content-Type":n.type},...a.encodingFormat&&{"Content-Type":a.encodingFormat},...r.mediaType&&{"Content-Type":r.mediaType}}}}},G=async(e,i)=>{var n,t;const r=await((n=F(e).data)==null?void 0:n.string());if(r){const o=new p.XmlDocument(r);return{mediaType:(t=C(o).find(d=>i.endsWith(d.href)))==null?void 0:t.mediaType}}return{mediaType:K(i)}},K=e=>{if(e.endsWith(".css"))return"text/css; charset=UTF-8";if(e.endsWith(".jpg"))return"image/jpg";if(e.endsWith(".xhtml"))return"application/xhtml+xml";if(e.endsWith(".mp4"))return"video/mp4";if(e.endsWith(".svg"))return"image/svg+xml"},Y=({archive:e,baseUrl:i})=>async a=>{var n;const r=Object.values(e.files).filter(t=>!t.dir);return{filename:e.filename,nav:{toc:[]},title:((n=e.files.find(({dir:t})=>t))==null?void 0:n.basename.replace(/\/$/,""))||"",renditionLayout:"pre-paginated",renditionSpread:"auto",readingDirection:"ltr",spineItems:r.map((t,o)=>({id:`${o}.${t.basename}`,href:`${i}${t.uri}`,renditionLayout:"pre-paginated",progressionWeight:1/r.length,pageSpreadLeft:void 0,pageSpreadRight:void 0,mediaType:t.encodingFormat})),items:r.map((t,o)=>({id:`${o}.${t.basename}`,href:`${i}${t.uri}`}))}},Q=({archive:e,baseUrl:i})=>async a=>{var s;const r=e.files.find(d=>d.basename.toLowerCase()==="comicinfo.xml");if(!r)return a;const n=await r.string(),o=((s=new p.XmlDocument(n).childNamed("Manga"))==null?void 0:s.val)||"unknown";return{...a,spineItems:a.spineItems.filter(d=>d.id.toLowerCase()!=="comicinfo.xml"),readingDirection:o==="YesAndRightToLeft"?"rtl":"ltr"}},Z=e=>{var a;const i=(a=e.descendantWithPath("head"))==null?void 0:a.childrenNamed("meta").find(r=>r.attr.name==="viewport");return!!(i&&i.attr.name==="viewport")},E=e=>e.reduce(async(i,a)=>{if(!await i||!y.isXmlBasedMimeType({mimeType:a.encodingFormat,uri:a.uri}))return!1;const n=await a.string();return n?Z(new p.XmlDocument(n)):!1},Promise.resolve(!0)),ee=({archive:e,baseUrl:i})=>async a=>{if(a.renditionLayout==="reflowable"&&a.spineItems.every(n=>n.renditionLayout==="reflowable")){const n=await k({archive:e});if(await E(n))return{...a,spineItems:a.spineItems.map(o=>({...o,renditionLayout:"pre-paginated"})),renditionLayout:"pre-paginated"}}return a},te={filename:"",items:[],nav:{toc:[]},readingDirection:"ltr",renditionLayout:"pre-paginated",renditionSpread:"auto",spineItems:[],title:""},ne=async(e,{baseUrl:i=""}={})=>{const a=[Y({archive:e,baseUrl:i}),U({archive:e,baseUrl:i}),ee({archive:e,baseUrl:i}),Q({archive:e,baseUrl:i})];try{const r=await a.reduce(async(n,t)=>await t(await n),Promise.resolve(te));return b.log("Generated manifest",r),r}catch(r){throw b.error(r),r}},w=e=>e.substring(e.lastIndexOf("/")+1)||e,re=async(e,i)=>{const a=`
2
2
  <?xml version="1.0" encoding="UTF-8"?><package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid">
3
3
  <metadata>
4
- <meta property="rendition:layout">${a!=null&&a.useRenditionFlow?"reflowable":"pre-paginated"}</meta>
5
- ${a!=null&&a.useRenditionFlow?'<meta property="rendition:flow">scrolled-continuous</meta>':""}
4
+ <meta property="rendition:layout">${i!=null&&i.useRenditionFlow?"reflowable":"pre-paginated"}</meta>
5
+ ${i!=null&&i.useRenditionFlow?'<meta property="rendition:flow">scrolled-continuous</meta>':""}
6
6
  </metadata>
7
7
  <manifest>
8
8
  ${e.map(t=>`<item id="${w(t)}" href="${t}" media-type="${y.detectMimeTypeFromName(t)}"/>`).join(`
@@ -13,7 +13,7 @@
13
13
  `)}
14
14
  </spine>
15
15
  </package>
16
- `,r=e.map(t=>({dir:!1,basename:w(t),encodingFormat:y.detectMimeTypeFromName(t),uri:t,size:100/e.length,base64:async()=>"",blob:async()=>new Blob,string:async()=>""}));return{filename:"",files:[{dir:!1,basename:"content.opf",uri:"content.opf",size:0,base64:async()=>i,blob:async()=>new Blob,string:async()=>i},...r]}},ae=async e=>new Promise(a=>{const i=new FileReader;i.readAsDataURL(e),i.onloadend=function(){const r=i.result;a(r)}}),ie=async(e,{mimeType:a,direction:i}={mimeType:"text/plain"})=>{const r=`
16
+ `,r=e.map(t=>({dir:!1,basename:w(t),encodingFormat:y.detectMimeTypeFromName(t),uri:t,size:100/e.length,base64:async()=>"",blob:async()=>new Blob,string:async()=>""}));return{filename:"",files:[{dir:!1,basename:"content.opf",uri:"content.opf",size:0,base64:async()=>a,blob:async()=>new Blob,string:async()=>a},...r]}},ae=async e=>new Promise(i=>{const a=new FileReader;a.readAsDataURL(e),a.onloadend=function(){const r=a.result;i(r)}}),ie=async(e,{mimeType:i,direction:a}={mimeType:"text/plain"})=>{const r=`
17
17
  <?xml version="1.0" encoding="UTF-8"?>
18
18
  <package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="ja" prefix="rendition: http://www.idpf.org/vocab/rendition/#"
19
19
  unique-identifier="ootuya-id">
@@ -24,9 +24,9 @@
24
24
  <manifest>
25
25
  <item id="p01" href="p01.txt" media-type="text/plain"/>
26
26
  </manifest>
27
- <spine page-progression-direction="${i??"ltr"}">
27
+ <spine page-progression-direction="${a??"ltr"}">
28
28
  <itemref idref="p01" />
29
29
  </spine>
30
30
  </package>
31
- `;return{filename:"content.txt",files:[{dir:!1,basename:w("generated.opf"),uri:"generated.opf",blob:async()=>new Blob([r]),string:async()=>r,base64:async()=>btoa(r),size:0},{dir:!1,basename:w("p01.txt"),uri:"p01.txt",blob:async()=>typeof e=="string"?new Blob([e]):e,string:async()=>typeof e=="string"?e:e.text(),base64:async()=>typeof e=="string"?btoa(e):ae(e),size:typeof e=="string"?e.length:e.size,encodingFormat:a}]}},W=(e,a)=>{var n;const i=e.split(/(\d+)/),r=a.split(/(\d+)/);for(let t=0,o=i.length;t<o;t++)if(i[t]!==r[t])return(n=i[t])!=null&&n.match(/\d/)?+(i[t]||"")-+(r[t]||""):(i[t]||"").localeCompare(r[t]||"");return 1},oe=async(e,{orderByAlpha:a,name:i}={})=>{let r=Object.values(e.files);a&&(r=r.sort((t,o)=>W(t.name,o.name)));const n={filename:i||"",files:r.map(t=>({dir:t.dir,basename:w(t.name),uri:t.name,blob:()=>t.async("blob"),string:()=>t.async("string"),base64:()=>t.async("base64"),...t.internalStream&&{stream:t.internalStream},size:t._data.uncompressedSize}))};return b.log("Generated archive",n),n},se=async(e,{orderByAlpha:a,name:i}={})=>{let r=e;return a&&(r=r.sort((n,t)=>W(n.name,t.name))),{filename:i||"",files:r.map(n=>({dir:n.isDir,basename:w(n.name),uri:n.name,blob:async()=>new Blob([await n.data()]),string:async()=>{const t=await n.data();return String.fromCharCode.apply(null,Array.from(new Uint16Array(t)))},base64:async()=>"",size:n.size}))}},ce=({enableReport:e}={})=>{b.enable(!!e)};m.configure=ce,m.createArchiveFromArrayBufferList=se,m.createArchiveFromJszip=oe,m.createArchiveFromText=ie,m.createArchiveFromUrls=re,m.generateManifestFromArchive=ne,m.generateResourceFromArchive=_,m.getArchiveOpfInfo=F,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})});
31
+ `;return{filename:"content.txt",files:[{dir:!1,basename:w("generated.opf"),uri:"generated.opf",blob:async()=>new Blob([r]),string:async()=>r,base64:async()=>btoa(r),size:0},{dir:!1,basename:w("p01.txt"),uri:"p01.txt",blob:async()=>typeof e=="string"?new Blob([e]):e,string:async()=>typeof e=="string"?e:e.text(),base64:async()=>typeof e=="string"?btoa(e):ae(e),size:typeof e=="string"?e.length:e.size,encodingFormat:i}]}},W=(e,i)=>{var n;const a=e.split(/(\d+)/),r=i.split(/(\d+)/);for(let t=0,o=a.length;t<o;t++)if(a[t]!==r[t])return(n=a[t])!=null&&n.match(/\d/)?+(a[t]||"")-+(r[t]||""):(a[t]||"").localeCompare(r[t]||"");return 1},oe=async(e,{orderByAlpha:i,name:a}={})=>{let r=Object.values(e.files);i&&(r=r.sort((t,o)=>W(t.name,o.name)));const n={filename:a||"",files:r.map(t=>({dir:t.dir,basename:w(t.name),uri:t.name,blob:()=>t.async("blob"),string:()=>t.async("string"),base64:()=>t.async("base64"),...t.internalStream&&{stream:t.internalStream},size:t._data.uncompressedSize}))};return b.log("Generated archive",n),n},se=async(e,{orderByAlpha:i,name:a}={})=>{let r=e;return i&&(r=r.sort((n,t)=>W(n.name,t.name))),{filename:a||"",files:r.map(n=>({dir:n.isDir,basename:w(n.name),uri:n.name,blob:async()=>new Blob([await n.data()]),string:async()=>{const t=await n.data();return String.fromCharCode.apply(null,Array.from(new Uint16Array(t)))},base64:async()=>"",size:n.size}))}},ce=({enableReport:e}={})=>{b.enable(!!e)};m.configure=ce,m.createArchiveFromArrayBufferList=se,m.createArchiveFromJszip=oe,m.createArchiveFromText=ie,m.createArchiveFromUrls=re,m.generateManifestFromArchive=ne,m.generateResourceFromArchive=_,m.getArchiveOpfInfo=F,Object.defineProperty(m,Symbol.toStringTag,{value:"Module"})});
32
32
  //# sourceMappingURL=prose-streamer.umd.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"prose-streamer.umd.cjs","sources":["../src/parsers/nav.ts","../src/parsers/kobo.ts","../src/report.ts","../src/archives/getArchiveOpfInfo.ts","../src/epub/getSpineItemFilesFromArchive.ts","../src/generators/manifest/hooks/epub.ts","../src/generators/resources.ts","../src/generators/manifest/hooks/default.ts","../src/generators/manifest/hooks/comicInfo.ts","../src/generators/manifest/hooks/epubOptimizer.ts","../src/generators/manifest/index.ts","../src/utils/uri.ts","../src/archives/createArchiveFromUrls.ts","../src/utils/blobToBAse64.ts","../src/archives/createArchiveFromText.ts","../src/utils/sortByTitleComparator.ts","../src/archives/createArchiveFromJszip.ts","../src/archives/createArchiveFromArrayBufferList.ts","../src/configure.ts"],"sourcesContent":["import xmldoc, { XmlElement } from \"xmldoc\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { urlJoin } from \"@prose-reader/shared\"\n\ntype Toc = Manifest[`nav`][`toc`]\ntype TocItem = Manifest[`nav`][`toc`][number]\n\nconst extractNavChapter = (li: XmlElement, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const chp: TocItem = {\n contents: [],\n path: ``,\n href: ``,\n title: ``\n }\n let contentNode = li.childNamed(`span`) || li.childNamed(`a`)\n chp.title = contentNode?.attr.title || contentNode?.val.trim() || chp.title\n let node = contentNode?.name\n if (node !== `a`) {\n contentNode = li.descendantWithPath(`${node}.a`)\n if (contentNode) {\n node = contentNode.name.toLowerCase()\n }\n }\n if (node === `a` && contentNode?.attr.href) {\n chp.path = urlJoin(opfBasePath, contentNode.attr.href)\n chp.href = urlJoin(baseUrl, opfBasePath, contentNode.attr.href)\n }\n const sublistNode = li.childNamed(`ol`)\n if (sublistNode) {\n const children = sublistNode.childrenNamed(`li`)\n if (children && children.length > 0) {\n chp.contents = children.map((child) => extractNavChapter(child, { opfBasePath, baseUrl }))\n }\n }\n\n return chp\n}\n\nconst buildTOCFromNav = (doc: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: Toc = []\n\n let navDataChildren\n if (doc.descendantWithPath(`body.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.nav.ol`)?.children\n } else if (doc.descendantWithPath(`body.section.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.section.nav.ol`)?.children\n }\n\n if (navDataChildren && navDataChildren.length > 0) {\n navDataChildren\n .filter((li) => (li as XmlElement).name === `li`)\n .forEach((li) => toc.push(extractNavChapter(li as XmlElement, { opfBasePath, baseUrl })))\n }\n\n return toc\n}\n\nconst parseTocFromNavPath = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }\n) => {\n // Try to detect if there is a nav item\n const navItem = opfXmlDoc\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((child) => child.attr.properties === `nav`)\n\n if (navItem) {\n const tocFile = Object.values(archive.files).find((item) => item.uri.endsWith(navItem.attr.href || ``))\n if (tocFile) {\n const doc = new xmldoc.XmlDocument(await tocFile.string())\n return buildTOCFromNav(doc, { opfBasePath, baseUrl })\n }\n }\n}\n\nconst mapNcxChapter = (\n point: xmldoc.XmlElement,\n { opfBasePath, baseUrl, prefix }: { opfBasePath: string; baseUrl: string; prefix: string }\n) => {\n const src = point?.childNamed(`${prefix}content`)?.attr.src || ``\n\n const out: TocItem = {\n title: point?.descendantWithPath(`${prefix}navLabel.${prefix}text`)?.val || ``,\n path: urlJoin(opfBasePath, src),\n href: urlJoin(baseUrl, opfBasePath, src),\n contents: []\n }\n const children = point.childrenNamed(`${prefix}navPoint`)\n if (children && children.length > 0) {\n out.contents = children.map((pt) => mapNcxChapter(pt, { opfBasePath, baseUrl, prefix }))\n }\n\n return out\n}\n\nconst buildTOCFromNCX = (ncxData: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: Manifest[`nav`][`toc`] = []\n\n const rootTagName = ncxData.name\n let prefix = ``\n if (rootTagName.indexOf(`:`) !== -1) {\n prefix = rootTagName.split(`:`)[0] + `:`\n }\n\n ncxData\n .childNamed(`${prefix}navMap`)\n ?.childrenNamed(`${prefix}navPoint`)\n .forEach((point) => toc.push(mapNcxChapter(point, { opfBasePath, baseUrl, prefix })))\n\n return toc\n}\n\nconst parseTocFromNcx = async ({\n opfData,\n opfBasePath,\n baseUrl,\n archive\n}: {\n opfData: xmldoc.XmlDocument\n opfBasePath: string\n archive: Archive\n baseUrl: string\n}) => {\n const spine = opfData.childNamed(`spine`)\n const ncxId = spine && spine.attr.toc\n\n if (ncxId) {\n const ncxItem = opfData\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === ncxId)\n\n if (ncxItem) {\n const ncxPath = `${opfBasePath}${opfBasePath === `` ? `` : `/`}${ncxItem.attr.href}`\n\n const file = Object.values(archive.files).find((item) => item.uri.endsWith(ncxPath))\n\n if (file) {\n const ncxData = new xmldoc.XmlDocument(await file.string())\n\n return buildTOCFromNCX(ncxData, { opfBasePath, baseUrl })\n }\n }\n }\n}\n\nexport const parseToc = async (opfXmlDoc: xmldoc.XmlDocument, archive: Archive, { baseUrl }: { baseUrl: string }) => {\n const { basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const tocFromNcx = await parseTocFromNcx({\n opfData: opfXmlDoc,\n opfBasePath,\n archive,\n baseUrl\n })\n\n if (tocFromNcx) {\n return tocFromNcx\n }\n\n return await parseTocFromNavPath(opfXmlDoc, archive, { opfBasePath, baseUrl })\n}\n","import xmldoc from \"xmldoc\"\nimport { Archive } from \"..\"\n\ntype KoboInformation = {\n renditionLayout?: `reflowable` | `pre-paginated` | undefined\n}\n\nexport const extractKoboInformationFromArchive = async (archive: Archive) => {\n const koboInformation: KoboInformation = {\n renditionLayout: undefined\n }\n\n await Promise.all(\n archive.files.map(async (file) => {\n if (file.uri.endsWith(`com.kobobooks.display-options.xml`)) {\n const opfXmlDoc = new xmldoc.XmlDocument(await file.string())\n const optionElement = opfXmlDoc.childNamed(`platform`)?.childNamed(`option`)\n if (optionElement?.attr?.name === `fixed-layout` && optionElement.val === `true`) {\n koboInformation.renditionLayout = `pre-paginated`\n }\n }\n })\n )\n\n return koboInformation\n}\n","let enabled = false\n\nexport const Report = {\n enable: (enable: boolean) => {\n enabled = enable\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.warn(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: (...data: any[]) => {\n // eslint-disable-next-line no-console\n console.error(...data)\n },\n time: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.time(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n timeEnd: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.timeEnd(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n metric: (performanceEntry: { name: string; duration: number }, targetDuration = Infinity) => {\n const duration = typeof performanceEntry === `number` ? performanceEntry : performanceEntry.duration\n if (enabled) {\n if (performanceEntry.duration <= targetDuration) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer] [metric] `, `${performanceEntry.name} took ${duration}ms`)\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${performanceEntry.duration}ms which is above the ${targetDuration}ms target for this function`\n )\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measurePerformance: <F extends (...args: any[]) => any>(name: string, targetDuration = 10, functionToMeasure: F) => {\n return (...args: Parameters<F>): ReturnType<F> => {\n const t0 = performance.now()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = functionToMeasure(...(args as any))\n\n if (response && response.then) {\n return response.then((res: any) => {\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n return res\n })\n }\n\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n\n return response\n }\n }\n}\n","import { Archive } from \"./types\"\n\nexport const getArchiveOpfInfo = (archive: Archive) => {\n const filesAsArray = Object.values(archive.files).filter((file) => !file.dir)\n const file = filesAsArray.find((file) => file.uri.endsWith(`.opf`))\n\n return {\n data: file,\n basePath: file?.uri.substring(0, file.uri.lastIndexOf(`/`)) || ``\n }\n}\n","import xmldoc from \"xmldoc\"\nimport { getArchiveOpfInfo } from \"../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../archives/types\"\n\nexport const getSpineItemFilesFromArchive = async ({ archive }: { archive: Archive }) => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const data = await opsFile?.string()\n\n if (!data) return []\n\n const _opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const manifestElm = _opfXmlDoc.childNamed(`manifest`)\n const spineElm = _opfXmlDoc.childNamed(`spine`)\n\n const spineItemIds = spineElm?.childrenNamed(`itemref`).map((item) => item.attr.idref) as string[]\n const manifestItemsFromSpine =\n manifestElm?.childrenNamed(`item`).filter((item) => spineItemIds.includes(item.attr.id || ``)) || []\n\n const archiveSpineItems = archive.files.filter((file) => {\n return manifestItemsFromSpine.find((item) => {\n if (!opfBasePath) return `${item.attr.href}` === file.uri\n return `${opfBasePath}/${item.attr.href}` === file.uri\n })\n })\n\n return archiveSpineItems\n}\n","import xmldoc from \"xmldoc\"\nimport { parseToc } from \"../../../parsers/nav\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { extractKoboInformationFromArchive } from \"../../../parsers/kobo\"\nimport { Report } from \"../../../report\"\nimport { Archive } from \"../../../archives/types\"\nimport { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\ntype SpineItemProperties = `rendition:layout-reflowable` | `page-spread-left` | `page-spread-right`\n\nexport const getItemsFromDoc = (doc: xmldoc.XmlDocument) => {\n const manifestElm = doc.childNamed(`manifest`)\n\n return (\n manifestElm?.childrenNamed(`item`)?.map((el) => ({\n href: el.attr.href || ``,\n id: el.attr.id || ``,\n mediaType: el.attr[`media-type`]\n })) || []\n )\n}\n\nexport const epubHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n const koboInformation = await extractKoboInformationFromArchive(archive)\n\n if (!opsFile) {\n return manifest\n }\n\n const data = await opsFile.string()\n\n Report.log(data, koboInformation)\n\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const toc = (await parseToc(opfXmlDoc, archive, { baseUrl })) || []\n\n const metadataElm = opfXmlDoc.childNamed(`metadata`)\n const manifestElm = opfXmlDoc.childNamed(`manifest`)\n const spineElm = opfXmlDoc.childNamed(`spine`)\n const guideElm = opfXmlDoc.childNamed(`guide`)\n const titleElm = metadataElm?.childNamed(`dc:title`)\n const metaElmChildren = metadataElm?.childrenNamed(`meta`) || []\n const metaElmWithRendition = metaElmChildren.find((meta) => meta.attr.property === `rendition:layout`)\n const metaElmWithRenditionFlow = metaElmChildren.find((meta) => meta.attr.property === `rendition:flow`)\n const metaElmWithRenditionSpread = metaElmChildren.find((meta) => meta.attr.property === `rendition:spread`)\n\n const publisherRenditionLayout = metaElmWithRendition?.val as `reflowable` | `pre-paginated` | undefined\n const publisherRenditionFlow = metaElmWithRenditionFlow?.val as\n | `scrolled-continuous`\n | `scrolled-doc`\n | `paginated`\n | `auto`\n | undefined\n const renditionSpread = metaElmWithRenditionSpread?.val as `auto` | undefined\n\n const title = titleElm?.val || archive.files.find(({ dir }) => dir)?.basename || ``\n const pageProgressionDirection = spineElm?.attr[`page-progression-direction`] as `ltr` | `rtl` | undefined\n\n const archiveSpineItems = await getSpineItemFilesFromArchive({ archive })\n\n const totalSize = archiveSpineItems.reduce((size, file) => file.size + size, 0)\n\n return {\n filename: archive.filename,\n nav: {\n toc\n },\n renditionLayout: publisherRenditionLayout || koboInformation.renditionLayout || `reflowable`,\n renditionFlow: publisherRenditionFlow || `auto`,\n renditionSpread,\n title,\n readingDirection: pageProgressionDirection || `ltr`,\n spineItems:\n spineElm?.childrenNamed(`itemref`).map((itemrefElm) => {\n const manifestItem = manifestElm?.childrenNamed(`item`).find((item) => item.attr.id === itemrefElm?.attr.idref)\n const href = manifestItem?.attr.href || ``\n const properties = (itemrefElm?.attr.properties?.split(` `) || []) as SpineItemProperties[]\n const itemSize = archive.files.find((file) => file.uri.endsWith(href))?.size || 0\n\n // we use base url or nothing (and stay relative)\n const hrefBaseUri = baseUrl ?? \"\"\n\n return {\n id: manifestItem?.attr.id || ``,\n href: manifestItem?.attr.href?.startsWith(`https://`)\n ? manifestItem?.attr.href\n : opfBasePath\n ? `${hrefBaseUri}${opfBasePath}/${manifestItem?.attr.href}`\n : `${hrefBaseUri}${manifestItem?.attr.href}`,\n renditionLayout: publisherRenditionLayout || `reflowable`,\n ...(properties.find((property) => property === `rendition:layout-reflowable`) && {\n renditionLayout: `reflowable`\n }),\n progressionWeight: itemSize / totalSize,\n pageSpreadLeft: properties.some((property) => property === `page-spread-left`) || undefined,\n pageSpreadRight: properties.some((property) => property === `page-spread-right`) || undefined,\n // size: itemSize\n mediaType: manifestItem?.attr[`media-type`]\n }\n }) || [],\n items: getItemsFromDoc(opfXmlDoc),\n guide: guideElm?.childrenNamed(`reference`).map((elm) => {\n return {\n href: elm.attr.href || ``,\n title: elm.attr.title || ``,\n type: elm.attr.type as NonNullable<Manifest[`guide`]>[number][`type`]\n }\n })\n }\n }\n","import xmldoc from \"xmldoc\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { getItemsFromDoc } from \"./manifest/hooks/epub\"\n\nexport const generateResourceFromArchive = async (archive: Archive, resourcePath: string) => {\n const file = Object.values(archive.files).find((file) => file.uri === resourcePath)\n\n const metadata = await getMetadata(archive, resourcePath)\n\n if (!file) {\n throw new Error(`no file found`)\n }\n\n const blob = await file.blob()\n\n // if (file.stream) {\n // const stream = file.stream()\n\n // console.log(file, stream)\n // stream.on(`data`, data => {\n // console.log(`data`, data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // console.log(`end`)\n // })\n\n // }\n\n // const stream = file.stream!()\n\n // const readableStream = new ReadableStream({\n // start(controller) {\n // function push() {\n // stream.on(`data`, data => {\n // controller.enqueue(data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // controller.close()\n // })\n\n // stream.resume()\n // }\n\n // push();\n // }\n // })\n\n return {\n body: blob,\n params: {\n headers: {\n ...(blob.type && {\n \"Content-Type\": blob.type\n }),\n ...(file.encodingFormat && {\n \"Content-Type\": file.encodingFormat\n }),\n ...(metadata.mediaType && {\n \"Content-Type\": metadata.mediaType\n })\n // 'Cache-Control': `no-cache, no-store, no-transform`\n }\n }\n }\n}\n\nconst getMetadata = async (archive: Archive, resourcePath: string) => {\n const opfInfo = getArchiveOpfInfo(archive)\n const data = await opfInfo.data?.string()\n\n if (data) {\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n const items = getItemsFromDoc(opfXmlDoc)\n\n return {\n mediaType: items.find((item) => resourcePath.endsWith(item.href))?.mediaType\n }\n }\n\n return {\n mediaType: getContentTypeFromExtension(resourcePath)\n }\n}\n\nconst getContentTypeFromExtension = (uri: string) => {\n if (uri.endsWith(`.css`)) {\n return `text/css; charset=UTF-8`\n }\n if (uri.endsWith(`.jpg`)) {\n return `image/jpg`\n }\n if (uri.endsWith(`.xhtml`)) {\n return `application/xhtml+xml`\n }\n if (uri.endsWith(`.mp4`)) {\n return `video/mp4`\n }\n if (uri.endsWith(`.svg`)) {\n return `image/svg+xml`\n }\n}\n","import { Manifest } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\n\nexport const defaultHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const files = Object.values(archive.files).filter((file) => !file.dir)\n\n return {\n filename: archive.filename,\n nav: {\n toc: []\n },\n title: archive.files.find(({ dir }) => dir)?.basename.replace(/\\/$/, ``) || ``,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n readingDirection: `ltr`,\n spineItems: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n renditionLayout: `pre-paginated`,\n progressionWeight: 1 / files.length,\n pageSpreadLeft: undefined,\n pageSpreadRight: undefined,\n mediaType: file.encodingFormat\n })),\n items: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`\n }))\n }\n }\n","import { Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\n\n/**\n * Handle archive which contains ComicInfo.xml. This is a meta file\n * used to define cbz, etc. I believe it comes from some sites or apps.\n */\nexport const comicInfoHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const comicInfoFile = archive.files.find((file) => file.basename.toLowerCase() === `comicinfo.xml`)\n\n if (!comicInfoFile) {\n return manifest\n }\n\n // @todo handle more meta\n const content = await comicInfoFile.string()\n const xmlDoc = new xmldoc.XmlDocument(content)\n\n const mangaVal = (xmlDoc.childNamed(`Manga`)?.val as `YesAndRightToLeft`) || `unknown`\n\n return {\n ...manifest,\n spineItems: manifest.spineItems.filter((item) => item.id.toLowerCase() !== `comicinfo.xml`),\n readingDirection: mangaVal === `YesAndRightToLeft` ? `rtl` : `ltr`\n }\n }\n","import { isXmlBasedMimeType, Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\nconst hasDocMetaViewport = (doc: xmldoc.XmlDocument) => {\n const metaElm = doc.descendantWithPath(\"head.meta\")\n\n return !!(metaElm && metaElm.attr.name === \"viewport\")\n}\n\nconst allFilesHaveViewportMeta = (files: Archive[\"files\"]) =>\n files.reduce(async (result, current) => {\n const _result = await result\n\n if (!_result) return false\n\n if (!isXmlBasedMimeType({ mimeType: current.encodingFormat, uri: current.uri })) {\n return false\n }\n\n const file = await current.string()\n\n if (!file) return false\n\n return hasDocMetaViewport(new xmldoc.XmlDocument(file))\n }, Promise.resolve(true))\n\nexport const epubOptimizerHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const bookIsFullReflowable =\n manifest.renditionLayout === \"reflowable\" && manifest.spineItems.every((item) => item.renditionLayout === \"reflowable\")\n\n if (bookIsFullReflowable) {\n const files = await getSpineItemFilesFromArchive({ archive })\n\n const hasAllViewport = await allFilesHaveViewportMeta(files)\n\n if (hasAllViewport) {\n return {\n ...manifest,\n spineItems: manifest.spineItems.map((item) => ({\n ...item,\n renditionLayout: \"pre-paginated\"\n })),\n renditionLayout: \"pre-paginated\"\n }\n }\n }\n\n return manifest\n }\n","import type { Manifest } from \"@prose-reader/shared\"\nimport { Report } from \"../../report\"\nimport { Archive } from \"../../archives/types\"\nimport { defaultHook } from \"./hooks/default\"\nimport { epubHook } from \"./hooks/epub\"\nimport { comicInfoHook } from \"./hooks/comicInfo\"\nimport { epubOptimizerHook } from \"./hooks/epubOptimizer\"\n\nconst baseManifest: Manifest = {\n filename: ``,\n items: [],\n nav: {\n toc: []\n },\n readingDirection: `ltr`,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n spineItems: [],\n title: ``\n}\n\nexport const generateManifestFromArchive = async (archive: Archive, { baseUrl = `` }: { baseUrl?: string } = {}) => {\n const hooks = [\n defaultHook({ archive, baseUrl }),\n epubHook({ archive, baseUrl }),\n epubOptimizerHook({ archive, baseUrl }),\n comicInfoHook({ archive, baseUrl })\n ]\n\n try {\n const manifest = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(baseManifest))\n\n Report.log(\"Generated manifest\", manifest)\n\n return manifest\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n","export const getUriBasename = (uri: string) => uri.substring(uri.lastIndexOf(`/`) + 1) || uri\n","import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromUrls = async (urls: string[], options?: { useRenditionFlow: boolean }): Promise<Archive> => {\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">${options?.useRenditionFlow ? `reflowable` : `pre-paginated`}</meta>\n ${options?.useRenditionFlow ? `<meta property=\"rendition:flow\">scrolled-continuous</meta>` : ``}\n </metadata>\n <manifest>\n ${urls\n .map((url) => `<item id=\"${getUriBasename(url)}\" href=\"${url}\" media-type=\"${detectMimeTypeFromName(url)}\"/>`)\n .join(`\\n`)}\n </manifest>\n <spine>\n ${urls.map((url) => `<itemref idref=\"${getUriBasename(url)}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const filesFromUrl: Archive[`files`] = urls.map((url) => ({\n dir: false,\n basename: getUriBasename(url),\n encodingFormat: detectMimeTypeFromName(url),\n uri: url,\n size: 100 / urls.length,\n base64: async () => ``,\n blob: async () => new Blob(),\n string: async () => ``\n }))\n\n const opfFile: Archive[`files`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n base64: async () => opfFileData,\n blob: async () => new Blob(),\n string: async () => opfFileData\n }\n\n return {\n filename: ``,\n files: [opfFile, ...filesFromUrl]\n }\n}\n","export const blobToBase64 = async (blob: Blob) =>\n new Promise<string>((resolve) => {\n const reader = new FileReader()\n reader.readAsDataURL(blob)\n reader.onloadend = function () {\n const base64data = reader.result as string\n resolve(base64data)\n }\n })\n","import { blobToBase64 } from \"../utils/blobToBAse64\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * Useful to create archive from txt content\n */\nexport const createArchiveFromText = async (\n content: string | Blob,\n {\n mimeType,\n direction\n }: {\n direction?: `ltr` | `rtl`\n mimeType?: string\n } = { mimeType: \"text/plain\" }\n) => {\n const txtOpfContent = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" xml:lang=\"ja\" prefix=\"rendition: http://www.idpf.org/vocab/rendition/#\"\n unique-identifier=\"ootuya-id\">\n <metadata xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\">\n <meta property=\"rendition:layout\">reflowable</meta>\n </metadata>\n <manifest>\n <item id=\"p01\" href=\"p01.txt\" media-type=\"text/plain\"/>\n </manifest>\n <spine page-progression-direction=\"${direction ?? `ltr`}\">\n <itemref idref=\"p01\" />\n </spine>\n </package>\n `\n\n const archive: Archive = {\n filename: `content.txt`,\n files: [\n {\n dir: false,\n basename: getUriBasename(`generated.opf`),\n uri: `generated.opf`,\n blob: async () => new Blob([txtOpfContent]),\n string: async () => txtOpfContent,\n base64: async () => btoa(txtOpfContent),\n size: 0\n },\n {\n dir: false,\n basename: getUriBasename(`p01.txt`),\n uri: `p01.txt`,\n blob: async () => {\n if (typeof content === `string`) return new Blob([content])\n return content\n },\n string: async () => {\n if (typeof content === `string`) return content\n return content.text()\n },\n base64: async () => {\n if (typeof content === `string`) return btoa(content)\n return blobToBase64(content)\n },\n size: typeof content === `string` ? content.length : content.size,\n encodingFormat: mimeType\n }\n ]\n }\n\n return archive\n}\n","export const sortByTitleComparator = (a: string, b: string) => {\n const alist = a.split(/(\\d+)/)\n const blist = b.split(/(\\d+)/)\n\n for (let i = 0, len = alist.length; i < len; i++) {\n if (alist[i] !== blist[i]) {\n if (alist[i]?.match(/\\d/)) {\n return +(alist[i] || ``) - +(blist[i] || ``)\n } else {\n return (alist[i] || ``).localeCompare(blist[i] || ``)\n }\n }\n }\n\n return 1\n}\n","import { Report } from \"../report\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive, StreamResult } from \"./types\"\n\ninterface OutputByType {\n base64: string\n string: string\n text: string\n binarystring: string\n array: number[]\n uint8array: Uint8Array\n arraybuffer: ArrayBuffer\n blob: Blob\n nodebuffer: Buffer\n}\n\ntype OutputType = keyof OutputByType\ninterface JSZipObject {\n name: string\n dir: boolean\n date: Date\n comment: string\n unixPermissions: number | string | null\n dosPermissions: number | null\n async<T extends OutputType>(type: T): Promise<OutputByType[T]>\n // nodeStream(type?: `nodebuffer`): NodeJS.ReadableStream;\n internalStream?: (type?: `uint8array`) => StreamResult\n}\n\ninterface JSZip {\n files: { [key: string]: JSZipObject }\n}\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {}\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n const archive = {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.dir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: () => file.async(`blob`),\n string: () => file.async(`string`),\n base64: () => file.async(`base64`),\n ...(file.internalStream && {\n stream: file.internalStream\n }),\n // this is private API\n // @ts-ignore\n size: file._data.uncompressedSize\n }))\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","import { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\nexport const createArchiveFromArrayBufferList = async (\n list: {\n isDir: boolean\n name: string\n size: number\n data: () => Promise<ArrayBuffer>\n }[],\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {}\n): Promise<Archive> => {\n let files = list\n\n if (orderByAlpha) {\n files = files.sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.isDir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: async () => new Blob([await file.data()]),\n string: async () => {\n const data = await file.data()\n return String.fromCharCode.apply(null, Array.from(new Uint16Array(data)))\n },\n base64: async () => {\n // @todo not used for now, lets implement it later if needed\n return ``\n },\n size: file.size\n }))\n }\n}\n","import { Report } from \"./report\"\n\nexport const configure = ({ enableReport }: { enableReport?: boolean } = {}) => {\n Report.enable(!!enableReport)\n}\n"],"names":["extractNavChapter","li","opfBasePath","baseUrl","chp","contentNode","node","urlJoin","sublistNode","children","child","buildTOCFromNav","doc","toc","navDataChildren","_a","_b","parseTocFromNavPath","opfXmlDoc","archive","navItem","tocFile","item","xmldoc","mapNcxChapter","point","prefix","src","out","pt","buildTOCFromNCX","ncxData","rootTagName","parseTocFromNcx","opfData","spine","ncxId","ncxItem","ncxPath","file","parseToc","getArchiveOpfInfo","tocFromNcx","extractKoboInformationFromArchive","koboInformation","optionElement","enabled","Report","enable","data","label","performanceEntry","targetDuration","duration","name","functionToMeasure","args","t0","response","res","t1","getSpineItemFilesFromArchive","opsFile","_opfXmlDoc","manifestElm","spineElm","spineItemIds","manifestItemsFromSpine","getItemsFromDoc","el","epubHook","manifest","metadataElm","guideElm","titleElm","metaElmChildren","metaElmWithRendition","meta","metaElmWithRenditionFlow","metaElmWithRenditionSpread","publisherRenditionLayout","publisherRenditionFlow","renditionSpread","title","dir","pageProgressionDirection","totalSize","size","itemrefElm","manifestItem","href","properties","itemSize","hrefBaseUri","_c","property","elm","generateResourceFromArchive","resourcePath","metadata","getMetadata","blob","getContentTypeFromExtension","uri","defaultHook","files","index","comicInfoHook","comicInfoFile","content","mangaVal","hasDocMetaViewport","metaElm","allFilesHaveViewportMeta","result","current","isXmlBasedMimeType","epubOptimizerHook","baseManifest","generateManifestFromArchive","hooks","gen","e","getUriBasename","createArchiveFromUrls","urls","options","opfFileData","url","detectMimeTypeFromName","filesFromUrl","blobToBase64","resolve","reader","base64data","createArchiveFromText","mimeType","direction","txtOpfContent","sortByTitleComparator","a","b","alist","blist","i","len","createArchiveFromJszip","jszip","orderByAlpha","createArchiveFromArrayBufferList","list","configure","enableReport"],"mappings":"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"}
1
+ {"version":3,"file":"prose-streamer.umd.cjs","sources":["../src/parsers/nav.ts","../src/parsers/kobo.ts","../src/report.ts","../src/archives/getArchiveOpfInfo.ts","../src/epub/getSpineItemFilesFromArchive.ts","../src/generators/manifest/hooks/epub.ts","../src/generators/resources.ts","../src/generators/manifest/hooks/default.ts","../src/generators/manifest/hooks/comicInfo.ts","../src/generators/manifest/hooks/epubOptimizer.ts","../src/generators/manifest/index.ts","../src/utils/uri.ts","../src/archives/createArchiveFromUrls.ts","../src/utils/blobToBAse64.ts","../src/archives/createArchiveFromText.ts","../src/utils/sortByTitleComparator.ts","../src/archives/createArchiveFromJszip.ts","../src/archives/createArchiveFromArrayBufferList.ts","../src/configure.ts"],"sourcesContent":["import xmldoc, { XmlElement } from \"xmldoc\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { urlJoin } from \"@prose-reader/shared\"\n\ntype Toc = Manifest[`nav`][`toc`]\ntype TocItem = Manifest[`nav`][`toc`][number]\n\nconst extractNavChapter = (li: XmlElement, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const chp: TocItem = {\n contents: [],\n path: ``,\n href: ``,\n title: ``,\n }\n let contentNode = li.childNamed(`span`) || li.childNamed(`a`)\n chp.title = contentNode?.attr.title || contentNode?.val.trim() || chp.title\n let node = contentNode?.name\n if (node !== `a`) {\n contentNode = li.descendantWithPath(`${node}.a`)\n if (contentNode) {\n node = contentNode.name.toLowerCase()\n }\n }\n if (node === `a` && contentNode?.attr.href) {\n chp.path = urlJoin(opfBasePath, contentNode.attr.href)\n chp.href = urlJoin(baseUrl, opfBasePath, contentNode.attr.href)\n }\n const sublistNode = li.childNamed(`ol`)\n if (sublistNode) {\n const children = sublistNode.childrenNamed(`li`)\n if (children && children.length > 0) {\n chp.contents = children.map((child) => extractNavChapter(child, { opfBasePath, baseUrl }))\n }\n }\n\n return chp\n}\n\nconst buildTOCFromNav = (doc: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: Toc = []\n\n let navDataChildren\n if (doc.descendantWithPath(`body.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.nav.ol`)?.children\n } else if (doc.descendantWithPath(`body.section.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.section.nav.ol`)?.children\n }\n\n if (navDataChildren && navDataChildren.length > 0) {\n navDataChildren\n .filter((li) => (li as XmlElement).name === `li`)\n .forEach((li) => toc.push(extractNavChapter(li as XmlElement, { opfBasePath, baseUrl })))\n }\n\n return toc\n}\n\nconst parseTocFromNavPath = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }\n) => {\n // Try to detect if there is a nav item\n const navItem = opfXmlDoc\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((child) => child.attr.properties === `nav`)\n\n if (navItem) {\n const tocFile = Object.values(archive.files).find((item) => item.uri.endsWith(navItem.attr.href || ``))\n if (tocFile) {\n const doc = new xmldoc.XmlDocument(await tocFile.string())\n return buildTOCFromNav(doc, { opfBasePath, baseUrl })\n }\n }\n}\n\nconst mapNcxChapter = (\n point: xmldoc.XmlElement,\n { opfBasePath, baseUrl, prefix }: { opfBasePath: string; baseUrl: string; prefix: string }\n) => {\n const src = point?.childNamed(`${prefix}content`)?.attr.src || ``\n\n const out: TocItem = {\n title: point?.descendantWithPath(`${prefix}navLabel.${prefix}text`)?.val || ``,\n path: urlJoin(opfBasePath, src),\n href: urlJoin(baseUrl, opfBasePath, src),\n contents: [],\n }\n const children = point.childrenNamed(`${prefix}navPoint`)\n if (children && children.length > 0) {\n out.contents = children.map((pt) => mapNcxChapter(pt, { opfBasePath, baseUrl, prefix }))\n }\n\n return out\n}\n\nconst buildTOCFromNCX = (ncxData: xmldoc.XmlDocument, { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string }) => {\n const toc: Manifest[`nav`][`toc`] = []\n\n const rootTagName = ncxData.name\n let prefix = ``\n if (rootTagName.indexOf(`:`) !== -1) {\n prefix = rootTagName.split(`:`)[0] + `:`\n }\n\n ncxData\n .childNamed(`${prefix}navMap`)\n ?.childrenNamed(`${prefix}navPoint`)\n .forEach((point) => toc.push(mapNcxChapter(point, { opfBasePath, baseUrl, prefix })))\n\n return toc\n}\n\nconst parseTocFromNcx = async ({\n opfData,\n opfBasePath,\n baseUrl,\n archive,\n}: {\n opfData: xmldoc.XmlDocument\n opfBasePath: string\n archive: Archive\n baseUrl: string\n}) => {\n const spine = opfData.childNamed(`spine`)\n const ncxId = spine && spine.attr.toc\n\n if (ncxId) {\n const ncxItem = opfData\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === ncxId)\n\n if (ncxItem) {\n const ncxPath = `${opfBasePath}${opfBasePath === `` ? `` : `/`}${ncxItem.attr.href}`\n\n const file = Object.values(archive.files).find((item) => item.uri.endsWith(ncxPath))\n\n if (file) {\n const ncxData = new xmldoc.XmlDocument(await file.string())\n\n return buildTOCFromNCX(ncxData, { opfBasePath, baseUrl })\n }\n }\n }\n}\n\nexport const parseToc = async (opfXmlDoc: xmldoc.XmlDocument, archive: Archive, { baseUrl }: { baseUrl: string }) => {\n const { basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const tocFromNcx = await parseTocFromNcx({\n opfData: opfXmlDoc,\n opfBasePath,\n archive,\n baseUrl,\n })\n\n if (tocFromNcx) {\n return tocFromNcx\n }\n\n return await parseTocFromNavPath(opfXmlDoc, archive, { opfBasePath, baseUrl })\n}\n","import xmldoc from \"xmldoc\"\nimport { Archive } from \"..\"\n\ntype KoboInformation = {\n renditionLayout?: `reflowable` | `pre-paginated` | undefined\n}\n\nexport const extractKoboInformationFromArchive = async (archive: Archive) => {\n const koboInformation: KoboInformation = {\n renditionLayout: undefined,\n }\n\n await Promise.all(\n archive.files.map(async (file) => {\n if (file.uri.endsWith(`com.kobobooks.display-options.xml`)) {\n const opfXmlDoc = new xmldoc.XmlDocument(await file.string())\n const optionElement = opfXmlDoc.childNamed(`platform`)?.childNamed(`option`)\n if (optionElement?.attr?.name === `fixed-layout` && optionElement.val === `true`) {\n koboInformation.renditionLayout = `pre-paginated`\n }\n }\n })\n )\n\n return koboInformation\n}\n","let enabled = false\n\nexport const Report = {\n enable: (enable: boolean) => {\n enabled = enable\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.warn(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: (...data: any[]) => {\n // eslint-disable-next-line no-console\n console.error(...data)\n },\n time: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.time(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n timeEnd: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.timeEnd(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n metric: (performanceEntry: { name: string; duration: number }, targetDuration = Infinity) => {\n const duration = typeof performanceEntry === `number` ? performanceEntry : performanceEntry.duration\n if (enabled) {\n if (performanceEntry.duration <= targetDuration) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer] [metric] `, `${performanceEntry.name} took ${duration}ms`)\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${performanceEntry.duration}ms which is above the ${targetDuration}ms target for this function`\n )\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measurePerformance: <F extends (...args: any[]) => any>(name: string, targetDuration = 10, functionToMeasure: F) => {\n return (...args: Parameters<F>): ReturnType<F> => {\n const t0 = performance.now()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = functionToMeasure(...(args as any))\n\n if (response && response.then) {\n return response.then((res: any) => {\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n return res\n })\n }\n\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n\n return response\n }\n },\n}\n","import { Archive } from \"./types\"\n\nexport const getArchiveOpfInfo = (archive: Archive) => {\n const filesAsArray = Object.values(archive.files).filter((file) => !file.dir)\n const file = filesAsArray.find((file) => file.uri.endsWith(`.opf`))\n\n return {\n data: file,\n basePath: file?.uri.substring(0, file.uri.lastIndexOf(`/`)) || ``,\n }\n}\n","import xmldoc from \"xmldoc\"\nimport { getArchiveOpfInfo } from \"../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../archives/types\"\n\nexport const getSpineItemFilesFromArchive = async ({ archive }: { archive: Archive }) => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const data = await opsFile?.string()\n\n if (!data) return []\n\n const _opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const manifestElm = _opfXmlDoc.childNamed(`manifest`)\n const spineElm = _opfXmlDoc.childNamed(`spine`)\n\n const spineItemIds = spineElm?.childrenNamed(`itemref`).map((item) => item.attr.idref) as string[]\n const manifestItemsFromSpine =\n manifestElm?.childrenNamed(`item`).filter((item) => spineItemIds.includes(item.attr.id || ``)) || []\n\n const archiveSpineItems = archive.files.filter((file) => {\n return manifestItemsFromSpine.find((item) => {\n if (!opfBasePath) return `${item.attr.href}` === file.uri\n return `${opfBasePath}/${item.attr.href}` === file.uri\n })\n })\n\n return archiveSpineItems\n}\n","import xmldoc from \"xmldoc\"\nimport { parseToc } from \"../../../parsers/nav\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { extractKoboInformationFromArchive } from \"../../../parsers/kobo\"\nimport { Report } from \"../../../report\"\nimport { Archive } from \"../../../archives/types\"\nimport { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\ntype SpineItemProperties = `rendition:layout-reflowable` | `page-spread-left` | `page-spread-right`\n\nexport const getItemsFromDoc = (doc: xmldoc.XmlDocument) => {\n const manifestElm = doc.childNamed(`manifest`)\n\n return (\n manifestElm?.childrenNamed(`item`)?.map((el) => ({\n href: el.attr.href || ``,\n id: el.attr.id || ``,\n mediaType: el.attr[`media-type`],\n })) || []\n )\n}\n\nexport const epubHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const { data: opsFile, basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n const koboInformation = await extractKoboInformationFromArchive(archive)\n\n if (!opsFile) {\n return manifest\n }\n\n const data = await opsFile.string()\n\n Report.log(data, koboInformation)\n\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const toc = (await parseToc(opfXmlDoc, archive, { baseUrl })) || []\n\n const metadataElm = opfXmlDoc.childNamed(`metadata`)\n const manifestElm = opfXmlDoc.childNamed(`manifest`)\n const spineElm = opfXmlDoc.childNamed(`spine`)\n const guideElm = opfXmlDoc.childNamed(`guide`)\n const titleElm = metadataElm?.childNamed(`dc:title`)\n const metaElmChildren = metadataElm?.childrenNamed(`meta`) || []\n const metaElmWithRendition = metaElmChildren.find((meta) => meta.attr.property === `rendition:layout`)\n const metaElmWithRenditionFlow = metaElmChildren.find((meta) => meta.attr.property === `rendition:flow`)\n const metaElmWithRenditionSpread = metaElmChildren.find((meta) => meta.attr.property === `rendition:spread`)\n\n const publisherRenditionLayout = metaElmWithRendition?.val as `reflowable` | `pre-paginated` | undefined\n const publisherRenditionFlow = metaElmWithRenditionFlow?.val as\n | `scrolled-continuous`\n | `scrolled-doc`\n | `paginated`\n | `auto`\n | undefined\n const renditionSpread = metaElmWithRenditionSpread?.val as `auto` | undefined\n\n const title = titleElm?.val || archive.files.find(({ dir }) => dir)?.basename || ``\n const pageProgressionDirection = spineElm?.attr[`page-progression-direction`] as `ltr` | `rtl` | undefined\n\n const archiveSpineItems = await getSpineItemFilesFromArchive({ archive })\n\n const totalSize = archiveSpineItems.reduce((size, file) => file.size + size, 0)\n\n return {\n filename: archive.filename,\n nav: {\n toc,\n },\n renditionLayout: publisherRenditionLayout || koboInformation.renditionLayout || `reflowable`,\n renditionFlow: publisherRenditionFlow || `auto`,\n renditionSpread,\n title,\n readingDirection: pageProgressionDirection || `ltr`,\n spineItems:\n spineElm?.childrenNamed(`itemref`).map((itemrefElm) => {\n const manifestItem = manifestElm?.childrenNamed(`item`).find((item) => item.attr.id === itemrefElm?.attr.idref)\n const href = manifestItem?.attr.href || ``\n const properties = (itemrefElm?.attr.properties?.split(` `) || []) as SpineItemProperties[]\n const itemSize = archive.files.find((file) => file.uri.endsWith(href))?.size || 0\n\n // we use base url or nothing (and stay relative)\n const hrefBaseUri = baseUrl ?? \"\"\n\n return {\n id: manifestItem?.attr.id || ``,\n href: manifestItem?.attr.href?.startsWith(`https://`)\n ? manifestItem?.attr.href\n : opfBasePath\n ? `${hrefBaseUri}${opfBasePath}/${manifestItem?.attr.href}`\n : `${hrefBaseUri}${manifestItem?.attr.href}`,\n renditionLayout: publisherRenditionLayout || `reflowable`,\n ...(properties.find((property) => property === `rendition:layout-reflowable`) && {\n renditionLayout: `reflowable`,\n }),\n progressionWeight: itemSize / totalSize,\n pageSpreadLeft: properties.some((property) => property === `page-spread-left`) || undefined,\n pageSpreadRight: properties.some((property) => property === `page-spread-right`) || undefined,\n // size: itemSize\n mediaType: manifestItem?.attr[`media-type`],\n }\n }) || [],\n items: getItemsFromDoc(opfXmlDoc),\n guide: guideElm?.childrenNamed(`reference`).map((elm) => {\n return {\n href: elm.attr.href || ``,\n title: elm.attr.title || ``,\n type: elm.attr.type as NonNullable<Manifest[`guide`]>[number][`type`],\n }\n }),\n }\n }\n","import xmldoc from \"xmldoc\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { getItemsFromDoc } from \"./manifest/hooks/epub\"\n\nexport const generateResourceFromArchive = async (archive: Archive, resourcePath: string) => {\n const file = Object.values(archive.files).find((file) => file.uri === resourcePath)\n\n const metadata = await getMetadata(archive, resourcePath)\n\n if (!file) {\n throw new Error(`no file found`)\n }\n\n const blob = await file.blob()\n\n // if (file.stream) {\n // const stream = file.stream()\n\n // console.log(file, stream)\n // stream.on(`data`, data => {\n // console.log(`data`, data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // console.log(`end`)\n // })\n\n // }\n\n // const stream = file.stream!()\n\n // const readableStream = new ReadableStream({\n // start(controller) {\n // function push() {\n // stream.on(`data`, data => {\n // controller.enqueue(data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // controller.close()\n // })\n\n // stream.resume()\n // }\n\n // push();\n // }\n // })\n\n return {\n body: blob,\n params: {\n headers: {\n ...(blob.type && {\n \"Content-Type\": blob.type,\n }),\n ...(file.encodingFormat && {\n \"Content-Type\": file.encodingFormat,\n }),\n ...(metadata.mediaType && {\n \"Content-Type\": metadata.mediaType,\n }),\n // 'Cache-Control': `no-cache, no-store, no-transform`\n },\n },\n }\n}\n\nconst getMetadata = async (archive: Archive, resourcePath: string) => {\n const opfInfo = getArchiveOpfInfo(archive)\n const data = await opfInfo.data?.string()\n\n if (data) {\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n const items = getItemsFromDoc(opfXmlDoc)\n\n return {\n mediaType: items.find((item) => resourcePath.endsWith(item.href))?.mediaType,\n }\n }\n\n return {\n mediaType: getContentTypeFromExtension(resourcePath),\n }\n}\n\nconst getContentTypeFromExtension = (uri: string) => {\n if (uri.endsWith(`.css`)) {\n return `text/css; charset=UTF-8`\n }\n if (uri.endsWith(`.jpg`)) {\n return `image/jpg`\n }\n if (uri.endsWith(`.xhtml`)) {\n return `application/xhtml+xml`\n }\n if (uri.endsWith(`.mp4`)) {\n return `video/mp4`\n }\n if (uri.endsWith(`.svg`)) {\n return `image/svg+xml`\n }\n}\n","import { Manifest } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\n\nexport const defaultHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const files = Object.values(archive.files).filter((file) => !file.dir)\n\n return {\n filename: archive.filename,\n nav: {\n toc: [],\n },\n title: archive.files.find(({ dir }) => dir)?.basename.replace(/\\/$/, ``) || ``,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n readingDirection: `ltr`,\n spineItems: files.map((file, index) => ({\n // some books such as cbz can have same basename inside different sub folder\n // we need to make sure to have unique index\n // /chap01/01.png, /chap02/01.png, etc\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n renditionLayout: `pre-paginated`,\n progressionWeight: 1 / files.length,\n pageSpreadLeft: undefined,\n pageSpreadRight: undefined,\n mediaType: file.encodingFormat,\n })),\n items: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n })),\n }\n }\n","import { Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\n\n/**\n * Handle archive which contains ComicInfo.xml. This is a meta file\n * used to define cbz, etc. I believe it comes from some sites or apps.\n */\nexport const comicInfoHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const comicInfoFile = archive.files.find((file) => file.basename.toLowerCase() === `comicinfo.xml`)\n\n if (!comicInfoFile) {\n return manifest\n }\n\n // @todo handle more meta\n const content = await comicInfoFile.string()\n const xmlDoc = new xmldoc.XmlDocument(content)\n\n const mangaVal = (xmlDoc.childNamed(`Manga`)?.val as `YesAndRightToLeft`) || `unknown`\n\n return {\n ...manifest,\n spineItems: manifest.spineItems.filter((item) => item.id.toLowerCase() !== `comicinfo.xml`),\n readingDirection: mangaVal === `YesAndRightToLeft` ? `rtl` : `ltr`,\n }\n }\n","import { isXmlBasedMimeType, Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\nconst hasDocMetaViewport = (doc: xmldoc.XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"viewport\")\n\n return !!(metaElm && metaElm.attr.name === \"viewport\")\n}\n\nconst allFilesHaveViewportMeta = (files: Archive[\"files\"]) =>\n files.reduce(async (result, current) => {\n const _result = await result\n\n if (!_result) return false\n\n if (\n !isXmlBasedMimeType({\n mimeType: current.encodingFormat,\n uri: current.uri,\n })\n ) {\n return false\n }\n\n const file = await current.string()\n\n if (!file) return false\n\n return hasDocMetaViewport(new xmldoc.XmlDocument(file))\n }, Promise.resolve(true))\n\nexport const epubOptimizerHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const bookIsFullReflowable =\n manifest.renditionLayout === \"reflowable\" && manifest.spineItems.every((item) => item.renditionLayout === \"reflowable\")\n\n if (bookIsFullReflowable) {\n const files = await getSpineItemFilesFromArchive({ archive })\n\n const hasAllViewport = await allFilesHaveViewportMeta(files)\n\n if (hasAllViewport) {\n return {\n ...manifest,\n spineItems: manifest.spineItems.map((item) => ({\n ...item,\n renditionLayout: \"pre-paginated\",\n })),\n renditionLayout: \"pre-paginated\",\n }\n }\n }\n\n return manifest\n }\n","import type { Manifest } from \"@prose-reader/shared\"\nimport { Report } from \"../../report\"\nimport { Archive } from \"../../archives/types\"\nimport { defaultHook } from \"./hooks/default\"\nimport { epubHook } from \"./hooks/epub\"\nimport { comicInfoHook } from \"./hooks/comicInfo\"\nimport { epubOptimizerHook } from \"./hooks/epubOptimizer\"\n\nconst baseManifest: Manifest = {\n filename: ``,\n items: [],\n nav: {\n toc: [],\n },\n readingDirection: `ltr`,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n spineItems: [],\n title: ``,\n}\n\nexport const generateManifestFromArchive = async (archive: Archive, { baseUrl = `` }: { baseUrl?: string } = {}) => {\n const hooks = [\n defaultHook({ archive, baseUrl }),\n epubHook({ archive, baseUrl }),\n epubOptimizerHook({ archive, baseUrl }),\n comicInfoHook({ archive, baseUrl }),\n ]\n\n try {\n const manifest = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(baseManifest))\n\n Report.log(\"Generated manifest\", manifest)\n\n return manifest\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n","export const getUriBasename = (uri: string) => uri.substring(uri.lastIndexOf(`/`) + 1) || uri\n","import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromUrls = async (urls: string[], options?: { useRenditionFlow: boolean }): Promise<Archive> => {\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">${options?.useRenditionFlow ? `reflowable` : `pre-paginated`}</meta>\n ${options?.useRenditionFlow ? `<meta property=\"rendition:flow\">scrolled-continuous</meta>` : ``}\n </metadata>\n <manifest>\n ${urls\n .map((url) => `<item id=\"${getUriBasename(url)}\" href=\"${url}\" media-type=\"${detectMimeTypeFromName(url)}\"/>`)\n .join(`\\n`)}\n </manifest>\n <spine>\n ${urls.map((url) => `<itemref idref=\"${getUriBasename(url)}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const filesFromUrl: Archive[`files`] = urls.map((url) => ({\n dir: false,\n basename: getUriBasename(url),\n encodingFormat: detectMimeTypeFromName(url),\n uri: url,\n size: 100 / urls.length,\n base64: async () => ``,\n blob: async () => new Blob(),\n string: async () => ``,\n }))\n\n const opfFile: Archive[`files`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n base64: async () => opfFileData,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n return {\n filename: ``,\n files: [opfFile, ...filesFromUrl],\n }\n}\n","export const blobToBase64 = async (blob: Blob) =>\n new Promise<string>((resolve) => {\n const reader = new FileReader()\n reader.readAsDataURL(blob)\n reader.onloadend = function () {\n const base64data = reader.result as string\n resolve(base64data)\n }\n })\n","import { blobToBase64 } from \"../utils/blobToBAse64\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * Useful to create archive from txt content\n */\nexport const createArchiveFromText = async (\n content: string | Blob,\n {\n mimeType,\n direction,\n }: {\n direction?: `ltr` | `rtl`\n mimeType?: string\n } = { mimeType: \"text/plain\" }\n) => {\n const txtOpfContent = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" xml:lang=\"ja\" prefix=\"rendition: http://www.idpf.org/vocab/rendition/#\"\n unique-identifier=\"ootuya-id\">\n <metadata xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\">\n <meta property=\"rendition:layout\">reflowable</meta>\n </metadata>\n <manifest>\n <item id=\"p01\" href=\"p01.txt\" media-type=\"text/plain\"/>\n </manifest>\n <spine page-progression-direction=\"${direction ?? `ltr`}\">\n <itemref idref=\"p01\" />\n </spine>\n </package>\n `\n\n const archive: Archive = {\n filename: `content.txt`,\n files: [\n {\n dir: false,\n basename: getUriBasename(`generated.opf`),\n uri: `generated.opf`,\n blob: async () => new Blob([txtOpfContent]),\n string: async () => txtOpfContent,\n base64: async () => btoa(txtOpfContent),\n size: 0,\n },\n {\n dir: false,\n basename: getUriBasename(`p01.txt`),\n uri: `p01.txt`,\n blob: async () => {\n if (typeof content === `string`) return new Blob([content])\n return content\n },\n string: async () => {\n if (typeof content === `string`) return content\n return content.text()\n },\n base64: async () => {\n if (typeof content === `string`) return btoa(content)\n return blobToBase64(content)\n },\n size: typeof content === `string` ? content.length : content.size,\n encodingFormat: mimeType,\n },\n ],\n }\n\n return archive\n}\n","export const sortByTitleComparator = (a: string, b: string) => {\n const alist = a.split(/(\\d+)/)\n const blist = b.split(/(\\d+)/)\n\n for (let i = 0, len = alist.length; i < len; i++) {\n if (alist[i] !== blist[i]) {\n if (alist[i]?.match(/\\d/)) {\n return +(alist[i] || ``) - +(blist[i] || ``)\n } else {\n return (alist[i] || ``).localeCompare(blist[i] || ``)\n }\n }\n }\n\n return 1\n}\n","import { Report } from \"../report\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive, StreamResult } from \"./types\"\n\ninterface OutputByType {\n base64: string\n string: string\n text: string\n binarystring: string\n array: number[]\n uint8array: Uint8Array\n arraybuffer: ArrayBuffer\n blob: Blob\n nodebuffer: Buffer\n}\n\ntype OutputType = keyof OutputByType\ninterface JSZipObject {\n name: string\n dir: boolean\n date: Date\n comment: string\n unixPermissions: number | string | null\n dosPermissions: number | null\n async<T extends OutputType>(type: T): Promise<OutputByType[T]>\n // nodeStream(type?: `nodebuffer`): NodeJS.ReadableStream;\n internalStream?: (type?: `uint8array`) => StreamResult\n}\n\ninterface JSZip {\n files: { [key: string]: JSZipObject }\n}\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {}\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n const archive = {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.dir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: () => file.async(`blob`),\n string: () => file.async(`string`),\n base64: () => file.async(`base64`),\n ...(file.internalStream && {\n stream: file.internalStream,\n }),\n // this is private API\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n size: file._data.uncompressedSize,\n })),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","import { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\nexport const createArchiveFromArrayBufferList = async (\n list: {\n isDir: boolean\n name: string\n size: number\n data: () => Promise<ArrayBuffer>\n }[],\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {}\n): Promise<Archive> => {\n let files = list\n\n if (orderByAlpha) {\n files = files.sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.isDir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: async () => new Blob([await file.data()]),\n string: async () => {\n const data = await file.data()\n return String.fromCharCode.apply(null, Array.from(new Uint16Array(data)))\n },\n base64: async () => {\n // @todo not used for now, lets implement it later if needed\n return ``\n },\n size: file.size,\n })),\n }\n}\n","import { Report } from \"./report\"\n\nexport const configure = ({ enableReport }: { enableReport?: boolean } = {}) => {\n Report.enable(!!enableReport)\n}\n"],"names":["extractNavChapter","li","opfBasePath","baseUrl","chp","contentNode","node","urlJoin","sublistNode","children","child","buildTOCFromNav","doc","toc","navDataChildren","_a","_b","parseTocFromNavPath","opfXmlDoc","archive","navItem","tocFile","item","xmldoc","mapNcxChapter","point","prefix","src","out","pt","buildTOCFromNCX","ncxData","rootTagName","parseTocFromNcx","opfData","spine","ncxId","ncxItem","ncxPath","file","parseToc","getArchiveOpfInfo","tocFromNcx","extractKoboInformationFromArchive","koboInformation","optionElement","enabled","Report","enable","data","label","performanceEntry","targetDuration","duration","name","functionToMeasure","args","t0","response","res","t1","getSpineItemFilesFromArchive","opsFile","_opfXmlDoc","manifestElm","spineElm","spineItemIds","manifestItemsFromSpine","getItemsFromDoc","el","epubHook","manifest","metadataElm","guideElm","titleElm","metaElmChildren","metaElmWithRendition","meta","metaElmWithRenditionFlow","metaElmWithRenditionSpread","publisherRenditionLayout","publisherRenditionFlow","renditionSpread","title","dir","pageProgressionDirection","totalSize","size","itemrefElm","manifestItem","href","properties","itemSize","hrefBaseUri","_c","property","elm","generateResourceFromArchive","resourcePath","metadata","getMetadata","blob","getContentTypeFromExtension","uri","defaultHook","files","index","comicInfoHook","comicInfoFile","content","mangaVal","hasDocMetaViewport","metaElm","allFilesHaveViewportMeta","result","current","isXmlBasedMimeType","epubOptimizerHook","baseManifest","generateManifestFromArchive","hooks","gen","e","getUriBasename","createArchiveFromUrls","urls","options","opfFileData","url","detectMimeTypeFromName","filesFromUrl","blobToBase64","resolve","reader","base64data","createArchiveFromText","mimeType","direction","txtOpfContent","sortByTitleComparator","a","b","alist","blist","i","len","createArchiveFromJszip","jszip","orderByAlpha","createArchiveFromArrayBufferList","list","configure","enableReport"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prose-reader/streamer",
3
- "version": "1.8.0",
3
+ "version": "1.9.0",
4
4
  "type": "module",
5
5
  "main": "./dist/prose-streamer.umd.cjs",
6
6
  "module": "./dist/prose-streamer.js",
@@ -18,17 +18,18 @@
18
18
  "scripts": {
19
19
  "start": "vite build --watch --mode development",
20
20
  "build": "tsc && vite build",
21
- "lint": "prettier -w . && eslint --fix . --ext .ts,.tsx,.js,.jsx",
21
+ "lint:read": "prettier --check . && eslint .",
22
+ "lint:write": "prettier --write . && eslint --fix .",
22
23
  "test": "vitest run --coverage"
23
24
  },
24
25
  "dependencies": {
25
- "@prose-reader/shared": "^1.8.0"
26
+ "@prose-reader/shared": "^1.9.0"
26
27
  },
27
28
  "peerDependencies": {
28
29
  "buffer": "^6.0.3",
29
30
  "xmldoc": "^1.1.2"
30
31
  },
31
- "gitHead": "2eb25b5fea63b563bbd426f18bc4464a609ad7af",
32
+ "gitHead": "e419ffe0deab682e8c52ea27fb7fa55208f26be1",
32
33
  "devDependencies": {
33
34
  "buffer": "^6.0.3",
34
35
  "vitest": "*",