@prose-reader/archive-reader 1.337.0 → 1.339.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 (65) hide show
  1. package/dist/apple/readArchiveApple.d.ts +2 -2
  2. package/dist/apple/resolve.d.ts +2 -2
  3. package/dist/archives/createArchive.d.ts +1 -1
  4. package/dist/archives/createArchiveFromArrayBufferList.d.ts +1 -1
  5. package/dist/archives/createArchiveFromEntries.d.ts +1 -1
  6. package/dist/archives/createArchiveFromJszip/index.cjs.map +1 -1
  7. package/dist/archives/createArchiveFromJszip/index.js +1 -1
  8. package/dist/archives/createArchiveFromJszip/index.js.map +1 -1
  9. package/dist/archives/createArchiveFromJszip.d.ts +1 -1
  10. package/dist/archives/createArchiveFromLibArchive/index.cjs.map +1 -1
  11. package/dist/archives/createArchiveFromLibArchive/index.js +1 -1
  12. package/dist/archives/createArchiveFromLibArchive/index.js.map +1 -1
  13. package/dist/archives/createArchiveFromLibArchive.d.ts +1 -1
  14. package/dist/archives/createArchiveFromNodeUnrarJs/index.cjs.map +1 -1
  15. package/dist/archives/createArchiveFromNodeUnrarJs/index.js +1 -1
  16. package/dist/archives/createArchiveFromNodeUnrarJs/index.js.map +1 -1
  17. package/dist/archives/createArchiveFromNodeUnrarJs.d.ts +1 -1
  18. package/dist/archives/createArchiveFromText.d.ts +1 -1
  19. package/dist/archives/createArchiveFromUnzipper/index.cjs.map +1 -1
  20. package/dist/archives/createArchiveFromUnzipper/index.js +1 -1
  21. package/dist/archives/createArchiveFromUnzipper/index.js.map +1 -1
  22. package/dist/archives/createArchiveFromUnzipper.d.ts +1 -1
  23. package/dist/archives/createArchiveFromUrls.d.ts +1 -1
  24. package/dist/archives/createArchiveFromZipJs/index.cjs.map +1 -1
  25. package/dist/archives/createArchiveFromZipJs/index.js +1 -1
  26. package/dist/archives/createArchiveFromZipJs/index.js.map +1 -1
  27. package/dist/archives/createArchiveFromZipJs.d.ts +1 -1
  28. package/dist/archives/fileAccessors.d.ts +1 -1
  29. package/dist/archives/images.d.ts +1 -1
  30. package/dist/archives/readRecordAsText.d.ts +1 -1
  31. package/dist/comicInfo/getArchiveHasComicInfo.d.ts +1 -1
  32. package/dist/comicInfo/parse.d.ts +1 -1
  33. package/dist/comicInfo/readArchiveComicInfo.d.ts +2 -2
  34. package/dist/comicInfo/resolve.d.ts +2 -2
  35. package/dist/cover/resolveArchiveCover.d.ts +4 -4
  36. package/dist/{createArchiveFromEntries-CFG3evXM.js → createArchiveFromEntries-BiBoi26P.js} +1 -3
  37. package/dist/createArchiveFromEntries-BiBoi26P.js.map +1 -0
  38. package/dist/createArchiveFromEntries-DcPCGgZW.cjs.map +1 -1
  39. package/dist/fileAccessors-DWVChFUB.cjs.map +1 -1
  40. package/dist/fileAccessors-etcCPnpQ.js.map +1 -1
  41. package/dist/index/index.cjs +1 -1
  42. package/dist/index/index.cjs.map +1 -1
  43. package/dist/index/index.js +252 -219
  44. package/dist/index/index.js.map +1 -1
  45. package/dist/index.d.ts +50 -50
  46. package/dist/kobo/readArchiveKobo.d.ts +2 -2
  47. package/dist/kobo/resolve.d.ts +2 -2
  48. package/dist/layout/scanReadingOrderDocumentsViewport.d.ts +2 -2
  49. package/dist/opf/getArchiveOpfInfo.d.ts +2 -2
  50. package/dist/opf/getSpineItemFilesFromArchive.d.ts +3 -3
  51. package/dist/opf/isArchiveEpub.d.ts +1 -1
  52. package/dist/opf/parse.d.ts +2 -0
  53. package/dist/opf/readArchiveOpf.d.ts +2 -2
  54. package/dist/opf/resolve.d.ts +2 -2
  55. package/dist/readingOrder/resolveArchiveReadingOrder.d.ts +2 -2
  56. package/dist/resolve.d.ts +5 -5
  57. package/dist/resolveArchive.d.ts +8 -8
  58. package/dist/resolveMetadata.d.ts +5 -5
  59. package/dist/toc/folders.d.ts +2 -2
  60. package/dist/toc/nav.d.ts +3 -3
  61. package/dist/toc/ncx.d.ts +3 -3
  62. package/dist/toc/resolveArchiveToc.d.ts +3 -3
  63. package/dist/types/resolvedMetadata.d.ts +1 -0
  64. package/package.json +10 -3
  65. package/dist/createArchiveFromEntries-CFG3evXM.js.map +0 -1
@@ -1,3 +1,3 @@
1
- import { Archive } from '../archives/types';
2
- import { AppleMetadata } from './parse';
1
+ import { Archive } from '../archives/types.ts';
2
+ import { AppleMetadata } from './parse.ts';
3
3
  export declare function readArchiveApple(archive: Archive): Promise<AppleMetadata | undefined>;
@@ -1,5 +1,5 @@
1
- import { ResolvedMetadata } from '../types/resolvedMetadata';
2
- import { AppleMetadata } from './parse';
1
+ import { ResolvedMetadata } from '../types/resolvedMetadata.ts';
2
+ import { AppleMetadata } from './parse.ts';
3
3
  export declare const appleMetadataHomes: {
4
4
  readonly displayOptions: "apple.options";
5
5
  };
@@ -1,4 +1,4 @@
1
- import { Archive } from './types';
1
+ import { Archive } from './types.ts';
2
2
  type ArchiveInit = Omit<Archive, "recordsByUri">;
3
3
  export declare const createArchive: ({ records, ...rest }: ArchiveInit) => Archive;
4
4
  export {};
@@ -1,4 +1,4 @@
1
- import { Archive } from './types';
1
+ import { Archive } from './types.ts';
2
2
  export declare const createArchiveFromArrayBufferList: (list: {
3
3
  isDir: boolean;
4
4
  name: string;
@@ -1,4 +1,4 @@
1
- import { Archive, FileRecord } from './types';
1
+ import { Archive, FileRecord } from './types.ts';
2
2
  export type ArchiveEntry = {
3
3
  dir: true;
4
4
  uri: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/archives/createArchiveFromJszip.ts"],"sourcesContent":["import type JSZip from \"jszip\"\nimport { createArchiveFromEntries } from \"./createArchiveFromEntries\"\nimport type { Archive } from \"./types\"\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> =>\n createArchiveFromEntries(\n Object.values(jszip.files),\n (file) =>\n file.dir\n ? { dir: true, uri: file.name }\n : {\n dir: false,\n uri: file.name,\n // `_data.uncompressedSize` is private API\n // @ts-expect-error\n size: file._data.uncompressedSize,\n blob: () => file.async(`blob`),\n arrayBuffer: () => file.async(`arraybuffer`),\n },\n { ...options, close: () => Promise.resolve() },\n )\n"],"mappings":"kIAIA,IAAa,EAAyB,MACpC,EACA,EAII,CAAC,IAEL,EAAA,EACE,OAAO,OAAO,EAAM,KAAK,EACxB,GACC,EAAK,IACD,CAAE,IAAK,GAAM,IAAK,EAAK,IAAK,EAC5B,CACE,IAAK,GACL,IAAK,EAAK,KAGV,KAAM,EAAK,MAAM,iBACjB,SAAY,EAAK,MAAM,MAAM,EAC7B,gBAAmB,EAAK,MAAM,aAAa,CAC7C,EACN,CAAE,GAAG,EAAS,UAAa,QAAQ,QAAQ,CAAE,CAC/C"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/archives/createArchiveFromJszip.ts"],"sourcesContent":["import type JSZip from \"jszip\"\nimport { createArchiveFromEntries } from \"./createArchiveFromEntries.ts\"\nimport type { Archive } from \"./types.ts\"\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> =>\n createArchiveFromEntries(\n Object.values(jszip.files),\n (file) =>\n file.dir\n ? { dir: true, uri: file.name }\n : {\n dir: false,\n uri: file.name,\n // `_data.uncompressedSize` is private API\n // @ts-expect-error\n size: file._data.uncompressedSize,\n blob: () => file.async(`blob`),\n arrayBuffer: () => file.async(`arraybuffer`),\n },\n { ...options, close: () => Promise.resolve() },\n )\n"],"mappings":"kIAIA,IAAa,EAAyB,MACpC,EACA,EAII,CAAC,IAEL,EAAA,EACE,OAAO,OAAO,EAAM,KAAK,EACxB,GACC,EAAK,IACD,CAAE,IAAK,GAAM,IAAK,EAAK,IAAK,EAC5B,CACE,IAAK,GACL,IAAK,EAAK,KAGV,KAAM,EAAK,MAAM,iBACjB,SAAY,EAAK,MAAM,MAAM,EAC7B,gBAAmB,EAAK,MAAM,aAAa,CAC7C,EACN,CAAE,GAAG,EAAS,UAAa,QAAQ,QAAQ,CAAE,CAC/C"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../createArchiveFromEntries-CFG3evXM.js";
1
+ import { t as e } from "../../createArchiveFromEntries-BiBoi26P.js";
2
2
  //#region src/archives/createArchiveFromJszip.ts
3
3
  var t = async (t, n = {}) => e(Object.values(t.files), (e) => e.dir ? {
4
4
  dir: !0,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/archives/createArchiveFromJszip.ts"],"sourcesContent":["import type JSZip from \"jszip\"\nimport { createArchiveFromEntries } from \"./createArchiveFromEntries\"\nimport type { Archive } from \"./types\"\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> =>\n createArchiveFromEntries(\n Object.values(jszip.files),\n (file) =>\n file.dir\n ? { dir: true, uri: file.name }\n : {\n dir: false,\n uri: file.name,\n // `_data.uncompressedSize` is private API\n // @ts-expect-error\n size: file._data.uncompressedSize,\n blob: () => file.async(`blob`),\n arrayBuffer: () => file.async(`arraybuffer`),\n },\n { ...options, close: () => Promise.resolve() },\n )\n"],"mappings":";;AAIA,IAAa,IAAyB,OACpC,GACA,IAII,CAAC,MAEL,EACE,OAAO,OAAO,EAAM,KAAK,IACxB,MACC,EAAK,MACD;CAAE,KAAK;CAAM,KAAK,EAAK;AAAK,IAC5B;CACE,KAAK;CACL,KAAK,EAAK;CAGV,MAAM,EAAK,MAAM;CACjB,YAAY,EAAK,MAAM,MAAM;CAC7B,mBAAmB,EAAK,MAAM,aAAa;AAC7C,GACN;CAAE,GAAG;CAAS,aAAa,QAAQ,QAAQ;AAAE,CAC/C"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/archives/createArchiveFromJszip.ts"],"sourcesContent":["import type JSZip from \"jszip\"\nimport { createArchiveFromEntries } from \"./createArchiveFromEntries.ts\"\nimport type { Archive } from \"./types.ts\"\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> =>\n createArchiveFromEntries(\n Object.values(jszip.files),\n (file) =>\n file.dir\n ? { dir: true, uri: file.name }\n : {\n dir: false,\n uri: file.name,\n // `_data.uncompressedSize` is private API\n // @ts-expect-error\n size: file._data.uncompressedSize,\n blob: () => file.async(`blob`),\n arrayBuffer: () => file.async(`arraybuffer`),\n },\n { ...options, close: () => Promise.resolve() },\n )\n"],"mappings":";;AAIA,IAAa,IAAyB,OACpC,GACA,IAII,CAAC,MAEL,EACE,OAAO,OAAO,EAAM,KAAK,IACxB,MACC,EAAK,MACD;CAAE,KAAK;CAAM,KAAK,EAAK;AAAK,IAC5B;CACE,KAAK;CACL,KAAK,EAAK;CAGV,MAAM,EAAK,MAAM;CACjB,YAAY,EAAK,MAAM,MAAM;CAC7B,mBAAmB,EAAK,MAAM,aAAa;AAC7C,GACN;CAAE,GAAG;CAAS,aAAa,QAAQ,QAAQ;AAAE,CAC/C"}
@@ -1,5 +1,5 @@
1
1
  import { default as JSZip } from 'jszip';
2
- import { Archive } from './types';
2
+ import { Archive } from './types.ts';
3
3
  export declare const createArchiveFromJszip: (jszip: JSZip, options?: {
4
4
  orderByAlpha?: boolean;
5
5
  name?: string;
@@ -1 +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 */\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 { createArchiveFromEntries } from \"./createArchiveFromEntries\"\nimport { blobFileAccessors } from \"./fileAccessors\"\nimport type { Archive } from \"./types\"\n\nexport const createArchiveFromLibArchive = async (\n libArchive: ArchiveReader,\n options: { orderByAlpha?: boolean; name: string; encodingFormat?: string },\n): Promise<Archive> => {\n const objArray = await libArchive.getFilesArray()\n\n return createArchiveFromEntries(\n objArray,\n (item: { file: CompressedFile; path: string }) => ({\n dir: false,\n uri: `${item.path}${item.file.name}`,\n size: item.file.size,\n // libarchivejs `extract()` is typed `any`; it resolves to a `File`.\n ...blobFileAccessors(() => item.file.extract() as Promise<File>),\n }),\n { ...options, close: () => libArchive.close() },\n )\n}\n"],"mappings":"gLAaA,IAAa,EAA8B,MACzC,EACA,IAIO,EAAA,EACL,MAHqB,EAAW,cAAc,EAI7C,IAAkD,CACjD,IAAK,GACL,IAAK,GAAG,EAAK,OAAO,EAAK,KAAK,OAC9B,KAAM,EAAK,KAAK,KAEhB,GAAG,EAAA,MAAwB,EAAK,KAAK,QAAQ,CAAkB,CACjE,GACA,CAAE,GAAG,EAAS,UAAa,EAAW,MAAM,CAAE,CAChD"}
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 */\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 { createArchiveFromEntries } from \"./createArchiveFromEntries.ts\"\nimport { blobFileAccessors } from \"./fileAccessors.ts\"\nimport type { Archive } from \"./types.ts\"\n\nexport const createArchiveFromLibArchive = async (\n libArchive: ArchiveReader,\n options: { orderByAlpha?: boolean; name: string; encodingFormat?: string },\n): Promise<Archive> => {\n const objArray = await libArchive.getFilesArray()\n\n return createArchiveFromEntries(\n objArray,\n (item: { file: CompressedFile; path: string }) => ({\n dir: false,\n uri: `${item.path}${item.file.name}`,\n size: item.file.size,\n // libarchivejs `extract()` is typed `any`; it resolves to a `File`.\n ...blobFileAccessors(() => item.file.extract() as Promise<File>),\n }),\n { ...options, close: () => libArchive.close() },\n )\n}\n"],"mappings":"gLAaA,IAAa,EAA8B,MACzC,EACA,IAIO,EAAA,EACL,MAHqB,EAAW,cAAc,EAI7C,IAAkD,CACjD,IAAK,GACL,IAAK,GAAG,EAAK,OAAO,EAAK,KAAK,OAC9B,KAAM,EAAK,KAAK,KAEhB,GAAG,EAAA,MAAwB,EAAK,KAAK,QAAQ,CAAkB,CACjE,GACA,CAAE,GAAG,EAAS,UAAa,EAAW,MAAM,CAAE,CAChD"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../createArchiveFromEntries-CFG3evXM.js";
1
+ import { t as e } from "../../createArchiveFromEntries-BiBoi26P.js";
2
2
  import { n as t } from "../../fileAccessors-etcCPnpQ.js";
3
3
  //#region src/archives/createArchiveFromLibArchive.ts
4
4
  var n = async (n, r) => e(await n.getFilesArray(), (e) => ({
@@ -1 +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 */\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 { createArchiveFromEntries } from \"./createArchiveFromEntries\"\nimport { blobFileAccessors } from \"./fileAccessors\"\nimport type { Archive } from \"./types\"\n\nexport const createArchiveFromLibArchive = async (\n libArchive: ArchiveReader,\n options: { orderByAlpha?: boolean; name: string; encodingFormat?: string },\n): Promise<Archive> => {\n const objArray = await libArchive.getFilesArray()\n\n return createArchiveFromEntries(\n objArray,\n (item: { file: CompressedFile; path: string }) => ({\n dir: false,\n uri: `${item.path}${item.file.name}`,\n size: item.file.size,\n // libarchivejs `extract()` is typed `any`; it resolves to a `File`.\n ...blobFileAccessors(() => item.file.extract() as Promise<File>),\n }),\n { ...options, close: () => libArchive.close() },\n )\n}\n"],"mappings":";;;AAaA,IAAa,IAA8B,OACzC,GACA,MAIO,EACL,MAHqB,EAAW,cAAc,IAI7C,OAAkD;CACjD,KAAK;CACL,KAAK,GAAG,EAAK,OAAO,EAAK,KAAK;CAC9B,MAAM,EAAK,KAAK;CAEhB,GAAG,QAAwB,EAAK,KAAK,QAAQ,CAAkB;AACjE,IACA;CAAE,GAAG;CAAS,aAAa,EAAW,MAAM;AAAE,CAChD"}
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 */\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 { createArchiveFromEntries } from \"./createArchiveFromEntries.ts\"\nimport { blobFileAccessors } from \"./fileAccessors.ts\"\nimport type { Archive } from \"./types.ts\"\n\nexport const createArchiveFromLibArchive = async (\n libArchive: ArchiveReader,\n options: { orderByAlpha?: boolean; name: string; encodingFormat?: string },\n): Promise<Archive> => {\n const objArray = await libArchive.getFilesArray()\n\n return createArchiveFromEntries(\n objArray,\n (item: { file: CompressedFile; path: string }) => ({\n dir: false,\n uri: `${item.path}${item.file.name}`,\n size: item.file.size,\n // libarchivejs `extract()` is typed `any`; it resolves to a `File`.\n ...blobFileAccessors(() => item.file.extract() as Promise<File>),\n }),\n { ...options, close: () => libArchive.close() },\n )\n}\n"],"mappings":";;;AAaA,IAAa,IAA8B,OACzC,GACA,MAIO,EACL,MAHqB,EAAW,cAAc,IAI7C,OAAkD;CACjD,KAAK;CACL,KAAK,GAAG,EAAK,OAAO,EAAK,KAAK;CAC9B,MAAM,EAAK,KAAK;CAEhB,GAAG,QAAwB,EAAK,KAAK,QAAQ,CAAkB;AACjE,IACA;CAAE,GAAG;CAAS,aAAa,EAAW,MAAM;AAAE,CAChD"}
@@ -1,5 +1,5 @@
1
1
  import { ArchiveReader } from 'libarchive.js/dist/build/compiled/archive-reader';
2
- import { Archive } from './types';
2
+ import { Archive } from './types.ts';
3
3
  export declare const createArchiveFromLibArchive: (libArchive: ArchiveReader, options: {
4
4
  orderByAlpha?: boolean;
5
5
  name: string;
@@ -1 +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 { createArchiveFromEntries } from \"./createArchiveFromEntries\"\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 options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> =>\n createArchiveFromEntries(\n [...extractor.getFileList().fileHeaders],\n (header) =>\n header.flags.directory\n ? { dir: true, uri: header.name }\n : {\n dir: false,\n uri: 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\n // backing store is always an `ArrayBuffer` (never a\n // `SharedArrayBuffer`); the cast only drops the\n // `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 { ...options, close: () => Promise.resolve() },\n )\n"],"mappings":"sNAWA,IAAM,GACJ,EACA,IACe,CAGf,IAAM,EAAQ,CADC,GADG,EAAU,QAAQ,CAAE,MAAO,CAAC,CAAG,CAAE,CACjC,CAAA,CAAU,KACd,CAAA,CAAM,EAAE,EAAE,WAExB,GAAI,CAAC,EACH,MAAU,MACR,0CAA0C,EAAI,uBAChD,EAGF,OAAO,CACT,EAEa,EAA+B,MAC1C,EACA,EAII,CAAC,IAEL,EAAA,EACE,CAAC,GAAG,EAAU,YAAY,CAAC,CAAC,WAAW,EACtC,GACC,EAAO,MAAM,UACT,CAAE,IAAK,GAAM,IAAK,EAAO,IAAK,EAC9B,CACE,IAAK,GACL,IAAK,EAAO,KACZ,KAAM,EAAO,QACb,GAAG,EAAA,EAAyB,SAAY,CACtC,IAAM,EAAQ,EAAkB,EAAW,EAAO,IAAI,EAKhD,EAAU,EAAM,OAKtB,OAAO,EAAM,aAAe,GAC1B,EAAM,aAAe,EAAQ,WAC3B,EACA,EAAQ,MACN,EAAM,WACN,EAAM,WAAa,EAAM,UAC3B,CACN,GAAA,EAAA,EAAA,uBAAA,CAA0B,EAAO,IAAI,GAAK,EAAE,CAC9C,EACN,CAAE,GAAG,EAAS,UAAa,QAAQ,QAAQ,CAAE,CAC/C"}
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 { createArchiveFromEntries } from \"./createArchiveFromEntries.ts\"\nimport { arrayBufferFileAccessors } from \"./fileAccessors.ts\"\nimport type { Archive } from \"./types.ts\"\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 options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> =>\n createArchiveFromEntries(\n [...extractor.getFileList().fileHeaders],\n (header) =>\n header.flags.directory\n ? { dir: true, uri: header.name }\n : {\n dir: false,\n uri: 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\n // backing store is always an `ArrayBuffer` (never a\n // `SharedArrayBuffer`); the cast only drops the\n // `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 { ...options, close: () => Promise.resolve() },\n )\n"],"mappings":"sNAWA,IAAM,GACJ,EACA,IACe,CAGf,IAAM,EAAQ,CADC,GADG,EAAU,QAAQ,CAAE,MAAO,CAAC,CAAG,CAAE,CACjC,CAAA,CAAU,KACd,CAAA,CAAM,EAAE,EAAE,WAExB,GAAI,CAAC,EACH,MAAU,MACR,0CAA0C,EAAI,uBAChD,EAGF,OAAO,CACT,EAEa,EAA+B,MAC1C,EACA,EAII,CAAC,IAEL,EAAA,EACE,CAAC,GAAG,EAAU,YAAY,CAAC,CAAC,WAAW,EACtC,GACC,EAAO,MAAM,UACT,CAAE,IAAK,GAAM,IAAK,EAAO,IAAK,EAC9B,CACE,IAAK,GACL,IAAK,EAAO,KACZ,KAAM,EAAO,QACb,GAAG,EAAA,EAAyB,SAAY,CACtC,IAAM,EAAQ,EAAkB,EAAW,EAAO,IAAI,EAKhD,EAAU,EAAM,OAKtB,OAAO,EAAM,aAAe,GAC1B,EAAM,aAAe,EAAQ,WAC3B,EACA,EAAQ,MACN,EAAM,WACN,EAAM,WAAa,EAAM,UAC3B,CACN,GAAA,EAAA,EAAA,uBAAA,CAA0B,EAAO,IAAI,GAAK,EAAE,CAC9C,EACN,CAAE,GAAG,EAAS,UAAa,QAAQ,QAAQ,CAAE,CAC/C"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../createArchiveFromEntries-CFG3evXM.js";
1
+ import { t as e } from "../../createArchiveFromEntries-BiBoi26P.js";
2
2
  import { t } from "../../fileAccessors-etcCPnpQ.js";
3
3
  import { detectMimeTypeFromName as n } from "@prose-reader/shared";
4
4
  //#region src/archives/createArchiveFromNodeUnrarJs.ts
@@ -1 +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 { createArchiveFromEntries } from \"./createArchiveFromEntries\"\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 options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> =>\n createArchiveFromEntries(\n [...extractor.getFileList().fileHeaders],\n (header) =>\n header.flags.directory\n ? { dir: true, uri: header.name }\n : {\n dir: false,\n uri: 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\n // backing store is always an `ArrayBuffer` (never a\n // `SharedArrayBuffer`); the cast only drops the\n // `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 { ...options, close: () => Promise.resolve() },\n )\n"],"mappings":";;;;AAWA,IAAM,KACJ,GACA,MACe;CAGf,IAAM,IAAQ,CADC,GADG,EAAU,QAAQ,EAAE,OAAO,CAAC,CAAG,EAAE,CACjC,CAAA,CAAU,KACd,CAAA,CAAM,EAAE,EAAE;CAExB,IAAI,CAAC,GACH,MAAU,MACR,0CAA0C,EAAI,uBAChD;CAGF,OAAO;AACT,GAEa,IAA+B,OAC1C,GACA,IAII,CAAC,MAEL,EACE,CAAC,GAAG,EAAU,YAAY,CAAC,CAAC,WAAW,IACtC,MACC,EAAO,MAAM,YACT;CAAE,KAAK;CAAM,KAAK,EAAO;AAAK,IAC9B;CACE,KAAK;CACL,KAAK,EAAO;CACZ,MAAM,EAAO;CACb,GAAG,EAAyB,YAAY;EACtC,IAAM,IAAQ,EAAkB,GAAW,EAAO,IAAI,GAKhD,IAAU,EAAM;EAKtB,OAAO,EAAM,eAAe,KAC1B,EAAM,eAAe,EAAQ,aAC3B,IACA,EAAQ,MACN,EAAM,YACN,EAAM,aAAa,EAAM,UAC3B;CACN,GAAG,EAAuB,EAAO,IAAI,KAAK,EAAE;AAC9C,GACN;CAAE,GAAG;CAAS,aAAa,QAAQ,QAAQ;AAAE,CAC/C"}
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 { createArchiveFromEntries } from \"./createArchiveFromEntries.ts\"\nimport { arrayBufferFileAccessors } from \"./fileAccessors.ts\"\nimport type { Archive } from \"./types.ts\"\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 options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> =>\n createArchiveFromEntries(\n [...extractor.getFileList().fileHeaders],\n (header) =>\n header.flags.directory\n ? { dir: true, uri: header.name }\n : {\n dir: false,\n uri: 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\n // backing store is always an `ArrayBuffer` (never a\n // `SharedArrayBuffer`); the cast only drops the\n // `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 { ...options, close: () => Promise.resolve() },\n )\n"],"mappings":";;;;AAWA,IAAM,KACJ,GACA,MACe;CAGf,IAAM,IAAQ,CADC,GADG,EAAU,QAAQ,EAAE,OAAO,CAAC,CAAG,EAAE,CACjC,CAAA,CAAU,KACd,CAAA,CAAM,EAAE,EAAE;CAExB,IAAI,CAAC,GACH,MAAU,MACR,0CAA0C,EAAI,uBAChD;CAGF,OAAO;AACT,GAEa,IAA+B,OAC1C,GACA,IAII,CAAC,MAEL,EACE,CAAC,GAAG,EAAU,YAAY,CAAC,CAAC,WAAW,IACtC,MACC,EAAO,MAAM,YACT;CAAE,KAAK;CAAM,KAAK,EAAO;AAAK,IAC9B;CACE,KAAK;CACL,KAAK,EAAO;CACZ,MAAM,EAAO;CACb,GAAG,EAAyB,YAAY;EACtC,IAAM,IAAQ,EAAkB,GAAW,EAAO,IAAI,GAKhD,IAAU,EAAM;EAKtB,OAAO,EAAM,eAAe,KAC1B,EAAM,eAAe,EAAQ,aAC3B,IACA,EAAQ,MACN,EAAM,YACN,EAAM,aAAa,EAAM,UAC3B;CACN,GAAG,EAAuB,EAAO,IAAI,KAAK,EAAE;AAC9C,GACN;CAAE,GAAG;CAAS,aAAa,QAAQ,QAAQ;AAAE,CAC/C"}
@@ -1,5 +1,5 @@
1
1
  import { Extractor } from 'node-unrar-js';
2
- import { Archive } from './types';
2
+ import { Archive } from './types.ts';
3
3
  export declare const createArchiveFromNodeUnrarJs: (extractor: Extractor<Uint8Array>, options?: {
4
4
  orderByAlpha?: boolean;
5
5
  name?: string;
@@ -1,4 +1,4 @@
1
1
  export declare const createArchiveFromText: (content: string | Blob, { mimeType, direction, }?: {
2
2
  direction?: `ltr` | `rtl`;
3
3
  mimeType?: string;
4
- }) => Promise<import('./types').Archive>;
4
+ }) => Promise<import('./types.ts').Archive>;
@@ -1 +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 { createArchiveFromEntries } from \"./createArchiveFromEntries\"\nimport { arrayBufferFileAccessors } from \"./fileAccessors\"\nimport type { Archive } from \"./types\"\n\nexport const createArchiveFromUnzipper = async (\n directory: CentralDirectory,\n options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> =>\n createArchiveFromEntries(\n directory.files,\n (file) =>\n file.type === `Directory`\n ? { dir: true, uri: file.path }\n : {\n dir: false,\n uri: 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\n // store is always an `ArrayBuffer` (never a `SharedArrayBuffer`);\n // the cast only drops the `SharedArrayBuffer` arm that cannot\n // 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.\n // Pooled small buffers share their backing store with other\n // entries and 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 { ...options, close: () => Promise.resolve() },\n )\n"],"mappings":"sNAMA,IAAa,EAA4B,MACvC,EACA,EAII,CAAC,IAEL,EAAA,EACE,EAAU,MACT,GACC,EAAK,OAAS,YACV,CAAE,IAAK,GAAM,IAAK,EAAK,IAAK,EAC5B,CACE,IAAK,GACL,IAAK,EAAK,KACV,KAAM,EAAK,iBACX,GAAG,EAAA,EAAyB,SAAY,CACtC,IAAM,EAAS,MAAM,EAAK,OAAO,EAK3B,EAAU,EAAO,OAMvB,OAAO,EAAO,aAAe,GAC3B,EAAO,aAAe,EAAQ,WAC5B,EACA,EAAQ,MACN,EAAO,WACP,EAAO,WAAa,EAAO,UAC7B,CACN,GAAA,EAAA,EAAA,uBAAA,CAA0B,EAAK,IAAI,GAAK,EAAE,CAC5C,EACN,CAAE,GAAG,EAAS,UAAa,QAAQ,QAAQ,CAAE,CAC/C"}
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 { createArchiveFromEntries } from \"./createArchiveFromEntries.ts\"\nimport { arrayBufferFileAccessors } from \"./fileAccessors.ts\"\nimport type { Archive } from \"./types.ts\"\n\nexport const createArchiveFromUnzipper = async (\n directory: CentralDirectory,\n options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> =>\n createArchiveFromEntries(\n directory.files,\n (file) =>\n file.type === `Directory`\n ? { dir: true, uri: file.path }\n : {\n dir: false,\n uri: 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\n // store is always an `ArrayBuffer` (never a `SharedArrayBuffer`);\n // the cast only drops the `SharedArrayBuffer` arm that cannot\n // 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.\n // Pooled small buffers share their backing store with other\n // entries and 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 { ...options, close: () => Promise.resolve() },\n )\n"],"mappings":"sNAMA,IAAa,EAA4B,MACvC,EACA,EAII,CAAC,IAEL,EAAA,EACE,EAAU,MACT,GACC,EAAK,OAAS,YACV,CAAE,IAAK,GAAM,IAAK,EAAK,IAAK,EAC5B,CACE,IAAK,GACL,IAAK,EAAK,KACV,KAAM,EAAK,iBACX,GAAG,EAAA,EAAyB,SAAY,CACtC,IAAM,EAAS,MAAM,EAAK,OAAO,EAK3B,EAAU,EAAO,OAMvB,OAAO,EAAO,aAAe,GAC3B,EAAO,aAAe,EAAQ,WAC5B,EACA,EAAQ,MACN,EAAO,WACP,EAAO,WAAa,EAAO,UAC7B,CACN,GAAA,EAAA,EAAA,uBAAA,CAA0B,EAAK,IAAI,GAAK,EAAE,CAC5C,EACN,CAAE,GAAG,EAAS,UAAa,QAAQ,QAAQ,CAAE,CAC/C"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../createArchiveFromEntries-CFG3evXM.js";
1
+ import { t as e } from "../../createArchiveFromEntries-BiBoi26P.js";
2
2
  import { t } from "../../fileAccessors-etcCPnpQ.js";
3
3
  import { detectMimeTypeFromName as n } from "@prose-reader/shared";
4
4
  //#region src/archives/createArchiveFromUnzipper.ts
@@ -1 +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 { createArchiveFromEntries } from \"./createArchiveFromEntries\"\nimport { arrayBufferFileAccessors } from \"./fileAccessors\"\nimport type { Archive } from \"./types\"\n\nexport const createArchiveFromUnzipper = async (\n directory: CentralDirectory,\n options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> =>\n createArchiveFromEntries(\n directory.files,\n (file) =>\n file.type === `Directory`\n ? { dir: true, uri: file.path }\n : {\n dir: false,\n uri: 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\n // store is always an `ArrayBuffer` (never a `SharedArrayBuffer`);\n // the cast only drops the `SharedArrayBuffer` arm that cannot\n // 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.\n // Pooled small buffers share their backing store with other\n // entries and 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 { ...options, close: () => Promise.resolve() },\n )\n"],"mappings":";;;;AAMA,IAAa,IAA4B,OACvC,GACA,IAII,CAAC,MAEL,EACE,EAAU,QACT,MACC,EAAK,SAAS,cACV;CAAE,KAAK;CAAM,KAAK,EAAK;AAAK,IAC5B;CACE,KAAK;CACL,KAAK,EAAK;CACV,MAAM,EAAK;CACX,GAAG,EAAyB,YAAY;EACtC,IAAM,IAAS,MAAM,EAAK,OAAO,GAK3B,IAAU,EAAO;EAMvB,OAAO,EAAO,eAAe,KAC3B,EAAO,eAAe,EAAQ,aAC5B,IACA,EAAQ,MACN,EAAO,YACP,EAAO,aAAa,EAAO,UAC7B;CACN,GAAG,EAAuB,EAAK,IAAI,KAAK,EAAE;AAC5C,GACN;CAAE,GAAG;CAAS,aAAa,QAAQ,QAAQ;AAAE,CAC/C"}
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 { createArchiveFromEntries } from \"./createArchiveFromEntries.ts\"\nimport { arrayBufferFileAccessors } from \"./fileAccessors.ts\"\nimport type { Archive } from \"./types.ts\"\n\nexport const createArchiveFromUnzipper = async (\n directory: CentralDirectory,\n options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> =>\n createArchiveFromEntries(\n directory.files,\n (file) =>\n file.type === `Directory`\n ? { dir: true, uri: file.path }\n : {\n dir: false,\n uri: 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\n // store is always an `ArrayBuffer` (never a `SharedArrayBuffer`);\n // the cast only drops the `SharedArrayBuffer` arm that cannot\n // 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.\n // Pooled small buffers share their backing store with other\n // entries and 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 { ...options, close: () => Promise.resolve() },\n )\n"],"mappings":";;;;AAMA,IAAa,IAA4B,OACvC,GACA,IAII,CAAC,MAEL,EACE,EAAU,QACT,MACC,EAAK,SAAS,cACV;CAAE,KAAK;CAAM,KAAK,EAAK;AAAK,IAC5B;CACE,KAAK;CACL,KAAK,EAAK;CACV,MAAM,EAAK;CACX,GAAG,EAAyB,YAAY;EACtC,IAAM,IAAS,MAAM,EAAK,OAAO,GAK3B,IAAU,EAAO;EAMvB,OAAO,EAAO,eAAe,KAC3B,EAAO,eAAe,EAAQ,aAC5B,IACA,EAAQ,MACN,EAAO,YACP,EAAO,aAAa,EAAO,UAC7B;CACN,GAAG,EAAuB,EAAK,IAAI,KAAK,EAAE;AAC5C,GACN;CAAE,GAAG;CAAS,aAAa,QAAQ,QAAQ;AAAE,CAC/C"}
@@ -1,5 +1,5 @@
1
1
  import { CentralDirectory } from 'unzipper';
2
- import { Archive } from './types';
2
+ import { Archive } from './types.ts';
3
3
  export declare const createArchiveFromUnzipper: (directory: CentralDirectory, options?: {
4
4
  orderByAlpha?: boolean;
5
5
  name?: string;
@@ -1,4 +1,4 @@
1
- import { Archive } from './types';
1
+ import { Archive } from './types.ts';
2
2
  export declare const createArchiveFromUrls: (urls: string[], options?: {
3
3
  useRenditionFlow: boolean;
4
4
  }) => Promise<Archive>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/archives/createArchiveFromZipJs.ts"],"sourcesContent":["import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport type { ZipReader } from \"@zip.js/zip.js\"\nimport { createArchiveFromEntries } from \"./createArchiveFromEntries\"\nimport { arrayBufferFileAccessors } from \"./fileAccessors\"\nimport type { Archive } from \"./types\"\n\nexport const createArchiveFromZipJs = async (\n zipReader: ZipReader<unknown>,\n options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> => {\n const entries = await zipReader.getEntries()\n\n return createArchiveFromEntries(\n entries,\n (entry) =>\n entry.directory\n ? { dir: true, uri: entry.filename }\n : {\n dir: false,\n uri: entry.filename,\n size: entry.uncompressedSize,\n ...arrayBufferFileAccessors(\n () => entry.arrayBuffer(),\n detectMimeTypeFromName(entry.filename) ?? ``,\n ),\n },\n { ...options, close: () => zipReader.close() },\n )\n}\n"],"mappings":"sNAMA,IAAa,EAAyB,MACpC,EACA,EAII,CAAC,IAIE,EAAA,EACL,MAHoB,EAAU,WAAW,EAIxC,GACC,EAAM,UACF,CAAE,IAAK,GAAM,IAAK,EAAM,QAAS,EACjC,CACE,IAAK,GACL,IAAK,EAAM,SACX,KAAM,EAAM,iBACZ,GAAG,EAAA,MACK,EAAM,YAAY,GAAA,EAAA,EAAA,uBAAA,CACD,EAAM,QAAQ,GAAK,EAC5C,CACF,EACN,CAAE,GAAG,EAAS,UAAa,EAAU,MAAM,CAAE,CAC/C"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../../../src/archives/createArchiveFromZipJs.ts"],"sourcesContent":["import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport type { ZipReader } from \"@zip.js/zip.js\"\nimport { createArchiveFromEntries } from \"./createArchiveFromEntries.ts\"\nimport { arrayBufferFileAccessors } from \"./fileAccessors.ts\"\nimport type { Archive } from \"./types.ts\"\n\nexport const createArchiveFromZipJs = async (\n zipReader: ZipReader<unknown>,\n options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> => {\n const entries = await zipReader.getEntries()\n\n return createArchiveFromEntries(\n entries,\n (entry) =>\n entry.directory\n ? { dir: true, uri: entry.filename }\n : {\n dir: false,\n uri: entry.filename,\n size: entry.uncompressedSize,\n ...arrayBufferFileAccessors(\n () => entry.arrayBuffer(),\n detectMimeTypeFromName(entry.filename) ?? ``,\n ),\n },\n { ...options, close: () => zipReader.close() },\n )\n}\n"],"mappings":"sNAMA,IAAa,EAAyB,MACpC,EACA,EAII,CAAC,IAIE,EAAA,EACL,MAHoB,EAAU,WAAW,EAIxC,GACC,EAAM,UACF,CAAE,IAAK,GAAM,IAAK,EAAM,QAAS,EACjC,CACE,IAAK,GACL,IAAK,EAAM,SACX,KAAM,EAAM,iBACZ,GAAG,EAAA,MACK,EAAM,YAAY,GAAA,EAAA,EAAA,uBAAA,CACD,EAAM,QAAQ,GAAK,EAC5C,CACF,EACN,CAAE,GAAG,EAAS,UAAa,EAAU,MAAM,CAAE,CAC/C"}
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../createArchiveFromEntries-CFG3evXM.js";
1
+ import { t as e } from "../../createArchiveFromEntries-BiBoi26P.js";
2
2
  import { t } from "../../fileAccessors-etcCPnpQ.js";
3
3
  import { detectMimeTypeFromName as n } from "@prose-reader/shared";
4
4
  //#region src/archives/createArchiveFromZipJs.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/archives/createArchiveFromZipJs.ts"],"sourcesContent":["import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport type { ZipReader } from \"@zip.js/zip.js\"\nimport { createArchiveFromEntries } from \"./createArchiveFromEntries\"\nimport { arrayBufferFileAccessors } from \"./fileAccessors\"\nimport type { Archive } from \"./types\"\n\nexport const createArchiveFromZipJs = async (\n zipReader: ZipReader<unknown>,\n options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> => {\n const entries = await zipReader.getEntries()\n\n return createArchiveFromEntries(\n entries,\n (entry) =>\n entry.directory\n ? { dir: true, uri: entry.filename }\n : {\n dir: false,\n uri: entry.filename,\n size: entry.uncompressedSize,\n ...arrayBufferFileAccessors(\n () => entry.arrayBuffer(),\n detectMimeTypeFromName(entry.filename) ?? ``,\n ),\n },\n { ...options, close: () => zipReader.close() },\n )\n}\n"],"mappings":";;;;AAMA,IAAa,IAAyB,OACpC,GACA,IAII,CAAC,MAIE,EACL,MAHoB,EAAU,WAAW,IAIxC,MACC,EAAM,YACF;CAAE,KAAK;CAAM,KAAK,EAAM;AAAS,IACjC;CACE,KAAK;CACL,KAAK,EAAM;CACX,MAAM,EAAM;CACZ,GAAG,QACK,EAAM,YAAY,GACxB,EAAuB,EAAM,QAAQ,KAAK,EAC5C;AACF,GACN;CAAE,GAAG;CAAS,aAAa,EAAU,MAAM;AAAE,CAC/C"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/archives/createArchiveFromZipJs.ts"],"sourcesContent":["import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport type { ZipReader } from \"@zip.js/zip.js\"\nimport { createArchiveFromEntries } from \"./createArchiveFromEntries.ts\"\nimport { arrayBufferFileAccessors } from \"./fileAccessors.ts\"\nimport type { Archive } from \"./types.ts\"\n\nexport const createArchiveFromZipJs = async (\n zipReader: ZipReader<unknown>,\n options: {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n } = {},\n): Promise<Archive> => {\n const entries = await zipReader.getEntries()\n\n return createArchiveFromEntries(\n entries,\n (entry) =>\n entry.directory\n ? { dir: true, uri: entry.filename }\n : {\n dir: false,\n uri: entry.filename,\n size: entry.uncompressedSize,\n ...arrayBufferFileAccessors(\n () => entry.arrayBuffer(),\n detectMimeTypeFromName(entry.filename) ?? ``,\n ),\n },\n { ...options, close: () => zipReader.close() },\n )\n}\n"],"mappings":";;;;AAMA,IAAa,IAAyB,OACpC,GACA,IAII,CAAC,MAIE,EACL,MAHoB,EAAU,WAAW,IAIxC,MACC,EAAM,YACF;CAAE,KAAK;CAAM,KAAK,EAAM;AAAS,IACjC;CACE,KAAK;CACL,KAAK,EAAM;CACX,MAAM,EAAM;CACZ,GAAG,QACK,EAAM,YAAY,GACxB,EAAuB,EAAM,QAAQ,KAAK,EAC5C;AACF,GACN;CAAE,GAAG;CAAS,aAAa,EAAU,MAAM;AAAE,CAC/C"}
@@ -1,5 +1,5 @@
1
1
  import { ZipReader } from '@zip.js/zip.js';
2
- import { Archive } from './types';
2
+ import { Archive } from './types.ts';
3
3
  export declare const createArchiveFromZipJs: (zipReader: ZipReader<unknown>, options?: {
4
4
  orderByAlpha?: boolean;
5
5
  name?: string;
@@ -1,4 +1,4 @@
1
- import { FileRecord } from './types';
1
+ import { FileRecord } from './types.ts';
2
2
  type FileContentAccessors = Pick<FileRecord, "blob" | "arrayBuffer">;
3
3
  export declare const blobFileAccessors: (blob: () => Promise<Blob>) => FileContentAccessors;
4
4
  export declare const arrayBufferFileAccessors: (arrayBuffer: () => Promise<ArrayBuffer>, type?: string) => FileContentAccessors;
@@ -1,3 +1,3 @@
1
- import { Archive, ArchiveRecord, FileRecord } from './types';
1
+ import { Archive, ArchiveRecord, FileRecord } from './types.ts';
2
2
  export declare const isImageRecord: (record: ArchiveRecord) => boolean;
3
3
  export declare const getArchiveImageRecords: (archive: Archive) => FileRecord[];
@@ -1,2 +1,2 @@
1
- import { FileRecord } from './types';
1
+ import { FileRecord } from './types.ts';
2
2
  export declare const readRecordAsText: (record: FileRecord) => Promise<string>;
@@ -1,2 +1,2 @@
1
- import { Archive, FileRecord } from '../archives/types';
1
+ import { Archive, FileRecord } from '../archives/types.ts';
2
2
  export declare const getArchiveHasComicInfo: (archive: Archive) => FileRecord | undefined;
@@ -1,4 +1,4 @@
1
- import { ComicInfoManga } from './manga';
1
+ import { ComicInfoManga } from './manga.ts';
2
2
  export declare const COMIC_INFO_FILENAME = "ComicInfo.xml";
3
3
  export declare const COMIC_INFO_KNOWN_FIELDS: readonly ["AgeRating", "AlternateCount", "AlternateNumber", "AlternateSeries", "BlackAndWhite", "Characters", "Colorist", "CommunityRating", "Count", "CoverArtist", "Day", "Editor", "Format", "Genre", "GTIN", "Imprint", "Inker", "LanguageISO", "Letterer", "Locations", "MainCharacterOrTeam", "Manga", "Month", "Notes", "Number", "PageCount", "Penciller", "Publisher", "Review", "ScanInformation", "Series", "SeriesGroup", "StoryArc", "StoryArcNumber", "Summary", "Tags", "Teams", "Title", "Translator", "Volume", "Web", "Writer", "Year"];
4
4
  export type ComicInfoKnownField = (typeof COMIC_INFO_KNOWN_FIELDS)[number];
@@ -1,3 +1,3 @@
1
- import { Archive } from '../archives/types';
2
- import { ComicInfo } from './parse';
1
+ import { Archive } from '../archives/types.ts';
2
+ import { ComicInfo } from './parse.ts';
3
3
  export declare function readArchiveComicInfo(archive: Archive): Promise<ComicInfo | undefined>;
@@ -1,5 +1,5 @@
1
- import { ResolvedMetadata } from '../types/resolvedMetadata';
2
- import { ComicInfo } from './parse';
1
+ import { ResolvedMetadata } from '../types/resolvedMetadata.ts';
2
+ import { ComicInfo } from './parse.ts';
3
3
  export declare const comicInfoMetadataHomes: {
4
4
  readonly AgeRating: "comic.ageRating";
5
5
  readonly AlternateCount: "comic.alternateSeries";
@@ -1,7 +1,7 @@
1
- import { Archive } from '../archives/types';
2
- import { ArchiveOpfParsed } from '../opf/readArchiveOpf';
3
- import { ArchiveReadingOrderItem } from '../readingOrder/resolveArchiveReadingOrder';
4
- import { ResolvedCover } from '../types/resolvedMetadata';
1
+ import { Archive } from '../archives/types.ts';
2
+ import { ArchiveOpfParsed } from '../opf/readArchiveOpf.ts';
3
+ import { ArchiveReadingOrderItem } from '../readingOrder/resolveArchiveReadingOrder.ts';
4
+ import { ResolvedCover } from '../types/resolvedMetadata.ts';
5
5
  export declare const resolveArchiveCover: (archive: Archive, { opf, readingOrder, }?: {
6
6
  opf?: ArchiveOpfParsed;
7
7
  readingOrder?: ArchiveReadingOrderItem[];
@@ -1,6 +1,4 @@
1
1
  import { Report as e, detectMimeTypeFromName as t, getUriBasename as n, sortByTitleComparator as r } from "@prose-reader/shared";
2
- //#endregion
3
- //#region src/report.ts
4
2
  var i = e.namespace("@prose-reader/archive-reader", void 0, { color: "#42b0a5" }), a = (e) => {
5
3
  let t = {};
6
4
  for (let n of e) {
@@ -55,4 +53,4 @@ var i = e.namespace("@prose-reader/archive-reader", void 0, { color: "#42b0a5" }
55
53
  //#endregion
56
54
  export { o as n, i as r, s as t };
57
55
 
58
- //# sourceMappingURL=createArchiveFromEntries-CFG3evXM.js.map
56
+ //# sourceMappingURL=createArchiveFromEntries-BiBoi26P.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createArchiveFromEntries-BiBoi26P.js","names":[],"sources":["../src/report.ts","../src/archives/printTree.ts","../src/archives/createArchive.ts","../src/archives/createArchiveFromEntries.ts"],"sourcesContent":["import { Report as SharedReport } from \"@prose-reader/shared\"\n\nconst PACKAGE_NAME = \"@prose-reader/archive-reader\"\n\n// No explicit `enabled`: inherit the shared root, which auto-configures from\n// the `globalThis.__PROSE_READER_DEBUG` flag (works in window, workers, node).\nexport const Report = SharedReport.namespace(PACKAGE_NAME, undefined, {\n color: \"#42b0a5\",\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.ts\"\nimport { printTree } from \"./printTree.ts\"\nimport type { Archive, ArchiveRecord } from \"./types.ts\"\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","import {\n detectMimeTypeFromName,\n getUriBasename,\n sortByTitleComparator,\n} from \"@prose-reader/shared\"\nimport { createArchive } from \"./createArchive.ts\"\nimport type { Archive, ArchiveRecord, FileRecord } from \"./types.ts\"\n\n/**\n * Normalized view of a source entry, shared by every `createArchiveFrom*`\n * creator that enumerates a flat list of records. A source only has to provide\n * each entry's `uri`, whether it is a directory, and (for files) its `size`\n * plus content accessors; everything else (basename derivation, mime\n * detection, ordering, the `recordsByUri` index) is handled centrally here.\n */\nexport type ArchiveEntry =\n | { dir: true; uri: string }\n | ({ dir: false; uri: string; size: number } & Pick<\n FileRecord,\n \"blob\" | \"arrayBuffer\"\n >)\n\nexport type CreateArchiveFromEntriesOptions = {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n close: () => Promise<void>\n}\n\n/**\n * Builds an {@link Archive} from an arbitrary source list. `toEntry` is invoked\n * once per item, and the resulting records are sorted in place when\n * `orderByAlpha` is set — there is no intermediate array, so construction stays\n * a single map plus an optional sort regardless of the source.\n */\nexport const createArchiveFromEntries = <Item>(\n items: Item[],\n toEntry: (item: Item) => ArchiveEntry,\n {\n orderByAlpha,\n name,\n encodingFormat,\n close,\n }: CreateArchiveFromEntriesOptions,\n): Archive => {\n const records = items.map((item): ArchiveRecord => {\n const entry = toEntry(item)\n const basename = getUriBasename(entry.uri)\n\n if (entry.dir) {\n return { dir: true, basename, uri: entry.uri }\n }\n\n return {\n dir: false,\n basename,\n uri: entry.uri,\n encodingFormat: detectMimeTypeFromName(entry.uri),\n size: entry.size,\n blob: entry.blob,\n arrayBuffer: entry.arrayBuffer,\n }\n })\n\n if (orderByAlpha) {\n records.sort((a, b) => sortByTitleComparator(a.uri, b.uri))\n }\n\n return createArchive({ filename: name, encodingFormat, records, close })\n}\n"],"mappings":";AAMA,IAAa,IAAS,EAAa,UAAU,gCAAc,KAAA,GAAW,EACpE,OAAO,UACT,CAAC,GCJY,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,CAAC,CACrB,KAAK,CAAC,CACN,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,CAAC,CAAC,SAAS,IAChC,GAAG,IAAS,EAAI,KAAK,EAAO,GAAO,CAAU,MAE/C,GAAG,IAAS;CACrB,CAAC,CAAC,CACD,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,GCJa,KACX,GACA,GACA,EACE,iBACA,SACA,mBACA,eAEU;CACZ,IAAM,IAAU,EAAM,KAAK,MAAwB;EACjD,IAAM,IAAQ,EAAQ,CAAI,GACpB,IAAW,EAAe,EAAM,GAAG;EAMzC,OAJI,EAAM,MACD;GAAE,KAAK;GAAM;GAAU,KAAK,EAAM;EAAI,IAGxC;GACL,KAAK;GACL;GACA,KAAK,EAAM;GACX,gBAAgB,EAAuB,EAAM,GAAG;GAChD,MAAM,EAAM;GACZ,MAAM,EAAM;GACZ,aAAa,EAAM;EACrB;CACF,CAAC;CAMD,OAJI,KACF,EAAQ,MAAM,GAAG,MAAM,EAAsB,EAAE,KAAK,EAAE,GAAG,CAAC,GAGrD,EAAc;EAAE,UAAU;EAAM;EAAgB;EAAS;CAAM,CAAC;AACzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"createArchiveFromEntries-DcPCGgZW.cjs","names":[],"sources":["../package.json","../src/report.ts","../src/archives/printTree.ts","../src/archives/createArchive.ts","../src/archives/createArchiveFromEntries.ts"],"sourcesContent":["{\n \"name\": \"@prose-reader/archive-reader\",\n \"version\": \"1.336.0\",\n \"type\": \"module\",\n \"main\": \"./dist/index/index.cjs\",\n \"module\": \"./dist/index/index.js\",\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\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 \"./archives/createArchiveFromZipJs\": {\n \"types\": \"./dist/archives/createArchiveFromZipJs.d.ts\",\n \"import\": \"./dist/archives/createArchiveFromZipJs/index.js\",\n \"require\": \"./dist/archives/createArchiveFromZipJs/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/shared\": \"^1.336.0\",\n \"xmldoc\": \"^2.0.0\"\n },\n \"peerDependencies\": {\n \"@zip.js/zip.js\": \"^2.8.33\",\n \"buffer\": \"^6.0.3\",\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 \"peerDependenciesMeta\": {\n \"@zip.js/zip.js\": {\n \"optional\": true\n },\n \"buffer\": {\n \"optional\": true\n },\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 \"devDependencies\": {\n \"@types/unzipper\": \"^0.10.11\",\n \"@zip.js/zip.js\": \"^2.8.34\",\n \"buffer\": \"^6.0.3\",\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\n// No explicit `enabled`: inherit the shared root, which auto-configures from\n// the `globalThis.__PROSE_READER_DEBUG` flag (works in window, workers, node).\nexport const Report = SharedReport.namespace(name, undefined, {\n color: \"#42b0a5\",\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","import {\n detectMimeTypeFromName,\n getUriBasename,\n sortByTitleComparator,\n} from \"@prose-reader/shared\"\nimport { createArchive } from \"./createArchive\"\nimport type { Archive, ArchiveRecord, FileRecord } from \"./types\"\n\n/**\n * Normalized view of a source entry, shared by every `createArchiveFrom*`\n * creator that enumerates a flat list of records. A source only has to provide\n * each entry's `uri`, whether it is a directory, and (for files) its `size`\n * plus content accessors; everything else (basename derivation, mime\n * detection, ordering, the `recordsByUri` index) is handled centrally here.\n */\nexport type ArchiveEntry =\n | { dir: true; uri: string }\n | ({ dir: false; uri: string; size: number } & Pick<\n FileRecord,\n \"blob\" | \"arrayBuffer\"\n >)\n\nexport type CreateArchiveFromEntriesOptions = {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n close: () => Promise<void>\n}\n\n/**\n * Builds an {@link Archive} from an arbitrary source list. `toEntry` is invoked\n * once per item, and the resulting records are sorted in place when\n * `orderByAlpha` is set — there is no intermediate array, so construction stays\n * a single map plus an optional sort regardless of the source.\n */\nexport const createArchiveFromEntries = <Item>(\n items: Item[],\n toEntry: (item: Item) => ArchiveEntry,\n {\n orderByAlpha,\n name,\n encodingFormat,\n close,\n }: CreateArchiveFromEntriesOptions,\n): Archive => {\n const records = items.map((item): ArchiveRecord => {\n const entry = toEntry(item)\n const basename = getUriBasename(entry.uri)\n\n if (entry.dir) {\n return { dir: true, basename, uri: entry.uri }\n }\n\n return {\n dir: false,\n basename,\n uri: entry.uri,\n encodingFormat: detectMimeTypeFromName(entry.uri),\n size: entry.size,\n blob: entry.blob,\n arrayBuffer: entry.arrayBuffer,\n }\n })\n\n if (orderByAlpha) {\n records.sort((a, b) => sortByTitleComparator(a.uri, b.uri))\n }\n\n return createArchive({ filename: name, encodingFormat, records, close })\n}\n"],"mappings":"sCCKA,IAAa,EAAS,EAAA,OAAa,UAAU,+BAAM,IAAA,GAAW,CAC5D,MAAO,SACT,CAAC,ECHY,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,CAAC,CACrB,KAAK,CAAC,CACN,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,CAAC,CAAC,OAAS,EAChC,GAAG,IAAS,EAAI,KAAK,EAAO,EAAO,CAAU,IAE/C,GAAG,IAAS,GACrB,CAAC,CAAC,CACD,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,ECJa,GACX,EACA,EACA,CACE,eACA,OACA,iBACA,WAEU,CACZ,IAAM,EAAU,EAAM,IAAK,GAAwB,CACjD,IAAM,EAAQ,EAAQ,CAAI,EACpB,GAAA,EAAA,EAAA,eAAA,CAA0B,EAAM,GAAG,EAMzC,OAJI,EAAM,IACD,CAAE,IAAK,GAAM,WAAU,IAAK,EAAM,GAAI,EAGxC,CACL,IAAK,GACL,WACA,IAAK,EAAM,IACX,gBAAA,EAAA,EAAA,uBAAA,CAAuC,EAAM,GAAG,EAChD,KAAM,EAAM,KACZ,KAAM,EAAM,KACZ,YAAa,EAAM,WACrB,CACF,CAAC,EAMD,OAJI,GACF,EAAQ,MAAM,EAAG,KAAA,EAAA,EAAA,sBAAA,CAA4B,EAAE,IAAK,EAAE,GAAG,CAAC,EAGrD,EAAc,CAAE,SAAU,EAAM,iBAAgB,UAAS,OAAM,CAAC,CACzE"}
1
+ {"version":3,"file":"createArchiveFromEntries-DcPCGgZW.cjs","names":[],"sources":["../src/report.ts","../src/archives/printTree.ts","../src/archives/createArchive.ts","../src/archives/createArchiveFromEntries.ts"],"sourcesContent":["import { Report as SharedReport } from \"@prose-reader/shared\"\n\nconst PACKAGE_NAME = \"@prose-reader/archive-reader\"\n\n// No explicit `enabled`: inherit the shared root, which auto-configures from\n// the `globalThis.__PROSE_READER_DEBUG` flag (works in window, workers, node).\nexport const Report = SharedReport.namespace(PACKAGE_NAME, undefined, {\n color: \"#42b0a5\",\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.ts\"\nimport { printTree } from \"./printTree.ts\"\nimport type { Archive, ArchiveRecord } from \"./types.ts\"\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","import {\n detectMimeTypeFromName,\n getUriBasename,\n sortByTitleComparator,\n} from \"@prose-reader/shared\"\nimport { createArchive } from \"./createArchive.ts\"\nimport type { Archive, ArchiveRecord, FileRecord } from \"./types.ts\"\n\n/**\n * Normalized view of a source entry, shared by every `createArchiveFrom*`\n * creator that enumerates a flat list of records. A source only has to provide\n * each entry's `uri`, whether it is a directory, and (for files) its `size`\n * plus content accessors; everything else (basename derivation, mime\n * detection, ordering, the `recordsByUri` index) is handled centrally here.\n */\nexport type ArchiveEntry =\n | { dir: true; uri: string }\n | ({ dir: false; uri: string; size: number } & Pick<\n FileRecord,\n \"blob\" | \"arrayBuffer\"\n >)\n\nexport type CreateArchiveFromEntriesOptions = {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n close: () => Promise<void>\n}\n\n/**\n * Builds an {@link Archive} from an arbitrary source list. `toEntry` is invoked\n * once per item, and the resulting records are sorted in place when\n * `orderByAlpha` is set — there is no intermediate array, so construction stays\n * a single map plus an optional sort regardless of the source.\n */\nexport const createArchiveFromEntries = <Item>(\n items: Item[],\n toEntry: (item: Item) => ArchiveEntry,\n {\n orderByAlpha,\n name,\n encodingFormat,\n close,\n }: CreateArchiveFromEntriesOptions,\n): Archive => {\n const records = items.map((item): ArchiveRecord => {\n const entry = toEntry(item)\n const basename = getUriBasename(entry.uri)\n\n if (entry.dir) {\n return { dir: true, basename, uri: entry.uri }\n }\n\n return {\n dir: false,\n basename,\n uri: entry.uri,\n encodingFormat: detectMimeTypeFromName(entry.uri),\n size: entry.size,\n blob: entry.blob,\n arrayBuffer: entry.arrayBuffer,\n }\n })\n\n if (orderByAlpha) {\n records.sort((a, b) => sortByTitleComparator(a.uri, b.uri))\n }\n\n return createArchive({ filename: name, encodingFormat, records, close })\n}\n"],"mappings":"sCAMA,IAAa,EAAS,EAAA,OAAa,UAAU,+BAAc,IAAA,GAAW,CACpE,MAAO,SACT,CAAC,ECJY,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,CAAC,CACrB,KAAK,CAAC,CACN,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,CAAC,CAAC,OAAS,EAChC,GAAG,IAAS,EAAI,KAAK,EAAO,EAAO,CAAU,IAE/C,GAAG,IAAS,GACrB,CAAC,CAAC,CACD,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,ECJa,GACX,EACA,EACA,CACE,eACA,OACA,iBACA,WAEU,CACZ,IAAM,EAAU,EAAM,IAAK,GAAwB,CACjD,IAAM,EAAQ,EAAQ,CAAI,EACpB,GAAA,EAAA,EAAA,eAAA,CAA0B,EAAM,GAAG,EAMzC,OAJI,EAAM,IACD,CAAE,IAAK,GAAM,WAAU,IAAK,EAAM,GAAI,EAGxC,CACL,IAAK,GACL,WACA,IAAK,EAAM,IACX,gBAAA,EAAA,EAAA,uBAAA,CAAuC,EAAM,GAAG,EAChD,KAAM,EAAM,KACZ,KAAM,EAAM,KACZ,YAAa,EAAM,WACrB,CACF,CAAC,EAMD,OAJI,GACF,EAAQ,MAAM,EAAG,KAAA,EAAA,EAAA,sBAAA,CAA4B,EAAE,IAAK,EAAE,GAAG,CAAC,EAGrD,EAAc,CAAE,SAAU,EAAM,iBAAgB,UAAS,OAAM,CAAC,CACzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"fileAccessors-DWVChFUB.cjs","names":[],"sources":["../src/archives/fileAccessors.ts"],"sourcesContent":["import type { FileRecord } from \"./types\"\n\ntype FileContentAccessors = Pick<FileRecord, \"blob\" | \"arrayBuffer\">\n\n/**\n * Derives the content accessors of a {@link FileRecord} from a single `Blob`\n * source. Content is not retained between calls so a long-lived archive does\n * not pin decompressed bytes in memory.\n */\nexport const blobFileAccessors = (\n blob: () => Promise<Blob>,\n): FileContentAccessors => ({\n blob,\n arrayBuffer: () => blob().then((value) => value.arrayBuffer()),\n})\n\n/**\n * Derives the content accessors of a {@link FileRecord} from an `ArrayBuffer`\n * source, avoiding a `Blob` round-trip for binary-native archives. Content is\n * not retained between calls.\n */\nexport const arrayBufferFileAccessors = (\n arrayBuffer: () => Promise<ArrayBuffer>,\n type = ``,\n): FileContentAccessors => ({\n arrayBuffer,\n blob: () => arrayBuffer().then((value) => new Blob([value], { type })),\n})\n"],"mappings":"AASA,IAAa,EACX,IAC0B,CAC1B,OACA,gBAAmB,EAAK,CAAC,CAAC,KAAM,GAAU,EAAM,YAAY,CAAC,CAC/D,GAOa,GACX,EACA,EAAO,MACmB,CAC1B,cACA,SAAY,EAAY,CAAC,CAAC,KAAM,GAAU,IAAI,KAAK,CAAC,CAAK,EAAG,CAAE,MAAK,CAAC,CAAC,CACvE"}
1
+ {"version":3,"file":"fileAccessors-DWVChFUB.cjs","names":[],"sources":["../src/archives/fileAccessors.ts"],"sourcesContent":["import type { FileRecord } from \"./types.ts\"\n\ntype FileContentAccessors = Pick<FileRecord, \"blob\" | \"arrayBuffer\">\n\n/**\n * Derives the content accessors of a {@link FileRecord} from a single `Blob`\n * source. Content is not retained between calls so a long-lived archive does\n * not pin decompressed bytes in memory.\n */\nexport const blobFileAccessors = (\n blob: () => Promise<Blob>,\n): FileContentAccessors => ({\n blob,\n arrayBuffer: () => blob().then((value) => value.arrayBuffer()),\n})\n\n/**\n * Derives the content accessors of a {@link FileRecord} from an `ArrayBuffer`\n * source, avoiding a `Blob` round-trip for binary-native archives. Content is\n * not retained between calls.\n */\nexport const arrayBufferFileAccessors = (\n arrayBuffer: () => Promise<ArrayBuffer>,\n type = ``,\n): FileContentAccessors => ({\n arrayBuffer,\n blob: () => arrayBuffer().then((value) => new Blob([value], { type })),\n})\n"],"mappings":"AASA,IAAa,EACX,IAC0B,CAC1B,OACA,gBAAmB,EAAK,CAAC,CAAC,KAAM,GAAU,EAAM,YAAY,CAAC,CAC/D,GAOa,GACX,EACA,EAAO,MACmB,CAC1B,cACA,SAAY,EAAY,CAAC,CAAC,KAAM,GAAU,IAAI,KAAK,CAAC,CAAK,EAAG,CAAE,MAAK,CAAC,CAAC,CACvE"}
@@ -1 +1 @@
1
- {"version":3,"file":"fileAccessors-etcCPnpQ.js","names":[],"sources":["../src/archives/fileAccessors.ts"],"sourcesContent":["import type { FileRecord } from \"./types\"\n\ntype FileContentAccessors = Pick<FileRecord, \"blob\" | \"arrayBuffer\">\n\n/**\n * Derives the content accessors of a {@link FileRecord} from a single `Blob`\n * source. Content is not retained between calls so a long-lived archive does\n * not pin decompressed bytes in memory.\n */\nexport const blobFileAccessors = (\n blob: () => Promise<Blob>,\n): FileContentAccessors => ({\n blob,\n arrayBuffer: () => blob().then((value) => value.arrayBuffer()),\n})\n\n/**\n * Derives the content accessors of a {@link FileRecord} from an `ArrayBuffer`\n * source, avoiding a `Blob` round-trip for binary-native archives. Content is\n * not retained between calls.\n */\nexport const arrayBufferFileAccessors = (\n arrayBuffer: () => Promise<ArrayBuffer>,\n type = ``,\n): FileContentAccessors => ({\n arrayBuffer,\n blob: () => arrayBuffer().then((value) => new Blob([value], { type })),\n})\n"],"mappings":";AASA,IAAa,KACX,OAC0B;CAC1B;CACA,mBAAmB,EAAK,CAAC,CAAC,MAAM,MAAU,EAAM,YAAY,CAAC;AAC/D,IAOa,KACX,GACA,IAAO,QACmB;CAC1B;CACA,YAAY,EAAY,CAAC,CAAC,MAAM,MAAU,IAAI,KAAK,CAAC,CAAK,GAAG,EAAE,QAAK,CAAC,CAAC;AACvE"}
1
+ {"version":3,"file":"fileAccessors-etcCPnpQ.js","names":[],"sources":["../src/archives/fileAccessors.ts"],"sourcesContent":["import type { FileRecord } from \"./types.ts\"\n\ntype FileContentAccessors = Pick<FileRecord, \"blob\" | \"arrayBuffer\">\n\n/**\n * Derives the content accessors of a {@link FileRecord} from a single `Blob`\n * source. Content is not retained between calls so a long-lived archive does\n * not pin decompressed bytes in memory.\n */\nexport const blobFileAccessors = (\n blob: () => Promise<Blob>,\n): FileContentAccessors => ({\n blob,\n arrayBuffer: () => blob().then((value) => value.arrayBuffer()),\n})\n\n/**\n * Derives the content accessors of a {@link FileRecord} from an `ArrayBuffer`\n * source, avoiding a `Blob` round-trip for binary-native archives. Content is\n * not retained between calls.\n */\nexport const arrayBufferFileAccessors = (\n arrayBuffer: () => Promise<ArrayBuffer>,\n type = ``,\n): FileContentAccessors => ({\n arrayBuffer,\n blob: () => arrayBuffer().then((value) => new Blob([value], { type })),\n})\n"],"mappings":";AASA,IAAa,KACX,OAC0B;CAC1B;CACA,mBAAmB,EAAK,CAAC,CAAC,MAAM,MAAU,EAAM,YAAY,CAAC;AAC/D,IAOa,KACX,GACA,IAAO,QACmB;CAC1B;CACA,YAAY,EAAY,CAAC,CAAC,MAAM,MAAU,IAAI,KAAK,CAAC,CAAK,GAAG,EAAE,QAAK,CAAC,CAAC;AACvE"}
@@ -28,5 +28,5 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
28
28
  `)}
29
29
  </spine>
30
30
  </package>
31
- `,c=n.map(e=>({dir:!1,basename:(0,r.getUriBasename)(e),encodingFormat:(0,r.detectMimeTypeFromName)(e),uri:e,size:0,...t.n(async()=>(await fetch(e)).blob())}));return e.n({records:[{dir:!1,basename:`content.opf`,uri:`content.opf`,size:0,...t.n(async()=>new Blob([s]))},...c],close:()=>Promise.resolve()})},y=e=>(0,r.parseContentType)(e.encodingFormat??``)||(0,r.detectMimeTypeFromName)(e.basename),b=e=>c(e)&&y(e)?.startsWith(`image/`)===!0,x=e=>e.records.filter(c).filter(b),S=`ComicInfo.xml`,C=`AgeRating.AlternateCount.AlternateNumber.AlternateSeries.BlackAndWhite.Characters.Colorist.CommunityRating.Count.CoverArtist.Day.Editor.Format.Genre.GTIN.Imprint.Inker.LanguageISO.Letterer.Locations.MainCharacterOrTeam.Manga.Month.Notes.Number.PageCount.Penciller.Publisher.Review.ScanInformation.Series.SeriesGroup.StoryArc.StoryArcNumber.Summary.Tags.Teams.Title.Translator.Volume.Web.Writer.Year`.split(`.`),w=new Set([`Pages`,`ComicInfo`]),T=e=>e.children.some(e=>e.type===`element`),E=e=>{let t=e.val.trim();return t.length>0?t:void 0},D=e=>{let t;try{t=new n.XmlDocument(e)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`${S} is malformed: ${t}`,{cause:e})}let r={};return t.eachChild(e=>{if(e.type!==`element`||w.has(e.name)||T(e))return;let t=E(e);t!==void 0&&r[e.name]===void 0&&(r[e.name]=t)}),{kind:`comicInfo`,...r}},ee=S.toLowerCase(),O=e=>e.records.find(e=>c(e)&&e.basename.toLowerCase()===ee),k=[`Unknown`,`No`,`Yes`,`YesAndRightToLeft`],te=e=>{for(let t of k)if(t===e)return!0;return!1};async function ne(e){let t=O(e);if(t)return D(await s(t))}var re=new Set([8,12,13,14]),A=e=>{if(e==null)return;let t=String(e).replace(/\D/g,``);if(!(t.length===0||!re.has(t.length)))return t},ie=/(?:97[89])?\d{9}[\dXx]/,j=e=>{if(e==null)return;let t=String(e).trim().replace(/^urn:isbn:/i,``).replace(/^isbn[:\s-]*/i,``),n=t.replace(/[^0-9Xx]/g,``);if(n.length===10||n.length===13)return n.toUpperCase();let r=t.match(ie);if(r)return r[0].toUpperCase()},ae={AgeRating:`comic.ageRating`,AlternateCount:`comic.alternateSeries`,AlternateNumber:`comic.alternateSeries`,AlternateSeries:`comic.alternateSeries`,BlackAndWhite:`comic.blackAndWhite`,Characters:`comic.characters`,Colorist:`contributors`,CommunityRating:`comic.communityRating`,Count:`belongsTo.series`,CoverArtist:`contributors`,Day:`published`,Editor:`contributors`,Format:`comic.format`,Genre:`subjects`,GTIN:`identifiers`,Imprint:`imprint`,Inker:`contributors`,LanguageISO:`languages`,Letterer:`contributors`,Locations:`comic.locations`,MainCharacterOrTeam:`comic.mainCharacterOrTeam`,Manga:`readingDirection`,Month:`published`,Notes:`comic.notes`,Number:`belongsTo.series`,PageCount:`numberOfPages`,Penciller:`contributors`,Publisher:`publisher`,Review:`comic.review`,ScanInformation:`comic.scanInformation`,Series:`belongsTo.series`,SeriesGroup:`belongsTo.collection`,StoryArc:`comic.storyArcs`,StoryArcNumber:`comic.storyArcs`,Summary:`description`,Tags:`subjects`,Teams:`comic.teams`,Title:`title`,Translator:`contributors`,Volume:`comic.volume`,Web:`comic.web`,Writer:`contributors`,Year:`published`},oe=e=>{switch(e.Manga){case`YesAndRightToLeft`:return`rtl`;case`Yes`:case`No`:return`ltr`;default:return}},M=e=>{if(e===void 0)return;let t=e.trim();return t.length>0?t:void 0},N=e=>e===void 0?[]:e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0),P=e=>{let t=M(e);if(t===void 0||!/^\d+$/.test(t))return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0},F=e=>{let t=M(e);if(t===void 0||!/^\d+(\.\d+)?$/.test(t))return;let n=Number.parseFloat(t);return Number.isFinite(n)?n:void 0},se=e=>{let t=M(e)?.toLowerCase();if(t===`yes`)return!0;if(t===`no`)return!1},ce=e=>{switch(e.Manga){case`Yes`:case`YesAndRightToLeft`:return!0;case`No`:return!1;default:return}},le=e=>{let t=P(e.Year),n=P(e.Month),r=P(e.Day);if(!(t===void 0&&n===void 0&&r===void 0))return{...t===void 0?{}:{year:t},...n===void 0?{}:{month:n},...r===void 0?{}:{day:r}}},ue=[[`Writer`,`author`],[`Penciller`,`penciler`],[`Inker`,`inker`],[`Colorist`,`colorist`],[`Letterer`,`letterer`],[`CoverArtist`,`coverArtist`],[`Editor`,`editor`],[`Translator`,`translator`]],de=e=>{let t=new Map;for(let[n,r]of ue)for(let i of N(e[n])){let e=t.get(i);e?e.roles.includes(r)||e.roles.push(r):t.set(i,{name:i,roles:[r]})}return[...t.values()]},fe=e=>{let t=M(e.Series);if(t!==void 0)return p({name:t,position:F(e.Number),total:P(e.Count)})},pe=e=>{let t=M(e.AlternateSeries);if(t!==void 0)return p({name:t,position:F(e.AlternateNumber),total:P(e.AlternateCount)})},me=e=>{let t=N(e.StoryArc);if(t.length===0)return[];let n=N(e.StoryArcNumber);return t.map((e,t)=>p({name:e,position:F(n[t])}))},I=e=>e.length>0?e:void 0,he=e=>{let t=I((e.Web??``).split(/\s+/).filter(e=>e.length>0)),n=p({manga:ce(e),blackAndWhite:se(e.BlackAndWhite),volume:P(e.Volume),format:M(e.Format),ageRating:M(e.AgeRating),communityRating:F(e.CommunityRating),notes:M(e.Notes),review:M(e.Review),web:t,scanInformation:M(e.ScanInformation),mainCharacterOrTeam:M(e.MainCharacterOrTeam),characters:I(N(e.Characters)),teams:I(N(e.Teams)),locations:I(N(e.Locations)),storyArcs:I(me(e)),alternateSeries:pe(e)});return Object.keys(n).length>0?n:void 0},ge=e=>{let t=fe(e),n=I(N(e.SeriesGroup).map(e=>({name:e})));if(!(t===void 0&&n===void 0))return p({series:t===void 0?void 0:[t],collection:n})},L=e=>{let t=e.GTIN,n=M(t),r=M(e.LanguageISO),i=[...N(e.Genre),...N(e.Tags)];return p({title:M(e.Title),description:M(e.Summary),publisher:M(e.Publisher),imprint:M(e.Imprint),languages:r===void 0?void 0:[r],subjects:I(i),contributors:I(de(e)),published:le(e),readingDirection:oe(e),numberOfPages:P(e.PageCount),gtin:A(t),isbn:j(t),identifiers:n===void 0?void 0:[{value:n,scheme:`GTIN`}],belongsTo:ge(e),comic:he(e)})},R=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(`/`))||``}},z=e=>e===void 0||e.trim().length===0?[]:e.trim().split(/\s+/).filter(e=>e.length>0),_e=e=>{let t=z(e);if(t.length===0)return{};let n;t.includes(`rendition:layout-reflowable`)&&(n=`reflowable`),t.includes(`rendition:layout-pre-paginated`)&&(n=`pre-paginated`);let r;return t.includes(`rendition:flow-auto`)&&(r=`auto`),t.includes(`rendition:flow-paginated`)&&(r=`paginated`),t.includes(`rendition:flow-scrolled-doc`)&&(r=`scrolled-doc`),t.includes(`rendition:flow-scrolled-continuous`)&&(r=`scrolled-continuous`),{...n===void 0?{}:{renditionLayout:n},...r===void 0?{}:{renditionFlow:r},...t.includes(`page-spread-left`)?{pageSpreadLeft:!0}:{},...t.includes(`page-spread-right`)?{pageSpreadRight:!0}:{}}},B=e=>e.includes(`:`)?e.slice(e.lastIndexOf(`:`)+1):e,V=(e,t)=>B(e).toLowerCase()===t.toLowerCase(),H=e=>e.type===`element`,U=(e,t)=>{for(let n of e.children)if(H(n)&&V(n.name,t))return n},W=(e,t)=>{let n=[];for(let r of e.children)H(r)&&V(r.name,t)&&n.push(r);return n},ve=e=>{let t=[];return e.eachChild(e=>{if(B(e.name).toLowerCase()!==`identifier`)return;let n=e.val.trim();if(n.length===0)return;let r=(e.attr[`opf:scheme`]??e.attr[`opf:Scheme`]??e.attr.scheme)?.trim();t.push({value:n,...r!==void 0&&r.length>0?{scheme:r}:{}})}),t},G=(e,t)=>{let n;return e.eachChild(e=>{if(n!==void 0||B(e.name).toLowerCase()!==t.toLowerCase())return;let r=e.val.trim();r.length>0&&(n=r)}),n},K=(e,t)=>{let n=[];return e.eachChild(e=>{if(B(e.name).toLowerCase()!==t.toLowerCase())return;let r=e.val.trim();r.length>0&&n.push(r)}),n},ye=e=>{let t;return e.eachChild(e=>{if(t!==void 0||B(e.name).toLowerCase()!==`meta`||e.attr.name?.toLowerCase()!==`cover`)return;let n=e.attr.content?.trim();n!==void 0&&n.length>0&&(t=n)}),t},be=({manifestItems:e,metadataEl:t})=>{let n=e=>e.mediaType?.toLowerCase().includes(`image/`)===!0,r=e.find(e=>n(e)?z(e.properties).includes(`cover-image`):!1);if(r!==void 0)return r.href;if(t!==void 0){let r=ye(t);if(r!==void 0){let t=e.find(e=>e.id===r&&n(e));if(t!==void 0)return t.href}}return e.find(e=>e.id.toLowerCase().includes(`cover`)&&n(e))?.href},q=(e,t)=>{let n=e.attr[t]?.trim();return n!==void 0&&n.length>0?n:void 0},xe=e=>{let t=[];return e.eachChild(e=>{if(B(e.name).toLowerCase()!==`meta`)return;let n=q(e,`property`),r=q(e,`refines`),i=q(e,`scheme`),a=q(e,`id`),o=q(e,`name`),s=q(e,`content`),c=e.val.trim(),l=c.length>0?c:void 0,u={...n===void 0?{}:{property:n},...r===void 0?{}:{refines:r},...i===void 0?{}:{scheme:i},...a===void 0?{}:{id:a},...o===void 0?{}:{name:o},...s===void 0?{}:{content:s},...l===void 0?{}:{value:l}};Object.keys(u).length!==0&&t.push(u)}),t},Se=(e,t)=>e.replace(/^#/,``)===t,Ce=(e,t)=>{let n=[];return e.eachChild(e=>{let r=B(e.name).toLowerCase();if(r!==`creator`&&r!==`contributor`)return;let i=e.val.trim();if(i.length===0)return;let a=q(e,`id`),o=e=>a===void 0?[]:t.flatMap(t=>t.refines!==void 0&&Se(t.refines,a)&&t.property===e&&t.value!==void 0?[t.value]:[]),s=q(e,`opf:role`)??q(e,`role`),c=[...s===void 0?[]:[s],...o(`role`)],l=q(e,`opf:file-as`)??q(e,`file-as`)??o(`file-as`)[0];n.push({name:i,source:r,...a===void 0?{}:{id:a},roles:c,...l===void 0?{}:{fileAs:l}})}),n},J=(e,t)=>{let n=W(e,`meta`).find(e=>e.attr.property===t)?.val;if(!(n===void 0||n.trim().length===0))return n},we=e=>{let t=U(e,`guide`);if(t===void 0)return[];let n=[];for(let e of W(t,`reference`)){let t=e.attr.href?.trim();t===void 0||t.length===0||n.push({href:t,title:e.attr.title?.trim()??``,type:e.attr.type?.trim()??``})}return n},Te=e=>{let t=e.attr.id,n=e.attr.href;if(t===void 0||t.length===0||n===void 0||n.length===0)return;let r=e.attr[`media-type`],i=e.attr.properties?.trim();return{id:t,href:n,...r!==void 0&&r.length>0?{mediaType:r}:{},...i!==void 0&&i.length>0?{properties:i}:{}}},Ee=e=>{let t=[],n=new Map;for(let r of W(e,`item`)){let e=Te(r);e!==void 0&&(t.push(e),n.set(e.id,e))}return{items:t,byId:n}},De=(e,t)=>{let n=[];for(let r of W(t,`itemref`)){let t=r.attr.idref;if(t===void 0||t.trim().length===0)continue;let i=e.get(t);if(i===void 0)continue;let a=_e(r.attr.properties);n.push({idref:t,id:i.id,href:i.href,...i.mediaType===void 0?{}:{mediaType:i.mediaType},...i.properties===void 0?{}:{properties:i.properties},...a.renditionLayout===void 0?{}:{renditionLayout:a.renditionLayout},...a.renditionFlow===void 0?{}:{renditionFlow:a.renditionFlow},...a.pageSpreadLeft===void 0?{}:{pageSpreadLeft:a.pageSpreadLeft},...a.pageSpreadRight===void 0?{}:{pageSpreadRight:a.pageSpreadRight}})}return n},Y=e=>{let t=new n.XmlDocument(e),r=U(t,`manifest`),i=U(t,`spine`),a=U(t,`metadata`),o=[],s=[];if(r!==void 0){let{items:e,byId:t}=Ee(r);o=e,i!==void 0&&(s=De(t,i))}let c=i?.attr[`page-progression-direction`],l=c!==void 0&&c.trim().length>0?c:void 0,u=i?.attr.toc,d=u!==void 0&&u.trim().length>0?u.trim():void 0,f,p,m,h,g,_=[],v=[],y=[],b=[],x,S,C,w=[],T=[];a!==void 0&&(f=G(a,`title`),p=G(a,`publisher`),m=G(a,`description`),h=G(a,`rights`),g=G(a,`date`),_=K(a,`creator`),y=K(a,`language`),b=K(a,`subject`),x=J(a,`rendition:layout`),S=J(a,`rendition:flow`),C=J(a,`rendition:spread`),w=xe(a),v=Ce(a,w),T.push(...ve(a)));let E=be({manifestItems:o,metadataEl:a}),D=we(t);return{kind:`opf`,manifestItems:o,spineRows:s,spineTocIdref:d,identifiers:T,title:f,creators:_,contributors:v,publisher:p,description:m,rights:h,languages:y,subjects:b,date:g,coverHref:E,renditionLayoutMeta:x,renditionFlowMeta:S,renditionSpreadMeta:C,pageProgressionDirection:l,guide:D,metas:w}};async function X(e){let{data:t,basePath:n}=R(e)||{};if(!(!t||t.dir))return{opf:Y(await s(t)),basePath:n}}var Z=`com.kobobooks.display-options.xml`,Oe=e=>{let t=e.childNamed(`platform`);if(!t)return{};for(let e of t.childrenNamed(`option`))if(e.attr?.name===`fixed-layout`)return e.val.trim().toLowerCase()===`true`?{renditionLayout:`pre-paginated`}:{};return{}},ke=e=>{let t=new n.XmlDocument(e);return t.name?.toLowerCase()===`display_options`?{kind:`kobo`,...Oe(t)}:{kind:`kobo`}},Ae=e=>{let t=[];for(let n of e.split(`/`))if(n!==`.`){if(n===`..`){t.pop();continue}t.push(n)}return t.join(`/`)},je=(e,t)=>/^https?:\/\//.test(e)?e:Ae(t?`${t}/${e}`:e),Me=e=>{let t=e?.trim().toLowerCase();return t===`reflowable`||t===`pre-paginated`?t:void 0},Ne=(e,{opf:t,basePath:n})=>{let r=Me(t.renditionLayoutMeta),i=t.spineRows.map(t=>{let r=je(t.href,n);return{row:t,uri:r,record:u(e,r)}}),a=i.reduce((e,{record:t})=>e+(t?.size??0),0);return i.map(({row:e,uri:n,record:i})=>p({uri:n,id:e.id,mediaType:e.mediaType??i?.encodingFormat,size:i?.size,renditionLayout:e.renditionLayout??r,renditionFlow:e.renditionFlow,pageSpreadLeft:e.pageSpreadLeft,pageSpreadRight:e.pageSpreadRight,progressionWeight:a>0?(i?.size??0)/a:1/t.spineRows.length}))},Pe=S.toLowerCase(),Fe=i.toLowerCase(),Ie=e=>{let t=e.basename.toLowerCase();return t===Pe||t===Fe||e.uri.endsWith(`com.kobobooks.display-options.xml`)||t.endsWith(`.db`)},Le=e=>{let t=e.records.filter(c).filter(e=>!Ie(e));return t.map(e=>{let n=(0,r.parseContentType)(e.encodingFormat??``)||(0,r.detectMimeTypeFromName)(e.basename);return p({uri:e.uri,mediaType:n,size:e.size,renditionLayout:n!==void 0&&(0,r.isMediaContentMimeType)(n)?`pre-paginated`:void 0,progressionWeight:1/t.length})})},Q=async(e,{opf:t}={})=>{let n=t??await X(e).catch(()=>void 0);return n?Ne(e,n):Le(e)},Re=(e,t)=>{let n=u(e,t);if(n!==void 0)return(0,r.parseContentType)(n.encodingFormat??``)||(0,r.detectMimeTypeFromName)(n.basename)},ze=async(e,{opf:t,readingOrder:n}={})=>{let r=t??await X(e).catch(()=>void 0);if(r!==void 0&&r.opf.coverHref!==void 0){let t=je(r.opf.coverHref,r.basePath);return p({uri:t,mediaType:Re(e,t),confidence:`derived`})}let i=(n??await Q(e,{opf:r})).find(e=>e.mediaType?.startsWith(`image/`)===!0);if(i!==void 0)return p({uri:i.uri,mediaType:i.mediaType,confidence:`assumed`})};async function Be(t){let n=t.records.filter(e=>c(e)&&e.uri.endsWith(`com.kobobooks.display-options.xml`));if(n.length===0)return;let r;for(let t of n){let n=await s(t);try{let{renditionLayout:e}=ke(n);e&&(r=e)}catch(n){e.r.error(`Unable to parse ${Z} (${t.uri})`,n)}}return{kind:`kobo`,...r===void 0?{}:{renditionLayout:r}}}var Ve={renditionLayout:`renditionLayout`},He=e=>p({renditionLayout:e.renditionLayout,kobo:e.renditionLayout===void 0?void 0:{fixedLayout:e.renditionLayout===`pre-paginated`}}),Ue=e=>{let t=e.descendantWithPath(`head`)?.childrenNamed(`meta`).find(e=>e.attr.name===`viewport`);return!!(t&&t.attr.name===`viewport`)},We=async(t,i)=>{if(i.length===0)return!1;for(let a of i){if(!(0,r.isXmlBasedMimeType)({mimeType:a.mediaType,uri:a.uri}))return!1;let i=u(t,a.uri);if(!i||!c(i))return!1;try{let e=await s(i);if(!Ue(new n.XmlDocument(e)))return!1}catch(t){return e.r.error(`layout scan: unable to inspect ${a.uri}`,t),!1}}return!0},Ge=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))},Ke=e=>e.toLowerCase().endsWith(`.opf`),qe=e=>e.records.some(e=>!e.dir&&(Ke(e.basename)||Ke(e.uri))),Je=e=>{if(e===void 0)return;let t=e.trim().match(/^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?/);if(t===null)return;let[,n,r,i]=t;return{...n===void 0?{}:{year:Number.parseInt(n,10)},...r===void 0?{}:{month:Number.parseInt(r,10)},...i===void 0?{}:{day:Number.parseInt(i,10)}}},Ye={manifestItems:`readingOrder`,spineRows:`readingOrder`,spineTocIdref:`toc`,identifiers:`identifiers`,title:`title`,creators:`contributors`,contributors:`contributors`,publisher:`publisher`,description:`description`,rights:`rights`,languages:`languages`,subjects:`subjects`,date:`published`,coverHref:`cover`,renditionLayoutMeta:`renditionLayout`,renditionFlowMeta:`renditionFlow`,renditionSpreadMeta:`renditionSpread`,pageProgressionDirection:`readingDirection`,guide:`guide`,metas:`properties`},Xe=e=>{for(let t of e)if(t.scheme!==void 0&&t.scheme.trim().toLowerCase()===`isbn`&&j(t.value)!==void 0)return t.value;for(let t of e)if(j(t.value)!==void 0)return t.value},Ze={art:`artist`,aut:`author`,clr:`colorist`,ctb:`contributor`,edt:`editor`,ill:`illustrator`,nrt:`narrator`,trl:`translator`},Qe=e=>e.contributors.map(e=>{let t=e.roles.map(e=>Ze[e.trim().toLowerCase()]??e);return p({name:e.name,roles:t.length>0?t:[e.source===`creator`?`author`:`contributor`],sortAs:e.fileAs})}),$e=(e,t)=>e.refines!==void 0&&e.refines.replace(/^#/,``)===t,et=e=>{let t=e?.trim();if(t===void 0||!/^\d+(\.\d+)?$/.test(t))return;let n=Number.parseFloat(t);return Number.isFinite(n)?n:void 0},tt=e=>{let t=[],n=[];for(let r of e){if(r.property!==`belongs-to-collection`||r.value===void 0)continue;let i=r.id,a=t=>i===void 0?void 0:e.find(e=>$e(e,i)&&e.property===t&&e.value!==void 0)?.value,o=a(`collection-type`)?.trim().toLowerCase(),s=p({name:r.value,position:et(a(`group-position`))});o===`series`?t.push(s):n.push(s)}if(t.length===0){let n=e.find(e=>e.name?.toLowerCase()===`calibre:series`&&e.content!==void 0)?.content;n!==void 0&&t.push(p({name:n,position:et(e.find(e=>e.name?.toLowerCase()===`calibre:series_index`)?.content)}))}return{series:t,collection:n}},nt=e=>{let t=e?.trim();if(t===`scrolled-continuous`||t===`scrolled-doc`||t===`paginated`||t===`auto`)return t},rt=e=>{let t=e?.trim();if(t===`none`||t===`landscape`||t===`portrait`||t===`both`||t===`auto`)return t},it=e=>{let t=e.pageProgressionDirection?.trim().toLowerCase(),n=t===`ltr`||t===`rtl`?t:void 0,r=e.renditionLayoutMeta?.trim().toLowerCase(),i=r===`reflowable`||r===`pre-paginated`?r:void 0,a=Xe(e.identifiers),o=Qe(e),{series:s,collection:c}=tt(e.metas),l=s.length>0||c.length>0?p({series:s.length>0?s:void 0,collection:c.length>0?c:void 0}):void 0;return p({title:e.title,description:e.description,publisher:e.publisher,rights:e.rights,languages:e.languages.length>0?[...e.languages]:void 0,subjects:e.subjects.length>0?[...e.subjects]:void 0,contributors:o.length>0?o:void 0,published:Je(e.date),readingDirection:n,renditionLayout:i,renditionFlow:nt(e.renditionFlowMeta),renditionSpread:rt(e.renditionSpreadMeta),gtin:A(a),isbn:j(a),identifiers:e.identifiers.length>0?e.identifiers.map(({value:e,scheme:t})=>p({value:e,scheme:t})):void 0,belongsTo:l,properties:e.metas.length>0?[...e.metas]:void 0})},at=e=>e.kind===`comicInfo`?L(e):e.kind===`kobo`?He(e):e.kind===`apple`?h(e):it(e),ot=e=>{let t=e.opf===void 0?void 0:it(e.opf),n=e.comicInfo===void 0?void 0:L(e.comicInfo),r=e.apple===void 0?void 0:h(e.apple),i=e.kobo===void 0?void 0:He(e.kobo),a=[...t?.identifiers??[],...n?.identifiers??[]];return p({title:t?.title??n?.title,description:t?.description??n?.description,publisher:t?.publisher??n?.publisher,imprint:n?.imprint,rights:t?.rights,languages:t?.languages??n?.languages,subjects:t?.subjects??n?.subjects,contributors:t?.contributors??n?.contributors,published:t?.published??n?.published,readingDirection:n?.readingDirection??t?.readingDirection,renditionLayout:t?.renditionLayout??r?.renditionLayout??i?.renditionLayout,renditionFlow:t?.renditionFlow,renditionSpread:t?.renditionSpread,numberOfPages:n?.numberOfPages,gtin:t?.gtin??n?.gtin,isbn:t?.isbn??n?.isbn,identifiers:a.length>0?a:void 0,belongsTo:t?.belongsTo??n?.belongsTo,properties:t?.properties,comic:n?.comic,apple:r?.apple,kobo:i?.kobo})},st=e=>{let t=[...e.records].sort((e,t)=>(0,r.sortByTitleComparator)(e.uri,t.uri)),n=(e,t,r,i,a)=>{let o=e.find(e=>e.title===t),[s,...c]=r;return o?s?[...e.filter(e=>e!==o),{...o,contents:n(o.contents,s,c,i,a)}]:o.path.split(`/`).length>a.split(`/`).length?[...e.filter(e=>e!==o),{...o,path:a,containerHref:i}]:e:s?[...e,{contents:n([],s,c,i,a),containerHref:i,path:a,title:t}]:[...e,{contents:[],containerHref:i,path:a,title:t}]};return t.reduce((e,t)=>{if(t.dir)return e;let[r,...i]=t.uri.split(`/`).slice(0,-1);if(!r)return e;let a=encodeURI(t.uri).replace(/#/g,`%23`).replace(/\?/g,`%3F`).replace(/\/$/,``),o=t.uri.replace(/\/$/,``);return n(e,r,i,a,o)},[])},ct=e=>e?e.children.map(e=>e instanceof n.XmlTextNode?e.text:e instanceof n.XmlElement?ct(e):``).join(``).trim():``,lt=e=>z(e.properties).includes(`nav`),ut=(e,{basePath:t})=>{let n={contents:[],path:``,containerHref:``,title:``},i=e.childNamed(`span`)||e.childNamed(`a`);n.title=(i?.attr.title||i?.val.trim()||ct(i))??``;let a=i?.name;a!==`a`&&(i=e.descendantWithPath(`${a}.a`),i&&(a=i.name.toLowerCase())),a===`a`&&i?.attr.href&&(n.path=(0,r.urlJoin)(t,i.attr.href),n.containerHref=n.path);let o=e.childNamed(`ol`);if(o){let e=o.childrenNamed(`li`);e&&e.length>0&&(n.contents=e.map(e=>ut(e,{basePath:t})))}return n},dt=(e,{basePath:t})=>{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 instanceof n.XmlElement&&e.name===`li`).forEach(e=>{r.push(ut(e,{basePath:t}))}),r},ft=async(e,t)=>{let i=e.manifestItems.find(lt);if(i?.href){let e=t.records.find(e=>e.uri.endsWith(i.href));if(e&&!e.dir)return dt(new n.XmlDocument(await s(e)),{basePath:(0,r.getUriBasePath)(e.uri)})}},pt=(e,{basePath:t,prefix:n})=>{let i=(0,r.urlJoin)(t,e?.childNamed(`${n}content`)?.attr.src||``),a={title:e?.descendantWithPath(`${n}navLabel.${n}text`)?.val||``,path:i,containerHref:i,contents:[]},o=e.childrenNamed(`${n}navPoint`);return o&&o.length>0&&(a.contents=o.map(e=>pt(e,{basePath:t,prefix:n}))),a},mt=(e,{basePath:t})=>{let n=[],r=e.name,i=``;return r.indexOf(`:`)!==-1&&(i=`${r.split(`:`)[0]}:`),e.childNamed(`${i}navMap`)?.childrenNamed(`${i}navPoint`).forEach(e=>{n.push(pt(e,{basePath:t,prefix:i}))}),n},ht=async({opf:e,opfBasePath:t,archive:i})=>{let a=e.spineTocIdref;if(a){let o=e.manifestItems.find(e=>e.id===a);if(o){let e=`${t}${t===``?``:`/`}${o.href}`,a=i.records.find(t=>t.uri.endsWith(e));if(a&&!a.dir)return mt(new n.XmlDocument(await s(a)),{basePath:(0,r.getUriBasePath)(a.uri)})}}},gt=async(e,{opf:t}={})=>{let n=t??await X(e);if(n)return await ft(n.opf,e)||await ht({opf:n.opf,opfBasePath:n.basePath,archive:e})||[];let r=st(e);return r.length===0?void 0:r},_t=[`metadata`,`readingOrder`,`toc`],$=async(t,n)=>{try{return{value:await t(),failed:!1}}catch(t){return e.r.error(`resolveArchive: unable to read ${n}`,t),{value:void 0,failed:!0}}},vt=e=>{let t=e=>e?.startsWith(`audio/`)===!0||e?.startsWith(`video/`)===!0,n=e.filter(e=>e.renditionLayout===`pre-paginated`&&!t(e.mediaType)).length;return n>0?n:void 0},yt=({archive:e,opf:t,comicInfo:n,apple:r,kobo:i})=>{let a=[];return t!==void 0&&t.value===void 0&&(t.failed||qe(e))&&a.push(`opf`),n?.failed&&a.push(`comicInfo`),r?.failed&&a.push(`apple`),i?.failed&&a.push(`kobo`),a},bt=1,xt=async(e,t={})=>{let n=new Set(t.include??_t),r=n.has(`metadata`),i=n.has(`sources`),a=n.has(`readingOrder`),o=n.has(`toc`),s=t.layoutScan===!0&&(r||a),c=r||i||a||o?await $(()=>X(e),`opf`):void 0,l=c?.value,u=r||i||s,d=u?await $(()=>ne(e),`comicInfo`):void 0,m=d?.value,h=u?await $(()=>f(e),`apple`):void 0,g=h?.value,_=u?await $(()=>Be(e),`kobo`):void 0,v=_?.value,y=r||s?ot({opf:l?.opf,comicInfo:m,apple:g,kobo:v}):void 0,b=a||s?await Q(e,{opf:l}):void 0;if(s&&y!==void 0&&b!==void 0&&y.renditionLayout===`reflowable`&&b.every(e=>e.renditionLayout===`reflowable`)&&await We(e,b)&&(y={...y,renditionLayout:`pre-paginated`},b=b.map(e=>({...e,renditionLayout:`pre-paginated`}))),r&&y!==void 0){let t=b??await Q(e,{opf:l}),n=await ze(e,{opf:l,readingOrder:t}),r=y.numberOfPages??vt(t);y=p({...y,cover:n,numberOfPages:r})}let x=o?(await $(()=>gt(e,{opf:l}),`toc`)).value:void 0,S={version:bt,unreadableSources:yt({archive:e,opf:c,comicInfo:d,apple:h,kobo:_})};return r&&y!==void 0&&(S.metadata=y),a&&b!==void 0&&(S.readingOrder=b),o&&x!==void 0&&(S.toc=x),i&&(S.sources=p({opf:l,comicInfo:m,apple:g,kobo:v})),S};exports.APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME=i,exports.COMIC_INFO_FILENAME=S,exports.COMIC_INFO_KNOWN_FIELDS=C,exports.COMIC_INFO_MANGA_VALUES=k,exports.KOBO_DISPLAY_OPTIONS_FILENAME=Z,exports.appleMetadataHomes=m,exports.arrayBufferFileAccessors=t.t,exports.blobFileAccessors=t.n,exports.comicInfoMetadataHomes=ae,exports.createArchive=e.n,exports.createArchiveFromArrayBufferList=g,exports.createArchiveFromEntries=e.t,exports.createArchiveFromText=_,exports.createArchiveFromUrls=v,exports.getArchiveFileRecordByUri=u,exports.getArchiveHasComicInfo=O,exports.getArchiveImageRecords=x,exports.getArchiveOpfInfo=R,exports.getSpineItemFilesFromArchive=Ge,exports.isArchiveEpub=qe,exports.isComicInfoManga=te,exports.isDirectoryRecord=l,exports.isFileRecord=c,exports.isImageRecord=b,exports.koboMetadataHomes=Ve,exports.normalizeGtin=A,exports.normalizeIsbn=j,exports.opfMetadataHomes=Ye,exports.parseAppleDisplayOptionsXml=o,exports.parseComicInfo=D,exports.parseKoboXml=ke,exports.parseOpf=Y,exports.parseW3cDtfDate=Je,exports.readArchiveApple=f,exports.readArchiveComicInfo=ne,exports.readArchiveKobo=Be,exports.readArchiveOpf=X,exports.readRecordAsText=s,exports.readingOrderDocumentsAllHaveViewport=We,exports.resolveArchive=xt,exports.resolveArchiveCover=ze,exports.resolveArchiveMetadata=at,exports.resolveArchiveReadingOrder=Q,exports.resolveArchiveToc=gt,exports.resolveMetadata=ot,exports.tokenizeXmlSpaceSeparatedList=z;
31
+ `,c=n.map(e=>({dir:!1,basename:(0,r.getUriBasename)(e),encodingFormat:(0,r.detectMimeTypeFromName)(e),uri:e,size:0,...t.n(async()=>(await fetch(e)).blob())}));return e.n({records:[{dir:!1,basename:`content.opf`,uri:`content.opf`,size:0,...t.n(async()=>new Blob([s]))},...c],close:()=>Promise.resolve()})},y=e=>(0,r.parseContentType)(e.encodingFormat??``)||(0,r.detectMimeTypeFromName)(e.basename),b=e=>c(e)&&y(e)?.startsWith(`image/`)===!0,x=e=>e.records.filter(c).filter(b),S=`ComicInfo.xml`,C=`AgeRating.AlternateCount.AlternateNumber.AlternateSeries.BlackAndWhite.Characters.Colorist.CommunityRating.Count.CoverArtist.Day.Editor.Format.Genre.GTIN.Imprint.Inker.LanguageISO.Letterer.Locations.MainCharacterOrTeam.Manga.Month.Notes.Number.PageCount.Penciller.Publisher.Review.ScanInformation.Series.SeriesGroup.StoryArc.StoryArcNumber.Summary.Tags.Teams.Title.Translator.Volume.Web.Writer.Year`.split(`.`),w=new Set([`Pages`,`ComicInfo`]),T=e=>e.children.some(e=>e.type===`element`),E=e=>{let t=e.val.trim();return t.length>0?t:void 0},D=e=>{let t;try{t=new n.XmlDocument(e)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`${S} is malformed: ${t}`,{cause:e})}let r={};return t.eachChild(e=>{if(e.type!==`element`||w.has(e.name)||T(e))return;let t=E(e);t!==void 0&&r[e.name]===void 0&&(r[e.name]=t)}),{kind:`comicInfo`,...r}},O=S.toLowerCase(),k=e=>e.records.find(e=>c(e)&&e.basename.toLowerCase()===O),ee=[`Unknown`,`No`,`Yes`,`YesAndRightToLeft`],te=e=>{for(let t of ee)if(t===e)return!0;return!1};async function A(e){let t=k(e);if(t)return D(await s(t))}var ne=new Set([8,12,13,14]),j=e=>{if(e==null)return;let t=String(e).replace(/\D/g,``);if(!(t.length===0||!ne.has(t.length)))return t},re=/(?:97[89])?\d{9}[\dXx]/,M=e=>{if(e==null)return;let t=String(e).trim().replace(/^urn:isbn:/i,``).replace(/^isbn[:\s-]*/i,``),n=t.replace(/[^0-9Xx]/g,``);if(n.length===10||n.length===13)return n.toUpperCase();let r=t.match(re);if(r)return r[0].toUpperCase()},ie={AgeRating:`comic.ageRating`,AlternateCount:`comic.alternateSeries`,AlternateNumber:`comic.alternateSeries`,AlternateSeries:`comic.alternateSeries`,BlackAndWhite:`comic.blackAndWhite`,Characters:`comic.characters`,Colorist:`contributors`,CommunityRating:`comic.communityRating`,Count:`belongsTo.series`,CoverArtist:`contributors`,Day:`published`,Editor:`contributors`,Format:`comic.format`,Genre:`subjects`,GTIN:`identifiers`,Imprint:`imprint`,Inker:`contributors`,LanguageISO:`languages`,Letterer:`contributors`,Locations:`comic.locations`,MainCharacterOrTeam:`comic.mainCharacterOrTeam`,Manga:`readingDirection`,Month:`published`,Notes:`comic.notes`,Number:`belongsTo.series`,PageCount:`numberOfPages`,Penciller:`contributors`,Publisher:`publisher`,Review:`comic.review`,ScanInformation:`comic.scanInformation`,Series:`belongsTo.series`,SeriesGroup:`belongsTo.collection`,StoryArc:`comic.storyArcs`,StoryArcNumber:`comic.storyArcs`,Summary:`description`,Tags:`subjects`,Teams:`comic.teams`,Title:`title`,Translator:`contributors`,Volume:`comic.volume`,Web:`comic.web`,Writer:`contributors`,Year:`published`},ae=e=>{switch(e.Manga){case`YesAndRightToLeft`:return`rtl`;case`Yes`:case`No`:return`ltr`;default:return}},N=e=>{if(e===void 0)return;let t=e.trim();return t.length>0?t:void 0},P=e=>e===void 0?[]:e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0),F=e=>{let t=N(e);if(t===void 0||!/^\d+$/.test(t))return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0},I=e=>{let t=N(e);if(t===void 0||!/^\d+(\.\d+)?$/.test(t))return;let n=Number.parseFloat(t);return Number.isFinite(n)?n:void 0},oe=e=>{let t=N(e)?.toLowerCase();if(t===`yes`)return!0;if(t===`no`)return!1},se=e=>{switch(e.Manga){case`Yes`:case`YesAndRightToLeft`:return!0;case`No`:return!1;default:return}},ce=e=>{let t=F(e.Year),n=F(e.Month),r=F(e.Day);if(!(t===void 0&&n===void 0&&r===void 0))return{...t===void 0?{}:{year:t},...n===void 0?{}:{month:n},...r===void 0?{}:{day:r}}},le=[[`Writer`,`author`],[`Penciller`,`penciler`],[`Inker`,`inker`],[`Colorist`,`colorist`],[`Letterer`,`letterer`],[`CoverArtist`,`coverArtist`],[`Editor`,`editor`],[`Translator`,`translator`]],ue=e=>{let t=new Map;for(let[n,r]of le)for(let i of P(e[n])){let e=t.get(i);e?e.roles.includes(r)||e.roles.push(r):t.set(i,{name:i,roles:[r]})}return[...t.values()]},de=e=>{let t=N(e.Series);if(t!==void 0)return p({name:t,position:I(e.Number),total:F(e.Count)})},fe=e=>{let t=N(e.AlternateSeries);if(t!==void 0)return p({name:t,position:I(e.AlternateNumber),total:F(e.AlternateCount)})},pe=e=>{let t=P(e.StoryArc);if(t.length===0)return[];let n=P(e.StoryArcNumber);return t.map((e,t)=>p({name:e,position:I(n[t])}))},L=e=>e.length>0?e:void 0,me=e=>{let t=L((e.Web??``).split(/\s+/).filter(e=>e.length>0)),n=p({manga:se(e),blackAndWhite:oe(e.BlackAndWhite),volume:F(e.Volume),format:N(e.Format),ageRating:N(e.AgeRating),communityRating:I(e.CommunityRating),notes:N(e.Notes),review:N(e.Review),web:t,scanInformation:N(e.ScanInformation),mainCharacterOrTeam:N(e.MainCharacterOrTeam),characters:L(P(e.Characters)),teams:L(P(e.Teams)),locations:L(P(e.Locations)),storyArcs:L(pe(e)),alternateSeries:fe(e)});return Object.keys(n).length>0?n:void 0},he=e=>{let t=de(e),n=L(P(e.SeriesGroup).map(e=>({name:e})));if(!(t===void 0&&n===void 0))return p({series:t===void 0?void 0:[t],collection:n})},R=e=>{let t=e.GTIN,n=N(t),r=N(e.LanguageISO),i=[...P(e.Genre),...P(e.Tags)];return p({title:N(e.Title),description:N(e.Summary),publisher:N(e.Publisher),imprint:N(e.Imprint),languages:r===void 0?void 0:[r],subjects:L(i),contributors:L(ue(e)),published:ce(e),readingDirection:ae(e),numberOfPages:F(e.PageCount),gtin:j(t),isbn:M(t),identifiers:n===void 0?void 0:[{value:n,scheme:`GTIN`}],belongsTo:he(e),comic:me(e)})},z=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(`/`))||``}},B=e=>e===void 0||e.trim().length===0?[]:e.trim().split(/\s+/).filter(e=>e.length>0),ge=e=>{let t=B(e);if(t.length===0)return{};let n;t.includes(`rendition:layout-reflowable`)&&(n=`reflowable`),t.includes(`rendition:layout-pre-paginated`)&&(n=`pre-paginated`);let r;return t.includes(`rendition:flow-auto`)&&(r=`auto`),t.includes(`rendition:flow-paginated`)&&(r=`paginated`),t.includes(`rendition:flow-scrolled-doc`)&&(r=`scrolled-doc`),t.includes(`rendition:flow-scrolled-continuous`)&&(r=`scrolled-continuous`),{...n===void 0?{}:{renditionLayout:n},...r===void 0?{}:{renditionFlow:r},...t.includes(`page-spread-left`)?{pageSpreadLeft:!0}:{},...t.includes(`page-spread-right`)?{pageSpreadRight:!0}:{}}},V=e=>e.includes(`:`)?e.slice(e.lastIndexOf(`:`)+1):e,H=(e,t)=>V(e).toLowerCase()===t.toLowerCase(),U=e=>e.type===`element`,W=(e,t)=>{for(let n of e.children)if(U(n)&&H(n.name,t))return n},G=(e,t)=>{let n=[];for(let r of e.children)U(r)&&H(r.name,t)&&n.push(r);return n},_e=(e,t)=>{let n=[];return e.eachChild(e=>{if(V(e.name).toLowerCase()!==`identifier`)return;let r=e.val.trim();if(r.length===0)return;let i=(e.attr[`opf:scheme`]??e.attr[`opf:Scheme`]??e.attr.scheme)?.trim(),a=e.attr.id?.trim(),o=a!==void 0&&a.length>0?a:void 0;n.push({value:r,...i!==void 0&&i.length>0?{scheme:i}:{},...o===void 0?{}:{id:o},...o!==void 0&&o===t?{unique:!0}:{}})}),n},K=(e,t)=>{let n;return e.eachChild(e=>{if(n!==void 0||V(e.name).toLowerCase()!==t.toLowerCase())return;let r=e.val.trim();r.length>0&&(n=r)}),n},q=(e,t)=>{let n=[];return e.eachChild(e=>{if(V(e.name).toLowerCase()!==t.toLowerCase())return;let r=e.val.trim();r.length>0&&n.push(r)}),n},ve=e=>{let t;return e.eachChild(e=>{if(t!==void 0||V(e.name).toLowerCase()!==`meta`||e.attr.name?.toLowerCase()!==`cover`)return;let n=e.attr.content?.trim();n!==void 0&&n.length>0&&(t=n)}),t},ye=({manifestItems:e,metadataEl:t})=>{let n=e=>e.mediaType?.toLowerCase().includes(`image/`)===!0,r=e.find(e=>n(e)?B(e.properties).includes(`cover-image`):!1);if(r!==void 0)return r.href;if(t!==void 0){let r=ve(t);if(r!==void 0){let t=e.find(e=>e.id===r&&n(e));if(t!==void 0)return t.href}}return e.find(e=>e.id.toLowerCase().includes(`cover`)&&n(e))?.href},J=(e,t)=>{let n=e.attr[t]?.trim();return n!==void 0&&n.length>0?n:void 0},be=e=>{let t=[];return e.eachChild(e=>{if(V(e.name).toLowerCase()!==`meta`)return;let n=J(e,`property`),r=J(e,`refines`),i=J(e,`scheme`),a=J(e,`id`),o=J(e,`name`),s=J(e,`content`),c=e.val.trim(),l=c.length>0?c:void 0,u={...n===void 0?{}:{property:n},...r===void 0?{}:{refines:r},...i===void 0?{}:{scheme:i},...a===void 0?{}:{id:a},...o===void 0?{}:{name:o},...s===void 0?{}:{content:s},...l===void 0?{}:{value:l}};Object.keys(u).length!==0&&t.push(u)}),t},xe=(e,t)=>e.replace(/^#/,``)===t,Se=(e,t)=>{let n=[];return e.eachChild(e=>{let r=V(e.name).toLowerCase();if(r!==`creator`&&r!==`contributor`)return;let i=e.val.trim();if(i.length===0)return;let a=J(e,`id`),o=e=>a===void 0?[]:t.flatMap(t=>t.refines!==void 0&&xe(t.refines,a)&&t.property===e&&t.value!==void 0?[t.value]:[]),s=J(e,`opf:role`)??J(e,`role`),c=[...s===void 0?[]:[s],...o(`role`)],l=J(e,`opf:file-as`)??J(e,`file-as`)??o(`file-as`)[0];n.push({name:i,source:r,...a===void 0?{}:{id:a},roles:c,...l===void 0?{}:{fileAs:l}})}),n},Y=(e,t)=>{let n=G(e,`meta`).find(e=>e.attr.property===t)?.val;if(!(n===void 0||n.trim().length===0))return n},Ce=e=>{let t=W(e,`guide`);if(t===void 0)return[];let n=[];for(let e of G(t,`reference`)){let t=e.attr.href?.trim();t===void 0||t.length===0||n.push({href:t,title:e.attr.title?.trim()??``,type:e.attr.type?.trim()??``})}return n},we=e=>{let t=e.attr.id,n=e.attr.href;if(t===void 0||t.length===0||n===void 0||n.length===0)return;let r=e.attr[`media-type`],i=e.attr.properties?.trim();return{id:t,href:n,...r!==void 0&&r.length>0?{mediaType:r}:{},...i!==void 0&&i.length>0?{properties:i}:{}}},Te=e=>{let t=[],n=new Map;for(let r of G(e,`item`)){let e=we(r);e!==void 0&&(t.push(e),n.set(e.id,e))}return{items:t,byId:n}},Ee=(e,t)=>{let n=[];for(let r of G(t,`itemref`)){let t=r.attr.idref;if(t===void 0||t.trim().length===0)continue;let i=e.get(t);if(i===void 0)continue;let a=ge(r.attr.properties);n.push({idref:t,id:i.id,href:i.href,...i.mediaType===void 0?{}:{mediaType:i.mediaType},...i.properties===void 0?{}:{properties:i.properties},...a.renditionLayout===void 0?{}:{renditionLayout:a.renditionLayout},...a.renditionFlow===void 0?{}:{renditionFlow:a.renditionFlow},...a.pageSpreadLeft===void 0?{}:{pageSpreadLeft:a.pageSpreadLeft},...a.pageSpreadRight===void 0?{}:{pageSpreadRight:a.pageSpreadRight}})}return n},X=e=>{let t=new n.XmlDocument(e),r=W(t,`manifest`),i=W(t,`spine`),a=W(t,`metadata`),o=t.attr[`unique-identifier`]?.trim(),s=o!==void 0&&o.length>0?o:void 0,c=[],l=[];if(r!==void 0){let{items:e,byId:t}=Te(r);c=e,i!==void 0&&(l=Ee(t,i))}let u=i?.attr[`page-progression-direction`],d=u!==void 0&&u.trim().length>0?u:void 0,f=i?.attr.toc,p=f!==void 0&&f.trim().length>0?f.trim():void 0,m,h,g,_,v,y=[],b=[],x=[],S=[],C,w,T,E=[],D=[];a!==void 0&&(m=K(a,`title`),h=K(a,`publisher`),g=K(a,`description`),_=K(a,`rights`),v=K(a,`date`),y=q(a,`creator`),x=q(a,`language`),S=q(a,`subject`),C=Y(a,`rendition:layout`),w=Y(a,`rendition:flow`),T=Y(a,`rendition:spread`),E=be(a),b=Se(a,E),D.push(..._e(a,s)));let O=ye({manifestItems:c,metadataEl:a}),k=Ce(t);return{kind:`opf`,manifestItems:c,spineRows:l,spineTocIdref:p,identifiers:D,title:m,creators:y,contributors:b,publisher:h,description:g,rights:_,languages:x,subjects:S,date:v,coverHref:O,renditionLayoutMeta:C,renditionFlowMeta:w,renditionSpreadMeta:T,pageProgressionDirection:d,guide:k,metas:E}};async function Z(e){let{data:t,basePath:n}=z(e)||{};if(!(!t||t.dir))return{opf:X(await s(t)),basePath:n}}var De=`com.kobobooks.display-options.xml`,Oe=e=>{let t=e.childNamed(`platform`);if(!t)return{};for(let e of t.childrenNamed(`option`))if(e.attr?.name===`fixed-layout`)return e.val.trim().toLowerCase()===`true`?{renditionLayout:`pre-paginated`}:{};return{}},ke=e=>{let t=new n.XmlDocument(e);return t.name?.toLowerCase()===`display_options`?{kind:`kobo`,...Oe(t)}:{kind:`kobo`}},Ae=e=>{let t=[];for(let n of e.split(`/`))if(n!==`.`){if(n===`..`){t.pop();continue}t.push(n)}return t.join(`/`)},je=(e,t)=>/^https?:\/\//.test(e)?e:Ae(t?`${t}/${e}`:e),Me=e=>{let t=e?.trim().toLowerCase();return t===`reflowable`||t===`pre-paginated`?t:void 0},Ne=(e,{opf:t,basePath:n})=>{let r=Me(t.renditionLayoutMeta),i=t.spineRows.map(t=>{let r=je(t.href,n);return{row:t,uri:r,record:u(e,r)}}),a=i.reduce((e,{record:t})=>e+(t?.size??0),0);return i.map(({row:e,uri:n,record:i})=>p({uri:n,id:e.id,mediaType:e.mediaType??i?.encodingFormat,size:i?.size,renditionLayout:e.renditionLayout??r,renditionFlow:e.renditionFlow,pageSpreadLeft:e.pageSpreadLeft,pageSpreadRight:e.pageSpreadRight,progressionWeight:a>0?(i?.size??0)/a:1/t.spineRows.length}))},Pe=S.toLowerCase(),Fe=i.toLowerCase(),Ie=e=>{let t=e.basename.toLowerCase();return t===Pe||t===Fe||e.uri.endsWith(`com.kobobooks.display-options.xml`)||t.endsWith(`.db`)},Le=e=>{let t=e.records.filter(c).filter(e=>!Ie(e));return t.map(e=>{let n=(0,r.parseContentType)(e.encodingFormat??``)||(0,r.detectMimeTypeFromName)(e.basename);return p({uri:e.uri,mediaType:n,size:e.size,renditionLayout:n!==void 0&&(0,r.isMediaContentMimeType)(n)?`pre-paginated`:void 0,progressionWeight:1/t.length})})},Q=async(e,{opf:t}={})=>{let n=t??await Z(e).catch(()=>void 0);return n?Ne(e,n):Le(e)},Re=(e,t)=>{let n=u(e,t);if(n!==void 0)return(0,r.parseContentType)(n.encodingFormat??``)||(0,r.detectMimeTypeFromName)(n.basename)},ze=async(e,{opf:t,readingOrder:n}={})=>{let r=t??await Z(e).catch(()=>void 0);if(r!==void 0&&r.opf.coverHref!==void 0){let t=je(r.opf.coverHref,r.basePath);return p({uri:t,mediaType:Re(e,t),confidence:`derived`})}let i=(n??await Q(e,{opf:r})).find(e=>e.mediaType?.startsWith(`image/`)===!0);if(i!==void 0)return p({uri:i.uri,mediaType:i.mediaType,confidence:`assumed`})};async function Be(t){let n=t.records.filter(e=>c(e)&&e.uri.endsWith(`com.kobobooks.display-options.xml`));if(n.length===0)return;let r;for(let t of n){let n=await s(t);try{let{renditionLayout:e}=ke(n);e&&(r=e)}catch(n){e.r.error(`Unable to parse ${De} (${t.uri})`,n)}}return{kind:`kobo`,...r===void 0?{}:{renditionLayout:r}}}var Ve={renditionLayout:`renditionLayout`},He=e=>p({renditionLayout:e.renditionLayout,kobo:e.renditionLayout===void 0?void 0:{fixedLayout:e.renditionLayout===`pre-paginated`}}),Ue=e=>{let t=e.descendantWithPath(`head`)?.childrenNamed(`meta`).find(e=>e.attr.name===`viewport`);return!!(t&&t.attr.name===`viewport`)},We=async(t,i)=>{if(i.length===0)return!1;for(let a of i){if(!(0,r.isXmlBasedMimeType)({mimeType:a.mediaType,uri:a.uri}))return!1;let i=u(t,a.uri);if(!i||!c(i))return!1;try{let e=await s(i);if(!Ue(new n.XmlDocument(e)))return!1}catch(t){return e.r.error(`layout scan: unable to inspect ${a.uri}`,t),!1}}return!0},Ge=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))},Ke=e=>e.toLowerCase().endsWith(`.opf`),qe=e=>e.records.some(e=>!e.dir&&(Ke(e.basename)||Ke(e.uri))),Je=e=>{if(e===void 0)return;let t=e.trim().match(/^(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?/);if(t===null)return;let[,n,r,i]=t;return{...n===void 0?{}:{year:Number.parseInt(n,10)},...r===void 0?{}:{month:Number.parseInt(r,10)},...i===void 0?{}:{day:Number.parseInt(i,10)}}},Ye={manifestItems:`readingOrder`,spineRows:`readingOrder`,spineTocIdref:`toc`,identifiers:`identifiers`,title:`title`,creators:`contributors`,contributors:`contributors`,publisher:`publisher`,description:`description`,rights:`rights`,languages:`languages`,subjects:`subjects`,date:`published`,coverHref:`cover`,renditionLayoutMeta:`renditionLayout`,renditionFlowMeta:`renditionFlow`,renditionSpreadMeta:`renditionSpread`,pageProgressionDirection:`readingDirection`,guide:`guide`,metas:`properties`},Xe=e=>{for(let t of e)if(t.scheme!==void 0&&t.scheme.trim().toLowerCase()===`isbn`&&M(t.value)!==void 0)return t.value;for(let t of e)if(M(t.value)!==void 0)return t.value},Ze=e=>{let t=e.trim();if(/^https?:\/\//i.test(t))try{let e=new URL(t);return(e.protocol===`http:`||e.protocol===`https:`)&&e.hostname.length>0?`URL`:void 0}catch{return}},Qe={art:`artist`,aut:`author`,clr:`colorist`,ctb:`contributor`,edt:`editor`,ill:`illustrator`,nrt:`narrator`,trl:`translator`},$e=e=>e.contributors.map(e=>{let t=e.roles.map(e=>Qe[e.trim().toLowerCase()]??e);return p({name:e.name,roles:t.length>0?t:[e.source===`creator`?`author`:`contributor`],sortAs:e.fileAs})}),et=(e,t)=>e.refines!==void 0&&e.refines.replace(/^#/,``)===t,tt={"02":`ISBN`,"03":`GTIN`,"04":`UPC`,"05":`ISMN`,"06":`DOI`,13:`LCCN`,14:`GTIN`,15:`ISBN`,22:`URN`,23:`OCLC`,24:`ISBN`,25:`ISMN`,26:`DOI`,34:`GTIN`,35:`ARK`},nt=e=>{let t=e?.value?.trim();if(!(t===void 0||t.length===0))return e?.scheme?.trim().toLowerCase()===`onix:codelist5`?tt[t]??t:t},rt=(e,t)=>{let n=e.id;if(n!==void 0)return nt(t.find(e=>e.property===`identifier-type`&&et(e,n)&&e.value!==void 0))},it=e=>{let t=e?.trim();if(t===void 0||!/^\d+(\.\d+)?$/.test(t))return;let n=Number.parseFloat(t);return Number.isFinite(n)?n:void 0},at=e=>{let t=[],n=[];for(let r of e){if(r.property!==`belongs-to-collection`||r.value===void 0)continue;let i=r.id,a=t=>i===void 0?void 0:e.find(e=>et(e,i)&&e.property===t&&e.value!==void 0)?.value,o=a(`collection-type`)?.trim().toLowerCase(),s=p({name:r.value,position:it(a(`group-position`))});o===`series`?t.push(s):n.push(s)}if(t.length===0){let n=e.find(e=>e.name?.toLowerCase()===`calibre:series`&&e.content!==void 0)?.content;n!==void 0&&t.push(p({name:n,position:it(e.find(e=>e.name?.toLowerCase()===`calibre:series_index`)?.content)}))}return{series:t,collection:n}},ot=e=>{let t=e?.trim();if(t===`scrolled-continuous`||t===`scrolled-doc`||t===`paginated`||t===`auto`)return t},st=e=>{let t=e?.trim();if(t===`none`||t===`landscape`||t===`portrait`||t===`both`||t===`auto`)return t},ct=e=>{let t=e.pageProgressionDirection?.trim().toLowerCase(),n=t===`ltr`||t===`rtl`?t:void 0,r=e.renditionLayoutMeta?.trim().toLowerCase(),i=r===`reflowable`||r===`pre-paginated`?r:void 0,a=Xe(e.identifiers),o=$e(e),{series:s,collection:c}=at(e.metas),l=s.length>0||c.length>0?p({series:s.length>0?s:void 0,collection:c.length>0?c:void 0}):void 0;return p({title:e.title,description:e.description,publisher:e.publisher,rights:e.rights,languages:e.languages.length>0?[...e.languages]:void 0,subjects:e.subjects.length>0?[...e.subjects]:void 0,contributors:o.length>0?o:void 0,published:Je(e.date),readingDirection:n,renditionLayout:i,renditionFlow:ot(e.renditionFlowMeta),renditionSpread:st(e.renditionSpreadMeta),gtin:j(a),isbn:M(a),identifiers:e.identifiers.length>0?e.identifiers.map(t=>p({value:t.value,scheme:t.scheme??rt(t,e.metas)??Ze(t.value),unique:t.unique})):void 0,belongsTo:l,properties:e.metas.length>0?[...e.metas]:void 0})},lt=e=>e.kind===`comicInfo`?R(e):e.kind===`kobo`?He(e):e.kind===`apple`?h(e):ct(e),ut=e=>{let t=e.opf===void 0?void 0:ct(e.opf),n=e.comicInfo===void 0?void 0:R(e.comicInfo),r=e.apple===void 0?void 0:h(e.apple),i=e.kobo===void 0?void 0:He(e.kobo),a=[...t?.identifiers??[],...n?.identifiers??[]];return p({title:t?.title??n?.title,description:t?.description??n?.description,publisher:t?.publisher??n?.publisher,imprint:n?.imprint,rights:t?.rights,languages:t?.languages??n?.languages,subjects:t?.subjects??n?.subjects,contributors:t?.contributors??n?.contributors,published:t?.published??n?.published,readingDirection:n?.readingDirection??t?.readingDirection,renditionLayout:t?.renditionLayout??r?.renditionLayout??i?.renditionLayout,renditionFlow:t?.renditionFlow,renditionSpread:t?.renditionSpread,numberOfPages:n?.numberOfPages,gtin:t?.gtin??n?.gtin,isbn:t?.isbn??n?.isbn,identifiers:a.length>0?a:void 0,belongsTo:t?.belongsTo??n?.belongsTo,properties:t?.properties,comic:n?.comic,apple:r?.apple,kobo:i?.kobo})},dt=e=>{let t=[...e.records].sort((e,t)=>(0,r.sortByTitleComparator)(e.uri,t.uri)),n=(e,t,r,i,a)=>{let o=e.find(e=>e.title===t),[s,...c]=r;return o?s?[...e.filter(e=>e!==o),{...o,contents:n(o.contents,s,c,i,a)}]:o.path.split(`/`).length>a.split(`/`).length?[...e.filter(e=>e!==o),{...o,path:a,containerHref:i}]:e:s?[...e,{contents:n([],s,c,i,a),containerHref:i,path:a,title:t}]:[...e,{contents:[],containerHref:i,path:a,title:t}]};return t.reduce((e,t)=>{if(t.dir)return e;let[r,...i]=t.uri.split(`/`).slice(0,-1);if(!r)return e;let a=encodeURI(t.uri).replace(/#/g,`%23`).replace(/\?/g,`%3F`).replace(/\/$/,``),o=t.uri.replace(/\/$/,``);return n(e,r,i,a,o)},[])},ft=e=>e?e.children.map(e=>e instanceof n.XmlTextNode?e.text:e instanceof n.XmlElement?ft(e):``).join(``).trim():``,pt=e=>B(e.properties).includes(`nav`),mt=(e,{basePath:t})=>{let n={contents:[],path:``,containerHref:``,title:``},i=e.childNamed(`span`)||e.childNamed(`a`);n.title=(i?.attr.title||i?.val.trim()||ft(i))??``;let a=i?.name;a!==`a`&&(i=e.descendantWithPath(`${a}.a`),i&&(a=i.name.toLowerCase())),a===`a`&&i?.attr.href&&(n.path=(0,r.urlJoin)(t,i.attr.href),n.containerHref=n.path);let o=e.childNamed(`ol`);if(o){let e=o.childrenNamed(`li`);e&&e.length>0&&(n.contents=e.map(e=>mt(e,{basePath:t})))}return n},ht=(e,{basePath:t})=>{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 instanceof n.XmlElement&&e.name===`li`).forEach(e=>{r.push(mt(e,{basePath:t}))}),r},gt=async(e,t)=>{let i=e.manifestItems.find(pt);if(i?.href){let e=t.records.find(e=>e.uri.endsWith(i.href));if(e&&!e.dir)return ht(new n.XmlDocument(await s(e)),{basePath:(0,r.getUriBasePath)(e.uri)})}},_t=(e,{basePath:t,prefix:n})=>{let i=(0,r.urlJoin)(t,e?.childNamed(`${n}content`)?.attr.src||``),a={title:e?.descendantWithPath(`${n}navLabel.${n}text`)?.val||``,path:i,containerHref:i,contents:[]},o=e.childrenNamed(`${n}navPoint`);return o&&o.length>0&&(a.contents=o.map(e=>_t(e,{basePath:t,prefix:n}))),a},vt=(e,{basePath:t})=>{let n=[],r=e.name,i=``;return r.indexOf(`:`)!==-1&&(i=`${r.split(`:`)[0]}:`),e.childNamed(`${i}navMap`)?.childrenNamed(`${i}navPoint`).forEach(e=>{n.push(_t(e,{basePath:t,prefix:i}))}),n},yt=async({opf:e,opfBasePath:t,archive:i})=>{let a=e.spineTocIdref;if(a){let o=e.manifestItems.find(e=>e.id===a);if(o){let e=`${t}${t===``?``:`/`}${o.href}`,a=i.records.find(t=>t.uri.endsWith(e));if(a&&!a.dir)return vt(new n.XmlDocument(await s(a)),{basePath:(0,r.getUriBasePath)(a.uri)})}}},bt=async(e,{opf:t}={})=>{let n=t??await Z(e);if(n)return await gt(n.opf,e)||await yt({opf:n.opf,opfBasePath:n.basePath,archive:e})||[];let r=dt(e);return r.length===0?void 0:r},xt=[`metadata`,`readingOrder`,`toc`],$=async(t,n)=>{try{return{value:await t(),failed:!1}}catch(t){return e.r.error(`resolveArchive: unable to read ${n}`,t),{value:void 0,failed:!0}}},St=e=>{let t=e=>e?.startsWith(`audio/`)===!0||e?.startsWith(`video/`)===!0,n=e.filter(e=>e.renditionLayout===`pre-paginated`&&!t(e.mediaType)).length;return n>0?n:void 0},Ct=({archive:e,opf:t,comicInfo:n,apple:r,kobo:i})=>{let a=[];return t!==void 0&&t.value===void 0&&(t.failed||qe(e))&&a.push(`opf`),n?.failed&&a.push(`comicInfo`),r?.failed&&a.push(`apple`),i?.failed&&a.push(`kobo`),a},wt=1,Tt=async(e,t={})=>{let n=new Set(t.include??xt),r=n.has(`metadata`),i=n.has(`sources`),a=n.has(`readingOrder`),o=n.has(`toc`),s=t.layoutScan===!0&&(r||a),c=r||i||a||o?await $(()=>Z(e),`opf`):void 0,l=c?.value,u=r||i||s,d=u?await $(()=>A(e),`comicInfo`):void 0,m=d?.value,h=u?await $(()=>f(e),`apple`):void 0,g=h?.value,_=u?await $(()=>Be(e),`kobo`):void 0,v=_?.value,y=r||s?ut({opf:l?.opf,comicInfo:m,apple:g,kobo:v}):void 0,b=a||s?await Q(e,{opf:l}):void 0;if(s&&y!==void 0&&b!==void 0&&y.renditionLayout===`reflowable`&&b.every(e=>e.renditionLayout===`reflowable`)&&await We(e,b)&&(y={...y,renditionLayout:`pre-paginated`},b=b.map(e=>({...e,renditionLayout:`pre-paginated`}))),r&&y!==void 0){let t=b??await Q(e,{opf:l}),n=await ze(e,{opf:l,readingOrder:t}),r=y.numberOfPages??St(t);y=p({...y,cover:n,numberOfPages:r})}let x=o?(await $(()=>bt(e,{opf:l}),`toc`)).value:void 0,S={version:wt,unreadableSources:Ct({archive:e,opf:c,comicInfo:d,apple:h,kobo:_})};return r&&y!==void 0&&(S.metadata=y),a&&b!==void 0&&(S.readingOrder=b),o&&x!==void 0&&(S.toc=x),i&&(S.sources=p({opf:l,comicInfo:m,apple:g,kobo:v})),S};exports.APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME=i,exports.COMIC_INFO_FILENAME=S,exports.COMIC_INFO_KNOWN_FIELDS=C,exports.COMIC_INFO_MANGA_VALUES=ee,exports.KOBO_DISPLAY_OPTIONS_FILENAME=De,exports.appleMetadataHomes=m,exports.arrayBufferFileAccessors=t.t,exports.blobFileAccessors=t.n,exports.comicInfoMetadataHomes=ie,exports.createArchive=e.n,exports.createArchiveFromArrayBufferList=g,exports.createArchiveFromEntries=e.t,exports.createArchiveFromText=_,exports.createArchiveFromUrls=v,exports.getArchiveFileRecordByUri=u,exports.getArchiveHasComicInfo=k,exports.getArchiveImageRecords=x,exports.getArchiveOpfInfo=z,exports.getSpineItemFilesFromArchive=Ge,exports.isArchiveEpub=qe,exports.isComicInfoManga=te,exports.isDirectoryRecord=l,exports.isFileRecord=c,exports.isImageRecord=b,exports.koboMetadataHomes=Ve,exports.normalizeGtin=j,exports.normalizeIsbn=M,exports.opfMetadataHomes=Ye,exports.parseAppleDisplayOptionsXml=o,exports.parseComicInfo=D,exports.parseKoboXml=ke,exports.parseOpf=X,exports.parseW3cDtfDate=Je,exports.readArchiveApple=f,exports.readArchiveComicInfo=A,exports.readArchiveKobo=Be,exports.readArchiveOpf=Z,exports.readRecordAsText=s,exports.readingOrderDocumentsAllHaveViewport=We,exports.resolveArchive=Tt,exports.resolveArchiveCover=ze,exports.resolveArchiveMetadata=lt,exports.resolveArchiveReadingOrder=Q,exports.resolveArchiveToc=bt,exports.resolveMetadata=ut,exports.tokenizeXmlSpaceSeparatedList=B;
32
32
  //# sourceMappingURL=index.cjs.map