@prose-reader/archive-reader 1.322.0 → 1.324.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 (45) hide show
  1. package/README.md +1 -24
  2. package/dist/apple/readArchiveApple.d.ts +3 -0
  3. package/dist/apple/readArchiveApple.test.d.ts +1 -0
  4. package/dist/apple/resolve.d.ts +5 -2
  5. package/dist/archives/createArchiveFromJszip/index.cjs +1 -1
  6. package/dist/archives/createArchiveFromJszip/index.js +1 -1
  7. package/dist/archives/createArchiveFromLibArchive/index.cjs +1 -1
  8. package/dist/archives/createArchiveFromLibArchive/index.js +1 -1
  9. package/dist/archives/createArchiveFromNodeUnrarJs/index.cjs +1 -1
  10. package/dist/archives/createArchiveFromNodeUnrarJs/index.js +1 -1
  11. package/dist/archives/createArchiveFromUnzipper/index.cjs +1 -1
  12. package/dist/archives/createArchiveFromUnzipper/index.js +1 -1
  13. package/dist/archives/createArchiveFromZipJs/index.cjs +1 -1
  14. package/dist/archives/createArchiveFromZipJs/index.js +1 -1
  15. package/dist/comicInfo/parse.d.ts +3 -43
  16. package/dist/comicInfo/readArchiveComicInfo.d.ts +3 -0
  17. package/dist/comicInfo/readArchiveComicInfo.test.d.ts +1 -0
  18. package/dist/comicInfo/resolve.d.ts +47 -2
  19. package/dist/{createArchiveFromEntries-Bal1_O58.js → createArchiveFromEntries-CFG3evXM.js} +2 -2
  20. package/dist/{createArchiveFromEntries-Bal1_O58.js.map → createArchiveFromEntries-CFG3evXM.js.map} +1 -1
  21. package/dist/{createArchiveFromEntries-Du93RwlN.cjs → createArchiveFromEntries-DcPCGgZW.cjs} +2 -2
  22. package/dist/{createArchiveFromEntries-Du93RwlN.cjs.map → createArchiveFromEntries-DcPCGgZW.cjs.map} +1 -1
  23. package/dist/index/index.cjs +3 -3
  24. package/dist/index/index.cjs.map +1 -1
  25. package/dist/index/index.js +622 -219
  26. package/dist/index/index.js.map +1 -1
  27. package/dist/index.d.ts +18 -4
  28. package/dist/kobo/readArchiveKobo.d.ts +3 -0
  29. package/dist/kobo/readArchiveKobo.test.d.ts +1 -0
  30. package/dist/kobo/resolve.d.ts +5 -2
  31. package/dist/layout/scanReadingOrderDocumentsViewport.d.ts +3 -0
  32. package/dist/layout/scanReadingOrderDocumentsViewport.test.d.ts +1 -0
  33. package/dist/opf/parse.d.ts +19 -0
  34. package/dist/opf/resolve.d.ts +24 -2
  35. package/dist/readingOrder/resolveArchiveReadingOrder.d.ts +16 -0
  36. package/dist/readingOrder/resolveArchiveReadingOrder.test.d.ts +1 -0
  37. package/dist/resolve.d.ts +2 -2
  38. package/dist/resolveArchive.d.ts +29 -0
  39. package/dist/resolveArchive.test.d.ts +1 -0
  40. package/dist/resolveMetadata.d.ts +12 -0
  41. package/dist/resolveMetadata.test.d.ts +1 -0
  42. package/dist/types/resolvedMetadata.d.ts +84 -0
  43. package/dist/utils/omitUndefined.d.ts +1 -0
  44. package/package.json +3 -3
  45. package/dist/types/archiveResolve.d.ts +0 -17
package/README.md CHANGED
@@ -1,24 +1 @@
1
- # @prose-reader/archive-reader
2
-
3
- The package owning the **generic, accessible view of a book's container**: it reads and parses archives (EPUB zip, CBZ, folder of images, list of URLs, plain text…) and exposes them behind a single environment-agnostic `Archive` contract. The streamer (and any other prose-reader package) consumes archives; this package is the sole producer.
4
-
5
- It provides three layers:
6
-
7
- - **Archive reading** — the `Archive` / `ArchiveRecord` types and the `createArchiveFrom*` creators (`jszip`, `zip.js`, `libarchive.js`, `unzipper`, `node-unrar-js`, array buffers, URLs, text) plus record helpers (`readRecordAsText`, `getArchiveFileRecordByUri`, accessor factories). Library-backed creators ship as subpath exports so each underlying library stays an optional peer dependency.
8
- - **Metadata parsing** — typed parsers for common archive configuration files (OPF, `ComicInfo.xml`, Kobo display options, Apple iBooks display options) as TypeScript + JSON-like objects.
9
- - **Metadata resolution** — `resolveArchiveMetadata` translates the different parsed formats into one common interpretation, `resolveArchiveToc` resolves the table of contents (EPUB nav document, NCX, folder hierarchy) into a container-relative JSON structure, plus archive-level queries (`getArchiveOpfInfo`, `readArchiveOpf`, `isArchiveEpub`, `getArchiveHasComicInfo`).
10
-
11
- The parser is fast and platform agnostic (web, node). This package is not trying to become a standard, it is mostly used internally to help translate and normalize different book providers (or even different versions). Essentially, instead of implementing your own parser for "foo.xml" and trying to understand what is what, we offer a common reading, parsing and resolution layer.
12
-
13
- Example of products that may take advantage of this package:
14
- - App that lets user manipulate book archives
15
- - Reading app
16
- - App that handle book metadata
17
-
18
- ## ComicInfo.xml
19
-
20
- We are following https://anansi-project.github.io/
21
-
22
- ## Epub
23
-
24
- Spec for 3.3 is available at https://www.w3.org/TR/epub-33/
1
+ See the documentation at https://doc.prose-reader.com/archive-reader.
@@ -0,0 +1,3 @@
1
+ import { Archive } from '../archives/types';
2
+ import { AppleMetadata } from './parse';
3
+ export declare function readArchiveApple(archive: Archive): Promise<AppleMetadata | undefined>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,3 +1,6 @@
1
- import { ArchiveResolveResult } from '../types/archiveResolve';
1
+ import { ResolvedMetadata } from '../types/resolvedMetadata';
2
2
  import { AppleMetadata } from './parse';
3
- export declare const resolveApple: (input: AppleMetadata) => ArchiveResolveResult;
3
+ export declare const appleMetadataHomes: {
4
+ readonly displayOptions: "apple.options";
5
+ };
6
+ export declare const resolveApple: (input: AppleMetadata) => ResolvedMetadata;
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../createArchiveFromEntries-Du93RwlN.cjs");var t=async(t,n={})=>e.t(Object.values(t.files),e=>e.dir?{dir:!0,uri:e.name}:{dir:!1,uri:e.name,size:e._data.uncompressedSize,blob:()=>e.async(`blob`),arrayBuffer:()=>e.async(`arraybuffer`)},{...n,close:()=>Promise.resolve()});exports.createArchiveFromJszip=t;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../createArchiveFromEntries-DcPCGgZW.cjs");var t=async(t,n={})=>e.t(Object.values(t.files),e=>e.dir?{dir:!0,uri:e.name}:{dir:!1,uri:e.name,size:e._data.uncompressedSize,blob:()=>e.async(`blob`),arrayBuffer:()=>e.async(`arraybuffer`)},{...n,close:()=>Promise.resolve()});exports.createArchiveFromJszip=t;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../createArchiveFromEntries-Bal1_O58.js";
1
+ import { t as e } from "../../createArchiveFromEntries-CFG3evXM.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,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../createArchiveFromEntries-Du93RwlN.cjs"),t=require("../../fileAccessors-DWVChFUB.cjs");var n=async(n,r)=>e.t(await n.getFilesArray(),e=>({dir:!1,uri:`${e.path}${e.file.name}`,size:e.file.size,...t.n(()=>e.file.extract())}),{...r,close:()=>n.close()});exports.createArchiveFromLibArchive=n;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../createArchiveFromEntries-DcPCGgZW.cjs"),t=require("../../fileAccessors-DWVChFUB.cjs");var n=async(n,r)=>e.t(await n.getFilesArray(),e=>({dir:!1,uri:`${e.path}${e.file.name}`,size:e.file.size,...t.n(()=>e.file.extract())}),{...r,close:()=>n.close()});exports.createArchiveFromLibArchive=n;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../createArchiveFromEntries-Bal1_O58.js";
1
+ import { t as e } from "../../createArchiveFromEntries-CFG3evXM.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,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../createArchiveFromEntries-Du93RwlN.cjs"),t=require("../../fileAccessors-DWVChFUB.cjs");let n=require("@prose-reader/shared");var r=(e,t)=>{let n=[...e.extract({files:[t]}).files][0]?.extraction;if(!n)throw Error(`node-unrar-js failed to extract entry "${t}" from the RAR archive`);return n},i=async(i,a={})=>e.t([...i.getFileList().fileHeaders],e=>e.flags.directory?{dir:!0,uri:e.name}:{dir:!1,uri:e.name,size:e.unpSize,...t.t(async()=>{let t=r(i,e.name),n=t.buffer;return t.byteOffset===0&&t.byteLength===n.byteLength?n:n.slice(t.byteOffset,t.byteOffset+t.byteLength)},(0,n.detectMimeTypeFromName)(e.name)??``)},{...a,close:()=>Promise.resolve()});exports.createArchiveFromNodeUnrarJs=i;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../createArchiveFromEntries-DcPCGgZW.cjs"),t=require("../../fileAccessors-DWVChFUB.cjs");let n=require("@prose-reader/shared");var r=(e,t)=>{let n=[...e.extract({files:[t]}).files][0]?.extraction;if(!n)throw Error(`node-unrar-js failed to extract entry "${t}" from the RAR archive`);return n},i=async(i,a={})=>e.t([...i.getFileList().fileHeaders],e=>e.flags.directory?{dir:!0,uri:e.name}:{dir:!1,uri:e.name,size:e.unpSize,...t.t(async()=>{let t=r(i,e.name),n=t.buffer;return t.byteOffset===0&&t.byteLength===n.byteLength?n:n.slice(t.byteOffset,t.byteOffset+t.byteLength)},(0,n.detectMimeTypeFromName)(e.name)??``)},{...a,close:()=>Promise.resolve()});exports.createArchiveFromNodeUnrarJs=i;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../createArchiveFromEntries-Bal1_O58.js";
1
+ import { t as e } from "../../createArchiveFromEntries-CFG3evXM.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,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../createArchiveFromEntries-Du93RwlN.cjs"),t=require("../../fileAccessors-DWVChFUB.cjs");let n=require("@prose-reader/shared");var r=async(r,i={})=>e.t(r.files,e=>e.type===`Directory`?{dir:!0,uri:e.path}:{dir:!1,uri:e.path,size:e.uncompressedSize,...t.t(async()=>{let t=await e.buffer(),n=t.buffer;return t.byteOffset===0&&t.byteLength===n.byteLength?n:n.slice(t.byteOffset,t.byteOffset+t.byteLength)},(0,n.detectMimeTypeFromName)(e.path)??``)},{...i,close:()=>Promise.resolve()});exports.createArchiveFromUnzipper=r;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../createArchiveFromEntries-DcPCGgZW.cjs"),t=require("../../fileAccessors-DWVChFUB.cjs");let n=require("@prose-reader/shared");var r=async(r,i={})=>e.t(r.files,e=>e.type===`Directory`?{dir:!0,uri:e.path}:{dir:!1,uri:e.path,size:e.uncompressedSize,...t.t(async()=>{let t=await e.buffer(),n=t.buffer;return t.byteOffset===0&&t.byteLength===n.byteLength?n:n.slice(t.byteOffset,t.byteOffset+t.byteLength)},(0,n.detectMimeTypeFromName)(e.path)??``)},{...i,close:()=>Promise.resolve()});exports.createArchiveFromUnzipper=r;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../createArchiveFromEntries-Bal1_O58.js";
1
+ import { t as e } from "../../createArchiveFromEntries-CFG3evXM.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,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../createArchiveFromEntries-Du93RwlN.cjs"),t=require("../../fileAccessors-DWVChFUB.cjs");let n=require("@prose-reader/shared");var r=async(r,i={})=>e.t(await r.getEntries(),e=>e.directory?{dir:!0,uri:e.filename}:{dir:!1,uri:e.filename,size:e.uncompressedSize,...t.t(()=>e.arrayBuffer(),(0,n.detectMimeTypeFromName)(e.filename)??``)},{...i,close:()=>r.close()});exports.createArchiveFromZipJs=r;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../../createArchiveFromEntries-DcPCGgZW.cjs"),t=require("../../fileAccessors-DWVChFUB.cjs");let n=require("@prose-reader/shared");var r=async(r,i={})=>e.t(await r.getEntries(),e=>e.directory?{dir:!0,uri:e.filename}:{dir:!1,uri:e.filename,size:e.uncompressedSize,...t.t(()=>e.arrayBuffer(),(0,n.detectMimeTypeFromName)(e.filename)??``)},{...i,close:()=>r.close()});exports.createArchiveFromZipJs=r;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { t as e } from "../../createArchiveFromEntries-Bal1_O58.js";
1
+ import { t as e } from "../../createArchiveFromEntries-CFG3evXM.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,50 +1,10 @@
1
1
  import { ComicInfoManga } from './manga';
2
2
  export declare const COMIC_INFO_FILENAME = "ComicInfo.xml";
3
- export interface ComicInfo {
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
+ export type ComicInfoKnownField = (typeof COMIC_INFO_KNOWN_FIELDS)[number];
5
+ export interface ComicInfo extends Partial<Record<ComicInfoKnownField, string>> {
4
6
  readonly kind: "comicInfo";
5
- AgeRating?: string;
6
- AlternateCount?: string;
7
- AlternateNumber?: string;
8
- AlternateSeries?: string;
9
- BlackAndWhite?: string;
10
- Characters?: string;
11
- Colorist?: string;
12
- CommunityRating?: string;
13
- Count?: string;
14
- CoverArtist?: string;
15
- Day?: string;
16
- Editor?: string;
17
- Format?: string;
18
- Genre?: string;
19
- GTIN?: string;
20
- Imprint?: string;
21
- Inker?: string;
22
- LanguageISO?: string;
23
- Letterer?: string;
24
- Locations?: string;
25
- MainCharacterOrTeam?: string;
26
7
  Manga?: ComicInfoManga | (string & {});
27
- Month?: string;
28
- Notes?: string;
29
- Number?: string;
30
- PageCount?: string;
31
- Penciller?: string;
32
- Publisher?: string;
33
- Review?: string;
34
- ScanInformation?: string;
35
- Series?: string;
36
- SeriesGroup?: string;
37
- StoryArc?: string;
38
- StoryArcNumber?: string;
39
- Summary?: string;
40
- Tags?: string;
41
- Teams?: string;
42
- Title?: string;
43
- Translator?: string;
44
- Volume?: string;
45
- Web?: string;
46
- Writer?: string;
47
- Year?: string;
48
8
  [tag: string]: string | undefined;
49
9
  }
50
10
  export declare const parseComicInfo: (xml: string) => ComicInfo;
@@ -0,0 +1,3 @@
1
+ import { Archive } from '../archives/types';
2
+ import { ComicInfo } from './parse';
3
+ export declare function readArchiveComicInfo(archive: Archive): Promise<ComicInfo | undefined>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,3 +1,48 @@
1
- import { ArchiveResolveResult } from '../types/archiveResolve';
1
+ import { ResolvedMetadata } from '../types/resolvedMetadata';
2
2
  import { ComicInfo } from './parse';
3
- export declare const resolveComicInfo: (info: ComicInfo) => ArchiveResolveResult;
3
+ export declare const comicInfoMetadataHomes: {
4
+ readonly AgeRating: "comic.ageRating";
5
+ readonly AlternateCount: "comic.alternateSeries";
6
+ readonly AlternateNumber: "comic.alternateSeries";
7
+ readonly AlternateSeries: "comic.alternateSeries";
8
+ readonly BlackAndWhite: "comic.blackAndWhite";
9
+ readonly Characters: "comic.characters";
10
+ readonly Colorist: "contributors";
11
+ readonly CommunityRating: "comic.communityRating";
12
+ readonly Count: "belongsTo.series";
13
+ readonly CoverArtist: "contributors";
14
+ readonly Day: "published";
15
+ readonly Editor: "contributors";
16
+ readonly Format: "comic.format";
17
+ readonly Genre: "subjects";
18
+ readonly GTIN: "identifiers";
19
+ readonly Imprint: "imprint";
20
+ readonly Inker: "contributors";
21
+ readonly LanguageISO: "languages";
22
+ readonly Letterer: "contributors";
23
+ readonly Locations: "comic.locations";
24
+ readonly MainCharacterOrTeam: "comic.mainCharacterOrTeam";
25
+ readonly Manga: "readingDirection";
26
+ readonly Month: "published";
27
+ readonly Notes: "comic.notes";
28
+ readonly Number: "belongsTo.series";
29
+ readonly PageCount: "numberOfPages";
30
+ readonly Penciller: "contributors";
31
+ readonly Publisher: "publisher";
32
+ readonly Review: "comic.review";
33
+ readonly ScanInformation: "comic.scanInformation";
34
+ readonly Series: "belongsTo.series";
35
+ readonly SeriesGroup: "belongsTo.collection";
36
+ readonly StoryArc: "comic.storyArcs";
37
+ readonly StoryArcNumber: "comic.storyArcs";
38
+ readonly Summary: "description";
39
+ readonly Tags: "subjects";
40
+ readonly Teams: "comic.teams";
41
+ readonly Title: "title";
42
+ readonly Translator: "contributors";
43
+ readonly Volume: "comic.volume";
44
+ readonly Web: "comic.web";
45
+ readonly Writer: "contributors";
46
+ readonly Year: "published";
47
+ };
48
+ export declare const resolveComicInfo: (info: ComicInfo) => ResolvedMetadata;
@@ -53,6 +53,6 @@ var i = e.namespace("@prose-reader/archive-reader", void 0, { color: "#42b0a5" }
53
53
  });
54
54
  };
55
55
  //#endregion
56
- export { o as n, s as t };
56
+ export { o as n, i as r, s as t };
57
57
 
58
- //# sourceMappingURL=createArchiveFromEntries-Bal1_O58.js.map
58
+ //# sourceMappingURL=createArchiveFromEntries-CFG3evXM.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createArchiveFromEntries-Bal1_O58.js","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.321.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.321.0\",\n \"xmldoc\": \"^2.0.0\"\n },\n \"peerDependencies\": {\n \"@zip.js/zip.js\": \"^2.8.26\",\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.26\",\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":";;;ACKA,IAAa,IAAS,EAAa,UAAU,gCAAM,KAAA,GAAW,EAC5D,OAAO,UACT,CAAC,GCHY,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
+ {"version":3,"file":"createArchiveFromEntries-CFG3evXM.js","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.323.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.323.0\",\n \"xmldoc\": \"^2.0.0\"\n },\n \"peerDependencies\": {\n \"@zip.js/zip.js\": \"^2.8.26\",\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.26\",\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":";;;ACKA,IAAa,IAAS,EAAa,UAAU,gCAAM,KAAA,GAAW,EAC5D,OAAO,UACT,CAAC,GCHY,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,3 +1,3 @@
1
1
  let e=require("@prose-reader/shared");var t=e.Report.namespace(`@prose-reader/archive-reader`,void 0,{color:`#42b0a5`}),n=e=>{let t={};for(let n of e){let e=n.split(`/`),r=t;for(let t=0;t<e.length;t++){let n=e[t];n!==void 0&&(r[n]||(r[n]={}),r=r[n])}}let n=(e,t=``)=>Object.keys(e).sort().map((r,i,a)=>{let o=i===a.length-1,s=t+(o?`└── `:`├── `),c=t+(o?` `:`│ `),l=e[r];return l&&Object.keys(l).length>0?`${s}${r}/\n${n(l,c)}`:`${s}${r}`}).join(`
2
- `);return n(t)},r=({records:e,...r})=>{let i=new Map;for(let t of e)i.has(t.uri)||i.set(t.uri,t);let a={...r,records:e,recordsByUri:i};if(t.log(`Generated archive`,a),process.env.NODE_ENV===`development`&&t.isEnabled()){let r=n(e.map(e=>e.uri));t.groupCollapsed(...t.getGroupArgs(`Archive folder structure`)),t.log(`\n${r}`),t.groupEnd()}return a},i=(t,n,{orderByAlpha:i,name:a,encodingFormat:o,close:s})=>{let c=t.map(t=>{let r=n(t),i=(0,e.getUriBasename)(r.uri);return r.dir?{dir:!0,basename:i,uri:r.uri}:{dir:!1,basename:i,uri:r.uri,encodingFormat:(0,e.detectMimeTypeFromName)(r.uri),size:r.size,blob:r.blob,arrayBuffer:r.arrayBuffer}});return i&&c.sort((t,n)=>(0,e.sortByTitleComparator)(t.uri,n.uri)),r({filename:a,encodingFormat:o,records:c,close:s})};Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return i}});
3
- //# sourceMappingURL=createArchiveFromEntries-Du93RwlN.cjs.map
2
+ `);return n(t)},r=({records:e,...r})=>{let i=new Map;for(let t of e)i.has(t.uri)||i.set(t.uri,t);let a={...r,records:e,recordsByUri:i};if(t.log(`Generated archive`,a),process.env.NODE_ENV===`development`&&t.isEnabled()){let r=n(e.map(e=>e.uri));t.groupCollapsed(...t.getGroupArgs(`Archive folder structure`)),t.log(`\n${r}`),t.groupEnd()}return a},i=(t,n,{orderByAlpha:i,name:a,encodingFormat:o,close:s})=>{let c=t.map(t=>{let r=n(t),i=(0,e.getUriBasename)(r.uri);return r.dir?{dir:!0,basename:i,uri:r.uri}:{dir:!1,basename:i,uri:r.uri,encodingFormat:(0,e.detectMimeTypeFromName)(r.uri),size:r.size,blob:r.blob,arrayBuffer:r.arrayBuffer}});return i&&c.sort((t,n)=>(0,e.sortByTitleComparator)(t.uri,n.uri)),r({filename:a,encodingFormat:o,records:c,close:s})};Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return i}});
3
+ //# sourceMappingURL=createArchiveFromEntries-DcPCGgZW.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"createArchiveFromEntries-Du93RwlN.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.321.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.321.0\",\n \"xmldoc\": \"^2.0.0\"\n },\n \"peerDependencies\": {\n \"@zip.js/zip.js\": \"^2.8.26\",\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.26\",\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":["../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.323.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.323.0\",\n \"xmldoc\": \"^2.0.0\"\n },\n \"peerDependencies\": {\n \"@zip.js/zip.js\": \"^2.8.26\",\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.26\",\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,4 +1,4 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../createArchiveFromEntries-Du93RwlN.cjs"),t=require("../fileAccessors-DWVChFUB.cjs");let n=require("xmldoc"),r=require("@prose-reader/shared");var i=`com.apple.ibooks.display-options.xml`,a=e=>e.childrenNamed(`option`).map(e=>({name:e.attr?.name,value:e.val})),o=e=>{let t=new n.XmlDocument(e);if(t.name?.toLowerCase()!==`display_options`)return{kind:`apple`};let r=t.childNamed(`platform`);return{kind:`apple`,displayOptions:{...r===void 0?{}:{platform:{options:a(r)}}}}},s=async(n,i={})=>e.t(n,e=>e.isDir?{dir:!0,uri:e.name}:{dir:!1,uri:e.name,size:e.size,...t.t(e.data,(0,r.detectMimeTypeFromName)(e.name)??``)},{...i,close:()=>Promise.resolve()}),c=async(n,{mimeType:i,direction:a}={mimeType:`text/plain`})=>{let o=`
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../createArchiveFromEntries-DcPCGgZW.cjs"),t=require("../fileAccessors-DWVChFUB.cjs");let n=require("xmldoc"),r=require("@prose-reader/shared");var i=`com.apple.ibooks.display-options.xml`,a=e=>e.childrenNamed(`option`).map(e=>({name:e.attr?.name,value:e.val})),o=e=>{let t=new n.XmlDocument(e);if(t.name?.toLowerCase()!==`display_options`)return{kind:`apple`};let r=t.childNamed(`platform`);return{kind:`apple`,displayOptions:{...r===void 0?{}:{platform:{options:a(r)}}}}},s=async e=>new TextDecoder().decode(await e.arrayBuffer()),c=e=>!e.dir,l=e=>e.dir,u=(e,t)=>{let n=e.recordsByUri.get(t);return n&&c(n)?n:void 0},d=i.toLowerCase();async function f(e){let t=e.records.find(e=>c(e)&&e.basename.toLowerCase()===d);if(t)return o(await s(t))}var p=e=>{let t=Object.entries(e).filter(([,e])=>e!==void 0);return Object.fromEntries(t)},m={displayOptions:`apple.options`},h=e=>{let t=e.displayOptions?.platform?.options,n=t?.find(e=>e.name===`fixed-layout`)?.value.trim().toLowerCase(),r=n===`true`||n!==`false`&&void 0,i=p({fixedLayout:r,options:t!==void 0&&t.length>0?t.map(({name:e,value:t})=>p({name:e,value:t})):void 0});return p({renditionLayout:r===!0?`pre-paginated`:void 0,apple:Object.keys(i).length>0?i:void 0})},g=async(n,i={})=>e.t(n,e=>e.isDir?{dir:!0,uri:e.name}:{dir:!1,uri:e.name,size:e.size,...t.t(e.data,(0,r.detectMimeTypeFromName)(e.name)??``)},{...i,close:()=>Promise.resolve()}),_=async(n,{mimeType:i,direction:a}={mimeType:`text/plain`})=>{let o=`
2
2
  <?xml version="1.0" encoding="UTF-8"?>
3
3
  <package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="ja" prefix="rendition: http://www.idpf.org/vocab/rendition/#"
4
4
  unique-identifier="ootuya-id">
@@ -13,7 +13,7 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
13
13
  <itemref idref="p01" />
14
14
  </spine>
15
15
  </package>
16
- `;return e.n({filename:`content.txt`,encodingFormat:i,records:[{dir:!1,basename:(0,r.getUriBasename)(`generated.opf`),uri:`generated.opf`,size:0,...t.n(async()=>new Blob([o]))},{dir:!1,basename:(0,r.getUriBasename)(`p01.txt`),uri:`p01.txt`,size:typeof n==`string`?new Blob([n]).size:n.size,encodingFormat:i,...t.n(async()=>typeof n==`string`?new Blob([n]):n)}],close:()=>Promise.resolve()})},l=async(n,i)=>{let a=(0,r.createXmlSafeIdFactory)(),o=n.map(e=>({id:a(e),url:e})),s=`
16
+ `;return e.n({filename:`content.txt`,encodingFormat:i,records:[{dir:!1,basename:(0,r.getUriBasename)(`generated.opf`),uri:`generated.opf`,size:0,...t.n(async()=>new Blob([o]))},{dir:!1,basename:(0,r.getUriBasename)(`p01.txt`),uri:`p01.txt`,size:typeof n==`string`?new Blob([n]).size:n.size,encodingFormat:i,...t.n(async()=>typeof n==`string`?new Blob([n]):n)}],close:()=>Promise.resolve()})},v=async(n,i)=>{let a=(0,r.createXmlSafeIdFactory)(),o=n.map(e=>({id:a(e),url:e})),s=`
17
17
  <?xml version="1.0" encoding="UTF-8"?><package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid">
18
18
  <metadata>
19
19
  <meta property="rendition:layout">${i?.useRenditionFlow?`reflowable`:`pre-paginated`}</meta>
@@ -28,5 +28,5 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
28
28
  `)}
29
29
  </spine>
30
30
  </package>
31
- `,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()})},u=async e=>new TextDecoder().decode(await e.arrayBuffer()),d=e=>!e.dir,f=e=>e.dir,p=(e,t)=>{let n=e.recordsByUri.get(t);return n&&d(n)?n:void 0},m=`ComicInfo.xml`,h=new Set([`Pages`,`ComicInfo`]),g=e=>e.children.some(e=>e.type===`element`),_=e=>{let t=e.val.trim();return t.length>0?t:void 0},v=e=>{let t;try{t=new n.XmlDocument(e)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`${m} is malformed: ${t}`,{cause:e})}let r={};return t.eachChild(e=>{if(e.type!==`element`||h.has(e.name)||g(e))return;let t=_(e);t!==void 0&&r[e.name]===void 0&&(r[e.name]=t)}),{kind:`comicInfo`,...r}},y=m.toLowerCase(),b=e=>e.records.find(e=>d(e)&&e.basename.toLowerCase()===y),x=[`Unknown`,`No`,`Yes`,`YesAndRightToLeft`],S=e=>{for(let t of x)if(t===e)return!0;return!1},C=`com.kobobooks.display-options.xml`,w=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{}},ee=e=>{let t=new n.XmlDocument(e);return t.name?.toLowerCase()===`display_options`?{kind:`kobo`,...w(t)}:{kind:`kobo`}},T=e=>{let t=e.records.filter(e=>!e.dir).find(e=>e.uri.endsWith(`.opf`));return{data:t,basePath:t?.uri.substring(0,t.uri.lastIndexOf(`/`))||``}},E=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))},D=e=>e.toLowerCase().endsWith(`.opf`),O=e=>e.records.some(e=>!e.dir&&(D(e.basename)||D(e.uri))),k=e=>e===void 0||e.trim().length===0?[]:e.trim().split(/\s+/).filter(e=>e.length>0),te=e=>{let t=k(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}:{}}},A=e=>e.includes(`:`)?e.slice(e.lastIndexOf(`:`)+1):e,j=(e,t)=>A(e).toLowerCase()===t.toLowerCase(),M=e=>e.type===`element`,N=(e,t)=>{for(let n of e.children)if(M(n)&&j(n.name,t))return n},P=(e,t)=>{let n=[];for(let r of e.children)M(r)&&j(r.name,t)&&n.push(r);return n},F=e=>{let t=[];return e.eachChild(e=>{if(A(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},I=(e,t)=>{let n;return e.eachChild(e=>{if(n!==void 0||A(e.name).toLowerCase()!==t.toLowerCase())return;let r=e.val.trim();r.length>0&&(n=r)}),n},L=(e,t)=>{let n=[];return e.eachChild(e=>{if(A(e.name).toLowerCase()!==t.toLowerCase())return;let r=e.val.trim();r.length>0&&n.push(r)}),n},ne=e=>{let t;return e.eachChild(e=>{if(t!==void 0||A(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},re=({manifestItems:e,metadataEl:t})=>{let n=e=>e.mediaType?.toLowerCase().includes(`image/`)===!0,r=e.find(e=>n(e)?k(e.properties).includes(`cover-image`):!1);if(r!==void 0)return r.href;if(t!==void 0){let r=ne(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},R=(e,t)=>{let n=P(e,`meta`).find(e=>e.attr.property===t)?.val;if(!(n===void 0||n.trim().length===0))return n},ie=e=>{let t=N(e,`guide`);if(t===void 0)return[];let n=[];for(let e of P(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},ae=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}:{}}},oe=e=>{let t=[],n=new Map;for(let r of P(e,`item`)){let e=ae(r);e!==void 0&&(t.push(e),n.set(e.id,e))}return{items:t,byId:n}},se=(e,t)=>{let n=[];for(let r of P(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=te(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},z=e=>{let t=new n.XmlDocument(e),r=N(t,`manifest`),i=N(t,`spine`),a=N(t,`metadata`),o=[],s=[];if(r!==void 0){let{items:e,byId:t}=oe(r);o=e,i!==void 0&&(s=se(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=[];a!==void 0&&(f=I(a,`title`),p=I(a,`publisher`),m=I(a,`rights`),h=I(a,`date`),g=L(a,`creator`),_=L(a,`language`),v=L(a,`subject`),y=R(a,`rendition:layout`),b=R(a,`rendition:flow`),x=R(a,`rendition:spread`),S.push(...F(a)));let C=re({manifestItems:o,metadataEl:a}),w=ie(t);return{kind:`opf`,manifestItems:o,spineRows:s,spineTocIdref:d,identifiers:S,title:f,creators:g,publisher:p,rights:m,languages:_,subjects:v,date:h,coverHref:C,renditionLayoutMeta:y,renditionFlowMeta:b,renditionSpreadMeta:x,pageProgressionDirection:l,guide:w}};async function B(e){let{data:t,basePath:n}=T(e)||{};if(!(!t||t.dir))return{opf:z(await u(t)),basePath:n}}var V=e=>({gtin:void 0,isbn:void 0,readingDirection:void 0,renditionLayout:(e.displayOptions?.platform?.options?.find(e=>e.name===`fixed-layout`)?.value)?.trim().toLowerCase()===`true`?`pre-paginated`:void 0,title:void 0,authors:void 0,publisher:void 0,rights:void 0,languages:void 0,date:void 0,subjects:void 0}),H=new Set([8,12,13,14]),U=e=>{if(e==null)return;let t=String(e).replace(/\D/g,``);if(!(t.length===0||!H.has(t.length)))return t},W=/(?:97[89])?\d{9}[\dXx]/,G=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(W);if(r)return r[0].toUpperCase()},ce=e=>{switch(e.Manga){case`YesAndRightToLeft`:return`rtl`;case`Yes`:case`No`:return`ltr`;default:return}},K=e=>{if(e===void 0)return;let t=e.trim();return t.length>0?t:void 0},q=e=>e===void 0?[]:e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0),J=e=>{let t=K(e);if(t===void 0||!/^\d+$/.test(t))return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0},le=e=>{let t=J(e.Year),n=J(e.Month),r=J(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=e=>{let t=e.GTIN,n=K(e.LanguageISO),r=q(e.Writer),i=[...q(e.Genre),...q(e.Tags)];return{gtin:U(t),isbn:G(t),readingDirection:ce(e),renditionLayout:void 0,title:K(e.Title),authors:r.length>0?r:void 0,publisher:K(e.Publisher),rights:void 0,languages:n===void 0?void 0:[n],date:le(e),subjects:i.length>0?i:void 0}},de=e=>({gtin:void 0,isbn:void 0,readingDirection:void 0,renditionLayout:e.renditionLayout,title:void 0,authors:void 0,publisher:void 0,rights:void 0,languages:void 0,date:void 0,subjects:void 0}),Y=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)}}},fe=e=>{for(let t of e)if(t.scheme!==void 0&&t.scheme.trim().toLowerCase()===`isbn`&&G(t.value)!==void 0)return t.value;for(let t of e)if(G(t.value)!==void 0)return t.value},pe=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=fe(e.identifiers);return{gtin:U(a),isbn:G(a),readingDirection:n,renditionLayout:i,title:e.title,authors:e.creators.length>0?[...e.creators]:void 0,publisher:e.publisher,rights:e.rights,languages:e.languages.length>0?[...e.languages]:void 0,date:Y(e.date),subjects:e.subjects.length>0?[...e.subjects]:void 0}},me=e=>e.kind===`comicInfo`?ue(e):e.kind===`kobo`?de(e):e.kind===`apple`?V(e):pe(e),he=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)},[])},X=e=>e?e.children.map(e=>e instanceof n.XmlTextNode?e.text:e instanceof n.XmlElement?X(e):``).join(``).trim():``,Z=e=>k(e.properties).includes(`nav`),Q=(e,{basePath:t})=>{let n={contents:[],path:``,containerHref:``,title:``},i=e.childNamed(`span`)||e.childNamed(`a`);n.title=(i?.attr.title||i?.val.trim()||X(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=>Q(e,{basePath:t})))}return n},ge=(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(Q(e,{basePath:t}))}),r},_e=async(e,t)=>{let i=e.manifestItems.find(Z);if(i?.href){let e=t.records.find(e=>e.uri.endsWith(i.href));if(e&&!e.dir)return ge(new n.XmlDocument(await u(e)),{basePath:(0,r.getUriBasePath)(e.uri)})}},$=(e,{opfBasePath: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=>$(e,{opfBasePath:t,prefix:n}))),a},ve=(e,{opfBasePath: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($(e,{opfBasePath:t,prefix:i}))}),n},ye=async({opf:e,opfBasePath:t,archive:r})=>{let i=e.spineTocIdref;if(i){let a=e.manifestItems.find(e=>e.id===i);if(a){let e=`${t}${t===``?``:`/`}${a.href}`,i=r.records.find(t=>t.uri.endsWith(e));if(i&&!i.dir)return ve(new n.XmlDocument(await u(i)),{opfBasePath:t})}}},be=async(e,{opf:t}={})=>{let n=t??await B(e);if(n)return await _e(n.opf,e)||await ye({opf:n.opf,opfBasePath:n.basePath,archive:e})||[];let r=he(e);return r.length===0?void 0:r};exports.APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME=i,exports.COMIC_INFO_FILENAME=m,exports.COMIC_INFO_MANGA_VALUES=x,exports.KOBO_DISPLAY_OPTIONS_FILENAME=C,exports.arrayBufferFileAccessors=t.t,exports.blobFileAccessors=t.n,exports.createArchive=e.n,exports.createArchiveFromArrayBufferList=s,exports.createArchiveFromEntries=e.t,exports.createArchiveFromText=c,exports.createArchiveFromUrls=l,exports.getArchiveFileRecordByUri=p,exports.getArchiveHasComicInfo=b,exports.getArchiveOpfInfo=T,exports.getSpineItemFilesFromArchive=E,exports.isArchiveEpub=O,exports.isComicInfoManga=S,exports.isDirectoryRecord=f,exports.isFileRecord=d,exports.normalizeGtin=U,exports.normalizeIsbn=G,exports.parseAppleDisplayOptionsXml=o,exports.parseComicInfo=v,exports.parseKoboXml=ee,exports.parseOpf=z,exports.parseW3cDtfDate=Y,exports.readArchiveOpf=B,exports.readRecordAsText=u,exports.resolveArchiveMetadata=me,exports.resolveArchiveToc=be,exports.tokenizeXmlSpaceSeparatedList=k;
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=`ComicInfo.xml`,b=`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(`.`),x=new Set([`Pages`,`ComicInfo`]),S=e=>e.children.some(e=>e.type===`element`),C=e=>{let t=e.val.trim();return t.length>0?t:void 0},w=e=>{let t;try{t=new n.XmlDocument(e)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`${y} is malformed: ${t}`,{cause:e})}let r={};return t.eachChild(e=>{if(e.type!==`element`||x.has(e.name)||S(e))return;let t=C(e);t!==void 0&&r[e.name]===void 0&&(r[e.name]=t)}),{kind:`comicInfo`,...r}},T=y.toLowerCase(),E=e=>e.records.find(e=>c(e)&&e.basename.toLowerCase()===T),D=[`Unknown`,`No`,`Yes`,`YesAndRightToLeft`],ee=e=>{for(let t of D)if(t===e)return!0;return!1};async function te(e){let t=E(e);if(t)return w(await s(t))}var ne=new Set([8,12,13,14]),O=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]/,k=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}},A=e=>{if(e===void 0)return;let t=e.trim();return t.length>0?t:void 0},j=e=>e===void 0?[]:e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0),M=e=>{let t=A(e);if(t===void 0||!/^\d+$/.test(t))return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0},N=e=>{let t=A(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=A(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=M(e.Year),n=M(e.Month),r=M(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 j(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=A(e.Series);if(t!==void 0)return p({name:t,position:N(e.Number),total:M(e.Count)})},fe=e=>{let t=A(e.AlternateSeries);if(t!==void 0)return p({name:t,position:N(e.AlternateNumber),total:M(e.AlternateCount)})},pe=e=>{let t=j(e.StoryArc);if(t.length===0)return[];let n=j(e.StoryArcNumber);return t.map((e,t)=>p({name:e,position:N(n[t])}))},P=e=>e.length>0?e:void 0,me=e=>{let t=P((e.Web??``).split(/\s+/).filter(e=>e.length>0)),n=p({manga:se(e),blackAndWhite:oe(e.BlackAndWhite),volume:M(e.Volume),format:A(e.Format),ageRating:A(e.AgeRating),communityRating:N(e.CommunityRating),notes:A(e.Notes),review:A(e.Review),web:t,scanInformation:A(e.ScanInformation),mainCharacterOrTeam:A(e.MainCharacterOrTeam),characters:P(j(e.Characters)),teams:P(j(e.Teams)),locations:P(j(e.Locations)),storyArcs:P(pe(e)),alternateSeries:fe(e)});return Object.keys(n).length>0?n:void 0},he=e=>{let t=de(e),n=P(j(e.SeriesGroup).map(e=>({name:e})));if(!(t===void 0&&n===void 0))return p({series:t===void 0?void 0:[t],collection:n})},F=e=>{let t=e.GTIN,n=A(t),r=A(e.LanguageISO),i=[...j(e.Genre),...j(e.Tags)];return p({title:A(e.Title),description:A(e.Summary),publisher:A(e.Publisher),imprint:A(e.Imprint),languages:r===void 0?void 0:[r],subjects:P(i),contributors:P(ue(e)),published:ce(e),readingDirection:ae(e),numberOfPages:M(e.PageCount),gtin:O(t),isbn:k(t),identifiers:n===void 0?void 0:[{value:n,scheme:`GTIN`}],belongsTo:he(e),comic:me(e)})},I=`com.kobobooks.display-options.xml`,ge=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{}},L=e=>{let t=new n.XmlDocument(e);return t.name?.toLowerCase()===`display_options`?{kind:`kobo`,...ge(t)}:{kind:`kobo`}};async function R(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}=L(n);e&&(r=e)}catch(n){e.r.error(`Unable to parse ${I} (${t.uri})`,n)}}return{kind:`kobo`,...r===void 0?{}:{renditionLayout:r}}}var _e={renditionLayout:`renditionLayout`},z=e=>p({renditionLayout:e.renditionLayout,kobo:e.renditionLayout===void 0?void 0:{fixedLayout:e.renditionLayout===`pre-paginated`}}),ve=e=>{let t=e.descendantWithPath(`head`)?.childrenNamed(`meta`).find(e=>e.attr.name===`viewport`);return!!(t&&t.attr.name===`viewport`)},B=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(!ve(new n.XmlDocument(e)))return!1}catch(t){return e.r.error(`layout scan: unable to inspect ${a.uri}`,t),!1}}return!0},V=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(`/`))||``}},ye=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))},be=e=>e.toLowerCase().endsWith(`.opf`),xe=e=>e.records.some(e=>!e.dir&&(be(e.basename)||be(e.uri))),H=e=>e===void 0||e.trim().length===0?[]:e.trim().split(/\s+/).filter(e=>e.length>0),Se=e=>{let t=H(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}:{}}},U=e=>e.includes(`:`)?e.slice(e.lastIndexOf(`:`)+1):e,Ce=(e,t)=>U(e).toLowerCase()===t.toLowerCase(),we=e=>e.type===`element`,W=(e,t)=>{for(let n of e.children)if(we(n)&&Ce(n.name,t))return n},G=(e,t)=>{let n=[];for(let r of e.children)we(r)&&Ce(r.name,t)&&n.push(r);return n},Te=e=>{let t=[];return e.eachChild(e=>{if(U(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},K=(e,t)=>{let n;return e.eachChild(e=>{if(n!==void 0||U(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(U(e.name).toLowerCase()!==t.toLowerCase())return;let r=e.val.trim();r.length>0&&n.push(r)}),n},Ee=e=>{let t;return e.eachChild(e=>{if(t!==void 0||U(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},De=({manifestItems:e,metadataEl:t})=>{let n=e=>e.mediaType?.toLowerCase().includes(`image/`)===!0,r=e.find(e=>n(e)?H(e.properties).includes(`cover-image`):!1);if(r!==void 0)return r.href;if(t!==void 0){let r=Ee(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},Oe=e=>{let t=[];return e.eachChild(e=>{if(U(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},ke=(e,t)=>e.replace(/^#/,``)===t,Ae=(e,t)=>{let n=[];return e.eachChild(e=>{let r=U(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&&ke(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},je=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},Me=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}:{}}},Ne=e=>{let t=[],n=new Map;for(let r of G(e,`item`)){let e=Me(r);e!==void 0&&(t.push(e),n.set(e.id,e))}return{items:t,byId:n}},Pe=(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=Se(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},Fe=e=>{let t=new n.XmlDocument(e),r=W(t,`manifest`),i=W(t,`spine`),a=W(t,`metadata`),o=[],s=[];if(r!==void 0){let{items:e,byId:t}=Ne(r);o=e,i!==void 0&&(s=Pe(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=K(a,`title`),p=K(a,`publisher`),m=K(a,`description`),h=K(a,`rights`),g=K(a,`date`),_=q(a,`creator`),y=q(a,`language`),b=q(a,`subject`),x=Y(a,`rendition:layout`),S=Y(a,`rendition:flow`),C=Y(a,`rendition:spread`),w=Oe(a),v=Ae(a,w),T.push(...Te(a)));let E=De({manifestItems:o,metadataEl:a}),D=je(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}=V(e)||{};if(!(!t||t.dir))return{opf:Fe(await s(t)),basePath:n}}var Ie=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)}}},Le={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`},Re=e=>{for(let t of e)if(t.scheme!==void 0&&t.scheme.trim().toLowerCase()===`isbn`&&k(t.value)!==void 0)return t.value;for(let t of e)if(k(t.value)!==void 0)return t.value},ze={art:`artist`,aut:`author`,clr:`colorist`,ctb:`contributor`,edt:`editor`,ill:`illustrator`,nrt:`narrator`,trl:`translator`},Be=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})}),Ve=(e,t)=>e.refines!==void 0&&e.refines.replace(/^#/,``)===t,He=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},Ue=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=>Ve(e,i)&&e.property===t&&e.value!==void 0)?.value,o=a(`collection-type`)?.trim().toLowerCase(),s=p({name:r.value,position:He(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:He(e.find(e=>e.name?.toLowerCase()===`calibre:series_index`)?.content)}))}return{series:t,collection:n}},We=e=>{let t=e?.trim();if(t===`scrolled-continuous`||t===`scrolled-doc`||t===`paginated`||t===`auto`)return t},Ge=e=>{let t=e?.trim();if(t===`none`||t===`landscape`||t===`portrait`||t===`both`||t===`auto`)return t},Ke=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=Re(e.identifiers),o=Be(e),{series:s,collection:c}=Ue(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:Ie(e.date),readingDirection:n,renditionLayout:i,renditionFlow:We(e.renditionFlowMeta),renditionSpread:Ge(e.renditionSpreadMeta),gtin:O(a),isbn:k(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})},qe=e=>{let t=e?.trim().toLowerCase();return t===`reflowable`||t===`pre-paginated`?t:void 0},Je=(e,t)=>/^https?:\/\//.test(e)?e:t?`${t}/${e}`:e,Ye=(e,{opf:t,basePath:n})=>{let r=qe(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}))},Xe=y.toLowerCase(),Ze=i.toLowerCase(),Qe=e=>{let t=e.basename.toLowerCase();return t===Xe||t===Ze||e.uri.endsWith(`com.kobobooks.display-options.xml`)||t.endsWith(`.db`)},$e=e=>{let t=e.records.filter(c).filter(e=>!Qe(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})})},Z=async(e,{opf:t}={})=>{let n=t??await X(e).catch(()=>void 0);return n?Ye(e,n):$e(e)},et=e=>e.kind===`comicInfo`?F(e):e.kind===`kobo`?z(e):e.kind===`apple`?h(e):Ke(e),tt=e=>{let t=e.opf===void 0?void 0:Ke(e.opf),n=e.comicInfo===void 0?void 0:F(e.comicInfo),r=e.apple===void 0?void 0:h(e.apple),i=e.kobo===void 0?void 0:z(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})},nt=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)},[])},rt=e=>e?e.children.map(e=>e instanceof n.XmlTextNode?e.text:e instanceof n.XmlElement?rt(e):``).join(``).trim():``,it=e=>H(e.properties).includes(`nav`),at=(e,{basePath:t})=>{let n={contents:[],path:``,containerHref:``,title:``},i=e.childNamed(`span`)||e.childNamed(`a`);n.title=(i?.attr.title||i?.val.trim()||rt(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=>at(e,{basePath:t})))}return n},ot=(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(at(e,{basePath:t}))}),r},st=async(e,t)=>{let i=e.manifestItems.find(it);if(i?.href){let e=t.records.find(e=>e.uri.endsWith(i.href));if(e&&!e.dir)return ot(new n.XmlDocument(await s(e)),{basePath:(0,r.getUriBasePath)(e.uri)})}},ct=(e,{opfBasePath: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=>ct(e,{opfBasePath:t,prefix:n}))),a},lt=(e,{opfBasePath: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(ct(e,{opfBasePath:t,prefix:i}))}),n},ut=async({opf:e,opfBasePath:t,archive:r})=>{let i=e.spineTocIdref;if(i){let a=e.manifestItems.find(e=>e.id===i);if(a){let e=`${t}${t===``?``:`/`}${a.href}`,i=r.records.find(t=>t.uri.endsWith(e));if(i&&!i.dir)return lt(new n.XmlDocument(await s(i)),{opfBasePath:t})}}},Q=async(e,{opf:t}={})=>{let n=t??await X(e);if(n)return await st(n.opf,e)||await ut({opf:n.opf,opfBasePath:n.basePath,archive:e})||[];let r=nt(e);return r.length===0?void 0:r},dt=[`metadata`,`readingOrder`,`toc`],$=async(t,n)=>{try{return await t()}catch(t){e.r.error(`resolveArchive: unable to read ${n}`,t);return}},ft=1,pt=async(e,t={})=>{let n=new Set(t.include??dt),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=r||i||s,u=l?await $(()=>te(e),`comicInfo`):void 0,d=l?await $(()=>f(e),`apple`):void 0,m=l?await $(()=>R(e),`kobo`):void 0,h=r||s?tt({opf:c?.opf,comicInfo:u,apple:d,kobo:m}):void 0,g=a||s?await Z(e,{opf:c}):void 0;s&&h!==void 0&&g!==void 0&&h.renditionLayout===`reflowable`&&g.every(e=>e.renditionLayout===`reflowable`)&&await B(e,g)&&(h={...h,renditionLayout:`pre-paginated`},g=g.map(e=>({...e,renditionLayout:`pre-paginated`})));let _=o?await $(()=>Q(e,{opf:c}),`toc`):void 0,v={version:ft};return r&&h!==void 0&&(v.metadata=h),a&&g!==void 0&&(v.readingOrder=g),o&&_!==void 0&&(v.toc=_),i&&(v.sources=p({opf:c,comicInfo:u,apple:d,kobo:m})),v};exports.APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME=i,exports.COMIC_INFO_FILENAME=y,exports.COMIC_INFO_KNOWN_FIELDS=b,exports.COMIC_INFO_MANGA_VALUES=D,exports.KOBO_DISPLAY_OPTIONS_FILENAME=I,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=E,exports.getArchiveOpfInfo=V,exports.getSpineItemFilesFromArchive=ye,exports.isArchiveEpub=xe,exports.isComicInfoManga=ee,exports.isDirectoryRecord=l,exports.isFileRecord=c,exports.koboMetadataHomes=_e,exports.normalizeGtin=O,exports.normalizeIsbn=k,exports.opfMetadataHomes=Le,exports.parseAppleDisplayOptionsXml=o,exports.parseComicInfo=w,exports.parseKoboXml=L,exports.parseOpf=Fe,exports.parseW3cDtfDate=Ie,exports.readArchiveApple=f,exports.readArchiveComicInfo=te,exports.readArchiveKobo=R,exports.readArchiveOpf=X,exports.readRecordAsText=s,exports.readingOrderDocumentsAllHaveViewport=B,exports.resolveArchive=pt,exports.resolveArchiveMetadata=et,exports.resolveArchiveReadingOrder=Z,exports.resolveArchiveToc=Q,exports.resolveMetadata=tt,exports.tokenizeXmlSpaceSeparatedList=H;
32
32
  //# sourceMappingURL=index.cjs.map