grab-url 1.6.0 → 1.6.2
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.
- package/README.md +1 -1
- package/dist/archiver-web.cjs.js +1 -1
- package/dist/archiver-web.cjs.js.map +1 -1
- package/dist/archiver-web.d.ts +10 -27
- package/dist/archiver-web.es.js +1 -1
- package/dist/archiver-web.es.js.map +1 -1
- package/dist/bin-compress.cjs.js +1 -1
- package/dist/bin-compress.cjs.js.map +1 -1
- package/dist/bin-compress.es.js +1 -1
- package/dist/bin-compress.es.js.map +1 -1
- package/dist/bin-extract.cjs.js +1 -1
- package/dist/bin-extract.cjs.js.map +1 -1
- package/dist/bin-extract.es.js +1 -1
- package/dist/bin-extract.es.js.map +1 -1
- package/dist/grab-api.cjs.js +1 -1
- package/dist/grab-api.cjs.js.map +1 -1
- package/dist/grab-api.d.ts +1 -1
- package/dist/grab-api.es.js +1 -1
- package/dist/grab-api.es.js.map +1 -1
- package/dist/grab-url-cli.cjs.js +1 -1
- package/dist/grab-url-cli.cjs.js.map +1 -1
- package/dist/grab-url-cli.d.ts +1 -1
- package/dist/grab-url-cli.es.js +1 -1
- package/dist/grab-url-cli.es.js.map +1 -1
- package/package.json +17 -13
package/README.md
CHANGED
package/dist/archiver-web.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("jszip");exports.compress=async function(t){const{files:r,outputName:o,compressionLevel:n=6}=t,i=new e;for(const{path:e,content:s}of r){let t;if("string"==typeof s)t=s;else if(s instanceof Uint8Array)t=s;else if(s instanceof ArrayBuffer)t=new Uint8Array(s);else{if(!(s instanceof Blob))throw new Error(`Unsupported content type for ${e}`);t=await s.arrayBuffer().then(e=>new Uint8Array(e))}i.file(e,t)}return{blob:await i.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:n}}),mime:"application/zip",downloadName:o}},exports.extract=async function(t){const{archiveBuffer:r,folderPath:o="",password:n}=t;if(!r)throw new Error("Must provide archiveBuffer");if(n)throw new Error("Password-protected archives are not supported");const i=await e.loadAsync(r),s=[];for(const[e,a]of Object.entries(i.files)){if(a.dir)continue;if(o&&!e.startsWith(o))continue;const t=o?e.slice(o.length).replace(/^\//,""):e;if(!t)continue;let r;const n=await a.async("uint8array"),i=n.byteLength;try{r=await a.async("text")}catch{r=btoa(String.fromCharCode(...n))}s.push({path:t,size:i,content:r,mime:"application/octet-stream"})}return s};
|
|
2
2
|
//# sourceMappingURL=archiver-web.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archiver-web.cjs.js","sources":["../packages/archiver-web/src/index.ts"],"sourcesContent":["/**\r\n * Universal Archive Extractor & Creator using libarchive.js (WASM).\r\n * Supports: ZIP/7z/RAR4/5/TAR + GZIP/BZIP2/LZMA. Node.js/browser.\r\n * No streaming extract (full download first). Create archives from files.\r\n * @module archiveUtils\r\n * @example\r\n * const files = await extractFolder({ archiveUrl: 'https://ex.zip', folderPath: 'src/' });\r\n * const archiveBlob = await createArchive({ files: [...], outputName: 'out.tar.gz' });\r\n */\r\n\r\n\r\nlet ArchiveClass: any = null;\r\n\r\n/** @internal For testing: inject a mock Archive class. */\r\nexport function _setArchiveClass(cls: any) {\r\n ArchiveClass = cls;\r\n}\r\n\r\nasync function ensureLibarchiveNode(): Promise<boolean> {\r\n // Skip in Cloudflare Workers\r\n if (typeof navigator !== 'undefined' && navigator.userAgent === 'Cloudflare-Workers') {\r\n return false;\r\n }\r\n\r\n // Check if already installed (silent resolve)\r\n try {\r\n require.resolve('libarchive.js');\r\n return true;\r\n } catch {}\r\n\r\n // Lazy load child_process and install globally\r\n let spawn: typeof import('child_process').spawn;\r\n try {\r\n const { spawn } = await import('node:child_process');\r\n await new Promise<void>((resolve) => {\r\n const proc = spawn('npm', ['i', '-g', 'libarchive.js'], { stdio: 'ignore' });\r\n proc.on('close', () => resolve());\r\n proc.on('error', () => resolve()); // npm unavailable: silent fail\r\n });\r\n return true;\r\n } catch {\r\n return false; // Silent fail if spawn/import fails\r\n }\r\n}\r\n\r\nasync function getArchive() {\r\n if (ArchiveClass) return ArchiveClass;\r\n\r\n if (typeof process !== 'undefined' && process?.versions?.node) {\r\n const installed = await ensureLibarchiveNode();\r\n if (!installed) {\r\n console.error('libarchive.js not available (install failed). Use browser fallback or manual npm i -g libarchive.js.');\r\n throw new Error('libarchive.js Node.js unavailable');\r\n }\r\n const mod = await import('libarchive.js/dist/libarchive-node.mjs');\r\n ArchiveClass = mod.Archive;\r\n } else {\r\n const mod = await import('libarchive.js/main.js');\r\n ArchiveClass = mod.Archive;\r\n ArchiveClass.init({\r\n workerUrl: 'libarchive.js/dist/worker-bundle.js'\r\n });\r\n }\r\n return ArchiveClass;\r\n}\r\n\r\n\r\nimport type { ExtractEvent, \r\n ArchiveCompression,\r\n ArchiveFormat,\r\n CreateOptions, \r\n ArchiveFile } from \"./types.js\";\r\n\r\n/**\r\n * Extract files from an archive ArrayBuffer.\r\n * @param options - Extract configuration\r\n * @param options.archiveBuffer - The archive to extract (ArrayBuffer)\r\n * @param options.folderPath - Folder to extract (e.g., 'src/'), empty=root\r\n * @param options.password - Optional password\r\n * @returns Array of extracted files\r\n * @throws Error on unsupported format\r\n */\r\nexport async function extract(options: {\r\n archiveBuffer: ArrayBuffer;\r\n folderPath?: string;\r\n password?: string;\r\n}): Promise<ExtractEvent[]> {\r\n const { archiveBuffer, folderPath = \"\", password } = options;\r\n\r\n if (!archiveBuffer) {\r\n throw new Error(\"Must provide archiveBuffer\");\r\n }\r\n const blob = new Blob([new Uint8Array(archiveBuffer)]);\r\n\r\n /** Open with libarchive.js */\r\n const Archive = await getArchive();\r\n const archive = await Archive.open(blob as File);\r\n if (password) await archive.usePassword(password);\r\n\r\n /** Get file tree */\r\n const filesObj = await archive.getFilesObject();\r\n const files: ExtractEvent[] = [];\r\n\r\n /**\r\n * Recursively walk file tree, filter by folderPath, extract matching files.\r\n * @param obj - Nested file/dir object\r\n * @param prefix - Current path prefix\r\n */\r\n const walker = async (obj: any, prefix: string = \"\"): Promise<void> => {\r\n for (const [name, entry] of Object.entries(obj)) {\r\n const fullPath = prefix ? `${prefix}/${name}` : name;\r\n if (fullPath.startsWith(folderPath) && !fullPath.endsWith(\"/\")) {\r\n const relativePath = fullPath\r\n .slice(folderPath.length)\r\n .replace(/^\\//, \"\");\r\n const fileBlob = await (entry as any).extract();\r\n let content: string;\r\n try {\r\n content = await fileBlob.text();\r\n } catch {\r\n const buffer = await fileBlob.arrayBuffer();\r\n content = btoa(String.fromCharCode(...new Uint8Array(buffer))); // Base64 binary\r\n }\r\n files.push({\r\n path: relativePath,\r\n size: fileBlob.size,\r\n content,\r\n mime: fileBlob.type || \"application/octet-stream\",\r\n });\r\n }\r\n if (typeof entry === 'object' && !(entry as any)?.extract) {\r\n // Subdir (directories don't have .extract, files do)\r\n await walker(entry, fullPath);\r\n }\r\n }\r\n };\r\n\r\n await walker(filesObj);\r\n return files;\r\n}\r\n\r\n\r\n\r\n/**\r\n * Create archive from files array.\r\n * @param options - Create configuration\r\n * @param options.files - Array of {path: string, content: string|Uint8Array|ArrayBuffer|Blob}\r\n * @param options.outputName - Archive filename (e.g., 'out.tar.gz')\r\n * @param options.format - Archive format (defaults USTAR)\r\n * @param options.compression - Compression (defaults NONE)\r\n * @param options.compressionLevel - 1-9 (defaults 6, format-dependent)\r\n * @param options.passphrase - Optional password\r\n * @returns Blob of archive (download/save as)\r\n * @throws Error on invalid options\r\n */\r\nexport async function compress(\r\n options: CreateOptions,\r\n): Promise<ArchiveFile> {\r\n const {\r\n files,\r\n outputName,\r\n format = \"USTAR\",\r\n compression = \"NONE\",\r\n compressionLevel = 6,\r\n passphrase,\r\n } = options;\r\n\r\n /** Convert files to Blobs with pathnames */\r\n const archiveFiles: { file: Blob; pathname: string }[] = files.map(\r\n ({ path, content }) => {\r\n let blobContent: Blob;\r\n if (typeof content === \"string\") {\r\n blobContent = new Blob([content]);\r\n } else if (content instanceof Uint8Array) {\r\n blobContent = new Blob([content as BlobPart]);\r\n } else if (content instanceof ArrayBuffer) {\r\n blobContent = new Blob([content]);\r\n } else if (content instanceof Blob) {\r\n blobContent = content;\r\n } else {\r\n throw new Error(`Unsupported content type for ${path}`);\r\n }\r\n return { file: blobContent, pathname: path };\r\n },\r\n );\r\n\r\n /** Create archive */\r\n const Archive = await getArchive();\r\n //@ts-ignore\r\n const archiveBlob = await Archive.write({\r\n files: archiveFiles,\r\n outputFileName: outputName,\r\n compression,\r\n format,\r\n compressionLevel, // Passed if supported\r\n passphrase: passphrase || null,\r\n });\r\n\r\n return {\r\n blob: archiveBlob,\r\n mime: \"application/zip\", // Adjust per format\r\n downloadName: outputName,\r\n };\r\n}\r\n\r\nexport type { ArchiveFormat, ArchiveCompression };\r\nexport type { ExtractEvent, CreateOptions, ArchiveFile };\r\n"],"names":["ArchiveClass","async","getArchive","process","versions","node","navigator","userAgent","require","resolve","spawn","import","Promise","proc","stdio","on","ensureLibarchiveNode","console","error","Error","mod","Archive","init","workerUrl","cls","options","files","outputName","format","compression","compressionLevel","passphrase","archiveFiles","map","path","content","blobContent","Blob","Uint8Array","ArrayBuffer","file","pathname","blob","write","outputFileName","mime","downloadName","archiveBuffer","folderPath","password","archive","open","usePassword","filesObj","getFilesObject","walker","obj","prefix","name","entry","Object","entries","fullPath","startsWith","endsWith","relativePath","slice","length","replace","fileBlob","extract","text","buffer","arrayBuffer","btoa","String","fromCharCode","push","size","type"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"archiver-web.cjs.js","sources":["../packages/archiver-web/src/index.ts"],"sourcesContent":["/**\r\n * Universal Archive Extractor & Creator using JSZip (pure JS).\r\n * Supports ZIP format. Works in Node.js and browser with no WASM/workers.\r\n * @module archiveUtils\r\n * @example\r\n * const files = await extract({ archiveBuffer: buf, folderPath: 'src/' });\r\n * const archiveBlob = await compress({ files: [...], outputName: 'out.zip' });\r\n */\r\n\r\nimport JSZip from \"jszip\";\r\n\r\nimport type {\r\n ExtractEvent,\r\n CreateOptions,\r\n ArchiveFile,\r\n} from \"./types.js\";\r\n\r\n/**\r\n * Extract files from a ZIP ArrayBuffer.\r\n * @param options - Extract configuration\r\n * @param options.archiveBuffer - The archive to extract (ArrayBuffer)\r\n * @param options.folderPath - Folder to extract (e.g., 'src/'), empty=root\r\n * @param options.password - Optional password (not supported by JSZip - throws if provided)\r\n * @returns Array of extracted files\r\n */\r\nexport async function extract(options: {\r\n archiveBuffer: ArrayBuffer;\r\n folderPath?: string;\r\n password?: string;\r\n}): Promise<ExtractEvent[]> {\r\n const { archiveBuffer, folderPath = \"\", password } = options;\r\n\r\n if (!archiveBuffer) {\r\n throw new Error(\"Must provide archiveBuffer\");\r\n }\r\n\r\n if (password) {\r\n throw new Error(\"Password-protected archives are not supported\");\r\n }\r\n\r\n const zip = await JSZip.loadAsync(archiveBuffer);\r\n const files: ExtractEvent[] = [];\r\n\r\n for (const [relativePath, zipEntry] of Object.entries(zip.files)) {\r\n if (zipEntry.dir) continue;\r\n\r\n if (folderPath && !relativePath.startsWith(folderPath)) continue;\r\n\r\n const strippedPath = folderPath\r\n ? relativePath.slice(folderPath.length).replace(/^\\//, \"\")\r\n : relativePath;\r\n\r\n if (!strippedPath) continue;\r\n\r\n let content: string;\r\n const data = await zipEntry.async(\"uint8array\");\r\n const size = data.byteLength;\r\n\r\n try {\r\n content = await zipEntry.async(\"text\");\r\n } catch {\r\n content = btoa(String.fromCharCode(...data));\r\n }\r\n\r\n files.push({ path: strippedPath, size, content, mime: \"application/octet-stream\" });\r\n }\r\n\r\n return files;\r\n}\r\n\r\n/**\r\n * Create a ZIP archive from files array.\r\n * @param options - Create configuration\r\n * @param options.files - Array of {path, content} pairs\r\n * @param options.outputName - Archive filename (e.g., 'out.zip')\r\n * @param options.compressionLevel - 1-9 (defaults 6)\r\n * @returns Blob of archive\r\n */\r\nexport async function compress(options: CreateOptions): Promise<ArchiveFile> {\r\n const {\r\n files,\r\n outputName,\r\n compressionLevel = 6,\r\n } = options;\r\n\r\n const zip = new JSZip();\r\n\r\n for (const { path, content } of files) {\r\n let data: string | Uint8Array | ArrayBuffer | Blob;\r\n if (typeof content === \"string\") {\r\n data = content;\r\n } else if (content instanceof Uint8Array) {\r\n data = content;\r\n } else if (content instanceof ArrayBuffer) {\r\n data = new Uint8Array(content);\r\n } else if (content instanceof Blob) {\r\n data = await content.arrayBuffer().then((b) => new Uint8Array(b));\r\n } else {\r\n throw new Error(`Unsupported content type for ${path}`);\r\n }\r\n zip.file(path, data);\r\n }\r\n\r\n const blob = await zip.generateAsync({\r\n type: \"blob\",\r\n compression: \"DEFLATE\",\r\n compressionOptions: { level: compressionLevel },\r\n });\r\n\r\n return {\r\n blob,\r\n mime: \"application/zip\",\r\n downloadName: outputName,\r\n };\r\n}\r\n\r\nexport type { ExtractEvent, CreateOptions, ArchiveFile };\r\n"],"names":["async","options","files","outputName","compressionLevel","zip","JSZip","path","content","data","Uint8Array","ArrayBuffer","Blob","Error","arrayBuffer","then","b","file","blob","generateAsync","type","compression","compressionOptions","level","mime","downloadName","archiveBuffer","folderPath","password","loadAsync","relativePath","zipEntry","Object","entries","dir","startsWith","strippedPath","slice","length","replace","size","byteLength","btoa","String","fromCharCode","push"],"mappings":"0HA8EAA,eAA+BC,GAC7B,MAAMC,MACJA,EAAAC,WACAA,EAAAC,iBACAA,EAAmB,GACjBH,EAEEI,EAAM,IAAIC,EAEhB,IAAA,MAAWC,KAAEA,EAAAC,QAAMA,KAAaN,EAAO,CACrC,IAAIO,EACJ,GAAuB,iBAAZD,EACTC,EAAOD,OACT,GAAWA,aAAmBE,WAC5BD,EAAOD,OACT,GAAWA,aAAmBG,YAC5BF,EAAO,IAAIC,WAAWF,OACxB,MAAWA,aAAmBI,MAG5B,MAAM,IAAIC,MAAM,gCAAgCN,KAFhDE,QAAaD,EAAQM,cAAcC,KAAMC,GAAM,IAAIN,WAAWM,GAGhE,CACAX,EAAIY,KAAKV,EAAME,EACjB,CAQA,MAAO,CACLS,WAPiBb,EAAIc,cAAc,CACnCC,KAAM,OACNC,YAAa,UACbC,mBAAoB,CAAEC,MAAOnB,KAK7BoB,KAAM,kBACNC,aAActB,EAElB,kBAzFAH,eAA8BC,GAK5B,MAAMyB,cAAEA,EAAAC,WAAeA,EAAa,GAAAC,SAAIA,GAAa3B,EAErD,IAAKyB,EACH,MAAM,IAAIb,MAAM,8BAGlB,GAAIe,EACF,MAAM,IAAIf,MAAM,iDAGlB,MAAMR,QAAYC,EAAMuB,UAAUH,GAC5BxB,EAAwB,GAE9B,IAAA,MAAY4B,EAAcC,KAAaC,OAAOC,QAAQ5B,EAAIH,OAAQ,CAChE,GAAI6B,EAASG,IAAK,SAElB,GAAIP,IAAeG,EAAaK,WAAWR,GAAa,SAExD,MAAMS,EAAeT,EACjBG,EAAaO,MAAMV,EAAWW,QAAQC,QAAQ,MAAO,IACrDT,EAEJ,IAAKM,EAAc,SAEnB,IAAI5B,EACJ,MAAMC,QAAasB,EAAS/B,MAAM,cAC5BwC,EAAO/B,EAAKgC,WAElB,IACEjC,QAAgBuB,EAAS/B,MAAM,OACjC,CAAA,MACEQ,EAAUkC,KAAKC,OAAOC,gBAAgBnC,GACxC,CAEAP,EAAM2C,KAAK,CAAEtC,KAAM6B,EAAcI,OAAMhC,UAASgB,KAAM,4BACxD,CAEA,OAAOtB,CACT"}
|
package/dist/archiver-web.d.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
export declare type ArchiveCompression = "NONE" | "GZIP" | "BZIP2" | "LZMA" | "XZ";
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* Created archive result.
|
|
5
3
|
*/
|
|
@@ -12,24 +10,18 @@ export declare interface ArchiveFile {
|
|
|
12
10
|
downloadName: string;
|
|
13
11
|
}
|
|
14
12
|
|
|
15
|
-
export declare type ArchiveFormat = "ZIP" | "USTAR" | "_7ZIP" | "RAW" | "XAR" | "CPIO_NEWC";
|
|
16
|
-
|
|
17
13
|
/**
|
|
18
|
-
* Create archive from files array.
|
|
14
|
+
* Create a ZIP archive from files array.
|
|
19
15
|
* @param options - Create configuration
|
|
20
|
-
* @param options.files - Array of {path
|
|
21
|
-
* @param options.outputName - Archive filename (e.g., 'out.
|
|
22
|
-
* @param options.
|
|
23
|
-
* @
|
|
24
|
-
* @param options.compressionLevel - 1-9 (defaults 6, format-dependent)
|
|
25
|
-
* @param options.passphrase - Optional password
|
|
26
|
-
* @returns Blob of archive (download/save as)
|
|
27
|
-
* @throws Error on invalid options
|
|
16
|
+
* @param options.files - Array of {path, content} pairs
|
|
17
|
+
* @param options.outputName - Archive filename (e.g., 'out.zip')
|
|
18
|
+
* @param options.compressionLevel - 1-9 (defaults 6)
|
|
19
|
+
* @returns Blob of archive
|
|
28
20
|
*/
|
|
29
21
|
export declare function compress(options: CreateOptions): Promise<ArchiveFile>;
|
|
30
22
|
|
|
31
23
|
/**
|
|
32
|
-
* Options for
|
|
24
|
+
* Options for compress().
|
|
33
25
|
*/
|
|
34
26
|
export declare interface CreateOptions {
|
|
35
27
|
/** Files to pack: path/content pairs */
|
|
@@ -37,26 +29,19 @@ export declare interface CreateOptions {
|
|
|
37
29
|
path: string;
|
|
38
30
|
content: string | Uint8Array | ArrayBuffer | Blob;
|
|
39
31
|
}>;
|
|
40
|
-
/** Output filename (.
|
|
32
|
+
/** Output filename (.zip) */
|
|
41
33
|
outputName: string;
|
|
42
|
-
/**
|
|
43
|
-
format?: ArchiveFormat;
|
|
44
|
-
/** Compression type */
|
|
45
|
-
compression?: ArchiveCompression;
|
|
46
|
-
/** Compression level 1-9 */
|
|
34
|
+
/** Compression level 1-9 (default 6) */
|
|
47
35
|
compressionLevel?: number;
|
|
48
|
-
/** Password */
|
|
49
|
-
passphrase?: string;
|
|
50
36
|
}
|
|
51
37
|
|
|
52
38
|
/**
|
|
53
|
-
* Extract files from
|
|
39
|
+
* Extract files from a ZIP ArrayBuffer.
|
|
54
40
|
* @param options - Extract configuration
|
|
55
41
|
* @param options.archiveBuffer - The archive to extract (ArrayBuffer)
|
|
56
42
|
* @param options.folderPath - Folder to extract (e.g., 'src/'), empty=root
|
|
57
|
-
* @param options.password - Optional password
|
|
43
|
+
* @param options.password - Optional password (not supported by JSZip - throws if provided)
|
|
58
44
|
* @returns Array of extracted files
|
|
59
|
-
* @throws Error on unsupported format
|
|
60
45
|
*/
|
|
61
46
|
export declare function extract(options: {
|
|
62
47
|
archiveBuffer: ArrayBuffer;
|
|
@@ -78,6 +63,4 @@ export declare interface ExtractEvent {
|
|
|
78
63
|
mime: string;
|
|
79
64
|
}
|
|
80
65
|
|
|
81
|
-
/* Excluded from this release type: _setArchiveClass */
|
|
82
|
-
|
|
83
66
|
export { }
|
package/dist/archiver-web.es.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import t from"jszip";async function e(e){const{archiveBuffer:n,folderPath:r="",password:o}=e;if(!n)throw new Error("Must provide archiveBuffer");if(o)throw new Error("Password-protected archives are not supported");const i=await t.loadAsync(n),a=[];for(const[t,s]of Object.entries(i.files)){if(s.dir)continue;if(r&&!t.startsWith(r))continue;const e=r?t.slice(r.length).replace(/^\//,""):t;if(!e)continue;let n;const o=await s.async("uint8array"),i=o.byteLength;try{n=await s.async("text")}catch{n=btoa(String.fromCharCode(...o))}a.push({path:e,size:i,content:n,mime:"application/octet-stream"})}return a}async function n(e){const{files:n,outputName:r,compressionLevel:o=6}=e,i=new t;for(const{path:t,content:a}of n){let e;if("string"==typeof a)e=a;else if(a instanceof Uint8Array)e=a;else if(a instanceof ArrayBuffer)e=new Uint8Array(a);else{if(!(a instanceof Blob))throw new Error(`Unsupported content type for ${t}`);e=await a.arrayBuffer().then(t=>new Uint8Array(t))}i.file(t,e)}return{blob:await i.generateAsync({type:"blob",compression:"DEFLATE",compressionOptions:{level:o}}),mime:"application/zip",downloadName:r}}export{n as compress,e as extract};
|
|
2
2
|
//# sourceMappingURL=archiver-web.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archiver-web.es.js","sources":["../packages/archiver-web/src/index.ts"],"sourcesContent":["/**\r\n * Universal Archive Extractor & Creator using libarchive.js (WASM).\r\n * Supports: ZIP/7z/RAR4/5/TAR + GZIP/BZIP2/LZMA. Node.js/browser.\r\n * No streaming extract (full download first). Create archives from files.\r\n * @module archiveUtils\r\n * @example\r\n * const files = await extractFolder({ archiveUrl: 'https://ex.zip', folderPath: 'src/' });\r\n * const archiveBlob = await createArchive({ files: [...], outputName: 'out.tar.gz' });\r\n */\r\n\r\n\r\nlet ArchiveClass: any = null;\r\n\r\n/** @internal For testing: inject a mock Archive class. */\r\nexport function _setArchiveClass(cls: any) {\r\n ArchiveClass = cls;\r\n}\r\n\r\nasync function ensureLibarchiveNode(): Promise<boolean> {\r\n // Skip in Cloudflare Workers\r\n if (typeof navigator !== 'undefined' && navigator.userAgent === 'Cloudflare-Workers') {\r\n return false;\r\n }\r\n\r\n // Check if already installed (silent resolve)\r\n try {\r\n require.resolve('libarchive.js');\r\n return true;\r\n } catch {}\r\n\r\n // Lazy load child_process and install globally\r\n let spawn: typeof import('child_process').spawn;\r\n try {\r\n const { spawn } = await import('node:child_process');\r\n await new Promise<void>((resolve) => {\r\n const proc = spawn('npm', ['i', '-g', 'libarchive.js'], { stdio: 'ignore' });\r\n proc.on('close', () => resolve());\r\n proc.on('error', () => resolve()); // npm unavailable: silent fail\r\n });\r\n return true;\r\n } catch {\r\n return false; // Silent fail if spawn/import fails\r\n }\r\n}\r\n\r\nasync function getArchive() {\r\n if (ArchiveClass) return ArchiveClass;\r\n\r\n if (typeof process !== 'undefined' && process?.versions?.node) {\r\n const installed = await ensureLibarchiveNode();\r\n if (!installed) {\r\n console.error('libarchive.js not available (install failed). Use browser fallback or manual npm i -g libarchive.js.');\r\n throw new Error('libarchive.js Node.js unavailable');\r\n }\r\n const mod = await import('libarchive.js/dist/libarchive-node.mjs');\r\n ArchiveClass = mod.Archive;\r\n } else {\r\n const mod = await import('libarchive.js/main.js');\r\n ArchiveClass = mod.Archive;\r\n ArchiveClass.init({\r\n workerUrl: 'libarchive.js/dist/worker-bundle.js'\r\n });\r\n }\r\n return ArchiveClass;\r\n}\r\n\r\n\r\nimport type { ExtractEvent, \r\n ArchiveCompression,\r\n ArchiveFormat,\r\n CreateOptions, \r\n ArchiveFile } from \"./types.js\";\r\n\r\n/**\r\n * Extract files from an archive ArrayBuffer.\r\n * @param options - Extract configuration\r\n * @param options.archiveBuffer - The archive to extract (ArrayBuffer)\r\n * @param options.folderPath - Folder to extract (e.g., 'src/'), empty=root\r\n * @param options.password - Optional password\r\n * @returns Array of extracted files\r\n * @throws Error on unsupported format\r\n */\r\nexport async function extract(options: {\r\n archiveBuffer: ArrayBuffer;\r\n folderPath?: string;\r\n password?: string;\r\n}): Promise<ExtractEvent[]> {\r\n const { archiveBuffer, folderPath = \"\", password } = options;\r\n\r\n if (!archiveBuffer) {\r\n throw new Error(\"Must provide archiveBuffer\");\r\n }\r\n const blob = new Blob([new Uint8Array(archiveBuffer)]);\r\n\r\n /** Open with libarchive.js */\r\n const Archive = await getArchive();\r\n const archive = await Archive.open(blob as File);\r\n if (password) await archive.usePassword(password);\r\n\r\n /** Get file tree */\r\n const filesObj = await archive.getFilesObject();\r\n const files: ExtractEvent[] = [];\r\n\r\n /**\r\n * Recursively walk file tree, filter by folderPath, extract matching files.\r\n * @param obj - Nested file/dir object\r\n * @param prefix - Current path prefix\r\n */\r\n const walker = async (obj: any, prefix: string = \"\"): Promise<void> => {\r\n for (const [name, entry] of Object.entries(obj)) {\r\n const fullPath = prefix ? `${prefix}/${name}` : name;\r\n if (fullPath.startsWith(folderPath) && !fullPath.endsWith(\"/\")) {\r\n const relativePath = fullPath\r\n .slice(folderPath.length)\r\n .replace(/^\\//, \"\");\r\n const fileBlob = await (entry as any).extract();\r\n let content: string;\r\n try {\r\n content = await fileBlob.text();\r\n } catch {\r\n const buffer = await fileBlob.arrayBuffer();\r\n content = btoa(String.fromCharCode(...new Uint8Array(buffer))); // Base64 binary\r\n }\r\n files.push({\r\n path: relativePath,\r\n size: fileBlob.size,\r\n content,\r\n mime: fileBlob.type || \"application/octet-stream\",\r\n });\r\n }\r\n if (typeof entry === 'object' && !(entry as any)?.extract) {\r\n // Subdir (directories don't have .extract, files do)\r\n await walker(entry, fullPath);\r\n }\r\n }\r\n };\r\n\r\n await walker(filesObj);\r\n return files;\r\n}\r\n\r\n\r\n\r\n/**\r\n * Create archive from files array.\r\n * @param options - Create configuration\r\n * @param options.files - Array of {path: string, content: string|Uint8Array|ArrayBuffer|Blob}\r\n * @param options.outputName - Archive filename (e.g., 'out.tar.gz')\r\n * @param options.format - Archive format (defaults USTAR)\r\n * @param options.compression - Compression (defaults NONE)\r\n * @param options.compressionLevel - 1-9 (defaults 6, format-dependent)\r\n * @param options.passphrase - Optional password\r\n * @returns Blob of archive (download/save as)\r\n * @throws Error on invalid options\r\n */\r\nexport async function compress(\r\n options: CreateOptions,\r\n): Promise<ArchiveFile> {\r\n const {\r\n files,\r\n outputName,\r\n format = \"USTAR\",\r\n compression = \"NONE\",\r\n compressionLevel = 6,\r\n passphrase,\r\n } = options;\r\n\r\n /** Convert files to Blobs with pathnames */\r\n const archiveFiles: { file: Blob; pathname: string }[] = files.map(\r\n ({ path, content }) => {\r\n let blobContent: Blob;\r\n if (typeof content === \"string\") {\r\n blobContent = new Blob([content]);\r\n } else if (content instanceof Uint8Array) {\r\n blobContent = new Blob([content as BlobPart]);\r\n } else if (content instanceof ArrayBuffer) {\r\n blobContent = new Blob([content]);\r\n } else if (content instanceof Blob) {\r\n blobContent = content;\r\n } else {\r\n throw new Error(`Unsupported content type for ${path}`);\r\n }\r\n return { file: blobContent, pathname: path };\r\n },\r\n );\r\n\r\n /** Create archive */\r\n const Archive = await getArchive();\r\n //@ts-ignore\r\n const archiveBlob = await Archive.write({\r\n files: archiveFiles,\r\n outputFileName: outputName,\r\n compression,\r\n format,\r\n compressionLevel, // Passed if supported\r\n passphrase: passphrase || null,\r\n });\r\n\r\n return {\r\n blob: archiveBlob,\r\n mime: \"application/zip\", // Adjust per format\r\n downloadName: outputName,\r\n };\r\n}\r\n\r\nexport type { ArchiveFormat, ArchiveCompression };\r\nexport type { ExtractEvent, CreateOptions, ArchiveFile };\r\n"],"names":["ArchiveClass","_setArchiveClass","cls","async","getArchive","process","versions","node","navigator","userAgent","require","resolve","spawn","import","Promise","proc","stdio","on","ensureLibarchiveNode","console","error","Error","mod","Archive","init","workerUrl","extract","options","archiveBuffer","folderPath","password","blob","Blob","Uint8Array","archive","open","usePassword","filesObj","getFilesObject","files","walker","obj","prefix","name","entry","Object","entries","fullPath","startsWith","endsWith","relativePath","slice","length","replace","fileBlob","content","text","buffer","arrayBuffer","btoa","String","fromCharCode","push","path","size","mime","type","compress","outputName","format","compression","compressionLevel","passphrase","archiveFiles","map","blobContent","ArrayBuffer","file","pathname","write","outputFileName","downloadName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"archiver-web.es.js","sources":["../packages/archiver-web/src/index.ts"],"sourcesContent":["/**\r\n * Universal Archive Extractor & Creator using JSZip (pure JS).\r\n * Supports ZIP format. Works in Node.js and browser with no WASM/workers.\r\n * @module archiveUtils\r\n * @example\r\n * const files = await extract({ archiveBuffer: buf, folderPath: 'src/' });\r\n * const archiveBlob = await compress({ files: [...], outputName: 'out.zip' });\r\n */\r\n\r\nimport JSZip from \"jszip\";\r\n\r\nimport type {\r\n ExtractEvent,\r\n CreateOptions,\r\n ArchiveFile,\r\n} from \"./types.js\";\r\n\r\n/**\r\n * Extract files from a ZIP ArrayBuffer.\r\n * @param options - Extract configuration\r\n * @param options.archiveBuffer - The archive to extract (ArrayBuffer)\r\n * @param options.folderPath - Folder to extract (e.g., 'src/'), empty=root\r\n * @param options.password - Optional password (not supported by JSZip - throws if provided)\r\n * @returns Array of extracted files\r\n */\r\nexport async function extract(options: {\r\n archiveBuffer: ArrayBuffer;\r\n folderPath?: string;\r\n password?: string;\r\n}): Promise<ExtractEvent[]> {\r\n const { archiveBuffer, folderPath = \"\", password } = options;\r\n\r\n if (!archiveBuffer) {\r\n throw new Error(\"Must provide archiveBuffer\");\r\n }\r\n\r\n if (password) {\r\n throw new Error(\"Password-protected archives are not supported\");\r\n }\r\n\r\n const zip = await JSZip.loadAsync(archiveBuffer);\r\n const files: ExtractEvent[] = [];\r\n\r\n for (const [relativePath, zipEntry] of Object.entries(zip.files)) {\r\n if (zipEntry.dir) continue;\r\n\r\n if (folderPath && !relativePath.startsWith(folderPath)) continue;\r\n\r\n const strippedPath = folderPath\r\n ? relativePath.slice(folderPath.length).replace(/^\\//, \"\")\r\n : relativePath;\r\n\r\n if (!strippedPath) continue;\r\n\r\n let content: string;\r\n const data = await zipEntry.async(\"uint8array\");\r\n const size = data.byteLength;\r\n\r\n try {\r\n content = await zipEntry.async(\"text\");\r\n } catch {\r\n content = btoa(String.fromCharCode(...data));\r\n }\r\n\r\n files.push({ path: strippedPath, size, content, mime: \"application/octet-stream\" });\r\n }\r\n\r\n return files;\r\n}\r\n\r\n/**\r\n * Create a ZIP archive from files array.\r\n * @param options - Create configuration\r\n * @param options.files - Array of {path, content} pairs\r\n * @param options.outputName - Archive filename (e.g., 'out.zip')\r\n * @param options.compressionLevel - 1-9 (defaults 6)\r\n * @returns Blob of archive\r\n */\r\nexport async function compress(options: CreateOptions): Promise<ArchiveFile> {\r\n const {\r\n files,\r\n outputName,\r\n compressionLevel = 6,\r\n } = options;\r\n\r\n const zip = new JSZip();\r\n\r\n for (const { path, content } of files) {\r\n let data: string | Uint8Array | ArrayBuffer | Blob;\r\n if (typeof content === \"string\") {\r\n data = content;\r\n } else if (content instanceof Uint8Array) {\r\n data = content;\r\n } else if (content instanceof ArrayBuffer) {\r\n data = new Uint8Array(content);\r\n } else if (content instanceof Blob) {\r\n data = await content.arrayBuffer().then((b) => new Uint8Array(b));\r\n } else {\r\n throw new Error(`Unsupported content type for ${path}`);\r\n }\r\n zip.file(path, data);\r\n }\r\n\r\n const blob = await zip.generateAsync({\r\n type: \"blob\",\r\n compression: \"DEFLATE\",\r\n compressionOptions: { level: compressionLevel },\r\n });\r\n\r\n return {\r\n blob,\r\n mime: \"application/zip\",\r\n downloadName: outputName,\r\n };\r\n}\r\n\r\nexport type { ExtractEvent, CreateOptions, ArchiveFile };\r\n"],"names":["async","extract","options","archiveBuffer","folderPath","password","Error","zip","JSZip","loadAsync","files","relativePath","zipEntry","Object","entries","dir","startsWith","strippedPath","slice","length","replace","content","data","size","byteLength","btoa","String","fromCharCode","push","path","mime","compress","outputName","compressionLevel","Uint8Array","ArrayBuffer","Blob","arrayBuffer","then","b","file","blob","generateAsync","type","compression","compressionOptions","level","downloadName"],"mappings":"qBAyBAA,eAAsBC,EAAQC,GAK5B,MAAMC,cAAEA,EAAAC,WAAeA,EAAa,GAAAC,SAAIA,GAAaH,EAErD,IAAKC,EACH,MAAM,IAAIG,MAAM,8BAGlB,GAAID,EACF,MAAM,IAAIC,MAAM,iDAGlB,MAAMC,QAAYC,EAAMC,UAAUN,GAC5BO,EAAwB,GAE9B,IAAA,MAAYC,EAAcC,KAAaC,OAAOC,QAAQP,EAAIG,OAAQ,CAChE,GAAIE,EAASG,IAAK,SAElB,GAAIX,IAAeO,EAAaK,WAAWZ,GAAa,SAExD,MAAMa,EAAeb,EACjBO,EAAaO,MAAMd,EAAWe,QAAQC,QAAQ,MAAO,IACrDT,EAEJ,IAAKM,EAAc,SAEnB,IAAII,EACJ,MAAMC,QAAaV,EAASZ,MAAM,cAC5BuB,EAAOD,EAAKE,WAElB,IACEH,QAAgBT,EAASZ,MAAM,OACjC,CAAA,MACEqB,EAAUI,KAAKC,OAAOC,gBAAgBL,GACxC,CAEAZ,EAAMkB,KAAK,CAAEC,KAAMZ,EAAcM,OAAMF,UAASS,KAAM,4BACxD,CAEA,OAAOpB,CACT,CAUAV,eAAsB+B,EAAS7B,GAC7B,MAAMQ,MACJA,EAAAsB,WACAA,EAAAC,iBACAA,EAAmB,GACjB/B,EAEEK,EAAM,IAAIC,EAEhB,IAAA,MAAWqB,KAAEA,EAAAR,QAAMA,KAAaX,EAAO,CACrC,IAAIY,EACJ,GAAuB,iBAAZD,EACTC,EAAOD,OACT,GAAWA,aAAmBa,WAC5BZ,EAAOD,OACT,GAAWA,aAAmBc,YAC5Bb,EAAO,IAAIY,WAAWb,OACxB,MAAWA,aAAmBe,MAG5B,MAAM,IAAI9B,MAAM,gCAAgCuB,KAFhDP,QAAaD,EAAQgB,cAAcC,KAAMC,GAAM,IAAIL,WAAWK,GAGhE,CACAhC,EAAIiC,KAAKX,EAAMP,EACjB,CAQA,MAAO,CACLmB,WAPiBlC,EAAImC,cAAc,CACnCC,KAAM,OACNC,YAAa,UACbC,mBAAoB,CAAEC,MAAOb,KAK7BH,KAAM,kBACNiB,aAAcf,EAElB"}
|
package/dist/bin-compress.cjs.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";const e=require("util"),o=require("fs"),r=require("path"),t=require("./archiver-web.cjs.js");function s(e){const o=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const r in e)if("default"!==r){const t=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(o,r,t.get?t:{enumerable:!0,get:()=>e[r]})}return o.default=e,Object.freeze(o)}const n=s(o),i=s(r);(async function(){const{values:o,positionals:r}=e.parseArgs({args:process.argv.slice(2),options:{
|
|
2
|
+
"use strict";const e=require("util"),o=require("fs"),r=require("path"),t=require("./archiver-web.cjs.js");function s(e){const o=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const r in e)if("default"!==r){const t=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(o,r,t.get?t:{enumerable:!0,get:()=>e[r]})}return o.default=e,Object.freeze(o)}const n=s(o),i=s(r);(async function(){const{values:o,positionals:r}=e.parseArgs({args:process.argv.slice(2),options:{out:{type:"string",short:"o"},level:{type:"string",short:"l",default:"6"},help:{type:"boolean",short:"h"}},allowPositionals:!0});o.help&&(console.error("Usage: compress [files...] [options]"),console.error("If [files...] are omitted, reads from stdin."),console.error("Options:"),console.error(" -o, --out <file> Output file. If absent and not TTY, outputs to stdout."),console.error(" -l, --level <1-9> Compression level (default: 6)."),process.exit(0));const s=[];if(r.length>0)for(const e of r){n.statSync(e).isDirectory()&&(console.error("Directory archiving not supported yet ("+e+")"),process.exit(1));const o=n.readFileSync(e);s.push({path:i.basename(e),content:new Blob([new Uint8Array(o)])})}else{process.stdin.isTTY&&(console.error("Error: Must provide files to archive or pipe input via stdin."),process.exit(1));const e=await async function(e){const o=[];for await(const r of e)o.push(Buffer.from(r));return Buffer.concat(o)}(process.stdin);s.push({path:"piped-content",content:new Blob([new Uint8Array(e)])})}const c=await t.compress({files:s,outputName:o.out?i.basename(o.out):"archive.zip",compressionLevel:parseInt(o.level||"6",10)}),a=Buffer.from(await c.blob.arrayBuffer());o.out?(n.writeFileSync(i.resolve(o.out),a),console.error("Created archive at "+o.out)):process.stdout.write(a)})().catch(e=>{console.error("Compress Error:",e),process.exit(1)});
|
|
3
3
|
//# sourceMappingURL=bin-compress.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin-compress.cjs.js","sources":["../packages/archiver-web/src/bin-compress.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"bin-compress.cjs.js","sources":["../packages/archiver-web/src/bin-compress.ts"],"sourcesContent":["import { parseArgs } from \"util\";\r\nimport * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport { compress } from \"./index.js\";\r\n\r\nasync function readStreamToBuffer(stream: NodeJS.ReadStream): Promise<Buffer> {\r\n const chunks: Buffer[] = [];\r\n for await (const chunk of stream) {\r\n chunks.push(Buffer.from(chunk));\r\n }\r\n return Buffer.concat(chunks);\r\n}\r\n\r\nasync function main() {\r\n const options = {\r\n out: { type: \"string\" as const, short: \"o\" },\r\n level: { type: \"string\" as const, short: \"l\", default: \"6\" },\r\n help: { type: \"boolean\" as const, short: \"h\" },\r\n };\r\n\r\n const { values, positionals } = parseArgs({\r\n args: process.argv.slice(2),\r\n options,\r\n allowPositionals: true,\r\n });\r\n\r\n if (values.help) {\r\n console.error(\"Usage: compress [files...] [options]\");\r\n console.error(\"If [files...] are omitted, reads from stdin.\");\r\n console.error(\"Options:\");\r\n console.error(\" -o, --out <file> Output file. If absent and not TTY, outputs to stdout.\");\r\n console.error(\" -l, --level <1-9> Compression level (default: 6).\");\r\n process.exit(0);\r\n }\r\n\r\n const filesToArchive: Array<{ path: string; content: Blob | string }> = [];\r\n\r\n if (positionals.length > 0) {\r\n for (const filePath of positionals) {\r\n const stat = fs.statSync(filePath);\r\n if (stat.isDirectory()) {\r\n console.error(\"Directory archiving not supported yet (\" + filePath + \")\");\r\n process.exit(1);\r\n }\r\n const buf = fs.readFileSync(filePath);\r\n filesToArchive.push({\r\n path: path.basename(filePath),\r\n content: new Blob([new Uint8Array(buf)]),\r\n });\r\n }\r\n } else {\r\n if (process.stdin.isTTY) {\r\n console.error(\"Error: Must provide files to archive or pipe input via stdin.\");\r\n process.exit(1);\r\n }\r\n const stdinBuffer = await readStreamToBuffer(process.stdin);\r\n filesToArchive.push({\r\n path: \"piped-content\",\r\n content: new Blob([new Uint8Array(stdinBuffer)]),\r\n });\r\n }\r\n\r\n const archive = await compress({\r\n files: filesToArchive,\r\n outputName: values.out ? path.basename(values.out) : \"archive.zip\",\r\n compressionLevel: parseInt(values.level || \"6\", 10),\r\n });\r\n\r\n const archiveBuffer = Buffer.from(await archive.blob.arrayBuffer());\r\n\r\n if (values.out) {\r\n fs.writeFileSync(path.resolve(values.out), archiveBuffer);\r\n console.error(\"Created archive at \" + values.out);\r\n } else {\r\n process.stdout.write(archiveBuffer);\r\n }\r\n}\r\n\r\nmain().catch((err) => {\r\n console.error(\"Compress Error:\", err);\r\n process.exit(1);\r\n});\r\n"],"names":["async","values","positionals","parseArgs","args","process","argv","slice","options","out","type","short","level","default","help","allowPositionals","console","error","exit","filesToArchive","length","filePath","fs","statSync","isDirectory","buf","readFileSync","push","path","basename","content","Blob","Uint8Array","stdin","isTTY","stdinBuffer","stream","chunks","chunk","Buffer","from","concat","readStreamToBuffer","archive","compress","files","outputName","compressionLevel","parseInt","archiveBuffer","blob","arrayBuffer","writeFileSync","resolve","stdout","write","main","catch","err"],"mappings":";0YAaAA,iBACE,MAMMC,OAAEA,EAAAC,YAAQA,GAAgBC,YAAU,CACxCC,KAAMC,QAAQC,KAAKC,MAAM,GACzBC,QARc,CACdC,IAAK,CAAEC,KAAM,SAAmBC,MAAO,KACvCC,MAAO,CAAEF,KAAM,SAAmBC,MAAO,IAAKE,QAAS,KACvDC,KAAM,CAAEJ,KAAM,UAAoBC,MAAO,MAMzCI,kBAAkB,IAGhBd,EAAOa,OACTE,QAAQC,MAAM,wCACdD,QAAQC,MAAM,gDACdD,QAAQC,MAAM,YACdD,QAAQC,MAAM,oFACdD,QAAQC,MAAM,6DACdZ,QAAQa,KAAK,IAGf,MAAMC,EAAkE,GAExE,GAAIjB,EAAYkB,OAAS,EACvB,IAAA,MAAWC,KAAYnB,EAAa,CACrBoB,EAAGC,SAASF,GAChBG,gBACPR,QAAQC,MAAM,0CAA4CI,EAAW,KACrEhB,QAAQa,KAAK,IAEf,MAAMO,EAAMH,EAAGI,aAAaL,GAC5BF,EAAeQ,KAAK,CAClBC,KAAMA,EAAKC,SAASR,GACpBS,QAAS,IAAIC,KAAK,CAAC,IAAIC,WAAWP,MAEtC,KACK,CACDpB,QAAQ4B,MAAMC,QAChBlB,QAAQC,MAAM,iEACdZ,QAAQa,KAAK,IAEf,MAAMiB,QAlDVnC,eAAkCoC,GAChC,MAAMC,EAAmB,GACzB,UAAA,MAAiBC,KAASF,EACxBC,EAAOV,KAAKY,OAAOC,KAAKF,IAE1B,OAAOC,OAAOE,OAAOJ,EACvB,CA4C8BK,CAAmBrC,QAAQ4B,OACrDd,EAAeQ,KAAK,CAClBC,KAAM,gBACNE,QAAS,IAAIC,KAAK,CAAC,IAAIC,WAAWG,MAEtC,CAEA,MAAMQ,QAAgBC,WAAS,CAC7BC,MAAO1B,EACP2B,WAAY7C,EAAOQ,IAAMmB,EAAKC,SAAS5B,EAAOQ,KAAO,cACrDsC,iBAAkBC,SAAS/C,EAAOW,OAAS,IAAK,MAG5CqC,EAAgBV,OAAOC,WAAWG,EAAQO,KAAKC,eAEjDlD,EAAOQ,KACTa,EAAG8B,cAAcxB,EAAKyB,QAAQpD,EAAOQ,KAAMwC,GAC3CjC,QAAQC,MAAM,sBAAwBhB,EAAOQ,MAE7CJ,QAAQiD,OAAOC,MAAMN,EAEzB,EAEAO,GAAOC,MAAOC,IACZ1C,QAAQC,MAAM,kBAAmByC,GACjCrD,QAAQa,KAAK"}
|
package/dist/bin-compress.es.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{parseArgs as o}from"util";import*as
|
|
2
|
+
import{parseArgs as o}from"util";import*as e from"fs";import*as r from"path";import{compress as t}from"./archiver-web.es.js";(async function(){const{values:s,positionals:n}=o({args:process.argv.slice(2),options:{out:{type:"string",short:"o"},level:{type:"string",short:"l",default:"6"},help:{type:"boolean",short:"h"}},allowPositionals:!0});s.help&&(console.error("Usage: compress [files...] [options]"),console.error("If [files...] are omitted, reads from stdin."),console.error("Options:"),console.error(" -o, --out <file> Output file. If absent and not TTY, outputs to stdout."),console.error(" -l, --level <1-9> Compression level (default: 6)."),process.exit(0));const i=[];if(n.length>0)for(const o of n){e.statSync(o).isDirectory()&&(console.error("Directory archiving not supported yet ("+o+")"),process.exit(1));const t=e.readFileSync(o);i.push({path:r.basename(o),content:new Blob([new Uint8Array(t)])})}else{process.stdin.isTTY&&(console.error("Error: Must provide files to archive or pipe input via stdin."),process.exit(1));const o=await async function(o){const e=[];for await(const r of o)e.push(Buffer.from(r));return Buffer.concat(e)}(process.stdin);i.push({path:"piped-content",content:new Blob([new Uint8Array(o)])})}const a=await t({files:i,outputName:s.out?r.basename(s.out):"archive.zip",compressionLevel:parseInt(s.level||"6",10)}),c=Buffer.from(await a.blob.arrayBuffer());s.out?(e.writeFileSync(r.resolve(s.out),c),console.error("Created archive at "+s.out)):process.stdout.write(c)})().catch(o=>{console.error("Compress Error:",o),process.exit(1)});
|
|
3
3
|
//# sourceMappingURL=bin-compress.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin-compress.es.js","sources":["../packages/archiver-web/src/bin-compress.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"bin-compress.es.js","sources":["../packages/archiver-web/src/bin-compress.ts"],"sourcesContent":["import { parseArgs } from \"util\";\r\nimport * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport { compress } from \"./index.js\";\r\n\r\nasync function readStreamToBuffer(stream: NodeJS.ReadStream): Promise<Buffer> {\r\n const chunks: Buffer[] = [];\r\n for await (const chunk of stream) {\r\n chunks.push(Buffer.from(chunk));\r\n }\r\n return Buffer.concat(chunks);\r\n}\r\n\r\nasync function main() {\r\n const options = {\r\n out: { type: \"string\" as const, short: \"o\" },\r\n level: { type: \"string\" as const, short: \"l\", default: \"6\" },\r\n help: { type: \"boolean\" as const, short: \"h\" },\r\n };\r\n\r\n const { values, positionals } = parseArgs({\r\n args: process.argv.slice(2),\r\n options,\r\n allowPositionals: true,\r\n });\r\n\r\n if (values.help) {\r\n console.error(\"Usage: compress [files...] [options]\");\r\n console.error(\"If [files...] are omitted, reads from stdin.\");\r\n console.error(\"Options:\");\r\n console.error(\" -o, --out <file> Output file. If absent and not TTY, outputs to stdout.\");\r\n console.error(\" -l, --level <1-9> Compression level (default: 6).\");\r\n process.exit(0);\r\n }\r\n\r\n const filesToArchive: Array<{ path: string; content: Blob | string }> = [];\r\n\r\n if (positionals.length > 0) {\r\n for (const filePath of positionals) {\r\n const stat = fs.statSync(filePath);\r\n if (stat.isDirectory()) {\r\n console.error(\"Directory archiving not supported yet (\" + filePath + \")\");\r\n process.exit(1);\r\n }\r\n const buf = fs.readFileSync(filePath);\r\n filesToArchive.push({\r\n path: path.basename(filePath),\r\n content: new Blob([new Uint8Array(buf)]),\r\n });\r\n }\r\n } else {\r\n if (process.stdin.isTTY) {\r\n console.error(\"Error: Must provide files to archive or pipe input via stdin.\");\r\n process.exit(1);\r\n }\r\n const stdinBuffer = await readStreamToBuffer(process.stdin);\r\n filesToArchive.push({\r\n path: \"piped-content\",\r\n content: new Blob([new Uint8Array(stdinBuffer)]),\r\n });\r\n }\r\n\r\n const archive = await compress({\r\n files: filesToArchive,\r\n outputName: values.out ? path.basename(values.out) : \"archive.zip\",\r\n compressionLevel: parseInt(values.level || \"6\", 10),\r\n });\r\n\r\n const archiveBuffer = Buffer.from(await archive.blob.arrayBuffer());\r\n\r\n if (values.out) {\r\n fs.writeFileSync(path.resolve(values.out), archiveBuffer);\r\n console.error(\"Created archive at \" + values.out);\r\n } else {\r\n process.stdout.write(archiveBuffer);\r\n }\r\n}\r\n\r\nmain().catch((err) => {\r\n console.error(\"Compress Error:\", err);\r\n process.exit(1);\r\n});\r\n"],"names":["async","values","positionals","parseArgs","args","process","argv","slice","options","out","type","short","level","default","help","allowPositionals","console","error","exit","filesToArchive","length","filePath","fs","statSync","isDirectory","buf","readFileSync","push","path","basename","content","Blob","Uint8Array","stdin","isTTY","stdinBuffer","stream","chunks","chunk","Buffer","from","concat","readStreamToBuffer","archive","compress","files","outputName","compressionLevel","parseInt","archiveBuffer","blob","arrayBuffer","writeFileSync","resolve","stdout","write","main","catch","err"],"mappings":";8HAaAA,iBACE,MAMMC,OAAEA,EAAAC,YAAQA,GAAgBC,EAAU,CACxCC,KAAMC,QAAQC,KAAKC,MAAM,GACzBC,QARc,CACdC,IAAK,CAAEC,KAAM,SAAmBC,MAAO,KACvCC,MAAO,CAAEF,KAAM,SAAmBC,MAAO,IAAKE,QAAS,KACvDC,KAAM,CAAEJ,KAAM,UAAoBC,MAAO,MAMzCI,kBAAkB,IAGhBd,EAAOa,OACTE,QAAQC,MAAM,wCACdD,QAAQC,MAAM,gDACdD,QAAQC,MAAM,YACdD,QAAQC,MAAM,oFACdD,QAAQC,MAAM,6DACdZ,QAAQa,KAAK,IAGf,MAAMC,EAAkE,GAExE,GAAIjB,EAAYkB,OAAS,EACvB,IAAA,MAAWC,KAAYnB,EAAa,CACrBoB,EAAGC,SAASF,GAChBG,gBACPR,QAAQC,MAAM,0CAA4CI,EAAW,KACrEhB,QAAQa,KAAK,IAEf,MAAMO,EAAMH,EAAGI,aAAaL,GAC5BF,EAAeQ,KAAK,CAClBC,KAAMA,EAAKC,SAASR,GACpBS,QAAS,IAAIC,KAAK,CAAC,IAAIC,WAAWP,MAEtC,KACK,CACDpB,QAAQ4B,MAAMC,QAChBlB,QAAQC,MAAM,iEACdZ,QAAQa,KAAK,IAEf,MAAMiB,QAlDVnC,eAAkCoC,GAChC,MAAMC,EAAmB,GACzB,UAAA,MAAiBC,KAASF,EACxBC,EAAOV,KAAKY,OAAOC,KAAKF,IAE1B,OAAOC,OAAOE,OAAOJ,EACvB,CA4C8BK,CAAmBrC,QAAQ4B,OACrDd,EAAeQ,KAAK,CAClBC,KAAM,gBACNE,QAAS,IAAIC,KAAK,CAAC,IAAIC,WAAWG,MAEtC,CAEA,MAAMQ,QAAgBC,EAAS,CAC7BC,MAAO1B,EACP2B,WAAY7C,EAAOQ,IAAMmB,EAAKC,SAAS5B,EAAOQ,KAAO,cACrDsC,iBAAkBC,SAAS/C,EAAOW,OAAS,IAAK,MAG5CqC,EAAgBV,OAAOC,WAAWG,EAAQO,KAAKC,eAEjDlD,EAAOQ,KACTa,EAAG8B,cAAcxB,EAAKyB,QAAQpD,EAAOQ,KAAMwC,GAC3CjC,QAAQC,MAAM,sBAAwBhB,EAAOQ,MAE7CJ,QAAQiD,OAAOC,MAAMN,EAEzB,EAEAO,GAAOC,MAAOC,IACZ1C,QAAQC,MAAM,kBAAmByC,GACjCrD,QAAQa,KAAK"}
|
package/dist/bin-extract.cjs.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";const e=require("util"),t=require("fs"),r=require("path"),o=require("./archiver-web.cjs.js");function s(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const r in e)if("default"!==r){const o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,o.get?o:{enumerable:!0,get:()=>e[r]})}return t.default=e,Object.freeze(t)}const n=s(t),c=s(r);(async function(){const{values:t,positionals:r}=e.parseArgs({args:process.argv.slice(2),options:{out:{type:"string",short:"o"},
|
|
2
|
+
"use strict";const e=require("util"),t=require("fs"),r=require("path"),o=require("./archiver-web.cjs.js");function s(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e)for(const r in e)if("default"!==r){const o=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,o.get?o:{enumerable:!0,get:()=>e[r]})}return t.default=e,Object.freeze(t)}const n=s(t),c=s(r);(async function(){const{values:t,positionals:r}=e.parseArgs({args:process.argv.slice(2),options:{out:{type:"string",short:"o"},folder:{type:"string",short:"d",default:""},help:{type:"boolean",short:"h"}},allowPositionals:!0});let s;t.help&&(console.error("Usage: extract [archive-file] [options]"),console.error("If [archive-file] is omitted, reads from stdin."),console.error("Options:"),console.error(" -o, --out <dir> Output directory. If absent, outputs to stdout (only works if 1 file)."),console.error(" -d, --folder <dir> Folder to extract from archive."),process.exit(0)),r.length>0?s=n.readFileSync(c.resolve(r[0])):(process.stdin.isTTY&&(console.error("Error: Must provide an archive file or pipe input via stdin."),process.exit(1)),s=await async function(e){const t=[];for await(const r of e)t.push(Buffer.from(r));return Buffer.concat(t)}(process.stdin));const i=s.buffer.slice(s.byteOffset,s.byteOffset+s.byteLength),f=await o.extract({archiveBuffer:i,folderPath:t.folder});if(t.out){for(const e of f){const r=c.join(t.out,e.path);let o;if(n.mkdirSync(c.dirname(r),{recursive:!0}),e.content.match(/^[A-Za-z0-9+/=]+$/)&&e.content.length>50)try{o=Buffer.from(e.content,"base64")}catch{o=Buffer.from(e.content,"utf8")}else o=Buffer.from(e.content,"utf8");n.writeFileSync(r,o)}console.error("Extracted "+f.length+" files to "+t.out)}else if(1===f.length){let e;e=f[0].content.match(/^[A-Za-z0-9+/=]*$/)&&f[0].content.length>50?Buffer.from(f[0].content,"base64"):Buffer.from(f[0].content,"utf8"),process.stdout.write(e)}else console.error("Archive contains "+f.length+" files. Please specify -o/--out directory to extract them."),process.exit(1)})().catch(e=>{console.error("Extract Error:",e),process.exit(1)});
|
|
3
3
|
//# sourceMappingURL=bin-extract.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin-extract.cjs.js","sources":["../packages/archiver-web/src/bin-extract.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"bin-extract.cjs.js","sources":["../packages/archiver-web/src/bin-extract.ts"],"sourcesContent":["import { parseArgs } from \"util\";\r\nimport * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport { extract } from \"./index.js\";\r\n\r\nasync function readStreamToBuffer(stream: NodeJS.ReadStream): Promise<Buffer> {\r\n const chunks: Buffer[] = [];\r\n for await (const chunk of stream) {\r\n chunks.push(Buffer.from(chunk));\r\n }\r\n return Buffer.concat(chunks);\r\n}\r\n\r\nasync function main() {\r\n const options = {\r\n out: { type: \"string\" as const, short: \"o\" },\r\n folder: { type: \"string\" as const, short: \"d\", default: \"\" },\r\n help: { type: \"boolean\" as const, short: \"h\" },\r\n };\r\n\r\n const { values, positionals } = parseArgs({\r\n args: process.argv.slice(2),\r\n options,\r\n allowPositionals: true,\r\n });\r\n\r\n if (values.help) {\r\n console.error(\"Usage: extract [archive-file] [options]\");\r\n console.error(\"If [archive-file] is omitted, reads from stdin.\");\r\n console.error(\"Options:\");\r\n console.error(\" -o, --out <dir> Output directory. If absent, outputs to stdout (only works if 1 file).\");\r\n console.error(\" -d, --folder <dir> Folder to extract from archive.\");\r\n process.exit(0);\r\n }\r\n\r\n let archiveBuffer: Buffer;\r\n\r\n if (positionals.length > 0) {\r\n archiveBuffer = fs.readFileSync(path.resolve(positionals[0]));\r\n } else {\r\n if (process.stdin.isTTY) {\r\n console.error(\"Error: Must provide an archive file or pipe input via stdin.\");\r\n process.exit(1);\r\n }\r\n archiveBuffer = await readStreamToBuffer(process.stdin);\r\n }\r\n\r\n const arrayBuf = archiveBuffer.buffer.slice(\r\n archiveBuffer.byteOffset,\r\n archiveBuffer.byteOffset + archiveBuffer.byteLength,\r\n ) as ArrayBuffer;\r\n\r\n const files = await extract({\r\n archiveBuffer: arrayBuf,\r\n folderPath: values.folder,\r\n });\r\n\r\n if (values.out) {\r\n for (const file of files) {\r\n const outPath = path.join(values.out, file.path);\r\n fs.mkdirSync(path.dirname(outPath), { recursive: true });\r\n let buf: Buffer;\r\n if (file.content.match(/^[A-Za-z0-9+/=]+$/) && file.content.length > 50) {\r\n try {\r\n buf = Buffer.from(file.content, \"base64\");\r\n } catch {\r\n buf = Buffer.from(file.content, \"utf8\");\r\n }\r\n } else {\r\n buf = Buffer.from(file.content, \"utf8\");\r\n }\r\n fs.writeFileSync(outPath, buf);\r\n }\r\n console.error(\"Extracted \" + files.length + \" files to \" + values.out);\r\n } else {\r\n if (files.length === 1) {\r\n let buf: Buffer;\r\n if (files[0].content.match(/^[A-Za-z0-9+/=]*$/) && files[0].content.length > 50) {\r\n buf = Buffer.from(files[0].content, \"base64\");\r\n } else {\r\n buf = Buffer.from(files[0].content, \"utf8\");\r\n }\r\n process.stdout.write(buf);\r\n } else {\r\n console.error(\"Archive contains \" + files.length + \" files. Please specify -o/--out directory to extract them.\");\r\n process.exit(1);\r\n }\r\n }\r\n}\r\n\r\nmain().catch((err) => {\r\n console.error(\"Extract Error:\", err);\r\n process.exit(1);\r\n});\r\n"],"names":["async","values","positionals","parseArgs","args","process","argv","slice","options","out","type","short","folder","default","help","allowPositionals","archiveBuffer","console","error","exit","length","fs","readFileSync","path","resolve","stdin","isTTY","stream","chunks","chunk","push","Buffer","from","concat","readStreamToBuffer","arrayBuf","buffer","byteOffset","byteLength","files","extract","folderPath","file","outPath","join","buf","mkdirSync","dirname","recursive","content","match","writeFileSync","stdout","write","main","catch","err"],"mappings":";0YAaAA,iBACE,MAMMC,OAAEA,EAAAC,YAAQA,GAAgBC,YAAU,CACxCC,KAAMC,QAAQC,KAAKC,MAAM,GACzBC,QARc,CACdC,IAAK,CAAEC,KAAM,SAAmBC,MAAO,KACvCC,OAAQ,CAAEF,KAAM,SAAmBC,MAAO,IAAKE,QAAS,IACxDC,KAAM,CAAEJ,KAAM,UAAoBC,MAAO,MAMzCI,kBAAkB,IAYpB,IAAIC,EATAf,EAAOa,OACTG,QAAQC,MAAM,2CACdD,QAAQC,MAAM,mDACdD,QAAQC,MAAM,YACdD,QAAQC,MAAM,oGACdD,QAAQC,MAAM,6DACdb,QAAQc,KAAK,IAKXjB,EAAYkB,OAAS,EACvBJ,EAAgBK,EAAGC,aAAaC,EAAKC,QAAQtB,EAAY,MAErDG,QAAQoB,MAAMC,QAChBT,QAAQC,MAAM,gEACdb,QAAQc,KAAK,IAEfH,QAvCJhB,eAAkC2B,GAChC,MAAMC,EAAmB,GACzB,UAAA,MAAiBC,KAASF,EACxBC,EAAOE,KAAKC,OAAOC,KAAKH,IAE1B,OAAOE,OAAOE,OAAOL,EACvB,CAiC0BM,CAAmB7B,QAAQoB,QAGnD,MAAMU,EAAWnB,EAAcoB,OAAO7B,MACpCS,EAAcqB,WACdrB,EAAcqB,WAAarB,EAAcsB,YAGrCC,QAAcC,UAAQ,CAC1BxB,cAAemB,EACfM,WAAYxC,EAAOW,SAGrB,GAAIX,EAAOQ,IAAK,CACd,IAAA,MAAWiC,KAAQH,EAAO,CACxB,MAAMI,EAAUpB,EAAKqB,KAAK3C,EAAOQ,IAAKiC,EAAKnB,MAE3C,IAAIsB,EACJ,GAFAxB,EAAGyB,UAAUvB,EAAKwB,QAAQJ,GAAU,CAAEK,WAAW,IAE7CN,EAAKO,QAAQC,MAAM,sBAAwBR,EAAKO,QAAQ7B,OAAS,GACnE,IACEyB,EAAMd,OAAOC,KAAKU,EAAKO,QAAS,SAClC,CAAA,MACEJ,EAAMd,OAAOC,KAAKU,EAAKO,QAAS,OAClC,MAEAJ,EAAMd,OAAOC,KAAKU,EAAKO,QAAS,QAElC5B,EAAG8B,cAAcR,EAASE,EAC5B,CACA5B,QAAQC,MAAM,aAAeqB,EAAMnB,OAAS,aAAenB,EAAOQ,IACpE,MACE,GAAqB,IAAjB8B,EAAMnB,OAAc,CACtB,IAAIyB,EAEFA,EADEN,EAAM,GAAGU,QAAQC,MAAM,sBAAwBX,EAAM,GAAGU,QAAQ7B,OAAS,GACrEW,OAAOC,KAAKO,EAAM,GAAGU,QAAS,UAE9BlB,OAAOC,KAAKO,EAAM,GAAGU,QAAS,QAEtC5C,QAAQ+C,OAAOC,MAAMR,EACvB,MACE5B,QAAQC,MAAM,oBAAsBqB,EAAMnB,OAAS,8DACnDf,QAAQc,KAAK,EAGnB,EAEAmC,GAAOC,MAAOC,IACZvC,QAAQC,MAAM,iBAAkBsC,GAChCnD,QAAQc,KAAK"}
|
package/dist/bin-extract.es.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{parseArgs as e}from"util";import*as
|
|
2
|
+
import{parseArgs as e}from"util";import*as t from"fs";import*as o from"path";import{extract as r}from"./archiver-web.es.js";(async function(){const{values:s,positionals:n}=e({args:process.argv.slice(2),options:{out:{type:"string",short:"o"},folder:{type:"string",short:"d",default:""},help:{type:"boolean",short:"h"}},allowPositionals:!0});let i;s.help&&(console.error("Usage: extract [archive-file] [options]"),console.error("If [archive-file] is omitted, reads from stdin."),console.error("Options:"),console.error(" -o, --out <dir> Output directory. If absent, outputs to stdout (only works if 1 file)."),console.error(" -d, --folder <dir> Folder to extract from archive."),process.exit(0)),n.length>0?i=t.readFileSync(o.resolve(n[0])):(process.stdin.isTTY&&(console.error("Error: Must provide an archive file or pipe input via stdin."),process.exit(1)),i=await async function(e){const t=[];for await(const o of e)t.push(Buffer.from(o));return Buffer.concat(t)}(process.stdin));const c=i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength),f=await r({archiveBuffer:c,folderPath:s.folder});if(s.out){for(const e of f){const r=o.join(s.out,e.path);let n;if(t.mkdirSync(o.dirname(r),{recursive:!0}),e.content.match(/^[A-Za-z0-9+/=]+$/)&&e.content.length>50)try{n=Buffer.from(e.content,"base64")}catch{n=Buffer.from(e.content,"utf8")}else n=Buffer.from(e.content,"utf8");t.writeFileSync(r,n)}console.error("Extracted "+f.length+" files to "+s.out)}else if(1===f.length){let e;e=f[0].content.match(/^[A-Za-z0-9+/=]*$/)&&f[0].content.length>50?Buffer.from(f[0].content,"base64"):Buffer.from(f[0].content,"utf8"),process.stdout.write(e)}else console.error("Archive contains "+f.length+" files. Please specify -o/--out directory to extract them."),process.exit(1)})().catch(e=>{console.error("Extract Error:",e),process.exit(1)});
|
|
3
3
|
//# sourceMappingURL=bin-extract.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bin-extract.es.js","sources":["../packages/archiver-web/src/bin-extract.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"bin-extract.es.js","sources":["../packages/archiver-web/src/bin-extract.ts"],"sourcesContent":["import { parseArgs } from \"util\";\r\nimport * as fs from \"fs\";\r\nimport * as path from \"path\";\r\nimport { extract } from \"./index.js\";\r\n\r\nasync function readStreamToBuffer(stream: NodeJS.ReadStream): Promise<Buffer> {\r\n const chunks: Buffer[] = [];\r\n for await (const chunk of stream) {\r\n chunks.push(Buffer.from(chunk));\r\n }\r\n return Buffer.concat(chunks);\r\n}\r\n\r\nasync function main() {\r\n const options = {\r\n out: { type: \"string\" as const, short: \"o\" },\r\n folder: { type: \"string\" as const, short: \"d\", default: \"\" },\r\n help: { type: \"boolean\" as const, short: \"h\" },\r\n };\r\n\r\n const { values, positionals } = parseArgs({\r\n args: process.argv.slice(2),\r\n options,\r\n allowPositionals: true,\r\n });\r\n\r\n if (values.help) {\r\n console.error(\"Usage: extract [archive-file] [options]\");\r\n console.error(\"If [archive-file] is omitted, reads from stdin.\");\r\n console.error(\"Options:\");\r\n console.error(\" -o, --out <dir> Output directory. If absent, outputs to stdout (only works if 1 file).\");\r\n console.error(\" -d, --folder <dir> Folder to extract from archive.\");\r\n process.exit(0);\r\n }\r\n\r\n let archiveBuffer: Buffer;\r\n\r\n if (positionals.length > 0) {\r\n archiveBuffer = fs.readFileSync(path.resolve(positionals[0]));\r\n } else {\r\n if (process.stdin.isTTY) {\r\n console.error(\"Error: Must provide an archive file or pipe input via stdin.\");\r\n process.exit(1);\r\n }\r\n archiveBuffer = await readStreamToBuffer(process.stdin);\r\n }\r\n\r\n const arrayBuf = archiveBuffer.buffer.slice(\r\n archiveBuffer.byteOffset,\r\n archiveBuffer.byteOffset + archiveBuffer.byteLength,\r\n ) as ArrayBuffer;\r\n\r\n const files = await extract({\r\n archiveBuffer: arrayBuf,\r\n folderPath: values.folder,\r\n });\r\n\r\n if (values.out) {\r\n for (const file of files) {\r\n const outPath = path.join(values.out, file.path);\r\n fs.mkdirSync(path.dirname(outPath), { recursive: true });\r\n let buf: Buffer;\r\n if (file.content.match(/^[A-Za-z0-9+/=]+$/) && file.content.length > 50) {\r\n try {\r\n buf = Buffer.from(file.content, \"base64\");\r\n } catch {\r\n buf = Buffer.from(file.content, \"utf8\");\r\n }\r\n } else {\r\n buf = Buffer.from(file.content, \"utf8\");\r\n }\r\n fs.writeFileSync(outPath, buf);\r\n }\r\n console.error(\"Extracted \" + files.length + \" files to \" + values.out);\r\n } else {\r\n if (files.length === 1) {\r\n let buf: Buffer;\r\n if (files[0].content.match(/^[A-Za-z0-9+/=]*$/) && files[0].content.length > 50) {\r\n buf = Buffer.from(files[0].content, \"base64\");\r\n } else {\r\n buf = Buffer.from(files[0].content, \"utf8\");\r\n }\r\n process.stdout.write(buf);\r\n } else {\r\n console.error(\"Archive contains \" + files.length + \" files. Please specify -o/--out directory to extract them.\");\r\n process.exit(1);\r\n }\r\n }\r\n}\r\n\r\nmain().catch((err) => {\r\n console.error(\"Extract Error:\", err);\r\n process.exit(1);\r\n});\r\n"],"names":["async","values","positionals","parseArgs","args","process","argv","slice","options","out","type","short","folder","default","help","allowPositionals","archiveBuffer","console","error","exit","length","fs","readFileSync","path","resolve","stdin","isTTY","stream","chunks","chunk","push","Buffer","from","concat","readStreamToBuffer","arrayBuf","buffer","byteOffset","byteLength","files","extract","folderPath","file","outPath","join","buf","mkdirSync","dirname","recursive","content","match","writeFileSync","stdout","write","main","catch","err"],"mappings":";6HAaAA,iBACE,MAMMC,OAAEA,EAAAC,YAAQA,GAAgBC,EAAU,CACxCC,KAAMC,QAAQC,KAAKC,MAAM,GACzBC,QARc,CACdC,IAAK,CAAEC,KAAM,SAAmBC,MAAO,KACvCC,OAAQ,CAAEF,KAAM,SAAmBC,MAAO,IAAKE,QAAS,IACxDC,KAAM,CAAEJ,KAAM,UAAoBC,MAAO,MAMzCI,kBAAkB,IAYpB,IAAIC,EATAf,EAAOa,OACTG,QAAQC,MAAM,2CACdD,QAAQC,MAAM,mDACdD,QAAQC,MAAM,YACdD,QAAQC,MAAM,oGACdD,QAAQC,MAAM,6DACdb,QAAQc,KAAK,IAKXjB,EAAYkB,OAAS,EACvBJ,EAAgBK,EAAGC,aAAaC,EAAKC,QAAQtB,EAAY,MAErDG,QAAQoB,MAAMC,QAChBT,QAAQC,MAAM,gEACdb,QAAQc,KAAK,IAEfH,QAvCJhB,eAAkC2B,GAChC,MAAMC,EAAmB,GACzB,UAAA,MAAiBC,KAASF,EACxBC,EAAOE,KAAKC,OAAOC,KAAKH,IAE1B,OAAOE,OAAOE,OAAOL,EACvB,CAiC0BM,CAAmB7B,QAAQoB,QAGnD,MAAMU,EAAWnB,EAAcoB,OAAO7B,MACpCS,EAAcqB,WACdrB,EAAcqB,WAAarB,EAAcsB,YAGrCC,QAAcC,EAAQ,CAC1BxB,cAAemB,EACfM,WAAYxC,EAAOW,SAGrB,GAAIX,EAAOQ,IAAK,CACd,IAAA,MAAWiC,KAAQH,EAAO,CACxB,MAAMI,EAAUpB,EAAKqB,KAAK3C,EAAOQ,IAAKiC,EAAKnB,MAE3C,IAAIsB,EACJ,GAFAxB,EAAGyB,UAAUvB,EAAKwB,QAAQJ,GAAU,CAAEK,WAAW,IAE7CN,EAAKO,QAAQC,MAAM,sBAAwBR,EAAKO,QAAQ7B,OAAS,GACnE,IACEyB,EAAMd,OAAOC,KAAKU,EAAKO,QAAS,SAClC,CAAA,MACEJ,EAAMd,OAAOC,KAAKU,EAAKO,QAAS,OAClC,MAEAJ,EAAMd,OAAOC,KAAKU,EAAKO,QAAS,QAElC5B,EAAG8B,cAAcR,EAASE,EAC5B,CACA5B,QAAQC,MAAM,aAAeqB,EAAMnB,OAAS,aAAenB,EAAOQ,IACpE,MACE,GAAqB,IAAjB8B,EAAMnB,OAAc,CACtB,IAAIyB,EAEFA,EADEN,EAAM,GAAGU,QAAQC,MAAM,sBAAwBX,EAAM,GAAGU,QAAQ7B,OAAS,GACrEW,OAAOC,KAAKO,EAAM,GAAGU,QAAS,UAE9BlB,OAAOC,KAAKO,EAAM,GAAGU,QAAS,QAEtC5C,QAAQ+C,OAAOC,MAAMR,EACvB,MACE5B,QAAQC,MAAM,oBAAsBqB,EAAMnB,OAAS,8DACnDf,QAAQc,KAAK,EAGnB,EAEAmC,GAAOC,MAAOC,IACZvC,QAAQC,MAAM,iBAAkBsC,GAChCnD,QAAQc,KAAK"}
|
package/dist/grab-api.cjs.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("@grab-url/log"),t=async(e,t)=>{let n;return async function(...o){clearTimeout(n),n=setTimeout(async()=>{clearTimeout(n),await e(...o)},t)}},n=e=>new Promise(t=>setTimeout(t,1e3*e||0)),o=(e,t)=>{let n=e=>t
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("@grab-url/log"),t=async(e,t)=>{let n;return async function(...o){clearTimeout(n),n=setTimeout(async()=>{clearTimeout(n),await e(...o)},t)}},n=e=>new Promise(t=>setTimeout(t,1e3*e||0)),o=(e,t)=>{let n=e=>t?.startsWith(e)||!1,o=e,r=t;return t?.startsWith("http:")||t?.startsWith("https:")?o="":n("/")||o.endsWith("/")?n("/")&&o.endsWith("/")&&(r=t.slice(1)):r="/"+t,{baseURL:o,path:r}};function r(e){if("undefined"==typeof document)return;let t,n=document.getElementById("alert-overlay");if(!n){n=document.body.appendChild(document.createElement("div")),n.id="alert-overlay",n.setAttribute("style","position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center"),n.innerHTML='<div id="alert-box" style="background:#fff;padding:1.5em 2em;border-radius:8px;box-shadow:0 2px 16px #0003;min-width:220px;max-height:80vh;position:relative;display:flex;flex-direction:column;">\n <button id="close-alert" style="position:absolute;top:12px;right:20px;font-size:1.5em;background:none;border:none;cursor:pointer;color:black;">×</button>\n <div id="alert-list" style="overflow:auto;flex:1;"></div>\n </div>',n.addEventListener("click",e=>e.target==n&&n.remove());const e=document.getElementById("close-alert");e&&(e.onclick=()=>n.remove())}t=document.getElementById("alert-list"),t.innerHTML+=`<div style="border-bottom:1px solid #333; font-size:1.2em;margin:0.5em 0;">${e}</div>`}function s(){"undefined"!=typeof document&&document.addEventListener("keydown",t=>{const n=window.grab;if(n&&n.log&&"i"===t.key&&t.ctrlKey&&t.altKey){let t=" ";for(let o of n.log)t+=`<div style="margin-bottom:1em; border-bottom:1px solid #ccc; padding-bottom:1em;">\n <b>Path:</b> ${o.path}<br>\n <b>Request:</b> ${e.printJSONStructure(o.request,0,"html")}<br>\n <b>Response:</b> ${e.printJSONStructure(o.response,0,"html")}<br> \n <b>Time:</b> ${new Date(o.lastFetchTime).toLocaleString()}\n </div>`;r(t)}})}async function i(s,a){const l=function(e){return{..."undefined"!=typeof window?window?.grab?.defaults:globalThis?.grab?.defaults||{},...e}}(a);let{headers:c,response:d,method:u=(l.post?"POST":l.put?"PUT":l.patch?"PATCH":"GET"),cache:f,timeout:p=30,baseURL:g="undefined"!=typeof process&&process.env.SERVER_API_URL||"/api/",cancelOngoingIfNew:m,cancelNewIfOngoing:y,rateLimit:b,debug:w,infiniteScroll:h,logger:v=e.log,onRequest:T,onResponse:x,onError:L,onStream:S,body:E,post:O,put:A,patch:P,...j}=l;const k=o(g,s);g=k.baseURL,s=k.path;const R=function(e){const t="function"==typeof e?e:null;return{response:!e||t?{}:e,resFunction:t}}(d);let N=R.response,$=R.resFunction;const q="undefined"!=typeof window?window.grab:globalThis.grab,F=q?.log||[];$?N=$({...N,isLoading:!0}):"object"==typeof N&&(N.isLoading=!0);try{const o=await async function(e,n,o,r){const{debounce:s=0,repeat:i=0,repeatEvery:a=null,setDefaults:l=!1}=o;if(s>0){const i=await t(async()=>{await r(e,{...n,debounce:0})},1e3*s);return await i(),o.response||{}}if(i>1){for(let t=0;t<i;t++)await r(e,{...n,repeat:0});return o.response||{}}if(a)return setInterval(async()=>{await r(e,{...n,repeat:0,repeatEvery:null})},1e3*a),o.response||{};if(l){const e="undefined"!=typeof window?window.grab:globalThis.grab;return e&&(e.defaults={...n,setDefaults:void 0}),o.response||{}}return null}(s,a||{},l,i);if(o)return o;!function(e,t,n,o){if("undefined"==typeof window)return;const{regrabOnStale:r,regrabOnFocus:s,regrabOnNetwork:i,cache:a,cacheForTime:l=60}=n,c=async()=>await o(e,{...t,cache:!1});r&&a&&setTimeout(c,1e3*l),i&&window.addEventListener("online",c),s&&(window.addEventListener("focus",c),document.addEventListener("visibilitychange",async()=>{"visible"===document.visibilityState&&await c()}))}(s,a||{},l,i);let{params:r,priorRequest:d,response:L,paramsAsText:O}=function(e,t,n,o,r,s){const{cache:i,cacheForTime:a,infiniteScroll:l}=n,[c,d]=l||[],u=JSON.stringify(c?{...t,[c]:void 0}:t);let f=s.find(t=>t.request===u&&t.path===e);if(c){let e=(f?.currentPage||0)+1||t?.[c]||1;f?f.currentPage=e:(o[d]=[],e=1),t={...t,[c]:e}}else{for(let e of Object.keys(o))o[e]=void 0;if(i&&f?.response&&(!a||f.lastFetchTime>Date.now()-1e3*a)){for(let e of Object.keys(f.response))o[e]=f.response[e];r&&(o=r(o))}}return{params:t,priorRequest:f,response:o,paramsAsText:u}}(s,j,l,N,$,F);if(j=r,N=L,function(t,n,o,r,s){if("undefined"==typeof window||!o?.length)return;const[i,,a]=o;if(void 0===a)return;let l="string"==typeof a?document.querySelector(a):a;l?(window.scrollListener&&"function"==typeof l.removeEventListener&&l.removeEventListener("scroll",window.scrollListener),window.scrollListener=e=>{const o=e.target;localStorage.setItem("scroll",JSON.stringify([o.scrollTop,o.scrollLeft,a])),o.scrollHeight-o.scrollTop<=o.clientHeight+200&&s(t,{...n,cache:!1,[i]:(r?.currentPage||0)+1})},l.addEventListener("scroll",window.scrollListener)):e.log("paginateDOM not found",{color:"red"})}(s,a,h,d,i),b>0&&d?.lastFetchTime>Date.now()-1e3*b)throw new Error(`Fetch rate limit exceeded for ${s}. Wait ${b}s between requests.`);if(d?.controller)if(m)d.controller.abort();else if(y)return{isLoading:!0};const A=new AbortController;let P=A.signal;m||"function"!=typeof AbortSignal.timeout||(P=AbortSignal.timeout(1e3*p)),F.unshift({path:s,request:O,lastFetchTime:Date.now(),controller:A});let{fetchParams:k,paramsGETRequest:R}=function(e,t,n,o,r,s){const i=["POST","PUT","PATCH"].includes(e),a={method:e,headers:{"Content-Type":"application/json",Accept:"application/json",...t},body:n||(i?JSON.stringify(o):null),redirect:"follow",cache:r?"force-cache":"no-store",signal:s};let l="";return i||(l=(Object.keys(o).length?"?":"")+new URLSearchParams(o).toString()),{fetchParams:a,paramsGETRequest:l}}(u,c,E,j,!!f,P);if("function"==typeof T){const e=T(s,N,j,k);Array.isArray(e)&&([s,N,j,k]=e)}const q=new Date,D=await async function(e,t,o,r,s,i){const a="undefined"!=typeof window?window.grab:globalThis.grab,l=a?.mock?.[t],c=JSON.stringify(s);if(l&&(!l.method||l.method===r.method)&&(!l.params||c===JSON.stringify(l.params)))return await n(l.delay||0),"function"==typeof l.response?l.response(s):l.response;const d=await fetch(e+t+o,r).catch(e=>{throw new Error(e.message)});if(!d.ok)throw new Error(`HTTP error: ${d.status} ${d.statusText}`);if(i)return await i(d.body),null;const u=d.headers.get("content-type");return await(u?u.includes("application/json")?d.json():u.includes("application/pdf")||u.includes("application/octet-stream")?d.blob():d.text():d.json()).catch(e=>{throw new Error("Error parsing response: "+e)})}(g,s,R,k,j,S);if($?N=$({...N,isLoading:void 0}):"object"==typeof N&&delete N.isLoading,"function"==typeof x){const e=x(s,N,j,k);Array.isArray(e)&&([s,N,j,k]=e)}const J=((Number(new Date)-Number(q))/1e3).toFixed(1);w&&v(`Path:${g+s+R}\n${JSON.stringify(a,null,2)}\nTime: ${J}s\nResponse: ${e.printJSONStructure(D)}`);const[,I]=h||[];return N=function(e,t,n,o){if("object"==typeof e&&null!==e){for(let n of Object.keys(e))t[n]=o===n&&Array.isArray(t[n])?[...t[n],...e[n]]:e[n];t.data=e}else n?t=n({data:e,...e}):"object"==typeof t&&(t.data=e);return t}(D,N,$,I),F[0]&&(F[0].response=N),$&&(N=$(N)),N}catch(D){if("function"==typeof L&&L(D.message,g+s,j),l.retryAttempts&&l.retryAttempts>0)return await i(s,{...a,retryAttempts:--l.retryAttempts});!D.message.includes("signal")&&w&&(v(`Error: ${D.message}\nPath:${g+s}\n`,{color:"red"}),"undefined"!=typeof document&&r(D.message)),N=N||{},N.error=D.message;const e="function"==typeof d?d:null;return e?(N.data=e({isLoading:void 0,error:D.message}),N=N.data):delete N.isLoading,N}}const a=i;a.instance=(e={})=>(t,n={})=>i(t,{...e,...n}),a.log=[],a.mock={},a.defaults={},"undefined"!=typeof window?(window.log=e.log,window.grab=a,s(),document.addEventListener("DOMContentLoaded",()=>{try{const e=localStorage.getItem("scroll");if(!e)return;const[t,n,o]=JSON.parse(e);if(!t||!o)return;const r=document.querySelector(o);r&&(r.scrollTop=t,r.scrollLeft=n)}catch(e){console.warn("Failed to restore scroll position",e)}})):"undefined"!=typeof globalThis&&(globalThis.log=e.log,globalThis.grab=a),Object.defineProperty(exports,"log",{enumerable:!0,get:()=>e.log}),exports.buildUrl=o,exports.debouncer=t,exports.default=a,exports.grab=a,exports.setupDevTools=s,exports.showAlert=r,exports.wait=n;
|
|
2
2
|
//# sourceMappingURL=grab-api.cjs.js.map
|