@prose-reader/archive-reader 1.328.0 → 1.330.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.
@@ -0,0 +1,8 @@
1
+ import { Archive } from '../archives/types';
2
+ import { ArchiveOpfParsed } from '../opf/readArchiveOpf';
3
+ import { ArchiveReadingOrderItem } from '../readingOrder/resolveArchiveReadingOrder';
4
+ import { ResolvedCover } from '../types/resolvedMetadata';
5
+ export declare const resolveArchiveCover: (archive: Archive, { opf, readingOrder, }?: {
6
+ opf?: ArchiveOpfParsed;
7
+ readingOrder?: ArchiveReadingOrderItem[];
8
+ }) => Promise<ResolvedCover | undefined>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1 +1 @@
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.327.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.327.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.329.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.329.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 +1 @@
1
- {"version":3,"file":"createArchiveFromEntries-DcPCGgZW.cjs","names":[],"sources":["../package.json","../src/report.ts","../src/archives/printTree.ts","../src/archives/createArchive.ts","../src/archives/createArchiveFromEntries.ts"],"sourcesContent":["{\n \"name\": \"@prose-reader/archive-reader\",\n \"version\": \"1.327.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.327.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.329.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.329.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"}
@@ -28,5 +28,5 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
28
28
  `)}
29
29
  </spine>
30
30
  </package>
31
- `,c=n.map(e=>({dir:!1,basename:(0,r.getUriBasename)(e),encodingFormat:(0,r.detectMimeTypeFromName)(e),uri:e,size:0,...t.n(async()=>(await fetch(e)).blob())}));return e.n({records:[{dir:!1,basename:`content.opf`,uri:`content.opf`,size:0,...t.n(async()=>new Blob([s]))},...c],close:()=>Promise.resolve()})},y=`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;
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 O(e){let t=E(e);if(t)return w(await s(t))}var te=new Set([8,12,13,14]),k=e=>{if(e==null)return;let t=String(e).replace(/\D/g,``);if(!(t.length===0||!te.has(t.length)))return t},ne=/(?:97[89])?\d{9}[\dXx]/,A=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(ne);if(r)return r[0].toUpperCase()},re={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`},ie=e=>{switch(e.Manga){case`YesAndRightToLeft`:return`rtl`;case`Yes`:case`No`:return`ltr`;default:return}},j=e=>{if(e===void 0)return;let t=e.trim();return t.length>0?t:void 0},M=e=>e===void 0?[]:e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0),N=e=>{let t=j(e);if(t===void 0||!/^\d+$/.test(t))return;let n=Number.parseInt(t,10);return Number.isFinite(n)?n:void 0},P=e=>{let t=j(e);if(t===void 0||!/^\d+(\.\d+)?$/.test(t))return;let n=Number.parseFloat(t);return Number.isFinite(n)?n:void 0},ae=e=>{let t=j(e)?.toLowerCase();if(t===`yes`)return!0;if(t===`no`)return!1},oe=e=>{switch(e.Manga){case`Yes`:case`YesAndRightToLeft`:return!0;case`No`:return!1;default:return}},se=e=>{let t=N(e.Year),n=N(e.Month),r=N(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}}},ce=[[`Writer`,`author`],[`Penciller`,`penciler`],[`Inker`,`inker`],[`Colorist`,`colorist`],[`Letterer`,`letterer`],[`CoverArtist`,`coverArtist`],[`Editor`,`editor`],[`Translator`,`translator`]],le=e=>{let t=new Map;for(let[n,r]of ce)for(let i of M(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()]},ue=e=>{let t=j(e.Series);if(t!==void 0)return p({name:t,position:P(e.Number),total:N(e.Count)})},de=e=>{let t=j(e.AlternateSeries);if(t!==void 0)return p({name:t,position:P(e.AlternateNumber),total:N(e.AlternateCount)})},fe=e=>{let t=M(e.StoryArc);if(t.length===0)return[];let n=M(e.StoryArcNumber);return t.map((e,t)=>p({name:e,position:P(n[t])}))},F=e=>e.length>0?e:void 0,pe=e=>{let t=F((e.Web??``).split(/\s+/).filter(e=>e.length>0)),n=p({manga:oe(e),blackAndWhite:ae(e.BlackAndWhite),volume:N(e.Volume),format:j(e.Format),ageRating:j(e.AgeRating),communityRating:P(e.CommunityRating),notes:j(e.Notes),review:j(e.Review),web:t,scanInformation:j(e.ScanInformation),mainCharacterOrTeam:j(e.MainCharacterOrTeam),characters:F(M(e.Characters)),teams:F(M(e.Teams)),locations:F(M(e.Locations)),storyArcs:F(fe(e)),alternateSeries:de(e)});return Object.keys(n).length>0?n:void 0},me=e=>{let t=ue(e),n=F(M(e.SeriesGroup).map(e=>({name:e})));if(!(t===void 0&&n===void 0))return p({series:t===void 0?void 0:[t],collection:n})},I=e=>{let t=e.GTIN,n=j(t),r=j(e.LanguageISO),i=[...M(e.Genre),...M(e.Tags)];return p({title:j(e.Title),description:j(e.Summary),publisher:j(e.Publisher),imprint:j(e.Imprint),languages:r===void 0?void 0:[r],subjects:F(i),contributors:F(le(e)),published:se(e),readingDirection:ie(e),numberOfPages:N(e.PageCount),gtin:k(t),isbn:A(t),identifiers:n===void 0?void 0:[{value:n,scheme:`GTIN`}],belongsTo:me(e),comic:pe(e)})},he=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(`/`))||``}},L=e=>e===void 0||e.trim().length===0?[]:e.trim().split(/\s+/).filter(e=>e.length>0),ge=e=>{let t=L(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}:{}}},R=e=>e.includes(`:`)?e.slice(e.lastIndexOf(`:`)+1):e,_e=(e,t)=>R(e).toLowerCase()===t.toLowerCase(),ve=e=>e.type===`element`,z=(e,t)=>{for(let n of e.children)if(ve(n)&&_e(n.name,t))return n},B=(e,t)=>{let n=[];for(let r of e.children)ve(r)&&_e(r.name,t)&&n.push(r);return n},ye=e=>{let t=[];return e.eachChild(e=>{if(R(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},V=(e,t)=>{let n;return e.eachChild(e=>{if(n!==void 0||R(e.name).toLowerCase()!==t.toLowerCase())return;let r=e.val.trim();r.length>0&&(n=r)}),n},H=(e,t)=>{let n=[];return e.eachChild(e=>{if(R(e.name).toLowerCase()!==t.toLowerCase())return;let r=e.val.trim();r.length>0&&n.push(r)}),n},be=e=>{let t;return e.eachChild(e=>{if(t!==void 0||R(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},xe=({manifestItems:e,metadataEl:t})=>{let n=e=>e.mediaType?.toLowerCase().includes(`image/`)===!0,r=e.find(e=>n(e)?L(e.properties).includes(`cover-image`):!1);if(r!==void 0)return r.href;if(t!==void 0){let r=be(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},U=(e,t)=>{let n=e.attr[t]?.trim();return n!==void 0&&n.length>0?n:void 0},Se=e=>{let t=[];return e.eachChild(e=>{if(R(e.name).toLowerCase()!==`meta`)return;let n=U(e,`property`),r=U(e,`refines`),i=U(e,`scheme`),a=U(e,`id`),o=U(e,`name`),s=U(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},Ce=(e,t)=>e.replace(/^#/,``)===t,we=(e,t)=>{let n=[];return e.eachChild(e=>{let r=R(e.name).toLowerCase();if(r!==`creator`&&r!==`contributor`)return;let i=e.val.trim();if(i.length===0)return;let a=U(e,`id`),o=e=>a===void 0?[]:t.flatMap(t=>t.refines!==void 0&&Ce(t.refines,a)&&t.property===e&&t.value!==void 0?[t.value]:[]),s=U(e,`opf:role`)??U(e,`role`),c=[...s===void 0?[]:[s],...o(`role`)],l=U(e,`opf:file-as`)??U(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},W=(e,t)=>{let n=B(e,`meta`).find(e=>e.attr.property===t)?.val;if(!(n===void 0||n.trim().length===0))return n},Te=e=>{let t=z(e,`guide`);if(t===void 0)return[];let n=[];for(let e of B(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},Ee=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}:{}}},De=e=>{let t=[],n=new Map;for(let r of B(e,`item`)){let e=Ee(r);e!==void 0&&(t.push(e),n.set(e.id,e))}return{items:t,byId:n}},Oe=(e,t)=>{let n=[];for(let r of B(t,`itemref`)){let t=r.attr.idref;if(t===void 0||t.trim().length===0)continue;let i=e.get(t);if(i===void 0)continue;let a=ge(r.attr.properties);n.push({idref:t,id:i.id,href:i.href,...i.mediaType===void 0?{}:{mediaType:i.mediaType},...i.properties===void 0?{}:{properties:i.properties},...a.renditionLayout===void 0?{}:{renditionLayout:a.renditionLayout},...a.renditionFlow===void 0?{}:{renditionFlow:a.renditionFlow},...a.pageSpreadLeft===void 0?{}:{pageSpreadLeft:a.pageSpreadLeft},...a.pageSpreadRight===void 0?{}:{pageSpreadRight:a.pageSpreadRight}})}return n},G=e=>{let t=new n.XmlDocument(e),r=z(t,`manifest`),i=z(t,`spine`),a=z(t,`metadata`),o=[],s=[];if(r!==void 0){let{items:e,byId:t}=De(r);o=e,i!==void 0&&(s=Oe(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=V(a,`title`),p=V(a,`publisher`),m=V(a,`description`),h=V(a,`rights`),g=V(a,`date`),_=H(a,`creator`),y=H(a,`language`),b=H(a,`subject`),x=W(a,`rendition:layout`),S=W(a,`rendition:flow`),C=W(a,`rendition:spread`),w=Se(a),v=we(a,w),T.push(...ye(a)));let E=xe({manifestItems:o,metadataEl:a}),D=Te(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 K(e){let{data:t,basePath:n}=he(e)||{};if(!(!t||t.dir))return{opf:G(await s(t)),basePath:n}}var q=`com.kobobooks.display-options.xml`,ke=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{}},J=e=>{let t=new n.XmlDocument(e);return t.name?.toLowerCase()===`display_options`?{kind:`kobo`,...ke(t)}:{kind:`kobo`}},Ae=e=>{let t=[];for(let n of e.split(`/`))if(n!==`.`){if(n===`..`){t.pop();continue}t.push(n)}return t.join(`/`)},Y=(e,t)=>/^https?:\/\//.test(e)?e:Ae(t?`${t}/${e}`:e),je=e=>{let t=e?.trim().toLowerCase();return t===`reflowable`||t===`pre-paginated`?t:void 0},Me=(e,{opf:t,basePath:n})=>{let r=je(t.renditionLayoutMeta),i=t.spineRows.map(t=>{let r=Y(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}))},Ne=y.toLowerCase(),Pe=i.toLowerCase(),Fe=e=>{let t=e.basename.toLowerCase();return t===Ne||t===Pe||e.uri.endsWith(`com.kobobooks.display-options.xml`)||t.endsWith(`.db`)},Ie=e=>{let t=e.records.filter(c).filter(e=>!Fe(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})})},X=async(e,{opf:t}={})=>{let n=t??await K(e).catch(()=>void 0);return n?Me(e,n):Ie(e)},Le=(e,t)=>{let n=u(e,t);if(n!==void 0)return(0,r.parseContentType)(n.encodingFormat??``)||(0,r.detectMimeTypeFromName)(n.basename)},Z=async(e,{opf:t,readingOrder:n}={})=>{let r=t??await K(e).catch(()=>void 0);if(r!==void 0&&r.opf.coverHref!==void 0){let t=Y(r.opf.coverHref,r.basePath);return p({uri:t,mediaType:Le(e,t),confidence:`derived`})}let i=(n??await X(e,{opf:r})).find(e=>e.mediaType?.startsWith(`image/`)===!0);if(i!==void 0)return p({uri:i.uri,mediaType:i.mediaType,confidence:`assumed`})};async function Re(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}=J(n);e&&(r=e)}catch(n){e.r.error(`Unable to parse ${q} (${t.uri})`,n)}}return{kind:`kobo`,...r===void 0?{}:{renditionLayout:r}}}var ze={renditionLayout:`renditionLayout`},Be=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`)},He=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},Ue=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))},We=e=>e.toLowerCase().endsWith(`.opf`),Ge=e=>e.records.some(e=>!e.dir&&(We(e.basename)||We(e.uri))),Ke=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)}}},qe={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`},Je=e=>{for(let t of e)if(t.scheme!==void 0&&t.scheme.trim().toLowerCase()===`isbn`&&A(t.value)!==void 0)return t.value;for(let t of e)if(A(t.value)!==void 0)return t.value},Ye={art:`artist`,aut:`author`,clr:`colorist`,ctb:`contributor`,edt:`editor`,ill:`illustrator`,nrt:`narrator`,trl:`translator`},Xe=e=>e.contributors.map(e=>{let t=e.roles.map(e=>Ye[e.trim().toLowerCase()]??e);return p({name:e.name,roles:t.length>0?t:[e.source===`creator`?`author`:`contributor`],sortAs:e.fileAs})}),Ze=(e,t)=>e.refines!==void 0&&e.refines.replace(/^#/,``)===t,Qe=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},$e=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=>Ze(e,i)&&e.property===t&&e.value!==void 0)?.value,o=a(`collection-type`)?.trim().toLowerCase(),s=p({name:r.value,position:Qe(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:Qe(e.find(e=>e.name?.toLowerCase()===`calibre:series_index`)?.content)}))}return{series:t,collection:n}},et=e=>{let t=e?.trim();if(t===`scrolled-continuous`||t===`scrolled-doc`||t===`paginated`||t===`auto`)return t},tt=e=>{let t=e?.trim();if(t===`none`||t===`landscape`||t===`portrait`||t===`both`||t===`auto`)return t},Q=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=Je(e.identifiers),o=Xe(e),{series:s,collection:c}=$e(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:Ke(e.date),readingDirection:n,renditionLayout:i,renditionFlow:et(e.renditionFlowMeta),renditionSpread:tt(e.renditionSpreadMeta),gtin:k(a),isbn:A(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})},nt=e=>e.kind===`comicInfo`?I(e):e.kind===`kobo`?Be(e):e.kind===`apple`?h(e):Q(e),rt=e=>{let t=e.opf===void 0?void 0:Q(e.opf),n=e.comicInfo===void 0?void 0:I(e.comicInfo),r=e.apple===void 0?void 0:h(e.apple),i=e.kobo===void 0?void 0:Be(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})},it=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)},[])},at=e=>e?e.children.map(e=>e instanceof n.XmlTextNode?e.text:e instanceof n.XmlElement?at(e):``).join(``).trim():``,ot=e=>L(e.properties).includes(`nav`),st=(e,{basePath:t})=>{let n={contents:[],path:``,containerHref:``,title:``},i=e.childNamed(`span`)||e.childNamed(`a`);n.title=(i?.attr.title||i?.val.trim()||at(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=>st(e,{basePath:t})))}return n},ct=(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(st(e,{basePath:t}))}),r},lt=async(e,t)=>{let i=e.manifestItems.find(ot);if(i?.href){let e=t.records.find(e=>e.uri.endsWith(i.href));if(e&&!e.dir)return ct(new n.XmlDocument(await s(e)),{basePath:(0,r.getUriBasePath)(e.uri)})}},ut=(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=>ut(e,{opfBasePath:t,prefix:n}))),a},dt=(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(ut(e,{opfBasePath:t,prefix:i}))}),n},ft=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 dt(new n.XmlDocument(await s(i)),{opfBasePath:t})}}},pt=async(e,{opf:t}={})=>{let n=t??await K(e);if(n)return await lt(n.opf,e)||await ft({opf:n.opf,opfBasePath:n.basePath,archive:e})||[];let r=it(e);return r.length===0?void 0:r},mt=[`metadata`,`readingOrder`,`toc`],$=async(t,n)=>{try{return await t()}catch(t){e.r.error(`resolveArchive: unable to read ${n}`,t);return}},ht=e=>{let t=e=>e?.startsWith(`audio/`)===!0||e?.startsWith(`video/`)===!0,n=e.filter(e=>e.renditionLayout===`pre-paginated`&&!t(e.mediaType)).length;return n>0?n:void 0},gt=1,_t=async(e,t={})=>{let n=new Set(t.include??mt),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 $(()=>K(e),`opf`):void 0,l=r||i||s,u=l?await $(()=>O(e),`comicInfo`):void 0,d=l?await $(()=>f(e),`apple`):void 0,m=l?await $(()=>Re(e),`kobo`):void 0,h=r||s?rt({opf:c?.opf,comicInfo:u,apple:d,kobo:m}):void 0,g=a||s?await X(e,{opf:c}):void 0;if(s&&h!==void 0&&g!==void 0&&h.renditionLayout===`reflowable`&&g.every(e=>e.renditionLayout===`reflowable`)&&await He(e,g)&&(h={...h,renditionLayout:`pre-paginated`},g=g.map(e=>({...e,renditionLayout:`pre-paginated`}))),r&&h!==void 0){let t=g??await X(e,{opf:c}),n=await Z(e,{opf:c,readingOrder:t}),r=h.numberOfPages??ht(t);h=p({...h,cover:n,numberOfPages:r})}let _=o?await $(()=>pt(e,{opf:c}),`toc`):void 0,v={version:gt};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=q,exports.appleMetadataHomes=m,exports.arrayBufferFileAccessors=t.t,exports.blobFileAccessors=t.n,exports.comicInfoMetadataHomes=re,exports.createArchive=e.n,exports.createArchiveFromArrayBufferList=g,exports.createArchiveFromEntries=e.t,exports.createArchiveFromText=_,exports.createArchiveFromUrls=v,exports.getArchiveFileRecordByUri=u,exports.getArchiveHasComicInfo=E,exports.getArchiveOpfInfo=he,exports.getSpineItemFilesFromArchive=Ue,exports.isArchiveEpub=Ge,exports.isComicInfoManga=ee,exports.isDirectoryRecord=l,exports.isFileRecord=c,exports.koboMetadataHomes=ze,exports.normalizeGtin=k,exports.normalizeIsbn=A,exports.opfMetadataHomes=qe,exports.parseAppleDisplayOptionsXml=o,exports.parseComicInfo=w,exports.parseKoboXml=J,exports.parseOpf=G,exports.parseW3cDtfDate=Ke,exports.readArchiveApple=f,exports.readArchiveComicInfo=O,exports.readArchiveKobo=Re,exports.readArchiveOpf=K,exports.readRecordAsText=s,exports.readingOrderDocumentsAllHaveViewport=He,exports.resolveArchive=_t,exports.resolveArchiveCover=Z,exports.resolveArchiveMetadata=nt,exports.resolveArchiveReadingOrder=X,exports.resolveArchiveToc=pt,exports.resolveMetadata=rt,exports.tokenizeXmlSpaceSeparatedList=L;
32
32
  //# sourceMappingURL=index.cjs.map