@mherod/get-cookie 4.4.3 → 4.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -3
- package/dist/bun.cjs +77 -0
- package/dist/bun.cjs.map +1 -0
- package/dist/bun.d.cts +3 -0
- package/dist/bun.d.ts +3 -0
- package/dist/bun.js +77 -0
- package/dist/bun.js.map +1 -0
- package/dist/cli.cjs +14 -11
- package/dist/cli.cjs.map +1 -1
- package/dist/index.cjs +11 -11
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +98 -38
- package/dist/index.d.ts +98 -38
- package/dist/index.js +11 -11
- package/dist/index.js.map +1 -1
- package/dist/node.cjs +77 -0
- package/dist/node.cjs.map +1 -0
- package/dist/node.d.cts +3 -0
- package/dist/node.d.ts +3 -0
- package/dist/node.js +77 -0
- package/dist/node.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +32 -14
- package/.claude/settings.local.json +0 -3
- package/.dependency-cruiser.js +0 -277
- package/.env.example +0 -5
- package/.husky/commit-msg +0 -19
- package/.husky/pre-commit +0 -29
- package/.husky/pre-push +0 -21
- package/.idea/codeStyles/Project.xml +0 -59
- package/.idea/codeStyles/codeStyleConfig.xml +0 -5
- package/.idea/get-cookie.iml +0 -13
- package/.idea/git_toolbox_prj.xml +0 -15
- package/.idea/jsLibraryMappings.xml +0 -6
- package/.idea/modules.xml +0 -8
- package/.idea/prettier.xml +0 -9
- package/.idea/runConfigurations/build.xml +0 -12
- package/.idea/vcs.xml +0 -6
- package/.nvmrc +0 -1
- package/biome.json +0 -117
- package/commitlint.config.js +0 -12
- package/eslint.config.js +0 -255
- package/examples/README.md +0 -71
- package/examples/advanced-usage.ts +0 -56
- package/examples/auth-tokens.ts +0 -143
- package/examples/basic-usage.ts +0 -43
- package/examples/cli-examples.sh +0 -51
- package/examples/comprehensive-demo.ts +0 -202
- package/examples/curl-integration.sh +0 -311
- package/examples/features-demo.sh +0 -260
- package/examples/github-auth.sh +0 -295
- package/examples/quick-start.sh +0 -115
- package/jest.setup.js +0 -34
- package/tsconfig.build.json +0 -9
- package/tsconfig.cli.json +0 -16
- package/tsconfig.tsup.json +0 -12
- package/tsup.cli.ts +0 -59
- package/tsup.lib.ts +0 -46
- package/typedoc.json +0 -17
package/README.md
CHANGED
|
@@ -25,9 +25,13 @@ curl -H "Cookie: auth=$(get-cookie auth api.example.com)" https://api.example.co
|
|
|
25
25
|
```
|
|
26
26
|
|
|
27
27
|
```typescript
|
|
28
|
-
// Node.js
|
|
28
|
+
// Auto-detecting (works in both Node.js and Bun)
|
|
29
29
|
import { getCookie } from "@mherod/get-cookie";
|
|
30
30
|
|
|
31
|
+
// Or use a runtime-specific entrypoint for deterministic behavior:
|
|
32
|
+
// import { getCookie } from "@mherod/get-cookie/node";
|
|
33
|
+
// import { getCookie } from "@mherod/get-cookie/bun";
|
|
34
|
+
|
|
31
35
|
const cookies = await getCookie({
|
|
32
36
|
name: "auth_token",
|
|
33
37
|
domain: "api.example.com",
|
|
@@ -81,7 +85,18 @@ nvm use
|
|
|
81
85
|
|
|
82
86
|
The project includes an `.nvmrc` file that specifies the required Node.js version, so `nvm use` will automatically switch to the correct version when you're in the project directory.
|
|
83
87
|
|
|
84
|
-
Bun is also supported natively — `bun:sqlite` is used automatically when running under Bun
|
|
88
|
+
Bun is also supported natively — `bun:sqlite` is used automatically when running under Bun. You can also use explicit runtime entrypoints for deterministic behavior:
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
// Auto-detect runtime (default — works everywhere)
|
|
92
|
+
import { getCookie } from "@mherod/get-cookie";
|
|
93
|
+
|
|
94
|
+
// Force Node.js (always uses better-sqlite3)
|
|
95
|
+
import { getCookie } from "@mherod/get-cookie/node";
|
|
96
|
+
|
|
97
|
+
// Force Bun (always uses bun:sqlite)
|
|
98
|
+
import { getCookie } from "@mherod/get-cookie/bun";
|
|
99
|
+
```
|
|
85
100
|
|
|
86
101
|
## More Examples
|
|
87
102
|
|
|
@@ -107,6 +122,9 @@ get-cookie auth example.com --browser chrome --profile "Work"
|
|
|
107
122
|
### API Usage
|
|
108
123
|
|
|
109
124
|
```typescript
|
|
125
|
+
// Use the root import (auto-detects runtime) or a specific entrypoint:
|
|
126
|
+
// import { getCookie, batchGetCookies } from "@mherod/get-cookie/node";
|
|
127
|
+
// import { getCookie, batchGetCookies } from "@mherod/get-cookie/bun";
|
|
110
128
|
import { getCookie, batchGetCookies } from "@mherod/get-cookie";
|
|
111
129
|
|
|
112
130
|
// Single cookie
|
|
@@ -152,7 +170,7 @@ get-cookie % example.com --output json > cookies-backup.json
|
|
|
152
170
|
- **Multiple profiles**: Works with all browser profiles (Personal, Work, etc.)
|
|
153
171
|
- **Batch operations**: Get multiple cookies efficiently with built-in SQL optimization (2-3x faster)
|
|
154
172
|
- **Cross-platform**: macOS, Linux, Windows support
|
|
155
|
-
- **Bun support**: Works natively in Bun environments using `bun:sqlite`, with automatic runtime detection
|
|
173
|
+
- **Bun support**: Works natively in Bun environments using `bun:sqlite`, with automatic runtime detection and explicit `@mherod/get-cookie/bun` entrypoint
|
|
156
174
|
- **Output formats**: Raw values, JSON, pretty-printed tables
|
|
157
175
|
|
|
158
176
|
## Browser Support 🌐
|
package/dist/bun.cjs
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
'use strict';var os=require('os'),dotenv=require('dotenv'),zod=require('zod'),consola=require('consola'),fs=require('fs'),Ft=require('better-sqlite3'),child_process=require('child_process'),util=require('util'),path=require('path'),Oo=require('fast-glob'),ct=require('readline'),crypto=require('crypto'),events=require('events'),promises=require('fs/promises'),buffer=require('buffer'),Jo=require('destr');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Ft__default=/*#__PURE__*/_interopDefault(Ft);var Oo__default=/*#__PURE__*/_interopDefault(Oo);var ct__default=/*#__PURE__*/_interopDefault(ct);var Jo__default=/*#__PURE__*/_interopDefault(Jo);var Re=Object.defineProperty;var yt=Object.getOwnPropertyDescriptor;var wt=Object.getOwnPropertyNames;var bt=Object.prototype.hasOwnProperty;var Ct=(o=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(o,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):o)(function(o){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+o+'" is not supported')});var A=(o,e)=>()=>(o&&(e=o(o=0)),e);var X=(o,e)=>{for(var r in e)Re(o,r,{get:e[r],enumerable:true});},xt=(o,e,r,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of wt(e))!bt.call(o,n)&&n!==r&&Re(o,n,{get:()=>e[n],enumerable:!(t=yt(e,n))||t.enumerable});return o};var Oe=o=>xt(Re({},"__esModule",{value:true}),o);function d(o){return o instanceof Error?o.message:typeof o=="string"?o:o!=null&&typeof o=="object"&&"message"in o?String(o.message):String(o)}function J(o){let e=d(o);if(o instanceof Error){let r={message:e};return o.stack!==void 0&&(r.stack=o.stack),o.name!==void 0&&(r.name=o.name),"code"in o&&o.code!==void 0&&(r.code=String(o.code)),r}return {message:e}}function S(o,e){return d(o).toLowerCase().includes(e.toLowerCase())}function de(o,e){return e.some(r=>o.includes(r))}function dr(o){let e=d(o).toLowerCase();return de(e,me.locked)?"locked":de(e,me.busy)?"busy":de(e,me.permission)?"permission":de(e,me.not_found)?"not_found":null}function K(o,e){let r=J(o);return {...e,error:r.message,errorName:r.name,errorCode:r.code,...process.env.NODE_ENV!=="production"&&r.stack!==void 0&&r.stack!==""?{errorStack:r.stack}:{}}}function ge(o){return o instanceof Error}function z(o,e="An unknown error occurred"){if(o instanceof Error)return o;let r=d(o)||e,t=new Error(r);return "cause"in t&&(t.cause=o),t}var me,x=A(()=>{me={locked:["database is locked","database locked","sqlite_busy"],busy:["busy"],permission:["eperm","permission denied","operation not permitted","eacces"],not_found:["enoent","no such file","not found"]};});var vt,De,gr=A(()=>{dotenv.config();vt=zod.z.object({LOG_LEVEL:zod.z.enum(["debug","info","warn","error"]).default("info"),HOME:zod.z.string().optional().transform(o=>o??process.env.USERPROFILE??"").pipe(zod.z.string().min(1))}),De=vt.parse({LOG_LEVEL:process.env.LOG_LEVEL,HOME:os.homedir()});});var Bt,Pt,C,Y=A(()=>{gr();Bt=consola.createConsola({formatOptions:{showLogLevel:false,colors:true,date:false,compact:true,columns:typeof process.stdout.columns=="number"?process.stdout.columns:80},level:De.LOG_LEVEL==="debug"?5:2}),De.LOG_LEVEL==="debug",Pt=Bt,C=Pt;});function ne(o,e,r){let t=d(e);C.error(o,{...r,error:t});}function Z(o,e,r){C.warn(`[${o}] ${e}`,r);}function h(o){return C.withTag(o)}var E=A(()=>{x();Y();Y();});var wr={};X(wr,{createNodeFileSystemAdapter:()=>Te});function Te(){return {fileExists(o){return fs.existsSync(o)},getFileModificationTime(o){try{return fs.statSync(o).mtimeMs}catch(e){yr.debug("Failed to read file modification time",{path:o,error:e});return}},readFile(o){return fs.readFileSync(o)},readTextFile(o){return fs.readFileSync(o,"utf8")},readLeadingBytes(o,e){let r;try{r=fs.openSync(o,"r");let t=Buffer.alloc(e),n=fs.readSync(r,t,0,e,0);return n<e?t.subarray(0,n):t}catch(t){return yr.debug("Failed to read leading bytes",{path:o,length:e,error:t}),null}finally{r!==void 0&&fs.closeSync(r);}}}}var yr,Fe=A(()=>{E();yr=h("NodeFileSystemAdapter");});function Cr(o){ye=o;}function we(){if(ye!==void 0)return ye;let{createNodeFileSystemAdapter:o}=(Fe(),Oe(wr)),e=o();return ye=e,e}function v(o){return we().fileExists(o)}function xr(o){return we().readFile(o)}function F(o){return we().readTextFile(o)}var ye,T=A(()=>{});var kr={};X(kr,{BunSqliteAdapter:()=>Le});var Ne,Le,Sr=A(()=>{Ne=class{constructor(e){this.statement=e;}all(...e){return this.statement.all(...e)}get(...e){return this.statement.get(...e)}run(...e){this.statement.run(...e);}},Le=class{constructor(e,r={}){if(typeof globalThis.Bun>"u")throw new Error("BunSqliteAdapter can only be used in a Bun runtime environment");let{Database:t}=Ct("bun:sqlite"),n={readonly:r.readonly??false,...r.fileMustExist?{create:false}:{}};this.db=new t(e,n),this.readonly=r.readonly??false;}prepare(e){let r=this.db.prepare(e);return new Ne(r)}pragma(e){let r=`PRAGMA ${e}`;this.db.exec(r);}close(){this.db.close();}};});var vr={};X(vr,{BetterSqlite3Adapter:()=>$e});var Me,$e,Er=A(()=>{Me=class{constructor(e){this.statement=e;}all(...e){return this.statement.all(...e)}get(...e){return this.statement.get(...e)}run(...e){this.statement.run(...e);}},$e=class{constructor(e,r={}){this.db=new Ft__default.default(e,{readonly:r.readonly??false,fileMustExist:r.fileMustExist??false}),this.readonly=r.readonly??false;}prepare(e){let r=this.db.prepare(e);return new Me(r)}pragma(e){return this.db.pragma(e)}close(){this.db.close();}};});function b(){return Rr??(Rr=os.platform()),Rr}function N(){return b()==="darwin"}function D(){return b()==="win32"}function _e(){let o=b();return o==="darwin"||o==="win32"||o==="linux"}function ee(){if(!_e())throw new Error(`Unsupported platform: ${b()}. Supported platforms are: darwin, win32, linux`)}var Rr,B=A(()=>{});async function L(o,e){try{let r=await qt(o,{...e,encoding:"utf8"});return {stdout:r.stdout.toString(),stderr:r.stderr.toString()}}catch(r){throw ne("Command execution failed",r,{command:o}),new Qe(d(r),o,ge(r)?r:void 0)}}var qt,Qe,ie=A(()=>{x();E();qt=util.promisify(child_process.exec),Qe=class extends Error{constructor(r,t,n){super(r);this.command=t;this.originalError=n;this.name="CommandExecutionError";}};});var Vr,Wr=A(()=>{B();Vr=(()=>{let o=os.homedir();if(!o)throw new Error("Unable to determine user home directory");switch(ee(),b()){case "darwin":return path.join(o,"Library","Application Support","Google","Chrome");case "win32":return path.join(o,"AppData","Local","Google","Chrome","User Data");case "linux":return path.join(o,".config","google-chrome");default:throw new Error(`Platform ${b()} is not supported`)}})();});var jr={};X(jr,{getChromePassword:()=>Co});async function bo(o){let e=Buffer.from("DPAPI");if(!o.subarray(0,5).equals(e))throw new Error("Invalid DPAPI key prefix");let r=o.subarray(5);if(D())try{let n=await import('@primno/dpapi');if(typeof n.unprotectData=="function")return n.unprotectData(r)}catch(t){process.env.VERBOSE!==void 0&&process.env.VERBOSE!==""&&console.warn("DPAPI module not available:",t);}throw new Error("Windows DPAPI decryption requires native bindings. Install @primno/dpapi package for Windows support.")}async function Co(){try{let o=path.join(Vr,"Local State"),e=F(o),r=JSON.parse(e);if(!r.os_crypt.encrypted_key)throw new Error("No encrypted key found in Chrome Local State");let t=Buffer.from(r.os_crypt.encrypted_key,"base64");return (await bo(t)).toString("latin1")}catch(o){throw new Error(`Failed to retrieve Chrome password on Windows: ${d(o)}`)}}var Xr=A(()=>{x();B();T();Wr();});var Jr={};X(Jr,{getChromePassword:()=>xo});async function xo(){try{let r=(await L("secret-tool lookup application chrome-libsecret-password-v2 || secret-tool lookup application chrome")).stdout.trim();if(r)return r}catch{}try{let r=(await L(`python3 -c "import keyring; print(keyring.get_password('Chrome Safe Storage', 'Chrome'))"`)).stdout.trim();if(r&&r!=="None")return r}catch{}try{let r=(await L('kwallet-query kdewallet -f "Chrome Safe Storage" -r Chrome')).stdout.trim();if(r)return r}catch{}return "peanuts"}var Kr=A(()=>{ie();});var Zr={};X(Zr,{CookieQueryBuilder:()=>H,createQueryBuilder:()=>Po,isSqlBrowser:()=>xe});function Po(o){return new H(o)}function xe(o){return o in Yr}var Yr,H,rr=A(()=>{Yr={chrome:{tableName:"cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host_key",expiryColumn:"expires_utc",encryptedValueColumn:"encrypted_value",pathColumn:"path",secureColumn:"is_secure",httpOnlyColumn:"is_httponly"},chromium:{tableName:"cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host_key",expiryColumn:"expires_utc",encryptedValueColumn:"encrypted_value",pathColumn:"path",secureColumn:"is_secure",httpOnlyColumn:"is_httponly"},edge:{tableName:"cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host_key",expiryColumn:"expires_utc",encryptedValueColumn:"encrypted_value",pathColumn:"path",secureColumn:"is_secure",httpOnlyColumn:"is_httponly"},opera:{tableName:"cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host_key",expiryColumn:"expires_utc",encryptedValueColumn:"encrypted_value",pathColumn:"path",secureColumn:"is_secure",httpOnlyColumn:"is_httponly"},"opera-gx":{tableName:"cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host_key",expiryColumn:"expires_utc",encryptedValueColumn:"encrypted_value",pathColumn:"path",secureColumn:"is_secure",httpOnlyColumn:"is_httponly"},brave:{tableName:"cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host_key",expiryColumn:"expires_utc",encryptedValueColumn:"encrypted_value",pathColumn:"path",secureColumn:"is_secure",httpOnlyColumn:"is_httponly"},arc:{tableName:"cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host_key",expiryColumn:"expires_utc",encryptedValueColumn:"encrypted_value",pathColumn:"path",secureColumn:"is_secure",httpOnlyColumn:"is_httponly"},vivaldi:{tableName:"cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host_key",expiryColumn:"expires_utc",encryptedValueColumn:"encrypted_value",pathColumn:"path",secureColumn:"is_secure",httpOnlyColumn:"is_httponly"},firefox:{tableName:"moz_cookies",nameColumn:"name",valueColumn:"value",domainColumn:"host",expiryColumn:"expiry",pathColumn:"path",secureColumn:"isSecure",httpOnlyColumn:"isHttpOnly"}},H=class{constructor(e){if(this.browser=e,!xe(e))throw new Error(`Unsupported browser type: ${e}`);this.schema=Yr[e];}buildSelectQuery(e){let{name:r,domain:t,exactDomain:n,limit:i,includeExpired:s,container:a}=e,c=this.schema,l=this.buildSelectColumns(),{whereClause:u,params:g}=this.buildWhereClause(r,t,n,s,a),R=`SELECT ${l} FROM ${c.tableName}`;return u&&(R+=` WHERE ${u}`),R+=` ORDER BY ${c.expiryColumn} DESC`,i!==void 0&&i>0&&(R+=` LIMIT ${i}`),{sql:R,params:g,description:`Query ${this.browser} cookies: name=${r}, domain=${t}`}}buildBatchSelectQuery(e){if(e.length===0)throw new Error("At least one spec is required for batch query");let r=this.schema,t=this.buildSelectColumns(),n=[],i=[];for(let l of e){let{whereClause:u,params:g}=this.buildWhereClause(l.name,l.domain,l.exactDomain,l.includeExpired,l.container);u&&(n.push(`(${u})`),i.push(...g));}let s=n.join(" OR "),a=`SELECT ${t} FROM ${r.tableName}`;s&&(a+=` WHERE ${s}`),a+=` ORDER BY ${r.expiryColumn} DESC`;let c=e.reduce((l,u)=>u.limit!==void 0&&u.limit>0?l!==void 0?Math.min(l,u.limit):u.limit:l,void 0);return c!==void 0&&c>0&&(a+=` LIMIT ${c*e.length}`),{sql:a,params:i,description:`Batch query ${this.browser} cookies for ${e.length} specs`}}buildMetaQuery(e){if(this.browser==="firefox")throw new Error("Firefox does not have a meta table");return {sql:"SELECT value FROM meta WHERE key = ?",params:[e],description:`Get metadata: ${e}`}}buildTableExistsQuery(){return {sql:"SELECT name FROM sqlite_master WHERE type='table' AND name=?",params:[this.schema.tableName],description:`Check if ${this.schema.tableName} table exists`}}buildSelectColumns(){let e=this.schema,r=[e.nameColumn,e.domainColumn,e.expiryColumn];return e.encryptedValueColumn!==void 0&&this.browser!=="firefox"?r.push(e.encryptedValueColumn):r.push(e.valueColumn),e.pathColumn!==void 0&&r.push(e.pathColumn),e.secureColumn!==void 0&&r.push(e.secureColumn),e.httpOnlyColumn!==void 0&&r.push(e.httpOnlyColumn),this.browser==="firefox"&&r.push("originAttributes"),r.map(t=>{switch(t){case e.domainColumn:return `${t} AS domain`;case e.expiryColumn:return `${t} AS expiry`;case e.encryptedValueColumn:return `${t} AS encrypted_value`;case e.valueColumn:return `${t} AS value`;case e.nameColumn:return `${t} AS name`;case e.pathColumn:return `${t} AS path`;case e.secureColumn:return `${t} AS is_secure`;case e.httpOnlyColumn:return `${t} AS is_httponly`;default:return t}}).join(", ")}addDomainCondition(e,r,t,n,i){if(i===true){e.push(`${t} = ?`),r.push(n);return}n.startsWith(".")?(e.push(`${t} LIKE ?`),r.push(`%${n}`)):(e.push(`(${t} = ? OR ${t} = ? OR ${t} LIKE ?)`),r.push(n,`.${n}`,`%.${n}`));}buildWhereClause(e,r,t,n,i){let s=this.schema,a=[],c=[];if(e==="%"||(e.includes("%")||e.includes("_")?(a.push(`${s.nameColumn} LIKE ?`),c.push(e)):(a.push(`${s.nameColumn} = ?`),c.push(e))),r!==""&&this.addDomainCondition(a,c,s.domainColumn,r,t),n!==true)if(this.browser==="firefox"){let l=Math.floor(Date.now()/1e3);a.push(`${s.expiryColumn} > ?`),c.push(l);}else a.push(`${s.expiryColumn} > 0`);if(this.browser==="firefox"&&i!==void 0)if(String(i).toLowerCase()==="none")a.push("(originAttributes IS NULL OR originAttributes NOT LIKE '%userContextId=%')");else {let l=typeof i=="number"?i:Number.parseInt(String(i),10);Number.isNaN(l)||(a.push("(originAttributes LIKE ? OR originAttributes LIKE ?)"),c.push(`%userContextId=${l}`,`%userContextId=${l}&%`));}return {whereClause:a.join(" AND "),params:c}}static validateQueryParams(e){let{name:r,domain:t,limit:n}=e;if(typeof r!="string"||r.length===0)throw new Error("Cookie name must be a non-empty string");if(typeof t!="string"||t.length===0)throw new Error("Domain must be a non-empty string");let i=["SELECT","INSERT","UPDATE","DELETE","DROP","CREATE","ALTER","--",";"],s=(a,c)=>{let l=a.toUpperCase();for(let u of i)if(l.includes(u))throw new Error(`Invalid ${c}: contains SQL keyword '${u}'`)};if(s(r,"name"),s(t,"domain"),n!==void 0&&(!Number.isInteger(n)||n<=0||n>1e4))throw new Error("Limit must be a positive integer between 1 and 10000")}getBrowserType(){return this.browser}getSchema(){return Object.freeze({...this.schema})}};});Fe();function br(){return Te()}T();var Ie;function Br(o){Ie=o;}function Nt(){return Ie!==void 0?Ie:typeof globalThis.Bun<"u"?"bun":"node"}function Pr(o,e={}){if(Nt()==="bun")try{let n=(Sr(),Oe(kr)).BunSqliteAdapter;return new n(o,e)}catch{}let t=(Er(),Oe(vr)).BetterSqlite3Adapter;return new t(o,e)}x();async function Ar(o,e,r=[]){return o.length===0?r:(await Promise.all(o.map(async n=>{try{return await e(n)}catch{return r}}))).flat()}E();var qe=class{constructor(e){this.strategies=e;this.logger=h("CompositeCookieQueryStrategy");this.browserName="internal";}handleStrategyError(e,r){this.logger.error("Strategy failed",{...J(e),strategy:r});}async queryCookies(e,r,t,n){try{return this.logger.info("Querying cookies from all strategies",{name:e,domain:r,store:t,force:n,strategyCount:this.strategies.length}),await Ar(this.strategies,async i=>{try{return await i.queryCookies(e,r,t,n)}catch(s){return this.handleStrategyError(s,i),[]}},[])}catch(i){return this.logger.error("Failed to query cookies",{...J(i)}),[]}}};B();function Or(o){let e=os.homedir();if(!e)throw new Error("Unable to determine user home directory");ee();let r=b(),n={chrome:{windows:path.join(e,"AppData","Local","Google","Chrome","User Data"),macos:path.join(e,"Library","Application Support","Google","Chrome"),linux:path.join(e,".config","google-chrome")},chromium:{windows:path.join(e,"AppData","Local","Chromium","User Data"),macos:path.join(e,"Library","Application Support","Chromium"),linux:path.join(e,".config","chromium")},brave:{windows:path.join(e,"AppData","Local","BraveSoftware","Brave-Browser","User Data"),macos:path.join(e,"Library","Application Support","BraveSoftware","Brave-Browser"),linux:path.join(e,".config","BraveSoftware","Brave-Browser")},edge:{windows:path.join(e,"AppData","Local","Microsoft","Edge","User Data"),macos:path.join(e,"Library","Application Support","Microsoft Edge"),linux:path.join(e,".config","microsoft-edge")},arc:{windows:path.join(e,"AppData","Local","Arc","User Data"),macos:path.join(e,"Library","Application Support","Arc","User Data"),linux:path.join(e,".config","arc")},opera:{windows:path.join(e,"AppData","Roaming","Opera Software","Opera Stable"),macos:path.join(e,"Library","Application Support","com.operasoftware.Opera"),linux:path.join(e,".config","opera")},"opera-gx":{windows:path.join(e,"AppData","Roaming","Opera Software","Opera GX Stable"),macos:path.join(e,"Library","Application Support","com.operasoftware.OperaGX"),linux:path.join(e,".config","opera-gx")},vivaldi:{windows:path.join(e,"AppData","Local","Vivaldi","User Data"),macos:path.join(e,"Library","Application Support","Vivaldi"),linux:path.join(e,".config","vivaldi")},whale:{windows:path.join(e,"AppData","Local","Naver","Naver Whale","User Data"),macos:path.join(e,"Library","Application Support","Naver","Whale"),linux:path.join(e,".config","naver-whale")}}[o];switch(r){case "win32":return n.windows;case "darwin":return n.macos;case "linux":return n.linux;default:throw new Error(`Platform ${r} is not supported`)}}T();x();B();x();ie();E();B();var Dr=h("ProcessDetector");function _t(o,e){let r=o.trim().split(/\s+/);if(r.length<2)return null;let t=r[1];if(t===void 0||t==="")return null;let n=Number.parseInt(t,10);if(Number.isNaN(n))return null;let i=r.slice(10).join(" ");return {pid:n,command:i!==""?i:e,details:o.trim()}}function Qt(o,e){let r=o.split(",").map(i=>i.replace(/"/g,"").trim());if(r.length<2)return null;let t=r[1];if(t===void 0||t==="")return null;let n=Number.parseInt(t,10);return Number.isNaN(n)?null:{pid:n,command:r[0]??e,details:o.trim()}}async function He(o,e){try{let r;if(D()){let s={firefox:"firefox.exe",chrome:"chrome.exe","google chrome":"chrome.exe",chromium:"chromium.exe",safari:"safari.exe",edge:"msedge.exe"},a=s[o.toLowerCase()]??s[e.toLowerCase()]??`${o.toLowerCase()}.exe`;r=`tasklist /FI "IMAGENAME eq ${a}" /FO CSV | findstr /i "${a}"`;}else r=`ps aux | grep -i '${e}' | grep -v grep`;let{stdout:t}=await L(r);if(!t||t.trim()==="")return [];let n=[],i=t.split(`
|
|
2
|
+
`).filter(s=>s.trim()!=="");for(let s of i){let a=D()?Qt(s,o.toLowerCase()):_t(s,o.toLowerCase());a&&n.push(a);}return Dr.debug(`${o} process detection completed`,{processCount:n.length,processes:n.map(s=>({pid:s.pid,command:s.command})),platform:b()}),n}catch(r){return Dr.debug(`Failed to detect ${o} processes`,{error:d(r),platform:b()}),[]}}async function Tr(){return He("Firefox","firefox")}async function Fr(){return He("Chrome","google chrome\\|chromium")}async function Nr(){return He("Safari","/Applications/Safari.app/Contents/MacOS/Safari")}function Lr(o,e){if(e.length===0)return "";let r=e.length,t=o.charAt(0).toUpperCase()+o.slice(1);return `${t} is currently running (${r} process${r>1?"es":""} detected). For reliable cookie access, consider closing ${t} and trying again. Alternatively, use the --force flag to attempt access despite the lock.`}function Mr(o){if(o==null||typeof o!="number"||Number.isNaN(o))return;if(o<=0)return "Infinity";let e=o/1e6-11644473600;return e<0||e>3250368e4?"Infinity":new Date(e*1e3)}x();E();var Ht={info:()=>{},warn:()=>{},error:()=>{},debug:()=>{},success:()=>{},fatal:()=>{},log:()=>{}},_=class{constructor(e,r){this.browserName=r;let t=h(e);this.logger=t||Ht;}async queryCookies(e,r,t,n){try{return this.logger.info("Querying cookies",{name:e,domain:r,store:t,force:n}),await this.executeQuery(e,r,t,n)}catch(i){let s=J(i);return this.logger.error("Failed to query cookies",{...s,browser:this.browserName,strategy:this.constructor.name,name:e,domain:r,store:t,force:n}),[]}}};E();B();var Ge=util.promisify(child_process.exec),k=h("BrowserControl");function Vt(){let o=process.env.CI==="true"||process.env.CI==="1",e=process.env.NODE_ENV==="test"||process.env.JEST_WORKER_ID!==void 0;return process.stdin.isTTY&&process.stdout.isTTY&&!o&&!e}var Ue={Firefox:"Firefox",Chrome:"Google Chrome",Safari:"Safari"};async function ze(o){try{let e=Ue[o];if(!e)return k.debug("Browser not supported for macOS control",{browserName:o}),!1;let r=`tell application "System Events" to (name of processes) contains "${e}"`,{stdout:t}=await Ge(`osascript -e '${r}'`);return t.trim()==="true"}catch(e){return k.debug("Failed to check if browser is running",{browserName:o,error:e}),false}}async function Wt(o){try{let e=Ue[o];if(!e)return k.debug("Browser not supported for macOS control",{browserName:o}),!1;let r=`tell application "${e}" to quit`;return await Ge(`osascript -e '${r}'`),await new Promise(n=>setTimeout(n,2e3)),await ze(o)?(k.warn("Browser did not quit gracefully",{browserName:o}),!1):(k.info("Browser quit successfully",{browserName:o}),!0)}catch(e){return k.error("Failed to quit browser",{browserName:o,error:e}),false}}async function jt(o){try{let e=Ue[o];if(!e){k.debug("Browser not supported for macOS control",{browserName:o});return}if(o==="Firefox"){let r=`
|
|
3
|
+
tell application "${e}"
|
|
4
|
+
activate
|
|
5
|
+
end tell
|
|
6
|
+
tell application "System Events"
|
|
7
|
+
keystroke "d" using {command down, shift down}
|
|
8
|
+
delay 0.5
|
|
9
|
+
key code 36
|
|
10
|
+
end tell
|
|
11
|
+
`;await Ge(`osascript -e '${r}'`),k.debug("Attempted to save Firefox session",{browserName:o});}else o==="Chrome"?k.debug("Chrome will restore tabs automatically",{browserName:o}):k.debug("Safari will restore tabs automatically",{browserName:o});}catch(e){k.debug("Failed to save browser session",{browserName:o,error:e});}}async function Xt(o){if(!Vt())return k.debug("Non-interactive environment detected, skipping prompt",{browserName:o,CI:process.env.CI,NODE_ENV:process.env.NODE_ENV,JEST_WORKER_ID:process.env.JEST_WORKER_ID,stdin_tty:process.stdin.isTTY,stdout_tty:process.stdout.isTTY}),false;let e=ct__default.default.createInterface({input:process.stdin,output:process.stdout});return new Promise(r=>{e.question(`
|
|
12
|
+
\u26A0\uFE0F ${o} is currently running and blocking cookie access.
|
|
13
|
+
Would you like to close ${o}? Your tabs will be restored when you reopen it. (y/N): `,t=>{e.close(),r(t.toLowerCase()==="y"||t.toLowerCase()==="yes");});})}async function $r(o,e={}){if(!N())return k.debug("Browser control only supported on macOS"),false;try{if(!await ze(o))return k.debug("Browser is not running",{browserName:o}),!0;if(e.interactive===!0&&e.force!==!0&&!await Xt(o))return k.info("User cancelled browser close",{browserName:o}),!1;await jt(o);let t=await Wt(o);return t?k.success(`${o} closed successfully. Tabs will be restored on next launch.`):k.warn(`Failed to close ${o}. You may need to close it manually.`),t}catch(r){return k.error("Failed to control browser",{browserName:o,error:r}),false}}async function Ir(o,e=1e4){if(!N())return false;let r=Date.now(),t=500;for(;Date.now()-r<e;){if(!await ze(o))return true;await new Promise(i=>setTimeout(i,t));}return false}x();x();E();B();var be=util.promisify(child_process.execFile),O=h("FileHandleDetector");function Yt(o){let e=o.trim().split(/\s+/);if(e.length<2)return null;let r=e[1];if(r===void 0||r==="")return null;let t=Number.parseInt(r,10);if(Number.isNaN(t))return null;let n={pid:t,command:e[2]??"unknown"},i=e[0];i!==void 0&&i!==""&&(n.user=i);let s=e[3];return s!==void 0&&s!==""&&(n.mode=s),n}function Zt(o){return o!==null&&typeof o=="object"&&"ProcessId"in o&&"ProcessName"in o}function eo(o){let e=[];try{let r=JSON.parse(o),t=Array.isArray(r)?r:[r];for(let n of t){if(!Zt(n))continue;let i=n.ProcessId,s=n.ProcessName;typeof i=="string"&&i!==""&&e.push({command:typeof s=="string"?s:"unknown",pid:Number.parseInt(i,10)});}}catch(r){O.debug("Failed to parse PowerShell output",{error:d(r)});}return e}async function ro(o){try{let{stdout:e}=await be("lsof",[o],{encoding:"utf8"});if(!e||e.trim()==="")return [];let r=e.split(`
|
|
14
|
+
`).slice(1),t=[];for(let n of r){let i=n.trim().split(/\s+/),s=i[0],a=i[1],c=i[2],l=i[3];if(s!==void 0&&s!==""&&a!==void 0&&a!==""&&i.length>=4){let u=Number.parseInt(a,10);if(!Number.isNaN(u)){let g={command:s,pid:u};c!==void 0&&c!==""&&(g.user=c),l!==void 0&&l!==""&&(g.fd=l,g.mode=l.includes("w")?"write":"read"),t.push(g);}}}return O.debug("Detected file handles with lsof",{file:o,handleCount:t.length}),t}catch(e){let r=d(e);return S(e,"ENOENT")?O.debug("lsof not available on this system"):S(e,"No such file")?O.debug("File does not exist",{file:o}):O.debug("lsof detection failed",{error:r}),[]}}async function to(o){try{let e=await be("fuser",["-v",o],{encoding:"utf8"}),r=e.stderr||e.stdout||"";if(r.trim()==="")return [];let t=[],n=r.split(`
|
|
15
|
+
`).slice(1);for(let i of n){let s=Yt(i);s&&t.push(s);}return O.debug("Detected file handles with fuser",{file:o,handleCount:t.length}),t}catch(e){let r=d(e);return S(e,"ENOENT")?O.debug("fuser not available on this system"):O.debug("fuser detection failed",{error:r}),[]}}async function oo(o){try{let e=o.replace(/'/g,"''"),r=`
|
|
16
|
+
$ErrorActionPreference = 'SilentlyContinue'
|
|
17
|
+
$handles = @()
|
|
18
|
+
|
|
19
|
+
# Try to find processes with the file open
|
|
20
|
+
Get-Process | ForEach-Object {
|
|
21
|
+
try {
|
|
22
|
+
$proc = $_
|
|
23
|
+
# Check if any modules match the file path
|
|
24
|
+
$modules = $proc.Modules | Where-Object { $_.FileName -eq '${e}' }
|
|
25
|
+
if ($modules) {
|
|
26
|
+
$handles += [PSCustomObject]@{
|
|
27
|
+
ProcessName = $proc.ProcessName
|
|
28
|
+
ProcessId = $proc.Id
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
} catch {
|
|
32
|
+
# Skip processes we can't access
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
# Also try using Get-CimInstance for better file handle detection
|
|
37
|
+
try {
|
|
38
|
+
$query = "SELECT * FROM CIM_DataFile WHERE Name='${e.replace(/\\/g,"\\\\")}'"
|
|
39
|
+
$file = Get-CimInstance -Query $query -ErrorAction SilentlyContinue
|
|
40
|
+
if ($file) {
|
|
41
|
+
$assoc = Get-CimAssociatedInstance -InputObject $file -ResultClassName Win32_Process
|
|
42
|
+
foreach ($proc in $assoc) {
|
|
43
|
+
$handles += [PSCustomObject]@{
|
|
44
|
+
ProcessName = $proc.Name
|
|
45
|
+
ProcessId = $proc.ProcessId
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
} catch {
|
|
50
|
+
# WMI query failed, ignore
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
$handles | ConvertTo-Json -Compress
|
|
54
|
+
`,{stdout:t}=await be("powershell",["-NoProfile","-NonInteractive","-Command",r],{encoding:"utf8",maxBuffer:1024*1024});if(!t||t.trim()===""||t.trim()==="null")return [];let n=eo(t);return O.debug("Detected file handles with PowerShell",{file:o,handleCount:n.length}),n}catch(e){return O.debug("Windows handle detection failed",{error:d(e)}),[]}}async function no(o){try{let{stdout:e}=await be("handle",["-nobanner",o],{encoding:"utf8"});if(!e||e.trim()==="")return [];let r=[],t=e.split(`
|
|
55
|
+
`);for(let n of t){let i=n.match(/^(.+?)\s+pid:\s+(\d+)\s+type:\s+(\w+)\s+.+:\s+(.+)$/i);if(i?.[1]!==void 0&&i?.[1]!==""&&i?.[2]!==void 0&&i?.[2]!==""){let s=Number.parseInt(i[2],10);if(!Number.isNaN(s)){let a={command:i[1],pid:s};i?.[3]!==void 0&&i[3]!==""&&(a.fd=i[3]),a.mode="unknown",r.push(a);}}}return O.debug("Detected file handles with handle.exe",{file:o,handleCount:r.length}),r}catch{return []}}async function Ve(o){let e=b();if(O.debug("Detecting file handles",{file:o,platform:e}),D()){let t=await no(o);return t.length>0?t:oo(o)}let r=await ro(o);return r.length===0&&(r=await to(o)),r.length>0&&O.info("File has open handles",{file:o,handleCount:r.length,processes:r.map(t=>({pid:t.pid,command:t.command,mode:t.mode}))}),r}async function qr(o){let e=await Ve(o);if(e.length===0)return "File is not locked";let r=e.map(t=>`${t.command} (PID: ${t.pid}${t.user!==void 0&&t.user!==""?`, User: ${t.user}`:""}${t.mode!==void 0&&t.mode!==""?`, Mode: ${t.mode}`:""})`).join(", ");return `File is locked by ${e.length} process${e.length>1?"es":""}: ${r}`}B();var se=util.promisify(child_process.execFile),re=class o{constructor(){this.browserExecutables=this.initializeBrowserExecutables();}isBrowserSupported(e){let r=this.browserExecutables[e];return !!(r&&r.length>0)}getBrowserExecutables(e){return this.browserExecutables[e]??[]}async isBrowserInstalled(e){let r=this.getBrowserExecutables(e);for(let t of r)try{let n=D()?"where":"which";return await se(n,[t],{timeout:1e3}),!0}catch{}return false}async executeCommand(e,r=[]){try{await se(e,r,{timeout:5e3,windowsHide:!0});}catch(t){this.isNodeError(t)&&t.code!=="ENOENT"&&console.debug(`Browser launch warning: ${o.getErrorMessage(t)}`);}}isNodeError(e){return typeof e=="object"&&e!==null&&"code"in e&&typeof e.code=="string"}static getErrorMessage(e){return e instanceof Error?e.message:typeof e=="string"?e:String(e)}},je=class extends re{initializeBrowserExecutables(){return {Firefox:["Firefox"],Chrome:["Google Chrome"],Safari:["Safari"]}}async launchBrowser(e){let t={Firefox:"Firefox",Chrome:"Google Chrome",Safari:"Safari"}[e];if(t===void 0||t==="")throw new Error(`${e} not supported on macOS`);await this.executeCommand("osascript",["-e",`tell application "${t}" to activate`]);}getPlatformName(){return "macOS"}},Xe=class extends re{initializeBrowserExecutables(){return {Firefox:["firefox.exe","Firefox"],Chrome:["chrome.exe","Google Chrome"],Safari:[]}}async launchBrowser(e){let r=this.getBrowserExecutables(e);if(r.length===0)throw new Error(`${e} not available on Windows`);for(let t of r)if(await this.tryLaunchExecutable(t))return;throw new Error(`Failed to launch ${e} on Windows`)}async tryLaunchExecutable(e){try{return await se("cmd.exe",["/c","start","",e],{timeout:5e3,windowsHide:!0}),!0}catch{return false}}getPlatformName(){return "Windows"}},Ce=class extends re{initializeBrowserExecutables(){return {Firefox:["firefox","firefox-bin"],Chrome:["google-chrome","google-chrome-stable","chromium","chromium-browser"],Safari:[]}}async launchBrowser(e){let r=this.getBrowserExecutables(e);if(r.length===0)throw new Error(`${e} not available on Linux`);await this.tryLaunchExecutables(r)||await this.tryXdgOpenFallback(e);}async tryLaunchExecutables(e){for(let r of e)try{return await se(r,[],{timeout:5e3}),!0}catch{}return false}async tryXdgOpenFallback(e){try{await se("xdg-open",["http://localhost"],{timeout:5e3});}catch(r){throw new Error(`Failed to launch ${e} on Linux: ${re.getErrorMessage(r)}`)}}getPlatformName(){return "Linux"}},We=null;function _r(o){if(We!==null&&o===void 0)return We;let e=b(),r=ao(e);return (We=r),r}function ao(o){switch(o){case "darwin":return new je;case "win32":return new Xe;case "linux":case "freebsd":case "openbsd":return new Ce;default:return new Ce}}var Q=class{constructor(e,r,t){this.logger=e;this.browserName=r;this.platformControl=t??_r();}async handleBrowserConflict(e,r,t,n=false){return ge(e)?this.isLockError(e)?(await this.logFileHandleInfo(r,t),this.handleProcessConflict(r,t,n)):{resolved:false,shouldRelaunch:false}:{resolved:false,shouldRelaunch:false}}isLockError(e){let r=dr(e);return r==="locked"||r==="permission"}async logFileHandleInfo(e,r){try{let t=await Ve(e);if(t.length>0){let n=await qr(e);this.logger.debug("Database locked by specific processes",{file:e,lockInfo:n,handleCount:t.length,handles:t.map(i=>({pid:i.pid,command:i.command,mode:i.mode,user:i.user}))}),r.length===0&&this.logger.info("File is locked but no browser processes detected - another tool may be accessing the database",{lockingProcesses:t.map(i=>`${i.command} (PID: ${i.pid})`).join(", ")});}}catch(t){this.logger.debug("Could not detect file handles",{error:t instanceof Error?t.message:String(t)});}}async handleProcessConflict(e,r,t){try{if(r.length>0)return await this.handleBrowserProcesses(e,r,t);this.logger.debug("Database/file locked but no browser processes detected",{file:e,browserName:this.browserName,suggestion:"Another process may be accessing the file"});}catch(n){this.logger.debug("Failed to check browser processes",{error:n instanceof Error?n.message:String(n)});}return {resolved:false,shouldRelaunch:false}}async handleBrowserProcesses(e,r,t){let n=r.map(s=>({...s,details:`PID: ${s.pid}, Command: ${s.command}`})),i=Lr(this.browserName.toLowerCase(),n);return this.logger.debug(`${this.browserName} process conflict detected`,{file:e,processCount:r.length,advice:i}),t?this.attemptBrowserClose():Promise.resolve({resolved:false,shouldRelaunch:false})}async attemptBrowserClose(){return this.logger.info(`Attempting to close ${this.browserName} gracefully...`),await $r(this.browserName,{interactive:true,force:false})?(await Ir(this.browserName,5e3),{resolved:true,shouldRelaunch:true}):{resolved:false,shouldRelaunch:false}}async relaunchBrowser(){this.logger.info(`Relaunching ${this.browserName}...`);try{if(!this.platformControl.isBrowserSupported(this.browserName)){this.logger.debug(`${this.browserName} is not available on ${this.platformControl.getPlatformName()}`);return}await this.platformControl.launchBrowser(this.browserName),this.logger.success(`${this.browserName} has been relaunched with your tabs restored`);}catch(e){this.logger.debug(`Could not relaunch ${this.browserName} automatically`,{error:d(e),platform:this.platformControl.getPlatformName()});}}};B();var Je=24,ae=32,Qr=32;function Hr(o,e,r){let t=Buffer.from("v10");if(!o.subarray(0,3).equals(t))throw new Error("Not a v10 encrypted cookie");let n=o.subarray(3),i=12,s=16;if(n.length<i+s)throw new Error("Invalid v10 cookie: too short");let a=n.subarray(0,i),c=n.subarray(i,n.length-s),l=n.subarray(n.length-s),u=crypto.createDecipheriv("aes-256-gcm",e,a);u.setAuthTag(l);let g=Buffer.concat([u.update(c),u.final()]);return (r??0)>=Je&&g.length>=ae?g.subarray(ae).toString("utf8"):g.toString("utf8")}function Gr(o){let e=Buffer.from("v10");return o.length>=3&&o.subarray(0,3).equals(e)}function Ur(o,e){let r=new Map;return t=>{let n=e?e(t):t.toString("hex");if(r.has(n)){let s=r.get(n);if(s!==void 0)return s}let i=o(t);return r.set(n,i),i}}var fo=Ur(o=>o.length>=3&&o[0]===118&&o[1]===49&&o[2]===48?o.slice(3):o,o=>o.toString("hex")),po=Ur(o=>{let e=o[o.length-1];return e&&e<=16?o.slice(0,-e):o},o=>o.toString("hex"));function mo(o){let e=o.match(/([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})/i);if(e?.[1])return e[1];let r=[/([A-Z]{3})$/,/([a-z]{2}_[A-Z]{2})$/,/(\d{3}-\d{7}-\d{7})$/];for(let n of r){let i=o.match(n);if(i?.[1])return i[1]}let t=[/.*?0t(.+)$/,/.*?1e`(.+)$/,/.*?[`'](.+)$/,/[^\x20-\x7E]*([\x20-\x7E]+)$/,/.*?([a-zA-Z0-9_\-.]+)$/];for(let n of t){let s=o.match(n)?.[1]??"";if(s.length>0)return s}return o}var Ke=new Map;async function go(o){let e=Ke.get(o);if(e!==void 0)return e;let r=new Promise((t,n)=>{crypto.pbkdf2(o,"saltysalt",1003,16,"sha1",(i,s)=>{if(i){n(new Error(`Failed to derive key: ${i.message}`));return}t(s);});}).catch(t=>{throw Ke.delete(o),t});return Ke.set(o,r),r}function ho(o){return Buffer.isBuffer(o)?o:typeof o!="string"?null:Buffer.from(o,"latin1")}async function zr(o,e,r){if(D()&&Gr(o)&&o.length>=31){let i=ho(e);if(i?.length===Qr)return Hr(o,i,r)}if(N()&&!o.slice(0,3).toString().match(/^v\d\d$/))return Promise.resolve(o.toString("utf8"));if(typeof e!="string")throw new Error("password must be a string");if(!Buffer.isBuffer(o))throw new Error("encryptedData must be a Buffer");let t=await go(e),n=fo(o);if(n.length%16!==0)throw new Error("Encrypted data length is not a multiple of 16");try{let i=Buffer.alloc(16," "),s=crypto.createDecipheriv("aes-128-cbc",t,i);s.setAutoPadding(!1);let a=s.update(n);try{s.final();}catch(g){throw new Error(`Failed to finalize decryption: ${g.message}`)}a=po(a);let u=((r??0)>=Je&&a.length>=ae?a.slice(ae):a).toString("utf8");return mo(u)}catch(i){throw i instanceof Error&&i.message.startsWith("Failed to finalize decryption")?i:new Error(`Decryption failed: ${i.message}`)}}B();ie();var ko={chrome:"Chrome Safe Storage",chromium:"Chromium Safe Storage",brave:"Brave Safe Storage",edge:"Microsoft Edge Safe Storage",arc:"Arc Safe Storage",opera:"Opera Safe Storage","opera-gx":"Opera Safe Storage",vivaldi:"Vivaldi Safe Storage",whale:"Whale Safe Storage"};async function So(o){let e=ko[o];if(!e)throw new Error(`Unknown browser type: ${o}`);try{let r=`security find-generic-password -w -s "${e}"`;return (await L(r)).stdout.trim()}catch(r){if(o!=="chrome"){let t='security find-generic-password -w -s "Chrome Safe Storage"';try{return (await L(t)).stdout.trim()}catch{}}throw new Error(`Failed to get ${o} password from keychain: ${r}`)}}async function vo(){let{getChromePassword:o}=await Promise.resolve().then(()=>(Xr(),jr));return o()}async function Eo(){let{getChromePassword:o}=await Promise.resolve().then(()=>(Kr(),Jr));return o()}async function Bo(o){switch(ee(),b()){case "darwin":return So(o);case "win32":return vo();case "linux":return Eo();default:throw new Error(`Platform ${b()} is not supported`)}}var Ze=new Map;function er(o="chrome"){let e=Ze.get(o);if(e!==void 0)return e;let r=Bo(o).catch(t=>{throw Ze.delete(o),t});return Ze.set(o,r),r}rr();x();E();var M=h("DatabaseConnectionManager"),or=class extends events.EventEmitter{constructor(e={}){super(),this.connections=new Map,this.queryMetrics=[],this.totalQueries=0,this.cacheHits=0,this.connectionReuses=0,this.lastCleanupTime=Date.now(),this.config={maxConnections:e.maxConnections??5,connectionTimeout:e.connectionTimeout??5e3,idleTimeout:e.idleTimeout??3e4,enableMonitoring:e.enableMonitoring??true,retryAttempts:e.retryAttempts??3,retryDelay:e.retryDelay??100,queryTimeout:e.queryTimeout??3e3};}async getConnection(e){let r=Date.now();r-this.lastCleanupTime>3e4&&(this.cleanupIdleConnections(),this.lastCleanupTime=r);let t=this.connections.get(e);return t&&!t.inUse?(t.inUse=true,t.lastAccessed=Date.now(),this.connectionReuses++,M.debug("Reusing existing connection",{filepath:e,queryCount:t.queryCount}),t.database):(this.connections.size>=this.config.maxConnections&&await this.evictLeastRecentlyUsed(),this.createConnection(e))}async createConnection(e){let r=Date.now(),t;for(let n=0;n<this.config.retryAttempts;n++)try{let i=Pr(e,{readonly:!0,fileMustExist:!0});i.pragma(`busy_timeout = ${this.config.queryTimeout}`);let s={database:i,filepath:e,inUse:!0,lastAccessed:Date.now(),queryCount:0,totalQueryTime:0,created:Date.now()};this.connections.set(e,s);let a=Date.now()-r;return M.debug("Created new connection",{filepath:e,connectionTime:a,attempt:n+1}),this.emit("connection:created",{filepath:e,connectionTime:a}),i}catch(i){if(t=i,this.isDatabaseLocked(i)){M.warn("Database locked, retrying",{filepath:e,attempt:n+1,maxAttempts:this.config.retryAttempts}),await this.delay(this.config.retryDelay*2**n);continue}throw i}throw t||new Error(`Failed to connect to database: ${e}`)}async executeQuery(e,r,t){let n=Date.now(),i=await this.getConnection(e),s=this.connections.get(e);try{let a=r(i),c=Date.now()-n;if(s&&(s.queryCount++,s.totalQueryTime+=c),this.totalQueries++,this.cacheHits++,c>100&&M.debug("Slow query detected",{query:t??"Unknown query",duration:c,filepath:e}),this.config.enableMonitoring){let l={query:t??"Unknown query",duration:c,rowCount:Array.isArray(a)?a.length:1,filepath:e,timestamp:Date.now(),success:!0};this.recordMetrics(l);}return a}catch(a){let c=Date.now()-n;if(this.totalQueries++,this.config.enableMonitoring){let l={query:t??"Unknown query",duration:c,rowCount:0,filepath:e,timestamp:Date.now(),success:false,error:a.message};this.recordMetrics(l);}throw a}finally{s&&(s.inUse=false,s.lastAccessed=Date.now());}}releaseConnection(e){let r=this.connections.get(e);r&&(r.inUse=false,r.lastAccessed=Date.now(),M.debug("Released connection",{filepath:e}));}closeConnection(e){let r=this.connections.get(e);if(r)try{r.database.close(),this.connections.delete(e),M.debug("Closed connection",{filepath:e,queryCount:r.queryCount,lifetime:Date.now()-r.created}),this.emit("connection:closed",{filepath:e});}catch(t){ne("Failed to close connection",t,{filepath:e});}}closeAll(){for(let[e,r]of this.connections)try{r.database.close(),M.debug("Closed connection",{filepath:e});}catch(t){ne("Failed to close connection",t,{filepath:e});}this.connections.clear(),M.info("Closed all connections",{totalQueries:this.totalQueries,connectionReuses:this.connectionReuses});}getStatistics(){let e=0,r=0,t=0;for(let n of this.connections.values())e+=n.totalQueryTime,r+=n.queryCount,n.inUse&&t++;return {totalConnections:this.connections.size,activeConnections:t,idleConnections:this.connections.size-t,totalQueries:this.totalQueries,averageQueryTime:r>0?e/r:0,cacheHitRate:this.totalQueries>0?this.cacheHits/this.totalQueries:0,connectionReuse:this.connectionReuses}}getQueryMetrics(e=100){return this.queryMetrics.slice(-e)}clearMetrics(){this.queryMetrics.length=0;}cleanupIdleConnections(){let e=Date.now(),r=[];for(let[t,n]of this.connections)!n.inUse&&e-n.lastAccessed>this.config.idleTimeout&&r.push(t);for(let t of r)this.closeConnection(t);r.length>0&&M.debug("Cleaned up idle connections",{count:r.length});}async evictLeastRecentlyUsed(){let e=null,r=Date.now();for(let[t,n]of this.connections)!n.inUse&&n.lastAccessed<r&&(e=t,r=n.lastAccessed);e!==null?(this.closeConnection(e),M.debug("Evicted LRU connection",{filepath:e})):await this.delay(100);}recordMetrics(e){this.queryMetrics.push(e),this.queryMetrics.length>1e3&&this.queryMetrics.splice(0,this.queryMetrics.length-1e3),this.emit("query:executed",e);}isDatabaseLocked(e){let r=d(e).toLowerCase();return r.includes("database is locked")||r.includes("database locked")||r.includes("sqlite_busy")}async delay(e){return new Promise(r=>setTimeout(r,e))}},ce=null,tr=null;function te(o){return ce||(ce=new or(o),tr||(tr=()=>{ce&&ce.closeAll();},process.on("exit",tr))),ce}E();var nr=h("QueryMonitor"),ir=class{constructor(e={}){this.options={slowQueryThreshold:e.slowQueryThreshold??100,verbose:e.verbose??false,trackHistory:e.trackHistory??true,maxHistorySize:e.maxHistorySize??1e3},this.queryHistory=[],this.totalQueries=0,this.totalDuration=0,this.slowQueries=0,this.errors=0;}executeQuery(e,r,t=[],n){let i={sql:r,params:t,startTime:Date.now()};n!==void 0&&(i.filepath=n);try{let a=e.prepare(r).all(...t);return i.endTime=Date.now(),i.duration=i.endTime-i.startTime,i.rowCount=a.length,this.recordExecution(i),a}catch(s){throw i.endTime=Date.now(),i.duration=i.endTime-i.startTime,i.error=s,this.recordExecution(i),s}}executeGet(e,r,t=[],n){let i={sql:r,params:t,startTime:Date.now()};n!==void 0&&(i.filepath=n);try{let a=e.prepare(r).get(...t);return i.endTime=Date.now(),i.duration=i.endTime-i.startTime,i.rowCount=a!==void 0?1:0,this.recordExecution(i),a}catch(s){throw i.endTime=Date.now(),i.duration=i.endTime-i.startTime,i.error=s,this.recordExecution(i),s}}prepareStatement(e,r,t){let n=e.prepare(r);return new sr(n,r,this,t)}recordExecution(e){this.totalQueries++,e.duration!==void 0&&(this.totalDuration+=e.duration,e.duration>this.options.slowQueryThreshold&&(this.slowQueries++,nr.debug("Slow query detected",{sql:e.sql,duration:e.duration,rowCount:e.rowCount,filepath:e.filepath}))),e.error?(this.errors++,this.options.verbose&&nr.error("Query failed",{sql:e.sql,error:e.error.message,filepath:e.filepath})):this.options.verbose&&nr.debug("Query executed",{sql:e.sql,duration:e.duration,rowCount:e.rowCount}),this.options.trackHistory&&(this.queryHistory.push(e),this.queryHistory.length>this.options.maxHistorySize&&this.queryHistory.splice(0,this.queryHistory.length-this.options.maxHistorySize));}getStatistics(){return {totalQueries:this.totalQueries,averageDuration:this.totalQueries>0?this.totalDuration/this.totalQueries:0,slowQueries:this.slowQueries,slowQueryRate:this.totalQueries>0?this.slowQueries/this.totalQueries:0,errors:this.errors,errorRate:this.totalQueries>0?this.errors/this.totalQueries:0,historySize:this.queryHistory.length}}getHistory(e){return e!==void 0&&e>0?this.queryHistory.slice(-e):[...this.queryHistory]}clearHistory(){this.queryHistory.length=0;}reset(){this.clearHistory(),this.totalQueries=0,this.totalDuration=0,this.slowQueries=0,this.errors=0;}},sr=class{constructor(e,r,t,n){this.statement=e;this.sql=r;this.monitor=t;this.filepath=n;}all(...e){return this.monitor.executeQuery({prepare:()=>this.statement},this.sql,e,this.filepath)}get(...e){return this.monitor.executeGet({prepare:()=>this.statement},this.sql,e,this.filepath)}getStatement(){return this.statement}},et=null;function le(o){return et??(et=new ir(o)),et}function rt(o,e,r,t,n,i,s){return {domain:o,name:e,value:r,expiry:Mr(t),meta:{file:n,browser:i,decrypted:s}}}var ue=class ue extends _{constructor(e,r,t="chrome"){super(e,"Chrome"),this.browserDisplayName=r,this.browserType=t,this.lockHandler=new Q(this.logger,"Chrome");}get sqlBrowserType(){return xe(this.browserType)?this.browserType:"chrome"}async batchQueryCookies(e){if(!this.isPlatformSupported())return [];let r=this.getCookieFiles();if(r.length===0)return this.logger.debug(`No ${this.browserDisplayName} cookie files found`),[];try{let t=await er(this.browserType),n=[];for(let i=0;i<r.length;i+=ue.MAX_CONCURRENT_PROFILE_READS){let s=r.slice(i,i+ue.MAX_CONCURRENT_PROFILE_READS),a=await Promise.allSettled(s.map(async c=>this.processBatchFile(c,e,t)));for(let c of a)c.status==="fulfilled"&&n.push(...c.value);}return n}catch(t){return this.logger.error(`Failed to get ${this.browserDisplayName} password for batch query`,{error:this.getErrorMessage(t)}),[]}}async processBatchFile(e,r,t){try{let n=te(),i=le(),s=new H(this.sqlBrowserType),a=r.map(w=>({name:w.name,domain:w.domain,browser:this.sqlBrowserType})),c=s.buildBatchSelectQuery(a),l=await n.executeQuery(e,w=>i.executeQuery(w,c.sql,c.params,e).map(q=>({name:q.name,domain:q.domain,value:q.encrypted_value,expiry:q.expiry})),c.description||c.sql),u=await this.getMetaVersion(e),g={file:e,password:t,browser:this.browserDisplayName,metaVersion:u};return (await Promise.allSettled(l.map(async w=>this.processCookie(w,g)))).filter(w=>w.status==="fulfilled").map(w=>w.value)}catch(n){return this.logger.warn(`Error batch processing ${this.browserDisplayName} cookie file ${e}`,{error:this.getErrorMessage(n),file:e,specsCount:r.length}),[]}}getBrowserName(){return this.browserDisplayName}async executeQuery(e,r,t,n){if(!this.isPlatformSupported())return [];let i=this.getCookieFiles(t);if(i.length===0)return this.logger.debug(`No ${this.browserDisplayName} cookie files found`),[];try{let s=await er(this.browserType),a=[];for(let c of i){let l=await this.processFileWithRetry(c,e,r,s,n);a.push(...l);}return a}catch(s){return this.logger.error(`Failed to get ${this.browserDisplayName} password`,{error:this.getErrorMessage(s)}),[]}}isPlatformSupported(){return _e()?true:(this.logger.warn("Platform not supported",{platform:b(),supportedPlatforms:["darwin","win32","linux"]}),false)}getCookieFiles(e){let r=e??this.getCookieFilePaths();return Array.isArray(r)?r:[r]}getErrorMessage(e){return d(e)}async processFileWithRetry(e,r,t,n,i){try{return await this.processFile(e,r,t,n)}catch(s){let a=await this.handleFileError(s,e,r,t,i);return a.resolved?this.retryAfterBrowserClose(e,r,t,n,a.shouldRelaunch):[]}}async handleFileError(e,r,t,n,i){let s=await Fr(),a=await this.lockHandler.handleBrowserConflict(e,r,s,i!==true);return a.resolved||this.logger.warn(`Error reading ${this.browserDisplayName} cookie file ${r}`,{error:this.getErrorMessage(e),file:r,name:t,domain:n}),a}async retryAfterBrowserClose(e,r,t,n,i){try{this.logger.info(`Retrying ${this.browserDisplayName} cookie extraction after browser close...`);let s=await this.processFile(e,r,t,n);return this.logger.success(`Successfully extracted cookies after closing ${this.browserDisplayName}`),i&&await this.lockHandler.relaunchBrowser(),s}catch(s){return this.logger.error(`Failed to extract cookies even after closing ${this.browserDisplayName}`,{error:this.getErrorMessage(s),file:e}),i&&await this.lockHandler.relaunchBrowser(),[]}}async processFile(e,r,t,n){try{let i=te(),s=le(),c=new H(this.sqlBrowserType).buildSelectQuery({name:r,domain:t,browser:this.sqlBrowserType}),l=await i.executeQuery(e,w=>s.executeQuery(w,c.sql,c.params,e).map(q=>({name:q.name,domain:q.domain,value:q.encrypted_value,expiry:q.expiry})),c.sql),u=await this.getMetaVersion(e),g={file:e,password:n,browser:this.browserDisplayName,metaVersion:u};return (await Promise.allSettled(l.map(async w=>this.processCookie(w,g)))).map(w=>w.status==="fulfilled"?w.value:null).filter(w=>w!==null)}catch(i){return this.logger.error(`Failed to process ${this.browserDisplayName} cookie file`,{error:this.getErrorMessage(i),file:e,name:r,domain:t}),[]}}async getMetaVersion(e){try{let r=te(),n=new H(this.sqlBrowserType).buildMetaQuery("version"),i=await r.executeQuery(e,s=>s.prepare(n.sql).get(...n.params),"Get meta version");return i?Number.parseInt(i.value,10):0}catch(r){return this.logger.debug("Could not retrieve meta version, defaulting to 0",{error:this.getErrorMessage(r)}),0}}async processCookie(e,r){try{let t=Buffer.isBuffer(e.value)?e.value:Buffer.from(String(e.value)),n=await zr(t,r.password,r.metaVersion);return rt(e.domain,e.name,n,e.expiry,r.file,r.browser,!0)}catch(t){return this.logger.warn(`Failed to decrypt ${r.browser} cookie`,{error:this.getErrorMessage(t)}),rt(e.domain,e.name,e.value.toString("utf-8"),e.expiry,r.file,r.browser,false)}}};ue.MAX_CONCURRENT_PROFILE_READS=5;var ke=ue;var fe=class extends ke{constructor(e="chrome",r){let t=e.charAt(0).toUpperCase()+e.slice(1);super(`${t}CookieQueryStrategy`,t,e),this.browser=e,r!==void 0&&(this.profileName=r);}getCookieFilePaths(e){if(e!==void 0&&e!=="")return [e];let r;try{let t=Or(this.browser);r=Oo__default.default.sync("./**/Cookies",{cwd:t,absolute:!0}),this.logger.debug(`Found ${r.length} cookie files for ${this.browser}`);}catch(t){return this.logger.warn(`Failed to find ${this.browser} cookie files`,{error:this.getErrorMessage(t)}),[]}return this.profileName?this.filterByProfileName(r):r}filterByProfileName(e){try{if(e.length===0)return this.logger.warn(`No ${this.browser} cookie files found`),[];let r=e[0];if(!r)return [];let t=path.dirname(path.dirname(r)),n=path.join(t,"Local State");if(!v(n))return e;let s=JSON.parse(F(n)).profile?.info_cache||{},a;for(let[u,g]of Object.entries(s))if(g.name?.toLowerCase()===this.profileName?.toLowerCase()){a=u;break}if(!a){for(let u of Object.keys(s))if(u.toLowerCase()===this.profileName?.toLowerCase()){a=u;break}}if(a){let u=e.filter(g=>path.dirname(g).endsWith(a));return u.length===0?this.logger.warn(`No cookie files found for profile: ${this.profileName} (directory: ${a})`):this.logger.debug(`Found ${u.length} cookie file(s) for profile: ${this.profileName}`),u}let c=Object.entries(s).map(([,u])=>u.name).filter(Boolean),l=c.length>0?` Available profiles: ${c.join(", ")}`:"";return this.logger.warn(`No ${this.browser} profile matching "${this.profileName}" found.${l}`),[]}catch(r){return this.logger.warn(`Failed to read ${this.browser} profile info: ${r}`),e}}};var V=class extends fe{constructor(e){super("chrome",e);}};ie();E();B();E();T();h("BrowserDetector");T();h("BrowserAvailability");({darwin:{chrome:["/Applications/Google Chrome.app",`${os.homedir()}/Applications/Google Chrome.app`,`${os.homedir()}/Library/Application Support/Google/Chrome`],firefox:["/Applications/Firefox.app",`${os.homedir()}/Applications/Firefox.app`,`${os.homedir()}/Library/Application Support/Firefox`],safari:["/Applications/Safari.app",`${os.homedir()}/Library/Safari`,`${os.homedir()}/Library/Cookies`],edge:["/Applications/Microsoft Edge.app",`${os.homedir()}/Applications/Microsoft Edge.app`,`${os.homedir()}/Library/Application Support/Microsoft Edge`],arc:["/Applications/Arc.app",`${os.homedir()}/Applications/Arc.app`,`${os.homedir()}/Library/Application Support/Arc`],opera:["/Applications/Opera.app",`${os.homedir()}/Applications/Opera.app`,`${os.homedir()}/Library/Application Support/com.operasoftware.Opera`],"opera-gx":["/Applications/Opera GX.app",`${os.homedir()}/Applications/Opera GX.app`,`${os.homedir()}/Library/Application Support/com.operasoftware.OperaGX`],brave:["/Applications/Brave Browser.app",`${os.homedir()}/Applications/Brave Browser.app`,`${os.homedir()}/Library/Application Support/BraveSoftware/Brave-Browser`],vivaldi:["/Applications/Vivaldi.app",`${os.homedir()}/Applications/Vivaldi.app`,`${os.homedir()}/Library/Application Support/Vivaldi`]},win32:{chrome:[path.join(process.env.LOCALAPPDATA??"","Google","Chrome"),path.join(process.env.PROGRAMFILES??"","Google","Chrome"),path.join(process.env["PROGRAMFILES(X86)"]??"","Google","Chrome")],firefox:[path.join(process.env.APPDATA??"","Mozilla","Firefox"),path.join(process.env.PROGRAMFILES??"","Mozilla Firefox"),path.join(process.env["PROGRAMFILES(X86)"]??"","Mozilla Firefox")],edge:[path.join(process.env.LOCALAPPDATA??"","Microsoft","Edge"),path.join(process.env.PROGRAMFILES??"","Microsoft","Edge"),path.join(process.env["PROGRAMFILES(X86)"]??"","Microsoft","Edge")],opera:[path.join(process.env.APPDATA??"","Opera Software","Opera Stable"),path.join(process.env.PROGRAMFILES??"","Opera"),path.join(process.env["PROGRAMFILES(X86)"]??"","Opera")],"opera-gx":[path.join(process.env.APPDATA??"","Opera Software","Opera GX Stable"),path.join(process.env.PROGRAMFILES??"","Opera GX"),path.join(process.env["PROGRAMFILES(X86)"]??"","Opera GX")],brave:[path.join(process.env.LOCALAPPDATA??"","BraveSoftware","Brave-Browser"),path.join(process.env.PROGRAMFILES??"","BraveSoftware","Brave-Browser")],vivaldi:[path.join(process.env.LOCALAPPDATA??"","Vivaldi","Application"),path.join(process.env.PROGRAMFILES??"","Vivaldi","Application")]},linux:{chrome:[`${os.homedir()}/.config/google-chrome`,"/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/opt/google/chrome"],firefox:[`${os.homedir()}/.mozilla/firefox`,`${os.homedir()}/.config/mozilla/firefox`,"/usr/bin/firefox","/usr/lib/firefox","/snap/firefox"],edge:[`${os.homedir()}/.config/microsoft-edge`,"/usr/bin/microsoft-edge","/opt/microsoft/msedge"],brave:[`${os.homedir()}/.config/BraveSoftware/Brave-Browser`,"/usr/bin/brave-browser","/usr/bin/brave-browser-stable","/opt/brave.com/brave"],opera:[`${os.homedir()}/.config/opera`,"/usr/bin/opera","/usr/lib/opera"],"opera-gx":[`${os.homedir()}/.config/opera-gx`,"/usr/bin/opera-gx"],vivaldi:[`${os.homedir()}/.config/vivaldi`,"/usr/bin/vivaldi","/usr/bin/vivaldi-stable","/opt/vivaldi"]}});var tt={darwin:{chrome:path.join(os.homedir(),"Library","Application Support","Google","Chrome"),edge:path.join(os.homedir(),"Library","Application Support","Microsoft Edge"),arc:path.join(os.homedir(),"Library","Application Support","Arc"),opera:path.join(os.homedir(),"Library","Application Support","com.operasoftware.Opera"),"opera-gx":path.join(os.homedir(),"Library","Application Support","com.operasoftware.OperaGX"),brave:path.join(os.homedir(),"Library","Application Support","BraveSoftware","Brave-Browser"),vivaldi:path.join(os.homedir(),"Library","Application Support","Vivaldi")},win32:{chrome:path.join(process.env.LOCALAPPDATA??"","Google","Chrome","User Data"),edge:path.join(process.env.LOCALAPPDATA??"","Microsoft","Edge","User Data"),opera:path.join(process.env.APPDATA??"","Opera Software","Opera Stable"),"opera-gx":path.join(process.env.APPDATA??"","Opera Software","Opera GX Stable"),arc:path.join(process.env.LOCALAPPDATA??"","Packages","TheBrowserCompany.Arc_ttt1ap7aabd4t","LocalCache"),brave:path.join(process.env.LOCALAPPDATA??"","BraveSoftware","Brave-Browser","User Data"),vivaldi:path.join(process.env.LOCALAPPDATA??"","Vivaldi","User Data")},linux:{chrome:path.join(os.homedir(),".config","google-chrome"),edge:path.join(os.homedir(),".config","microsoft-edge"),opera:path.join(os.homedir(),".config","opera"),"opera-gx":path.join(os.homedir(),".config","opera-gx"),brave:path.join(os.homedir(),".config","BraveSoftware","Brave-Browser"),vivaldi:path.join(os.homedir(),".config","vivaldi")}},Do=process.env.XDG_CONFIG_HOME&&process.env.XDG_CONFIG_HOME.trim()!==""?process.env.XDG_CONFIG_HOME:path.join(os.homedir(),".config");(()=>{let o=["Firefox","Firefox Developer Edition","Firefox ESR"],e=new Set,r=n=>{for(let i of o)e.add(path.join(n,i));};r(path.join(os.homedir(),"AppData","Roaming","Mozilla"));let t=process.env.APPDATA&&process.env.APPDATA.trim()!==""?process.env.APPDATA:null;return t!==null&&r(path.join(t,"Mozilla")),[...e]})();var ot={darwin:[path.join(os.homedir(),"Library","Application Support","Firefox")],linux:[path.join(os.homedir(),".mozilla","firefox"),path.join(Do,"mozilla","firefox"),path.join(os.homedir(),"snap","firefox","common",".mozilla","firefox"),path.join(os.homedir(),".var","app","org.mozilla.firefox",".mozilla","firefox")]};T();function cr(o,e){let r=path.join(e,"Local State");if(!v(r))return [];try{let t=F(r),i=JSON.parse(t).profile?.info_cache??{},s=[];for(let[a,c]of Object.entries(i)){if(!c||typeof c!="object")continue;let l=c.name||a;s.push({name:l,directory:a,path:path.join(e,a),...c.user_name&&{userName:c.user_name},browser:o});}return s}catch{return []}}function Fo(o){let e=process.platform,r=tt[e]??{};if(o){let n=o.toLowerCase(),i=r[n];return i?cr(o,i):v(path.join(o,"Local State"))?cr("chromium",o):[]}let t=[];for(let[n,i]of Object.entries(r))if(i){let s=cr(n,i);t.push(...s);}return t}x();B();T();T();function nt(o){if(!o)return;let e=o.match(/userContextId=(\d+)/);if(e?.[1])return Number.parseInt(e[1],10)}function Mo(o){let e=new Map;if(!v(o))return e;try{let r=F(o),t=JSON.parse(r);if(Array.isArray(t.containers))for(let n of t.containers)typeof n.name=="string"&&typeof n.userContextId=="number"&&e.set(n.name.toLowerCase(),n.userContextId);}catch{}return e}function it(o,e){if(typeof o=="number")return o;let r=String(o).trim();if(r.toLowerCase()==="none")return "none";if(/^\d+$/.test(r))return Number.parseInt(r,10);if(e){let t=path.join(path.dirname(e),"containers.json"),i=Mo(t).get(r.toLowerCase());if(i!==void 0)return i}throw new Error(`Unknown Firefox container: '${o}'`)}function qo(o,e){let r=os.homedir();if(!r)return o.warn("Failed to get home directory"),[];let t=b(),n=[],i=[];switch(t){case "darwin":n.push(path.join(r,"Library/Application Support/Firefox")),i.push(path.join(r,"Library/Application Support/Firefox/Profiles/*/cookies.sqlite"));break;case "win32":{n.push(path.join(r,"AppData","Roaming","Mozilla","Firefox")),i.push(path.join(r,"AppData","Roaming","Mozilla","Firefox","Profiles","*","cookies.sqlite"));let c=path.join(r,"AppData","Roaming","Mozilla","Firefox Developer Edition");v(c)&&(n.push(c),i.push(path.join(c,"Profiles","*","cookies.sqlite")));let l=path.join(r,"AppData","Roaming","Mozilla","Firefox ESR");v(l)&&(n.push(l),i.push(path.join(l,"Profiles","*","cookies.sqlite")));let u=path.join(r,"AppData","Local","Mozilla","Firefox");v(u)&&(n.push(u),i.push(path.join(u,"Profiles","*","cookies.sqlite")));break}case "linux":{let c=ot.linux??[];for(let l of c)n.push(l),i.push(path.join(l,"*","cookies.sqlite"));break}default:return o.debug("Unsupported platform for Firefox cookie extraction",{platform:t}),[]}let s=n.filter(c=>v(c));if(s.length===0)return o.debug("No Firefox profile directories found - Firefox may not be installed",{checked:n,platform:t}),[];let a=[];for(let c of i){let l=Oo__default.default.sync(c);a.push(...l);}return o.debug("Found Firefox cookie files",{files:a}),e!==void 0&&a.length>0?_o(a,e,s,o):a}function at(o){try{let r=F(o).split(/\r?\n/),t=[],n,i,s=!0;for(let a of r){let c=a.trim();if(c.startsWith("[")){n!==void 0&&i!==void 0&&t.push({name:n,path:i,isRelative:s}),n=void 0,i=void 0,s=!0;continue}let l=c.indexOf("=");if(l===-1)continue;let u=c.slice(0,l).trim(),g=c.slice(l+1).trim();u==="Name"?n=g:u==="Path"?i=g:u==="IsRelative"&&(s=g==="1");}return n!==void 0&&i!==void 0&&t.push({name:n,path:i,isRelative:s}),t}catch{return []}}function _o(o,e,r,t){let n=new Set;for(let s of r){let a=path.join(s,"profiles.ini");if(!v(a))continue;let c=at(a);for(let l of c)if(l.name.toLowerCase()===e.toLowerCase()){let u=l.isRelative?path.join(s,l.path):l.path;n.add(path.basename(u));}}if(n.size===0){let s=new Set;for(let c of r){let l=path.join(c,"profiles.ini");if(v(l))for(let u of at(l))s.add(u.name);}let a=s.size>0?` Available profiles: ${[...s].join(", ")}`:"";return t.warn(`No Firefox profile matching "${e}" found.${a}`),[]}let i=o.filter(s=>{let a=path.basename(path.join(s,".."));return n.has(a)});return i.length===0?t.warn(`No cookie files found for Firefox profile: ${e}`):t.debug(`Found ${i.length} cookie file(s) for Firefox profile: ${e}`),i}function Qo(o,e){return o===null||!(o>0)?"Infinity":new Date(e>=16?o:o*1e3)}function Ho(o,e,r=Date.now()){if(o===null)return false;let t=e>=16?r:Math.floor(r/1e3);return o>t}var W=class extends _{constructor(e,r){super("FirefoxCookieQueryStrategy","Firefox"),this.lockHandler=new Q(this.logger,"Firefox"),e!==void 0&&(this.profileName=e),r!==void 0&&(this.container=r);}async createCookieQueryConfig(e,r,t){let{CookieQueryBuilder:n}=await Promise.resolve().then(()=>(rr(),Zr)),i=new n("firefox"),s;this.container!==void 0&&(s=it(this.container,t));let a=i.buildSelectQuery({name:e,domain:r,browser:"firefox",includeExpired:true,...s!==void 0&&{container:s}});return {file:t,sql:a.sql,params:a.params,rowTransform:(c,l)=>{let u=nt(c.originAttributes);return {name:c.name,value:c.value,domain:c.domain,expiry:Qo(c.expiry,l),meta:{file:t,browser:"Firefox",decrypted:false,...u!==void 0&&{containerId:u}}}}}}async handleCookieExtractionError(e,r,t,n,i){let s=await Tr(),a=await this.lockHandler.handleBrowserConflict(e,r,s,t!==true);return a.resolved?{retryAfterClose:true,shouldRelaunch:a.shouldRelaunch}:(this.logExtractError(e,r,n,i),{retryAfterClose:false,shouldRelaunch:false})}logExtractError(e,r,t,n){this.logger.debug(`Error reading Firefox cookie file ${r}`,{error:d(e),file:r,name:t,domain:n});}async performRetryAfterClose(e,r){this.logger.info("Retrying Firefox cookie extraction after browser close...");try{let t=await this.executeQueryWithNewUtilities(e);return this.logger.success("Successfully extracted cookies after closing Firefox"),r&&await this.lockHandler.relaunchBrowser(),t}catch(t){return this.logger.error("Failed to extract cookies even after closing Firefox",{error:t instanceof Error?t.message:String(t),file:e.file}),r&&await this.lockHandler.relaunchBrowser(),[]}}async processCookieFile(e,r,t,n){let i=await this.createCookieQueryConfig(r,t,e);try{return await this.executeQueryWithNewUtilities(i)}catch(s){let a=await this.handleCookieExtractionError(s,e,n,r,t);return a.retryAfterClose?this.performRetryAfterClose(i,a.shouldRelaunch):[]}}async executeQueryWithNewUtilities(e){let r=te({retryAttempts:1,retryDelay:0,queryTimeout:100,enableMonitoring:true}),t=le();return r.executeQuery(e.file,n=>{let s=n.prepare("PRAGMA user_version").get()?.user_version??0,a=t.executeQuery(n,e.sql,e.params,e.file),c=Date.now();return a.filter(l=>Ho(l.expiry,s,c)).map(l=>e.rowTransform(l,s))},e.sql)}async executeQuery(e,r,t,n){let i=t??qo(this.logger,this.profileName),s=Array.isArray(i)?i:[i];if(s.length===0)return this.logger.debug("No Firefox cookie files to query"),[];let a=[];for(let c of s){let l=await this.processCookieFile(c,e,r,n);a.push(...l);}return a}};x();B();x();E();B();var ur=util.promisify(child_process.exec),pe=h("SystemPermissions");async function Wo(){try{await ur('open "x-apple.systempreferences:com.apple.preference.security?Privacy_AllFiles"'),pe.info("Opened System Settings > Privacy & Security > Full Disk Access");}catch{try{await ur('open "x-apple.systempreferences:com.apple.preference.security?Privacy"'),pe.info("Opened System Settings > Privacy & Security");}catch{await ur("open -b com.apple.systempreferences"),pe.info("Opened System Settings");}}}function jo(){let o=process.env.TERM_PROGRAM;return o==="iTerm.app"?"iTerm":o==="Apple_Terminal"?"Terminal":o==="vscode"?"Visual Studio Code":o??"your terminal application"}async function Xo(o,e){let r=ct__default.default.createInterface({input:process.stdin,output:process.stdout});return new Promise(t=>{console.log(`
|
|
56
|
+
\u26A0\uFE0F ${e} cookie access is blocked by macOS security.
|
|
57
|
+
|
|
58
|
+
To grant access, ${o} needs permission to read ${e} data.
|
|
59
|
+
|
|
60
|
+
Would you like to:
|
|
61
|
+
1. Open System Settings to grant permission (recommended)
|
|
62
|
+
2. Skip ${e} cookies for now
|
|
63
|
+
3. Exit
|
|
64
|
+
|
|
65
|
+
Please enter your choice (1/2/3): `),r.question("",n=>{r.close(),t(n.trim()==="1");});})}async function fr(o,e){if(!N()||!(S(o,"eperm")||S(o,"operation not permitted")||S(o,"permission denied")||S(o,"authorization denied")))return false;let t=e.appName||jo();if(pe.warn(`${e.browserName} cookie access denied by macOS`,{app:t,error:d(o)}),e.interactive!==false){if(await Xo(t,e.browserName)){await Wo(),console.log(`
|
|
66
|
+
\u2705 System Settings opened to Privacy & Security
|
|
67
|
+
|
|
68
|
+
Please follow these steps:
|
|
69
|
+
1. Look for "${t}" in the list
|
|
70
|
+
2. If not present, click the "+" button and add it
|
|
71
|
+
3. Enable the toggle next to "${t}"
|
|
72
|
+
4. You may need to restart ${t} after granting permission
|
|
73
|
+
5. Then run this command again
|
|
74
|
+
|
|
75
|
+
Press Enter when you've completed these steps...`);let i=ct__default.default.createInterface({input:process.stdin,output:process.stdout});return await new Promise(s=>{i.question("",()=>{i.close(),s();});}),true}}else pe.info(`To grant ${e.browserName} access, add ${t} to System Settings > Privacy & Security > Full Disk Access`);return false}async function pr(o){try{return await promises.access(o,promises.constants.R_OK),!0}catch{return false}}T();x();E();T();x();E();var Se=zod.z.string().trim().min(1,"Domain cannot be empty").refine(o=>/^\.?[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(o),"Invalid domain format"),ve=zod.z.string().trim().min(1,"Cookie name cannot be empty").refine(o=>o==="%"||/^[!#$%&'()*+\-.:0-9A-Z ^_`a-z|~]+$/.test(o),"Invalid cookie name format - must contain only valid characters (letters, numbers, and certain symbols) or be '%' for wildcard"),lt=zod.z.string().trim().min(1,"Path cannot be empty").refine(o=>o.startsWith("/"),"Path must start with /").refine(o=>/^\/[!#$%&'()*+,\-./:=@\w~]*$/.test(o),"Invalid path format - must contain only valid URL path characters").default("/"),ut=zod.z.string().trim().transform(o=>Jo__default.default(o)).pipe(zod.z.any()),ft=zod.z.object({name:ve,value:ut,domain:Se,path:lt,expiry:zod.z.number().int(),creation:zod.z.number().int(),flags:zod.z.number().optional(),version:zod.z.number().int().optional(),port:zod.z.number().int().optional(),comment:zod.z.string().optional(),commentURL:zod.z.string().optional()}),Ko=zod.z.object({name:ve,domain:Se}).strict(),Yo=zod.z.object({file:zod.z.string().trim().min(1,"File path cannot be empty").optional(),browser:zod.z.string().trim().optional(),decrypted:zod.z.boolean().optional(),secure:zod.z.boolean().optional(),httpOnly:zod.z.boolean().optional(),path:lt.optional(),containerId:zod.z.number().int().optional()}).catchall(zod.z.unknown());zod.z.object({domain:Se,name:ve,value:ut,expiry:zod.z.union([zod.z.literal("Infinity"),zod.z.date(),zod.z.number().int().positive("Expiry must be a positive number")]).optional(),meta:Yo.optional()}).strict();zod.z.object({expiry:zod.z.number().int().optional(),domain:Se,name:ve,value:zod.z.union([zod.z.string(),zod.z.instanceof(Buffer)])}).strict();zod.z.object({format:zod.z.enum(["merged","grouped"]).optional(),separator:zod.z.string().optional(),showFilePaths:zod.z.boolean().optional()}).strict();var Zo=zod.z.enum(["Chrome","Firefox","Safari","internal","unknown"]),en=zod.z.object({browserName:Zo,queryCookies:zod.z.function()}).strict(),rn=zod.z.object({limit:zod.z.number().int().positive().optional(),removeExpired:zod.z.boolean().optional(),includeExpired:zod.z.boolean().optional(),store:zod.z.string().optional(),force:zod.z.boolean().optional(),container:zod.z.union([zod.z.string(),zod.z.number()]).optional()});rn.extend({strategy:en.optional()});var tn=zod.z.enum(["chrome","chromium","edge","firefox","opera","opera-gx","brave","arc","vivaldi"]);Ko.extend({browser:tn,exactDomain:zod.z.boolean().optional(),caseSensitive:zod.z.boolean().optional(),limit:zod.z.number().int().positive().optional(),includeExpired:zod.z.boolean().optional(),container:zod.z.union([zod.z.string(),zod.z.number()]).optional()});E();var G=h("BinaryCodableCookie"),Ee=class{constructor(e){this.version=0;this.url="";this.name="";this.path="";this.value="";this.flags={isSecure:false,isHTTPOnly:false,unknown1:false,unknown2:false};this.expiration=0;this.creation=0;let r={offset:0,buffer:e};this.decode(r);}decodeUrlValue(e){let r=e,t;do{t=r;try{r=decodeURIComponent(r);}catch{return t}}while(r!==t&&r.includes("%"));return r}decodeJwtPayload(e){let r=e.split(".");if(r.length!==3)return null;try{let t=r[1];if(!t)return null;let n=buffer.Buffer.from(t,"base64").toString("utf8"),i=JSON.parse(n);return JSON.stringify(i)}catch{return null}}parseJsonValue(e){try{let r=JSON.parse(e);return JSON.stringify(r)}catch{return null}}processValue(e){let r=this.handlePrimitiveValues(e);if(r!==null)return r;let t=e,n=this.decodeUrlValue(t);return this.trySpecializedDecoding(n)}handlePrimitiveValues(e){return e===null?"null":e===void 0?"undefined":buffer.Buffer.isBuffer(e)?e.toString():typeof e!="string"?this.safeStringify(e):null}trySpecializedDecoding(e){let r=this.tryJwtDecoding(e);if(r!==null)return r;let t=this.tryJsonDecoding(e);return t!==null?t:e}tryJwtDecoding(e){if(e.match(/^ey[A-Za-z0-9_-]+\.ey[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+$/)){let r=this.decodeJwtPayload(e);if(typeof r=="string"&&r.length>0)return r}return null}tryJsonDecoding(e){if(e.startsWith("{")||e.startsWith("[")){let r=this.parseJsonValue(e);if(typeof r=="string"&&r.length>0)return r}return null}safeStringify(e){try{return typeof e=="object"&&e!==null?JSON.stringify(e):String(e)}catch{return String(e)}}convertMacTimestamp(e){return e<=0?e:e>=0&&e<=1e9&&Number.isFinite(e)?e+978307200:0}toCookieRow(){try{let e=this.convertFlags(),r=this.url.replace(/^https?:\/\//,"").replace(/\/.*$/,"")||"uk",t=this.convertMacTimestamp(this.expiration),n=this.convertMacTimestamp(this.creation);return ft.parse({name:this.name.replace(/^: /,""),value:this.processValue(this.value)||"",domain:r,path:this.path||"/",expiry:t,creation:n,flags:e,version:this.version,port:this.port,comment:this.comment,commentURL:this.commentURL})}catch{return null}}readHeader(e){let r=e.buffer.readUInt32LE(e.offset);G.debug("Cookie size:",r),e.offset+=4;let t=e.buffer.readUInt32LE(e.offset);G.debug("Cookie version:",t),e.offset+=4;let n=e.buffer.readUInt32LE(e.offset);G.debug("Cookie flags:",n.toString(2).padStart(8,"0")),e.offset+=4,this.flags={isSecure:(n&1)!==0,isHTTPOnly:(n&4)!==0,unknown1:(n&8)!==0,unknown2:(n&16)!==0};let i=e.buffer.readUInt32LE(e.offset);G.debug("Has port:",i),e.offset+=4;let s={urlOffset:e.buffer.readUInt32LE(e.offset),nameOffset:e.buffer.readUInt32LE(e.offset+4),pathOffset:e.buffer.readUInt32LE(e.offset+8),valueOffset:e.buffer.readUInt32LE(e.offset+12),commentOffset:e.buffer.readUInt32LE(e.offset+16),commentURLOffset:e.buffer.readUInt32LE(e.offset+20)};return G.debug("String offsets:",s),{size:r,hasPort:i,offsets:s}}readTimestamps(e){let r=e.buffer.readDoubleLE(e.offset);e.offset+=8;let t=e.buffer.readDoubleLE(e.offset);e.offset+=8,this.expiration=r,this.creation=t;}readStrings(e,r,t){G.debug("Reading strings from cookie buffer of size:",r);let i=[{field:"url",offset:t.urlOffset},{field:"name",offset:t.nameOffset},{field:"path",offset:t.pathOffset},{field:"value",offset:t.valueOffset},{field:"comment",offset:t.commentOffset}].filter(s=>s.offset>0).sort((s,a)=>s.offset-a.offset);G.debug("Reading strings in order:",i.map(s=>s.field));for(let s=0;s<i.length;s++){let a=i[s],{field:c,offset:l}=a,g=(s<i.length-1?i[s+1].offset:r)-l,R=0+l;for(;R<0+l+g&&e.buffer[R]!==0;)R++;let w=e.buffer.toString("utf8",0+l,R);switch(G.debug(`Read ${c}:`,w),c){case "url":this.url=w;break;case "name":this.name=w;break;case "path":this.path=w;break;case "value":this.value=w;break;case "comment":this.comment=w;break}}}decode(e){let{size:r,hasPort:t,offsets:n}=this.readHeader(e),i=e.offset;e.offset=i+24,this.readTimestamps(e),t>0&&(this.port=e.buffer.readUInt16LE(e.offset),e.offset+=2),e.offset=i,this.readStrings(e,r,n);}convertFlags(){return (this.flags.isSecure?1:0)|(this.flags.isHTTPOnly?4:0)|(this.flags.unknown1?8:0)|(this.flags.unknown2?16:0)}};var $=h("BinaryCodablePage"),oe=class oe{constructor(e){this.cookies=[];let r={offset:0,buffer:e};this.decode(r);}toCookieRows(){let e=[];for(let r of this.cookies)try{let t=r.toCookieRow();t!==null&&e.push(t);}catch(t){Z("BinaryCookies","Error converting cookie",{error:d(t)});}return e}decode(e){let r=e.buffer.readUInt32BE(e.offset);if($.debug("Page header:",r.toString(16)),e.offset+=4,r!==oe.HEADER)throw new Error("Invalid page header");let t=e.buffer.readUInt32LE(e.offset);$.debug("Cookie count:",t),e.offset+=4;let n=e.offset-8;$.debug("Page start offset:",n);let i=[];for(let a=0;a<t;a++){let c=e.buffer.readUInt32LE(e.offset);i.push(c),$.debug(`Cookie ${a} offset:`,c),e.offset+=4;}let s=e.buffer.readUInt32BE(e.offset);if($.debug("Page footer:",s.toString(16)),e.offset+=4,s!==oe.FOOTER)throw new Error("Invalid page footer");for(let a=0;a<t;a++)try{let c=i[a];$.debug(`Reading cookie ${a} at offset:`,c);let l=e.buffer.readUInt32LE(c);if($.debug(`Cookie ${a} size:`,l),l<48){$.warn(`Invalid cookie size ${l} at index ${a}`);continue}if(c+l>e.buffer.length){$.warn(`Cookie size ${l} at index ${a} would exceed buffer length ${e.buffer.length}`);continue}let u=e.buffer.subarray(c,c+l),g=new Ee(u);this.cookies.push(g);}catch(c){$.warn("Invalid cookie data",{error:d(c)});}}};oe.HEADER=256,oe.FOOTER=0;var Be=oe;var U=h("BinaryCodableCookies"),I=class I{constructor(e){let r={offset:0,buffer:e};this.pages=[],this.metadata={},this.decode(r);}static fromFile(e){let r=xr(e);return new I(r)}static fromDefaultPath(){return I.fromFile(I.DEFAULT_COOKIE_PATH)}toCookieRows(){let e=[];for(let r of this.pages)try{let t=r.toCookieRows();Array.isArray(t)&&e.push(...t);}catch(t){Z("BinaryCookies","Error converting page cookies",{error:d(t)});}return e}decode(e){try{let r=e.buffer.subarray(e.offset,e.offset+4);if(e.offset+=4,U.debug("Magic bytes:",r.toString()),!r.equals(I.MAGIC))throw new Error("Missing magic value");let t=e.buffer.readUInt32BE(e.offset);U.debug("Page count:",t),e.offset+=4;let n=[];for(let c=0;c<t;c++){let l=e.buffer.readUInt32BE(e.offset);n.push(l),U.debug(`Page ${c} size:`,l),e.offset+=4;}let i=e.offset;U.debug("Starting page data at offset:",i);for(let c of n)try{U.debug("Reading page at offset:",i,"with size:",c);let l=e.buffer.subarray(i,i+c),u=new Be(l);this.pages.push(u),i+=c;}catch(l){U.warn("Error decoding page:",{error:d(l)}),i+=c;}e.offset=i;let s=e.buffer.readUInt32BE(e.offset);U.debug("Checksum:",s.toString(16)),e.offset+=4;let a=e.buffer.readBigUInt64BE(e.offset);U.debug("Footer:",a.toString(16)),e.offset+=8,a!==I.FOOTER&&Z("BinaryCookies","Invalid cookie file format: wrong footer"),this.metadata={};}catch(r){throw Z("BinaryCookies","Error decoding binary cookies file",{error:d(r)}),r}}};I.MAGIC=buffer.Buffer.from("cook","utf8"),I.FOOTER=BigInt("0x071720050000004b"),I.DEFAULT_COOKIE_PATH=path.join(os.homedir(),"Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookies");var Pe=I;function mt(o){return Pe.fromFile(o).toCookieRows()}function cn(o,e){let r=path.join(o,"Library","Containers","com.apple.Safari","Data","Library","Cookies","Cookies.binarycookies"),t=path.join(o,"Library","Cookies","Cookies.binarycookies"),n=e(r),i=e(t);return !n&&i?t:r}var j=class extends _{constructor(e){super("SafariCookieQueryStrategy","Safari"),this.lockHandler=new Q(this.logger,"Safari"),e!==void 0&&(this.profileName=e);}getCookieDbPath(e){return cn(e,v)}formatDomain(e){return e==null||typeof e!="string"?"":e.startsWith(".")?e.slice(1):e}formatExpiry(e){return e==null?void 0:typeof e!="number"||Number.isNaN(e)||e<=0?"Infinity":e<0||e>4102444800?(this.logger.warn("Invalid expiry timestamp, treating as session cookie",{expiry:e}),"Infinity"):new Date(e*1e3)}isFlagSet(e,r){return typeof e!="number"||Number.isNaN(e)||e<=0?false:(e&r)===r}formatCreation(e){if(typeof e!="number"||Number.isNaN(e)||e<=0)return;if(e<0||e>4102444800){this.logger.warn("Invalid creation timestamp, ignoring",{creation:e});return}return e*1e3}processValue(e){if(e===null)return "null";if(e===void 0)return "undefined";if(Buffer.isBuffer(e))return e.toString();if(typeof e=="object")try{return JSON.stringify(e)}catch{return "[object]"}return typeof e=="string"?e:typeof e=="number"||typeof e=="boolean"?String(e):"[unknown value]"}async decodeCookies(e,r,t,n){try{if(!await this.checkAndHandlePermissions(e,n))return [];let s=mt(e);return this.processCookies(s,r,t,e)}catch(i){return this.handleDecodingError(i,e,r,t,n)}}async checkAndHandlePermissions(e,r){return await pr(e)?true:(this.logger.warn("Cannot access Safari cookies due to macOS permissions",{file:e,suggestion:"Terminal application needs Full Disk Access permission"}),await fr(new Error("EPERM: operation not permitted"),{appName:process.env.TERM_PROGRAM??"Terminal",browserName:"Safari",interactive:r!==true})?await pr(e)?true:(this.logger.error("Still cannot access Safari cookies after permission attempt",{file:e,advice:"Please restart your terminal application after granting Full Disk Access"}),false):false)}processCookies(e,r,t,n){return e.filter(i=>this.matchesCriteria(i,r,t)).map(i=>this.mapToExportedCookie(i,n))}matchesCriteria(e,r,t){if(!this.isCookieObject(e))return false;let n=this.formatDomain(e.domain);if(n==="")return false;let i=r==="%"||e.name===r,s=t==="%"||n.includes(t);return i&&s}isCookieObject(e){return typeof e=="object"&&e!==null&&"name"in e&&typeof e.name=="string"}mapToExportedCookie(e,r){let t=e;return {domain:this.formatDomain(t.domain),name:t.name,value:this.processValue(t.value),expiry:this.formatExpiry(t.expiry),meta:{file:r,browser:"Safari",decrypted:false,secure:this.isFlagSet(t.flags,1),httpOnly:this.isFlagSet(t.flags,4),path:t.path??void 0,version:t.version===void 0?void 0:t.version,comment:t.comment??void 0,commentURL:t.commentURL??void 0,port:t.port===void 0?void 0:t.port,creation:this.formatCreation(t.creation)}}}async handleDecodingError(e,r,t,n,i){return S(e,"EPERM")||S(e,"operation not permitted")||S(e,"Permission denied")?await this.handlePermissionError(e,r,t,n,i):this.logDecodingError(e,r,t,n),[]}async handlePermissionError(e,r,t,n,i){await fr(e,{appName:process.env.TERM_PROGRAM??"Terminal",browserName:"Safari",interactive:i!==true})?this.logger.info("Permission flow completed. Please run the command again after granting access."):this.logger.warn(`Permission denied accessing Safari cookies at ${r}`,K(e,{file:r,name:t,domain:n,advice:"Grant Full Disk Access to your terminal in System Settings > Privacy & Security"}));}logDecodingError(e,r,t,n){this.logger.error(`Error decoding ${r}`,K(e,{file:r,name:t,domain:n}));}async executeQuery(e,r,t,n){if(this.profileName!==void 0&&this.logger.warn(`Safari does not support profile filtering. --profile "${this.profileName}" will be ignored; all Safari cookies will be returned.`),!N())return this.logger.debug("Safari strategy skipped on non-macOS platform"),[];try{this.logger.info("Querying cookies",{name:e,domain:r,store:t});let i=os.homedir();if(!this.isValidHomeDirectory(i))return [];let s=t??this.getCookieDbPath(i),a=e||"%",c=r||"%",l=await this.attemptDecodeWithLockHandling(s,a,c,n);return l.success?l.cookies:l.shouldRetry?this.retryAfterBrowserClose(s,a,c,n,l.shouldRelaunch):[]}catch(i){return this.logQueryError(i,e,r),[]}}isValidHomeDirectory(e){return typeof e!="string"||e.length===0?(this.logger.error("Failed to get home directory"),false):true}async attemptDecodeWithLockHandling(e,r,t,n){try{return {success:!0,cookies:await this.decodeCookies(e,r,t,n),shouldRetry:!1,shouldRelaunch:!1}}catch(i){return this.handleLockConflict(i,e,n)}}async handleLockConflict(e,r,t){if(!this.isLockError(e))throw e;let n=await Nr(),i=await this.lockHandler.handleBrowserConflict(e,r,n,t!==true);return i.resolved?{success:false,cookies:[],shouldRetry:true,shouldRelaunch:i.shouldRelaunch}:(this.logger.warn("Safari cookie file locked",K(e,{file:r,advice:"Safari may be accessing the cookie file. Try closing Safari and running again."})),{success:false,cookies:[],shouldRetry:false,shouldRelaunch:false})}isLockError(e){return S(e,"EPERM")||S(e,"operation not permitted")||S(e,"Permission denied")||S(e,"EBUSY")}async retryAfterBrowserClose(e,r,t,n,i){try{this.logger.info("Retrying Safari cookie extraction after browser close...");let s=await this.decodeCookies(e,r,t,n);return this.logger.success("Successfully extracted cookies after closing Safari"),i===!0&&await this.lockHandler.relaunchBrowser(),s}catch(s){return this.handleRetryFailure(s,e,i)}}async handleRetryFailure(e,r,t){return this.logger.error("Failed to extract cookies even after closing Safari",K(e,{file:r})),t===true&&await this.lockHandler.relaunchBrowser(),[]}logQueryError(e,r,t){this.logger.error("Failed to query cookies",K(e,{name:r,domain:t}));}};x();Y();var ln=[new V,new W,new j];async function gt(o){if(!o.name||!o.domain)return [];let{name:e,domain:r}=o;if(typeof e!="string"||typeof r!="string")return [];let t=ln;return (await Promise.allSettled(t.map(async i=>i.queryCookies(e,r)))).filter(i=>i.status==="fulfilled").flatMap(i=>i.value)}async function Ae(o){try{let e=await gt(o);return C.debug("Cookies retrieved:",e),e}catch(e){return C.warn("Error querying cookies:",d(e)),[]}}x();Y();x();Y();var un=[new V,new W,new j];function fn(o){return o.filter(e=>!!e.name&&!!e.domain&&typeof e.name=="string"&&typeof e.domain=="string")}function pn(o){return "batchQueryCookies"in o&&typeof o.batchQueryCookies=="function"}function mn(o,e){let r=[],t=[];for(let n of o)if(n.status==="fulfilled")r.push(...n.value);else if(e)t.push(z(n.reason,"Query failed"));else throw n.reason;return {cookies:r,errors:t}}async function dn(o,e,r){let t=[],n=[];try{if(pn(o)){let i=await o.batchQueryCookies(e);t.push(...i);}else {let i=await Promise.allSettled(e.map(async a=>o.queryCookies(a.name,a.domain))),s=mn(i,r);t.push(...s.cookies),n.push(...s.errors);}}catch(i){let s=z(i,`Failed to query ${o.constructor.name}`);if(!r)throw s;n.push(s),C.warn(`Strategy ${o.constructor.name} failed`,{error:d(s)});}return {cookies:t,errors:n}}async function mr(o,e=true){let r=fn(o);if(r.length===0)return [];C.debug(`Batch querying ${r.length} cookie specs`);let t=un,n=[],i=[],s=await Promise.allSettled(t.map(async a=>dn(a,r,e)));for(let a of s)if(a.status==="fulfilled")n.push(...a.value.cookies),i.push(...a.value.errors);else if(e)i.push(z(a.reason,"Strategy query failed"));else throw a.reason;return i.length>0&&C.debug(`${i.length} errors occurred during batch query`),n}async function gn(o,e={}){let{deduplicate:r=true,concurrency:t=10,continueOnError:n=true}=e;C.debug(`Batch fetching ${o.length} cookie specs`,{deduplicate:r,concurrency:t,continueOnError:n});let i;try{i=await mr(o,n),C.debug(`Batch query returned ${i.length} cookies`);}catch(s){if(!n)throw s;C.warn("Batch query failed, falling back to individual queries",{error:d(s)}),i=await Cn(o,t,n);}if(r&&i.length>0){let s=xn(i);return C.debug(`Deduplicated ${i.length} to ${s.length}`),s}return i}function hn(o,e){return o.map(r=>{let t=e.filter(n=>n.name===r.name&&n.domain===r.domain);return {spec:r,cookies:t}})}async function yn(o,e){let r=o.map(async t=>{try{let n=await Ae(t);return {spec:t,cookies:n}}catch(n){let i=z(n,"Failed to fetch cookies");if(!e)throw i;return C.warn("Failed to fetch cookies for spec",{spec:t,error:d(i)}),{spec:t,cookies:[],error:i}}});return Promise.all(r)}async function wn(o,e={}){let{concurrency:r=10,continueOnError:t=true}=e;C.debug(`Batch fetching ${o.length} cookie specs with results`,{concurrency:r,continueOnError:t});try{let n=await mr(o,t);return hn(o,n)}catch(n){C.warn("Batch query failed, falling back to individual queries",{error:d(n)});let i=[];for(let s=0;s<o.length;s+=r){let a=o.slice(s,s+r),c=await yn(a,t);i.push(...c);}return i}}async function bn(o,e){let r=[],t=[],n=o.map(async s=>{try{let a=await Ae(s);return {spec:s,cookies:a,error:void 0}}catch(a){let c=z(a,"Failed to fetch cookies");if(!e)throw c;return C.warn("Failed to fetch cookies for spec",{spec:s,error:d(c)}),{spec:s,cookies:[],error:c}}}),i=await Promise.all(n);for(let s of i)s.error?t.push({spec:s.spec,error:s.error}):r.push(...s.cookies);return {cookies:r,errors:t}}async function Cn(o,e,r){let t=[],n=[];for(let i=0;i<o.length;i+=e){let s=o.slice(i,i+e),{cookies:a,errors:c}=await bn(s,r);t.push(...a),n.push(...c);}return n.length>0&&C.warn(`${n.length} specs failed during batch retrieval`,{failedSpecs:n.map(i=>i.spec)}),t}function xn(o){let e=new Map;for(let r of o){let t=`${r.name}:${r.domain}`,n=e.get(t),i=n?.value.length??0,s=r.value.length;(!n||s>i)&&e.set(t,r);}return Array.from(e.values())}Br("bun");Cr(br());
|
|
76
|
+
exports.ChromeCookieQueryStrategy=V;exports.ChromiumCookieQueryStrategy=fe;exports.CompositeCookieQueryStrategy=qe;exports.FirefoxCookieQueryStrategy=W;exports.SafariCookieQueryStrategy=j;exports.batchGetCookies=gn;exports.batchGetCookiesWithResults=wn;exports.getChromiumProfiles=Fo;exports.getCookie=Ae;//# sourceMappingURL=bun.cjs.map
|
|
77
|
+
//# sourceMappingURL=bun.cjs.map
|