diff --git a/package.json b/package.json index 910748fa..0f8846bb 100644 --- a/package.json +++ b/package.json @@ -71,6 +71,7 @@ "electron-store": "^8.2.0", "electron-updater": "^6.3.9", "electron-window-state": "^5.0.3", + "epub": "^1.3.0", "fs-extra": "^11.2.0", "html2canvas": "^1.4.1", "markdown-it": "^14.1.0", diff --git a/packages/shared/config/constant.ts b/packages/shared/config/constant.ts index b27a60a0..0b6234f0 100644 --- a/packages/shared/config/constant.ts +++ b/packages/shared/config/constant.ts @@ -1,7 +1,7 @@ export const imageExts = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp'] export const videoExts = ['.mp4', '.avi', '.mov', '.wmv', '.flv', '.mkv'] export const audioExts = ['.mp3', '.wav', '.ogg', '.flac', '.aac'] -export const documentExts = ['.pdf', '.docx', '.pptx', '.xlsx', '.odt', '.odp', '.ods'] +export const documentExts = ['.pdf', '.docx', '.pptx', '.xlsx', '.odt', '.odp', '.ods', '.epub'] export const textExts = [ '.txt', // 普通文本文件 '.md', // Markdown 文件 diff --git a/src/main/loader/epubLoader.ts b/src/main/loader/epubLoader.ts new file mode 100644 index 00000000..8364d12f --- /dev/null +++ b/src/main/loader/epubLoader.ts @@ -0,0 +1,228 @@ +import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters' +import { BaseLoader } from '@llm-tools/embedjs-interfaces' +import { cleanString } from '@llm-tools/embedjs-utils' +import Logger from 'electron-log' +import EPub from 'epub' +import * as fs from 'fs' + +/** + * epub 加载器的配置选项 + */ +interface EpubLoaderOptions { + /** epub 文件路径 */ + filePath: string + /** 文本分块大小 */ + chunkSize: number + /** 分块重叠大小 */ + chunkOverlap: number +} + +/** + * epub 文件的元数据信息 + */ +interface EpubMetadata { + /** 作者显示名称(例如:"Lewis Carroll") */ + creator?: string + /** 作者规范化名称,用于排序和索引(例如:"Carroll, Lewis") */ + creatorFileAs?: string + /** 书籍标题(例如:"Alice's Adventures in Wonderland") */ + title?: string + /** 语言代码(例如:"en" 或 "zh-CN") */ + language?: string + /** 主题或分类(例如:"Fantasy"、"Fiction") */ + subject?: string + /** 创建日期(例如:"2024-02-14") */ + date?: string + /** 书籍描述或简介 */ + description?: string +} + +/** + * epub 章节信息 + */ +interface EpubChapter { + /** 章节 ID */ + id: string + /** 章节标题 */ + title?: string + /** 章节顺序 */ + order?: number +} + +/** + * epub 文件加载器 + * 用于解析 epub 电子书文件,提取文本内容和元数据 + */ +export class EpubLoader extends BaseLoader, Record> { + protected filePath: string + protected chunkSize: number + protected chunkOverlap: number + private extractedText: string + private metadata: EpubMetadata | null + + /** + * 创建 epub 加载器实例 + * @param options 加载器配置选项 + */ + constructor(options: EpubLoaderOptions) { + super(options.filePath, { + chunkSize: options.chunkSize, + chunkOverlap: options.chunkOverlap + }) + this.filePath = options.filePath + this.chunkSize = options.chunkSize + this.chunkOverlap = options.chunkOverlap + this.extractedText = '' + this.metadata = null + } + + /** + * 等待 epub 文件初始化完成 + * epub 库使用事件机制,需要等待 'end' 事件触发后才能访问文件内容 + * @param epub epub 实例 + * @returns 元数据和章节信息 + */ + private waitForEpubInit(epub: any): Promise<{ metadata: EpubMetadata; chapters: EpubChapter[] }> { + return new Promise((resolve, reject) => { + epub.on('end', () => { + // 提取元数据 + const metadata: EpubMetadata = { + creator: epub.metadata.creator, + creatorFileAs: epub.metadata.creatorFileAs, + title: epub.metadata.title, + language: epub.metadata.language, + subject: epub.metadata.subject, + date: epub.metadata.date, + description: epub.metadata.description + } + + // 提取章节信息 + const chapters: EpubChapter[] = epub.flow.map((chapter: any, index: number) => ({ + id: chapter.id, + title: chapter.title || `Chapter ${index + 1}`, + order: index + 1 + })) + + resolve({ metadata, chapters }) + }) + + epub.on('error', (error: Error) => { + reject(error) + }) + + epub.parse() + }) + } + + /** + * 获取章节内容 + * @param epub epub 实例 + * @param chapterId 章节 ID + * @returns 章节文本内容 + */ + private getChapter(epub: any, chapterId: string): Promise { + return new Promise((resolve, reject) => { + epub.getChapter(chapterId, (error: Error | null, text: string) => { + if (error) { + reject(error) + } else { + resolve(text) + } + }) + }) + } + + /** + * 从 epub 文件中提取文本内容 + * 1. 检查文件是否存在 + * 2. 初始化 epub 并获取元数据 + * 3. 遍历所有章节并提取文本 + * 4. 清理 HTML 标签 + * 5. 合并所有章节文本 + */ + private async extractTextFromEpub() { + try { + // 检查文件是否存在 + if (!fs.existsSync(this.filePath)) { + throw new Error(`File not found: ${this.filePath}`) + } + + const epub = new EPub(this.filePath) + + // 等待 epub 初始化完成并获取元数据 + const { metadata, chapters } = await this.waitForEpubInit(epub) + this.metadata = metadata + + if (!epub.flow || epub.flow.length === 0) { + throw new Error('No content found in epub file') + } + + const chapterTexts: string[] = [] + + // 遍历所有章节 + for (const chapter of chapters) { + try { + const content = await this.getChapter(epub, chapter.id) + + if (!content) { + continue + } + + // 移除 HTML 标签并清理文本 + const text = content + .replace(/<[^>]*>/g, ' ') // 移除所有 HTML 标签 + .replace(/\s+/g, ' ') // 将多个空白字符替换为单个空格 + .trim() // 移除首尾空白 + + if (text) { + chapterTexts.push(text) + } + } catch (error) { + Logger.error(`[EpubLoader] Error processing chapter ${chapter.id}:`, error) + } + } + + // 使用双换行符连接所有章节文本 + this.extractedText = chapterTexts.join('\n\n') + } catch (error) { + Logger.error('[EpubLoader] Error in extractTextFromEpub:', error) + throw error + } + } + + /** + * 生成文本块 + * 重写 BaseLoader 的方法,将提取的文本分割成适当大小的块 + * 每个块都包含源文件和元数据信息 + */ + override async *getUnfilteredChunks() { + // 如果还没有提取文本,先提取 + if (!this.extractedText) { + await this.extractTextFromEpub() + } + + Logger.info('[EpubLoader] 书名:', this.metadata?.title || '未知书名', ' 文本大小:', this.extractedText.length) + + // 创建文本分块器 + const chunker = new RecursiveCharacterTextSplitter({ + chunkSize: this.chunkSize, + chunkOverlap: this.chunkOverlap + }) + + // 清理并分割文本 + const chunks = await chunker.splitText(cleanString(this.extractedText)) + + // 为每个文本块添加元数据 + for (const chunk of chunks) { + yield { + pageContent: chunk, + metadata: { + source: this.filePath, + title: this.metadata?.title || '', + creator: this.metadata?.creator || '', + language: this.metadata?.language || '' + } + } + } + } +} diff --git a/src/main/loader/index.ts b/src/main/loader/index.ts index e69c3ff2..3cc1d1af 100644 --- a/src/main/loader/index.ts +++ b/src/main/loader/index.ts @@ -7,6 +7,7 @@ import { LoaderReturn } from '@shared/config/types' import { FileType, KnowledgeBaseParams } from '@types' import Logger from 'electron-log' +import { EpubLoader } from './epubLoader' import { OdLoader, OdType } from './odLoader' // embedjs内置loader类型 @@ -70,6 +71,24 @@ export async function addFileLoader( } as LoaderReturn } + // epub 文件处理 + if (file.ext === '.epub') { + const loaderReturn = await ragApplication.addLoader( + new EpubLoader({ + filePath: file.path, + chunkSize: base.chunkSize ?? 1000, + chunkOverlap: base.chunkOverlap ?? 200 + }) as any, + forceReload + ) + return { + entriesAdded: loaderReturn.entriesAdded, + uniqueId: loaderReturn.uniqueId, + uniqueIds: [loaderReturn.uniqueId], + loaderType: loaderReturn.loaderType + } as LoaderReturn + } + const fileContent = fs.readFileSync(file.path, 'utf-8') // HTML类型 if (['.html', '.htm'].includes(file.ext)) { diff --git a/yarn.lock b/yarn.lock index 36bc3c83..21e6a2c0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3038,6 +3038,7 @@ __metadata: electron-window-state: "npm:^5.0.3" emittery: "npm:^1.0.3" emoji-picker-element: "npm:^1.22.1" + epub: "npm:^1.3.0" eslint: "npm:^8.56.0" eslint-plugin-react: "npm:^7.34.3" eslint-plugin-react-hooks: "npm:^4.6.2" @@ -3127,6 +3128,13 @@ __metadata: languageName: node linkType: hard +"adm-zip@npm:^0.4.11": + version: 0.4.16 + resolution: "adm-zip@npm:0.4.16" + checksum: 10c0/c56c6e138fd19006155fc716acae14d54e07c267ae19d78c8a8cdca04762bf20170a71a41aa8d8bad2f13b70d4f3e9a191009bafa5280e05a440ee506f871a55 + languageName: node + linkType: hard + "adm-zip@npm:^0.5.16": version: 0.5.16 resolution: "adm-zip@npm:0.5.16" @@ -3407,6 +3415,13 @@ __metadata: languageName: node linkType: hard +"aproba@npm:^1.0.3": + version: 1.2.0 + resolution: "aproba@npm:1.2.0" + checksum: 10c0/2d34f008c9edfa991f42fe4b667d541d38a474a39ae0e24805350486d76744cd91ee45313283c1d39a055b14026dd0fc4d0cbfc13f210855d59d7e8b5a61dc51 + languageName: node + linkType: hard + "aproba@npm:^1.0.3 || ^2.0.0": version: 2.0.0 resolution: "aproba@npm:2.0.0" @@ -3424,6 +3439,16 @@ __metadata: languageName: node linkType: hard +"are-we-there-yet@npm:~1.1.2": + version: 1.1.7 + resolution: "are-we-there-yet@npm:1.1.7" + dependencies: + delegates: "npm:^1.0.0" + readable-stream: "npm:^2.0.6" + checksum: 10c0/03cb45f2892767773c86a616205fc67feb8dfdd56685d1b34999cfa6c0d2aebe73ec0e6ba88a406422b998dea24138337fdb9a3f9b172d7c2a7f75d02f3df088 + languageName: node + linkType: hard + "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" @@ -4217,7 +4242,7 @@ __metadata: languageName: node linkType: hard -"chownr@npm:^1.1.1": +"chownr@npm:^1.1.1, chownr@npm:^1.1.4": version: 1.1.4 resolution: "chownr@npm:1.1.4" checksum: 10c0/ed57952a84cc0c802af900cf7136de643d3aba2eecb59d29344bc2f3f9bf703a301b9d84cdc71f82c3ffc9ccde831b0d92f5b45f91727d6c9da62f23aef9d9db @@ -4498,7 +4523,7 @@ __metadata: languageName: node linkType: hard -"console-control-strings@npm:^1.1.0": +"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0, console-control-strings@npm:~1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" checksum: 10c0/7ab51d30b52d461412cd467721bb82afe695da78fff8f29fe6f6b9cbaac9a2328e27a22a966014df9532100f6dd85370460be8130b9c677891ba36d96a343f50 @@ -4745,7 +4770,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.1.0": +"debug@npm:^3.1.0, debug@npm:^3.2.6": version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: @@ -4950,7 +4975,7 @@ __metadata: languageName: node linkType: hard -"detect-libc@npm:^1.0.3": +"detect-libc@npm:^1.0.2, detect-libc@npm:^1.0.3": version: 1.0.3 resolution: "detect-libc@npm:1.0.3" bin: @@ -5459,6 +5484,20 @@ __metadata: languageName: node linkType: hard +"epub@npm:^1.3.0": + version: 1.3.0 + resolution: "epub@npm:1.3.0" + dependencies: + adm-zip: "npm:^0.4.11" + xml2js: "npm:^0.4.23" + zipfile: "npm:^0.5.11" + dependenciesMeta: + zipfile: + optional: true + checksum: 10c0/2e8bb70354d13f17224f0fea2f999d1a5537383ed3df7388054eb28b98bd4f91057db19bf58e8bc8618f4f509051ad21fb12f36b6faa029d29bcf647ab13e074 + languageName: node + linkType: hard + "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" @@ -6457,6 +6496,15 @@ __metadata: languageName: node linkType: hard +"fs-minipass@npm:^1.2.7": + version: 1.2.7 + resolution: "fs-minipass@npm:1.2.7" + dependencies: + minipass: "npm:^2.6.0" + checksum: 10c0/c8259ce8caab360f16b8c3774fd09dd1d5240d6f3f78fd8efa0a215b5f40edfa90e7b5b5ddc2335a4c50885e29d5983f9fe6ac3ac19320e6917a21dbb9f05c64 + languageName: node + linkType: hard + "fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" @@ -6545,6 +6593,22 @@ __metadata: languageName: node linkType: hard +"gauge@npm:~2.7.3": + version: 2.7.4 + resolution: "gauge@npm:2.7.4" + dependencies: + aproba: "npm:^1.0.3" + console-control-strings: "npm:^1.0.0" + has-unicode: "npm:^2.0.0" + object-assign: "npm:^4.1.0" + signal-exit: "npm:^3.0.0" + string-width: "npm:^1.0.1" + strip-ansi: "npm:^3.0.1" + wide-align: "npm:^1.1.0" + checksum: 10c0/d606346e2e47829e0bc855d0becb36c4ce492feabd61ae92884b89e07812dd8a67a860ca30ece3a4c2e9f2c73bd68ba2b8e558ed362432ffd86de83c08847f84 + languageName: node + linkType: hard + "gensync@npm:^1.0.0-beta.2": version: 1.0.0-beta.2 resolution: "gensync@npm:1.0.0-beta.2" @@ -6907,7 +6971,7 @@ __metadata: languageName: node linkType: hard -"has-unicode@npm:^2.0.1": +"has-unicode@npm:^2.0.0, has-unicode@npm:^2.0.1": version: 2.0.1 resolution: "has-unicode@npm:2.0.1" checksum: 10c0/ebdb2f4895c26bb08a8a100b62d362e49b2190bcfd84b76bc4be1a3bd4d254ec52d0dd9f2fbcc093fc5eb878b20c52146f9dfd33e2686ed28982187be593b47c @@ -7377,6 +7441,15 @@ __metadata: languageName: node linkType: hard +"iconv-lite@npm:^0.4.4": + version: 0.4.24 + resolution: "iconv-lite@npm:0.4.24" + dependencies: + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: 10c0/c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 + languageName: node + linkType: hard + "ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" @@ -7384,6 +7457,15 @@ __metadata: languageName: node linkType: hard +"ignore-walk@npm:^3.0.1": + version: 3.0.4 + resolution: "ignore-walk@npm:3.0.4" + dependencies: + minimatch: "npm:^3.0.4" + checksum: 10c0/690372b433887796fa3badd25babab7daf60a1882259dcc130ec78eea79745c2416322e10d1a96b367071204471c532647d20b11cd7ab70bd9b49879e461f956 + languageName: node + linkType: hard + "ignore@npm:^5.2.0, ignore@npm:^5.2.4": version: 5.3.2 resolution: "ignore@npm:5.3.2" @@ -9686,6 +9768,16 @@ __metadata: languageName: node linkType: hard +"minipass@npm:^2.6.0, minipass@npm:^2.9.0": + version: 2.9.0 + resolution: "minipass@npm:2.9.0" + dependencies: + safe-buffer: "npm:^5.1.2" + yallist: "npm:^3.0.0" + checksum: 10c0/307d8765ac3db9fcd6b486367e6f6c3e460f3a3e198d95d6c0005a2d95804c40c72959261cdebde3c8237cda0b03d4c01975e4581fe11abcf201f5005caafd2a + languageName: node + linkType: hard + "minipass@npm:^3.0.0, minipass@npm:^3.1.0, minipass@npm:^3.1.1, minipass@npm:^3.1.3": version: 3.3.6 resolution: "minipass@npm:3.3.6" @@ -9709,6 +9801,15 @@ __metadata: languageName: node linkType: hard +"minizlib@npm:^1.3.3": + version: 1.3.3 + resolution: "minizlib@npm:1.3.3" + dependencies: + minipass: "npm:^2.9.0" + checksum: 10c0/79798032bbaa6594fa517e5b7ff9977951984fc9548a421b28d3fb0add8ed7e98a33e41e262af53b944f9d860c1e00fc778b477ef692e7b38b1ba12b390ffb17 + languageName: node + linkType: hard + "minizlib@npm:^2.0.0, minizlib@npm:^2.1.1": version: 2.1.2 resolution: "minizlib@npm:2.1.2" @@ -9743,7 +9844,7 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.4": +"mkdirp@npm:^0.5.1, mkdirp@npm:^0.5.4, mkdirp@npm:^0.5.5": version: 0.5.6 resolution: "mkdirp@npm:0.5.6" dependencies: @@ -9802,6 +9903,15 @@ __metadata: languageName: node linkType: hard +"nan@npm:~2.10.0": + version: 2.10.0 + resolution: "nan@npm:2.10.0" + dependencies: + node-gyp: "npm:latest" + checksum: 10c0/9d3a83704b4f89473c01485eae527f3e78def4f098b140c9d1164cd539183b283fb6f7b3536a298dc21aa8b6b4e597e01b0dfa939d591205a80a63a8274f0edd + languageName: node + linkType: hard + "nanoid@npm:^3.3.7": version: 3.3.8 resolution: "nanoid@npm:3.3.8" @@ -9834,6 +9944,19 @@ __metadata: languageName: node linkType: hard +"needle@npm:^2.2.1": + version: 2.9.1 + resolution: "needle@npm:2.9.1" + dependencies: + debug: "npm:^3.2.6" + iconv-lite: "npm:^0.4.4" + sax: "npm:^1.2.4" + bin: + needle: ./bin/needle + checksum: 10c0/65a7eaeaf4ca3410de492957474592af9838e02875273d9232ff6cff331393c58a95e48c592bd9a05f575e5bb9b08543d6cfd19eb96595dbd3d7da2c5fe1accb + languageName: node + linkType: hard + "negotiator@npm:^0.6.2": version: 0.6.4 resolution: "negotiator@npm:0.6.4" @@ -9961,6 +10084,26 @@ __metadata: languageName: node linkType: hard +"node-pre-gyp@npm:~0.10.2": + version: 0.10.3 + resolution: "node-pre-gyp@npm:0.10.3" + dependencies: + detect-libc: "npm:^1.0.2" + mkdirp: "npm:^0.5.1" + needle: "npm:^2.2.1" + nopt: "npm:^4.0.1" + npm-packlist: "npm:^1.1.6" + npmlog: "npm:^4.0.2" + rc: "npm:^1.2.7" + rimraf: "npm:^2.6.1" + semver: "npm:^5.3.0" + tar: "npm:^4" + bin: + node-pre-gyp: ./bin/node-pre-gyp + checksum: 10c0/382db414572d225885c6bf2d2de42ce0be751dc85fa524bd90a1ccff009facf73d7ef3619b396d275ab3e4a01c33c0b9aee42d41d32dc72208ebfc923f6f234f + languageName: node + linkType: hard + "node-releases@npm:^2.0.19": version: 2.0.19 resolution: "node-releases@npm:2.0.19" @@ -9968,6 +10111,18 @@ __metadata: languageName: node linkType: hard +"nopt@npm:^4.0.1": + version: 4.0.3 + resolution: "nopt@npm:4.0.3" + dependencies: + abbrev: "npm:1" + osenv: "npm:^0.1.4" + bin: + nopt: bin/nopt.js + checksum: 10c0/03e54cdf8c9b46924cfadf333b2b86fc180410d74d51f9c72fec5ef9c6f1a19ec533f647c05e40d49ef7491af59664c5d0baace808d6ccfe3ff064ae630a61b4 + languageName: node + linkType: hard + "nopt@npm:^5.0.0": version: 5.0.0 resolution: "nopt@npm:5.0.0" @@ -10016,6 +10171,45 @@ __metadata: languageName: node linkType: hard +"npm-bundled@npm:^1.0.1": + version: 1.1.2 + resolution: "npm-bundled@npm:1.1.2" + dependencies: + npm-normalize-package-bin: "npm:^1.0.1" + checksum: 10c0/3f2337789afc8cb608a0dd71cefe459531053d48a5497db14b07b985c4cab15afcae88600db9f92eae072c89b982eeeec8e4463e1d77bc03a7e90f5dacf29769 + languageName: node + linkType: hard + +"npm-normalize-package-bin@npm:^1.0.1": + version: 1.0.1 + resolution: "npm-normalize-package-bin@npm:1.0.1" + checksum: 10c0/b0c8c05fe419a122e0ff970ccbe7874ae24b4b4b08941a24d18097fe6e1f4b93e3f6abfb5512f9c5488827a5592f2fb3ce2431c41d338802aed24b9a0c160551 + languageName: node + linkType: hard + +"npm-packlist@npm:^1.1.6": + version: 1.4.8 + resolution: "npm-packlist@npm:1.4.8" + dependencies: + ignore-walk: "npm:^3.0.1" + npm-bundled: "npm:^1.0.1" + npm-normalize-package-bin: "npm:^1.0.1" + checksum: 10c0/3b6dd1d0f677a3c1ad8e5f59362f4249459ad9fbb31c8a9306c0cf2af74016078d17a37fffee66b5437e76aba33c7ceb008905bccbadb23ea4776171d4b22b92 + languageName: node + linkType: hard + +"npmlog@npm:^4.0.2": + version: 4.1.2 + resolution: "npmlog@npm:4.1.2" + dependencies: + are-we-there-yet: "npm:~1.1.2" + console-control-strings: "npm:~1.1.0" + gauge: "npm:~2.7.3" + set-blocking: "npm:~2.0.0" + checksum: 10c0/d6a26cb362277c65e24a70ebdaff31f81184ceb5415fd748abaaf26417bf0794a17ba849116e4f454a0370b9067ae320834cc78d74527dbeadf6e9d19a959046 + languageName: node + linkType: hard + "npmlog@npm:^6.0.0": version: 6.0.2 resolution: "npmlog@npm:6.0.2" @@ -10042,7 +10236,7 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.0.1, object-assign@npm:^4.1.1": +"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 @@ -10263,6 +10457,13 @@ __metadata: languageName: node linkType: hard +"os-homedir@npm:^1.0.0": + version: 1.0.2 + resolution: "os-homedir@npm:1.0.2" + checksum: 10c0/6be4aa67317ee247b8d46142e243fb4ef1d2d65d3067f54bfc5079257a2f4d4d76b2da78cba7af3cb3f56dbb2e4202e0c47f26171d11ca1ed4008d842c90363f + languageName: node + linkType: hard + "os-locale@npm:^1.4.0": version: 1.4.0 resolution: "os-locale@npm:1.4.0" @@ -10272,6 +10473,23 @@ __metadata: languageName: node linkType: hard +"os-tmpdir@npm:^1.0.0": + version: 1.0.2 + resolution: "os-tmpdir@npm:1.0.2" + checksum: 10c0/f438450224f8e2687605a8dd318f0db694b6293c5d835ae509a69e97c8de38b6994645337e5577f5001115470414638978cc49da1cdcc25106dad8738dc69990 + languageName: node + linkType: hard + +"osenv@npm:^0.1.4": + version: 0.1.5 + resolution: "osenv@npm:0.1.5" + dependencies: + os-homedir: "npm:^1.0.0" + os-tmpdir: "npm:^1.0.0" + checksum: 10c0/b33ed4b77e662f3ee2a04bf4b56cad2107ab069dee982feb9e39ad44feb9aa0cf1016b9ac6e05d0d84c91fa496798fe48dd05a33175d624e51668068b9805302 + languageName: node + linkType: hard + "own-keys@npm:^1.0.1": version: 1.0.1 resolution: "own-keys@npm:1.0.1" @@ -11776,7 +11994,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.0, readable-stream@npm:^2.3.5, readable-stream@npm:~2.3.6": +"readable-stream@npm:^2.0.6, readable-stream@npm:^2.2.2, readable-stream@npm:^2.3.0, readable-stream@npm:^2.3.5, readable-stream@npm:~2.3.6": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -12199,6 +12417,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^2.6.1": + version: 2.7.1 + resolution: "rimraf@npm:2.7.1" + dependencies: + glob: "npm:^7.1.3" + bin: + rimraf: ./bin.js + checksum: 10c0/4eef73d406c6940927479a3a9dee551e14a54faf54b31ef861250ac815172bade86cc6f7d64a4dc5e98b65e4b18a2e1c9ff3b68d296be0c748413f092bb0dd40 + languageName: node + linkType: hard + "rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -12365,7 +12594,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 10c0/6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 @@ -12400,7 +12629,7 @@ __metadata: languageName: node linkType: hard -"safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": +"safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0, safer-buffer@npm:^2.0.2, safer-buffer@npm:^2.1.0, safer-buffer@npm:~2.1.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" checksum: 10c0/7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 @@ -12495,7 +12724,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:2 || 3 || 4 || 5": +"semver@npm:2 || 3 || 4 || 5, semver@npm:^5.3.0": version: 5.7.2 resolution: "semver@npm:5.7.2" bin: @@ -12531,7 +12760,7 @@ __metadata: languageName: node linkType: hard -"set-blocking@npm:^2.0.0": +"set-blocking@npm:^2.0.0, set-blocking@npm:~2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" checksum: 10c0/9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 @@ -12669,7 +12898,7 @@ __metadata: languageName: node linkType: hard -"signal-exit@npm:^3.0.7": +"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" checksum: 10c0/25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 @@ -13364,6 +13593,21 @@ __metadata: languageName: node linkType: hard +"tar@npm:^4": + version: 4.4.19 + resolution: "tar@npm:4.4.19" + dependencies: + chownr: "npm:^1.1.4" + fs-minipass: "npm:^1.2.7" + minipass: "npm:^2.9.0" + minizlib: "npm:^1.3.3" + mkdirp: "npm:^0.5.5" + safe-buffer: "npm:^5.2.1" + yallist: "npm:^3.1.1" + checksum: 10c0/1a32a68feabd55e040f399f75fed37c35fd76202bb60e393986312cdee0175ff0dfd1aec9cc04ad2ade8a252d2a08c7d191fda877ce23f14a3da954d91d301d7 + languageName: node + linkType: hard + "tar@npm:^6.0.2, tar@npm:^6.1.11, tar@npm:^6.1.12, tar@npm:^6.1.2": version: 6.2.1 resolution: "tar@npm:6.2.1" @@ -14450,7 +14694,7 @@ __metadata: languageName: node linkType: hard -"wide-align@npm:^1.1.5": +"wide-align@npm:^1.1.0, wide-align@npm:^1.1.5": version: 1.1.5 resolution: "wide-align@npm:1.1.5" dependencies: @@ -14583,6 +14827,16 @@ __metadata: languageName: node linkType: hard +"xml2js@npm:^0.4.23": + version: 0.4.23 + resolution: "xml2js@npm:0.4.23" + dependencies: + sax: "npm:>=0.6.0" + xmlbuilder: "npm:~11.0.0" + checksum: 10c0/a3f41c9afc46d5bd0bea4070e5108777b605fd5ce2ebb978a68fd4c75513978ad5939f8135664ffea6f1adb342f391b1ba1584ed7955123b036e9ab8a1d26566 + languageName: node + linkType: hard + "xml2js@npm:^0.5.0": version: 0.5.0 resolution: "xml2js@npm:0.5.0" @@ -14663,7 +14917,7 @@ __metadata: languageName: node linkType: hard -"yallist@npm:^3.0.2": +"yallist@npm:^3.0.0, yallist@npm:^3.0.2, yallist@npm:^3.1.1": version: 3.1.1 resolution: "yallist@npm:3.1.1" checksum: 10c0/c66a5c46bc89af1625476f7f0f2ec3653c1a1791d2f9407cfb4c2ba812a1e1c9941416d71ba9719876530e3340a99925f697142989371b72d93b9ee628afd8c1 @@ -14762,6 +15016,18 @@ __metadata: languageName: node linkType: hard +"zipfile@npm:^0.5.11": + version: 0.5.12 + resolution: "zipfile@npm:0.5.12" + dependencies: + nan: "npm:~2.10.0" + node-pre-gyp: "npm:~0.10.2" + bin: + unzip.js: ./bin/unzip.js + checksum: 10c0/0813640a8f1b544b3b61f9039a8589f62f5d185c61b8ee282ee5d97115c99d0bf131cadbbe729b86dc1c147ed3196576eaac98175a64893ff4ead039521a5e7f + languageName: node + linkType: hard + "zod-to-json-schema@npm:^3.22.3": version: 3.24.1 resolution: "zod-to-json-schema@npm:3.24.1"