7zip-wrapper 0.0.1
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/LICENSE +21 -0
- package/README.md +180 -0
- package/dist/cli.js +44 -0
- package/dist/index.d.mts +639 -0
- package/dist/index.d.ts +639 -0
- package/dist/index.js +5 -0
- package/dist/index.mjs +5 -0
- package/dist/postinstall.js +3 -0
- package/package.json +84 -0
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import M from'path';import {fileURLToPath}from'url';import P from'fs';import {spawn,execSync}from'child_process';import gt from'os';var pt=()=>fileURLToPath(import.meta.url),dt=()=>M.dirname(pt()),E=dt();var Q={fastest:{name:"Fastest",level:1},fast:{name:"Fast",level:3},normal:{name:"Normal",level:5},maximum:{name:"Maximum",level:7},ultra:{name:"Ultra",level:9,method:"lzma2",dictionarySize:"64m",solid:true}};var T={SUCCESS:0,WARNING:1};var tt={win32:"7za.exe",linux:"7za",darwin:"7za"},i={TYPE:"-t",LEVEL:"-mx",METHOD:"-m0",DICT_SIZE:"-md",WORD_SIZE:"-mfbc",THREADS:"-mmt",SOLID:"-ms",ENCRYPT_HEADERS:"-mhe",PASSWORD:"-p",OUTPUT:"-o",OVERWRITE_ALL:"-aoa",SKIP_EXISTING:"-aos",TECH_INFO:"-slt",VERBOSE:"-bb1",RECURSE:"-r",NO_RECURSE:"-r-",INCLUDE:"-i!",EXCLUDE:"-x!",STORE_SYMLINKS:"-snl",STORE_HARDLINKS:"-snh",TIMESTAMPS:"-bt",YES:"-y",SFX:"-sfx",VOLUME:"-v",PRESERVE_PERMISSIONS:"-spf"},d={ADD:"a",EXTRACT:"x",EXTRACT_FLAT:"e",LIST:"l",TEST:"t",UPDATE:"u",DELETE:"d",RENAME:"rn",HASH:"h",INFO:"i",BENCHMARK:"b"};var rt=3e4;var p=class extends Error{constructor(t,s,n){super(t);this.code=s;this.exitCode=n;this.name="ZipWrapperError",Error.captureStackTrace?.(this,this.constructor);}},x=class extends p{constructor(r=[]){let t=r.length>0?` Searched: ${r.join(", ")}`:"";super(`7-Zip binary not found.${t}`,"BINARY_NOT_FOUND"),this.name="BinaryNotFoundError";}},R=class extends p{constructor(t){super(`Archive not found: ${t}`,"ARCHIVE_NOT_FOUND");this.archivePath=t;this.name="ArchiveNotFoundError";}},C=class extends p{constructor(t){super(t?`Password required for archive: ${t}`:"Password required for encrypted archive","PASSWORD_REQUIRED");this.archivePath=t;this.name="PasswordRequiredError";}},w=class extends p{constructor(t){super(t?`Wrong password for archive: ${t}`:"Wrong password for encrypted archive","WRONG_PASSWORD");this.archivePath=t;this.name="WrongPasswordError";}},b=class extends p{constructor(t,s){super(s?`Corrupt archive: ${t} - ${s}`:`Corrupt archive: ${t}`,"CORRUPT_ARCHIVE");this.archivePath=t;this.details=s;this.name="CorruptArchiveError";}},I=class extends p{constructor(r,t){super(r,"COMPRESSION_ERROR",t),this.name="CompressionError";}},D=class extends p{constructor(r,t){super(r,"EXTRACTION_ERROR",t),this.name="ExtractionError";}},L=class extends p{constructor(t){super(`Unsupported archive format: ${t}`,"UNSUPPORTED_FORMAT");this.format=t;this.name="UnsupportedFormatError";}},O=class extends p{constructor(t,s){super(s?`Operation '${s}' timed out after ${t}ms`:`Operation timed out after ${t}ms`,"TIMEOUT");this.timeoutMs=t;this.operation=s;this.name="TimeoutError";}};function N(e,r,t,s){let n=`${e}
|
|
2
|
+
${r}`.toLowerCase();return n.includes("wrong password")||n.includes("incorrect password")?new w(s):n.includes("enter password")||n.includes("password is required")||n.includes("encrypted")?new C(s):n.includes("data error")||n.includes("crc failed")||n.includes("headers error")||n.includes("unexpected end")?new b(s||"unknown",e.trim()):(n.includes("cannot find archive")||n.includes("cannot open"))&&s?new R(s):new I(e.trim()||"Unknown 7-Zip error",t)}function mt(e){let r=e;for(;;){if(P.existsSync(M.join(r,"package.json")))return r;let t=M.dirname(r);if(t===r)return e;r=t;}}var ft=mt(E),et=M.join(ft,"bin");var z=null;function U(){return z||(z=M.join(et,tt[gt.platform()]),z)}U();function Rt(e){return e||U()}function yt(e){let r=e||U();if(!P.existsSync(r))return false;try{return execSync(`"${r}"`,{timeout:5e3,windowsHide:!0,stdio:"ignore"}),!0}catch{return true}}function st(e){let r=Rt(e);if(!yt(r)){let t=[r];throw new x(t)}return r}function v(e,r){let t=st(r?.binaryPath);try{return spawn(t,e,{...r,windowsHide:!0,stdio:["pipe","pipe","pipe"]})}catch(s){throw new p(`Failed to spawn 7-Zip process: ${s.message}`)}}async function h(e,r){let s=r?.timeout??rt;return new Promise((n,o)=>{let l=[],a=[],u,c,K=false;try{u=v(e,r);}catch(m){o(m);return}s>0&&(c=setTimeout(()=>{K=true,u.kill("SIGTERM"),o(new O(s,`7za ${e[0]}`));},s)),u.stdout?.on("data",m=>{l.push(m),r?.onProgress&&Ot(m.toString("utf-8"),r.onProgress);}),u.stderr?.on("data",m=>{a.push(m);}),u.on("close",m=>{if(c&&clearTimeout(c),K)return;let j=Buffer.concat(l).toString("utf-8"),G=Buffer.concat(a).toString("utf-8"),q={success:m===T.SUCCESS,command:`7za ${e.join(" ")}`,stdout:j,stderr:G,exitCode:m};if(m===T.SUCCESS||m===T.WARNING)n(q);else {let J=N(G,j,m,r?.archivePath);Object.assign(J,{result:q}),o(J);}}),u.on("error",m=>{c&&clearTimeout(c),o(new p(`Failed to execute 7-Zip: ${m.message}`));});})}function Ot(e,r){let t=e.match(/(\d+)%/);t&&r({percent:parseInt(t[1],10)});let s=e.match(/- (.+)$/m);s&&r({file:s[1].trim()});}function nt(e){let r=e.split(`
|
|
3
|
+
`),t=[],s=0,n=0,o=0,l=0,a=null;for(let u of r){let c=u.trim();c.startsWith("Path = ")?(a?.path&&t.push(a),a={path:c.substring(7),size:0,packedSize:0,modified:new Date,attributes:"",crc:"",method:"",isDirectory:false}):a&&(c.startsWith("Size = ")?a.size=parseInt(c.substring(7),10)||0:c.startsWith("Packed Size = ")?a.packedSize=parseInt(c.substring(14),10)||0:c.startsWith("Modified = ")?a.modified=new Date(c.substring(11)):c.startsWith("Attributes = ")?(a.attributes=c.substring(13),a.isDirectory=a.attributes.includes("D")):c.startsWith("CRC = ")?a.crc=c.substring(6):c.startsWith("Method = ")?a.method=c.substring(9):c.startsWith("Encrypted = ")&&(a.encrypted=c.substring(12)==="+"));}a?.path&&t.push(a);for(let u of t)u.isDirectory?l++:(o++,s+=u.size,n+=u.packedSize);return {entries:t,stats:{totalSize:s,totalPackedSize:n,fileCount:o,dirCount:l,ratio:s>0?n/s:0}}}function H(e){let r=e.split(`
|
|
4
|
+
`),t={};for(let s of r){let n=s.match(/(\w+)\s+for data:\s+([0-9A-Fa-f]+)/);if(n){t[n[1].toLowerCase()]=n[2];continue}let o=s.match(/^([0-9A-Fa-f]+)\s+(.+)$/);if(o){let l=o[1],a=o[2].trim();t[a]=l;}}return t}function it(e){let r=e.split(`
|
|
5
|
+
`),t=[],s=true;for(let n of r){let o=n.toLowerCase();(o.includes("error")||o.includes("failed")||o.includes("cannot")||o.includes("crc failed"))&&(t.push(n.trim()),s=false);}return e.includes("Everything is Ok")&&(s=true,t.length=0),{ok:s,errors:t}}function f(e,r,t,s){let n=[e];return n.push(...r),t&&n.push(t),s&&s.length>0&&n.push(...s),n}function g(e){if(!P.existsSync(e))throw new R(e)}async function ot(e,r,t,s={}){let n=[`-si${r}`];s.password&&n.push(`-p${s.password}`),s.level&&n.push(`-mx=${s.level}`),s.method&&n.push(`-m0=${s.method}`),n.push(i.YES);let o=f(d.ADD,n,e);return new Promise((l,a)=>{try{let u=v(o,{...s,archivePath:e});t.pipe(u.stdin),u.on("close",c=>{c===0?l():a(new Error(`7-Zip exited with code ${c}`));}),u.on("error",c=>a(c)),t.on("error",c=>a(c));}catch(u){a(u);}})}function B(e,r,t={}){g(e);let s=["-so"];t.password&&s.push(`-p${t.password}`),s.push(i.YES);let n=f(d.EXTRACT,s,e,[r]),o=v(n,{...t,archivePath:e});if(!o.stdout)throw new p("Failed to get stdout from 7-Zip process");return o.stdout}async function at(e,r,t={}){let s=B(e,r,t);return new Promise((n,o)=>{let l=[];s.on("data",a=>l.push(Buffer.from(a))),s.on("error",a=>o(a)),s.on("end",()=>n(Buffer.concat(l)));})}async function y(e,r,t){let s=[];if(t?.type&&s.push(`${i.TYPE}${t.type}`),t?.level!==void 0&&s.push(`${i.LEVEL}=${t.level}`),t?.method&&s.push(`${i.METHOD}=${t.method}`),t?.dictionarySize&&s.push(`${i.DICT_SIZE}=${t.dictionarySize}`),t?.wordSize!==void 0&&s.push(`${i.WORD_SIZE}=${t.wordSize}`),t?.threads!==void 0&&s.push(`${i.THREADS}${t.threads}`),t?.solid&&s.push(`${i.SOLID}=on`),t?.sfx&&s.push(i.SFX),t?.volumes&&s.push(`${i.VOLUME}${t.volumes}`),t?.password&&(s.push(`${i.PASSWORD}${t.password}`),t.encryptFilenames&&s.push(`${i.ENCRYPT_HEADERS}=on`)),t?.includePatterns)for(let o of t.includePatterns)s.push(`${i.INCLUDE}${o}`);if(t?.excludePatterns)for(let o of t.excludePatterns)s.push(`${i.EXCLUDE}${o}`);t?.recursive===false?s.push(i.NO_RECURSE):s.push(i.RECURSE),t?.followSymlinks&&(s.push(`${i.STORE_HARDLINKS}-`),s.push(`${i.STORE_SYMLINKS}-`)),t?.storeSymlinks&&(s.push(i.STORE_HARDLINKS),s.push(i.STORE_SYMLINKS)),s.push(i.YES);let n=Array.isArray(r)?r:[r];return h(f(d.ADD,s,e,n),{onProgress:t?.onProgress,cwd:t?.cwd})}async function A(e,r){g(e);let t=[i.YES];if(r?.outputDir&&t.push(`${i.OUTPUT}${r.outputDir}`),r?.password&&t.push(`${i.PASSWORD}${r.password}`),r?.includePatterns)for(let o of r.includePatterns)t.push(`${i.INCLUDE}${o}`);if(r?.excludePatterns)for(let o of r.excludePatterns)t.push(`${i.EXCLUDE}${o}`);r?.overwrite===false?t.push(i.SKIP_EXISTING):r?.overwrite===true&&t.push(i.OVERWRITE_ALL),r?.preservePermissions&&t.push(i.PRESERVE_PERMISSIONS);let s=r?.files||[],n=r?.flat?d.EXTRACT_FLAT:d.EXTRACT;return h(f(n,t,e,s),{archivePath:e,onProgress:r?.onProgress})}async function _(e,r){g(e);let t=[i.TECH_INFO];r?.verbose&&t.push(i.VERBOSE),r?.password&&t.push(`${i.PASSWORD}${r.password}`);let s=await h(f(d.LIST,t,e),{archivePath:e}),n=nt(s.stdout);return {archive:e,size:n.stats.totalSize,packedSize:n.stats.totalPackedSize,fileCount:n.stats.fileCount,dirCount:n.stats.dirCount,entries:n.entries}}async function F(e,r){g(e);let t=[i.YES],s=[];if(r.add&&s.push(...r.add),r.update)for(let n of r.update)s.push(`!${n}`);return h(f(d.UPDATE,t,e,s),{archivePath:e,onProgress:r.onProgress,cwd:r.cwd})}async function k(e,r){g(e);let t=[i.YES],s=Array.isArray(r)?r:[r];return h(f(d.DELETE,t,e,s),{archivePath:e})}async function $(e,r){g(e);let t=[i.TIMESTAMPS];r&&t.push(`${i.PASSWORD}${r}`);let s=await h(f(d.TEST,t,e),{archivePath:e}),n=it(s.stdout+s.stderr);return {archive:e,ok:s.success&&n.ok,errors:n.errors}}async function W(e,r="crc32"){let t=[`-scrc${r}`],s=Array.isArray(e)?e:[e],n=0;for(let a of s)try{let u=P.statSync(a);n+=u.size;}catch{}let o=await h(f(d.HASH,t,void 0,s)),l=H(o.stdout);return {file:Array.isArray(e)?e[0]:e,hashes:l,size:n}}async function Pt(e,r="crc32"){g(e);let t=[`-scrc${r}`],s=await h(f(d.HASH,t,e),{archivePath:e}),n=H(s.stdout),o=P.statSync(e);return {file:e,hashes:n,size:o.size}}async function Y(e){return g(e),(await h(f(d.INFO,[],e),{archivePath:e})).stdout}async function At(e,r,t){g(e);let s=[i.YES];return h(f(d.RENAME,s,e,[r,t]),{archivePath:e})}async function X(e,r,t){g(e);let s=`${e}_temp_${Date.now()}`;P.mkdirSync(s,{recursive:true});try{await A(e,{outputDir:s});let n=t||e.replace(/\.[^.]+$/,`.${r}`);return await y(n,s,{type:r})}finally{P.rmSync(s,{recursive:true,force:true});}}async function V(e,r){let t=[i.VERBOSE];if(e)for(let s of e)t.push(`-mm=${s}`);return r&&t.push(`-mmt=${r}`),h(f(d.BENCHMARK,t))}var Z=class{constructor(r){this.binaryPath=r;}async add(r,t,s){return y(r,t,s)}async extract(r,t){return A(r,t)}async list(r,t){return _(r,t)}async update(r,t){return F(r,t)}async delete(r,t){return k(r,t)}async test(r,t){return $(r,t)}async addFromStream(r,t,s,n){return ot(r,t,s,n)}extractToStream(r,t,s){return B(r,t,s)}async extractToBuffer(r,t,s){return at(r,t,s)}async hash(r,t){return W(r,t)}async info(r){return Y(r)}async benchmark(r,t){return V(r,t)}async convert(r,t,s){return X(r,t,s)}},ur=new Z,pr={async zip(e,r){return y(r,e,{type:"zip",level:9})},async sevenz(e,r){return y(r,e,{type:"7z",level:9})},async extract(e,r){return A(e,{outputDir:r})},async list(e){return _(e)},async test(e){return $(e)}};export{R as ArchiveNotFoundError,x as BinaryNotFoundError,Q as COMPRESSION_PRESETS,I as CompressionError,b as CorruptArchiveError,D as ExtractionError,C as PasswordRequiredError,O as TimeoutError,L as UnsupportedFormatError,w as WrongPasswordError,Z as ZipWrapper,p as ZipWrapperError,y as add,V as benchmark,X as convert,k as deleteFiles,A as extract,W as hash,Pt as hashArchive,Y as info,_ as list,N as parseZipWrapperError,pr as quick,At as rename,$ as test,F as update,ur as zipWrapper};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";var y=Object.create;var d=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var $=Object.getPrototypeOf,N=Object.prototype.hasOwnProperty;var b=(e,r,o,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let a of S(r))!N.call(e,a)&&a!==o&&d(e,a,{get:()=>r[a],enumerable:!(t=z(r,a))||t.enumerable});return e};var m=(e,r,o)=>(o=e!=null?y($(e)):{},b(r||!e||!e.__esModule?d(o,"default",{value:e,enumerable:!0}):o,e));var i=m(require("fs")),h=m(require("path")),x=m(require("https"));var g=m(require("fs")),l=m(require("path"));function _(e){let r=e;for(;;){if(g.default.existsSync(l.default.join(r,"package.json")))return r;let o=l.default.dirname(r);if(o===r)return e;r=o}}var A=_(__dirname),f=l.default.join(A,"bin");var P="https://github.com/iqbal-rashed/7zip-wrapper/releases/download/latest",D=[{platform:"win",arch:"x64",filename:"win-x64-7za.exe",targetName:"7za.exe"},{platform:"win",arch:"ia32",filename:"win-x86-7za.exe",targetName:"7za.exe"},{platform:"win",arch:"arm64",filename:"win-arm64-7za.exe",targetName:"7za.exe"},{platform:"linux",arch:"x64",filename:"linux-x64-7za",targetName:"7za"},{platform:"linux",arch:"ia32",filename:"linux-x86-7za",targetName:"7za"},{platform:"linux",arch:"arm64",filename:"linux-arm64-7za",targetName:"7za"},{platform:"linux",arch:"arm",filename:"linux-arm-7za",targetName:"7za"},{platform:"mac",arch:"x64",filename:"mac-7za",targetName:"7za"},{platform:"mac",arch:"arm64",filename:"mac-7za",targetName:"7za"}],T=()=>{let e=process.platform;return e==="win32"?"win":e==="darwin"?"mac":e},U=()=>{let e=process.arch;return e==="x64"?"x64":e==="ia32"?"ia32":e==="arm64"?"arm64":e==="arm"?"arm":e},k=e=>{i.default.mkdirSync(e,{recursive:!0})},v=e=>{i.default.chmodSync(e,493)},C=(e,r)=>r?`${(e/r*100).toFixed(1)}%`:"unknown",w=(e,r)=>new Promise((o,t)=>{x.default.get(e,a=>{if((a.statusCode===301||a.statusCode===302)&&a.headers.location){w(a.headers.location,r).then(o).catch(t);return}if(a.statusCode!==200){t(new Error(`Download failed with status ${a.statusCode}`));return}let n=`${r}.download`,s=i.default.createWriteStream(n),u=Number(a.headers["content-length"])||0,p=0;a.on("data",c=>{p+=c.length,u&&process.stdout.write(` ${C(p,u)}\r`)}),a.on("error",c=>{s.destroy(),i.default.rmSync(n,{force:!0}),t(c)}),s.on("error",c=>{i.default.rmSync(n,{force:!0}),t(c)}),s.on("finish",()=>{s.close(()=>{i.default.renameSync(n,r),o()})}),a.pipe(s)}).on("error",t)}),R=async()=>{let e=T(),r=U();console.log("7-Zip binary downloader"),console.log(`Platform: ${e}`),console.log(`Architecture: ${r}
|
|
2
|
+
`);let o=D.find(n=>n.platform===e&&n.arch===r);o||(console.warn(`Warning: No pre-built binary available for ${e}-${r}`),console.log("You can use your system 7za by setting USE_SYSTEM_7ZA=true"),process.exit(0));let t=h.default.join(f,o.targetName);i.default.existsSync(t)&&(console.log(`Binary already exists: ${t}`),process.exit(0)),console.log(`Downloading: ${o.filename}`);let a=`${P}/${o.filename}`;k(f);try{await w(a,t),e!=="win"&&v(t),console.log(`
|
|
3
|
+
Successfully downloaded to: ${t}`),process.exit(0)}catch(n){console.error(`Download failed: ${n.message}`),console.log("You can use your system 7za by setting USE_SYSTEM_7ZA=true"),process.exit(1)}};R().catch(e=>{console.error(`Unexpected error: ${e.message}`),process.exit(1)}).finally(()=>process.exit(0));
|
package/package.json
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "7zip-wrapper",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "A comprehensive, feature-complete Node.js wrapper for 7-Zip with TypeScript support, bundled binaries, and cross-platform compatibility.",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"module": "./dist/index.mjs",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"require": "./dist/index.js",
|
|
12
|
+
"import": "./dist/index.mjs",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md",
|
|
19
|
+
"LICENSE"
|
|
20
|
+
],
|
|
21
|
+
"bin": {
|
|
22
|
+
"7zip": "./dist/cli.js"
|
|
23
|
+
},
|
|
24
|
+
"sideEffects": false,
|
|
25
|
+
"scripts": {
|
|
26
|
+
"build": "tsup",
|
|
27
|
+
"dev": "tsup --watch",
|
|
28
|
+
"test": "vitest run",
|
|
29
|
+
"test:watch": "vitest",
|
|
30
|
+
"test:coverage": "vitest --coverage",
|
|
31
|
+
"lint": "eslint .",
|
|
32
|
+
"lint:fix": "eslint . --fix",
|
|
33
|
+
"format": "prettier --write .",
|
|
34
|
+
"format:check": "prettier --check .",
|
|
35
|
+
"typecheck": "tsc --noEmit",
|
|
36
|
+
"prepublishOnly": "npm run build",
|
|
37
|
+
"postdownload": "node ./dist/postinstall.js",
|
|
38
|
+
"postinstall": "node -e \"process.env.INIT_CWD !== process.cwd() && require('child_process').execSync('npm run postdownload', { stdio: 'inherit' });\""
|
|
39
|
+
},
|
|
40
|
+
"keywords": [
|
|
41
|
+
"7zip",
|
|
42
|
+
"7-zip",
|
|
43
|
+
"archive",
|
|
44
|
+
"compression",
|
|
45
|
+
"extract",
|
|
46
|
+
"zip",
|
|
47
|
+
"7z",
|
|
48
|
+
"tar",
|
|
49
|
+
"gzip",
|
|
50
|
+
"bzip2",
|
|
51
|
+
"xz",
|
|
52
|
+
"rar",
|
|
53
|
+
"iso",
|
|
54
|
+
"wrapper",
|
|
55
|
+
"nodejs",
|
|
56
|
+
"typescript"
|
|
57
|
+
],
|
|
58
|
+
"license": "MIT",
|
|
59
|
+
"engines": {
|
|
60
|
+
"node": ">=18.0.0"
|
|
61
|
+
},
|
|
62
|
+
"author": "Iqbal Rashed",
|
|
63
|
+
"repository": {
|
|
64
|
+
"type": "git",
|
|
65
|
+
"url": "https://github.com/iqbal-rashed/7zip-wrapper.git"
|
|
66
|
+
},
|
|
67
|
+
"bugs": {
|
|
68
|
+
"url": "https://github.com/iqbal-rashed/7zip-wrapper/issues"
|
|
69
|
+
},
|
|
70
|
+
"homepage": "https://github.com/iqbal-rashed/7zip-wrapper#readme",
|
|
71
|
+
"devDependencies": {
|
|
72
|
+
"@eslint/js": "^9.18.0",
|
|
73
|
+
"@types/node": "^22.10.5",
|
|
74
|
+
"@vitest/coverage-v8": "^4.0.16",
|
|
75
|
+
"eslint": "^9.18.0",
|
|
76
|
+
"globals": "^15.14.0",
|
|
77
|
+
"prettier": "^3.4.2",
|
|
78
|
+
"tsup": "^8.5.1",
|
|
79
|
+
"typescript": "^5.9.3",
|
|
80
|
+
"typescript-eslint": "^8.19.1",
|
|
81
|
+
"vitest": "^4.0.16"
|
|
82
|
+
},
|
|
83
|
+
"dependencies": {}
|
|
84
|
+
}
|