@prose-reader/streamer 1.307.0 → 1.309.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.
Files changed (48) hide show
  1. package/dist/archives/createArchiveFromJszip/index.cjs +2 -0
  2. package/dist/archives/createArchiveFromJszip/index.cjs.map +1 -0
  3. package/dist/archives/createArchiveFromJszip/index.js +32 -0
  4. package/dist/archives/createArchiveFromJszip/index.js.map +1 -0
  5. package/dist/archives/createArchiveFromLibArchive/index.cjs +2 -0
  6. package/dist/archives/createArchiveFromLibArchive/index.cjs.map +1 -0
  7. package/dist/archives/createArchiveFromLibArchive/index.js +21 -0
  8. package/dist/archives/createArchiveFromLibArchive/index.js.map +1 -0
  9. package/dist/archives/createArchiveFromNodeUnrarJs/index.cjs +2 -0
  10. package/dist/archives/createArchiveFromNodeUnrarJs/index.cjs.map +1 -0
  11. package/dist/archives/createArchiveFromNodeUnrarJs/index.js +39 -0
  12. package/dist/archives/createArchiveFromNodeUnrarJs/index.js.map +1 -0
  13. package/dist/archives/createArchiveFromNodeUnrarJs.d.ts +7 -0
  14. package/dist/archives/createArchiveFromUnzipper/index.cjs +2 -0
  15. package/dist/archives/createArchiveFromUnzipper/index.cjs.map +1 -0
  16. package/dist/archives/createArchiveFromUnzipper/index.js +35 -0
  17. package/dist/archives/createArchiveFromUnzipper/index.js.map +1 -0
  18. package/dist/createArchive-BB7-JJjh.js +35 -0
  19. package/dist/createArchive-BB7-JJjh.js.map +1 -0
  20. package/dist/createArchive-CeuyJUIj.cjs +3 -0
  21. package/dist/createArchive-CeuyJUIj.cjs.map +1 -0
  22. package/dist/index/{index.cjs.js → index.cjs} +4 -4
  23. package/dist/index/index.cjs.map +1 -0
  24. package/dist/index/{index.es.js → index.js} +65 -65
  25. package/dist/index/index.js.map +1 -0
  26. package/package.json +24 -14
  27. package/dist/archives/createArchiveFromJszip/index.cjs.js +0 -2
  28. package/dist/archives/createArchiveFromJszip/index.cjs.js.map +0 -1
  29. package/dist/archives/createArchiveFromJszip/index.es.js +0 -39
  30. package/dist/archives/createArchiveFromJszip/index.es.js.map +0 -1
  31. package/dist/archives/createArchiveFromLibArchive/index.cjs.js +0 -2
  32. package/dist/archives/createArchiveFromLibArchive/index.cjs.js.map +0 -1
  33. package/dist/archives/createArchiveFromLibArchive/index.es.js +0 -24
  34. package/dist/archives/createArchiveFromLibArchive/index.es.js.map +0 -1
  35. package/dist/archives/createArchiveFromUnzipper/index.cjs.js +0 -2
  36. package/dist/archives/createArchiveFromUnzipper/index.cjs.js.map +0 -1
  37. package/dist/archives/createArchiveFromUnzipper/index.es.js +0 -42
  38. package/dist/archives/createArchiveFromUnzipper/index.es.js.map +0 -1
  39. package/dist/index/index.cjs.js.map +0 -1
  40. package/dist/index/index.es.js.map +0 -1
  41. package/dist/printTree-CJzGASVu.js +0 -20
  42. package/dist/printTree-CJzGASVu.js.map +0 -1
  43. package/dist/printTree-DTFYKvW1.cjs +0 -3
  44. package/dist/printTree-DTFYKvW1.cjs.map +0 -1
  45. package/dist/report-Cs9DVdJl.cjs +0 -2
  46. package/dist/report-Cs9DVdJl.cjs.map +0 -1
  47. package/dist/report-uURLD5cl.js +0 -15
  48. package/dist/report-uURLD5cl.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../createArchive-CeuyJUIj.cjs"),t=require("../../uri-DW0-P-ng.cjs");let n=require("@prose-reader/shared");var r=async(r,{orderByAlpha:i,name:a,encodingFormat:o}={})=>{let s=Object.values(r.files);return i&&(s=s.slice().sort((e,n)=>t.i(e.name,n.name))),e.t({filename:a,encodingFormat:o,records:s.map(e=>{let r=t.n(e.name);return e.dir?{dir:!0,basename:r,uri:e.name}:{dir:!1,basename:t.n(e.name),uri:e.name,encodingFormat:(0,n.detectMimeTypeFromName)(e.name),blob:()=>e.async(`blob`),arrayBuffer:()=>e.async(`arraybuffer`),size:e._data.uncompressedSize}}),close:()=>Promise.resolve()})};exports.createArchiveFromJszip=r;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/archives/createArchiveFromJszip.ts"],"sourcesContent":["import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport type JSZip from \"jszip\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { createArchive } from \"./createArchive\"\nimport type { Archive } from \"./types\"\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n {\n orderByAlpha,\n name,\n encodingFormat,\n }: { orderByAlpha?: boolean; name?: string; encodingFormat?: string } = {},\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return createArchive({\n filename: name,\n encodingFormat,\n records: files.map((file) => {\n const basename = getUriBasename(file.name)\n\n if (file.dir) {\n return {\n dir: true,\n basename,\n uri: file.name,\n }\n }\n\n return {\n dir: false,\n basename: getUriBasename(file.name),\n uri: file.name,\n encodingFormat: detectMimeTypeFromName(file.name),\n blob: () => file.async(`blob`),\n arrayBuffer: () => file.async(`arraybuffer`),\n // this is private API\n // @ts-expect-error\n size: file._data.uncompressedSize,\n }\n }),\n close: () => Promise.resolve(),\n })\n}\n"],"mappings":"iMAOA,IAAa,EAAyB,MACpC,EACA,CACE,eACA,OACA,kBACsE,CAAC,IACpD,CACrB,IAAI,EAAQ,OAAO,OAAO,EAAM,KAAK,EAMrC,OAJI,IACF,EAAQ,EAAM,MAAM,EAAE,MAAM,EAAG,IAAM,EAAA,EAAsB,EAAE,KAAM,EAAE,IAAI,CAAC,GAGrE,EAAA,EAAc,CACnB,SAAU,EACV,iBACA,QAAS,EAAM,IAAK,GAAS,CAC3B,IAAM,EAAW,EAAA,EAAe,EAAK,IAAI,EAUzC,OARI,EAAK,IACA,CACL,IAAK,GACL,WACA,IAAK,EAAK,IACZ,EAGK,CACL,IAAK,GACL,SAAU,EAAA,EAAe,EAAK,IAAI,EAClC,IAAK,EAAK,KACV,gBAAA,EAAA,EAAA,wBAAuC,EAAK,IAAI,EAChD,SAAY,EAAK,MAAM,MAAM,EAC7B,gBAAmB,EAAK,MAAM,aAAa,EAG3C,KAAM,EAAK,MAAM,gBACnB,CACF,CAAC,EACD,UAAa,QAAQ,QAAQ,CAC/B,CAAC,CACH"}
@@ -0,0 +1,32 @@
1
+ import { t as e } from "../../createArchive-BB7-JJjh.js";
2
+ import { i as t, n } from "../../uri-DBZYnB1I.js";
3
+ import { detectMimeTypeFromName as r } from "@prose-reader/shared";
4
+ //#region src/archives/createArchiveFromJszip.ts
5
+ var i = async (i, { orderByAlpha: a, name: o, encodingFormat: s } = {}) => {
6
+ let c = Object.values(i.files);
7
+ return a && (c = c.slice().sort((e, n) => t(e.name, n.name))), e({
8
+ filename: o,
9
+ encodingFormat: s,
10
+ records: c.map((e) => {
11
+ let t = n(e.name);
12
+ return e.dir ? {
13
+ dir: !0,
14
+ basename: t,
15
+ uri: e.name
16
+ } : {
17
+ dir: !1,
18
+ basename: n(e.name),
19
+ uri: e.name,
20
+ encodingFormat: r(e.name),
21
+ blob: () => e.async("blob"),
22
+ arrayBuffer: () => e.async("arraybuffer"),
23
+ size: e._data.uncompressedSize
24
+ };
25
+ }),
26
+ close: () => Promise.resolve()
27
+ });
28
+ };
29
+ //#endregion
30
+ export { i as createArchiveFromJszip };
31
+
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/archives/createArchiveFromJszip.ts"],"sourcesContent":["import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport type JSZip from \"jszip\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { createArchive } from \"./createArchive\"\nimport type { Archive } from \"./types\"\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n {\n orderByAlpha,\n name,\n encodingFormat,\n }: { orderByAlpha?: boolean; name?: string; encodingFormat?: string } = {},\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return createArchive({\n filename: name,\n encodingFormat,\n records: files.map((file) => {\n const basename = getUriBasename(file.name)\n\n if (file.dir) {\n return {\n dir: true,\n basename,\n uri: file.name,\n }\n }\n\n return {\n dir: false,\n basename: getUriBasename(file.name),\n uri: file.name,\n encodingFormat: detectMimeTypeFromName(file.name),\n blob: () => file.async(`blob`),\n arrayBuffer: () => file.async(`arraybuffer`),\n // this is private API\n // @ts-expect-error\n size: file._data.uncompressedSize,\n }\n }),\n close: () => Promise.resolve(),\n })\n}\n"],"mappings":";;;;AAOA,IAAa,IAAyB,OACpC,GACA,EACE,iBACA,SACA,sBACsE,CAAC,MACpD;CACrB,IAAI,IAAQ,OAAO,OAAO,EAAM,KAAK;CAMrC,OAJI,MACF,IAAQ,EAAM,MAAM,EAAE,MAAM,GAAG,MAAM,EAAsB,EAAE,MAAM,EAAE,IAAI,CAAC,IAGrE,EAAc;EACnB,UAAU;EACV;EACA,SAAS,EAAM,KAAK,MAAS;GAC3B,IAAM,IAAW,EAAe,EAAK,IAAI;GAUzC,OARI,EAAK,MACA;IACL,KAAK;IACL;IACA,KAAK,EAAK;GACZ,IAGK;IACL,KAAK;IACL,UAAU,EAAe,EAAK,IAAI;IAClC,KAAK,EAAK;IACV,gBAAgB,EAAuB,EAAK,IAAI;IAChD,YAAY,EAAK,MAAM,MAAM;IAC7B,mBAAmB,EAAK,MAAM,aAAa;IAG3C,MAAM,EAAK,MAAM;GACnB;EACF,CAAC;EACD,aAAa,QAAQ,QAAQ;CAC/B,CAAC;AACH"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../createArchive-CeuyJUIj.cjs"),t=require("../../fileAccessors-DWVChFUB.cjs");let n=require("@prose-reader/shared");var r=async(r,{name:i,encodingFormat:a})=>e.t({close:()=>r.close(),filename:i,encodingFormat:a,records:(await r.getFilesArray()).map(e=>({dir:!1,basename:e.file.name,encodingFormat:(0,n.detectMimeTypeFromName)(e.file.name),size:e.file.size,uri:`${e.path}${e.file.name}`,...t.n(()=>e.file.extract())}))});exports.createArchiveFromLibArchive=r;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/archives/createArchiveFromLibArchive.ts"],"sourcesContent":["/**\n * @see https://github.com/nika-begiashvili/libarchivejs.\n *\n * Does not work in service worker due to usage of web worker.\n */\nimport { detectMimeTypeFromName } from \"@prose-reader/shared\"\n// libarchive.js only re-exports `Archive` from its package root; the reader and\n// compressed-file types live in the compiled output, so we reach for them there.\nimport type { ArchiveReader } from \"libarchive.js/dist/build/compiled/archive-reader\"\nimport type { CompressedFile } from \"libarchive.js/dist/build/compiled/compressed-file\"\nimport { createArchive } from \"./createArchive\"\nimport { blobFileAccessors } from \"./fileAccessors\"\nimport type { Archive } from \"./types\"\n\nexport const createArchiveFromLibArchive = async (\n libArchive: ArchiveReader,\n {\n name,\n encodingFormat,\n }: { orderByAlpha?: boolean; name: string; encodingFormat?: string },\n): Promise<Archive> => {\n const objArray = await libArchive.getFilesArray()\n\n return createArchive({\n close: () => libArchive.close(),\n filename: name,\n encodingFormat,\n records: objArray.map((item: { file: CompressedFile; path: string }) => ({\n dir: false,\n basename: item.file.name,\n encodingFormat: detectMimeTypeFromName(item.file.name),\n size: item.file.size,\n uri: `${item.path}${item.file.name}`,\n // libarchivejs `extract()` is typed `any`; it resolves to a `File`.\n ...blobFileAccessors(() => item.file.extract() as Promise<File>),\n })),\n })\n}\n"],"mappings":"2MAcA,IAAa,EAA8B,MACzC,EACA,CACE,OACA,oBAKK,EAAA,EAAc,CACnB,UAAa,EAAW,MAAM,EAC9B,SAAU,EACV,iBACA,SAAS,MANY,EAAW,cAAc,GAM5B,IAAK,IAAkD,CACvE,IAAK,GACL,SAAU,EAAK,KAAK,KACpB,gBAAA,EAAA,EAAA,wBAAuC,EAAK,KAAK,IAAI,EACrD,KAAM,EAAK,KAAK,KAChB,IAAK,GAAG,EAAK,OAAO,EAAK,KAAK,OAE9B,GAAG,EAAA,MAAwB,EAAK,KAAK,QAAQ,CAAkB,CACjE,EAAE,CACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { t as e } from "../../createArchive-BB7-JJjh.js";
2
+ import { n as t } from "../../fileAccessors-etcCPnpQ.js";
3
+ import { detectMimeTypeFromName as n } from "@prose-reader/shared";
4
+ //#region src/archives/createArchiveFromLibArchive.ts
5
+ var r = async (r, { name: i, encodingFormat: a }) => e({
6
+ close: () => r.close(),
7
+ filename: i,
8
+ encodingFormat: a,
9
+ records: (await r.getFilesArray()).map((e) => ({
10
+ dir: !1,
11
+ basename: e.file.name,
12
+ encodingFormat: n(e.file.name),
13
+ size: e.file.size,
14
+ uri: `${e.path}${e.file.name}`,
15
+ ...t(() => e.file.extract())
16
+ }))
17
+ });
18
+ //#endregion
19
+ export { r as createArchiveFromLibArchive };
20
+
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/archives/createArchiveFromLibArchive.ts"],"sourcesContent":["/**\n * @see https://github.com/nika-begiashvili/libarchivejs.\n *\n * Does not work in service worker due to usage of web worker.\n */\nimport { detectMimeTypeFromName } from \"@prose-reader/shared\"\n// libarchive.js only re-exports `Archive` from its package root; the reader and\n// compressed-file types live in the compiled output, so we reach for them there.\nimport type { ArchiveReader } from \"libarchive.js/dist/build/compiled/archive-reader\"\nimport type { CompressedFile } from \"libarchive.js/dist/build/compiled/compressed-file\"\nimport { createArchive } from \"./createArchive\"\nimport { blobFileAccessors } from \"./fileAccessors\"\nimport type { Archive } from \"./types\"\n\nexport const createArchiveFromLibArchive = async (\n libArchive: ArchiveReader,\n {\n name,\n encodingFormat,\n }: { orderByAlpha?: boolean; name: string; encodingFormat?: string },\n): Promise<Archive> => {\n const objArray = await libArchive.getFilesArray()\n\n return createArchive({\n close: () => libArchive.close(),\n filename: name,\n encodingFormat,\n records: objArray.map((item: { file: CompressedFile; path: string }) => ({\n dir: false,\n basename: item.file.name,\n encodingFormat: detectMimeTypeFromName(item.file.name),\n size: item.file.size,\n uri: `${item.path}${item.file.name}`,\n // libarchivejs `extract()` is typed `any`; it resolves to a `File`.\n ...blobFileAccessors(() => item.file.extract() as Promise<File>),\n })),\n })\n}\n"],"mappings":";;;;AAcA,IAAa,IAA8B,OACzC,GACA,EACE,SACA,wBAKK,EAAc;CACnB,aAAa,EAAW,MAAM;CAC9B,UAAU;CACV;CACA,UAAS,MANY,EAAW,cAAc,GAM5B,KAAK,OAAkD;EACvE,KAAK;EACL,UAAU,EAAK,KAAK;EACpB,gBAAgB,EAAuB,EAAK,KAAK,IAAI;EACrD,MAAM,EAAK,KAAK;EAChB,KAAK,GAAG,EAAK,OAAO,EAAK,KAAK;EAE9B,GAAG,QAAwB,EAAK,KAAK,QAAQ,CAAkB;CACjE,EAAE;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../createArchive-CeuyJUIj.cjs"),t=require("../../uri-DW0-P-ng.cjs"),n=require("../../fileAccessors-DWVChFUB.cjs");let r=require("@prose-reader/shared");var i=(e,t)=>{let n=[...e.extract({files:[t]}).files][0]?.extraction;if(!n)throw Error(`node-unrar-js failed to extract entry "${t}" from the RAR archive`);return n},a=async(a,{orderByAlpha:o,name:s,encodingFormat:c}={})=>{let l=[...a.getFileList().fileHeaders];return o&&(l=l.slice().sort((e,n)=>t.i(e.name,n.name))),e.t({filename:s,encodingFormat:c,records:l.map(e=>{let o=t.n(e.name);return e.flags.directory?{dir:!0,basename:o,uri:e.name}:{dir:!1,basename:o,uri:e.name,encodingFormat:(0,r.detectMimeTypeFromName)(e.name),size:e.unpSize,...n.t(async()=>{let t=i(a,e.name),n=t.buffer;return t.byteOffset===0&&t.byteLength===n.byteLength?n:n.slice(t.byteOffset,t.byteOffset+t.byteLength)},(0,r.detectMimeTypeFromName)(e.name)??``)}}),close:()=>Promise.resolve()})};exports.createArchiveFromNodeUnrarJs=a;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/archives/createArchiveFromNodeUnrarJs.ts"],"sourcesContent":["import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport type { Extractor } from \"node-unrar-js\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { createArchive } from \"./createArchive\"\nimport { arrayBufferFileAccessors } from \"./fileAccessors\"\nimport type { Archive } from \"./types\"\n\n/**\n * `node-unrar-js`'s `extract({ files })` returns a generator that keeps WASM\n * resources alive until it is consumed end-to-end; spreading into an array is\n * the documented way to drain and free it.\n */\nconst extractEntryBytes = (\n extractor: Extractor<Uint8Array>,\n uri: string,\n): Uint8Array => {\n const extracted = extractor.extract({ files: [uri] })\n const files = [...extracted.files]\n const bytes = files[0]?.extraction\n\n if (!bytes) {\n throw new Error(\n `node-unrar-js failed to extract entry \"${uri}\" from the RAR archive`,\n )\n }\n\n return bytes\n}\n\nexport const createArchiveFromNodeUnrarJs = async (\n extractor: Extractor<Uint8Array>,\n {\n orderByAlpha,\n name,\n encodingFormat,\n }: { orderByAlpha?: boolean; name?: string; encodingFormat?: string } = {},\n): Promise<Archive> => {\n let headers = [...extractor.getFileList().fileHeaders]\n\n if (orderByAlpha) {\n headers = headers\n .slice()\n .sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return createArchive({\n filename: name,\n encodingFormat,\n records: headers.map((header) => {\n const basename = getUriBasename(header.name)\n\n if (header.flags.directory) {\n return {\n dir: true,\n basename,\n uri: header.name,\n }\n }\n\n return {\n dir: false,\n basename,\n uri: header.name,\n encodingFormat: detectMimeTypeFromName(header.name),\n size: header.unpSize,\n ...arrayBufferFileAccessors(async () => {\n const bytes = extractEntryBytes(extractor, header.name)\n // node-unrar-js extracts into a regular `Uint8Array`, whose backing\n // store is always an `ArrayBuffer` (never a `SharedArrayBuffer`); the\n // cast only drops the `SharedArrayBuffer` arm that cannot occur here.\n const backing = bytes.buffer as ArrayBuffer\n\n // Each extraction returns a fresh, exactly-sized buffer that the\n // entry owns outright, so when the view spans the whole buffer it\n // can be handed out without copying.\n return bytes.byteOffset === 0 &&\n bytes.byteLength === backing.byteLength\n ? backing\n : backing.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength,\n )\n }, detectMimeTypeFromName(header.name) ?? ``),\n }\n }),\n close: () => Promise.resolve(),\n })\n}\n"],"mappings":"+OAaA,IAAM,GACJ,EACA,IACe,CAGf,IAAM,EAAQ,CADC,GADG,EAAU,QAAQ,CAAE,MAAO,CAAC,CAAG,CAAE,CACjC,EAAU,KACd,EAAM,IAAI,WAExB,GAAI,CAAC,EACH,MAAU,MACR,0CAA0C,EAAI,uBAChD,EAGF,OAAO,CACT,EAEa,EAA+B,MAC1C,EACA,CACE,eACA,OACA,kBACsE,CAAC,IACpD,CACrB,IAAI,EAAU,CAAC,GAAG,EAAU,YAAY,EAAE,WAAW,EAQrD,OANI,IACF,EAAU,EACP,MAAM,EACN,MAAM,EAAG,IAAM,EAAA,EAAsB,EAAE,KAAM,EAAE,IAAI,CAAC,GAGlD,EAAA,EAAc,CACnB,SAAU,EACV,iBACA,QAAS,EAAQ,IAAK,GAAW,CAC/B,IAAM,EAAW,EAAA,EAAe,EAAO,IAAI,EAU3C,OARI,EAAO,MAAM,UACR,CACL,IAAK,GACL,WACA,IAAK,EAAO,IACd,EAGK,CACL,IAAK,GACL,WACA,IAAK,EAAO,KACZ,gBAAA,EAAA,EAAA,wBAAuC,EAAO,IAAI,EAClD,KAAM,EAAO,QACb,GAAG,EAAA,EAAyB,SAAY,CACtC,IAAM,EAAQ,EAAkB,EAAW,EAAO,IAAI,EAIhD,EAAU,EAAM,OAKtB,OAAO,EAAM,aAAe,GAC1B,EAAM,aAAe,EAAQ,WAC3B,EACA,EAAQ,MACN,EAAM,WACN,EAAM,WAAa,EAAM,UAC3B,CACN,GAAA,EAAA,EAAA,wBAA0B,EAAO,IAAI,GAAK,EAAE,CAC9C,CACF,CAAC,EACD,UAAa,QAAQ,QAAQ,CAC/B,CAAC,CACH"}
@@ -0,0 +1,39 @@
1
+ import { t as e } from "../../createArchive-BB7-JJjh.js";
2
+ import { i as t, n } from "../../uri-DBZYnB1I.js";
3
+ import { t as r } from "../../fileAccessors-etcCPnpQ.js";
4
+ import { detectMimeTypeFromName as i } from "@prose-reader/shared";
5
+ //#region src/archives/createArchiveFromNodeUnrarJs.ts
6
+ var a = (e, t) => {
7
+ let n = [...e.extract({ files: [t] }).files][0]?.extraction;
8
+ if (!n) throw Error(`node-unrar-js failed to extract entry "${t}" from the RAR archive`);
9
+ return n;
10
+ }, o = async (o, { orderByAlpha: s, name: c, encodingFormat: l } = {}) => {
11
+ let u = [...o.getFileList().fileHeaders];
12
+ return s && (u = u.slice().sort((e, n) => t(e.name, n.name))), e({
13
+ filename: c,
14
+ encodingFormat: l,
15
+ records: u.map((e) => {
16
+ let t = n(e.name);
17
+ return e.flags.directory ? {
18
+ dir: !0,
19
+ basename: t,
20
+ uri: e.name
21
+ } : {
22
+ dir: !1,
23
+ basename: t,
24
+ uri: e.name,
25
+ encodingFormat: i(e.name),
26
+ size: e.unpSize,
27
+ ...r(async () => {
28
+ let t = a(o, e.name), n = t.buffer;
29
+ return t.byteOffset === 0 && t.byteLength === n.byteLength ? n : n.slice(t.byteOffset, t.byteOffset + t.byteLength);
30
+ }, i(e.name) ?? "")
31
+ };
32
+ }),
33
+ close: () => Promise.resolve()
34
+ });
35
+ };
36
+ //#endregion
37
+ export { o as createArchiveFromNodeUnrarJs };
38
+
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/archives/createArchiveFromNodeUnrarJs.ts"],"sourcesContent":["import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport type { Extractor } from \"node-unrar-js\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { createArchive } from \"./createArchive\"\nimport { arrayBufferFileAccessors } from \"./fileAccessors\"\nimport type { Archive } from \"./types\"\n\n/**\n * `node-unrar-js`'s `extract({ files })` returns a generator that keeps WASM\n * resources alive until it is consumed end-to-end; spreading into an array is\n * the documented way to drain and free it.\n */\nconst extractEntryBytes = (\n extractor: Extractor<Uint8Array>,\n uri: string,\n): Uint8Array => {\n const extracted = extractor.extract({ files: [uri] })\n const files = [...extracted.files]\n const bytes = files[0]?.extraction\n\n if (!bytes) {\n throw new Error(\n `node-unrar-js failed to extract entry \"${uri}\" from the RAR archive`,\n )\n }\n\n return bytes\n}\n\nexport const createArchiveFromNodeUnrarJs = async (\n extractor: Extractor<Uint8Array>,\n {\n orderByAlpha,\n name,\n encodingFormat,\n }: { orderByAlpha?: boolean; name?: string; encodingFormat?: string } = {},\n): Promise<Archive> => {\n let headers = [...extractor.getFileList().fileHeaders]\n\n if (orderByAlpha) {\n headers = headers\n .slice()\n .sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return createArchive({\n filename: name,\n encodingFormat,\n records: headers.map((header) => {\n const basename = getUriBasename(header.name)\n\n if (header.flags.directory) {\n return {\n dir: true,\n basename,\n uri: header.name,\n }\n }\n\n return {\n dir: false,\n basename,\n uri: header.name,\n encodingFormat: detectMimeTypeFromName(header.name),\n size: header.unpSize,\n ...arrayBufferFileAccessors(async () => {\n const bytes = extractEntryBytes(extractor, header.name)\n // node-unrar-js extracts into a regular `Uint8Array`, whose backing\n // store is always an `ArrayBuffer` (never a `SharedArrayBuffer`); the\n // cast only drops the `SharedArrayBuffer` arm that cannot occur here.\n const backing = bytes.buffer as ArrayBuffer\n\n // Each extraction returns a fresh, exactly-sized buffer that the\n // entry owns outright, so when the view spans the whole buffer it\n // can be handed out without copying.\n return bytes.byteOffset === 0 &&\n bytes.byteLength === backing.byteLength\n ? backing\n : backing.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength,\n )\n }, detectMimeTypeFromName(header.name) ?? ``),\n }\n }),\n close: () => Promise.resolve(),\n })\n}\n"],"mappings":";;;;;AAaA,IAAM,KACJ,GACA,MACe;CAGf,IAAM,IAAQ,CADC,GADG,EAAU,QAAQ,EAAE,OAAO,CAAC,CAAG,EAAE,CACjC,EAAU,KACd,EAAM,IAAI;CAExB,IAAI,CAAC,GACH,MAAU,MACR,0CAA0C,EAAI,uBAChD;CAGF,OAAO;AACT,GAEa,IAA+B,OAC1C,GACA,EACE,iBACA,SACA,sBACsE,CAAC,MACpD;CACrB,IAAI,IAAU,CAAC,GAAG,EAAU,YAAY,EAAE,WAAW;CAQrD,OANI,MACF,IAAU,EACP,MAAM,EACN,MAAM,GAAG,MAAM,EAAsB,EAAE,MAAM,EAAE,IAAI,CAAC,IAGlD,EAAc;EACnB,UAAU;EACV;EACA,SAAS,EAAQ,KAAK,MAAW;GAC/B,IAAM,IAAW,EAAe,EAAO,IAAI;GAU3C,OARI,EAAO,MAAM,YACR;IACL,KAAK;IACL;IACA,KAAK,EAAO;GACd,IAGK;IACL,KAAK;IACL;IACA,KAAK,EAAO;IACZ,gBAAgB,EAAuB,EAAO,IAAI;IAClD,MAAM,EAAO;IACb,GAAG,EAAyB,YAAY;KACtC,IAAM,IAAQ,EAAkB,GAAW,EAAO,IAAI,GAIhD,IAAU,EAAM;KAKtB,OAAO,EAAM,eAAe,KAC1B,EAAM,eAAe,EAAQ,aAC3B,IACA,EAAQ,MACN,EAAM,YACN,EAAM,aAAa,EAAM,UAC3B;IACN,GAAG,EAAuB,EAAO,IAAI,KAAK,EAAE;GAC9C;EACF,CAAC;EACD,aAAa,QAAQ,QAAQ;CAC/B,CAAC;AACH"}
@@ -0,0 +1,7 @@
1
+ import { Extractor } from 'node-unrar-js';
2
+ import { Archive } from './types';
3
+ export declare const createArchiveFromNodeUnrarJs: (extractor: Extractor<Uint8Array>, { orderByAlpha, name, encodingFormat, }?: {
4
+ orderByAlpha?: boolean;
5
+ name?: string;
6
+ encodingFormat?: string;
7
+ }) => Promise<Archive>;
@@ -0,0 +1,2 @@
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../createArchive-CeuyJUIj.cjs"),t=require("../../uri-DW0-P-ng.cjs"),n=require("../../fileAccessors-DWVChFUB.cjs");let r=require("@prose-reader/shared");var i=async(i,{orderByAlpha:a,name:o,encodingFormat:s}={})=>{let c=i.files;return a&&(c=c.slice().sort((e,n)=>t.i(e.path,n.path))),e.t({filename:o,encodingFormat:s,records:c.map(e=>{let i=t.n(e.path);return e.type===`Directory`?{dir:!0,basename:i,uri:e.path}:{dir:!1,basename:i,uri:e.path,encodingFormat:(0,r.detectMimeTypeFromName)(e.path),size:e.uncompressedSize,...n.t(async()=>{let t=await e.buffer(),n=t.buffer;return t.byteOffset===0&&t.byteLength===n.byteLength?n:n.slice(t.byteOffset,t.byteOffset+t.byteLength)},(0,r.detectMimeTypeFromName)(e.path)??``)}}),close:()=>Promise.resolve()})};exports.createArchiveFromUnzipper=i;
2
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/archives/createArchiveFromUnzipper.ts"],"sourcesContent":["import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport type { CentralDirectory } from \"unzipper\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { createArchive } from \"./createArchive\"\nimport { arrayBufferFileAccessors } from \"./fileAccessors\"\nimport type { Archive } from \"./types\"\n\nexport const createArchiveFromUnzipper = async (\n directory: CentralDirectory,\n {\n orderByAlpha,\n name,\n encodingFormat,\n }: { orderByAlpha?: boolean; name?: string; encodingFormat?: string } = {},\n): Promise<Archive> => {\n let files = directory.files\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.path, b.path))\n }\n\n return createArchive({\n filename: name,\n encodingFormat,\n records: files.map((file) => {\n const basename = getUriBasename(file.path)\n\n if (file.type === `Directory`) {\n return {\n dir: true,\n basename,\n uri: file.path,\n }\n }\n\n return {\n dir: false,\n basename,\n uri: file.path,\n encodingFormat: detectMimeTypeFromName(file.path),\n size: file.uncompressedSize,\n ...arrayBufferFileAccessors(async () => {\n const buffer = await file.buffer()\n // unzipper decodes into a regular Node `Buffer`, whose backing store\n // is always an `ArrayBuffer` (never a `SharedArrayBuffer`); the cast\n // only drops the `SharedArrayBuffer` arm that cannot occur here.\n const backing = buffer.buffer as ArrayBuffer\n\n // Non-pooled (large) allocations own a dedicated, exactly-sized\n // backing buffer, so they can be handed out without copying. Pooled\n // small buffers share their backing store with other entries and\n // must be sliced out.\n return buffer.byteOffset === 0 &&\n buffer.byteLength === backing.byteLength\n ? backing\n : backing.slice(\n buffer.byteOffset,\n buffer.byteOffset + buffer.byteLength,\n )\n }, detectMimeTypeFromName(file.path) ?? ``),\n }\n }),\n close: () => Promise.resolve(),\n })\n}\n"],"mappings":"+OAQA,IAAa,EAA4B,MACvC,EACA,CACE,eACA,OACA,kBACsE,CAAC,IACpD,CACrB,IAAI,EAAQ,EAAU,MAMtB,OAJI,IACF,EAAQ,EAAM,MAAM,EAAE,MAAM,EAAG,IAAM,EAAA,EAAsB,EAAE,KAAM,EAAE,IAAI,CAAC,GAGrE,EAAA,EAAc,CACnB,SAAU,EACV,iBACA,QAAS,EAAM,IAAK,GAAS,CAC3B,IAAM,EAAW,EAAA,EAAe,EAAK,IAAI,EAUzC,OARI,EAAK,OAAS,YACT,CACL,IAAK,GACL,WACA,IAAK,EAAK,IACZ,EAGK,CACL,IAAK,GACL,WACA,IAAK,EAAK,KACV,gBAAA,EAAA,EAAA,wBAAuC,EAAK,IAAI,EAChD,KAAM,EAAK,iBACX,GAAG,EAAA,EAAyB,SAAY,CACtC,IAAM,EAAS,MAAM,EAAK,OAAO,EAI3B,EAAU,EAAO,OAMvB,OAAO,EAAO,aAAe,GAC3B,EAAO,aAAe,EAAQ,WAC5B,EACA,EAAQ,MACN,EAAO,WACP,EAAO,WAAa,EAAO,UAC7B,CACN,GAAA,EAAA,EAAA,wBAA0B,EAAK,IAAI,GAAK,EAAE,CAC5C,CACF,CAAC,EACD,UAAa,QAAQ,QAAQ,CAC/B,CAAC,CACH"}
@@ -0,0 +1,35 @@
1
+ import { t as e } from "../../createArchive-BB7-JJjh.js";
2
+ import { i as t, n } from "../../uri-DBZYnB1I.js";
3
+ import { t as r } from "../../fileAccessors-etcCPnpQ.js";
4
+ import { detectMimeTypeFromName as i } from "@prose-reader/shared";
5
+ //#region src/archives/createArchiveFromUnzipper.ts
6
+ var a = async (a, { orderByAlpha: o, name: s, encodingFormat: c } = {}) => {
7
+ let l = a.files;
8
+ return o && (l = l.slice().sort((e, n) => t(e.path, n.path))), e({
9
+ filename: s,
10
+ encodingFormat: c,
11
+ records: l.map((e) => {
12
+ let t = n(e.path);
13
+ return e.type === "Directory" ? {
14
+ dir: !0,
15
+ basename: t,
16
+ uri: e.path
17
+ } : {
18
+ dir: !1,
19
+ basename: t,
20
+ uri: e.path,
21
+ encodingFormat: i(e.path),
22
+ size: e.uncompressedSize,
23
+ ...r(async () => {
24
+ let t = await e.buffer(), n = t.buffer;
25
+ return t.byteOffset === 0 && t.byteLength === n.byteLength ? n : n.slice(t.byteOffset, t.byteOffset + t.byteLength);
26
+ }, i(e.path) ?? "")
27
+ };
28
+ }),
29
+ close: () => Promise.resolve()
30
+ });
31
+ };
32
+ //#endregion
33
+ export { a as createArchiveFromUnzipper };
34
+
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/archives/createArchiveFromUnzipper.ts"],"sourcesContent":["import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport type { CentralDirectory } from \"unzipper\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { createArchive } from \"./createArchive\"\nimport { arrayBufferFileAccessors } from \"./fileAccessors\"\nimport type { Archive } from \"./types\"\n\nexport const createArchiveFromUnzipper = async (\n directory: CentralDirectory,\n {\n orderByAlpha,\n name,\n encodingFormat,\n }: { orderByAlpha?: boolean; name?: string; encodingFormat?: string } = {},\n): Promise<Archive> => {\n let files = directory.files\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.path, b.path))\n }\n\n return createArchive({\n filename: name,\n encodingFormat,\n records: files.map((file) => {\n const basename = getUriBasename(file.path)\n\n if (file.type === `Directory`) {\n return {\n dir: true,\n basename,\n uri: file.path,\n }\n }\n\n return {\n dir: false,\n basename,\n uri: file.path,\n encodingFormat: detectMimeTypeFromName(file.path),\n size: file.uncompressedSize,\n ...arrayBufferFileAccessors(async () => {\n const buffer = await file.buffer()\n // unzipper decodes into a regular Node `Buffer`, whose backing store\n // is always an `ArrayBuffer` (never a `SharedArrayBuffer`); the cast\n // only drops the `SharedArrayBuffer` arm that cannot occur here.\n const backing = buffer.buffer as ArrayBuffer\n\n // Non-pooled (large) allocations own a dedicated, exactly-sized\n // backing buffer, so they can be handed out without copying. Pooled\n // small buffers share their backing store with other entries and\n // must be sliced out.\n return buffer.byteOffset === 0 &&\n buffer.byteLength === backing.byteLength\n ? backing\n : backing.slice(\n buffer.byteOffset,\n buffer.byteOffset + buffer.byteLength,\n )\n }, detectMimeTypeFromName(file.path) ?? ``),\n }\n }),\n close: () => Promise.resolve(),\n })\n}\n"],"mappings":";;;;;AAQA,IAAa,IAA4B,OACvC,GACA,EACE,iBACA,SACA,sBACsE,CAAC,MACpD;CACrB,IAAI,IAAQ,EAAU;CAMtB,OAJI,MACF,IAAQ,EAAM,MAAM,EAAE,MAAM,GAAG,MAAM,EAAsB,EAAE,MAAM,EAAE,IAAI,CAAC,IAGrE,EAAc;EACnB,UAAU;EACV;EACA,SAAS,EAAM,KAAK,MAAS;GAC3B,IAAM,IAAW,EAAe,EAAK,IAAI;GAUzC,OARI,EAAK,SAAS,cACT;IACL,KAAK;IACL;IACA,KAAK,EAAK;GACZ,IAGK;IACL,KAAK;IACL;IACA,KAAK,EAAK;IACV,gBAAgB,EAAuB,EAAK,IAAI;IAChD,MAAM,EAAK;IACX,GAAG,EAAyB,YAAY;KACtC,IAAM,IAAS,MAAM,EAAK,OAAO,GAI3B,IAAU,EAAO;KAMvB,OAAO,EAAO,eAAe,KAC3B,EAAO,eAAe,EAAQ,aAC5B,IACA,EAAQ,MACN,EAAO,YACP,EAAO,aAAa,EAAO,UAC7B;IACN,GAAG,EAAuB,EAAK,IAAI,KAAK,EAAE;GAC5C;EACF,CAAC;EACD,aAAa,QAAQ,QAAQ;CAC/B,CAAC;AACH"}
@@ -0,0 +1,35 @@
1
+ import { Report as e } from "@prose-reader/shared";
2
+ //#endregion
3
+ //#region src/report.ts
4
+ var t = e.namespace("@prose-reader/streamer", !1, { color: "#ffae42" }), n = (e) => {
5
+ let t = {};
6
+ for (let n of e) {
7
+ let e = n.split("/"), r = t;
8
+ for (let t = 0; t < e.length; t++) {
9
+ let n = e[t];
10
+ n !== void 0 && (r[n] || (r[n] = {}), r = r[n]);
11
+ }
12
+ }
13
+ let n = (e, t = "") => Object.keys(e).sort().map((r, i, a) => {
14
+ let o = i === a.length - 1, s = t + (o ? "└── " : "├── "), c = t + (o ? " " : "│ "), l = e[r];
15
+ return l && Object.keys(l).length > 0 ? `${s}${r}/\n${n(l, c)}` : `${s}${r}`;
16
+ }).join("\n");
17
+ return n(t);
18
+ }, r = ({ records: e, ...r }) => {
19
+ let i = /* @__PURE__ */ new Map();
20
+ for (let t of e) i.has(t.uri) || i.set(t.uri, t);
21
+ let a = {
22
+ ...r,
23
+ records: e,
24
+ recordsByUri: i
25
+ };
26
+ if (t.log("Generated archive", a), process.env.NODE_ENV === "development" && t.isEnabled()) {
27
+ let r = n(e.map((e) => e.uri));
28
+ t.groupCollapsed(...t.getGroupArgs("Archive folder structure")), t.log(`\n${r}`), t.groupEnd();
29
+ }
30
+ return a;
31
+ };
32
+ //#endregion
33
+ export { t as n, r as t };
34
+
35
+ //# sourceMappingURL=createArchive-BB7-JJjh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createArchive-BB7-JJjh.js","names":[],"sources":["../package.json","../src/report.ts","../src/archives/printTree.ts","../src/archives/createArchive.ts"],"sourcesContent":["{\n \"name\": \"@prose-reader/streamer\",\n \"version\": \"1.308.0\",\n \"type\": \"module\",\n \"main\": \"./dist/index/index.cjs\",\n \"module\": \"./dist/index/index.js\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index/index.js\",\n \"require\": \"./dist/index/index.cjs\"\n },\n \"./archives/createArchiveFromJszip\": {\n \"types\": \"./dist/archives/createArchiveFromJszip.d.ts\",\n \"import\": \"./dist/archives/createArchiveFromJszip/index.js\",\n \"require\": \"./dist/archives/createArchiveFromJszip/index.cjs\"\n },\n \"./archives/createArchiveFromLibArchive\": {\n \"types\": \"./dist/archives/createArchiveFromLibArchive.d.ts\",\n \"import\": \"./dist/archives/createArchiveFromLibArchive/index.js\",\n \"require\": \"./dist/archives/createArchiveFromLibArchive/index.cjs\"\n },\n \"./archives/createArchiveFromUnzipper\": {\n \"types\": \"./dist/archives/createArchiveFromUnzipper.d.ts\",\n \"import\": \"./dist/archives/createArchiveFromUnzipper/index.js\",\n \"require\": \"./dist/archives/createArchiveFromUnzipper/index.cjs\"\n },\n \"./archives/createArchiveFromNodeUnrarJs\": {\n \"types\": \"./dist/archives/createArchiveFromNodeUnrarJs.d.ts\",\n \"import\": \"./dist/archives/createArchiveFromNodeUnrarJs/index.js\",\n \"require\": \"./dist/archives/createArchiveFromNodeUnrarJs/index.cjs\"\n }\n },\n \"types\": \"./dist/index.d.ts\",\n \"license\": \"MIT\",\n \"files\": [\n \"/dist\"\n ],\n \"scripts\": {\n \"start\": \"vite build --watch --mode development\",\n \"build\": \"tsc && vite build\",\n \"test\": \"vitest run --coverage\",\n \"tsc\": \"tsc\",\n \"test:watch\": \"vitest watch\"\n },\n \"dependencies\": {\n \"@prose-reader/archive-parser\": \"^1.308.0\",\n \"@prose-reader/shared\": \"^1.308.0\",\n \"xmldoc\": \"^2.0.0\"\n },\n \"peerDependencies\": {\n \"buffer\": \"^6.0.3\",\n \"jszip\": \"^3.10.0\",\n \"libarchive.js\": \"^2.0.2\",\n \"node-unrar-js\": \"^2.0.2\",\n \"rxjs\": \"*\",\n \"unzipper\": \"^0.12.3\"\n },\n \"peerDependenciesMeta\": {\n \"jszip\": {\n \"optional\": true\n },\n \"unzipper\": {\n \"optional\": true\n },\n \"libarchive.js\": {\n \"optional\": true\n },\n \"node-unrar-js\": {\n \"optional\": true\n }\n },\n \"gitHead\": \"4601e14dcacf50b2295cb343582a7ef2c7e1eedc\",\n \"devDependencies\": {\n \"@types/unzipper\": \"^0.10.11\",\n \"buffer\": \"^6.0.3\",\n \"isomorphic-fetch\": \"^3.0.0\",\n \"jszip\": \"^3.10.0\",\n \"libarchive.js\": \"^2.0.2\",\n \"node-unrar-js\": \"^2.0.2\",\n \"unzipper\": \"^0.12.3\"\n }\n}\n","import { Report as SharedReport } from \"@prose-reader/shared\"\nimport { name } from \"../package.json\"\n\nexport const Report = SharedReport.namespace(name, false, {\n color: \"#ffae42\",\n})\n","interface TreeNode {\n [key: string]: TreeNode\n}\n\nexport const printTree = (paths: string[]): string => {\n // Split and collect all parts for tree reconstruction\n const tree: TreeNode = {}\n for (const path of paths) {\n const parts = path.split(\"/\")\n let node = tree\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n if (part === undefined) continue\n if (!node[part]) {\n node[part] = {}\n }\n node = node[part]\n }\n }\n\n // Recursively build the tree string\n const render = (node: TreeNode, indent = \"\"): string => {\n return Object.keys(node)\n .sort()\n .map((key, i, arr) => {\n const isLast = i === arr.length - 1\n const prefix = indent + (isLast ? \"└── \" : \"├── \")\n const nextIndent = indent + (isLast ? \" \" : \"│ \")\n const value = node[key]\n if (value && Object.keys(value).length > 0) {\n return `${prefix}${key}/\\n${render(value, nextIndent)}`\n }\n return `${prefix}${key}`\n })\n .join(\"\\n\")\n }\n\n return render(tree)\n}\n","import { Report } from \"../report\"\nimport { printTree } from \"./printTree\"\nimport type { Archive, ArchiveRecord } from \"./types\"\n\ntype ArchiveInit = Omit<Archive, \"recordsByUri\">\n\n/**\n * Builds an {@link Archive} from its records and derives the `recordsByUri`\n * lookup index once, so consumers resolve records in O(1) on the hot path\n * instead of scanning {@link Archive.records}. Duplicate URIs keep the first\n * record, matching the previous `Array.prototype.find` semantics.\n */\nexport const createArchive = ({ records, ...rest }: ArchiveInit): Archive => {\n const recordsByUri = new Map<string, ArchiveRecord>()\n\n for (const record of records) {\n if (!recordsByUri.has(record.uri)) {\n recordsByUri.set(record.uri, record)\n }\n }\n\n const archive: Archive = {\n ...rest,\n records,\n recordsByUri,\n }\n\n Report.log(\"Generated archive\", archive)\n\n if (process.env.NODE_ENV === \"development\") {\n if (Report.isEnabled()) {\n const folderStructureStr = printTree(records.map((record) => record.uri))\n Report.groupCollapsed(...Report.getGroupArgs(\"Archive folder structure\"))\n Report.log(`\\n${folderStructureStr}`)\n Report.groupEnd()\n }\n }\n\n return archive\n}\n"],"mappings":";;;ACGA,IAAa,IAAS,EAAa,UAAU,0BAAM,IAAO,EACxD,OAAO,UACT,CAAC,GCDY,KAAa,MAA4B;CAEpD,IAAM,IAAiB,CAAC;CACxB,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAM,IAAQ,EAAK,MAAM,GAAG,GACxB,IAAO;EACX,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;GACrC,IAAM,IAAO,EAAM;GACf,MAAS,KAAA,MACR,EAAK,OACR,EAAK,KAAQ,CAAC,IAEhB,IAAO,EAAK;EACd;CACF;CAGA,IAAM,KAAU,GAAgB,IAAS,OAChC,OAAO,KAAK,CAAI,EACpB,KAAK,EACL,KAAK,GAAK,GAAG,MAAQ;EACpB,IAAM,IAAS,MAAM,EAAI,SAAS,GAC5B,IAAS,KAAU,IAAS,SAAS,SACrC,IAAa,KAAU,IAAS,SAAS,SACzC,IAAQ,EAAK;EAInB,OAHI,KAAS,OAAO,KAAK,CAAK,EAAE,SAAS,IAChC,GAAG,IAAS,EAAI,KAAK,EAAO,GAAO,CAAU,MAE/C,GAAG,IAAS;CACrB,CAAC,EACA,KAAK,IAAI;CAGd,OAAO,EAAO,CAAI;AACpB,GC1Ba,KAAiB,EAAE,YAAS,GAAG,QAAiC;CAC3E,IAAM,oBAAe,IAAI,IAA2B;CAEpD,KAAK,IAAM,KAAU,GACnB,AAAK,EAAa,IAAI,EAAO,GAAG,KAC9B,EAAa,IAAI,EAAO,KAAK,CAAM;CAIvC,IAAM,IAAmB;EACvB,GAAG;EACH;EACA;CACF;CAIA,IAFA,EAAO,IAAI,qBAAqB,CAAO,GAEvC,QAAA,IAAA,aAA6B,iBACvB,EAAO,UAAU,GAAG;EACtB,IAAM,IAAqB,EAAU,EAAQ,KAAK,MAAW,EAAO,GAAG,CAAC;EAGxE,AAFA,EAAO,eAAe,GAAG,EAAO,aAAa,0BAA0B,CAAC,GACxE,EAAO,IAAI,KAAK,GAAoB,GACpC,EAAO,SAAS;CAClB;CAGF,OAAO;AACT"}
@@ -0,0 +1,3 @@
1
+ var e=require("@prose-reader/shared").Report.namespace(`@prose-reader/streamer`,!1,{color:`#ffae42`}),t=e=>{let t={};for(let n of e){let e=n.split(`/`),r=t;for(let t=0;t<e.length;t++){let n=e[t];n!==void 0&&(r[n]||(r[n]={}),r=r[n])}}let n=(e,t=``)=>Object.keys(e).sort().map((r,i,a)=>{let o=i===a.length-1,s=t+(o?`└── `:`├── `),c=t+(o?` `:`│ `),l=e[r];return l&&Object.keys(l).length>0?`${s}${r}/\n${n(l,c)}`:`${s}${r}`}).join(`
2
+ `);return n(t)},n=({records:n,...r})=>{let i=new Map;for(let e of n)i.has(e.uri)||i.set(e.uri,e);let a={...r,records:n,recordsByUri:i};if(e.log(`Generated archive`,a),process.env.NODE_ENV===`development`&&e.isEnabled()){let r=t(n.map(e=>e.uri));e.groupCollapsed(...e.getGroupArgs(`Archive folder structure`)),e.log(`\n${r}`),e.groupEnd()}return a};Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return n}});
3
+ //# sourceMappingURL=createArchive-CeuyJUIj.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createArchive-CeuyJUIj.cjs","names":[],"sources":["../package.json","../src/report.ts","../src/archives/printTree.ts","../src/archives/createArchive.ts"],"sourcesContent":["{\n \"name\": \"@prose-reader/streamer\",\n \"version\": \"1.308.0\",\n \"type\": \"module\",\n \"main\": \"./dist/index/index.cjs\",\n \"module\": \"./dist/index/index.js\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index/index.js\",\n \"require\": \"./dist/index/index.cjs\"\n },\n \"./archives/createArchiveFromJszip\": {\n \"types\": \"./dist/archives/createArchiveFromJszip.d.ts\",\n \"import\": \"./dist/archives/createArchiveFromJszip/index.js\",\n \"require\": \"./dist/archives/createArchiveFromJszip/index.cjs\"\n },\n \"./archives/createArchiveFromLibArchive\": {\n \"types\": \"./dist/archives/createArchiveFromLibArchive.d.ts\",\n \"import\": \"./dist/archives/createArchiveFromLibArchive/index.js\",\n \"require\": \"./dist/archives/createArchiveFromLibArchive/index.cjs\"\n },\n \"./archives/createArchiveFromUnzipper\": {\n \"types\": \"./dist/archives/createArchiveFromUnzipper.d.ts\",\n \"import\": \"./dist/archives/createArchiveFromUnzipper/index.js\",\n \"require\": \"./dist/archives/createArchiveFromUnzipper/index.cjs\"\n },\n \"./archives/createArchiveFromNodeUnrarJs\": {\n \"types\": \"./dist/archives/createArchiveFromNodeUnrarJs.d.ts\",\n \"import\": \"./dist/archives/createArchiveFromNodeUnrarJs/index.js\",\n \"require\": \"./dist/archives/createArchiveFromNodeUnrarJs/index.cjs\"\n }\n },\n \"types\": \"./dist/index.d.ts\",\n \"license\": \"MIT\",\n \"files\": [\n \"/dist\"\n ],\n \"scripts\": {\n \"start\": \"vite build --watch --mode development\",\n \"build\": \"tsc && vite build\",\n \"test\": \"vitest run --coverage\",\n \"tsc\": \"tsc\",\n \"test:watch\": \"vitest watch\"\n },\n \"dependencies\": {\n \"@prose-reader/archive-parser\": \"^1.308.0\",\n \"@prose-reader/shared\": \"^1.308.0\",\n \"xmldoc\": \"^2.0.0\"\n },\n \"peerDependencies\": {\n \"buffer\": \"^6.0.3\",\n \"jszip\": \"^3.10.0\",\n \"libarchive.js\": \"^2.0.2\",\n \"node-unrar-js\": \"^2.0.2\",\n \"rxjs\": \"*\",\n \"unzipper\": \"^0.12.3\"\n },\n \"peerDependenciesMeta\": {\n \"jszip\": {\n \"optional\": true\n },\n \"unzipper\": {\n \"optional\": true\n },\n \"libarchive.js\": {\n \"optional\": true\n },\n \"node-unrar-js\": {\n \"optional\": true\n }\n },\n \"gitHead\": \"4601e14dcacf50b2295cb343582a7ef2c7e1eedc\",\n \"devDependencies\": {\n \"@types/unzipper\": \"^0.10.11\",\n \"buffer\": \"^6.0.3\",\n \"isomorphic-fetch\": \"^3.0.0\",\n \"jszip\": \"^3.10.0\",\n \"libarchive.js\": \"^2.0.2\",\n \"node-unrar-js\": \"^2.0.2\",\n \"unzipper\": \"^0.12.3\"\n }\n}\n","import { Report as SharedReport } from \"@prose-reader/shared\"\nimport { name } from \"../package.json\"\n\nexport const Report = SharedReport.namespace(name, false, {\n color: \"#ffae42\",\n})\n","interface TreeNode {\n [key: string]: TreeNode\n}\n\nexport const printTree = (paths: string[]): string => {\n // Split and collect all parts for tree reconstruction\n const tree: TreeNode = {}\n for (const path of paths) {\n const parts = path.split(\"/\")\n let node = tree\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n if (part === undefined) continue\n if (!node[part]) {\n node[part] = {}\n }\n node = node[part]\n }\n }\n\n // Recursively build the tree string\n const render = (node: TreeNode, indent = \"\"): string => {\n return Object.keys(node)\n .sort()\n .map((key, i, arr) => {\n const isLast = i === arr.length - 1\n const prefix = indent + (isLast ? \"└── \" : \"├── \")\n const nextIndent = indent + (isLast ? \" \" : \"│ \")\n const value = node[key]\n if (value && Object.keys(value).length > 0) {\n return `${prefix}${key}/\\n${render(value, nextIndent)}`\n }\n return `${prefix}${key}`\n })\n .join(\"\\n\")\n }\n\n return render(tree)\n}\n","import { Report } from \"../report\"\nimport { printTree } from \"./printTree\"\nimport type { Archive, ArchiveRecord } from \"./types\"\n\ntype ArchiveInit = Omit<Archive, \"recordsByUri\">\n\n/**\n * Builds an {@link Archive} from its records and derives the `recordsByUri`\n * lookup index once, so consumers resolve records in O(1) on the hot path\n * instead of scanning {@link Archive.records}. Duplicate URIs keep the first\n * record, matching the previous `Array.prototype.find` semantics.\n */\nexport const createArchive = ({ records, ...rest }: ArchiveInit): Archive => {\n const recordsByUri = new Map<string, ArchiveRecord>()\n\n for (const record of records) {\n if (!recordsByUri.has(record.uri)) {\n recordsByUri.set(record.uri, record)\n }\n }\n\n const archive: Archive = {\n ...rest,\n records,\n recordsByUri,\n }\n\n Report.log(\"Generated archive\", archive)\n\n if (process.env.NODE_ENV === \"development\") {\n if (Report.isEnabled()) {\n const folderStructureStr = printTree(records.map((record) => record.uri))\n Report.groupCollapsed(...Report.getGroupArgs(\"Archive folder structure\"))\n Report.log(`\\n${folderStructureStr}`)\n Report.groupEnd()\n }\n }\n\n return archive\n}\n"],"mappings":"ACGA,IAAa,gCAAS,EAAA,OAAa,UAAU,yBAAM,GAAO,CACxD,MAAO,SACT,CAAC,ECDY,EAAa,GAA4B,CAEpD,IAAM,EAAiB,CAAC,EACxB,IAAK,IAAM,KAAQ,EAAO,CACxB,IAAM,EAAQ,EAAK,MAAM,GAAG,EACxB,EAAO,EACX,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,IAAK,CACrC,IAAM,EAAO,EAAM,GACf,IAAS,IAAA,KACR,EAAK,KACR,EAAK,GAAQ,CAAC,GAEhB,EAAO,EAAK,GACd,CACF,CAGA,IAAM,GAAU,EAAgB,EAAS,KAChC,OAAO,KAAK,CAAI,EACpB,KAAK,EACL,KAAK,EAAK,EAAG,IAAQ,CACpB,IAAM,EAAS,IAAM,EAAI,OAAS,EAC5B,EAAS,GAAU,EAAS,OAAS,QACrC,EAAa,GAAU,EAAS,OAAS,QACzC,EAAQ,EAAK,GAInB,OAHI,GAAS,OAAO,KAAK,CAAK,EAAE,OAAS,EAChC,GAAG,IAAS,EAAI,KAAK,EAAO,EAAO,CAAU,IAE/C,GAAG,IAAS,GACrB,CAAC,EACA,KAAK;CAAI,EAGd,OAAO,EAAO,CAAI,CACpB,EC1Ba,GAAiB,CAAE,UAAS,GAAG,KAAiC,CAC3E,IAAM,EAAe,IAAI,IAEzB,IAAK,IAAM,KAAU,EACd,EAAa,IAAI,EAAO,GAAG,GAC9B,EAAa,IAAI,EAAO,IAAK,CAAM,EAIvC,IAAM,EAAmB,CACvB,GAAG,EACH,UACA,cACF,EAIA,GAFA,EAAO,IAAI,oBAAqB,CAAO,EAEvC,QAAA,IAAA,WAA6B,eACvB,EAAO,UAAU,EAAG,CACtB,IAAM,EAAqB,EAAU,EAAQ,IAAK,GAAW,EAAO,GAAG,CAAC,EACxE,EAAO,eAAe,GAAG,EAAO,aAAa,0BAA0B,CAAC,EACxE,EAAO,IAAI,KAAK,GAAoB,EACpC,EAAO,SAAS,CAClB,CAGF,OAAO,CACT"}
@@ -1,4 +1,4 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../report-Cs9DVdJl.cjs"),t=require("../uri-DW0-P-ng.cjs"),n=require("../fileAccessors-DWVChFUB.cjs");let r=require("@prose-reader/shared"),i=require("@prose-reader/archive-parser"),a=require("xmldoc"),o=require("rxjs");var s=async(i,{orderByAlpha:a,name:o,encodingFormat:s}={})=>{let c=i;return a&&(c=c.slice().sort((e,n)=>t.i(e.name,n.name))),e.n({filename:o,encodingFormat:s,records:c.map(e=>{let i=t.n(e.name);return e.isDir?{dir:!0,basename:i,uri:e.name}:{dir:e.isDir,basename:i,encodingFormat:(0,r.detectMimeTypeFromName)(e.name),uri:e.name,size:e.size,...n.t(e.data,(0,r.detectMimeTypeFromName)(e.name)??``)}}),close:()=>Promise.resolve()})},c=async(r,{mimeType:i,direction:a}={mimeType:`text/plain`})=>{let o=`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../createArchive-CeuyJUIj.cjs"),t=require("../uri-DW0-P-ng.cjs"),n=require("../fileAccessors-DWVChFUB.cjs");let r=require("@prose-reader/shared"),i=require("@prose-reader/archive-parser"),a=require("xmldoc"),o=require("rxjs");var s=async(i,{orderByAlpha:a,name:o,encodingFormat:s}={})=>{let c=i;return a&&(c=c.slice().sort((e,n)=>t.i(e.name,n.name))),e.t({filename:o,encodingFormat:s,records:c.map(e=>{let i=t.n(e.name);return e.isDir?{dir:!0,basename:i,uri:e.name}:{dir:e.isDir,basename:i,encodingFormat:(0,r.detectMimeTypeFromName)(e.name),uri:e.name,size:e.size,...n.t(e.data,(0,r.detectMimeTypeFromName)(e.name)??``)}}),close:()=>Promise.resolve()})},c=async(r,{mimeType:i,direction:a}={mimeType:`text/plain`})=>{let o=`
2
2
  <?xml version="1.0" encoding="UTF-8"?>
3
3
  <package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="ja" prefix="rendition: http://www.idpf.org/vocab/rendition/#"
4
4
  unique-identifier="ootuya-id">
@@ -13,7 +13,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
13
13
  <itemref idref="p01" />
14
14
  </spine>
15
15
  </package>
16
- `;return e.n({filename:`content.txt`,encodingFormat:i,records:[{dir:!1,basename:t.n(`generated.opf`),uri:`generated.opf`,size:0,...n.n(async()=>new Blob([o]))},{dir:!1,basename:t.n(`p01.txt`),uri:`p01.txt`,size:typeof r==`string`?new Blob([r]).size:r.size,encodingFormat:i,...n.n(async()=>typeof r==`string`?new Blob([r]):r)}],close:()=>Promise.resolve()})},l=/^[A-Za-z0-9_][A-Za-z0-9_.-]*$/,u=/^[A-Za-z0-9_]/,d=/^xml/i,f=/[^A-Za-z0-9_.-]+/g,p=`_`,m=e=>e.replace(/^_+|_+$/g,``),h=e=>m(e.trim().replaceAll(`/`,`_`).replace(f,`_`)),g=e=>{if(l.test(e)&&!d.test(e))return e;let t=h(e),n=t&&!d.test(t)?t:`${p}${t}`;return u.test(n)?n:`${p}${n}`},_=(e,t)=>{let n=g(e);if(!t.has(n))return t.add(n),n;let r=2,i=`${n}-${r}`;for(;t.has(i);)r+=1,i=`${n}-${r}`;return t.add(i),i},v=()=>{let e=new Set;return t=>_(t,e)},ee=async(i,a)=>{let o=v(),s=i.map(e=>({id:o(e),url:e})),c=`
16
+ `;return e.t({filename:`content.txt`,encodingFormat:i,records:[{dir:!1,basename:t.n(`generated.opf`),uri:`generated.opf`,size:0,...n.n(async()=>new Blob([o]))},{dir:!1,basename:t.n(`p01.txt`),uri:`p01.txt`,size:typeof r==`string`?new Blob([r]).size:r.size,encodingFormat:i,...n.n(async()=>typeof r==`string`?new Blob([r]):r)}],close:()=>Promise.resolve()})},l=/^[A-Za-z0-9_][A-Za-z0-9_.-]*$/,u=/^[A-Za-z0-9_]/,d=/^xml/i,f=/[^A-Za-z0-9_.-]+/g,p=`_`,m=e=>e.replace(/^_+|_+$/g,``),h=e=>m(e.trim().replaceAll(`/`,`_`).replace(f,`_`)),g=e=>{if(l.test(e)&&!d.test(e))return e;let t=h(e),n=t&&!d.test(t)?t:`${p}${t}`;return u.test(n)?n:`${p}${n}`},_=(e,t)=>{let n=g(e);if(!t.has(n))return t.add(n),n;let r=2,i=`${n}-${r}`;for(;t.has(i);)r+=1,i=`${n}-${r}`;return t.add(i),i},v=()=>{let e=new Set;return t=>_(t,e)},ee=async(i,a)=>{let o=v(),s=i.map(e=>({id:o(e),url:e})),c=`
17
17
  <?xml version="1.0" encoding="UTF-8"?><package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid">
18
18
  <metadata>
19
19
  <meta property="rendition:layout">${a?.useRenditionFlow?`reflowable`:`pre-paginated`}</meta>
@@ -28,5 +28,5 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
28
28
  `)}
29
29
  </spine>
30
30
  </package>
31
- `,l=i.map(e=>({dir:!1,basename:t.n(e),encodingFormat:(0,r.detectMimeTypeFromName)(e),uri:e,size:0,...n.n(async()=>(await fetch(e)).blob())}));return e.n({records:[{dir:!1,basename:`content.opf`,uri:`content.opf`,size:0,...n.n(async()=>new Blob([c]))},...l],close:()=>Promise.resolve()})},y=e=>!e.dir,b=e=>e.dir,x=(e,t)=>{let n=e.recordsByUri.get(t);return n&&y(n)?n:void 0},S=i.COMIC_INFO_FILENAME.toLowerCase(),C=e=>e.records.find(e=>y(e)&&e.basename.toLowerCase()===S),w=async e=>new TextDecoder().decode(await e.arrayBuffer()),te=({enableReport:t}={})=>{e.t.enable(!!t)},T=e=>{let t=e.records.filter(e=>!e.dir).find(e=>e.uri.endsWith(`.opf`));return{data:t,basePath:t?.uri.substring(0,t.uri.lastIndexOf(`/`))||``}};async function E(e){let{data:t,basePath:n}=T(e)||{};if(!(!t||t.dir))return{opf:(0,i.parseOpf)(await w(t)),basePath:n}}var D=i.APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME.toLowerCase(),ne=({archive:e})=>async t=>{let n=e.records.find(e=>!e.dir&&e.basename.toLowerCase()===D);if(!n||n.dir)return t;let r=await w(n);try{let{renditionLayout:e}=(0,i.resolveArchiveMetadata)((0,i.parseAppleDisplayOptionsXml)(r));return{...t,renditionLayout:t.renditionLayout??e}}catch(e){return console.error(`Unable to parse ${i.APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME} for content\n`,r),console.error(e),t}},re=i.COMIC_INFO_FILENAME.toLowerCase(),ie=({archive:e})=>async t=>{let n=C(e);if(!n)return t;let r={...t,spineItems:t.spineItems.filter(e=>!e.id.toLowerCase().endsWith(re)).map((e,t,n)=>({...e,progressionWeight:1/n.length}))},a=await w(n);try{let e=(0,i.resolveArchiveMetadata)((0,i.parseComicInfo)(a));return{...r,readingDirection:e.readingDirection??r.readingDirection}}catch(e){return console.error(`Unable to parse ${i.COMIC_INFO_FILENAME} for content\n`,a),console.error(e),r}},ae=({baseUrl:e=``,resourcePath:t})=>{if(!e&&/^https?:\/\//.test(t))return encodeURI(t);let n=e?`${e}${e.endsWith(`/`)?``:`/`}`:`file://`;return encodeURI(`${n}${t}`)},oe=({archive:e,baseUrl:t})=>async()=>{let n=e.records.filter(e=>!e.dir),r=v(),i=n.map(e=>({file:e,id:r(e.uri)}));return{filename:e.filename??``,title:e.records.find(({dir:e})=>e)?.basename.replace(/\/$/,``)||e.filename||``,renditionLayout:void 0,renditionSpread:`auto`,readingDirection:void 0,spineItems:i.filter(({file:e})=>!e.basename.endsWith(`.db`)).map(({file:e,id:r},i)=>({id:r,index:i,href:ae({baseUrl:t,resourcePath:e.uri}),renditionLayout:void 0,progressionWeight:1/n.length,pageSpreadLeft:void 0,pageSpreadRight:void 0,mediaType:e.encodingFormat})),items:i.map(({file:e,id:n})=>({id:n,href:encodeURI(`${t}${e.uri}`)}))}},O=async({archive:e,archiveOpf:t})=>{if(!t)return[];let{opf:n,basePath:r}=t,{spineRows:i}=n;return e.records.filter(e=>i.find(t=>r?`${r}/${t.href}`===e.uri:`${t.href}`===e.uri))},k=(e,t,n)=>{let{basePath:r}=T(t)||{};return e.map(e=>{let t=e.href,i=n?.(t)??``;return{href:r?`${i}${r}/${t}`:`${i}${t}`,id:e.id,mediaType:e.mediaType}})},se=e=>{let t=e?.trim();return t===`scrolled-continuous`||t===`scrolled-doc`||t===`paginated`||t===`auto`?t:`auto`},ce=e=>{let t=e?.trim();if(t===`none`||t===`landscape`||t===`portrait`||t===`both`||t===`auto`)return t},le=e=>{let t=e?.trim();if(t===`cover`||t===`title-page`||t===`copyright-page`||t===`text`)return t},A=({archive:t,baseUrl:n,archiveOpf:r})=>async a=>{if(!r)return a;let{opf:o,basePath:s}=r,c=(0,i.resolveArchiveMetadata)(o);e.t.groupCollapsed(...e.t.getGroupArgs(`OPF parsed`)),e.t.log(`opf`,o),e.t.groupEnd();let l=o.renditionLayoutMeta?.trim(),u=l===`reflowable`||l===`pre-paginated`?l:c.renditionLayout,d=o.title?.trim()||t.records.find(({dir:e})=>e)?.basename||``,f=c.readingDirection??a.readingDirection,p=(await O({archive:t,archiveOpf:r})).filter(y).reduce((e,t)=>t.size+e,0),m=o.guide,h=[];for(let e of m){let t=le(e.type);t!==void 0&&h.push({href:e.href,title:e.title,type:t})}return{filename:t.filename??``,renditionLayout:u,renditionFlow:se(o.renditionFlowMeta),renditionSpread:ce(o.renditionSpreadMeta),title:d,readingDirection:f,spineItems:o.spineRows.map((e,r)=>{let i=x(t,s?`${s}/${e.href}`:e.href),a=i?i.size:0,c=n||(/^https?:\/\//.test(e.href)?``:`file://`);return{id:e.id,index:r,href:e.href.startsWith(`https://`)?e.href:s?`${c}${s}/${e.href}`:`${c}${e.href}`,renditionLayout:e.renditionLayout??u,...e.renditionFlow===void 0?{}:{renditionFlow:e.renditionFlow},progressionWeight:p>0?a/p:1/o.spineRows.length,pageSpreadLeft:e.pageSpreadLeft,pageSpreadRight:e.pageSpreadRight,mediaType:e.mediaType}}),items:k(o.manifestItems,t,e=>/^https?:\/\//.test(e)?``:n||`file://`),guide:h.length>0?h:void 0}},j=e=>{let t=e.descendantWithPath(`head`)?.childrenNamed(`meta`).find(e=>e.attr.name===`viewport`);return!!(t&&t.attr.name===`viewport`)},M=e=>e.reduce(async(e,t)=>{if(!await e||!(0,r.isXmlBasedMimeType)({mimeType:y(t)?t.encodingFormat:void 0,uri:t.uri}))return!1;let n=t.dir?null:await w(t);return n?j(new a.XmlDocument(n)):!1},Promise.resolve(!0)),N=({archive:e,archiveOpf:t})=>async n=>n.renditionLayout===`reflowable`&&n.spineItems.every(e=>e.renditionLayout===`reflowable`)&&await M(await O({archive:e,archiveOpf:t}))?{...n,spineItems:n.spineItems.map(e=>({...e,renditionLayout:`pre-paginated`})),renditionLayout:`pre-paginated`}:n,P=()=>e=>({...e,readingDirection:e.readingDirection??`ltr`}),F=async e=>{let t;return await Promise.all(e.records.map(async e=>{if(e.dir||!e.uri.endsWith(i.KOBO_DISPLAY_OPTIONS_FILENAME))return;let n=await w(e);try{let{renditionLayout:e}=(0,i.parseKoboXml)(n);e&&(t=e)}catch(e){console.error(`Unable to parse ${i.KOBO_DISPLAY_OPTIONS_FILENAME} for content\n`,n),console.error(e)}})),{kind:`kobo`,...t===void 0?{}:{renditionLayout:t}}},I=({archive:e})=>async t=>{let{renditionLayout:n}=(0,i.resolveArchiveMetadata)(await F(e));return{...t,renditionLayout:t.renditionLayout??n}},L=e=>e.toLowerCase().endsWith(`.opf`),R=e=>e.records.some(e=>!e.dir&&(L(e.basename)||L(e.uri))),z=({archive:e})=>async t=>R(e)?t:{...t,spineItems:t.spineItems.map(t=>{let n=e.records.find(e=>decodeURI(t.href).endsWith(e.uri)),i=(0,r.parseContentType)((n&&y(n)?n.encodingFormat:void 0)??``)||(0,r.detectMimeTypeFromName)(n?.basename??``);return{...t,renditionLayout:i&&(0,r.isMediaContentMimeType)(i)?`pre-paginated`:t.renditionLayout}})},B=e=>e?e.children.map(e=>e instanceof a.XmlTextNode?e.text:e instanceof a.XmlElement?B(e):``).join(``).trim():``,V=e=>(0,i.tokenizeXmlSpaceSeparatedList)(e.properties).includes(`nav`),H=(e,{basePath:t,baseUrl:n})=>{let i={contents:[],path:``,href:``,title:``},a=e.childNamed(`span`)||e.childNamed(`a`);i.title=(a?.attr.title||a?.val.trim()||B(a))??``;let o=a?.name;o!==`a`&&(a=e.descendantWithPath(`${o}.a`),a&&(o=a.name.toLowerCase())),o===`a`&&a?.attr.href&&(i.path=(0,r.urlJoin)(t,a.attr.href),i.href=(0,r.urlJoin)(n,t,a.attr.href));let s=e.childNamed(`ol`);if(s){let e=s.childrenNamed(`li`);e&&e.length>0&&(i.contents=e.map(e=>H(e,{basePath:t,baseUrl:n})))}return i},U=(e,{basePath:t,baseUrl:n})=>{let r=[],i;return e.descendantWithPath(`body.nav.ol`)?i=e.descendantWithPath(`body.nav.ol`)?.children:e.descendantWithPath(`body.section.nav.ol`)&&(i=e.descendantWithPath(`body.section.nav.ol`)?.children),i&&i.length>0&&i.filter(e=>e.name===`li`).forEach(e=>{r.push(H(e,{basePath:t,baseUrl:n}))}),r},W=async(e,n,{baseUrl:r})=>{let i=e.manifestItems.find(V);if(i?.href){let e=n.records.find(e=>e.uri.endsWith(i.href));if(e&&!e.dir)return U(new a.XmlDocument(await w(e)),{basePath:t.t(e.uri),baseUrl:r})}},G=(e,{opfBasePath:t,baseUrl:n,prefix:i})=>{let a=e?.childNamed(`${i}content`)?.attr.src||``,o={title:e?.descendantWithPath(`${i}navLabel.${i}text`)?.val||``,path:(0,r.urlJoin)(t,a),href:(0,r.urlJoin)(n,t,a),contents:[]},s=e.childrenNamed(`${i}navPoint`);return s&&s.length>0&&(o.contents=s.map(e=>G(e,{opfBasePath:t,baseUrl:n,prefix:i}))),o},ue=(e,{opfBasePath:t,baseUrl:n})=>{let r=[],i=e.name,a=``;return i.indexOf(`:`)!==-1&&(a=`${i.split(`:`)[0]}:`),e.childNamed(`${a}navMap`)?.childrenNamed(`${a}navPoint`).forEach(e=>{r.push(G(e,{opfBasePath:t,baseUrl:n,prefix:a}))}),r},de=async({opf:e,opfBasePath:t,baseUrl:n,archive:r})=>{let i=e.spineTocIdref;if(i){let o=e.manifestItems.find(e=>e.id===i);if(o){let e=`${t}${t===``?``:`/`}${o.href}`,i=r.records.find(t=>t.uri.endsWith(e));if(i&&!i.dir)return ue(new a.XmlDocument(await w(i)),{opfBasePath:t,baseUrl:n})}}},fe=async(e,t,{baseUrl:n})=>{let{basePath:r}=T(t)||{},i=await W(e,t,{baseUrl:n});if(i)return i;let a=await de({opf:e,opfBasePath:r??``,archive:t,baseUrl:n});if(a)return a},pe=e=>e.replace(/\.[^.]+$/,``).replace(/[_-]/g,` `).replace(/\s+/g,` `).trim(),me=(e,t)=>{if(e.spineItems.length!==0&&e.spineItems.every(e=>((0,r.parseContentType)(e.mediaType??``)||(0,r.detectMimeTypeFromName)(e.href))?.startsWith(`audio/`)))return e.spineItems.map(e=>{let n=t.records.find(t=>!t.dir&&decodeURI(e.href).endsWith(t.uri));return{title:pe(n?.basename??e.href),href:e.href,path:n?.uri??e.href,contents:[]}})},he=(e,{baseUrl:n})=>{let i=[...e.records].sort((e,n)=>t.i(e.uri,n.uri)),a=(e,t,n,r,i)=>{let o=e.find(e=>e.title===t),[s,...c]=n;return o?s?[...e.filter(e=>e!==o),{...o,contents:[...o.contents,...a(o.contents,s,c,r,i)]}]:o.path.split(`/`).length>i.split(`/`).length?[...e.filter(e=>e!==o),{...o,path:i,href:r}]:e:s?[...e,{contents:a([],s,c,r,i),href:r,path:i,title:t}]:[...e,{contents:[],href:r,path:i,title:t}]};return i.reduce((e,t)=>{if(t.dir)return e;let[i,...o]=t.uri.split(`/`).slice(0,-1);return i?a(e,i,o,(0,r.urlJoin)(n,encodeURI(t.uri)).replace(/\/$/,``),t.uri.replace(/\/$/,``)):e},[])},ge=async(e,t,{baseUrl:n,archiveOpf:r})=>{if(r)return await fe(r.opf,e,{baseUrl:n})||[];let i=me(t,e);if(i)return i;let a=he(e,{baseUrl:n});if(a.length!==0)return a},_e=({archive:e,baseUrl:t,archiveOpf:n})=>async r=>{if(r.nav)return r;let i=await ge(e,r,{baseUrl:t,archiveOpf:n});return i?{...r,nav:{toc:i}}:r},ve=e=>e?e.endsWith(`/`)?e:`${e}/`:``,K=async(t,{baseUrl:n=``,hooks:r={}}={})=>{e.t.log(`Generating manifest from archive`,t);let i=await E(t),a=ve(n),o=e=>(e??[]).map(e=>e({archive:t,baseUrl:a})),s=[A({archive:t,baseUrl:a,archiveOpf:i}),ie({archive:t,baseUrl:a}),ne({archive:t,baseUrl:a}),z({archive:t,baseUrl:a}),...o(r.content)],c=o(r.spine),l=[N({archive:t,baseUrl:a,archiveOpf:i}),I({archive:t,baseUrl:a}),...o(r.presentation)],u=[_e({archive:t,baseUrl:a,archiveOpf:i}),...o(r.navigation)],d=[...s,...c,...l,...u,P()];try{let n=oe({archive:t,baseUrl:a})(),r=await d.reduce(async(e,t)=>await t(await e),n);if(e.t.log(`Generated manifest`,r),process.env.NODE_ENV===`development`&&e.t.isEnabled()){let t=JSON.stringify(r,null,2);e.t.groupCollapsed(...e.t.getGroupArgs(`Generated manifest`)),e.t.log(`\n${t}`),e.t.groupEnd()}return r}catch(t){throw e.t.error(t),t}},ye=e=>{let t=e.descendantWithPath(`head`)?.childrenNamed(`meta`).find(e=>e.attr.name===`calibre:cover`);return!!(t&&t.attr.name===`calibre:cover`)},be=e=>e.descendantWithPath(`body`)?.descendantWithPath(`div`)?.childrenNamed(`svg`)?.find(e=>e.attr.width===`100%`&&e.attr.preserveAspectRatio===`none`),xe=({archive:e,resourcePath:t})=>async n=>{let r=x(e,t);if(r?.basename.endsWith(`.xhtml`)){let e=new a.XmlDocument(typeof n.body==`string`?n.body:await w(r));if(ye(e)){let t=be(e);return t&&delete t.attr.preserveAspectRatio,{...n,body:e?.toString()}}}return n},Se=({archive:e,resourcePath:t})=>async n=>xe({archive:e,resourcePath:t})(n),Ce=({archive:e,resourcePath:t})=>async n=>{let r=x(e,t);if(r?.basename.endsWith(`.css`)){let e=(typeof n.body==`string`?n.body:await w(r)).replaceAll(`-webkit-writing-mode`,`writing-mode`);return{...n,body:e}}return n},we=async(e,t)=>{let n=await E(e);if(n){let{opf:r}=n,i=k(r.manifestItems,e,()=>``).find(e=>t.endsWith(e.href))?.mediaType;if(i)return{mediaType:i}}return{mediaType:Te(t)}},Te=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`},Ee=({archive:e,resourcePath:t})=>async n=>{let r=x(e,t);if(!r)return n;let i=await we(e,t);return{...n,params:{...n.params,...r?.encodingFormat&&{contentType:r.encodingFormat},...i.mediaType&&{contentType:i.mediaType}}}},q=`div.span.p.a.li.ul.ol.h1.h2.h3.h4.h5.h6.table.tr.td.th.thead.tbody.tfoot.section.article.header.footer.nav.aside.main.figure.figcaption.blockquote.pre.code.form.textarea.select.option.button.label.fieldset.legend.caption.dl.dt.dd.iframe.video.audio.canvas.script.style`.split(`.`),De=({archive:e,resourcePath:t})=>async n=>{let r=x(e,t);if(r?.basename.endsWith(`.xhtml`)){let e=typeof n.body==`string`?n.body:await w(r);if(!RegExp(`<(${q.join(`|`)})[\\s/>]`,`i`).test(e))return n;let t=RegExp(`<(${q.join(`|`)})(\\s[^>]*)?\\s*/>`,`gi`),i=e.replace(t,(e,t,n=``)=>`<${t} ${n.trim()}></${t}>`);return{...n,body:i}}return n},J=async(t,n,{hooks:r=[]}={})=>{let i={params:{}},a=[...r.map(e=>e({archive:t,resourcePath:n})),Ee({archive:t,resourcePath:n}),De({archive:t,resourcePath:n}),Ce({archive:t,resourcePath:n}),Se({archive:t,resourcePath:n})];try{let r=await a.reduce(async(e,t)=>await t(await e),Promise.resolve(i));if(e.t.log(`Generated resource`,n,r),r.body!==void 0)return r;let o=x(t,n);if(!o)throw Error(`no file found for resourcePath:${n}`);return{...r,body:await o.blob()}}catch(t){throw e.t.error(t),t}},Oe=class{constructor(e){this.cleanArchiveAfter=e,this.state$=new o.BehaviorSubject({status:`idle`,locks:0})}update(e){this.state$.next({...this.state$.getValue(),...e})}get locks$(){return this.state$.pipe((0,o.map)(({locks:e})=>e))}get state(){return this.state$.getValue()}get isUnlocked$(){return this.locks$.pipe((0,o.map)(e=>e<=0),(0,o.distinctUntilChanged)(),(0,o.shareReplay)())}get overTTL$(){return this.isUnlocked$.pipe((0,o.switchMap)(e=>e?this.cleanArchiveAfter===1/0?o.NEVER:(0,o.timer)(this.cleanArchiveAfter):o.NEVER))}},ke=({getArchive:t,cleanArchiveAfter:n=300*1e3})=>{let r=new o.Subject,i=new o.Subject,a=new o.Subject,s={};return r.pipe((0,o.mergeMap)(n=>{let r=s[n];if(!r||r.state.status!==`idle`)return o.EMPTY;let i=!1,c=t=>{e.t.debug(`Cleaning up archive with key: ${t}`);let n=s[t];delete s[t],i||=(n?.state.archive?.close(),!0)};r.update({status:`loading`});let l=r.locks$,u=r.isUnlocked$,d=l.pipe((0,o.pairwise)(),(0,o.filter)(([e,t])=>t>e),(0,o.startWith)(!0));return(0,o.from)(t(n)).pipe((0,o.tap)(e=>{r.update({archive:e,status:`success`})}),(0,o.catchError)(e=>(c(n),r.update({status:`error`,error:e}),o.EMPTY)),(0,o.switchMap)(()=>(0,o.merge)(d.pipe((0,o.switchMap)(()=>a),(0,o.switchMap)(()=>u),(0,o.filter)(e=>e)),r.overTTL$).pipe((0,o.first)(),(0,o.tap)(()=>{c(n)}))))}),(0,o.takeUntil)(i)).subscribe(),{access:e=>{let t=!1,i=s[e]??new Oe(n);s[e]=i,i.update({locks:i.state.locks+1});let a=()=>{t||(t=!0,i.update({locks:i.state.locks-1}))};return r.next(e),(0,o.merge)(i.state$.pipe((0,o.map)(({archive:e})=>e),(0,o.filter)(e=>!!e)),i.state$.pipe((0,o.tap)(({error:e})=>{if(e)throw e}),(0,o.ignoreElements)())).pipe((0,o.first)(),(0,o.map)(e=>({archive:e,release:a})),(0,o.catchError)(e=>{throw a(),e}))},purge:()=>{a.next()},_archives:s}},Y=e=>e?/^\d+$/.test(e)?{valid:!0,value:Number.parseInt(e,10)}:{valid:!1,value:void 0}:{valid:!0,value:void 0},Ae=e=>{if(!e.toLowerCase().startsWith(`bytes=`))return{kind:`missing`};let t=e.slice(6).trim();if(!t)return{kind:`invalid`};if(t.includes(`,`))return{kind:`multi`};let n=/^(\d*)-(\d*)$/.exec(t);if(!n)return{kind:`invalid`};let[,r=``,i=``]=n,a=Y(r.trim()),o=Y(i.trim());return!a.valid||!o.valid?{kind:`invalid`}:{kind:`single`,start:a.value,end:o.value}},X=e=>{if(e instanceof Blob)return{size:e.size,slice:(t,n)=>{let r=e.slice(t,n);return{content:r,length:r.size}}};let t=new TextEncoder().encode(e);return{size:t.byteLength,slice:(e,n)=>{let r=t.slice(e,n);return{content:r,length:r.byteLength}}}},je=({body:e,contentType:t,rangeHeader:n})=>{let r=new Headers;if(t&&r.set(`Content-Type`,t),r.set(`Accept-Ranges`,`bytes`),!n)return e instanceof Blob&&r.set(`Content-Length`,String(e.size)),new Response(e,{status:200,headers:r});let i=Ae(n);if(i.kind===`missing`||i.kind===`multi`)return e instanceof Blob&&r.set(`Content-Length`,String(e.size)),new Response(e,{status:200,headers:r});let a=X(e),o=a.size;if(i.kind===`invalid`)return new Response(null,{status:416,headers:{"Content-Range":`bytes */${o}`}});let s=i.start,c=i.end;if(s===void 0&&c===void 0||(s===void 0?(s=Math.max(0,o-Math.min(c??0,o)),c=o-1):(c===void 0||c>=o)&&(c=o-1),s<0||c<0||s>=o||c>=o||s>c))return new Response(null,{status:416,headers:{"Content-Range":`bytes */${o}`}});let l=a.slice(s,c+1);return r.set(`Content-Length`,String(l.length)),r.set(`Content-Range`,`bytes ${s}-${c}/${o}`),new Response(l.content,{status:206,headers:r})},Z=`file://`,Me=/^https?:\/\//,Ne=e=>{try{return decodeURIComponent(e)}catch{return e}},Q=e=>e.startsWith(Z)?e.slice(Z.length):e,Pe=e=>{let t=Q(e);return Me.test(t)?t:Q(Ne(t))},$=class{constructor({hooks:e,onError:t,onManifestSuccess:n,...r}){this.onError=e=>(console.error(e),new Response(String(e),{status:500})),this.archiveLoader=ke(r),this.hooks=e??{},this.onManifestSuccess=n??(({manifest:e})=>Promise.resolve(e)),this.onError=t??this.onError}prune(){this.archiveLoader.purge()}accessArchive(e){return this.lastAccessedKey!==void 0&&this.lastAccessedKey!==e&&this.archiveLoader.purge(),this.lastAccessedKey=e,this.archiveLoader.access(e)}accessArchiveWithoutLock(e){return this.accessArchive(e).pipe((0,o.map)(({archive:e,release:t})=>(t(),e)))}withArchiveResponse({key:e,getResponse:t}){return(0,o.lastValueFrom)(this.accessArchive(e).pipe((0,o.mergeMap)(({archive:e,release:n})=>(0,o.from)(t(e)).pipe((0,o.finalize)(()=>{n()}))),(0,o.catchError)(e=>(0,o.of)(this.onError(e)))))}fetchManifest({key:e,baseUrl:t}){return this.withArchiveResponse({key:e,getResponse:e=>(0,o.from)(K(e,{baseUrl:t,hooks:this.hooks.manifest})).pipe((0,o.switchMap)(t=>(0,o.from)(this.onManifestSuccess({manifest:t,archive:e}))),(0,o.map)(e=>new Response(JSON.stringify(e),{status:200})))})}fetchResource({key:e,resourcePath:t,request:n}){return this.withArchiveResponse({key:e,getResponse:e=>(0,o.from)(J(e,Pe(t),{hooks:this.hooks.resource})).pipe((0,o.map)(e=>je({body:e.body??``,contentType:e.params.contentType,rangeHeader:n?.headers.get(`range`)})))})}},Fe=class extends ${constructor({getUriInfo:e,...t}){super(t),this.getUriInfo=e,this.fetchEventListener=this.fetchEventListener.bind(this)}fetchEventListener(e){try{let n=this.getUriInfo(e);if(!n)return;let r=t.r(n.baseUrl),i=e.request.url.substring(r.length+1),[a=``]=i.split(`/`),o=t.r(i.substring(a.length+1));i.endsWith(`/manifest`)?e.respondWith(this.fetchManifest({key:a,baseUrl:`${r}/${a}/`})):e.respondWith(this.fetchResource({key:a,resourcePath:o,request:e.request}))}catch(t){e.respondWith(new Response(String(t),{status:500}))}}};exports.ServiceWorkerStreamer=Fe,exports.Streamer=$,exports.arrayBufferFileAccessors=n.t,exports.blobFileAccessors=n.n,exports.configure=te,exports.createArchive=e.n,exports.createArchiveFromArrayBufferList=s,exports.createArchiveFromText=c,exports.createArchiveFromUrls=ee,exports.createUniqueXmlSafeId=_,exports.createXmlSafeId=g,exports.createXmlSafeIdFactory=v,exports.generateManifestFromArchive=K,exports.generateResourceFromArchive=J,exports.getArchiveFileRecordByUri=x,exports.getArchiveHasComicInfo=C,exports.getArchiveOpfInfo=T,exports.getUriBasePath=t.t,exports.getUriBasename=t.n,exports.isDirectoryRecord=b,exports.isFileRecord=y,exports.readRecordAsText=w,exports.removeTrailingSlash=t.r,exports.sortByTitleComparator=t.i;
32
- //# sourceMappingURL=index.cjs.js.map
31
+ `,l=i.map(e=>({dir:!1,basename:t.n(e),encodingFormat:(0,r.detectMimeTypeFromName)(e),uri:e,size:0,...n.n(async()=>(await fetch(e)).blob())}));return e.t({records:[{dir:!1,basename:`content.opf`,uri:`content.opf`,size:0,...n.n(async()=>new Blob([c]))},...l],close:()=>Promise.resolve()})},y=e=>!e.dir,b=e=>e.dir,x=(e,t)=>{let n=e.recordsByUri.get(t);return n&&y(n)?n:void 0},S=i.COMIC_INFO_FILENAME.toLowerCase(),C=e=>e.records.find(e=>y(e)&&e.basename.toLowerCase()===S),w=async e=>new TextDecoder().decode(await e.arrayBuffer()),te=({enableReport:t}={})=>{e.n.enable(!!t)},T=e=>{let t=e.records.filter(e=>!e.dir).find(e=>e.uri.endsWith(`.opf`));return{data:t,basePath:t?.uri.substring(0,t.uri.lastIndexOf(`/`))||``}};async function E(e){let{data:t,basePath:n}=T(e)||{};if(!(!t||t.dir))return{opf:(0,i.parseOpf)(await w(t)),basePath:n}}var D=i.APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME.toLowerCase(),ne=({archive:e})=>async t=>{let n=e.records.find(e=>!e.dir&&e.basename.toLowerCase()===D);if(!n||n.dir)return t;let r=await w(n);try{let{renditionLayout:e}=(0,i.resolveArchiveMetadata)((0,i.parseAppleDisplayOptionsXml)(r));return{...t,renditionLayout:t.renditionLayout??e}}catch(e){return console.error(`Unable to parse ${i.APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME} for content\n`,r),console.error(e),t}},re=i.COMIC_INFO_FILENAME.toLowerCase(),ie=({archive:e})=>async t=>{let n=C(e);if(!n)return t;let r={...t,spineItems:t.spineItems.filter(e=>!e.id.toLowerCase().endsWith(re)).map((e,t,n)=>({...e,progressionWeight:1/n.length}))},a=await w(n);try{let e=(0,i.resolveArchiveMetadata)((0,i.parseComicInfo)(a));return{...r,readingDirection:e.readingDirection??r.readingDirection}}catch(e){return console.error(`Unable to parse ${i.COMIC_INFO_FILENAME} for content\n`,a),console.error(e),r}},ae=({baseUrl:e=``,resourcePath:t})=>{if(!e&&/^https?:\/\//.test(t))return encodeURI(t);let n=e?`${e}${e.endsWith(`/`)?``:`/`}`:`file://`;return encodeURI(`${n}${t}`)},oe=({archive:e,baseUrl:t})=>async()=>{let n=e.records.filter(e=>!e.dir),r=v(),i=n.map(e=>({file:e,id:r(e.uri)}));return{filename:e.filename??``,title:e.records.find(({dir:e})=>e)?.basename.replace(/\/$/,``)||e.filename||``,renditionLayout:void 0,renditionSpread:`auto`,readingDirection:void 0,spineItems:i.filter(({file:e})=>!e.basename.endsWith(`.db`)).map(({file:e,id:r},i)=>({id:r,index:i,href:ae({baseUrl:t,resourcePath:e.uri}),renditionLayout:void 0,progressionWeight:1/n.length,pageSpreadLeft:void 0,pageSpreadRight:void 0,mediaType:e.encodingFormat})),items:i.map(({file:e,id:n})=>({id:n,href:encodeURI(`${t}${e.uri}`)}))}},O=async({archive:e,archiveOpf:t})=>{if(!t)return[];let{opf:n,basePath:r}=t,{spineRows:i}=n;return e.records.filter(e=>i.find(t=>r?`${r}/${t.href}`===e.uri:`${t.href}`===e.uri))},k=(e,t,n)=>{let{basePath:r}=T(t)||{};return e.map(e=>{let t=e.href,i=n?.(t)??``;return{href:r?`${i}${r}/${t}`:`${i}${t}`,id:e.id,mediaType:e.mediaType}})},se=e=>{let t=e?.trim();return t===`scrolled-continuous`||t===`scrolled-doc`||t===`paginated`||t===`auto`?t:`auto`},ce=e=>{let t=e?.trim();if(t===`none`||t===`landscape`||t===`portrait`||t===`both`||t===`auto`)return t},le=e=>{let t=e?.trim();if(t===`cover`||t===`title-page`||t===`copyright-page`||t===`text`)return t},A=({archive:t,baseUrl:n,archiveOpf:r})=>async a=>{if(!r)return a;let{opf:o,basePath:s}=r,c=(0,i.resolveArchiveMetadata)(o);e.n.groupCollapsed(...e.n.getGroupArgs(`OPF parsed`)),e.n.log(`opf`,o),e.n.groupEnd();let l=o.renditionLayoutMeta?.trim(),u=l===`reflowable`||l===`pre-paginated`?l:c.renditionLayout,d=o.title?.trim()||t.records.find(({dir:e})=>e)?.basename||``,f=c.readingDirection??a.readingDirection,p=(await O({archive:t,archiveOpf:r})).filter(y).reduce((e,t)=>t.size+e,0),m=o.guide,h=[];for(let e of m){let t=le(e.type);t!==void 0&&h.push({href:e.href,title:e.title,type:t})}return{filename:t.filename??``,renditionLayout:u,renditionFlow:se(o.renditionFlowMeta),renditionSpread:ce(o.renditionSpreadMeta),title:d,readingDirection:f,spineItems:o.spineRows.map((e,r)=>{let i=x(t,s?`${s}/${e.href}`:e.href),a=i?i.size:0,c=n||(/^https?:\/\//.test(e.href)?``:`file://`);return{id:e.id,index:r,href:e.href.startsWith(`https://`)?e.href:s?`${c}${s}/${e.href}`:`${c}${e.href}`,renditionLayout:e.renditionLayout??u,...e.renditionFlow===void 0?{}:{renditionFlow:e.renditionFlow},progressionWeight:p>0?a/p:1/o.spineRows.length,pageSpreadLeft:e.pageSpreadLeft,pageSpreadRight:e.pageSpreadRight,mediaType:e.mediaType}}),items:k(o.manifestItems,t,e=>/^https?:\/\//.test(e)?``:n||`file://`),guide:h.length>0?h:void 0}},j=e=>{let t=e.descendantWithPath(`head`)?.childrenNamed(`meta`).find(e=>e.attr.name===`viewport`);return!!(t&&t.attr.name===`viewport`)},M=e=>e.reduce(async(e,t)=>{if(!await e||!(0,r.isXmlBasedMimeType)({mimeType:y(t)?t.encodingFormat:void 0,uri:t.uri}))return!1;let n=t.dir?null:await w(t);return n?j(new a.XmlDocument(n)):!1},Promise.resolve(!0)),N=({archive:e,archiveOpf:t})=>async n=>n.renditionLayout===`reflowable`&&n.spineItems.every(e=>e.renditionLayout===`reflowable`)&&await M(await O({archive:e,archiveOpf:t}))?{...n,spineItems:n.spineItems.map(e=>({...e,renditionLayout:`pre-paginated`})),renditionLayout:`pre-paginated`}:n,P=()=>e=>({...e,readingDirection:e.readingDirection??`ltr`}),F=async e=>{let t;return await Promise.all(e.records.map(async e=>{if(e.dir||!e.uri.endsWith(i.KOBO_DISPLAY_OPTIONS_FILENAME))return;let n=await w(e);try{let{renditionLayout:e}=(0,i.parseKoboXml)(n);e&&(t=e)}catch(e){console.error(`Unable to parse ${i.KOBO_DISPLAY_OPTIONS_FILENAME} for content\n`,n),console.error(e)}})),{kind:`kobo`,...t===void 0?{}:{renditionLayout:t}}},I=({archive:e})=>async t=>{let{renditionLayout:n}=(0,i.resolveArchiveMetadata)(await F(e));return{...t,renditionLayout:t.renditionLayout??n}},L=e=>e.toLowerCase().endsWith(`.opf`),R=e=>e.records.some(e=>!e.dir&&(L(e.basename)||L(e.uri))),z=({archive:e})=>async t=>R(e)?t:{...t,spineItems:t.spineItems.map(t=>{let n=e.records.find(e=>decodeURI(t.href).endsWith(e.uri)),i=(0,r.parseContentType)((n&&y(n)?n.encodingFormat:void 0)??``)||(0,r.detectMimeTypeFromName)(n?.basename??``);return{...t,renditionLayout:i&&(0,r.isMediaContentMimeType)(i)?`pre-paginated`:t.renditionLayout}})},B=e=>e?e.children.map(e=>e instanceof a.XmlTextNode?e.text:e instanceof a.XmlElement?B(e):``).join(``).trim():``,V=e=>(0,i.tokenizeXmlSpaceSeparatedList)(e.properties).includes(`nav`),H=(e,{basePath:t,baseUrl:n})=>{let i={contents:[],path:``,href:``,title:``},a=e.childNamed(`span`)||e.childNamed(`a`);i.title=(a?.attr.title||a?.val.trim()||B(a))??``;let o=a?.name;o!==`a`&&(a=e.descendantWithPath(`${o}.a`),a&&(o=a.name.toLowerCase())),o===`a`&&a?.attr.href&&(i.path=(0,r.urlJoin)(t,a.attr.href),i.href=(0,r.urlJoin)(n,t,a.attr.href));let s=e.childNamed(`ol`);if(s){let e=s.childrenNamed(`li`);e&&e.length>0&&(i.contents=e.map(e=>H(e,{basePath:t,baseUrl:n})))}return i},U=(e,{basePath:t,baseUrl:n})=>{let r=[],i;return e.descendantWithPath(`body.nav.ol`)?i=e.descendantWithPath(`body.nav.ol`)?.children:e.descendantWithPath(`body.section.nav.ol`)&&(i=e.descendantWithPath(`body.section.nav.ol`)?.children),i&&i.length>0&&i.filter(e=>e.name===`li`).forEach(e=>{r.push(H(e,{basePath:t,baseUrl:n}))}),r},W=async(e,n,{baseUrl:r})=>{let i=e.manifestItems.find(V);if(i?.href){let e=n.records.find(e=>e.uri.endsWith(i.href));if(e&&!e.dir)return U(new a.XmlDocument(await w(e)),{basePath:t.t(e.uri),baseUrl:r})}},G=(e,{opfBasePath:t,baseUrl:n,prefix:i})=>{let a=e?.childNamed(`${i}content`)?.attr.src||``,o={title:e?.descendantWithPath(`${i}navLabel.${i}text`)?.val||``,path:(0,r.urlJoin)(t,a),href:(0,r.urlJoin)(n,t,a),contents:[]},s=e.childrenNamed(`${i}navPoint`);return s&&s.length>0&&(o.contents=s.map(e=>G(e,{opfBasePath:t,baseUrl:n,prefix:i}))),o},ue=(e,{opfBasePath:t,baseUrl:n})=>{let r=[],i=e.name,a=``;return i.indexOf(`:`)!==-1&&(a=`${i.split(`:`)[0]}:`),e.childNamed(`${a}navMap`)?.childrenNamed(`${a}navPoint`).forEach(e=>{r.push(G(e,{opfBasePath:t,baseUrl:n,prefix:a}))}),r},de=async({opf:e,opfBasePath:t,baseUrl:n,archive:r})=>{let i=e.spineTocIdref;if(i){let o=e.manifestItems.find(e=>e.id===i);if(o){let e=`${t}${t===``?``:`/`}${o.href}`,i=r.records.find(t=>t.uri.endsWith(e));if(i&&!i.dir)return ue(new a.XmlDocument(await w(i)),{opfBasePath:t,baseUrl:n})}}},fe=async(e,t,{baseUrl:n})=>{let{basePath:r}=T(t)||{},i=await W(e,t,{baseUrl:n});if(i)return i;let a=await de({opf:e,opfBasePath:r??``,archive:t,baseUrl:n});if(a)return a},pe=e=>e.replace(/\.[^.]+$/,``).replace(/[_-]/g,` `).replace(/\s+/g,` `).trim(),me=(e,t)=>{if(e.spineItems.length!==0&&e.spineItems.every(e=>((0,r.parseContentType)(e.mediaType??``)||(0,r.detectMimeTypeFromName)(e.href))?.startsWith(`audio/`)))return e.spineItems.map(e=>{let n=t.records.find(t=>!t.dir&&decodeURI(e.href).endsWith(t.uri));return{title:pe(n?.basename??e.href),href:e.href,path:n?.uri??e.href,contents:[]}})},he=(e,{baseUrl:n})=>{let i=[...e.records].sort((e,n)=>t.i(e.uri,n.uri)),a=(e,t,n,r,i)=>{let o=e.find(e=>e.title===t),[s,...c]=n;return o?s?[...e.filter(e=>e!==o),{...o,contents:[...o.contents,...a(o.contents,s,c,r,i)]}]:o.path.split(`/`).length>i.split(`/`).length?[...e.filter(e=>e!==o),{...o,path:i,href:r}]:e:s?[...e,{contents:a([],s,c,r,i),href:r,path:i,title:t}]:[...e,{contents:[],href:r,path:i,title:t}]};return i.reduce((e,t)=>{if(t.dir)return e;let[i,...o]=t.uri.split(`/`).slice(0,-1);return i?a(e,i,o,(0,r.urlJoin)(n,encodeURI(t.uri)).replace(/\/$/,``),t.uri.replace(/\/$/,``)):e},[])},ge=async(e,t,{baseUrl:n,archiveOpf:r})=>{if(r)return await fe(r.opf,e,{baseUrl:n})||[];let i=me(t,e);if(i)return i;let a=he(e,{baseUrl:n});if(a.length!==0)return a},_e=({archive:e,baseUrl:t,archiveOpf:n})=>async r=>{if(r.nav)return r;let i=await ge(e,r,{baseUrl:t,archiveOpf:n});return i?{...r,nav:{toc:i}}:r},ve=e=>e?e.endsWith(`/`)?e:`${e}/`:``,K=async(t,{baseUrl:n=``,hooks:r={}}={})=>{e.n.log(`Generating manifest from archive`,t);let i=await E(t),a=ve(n),o=e=>(e??[]).map(e=>e({archive:t,baseUrl:a})),s=[A({archive:t,baseUrl:a,archiveOpf:i}),ie({archive:t,baseUrl:a}),ne({archive:t,baseUrl:a}),z({archive:t,baseUrl:a}),...o(r.content)],c=o(r.spine),l=[N({archive:t,baseUrl:a,archiveOpf:i}),I({archive:t,baseUrl:a}),...o(r.presentation)],u=[_e({archive:t,baseUrl:a,archiveOpf:i}),...o(r.navigation)],d=[...s,...c,...l,...u,P()];try{let n=oe({archive:t,baseUrl:a})(),r=await d.reduce(async(e,t)=>await t(await e),n);if(e.n.log(`Generated manifest`,r),process.env.NODE_ENV===`development`&&e.n.isEnabled()){let t=JSON.stringify(r,null,2);e.n.groupCollapsed(...e.n.getGroupArgs(`Generated manifest`)),e.n.log(`\n${t}`),e.n.groupEnd()}return r}catch(t){throw e.n.error(t),t}},ye=e=>{let t=e.descendantWithPath(`head`)?.childrenNamed(`meta`).find(e=>e.attr.name===`calibre:cover`);return!!(t&&t.attr.name===`calibre:cover`)},be=e=>e.descendantWithPath(`body`)?.descendantWithPath(`div`)?.childrenNamed(`svg`)?.find(e=>e.attr.width===`100%`&&e.attr.preserveAspectRatio===`none`),xe=({archive:e,resourcePath:t})=>async n=>{let r=x(e,t);if(r?.basename.endsWith(`.xhtml`)){let e=new a.XmlDocument(typeof n.body==`string`?n.body:await w(r));if(ye(e)){let t=be(e);return t&&delete t.attr.preserveAspectRatio,{...n,body:e?.toString()}}}return n},Se=({archive:e,resourcePath:t})=>async n=>xe({archive:e,resourcePath:t})(n),Ce=({archive:e,resourcePath:t})=>async n=>{let r=x(e,t);if(r?.basename.endsWith(`.css`)){let e=(typeof n.body==`string`?n.body:await w(r)).replaceAll(`-webkit-writing-mode`,`writing-mode`);return{...n,body:e}}return n},we=async(e,t)=>{let n=await E(e);if(n){let{opf:r}=n,i=k(r.manifestItems,e,()=>``).find(e=>t.endsWith(e.href))?.mediaType;if(i)return{mediaType:i}}return{mediaType:Te(t)}},Te=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`},Ee=({archive:e,resourcePath:t})=>async n=>{let r=x(e,t);if(!r)return n;let i=await we(e,t);return{...n,params:{...n.params,...r?.encodingFormat&&{contentType:r.encodingFormat},...i.mediaType&&{contentType:i.mediaType}}}},q=`div.span.p.a.li.ul.ol.h1.h2.h3.h4.h5.h6.table.tr.td.th.thead.tbody.tfoot.section.article.header.footer.nav.aside.main.figure.figcaption.blockquote.pre.code.form.textarea.select.option.button.label.fieldset.legend.caption.dl.dt.dd.iframe.video.audio.canvas.script.style`.split(`.`),De=({archive:e,resourcePath:t})=>async n=>{let r=x(e,t);if(r?.basename.endsWith(`.xhtml`)){let e=typeof n.body==`string`?n.body:await w(r);if(!RegExp(`<(${q.join(`|`)})[\\s/>]`,`i`).test(e))return n;let t=RegExp(`<(${q.join(`|`)})(\\s[^>]*)?\\s*/>`,`gi`),i=e.replace(t,(e,t,n=``)=>`<${t} ${n.trim()}></${t}>`);return{...n,body:i}}return n},J=async(t,n,{hooks:r=[]}={})=>{let i={params:{}},a=[...r.map(e=>e({archive:t,resourcePath:n})),Ee({archive:t,resourcePath:n}),De({archive:t,resourcePath:n}),Ce({archive:t,resourcePath:n}),Se({archive:t,resourcePath:n})];try{let r=await a.reduce(async(e,t)=>await t(await e),Promise.resolve(i));if(e.n.log(`Generated resource`,n,r),r.body!==void 0)return r;let o=x(t,n);if(!o)throw Error(`no file found for resourcePath:${n}`);return{...r,body:await o.blob()}}catch(t){throw e.n.error(t),t}},Oe=class{constructor(e){this.cleanArchiveAfter=e,this.state$=new o.BehaviorSubject({status:`idle`,locks:0})}update(e){this.state$.next({...this.state$.getValue(),...e})}get locks$(){return this.state$.pipe((0,o.map)(({locks:e})=>e))}get state(){return this.state$.getValue()}get isUnlocked$(){return this.locks$.pipe((0,o.map)(e=>e<=0),(0,o.distinctUntilChanged)(),(0,o.shareReplay)())}get overTTL$(){return this.isUnlocked$.pipe((0,o.switchMap)(e=>e?this.cleanArchiveAfter===1/0?o.NEVER:(0,o.timer)(this.cleanArchiveAfter):o.NEVER))}},ke=({getArchive:t,cleanArchiveAfter:n=300*1e3})=>{let r=new o.Subject,i=new o.Subject,a=new o.Subject,s={};return r.pipe((0,o.mergeMap)(n=>{let r=s[n];if(!r||r.state.status!==`idle`)return o.EMPTY;let i=!1,c=t=>{e.n.debug(`Cleaning up archive with key: ${t}`);let n=s[t];delete s[t],i||=(n?.state.archive?.close(),!0)};r.update({status:`loading`});let l=r.locks$,u=r.isUnlocked$,d=l.pipe((0,o.pairwise)(),(0,o.filter)(([e,t])=>t>e),(0,o.startWith)(!0));return(0,o.from)(t(n)).pipe((0,o.tap)(e=>{r.update({archive:e,status:`success`})}),(0,o.catchError)(e=>(c(n),r.update({status:`error`,error:e}),o.EMPTY)),(0,o.switchMap)(()=>(0,o.merge)(d.pipe((0,o.switchMap)(()=>a),(0,o.switchMap)(()=>u),(0,o.filter)(e=>e)),r.overTTL$).pipe((0,o.first)(),(0,o.tap)(()=>{c(n)}))))}),(0,o.takeUntil)(i)).subscribe(),{access:e=>{let t=!1,i=s[e]??new Oe(n);s[e]=i,i.update({locks:i.state.locks+1});let a=()=>{t||(t=!0,i.update({locks:i.state.locks-1}))};return r.next(e),(0,o.merge)(i.state$.pipe((0,o.map)(({archive:e})=>e),(0,o.filter)(e=>!!e)),i.state$.pipe((0,o.tap)(({error:e})=>{if(e)throw e}),(0,o.ignoreElements)())).pipe((0,o.first)(),(0,o.map)(e=>({archive:e,release:a})),(0,o.catchError)(e=>{throw a(),e}))},purge:()=>{a.next()},_archives:s}},Y=e=>e?/^\d+$/.test(e)?{valid:!0,value:Number.parseInt(e,10)}:{valid:!1,value:void 0}:{valid:!0,value:void 0},Ae=e=>{if(!e.toLowerCase().startsWith(`bytes=`))return{kind:`missing`};let t=e.slice(6).trim();if(!t)return{kind:`invalid`};if(t.includes(`,`))return{kind:`multi`};let n=/^(\d*)-(\d*)$/.exec(t);if(!n)return{kind:`invalid`};let[,r=``,i=``]=n,a=Y(r.trim()),o=Y(i.trim());return!a.valid||!o.valid?{kind:`invalid`}:{kind:`single`,start:a.value,end:o.value}},X=e=>{if(e instanceof Blob)return{size:e.size,slice:(t,n)=>{let r=e.slice(t,n);return{content:r,length:r.size}}};let t=new TextEncoder().encode(e);return{size:t.byteLength,slice:(e,n)=>{let r=t.slice(e,n);return{content:r,length:r.byteLength}}}},je=({body:e,contentType:t,rangeHeader:n})=>{let r=new Headers;if(t&&r.set(`Content-Type`,t),r.set(`Accept-Ranges`,`bytes`),!n)return e instanceof Blob&&r.set(`Content-Length`,String(e.size)),new Response(e,{status:200,headers:r});let i=Ae(n);if(i.kind===`missing`||i.kind===`multi`)return e instanceof Blob&&r.set(`Content-Length`,String(e.size)),new Response(e,{status:200,headers:r});let a=X(e),o=a.size;if(i.kind===`invalid`)return new Response(null,{status:416,headers:{"Content-Range":`bytes */${o}`}});let s=i.start,c=i.end;if(s===void 0&&c===void 0||(s===void 0?(s=Math.max(0,o-Math.min(c??0,o)),c=o-1):(c===void 0||c>=o)&&(c=o-1),s<0||c<0||s>=o||c>=o||s>c))return new Response(null,{status:416,headers:{"Content-Range":`bytes */${o}`}});let l=a.slice(s,c+1);return r.set(`Content-Length`,String(l.length)),r.set(`Content-Range`,`bytes ${s}-${c}/${o}`),new Response(l.content,{status:206,headers:r})},Z=`file://`,Me=/^https?:\/\//,Ne=e=>{try{return decodeURIComponent(e)}catch{return e}},Q=e=>e.startsWith(Z)?e.slice(Z.length):e,Pe=e=>{let t=Q(e);return Me.test(t)?t:Q(Ne(t))},$=class{constructor({hooks:e,onError:t,onManifestSuccess:n,...r}){this.onError=e=>(console.error(e),new Response(String(e),{status:500})),this.archiveLoader=ke(r),this.hooks=e??{},this.onManifestSuccess=n??(({manifest:e})=>Promise.resolve(e)),this.onError=t??this.onError}prune(){this.archiveLoader.purge()}accessArchive(e){return this.lastAccessedKey!==void 0&&this.lastAccessedKey!==e&&this.archiveLoader.purge(),this.lastAccessedKey=e,this.archiveLoader.access(e)}accessArchiveWithoutLock(e){return this.accessArchive(e).pipe((0,o.map)(({archive:e,release:t})=>(t(),e)))}withArchiveResponse({key:e,getResponse:t}){return(0,o.lastValueFrom)(this.accessArchive(e).pipe((0,o.mergeMap)(({archive:e,release:n})=>(0,o.from)(t(e)).pipe((0,o.finalize)(()=>{n()}))),(0,o.catchError)(e=>(0,o.of)(this.onError(e)))))}fetchManifest({key:e,baseUrl:t}){return this.withArchiveResponse({key:e,getResponse:e=>(0,o.from)(K(e,{baseUrl:t,hooks:this.hooks.manifest})).pipe((0,o.switchMap)(t=>(0,o.from)(this.onManifestSuccess({manifest:t,archive:e}))),(0,o.map)(e=>new Response(JSON.stringify(e),{status:200})))})}fetchResource({key:e,resourcePath:t,request:n}){return this.withArchiveResponse({key:e,getResponse:e=>(0,o.from)(J(e,Pe(t),{hooks:this.hooks.resource})).pipe((0,o.map)(e=>je({body:e.body??``,contentType:e.params.contentType,rangeHeader:n?.headers.get(`range`)})))})}},Fe=class extends ${constructor({getUriInfo:e,...t}){super(t),this.getUriInfo=e,this.fetchEventListener=this.fetchEventListener.bind(this)}fetchEventListener(e){try{let n=this.getUriInfo(e);if(!n)return;let r=t.r(n.baseUrl),i=e.request.url.substring(r.length+1),[a=``]=i.split(`/`),o=t.r(i.substring(a.length+1));i.endsWith(`/manifest`)?e.respondWith(this.fetchManifest({key:a,baseUrl:`${r}/${a}/`})):e.respondWith(this.fetchResource({key:a,resourcePath:o,request:e.request}))}catch(t){e.respondWith(new Response(String(t),{status:500}))}}};exports.ServiceWorkerStreamer=Fe,exports.Streamer=$,exports.arrayBufferFileAccessors=n.t,exports.blobFileAccessors=n.n,exports.configure=te,exports.createArchive=e.t,exports.createArchiveFromArrayBufferList=s,exports.createArchiveFromText=c,exports.createArchiveFromUrls=ee,exports.createUniqueXmlSafeId=_,exports.createXmlSafeId=g,exports.createXmlSafeIdFactory=v,exports.generateManifestFromArchive=K,exports.generateResourceFromArchive=J,exports.getArchiveFileRecordByUri=x,exports.getArchiveHasComicInfo=C,exports.getArchiveOpfInfo=T,exports.getUriBasePath=t.t,exports.getUriBasename=t.n,exports.isDirectoryRecord=b,exports.isFileRecord=y,exports.readRecordAsText=w,exports.removeTrailingSlash=t.r,exports.sortByTitleComparator=t.i;
32
+ //# sourceMappingURL=index.cjs.map