@mherod/get-cookie 4.0.1 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-56Z35D5R.js +2 -0
- package/dist/chunk-56Z35D5R.js.map +1 -0
- package/dist/chunk-5FUMK7M3.js +4 -0
- package/dist/chunk-5FUMK7M3.js.map +1 -0
- package/dist/chunk-5ZT2G45S.js +2 -0
- package/dist/chunk-5ZT2G45S.js.map +1 -0
- package/dist/chunk-FR2MKDHT.js +2 -0
- package/dist/chunk-FR2MKDHT.js.map +1 -0
- package/dist/{chunk-BKU5PKJ5.js → chunk-HMKSQBDC.js} +2 -2
- package/dist/chunk-VMBA4NVU.js +2 -0
- package/dist/{chunk-FZ5IFH4R.js → chunk-W3JALMAX.js} +2 -2
- package/dist/cli.cjs +19 -0
- package/dist/cli.cjs.map +1 -0
- package/dist/getChromeCookie-4ZWACG6M.js +2 -0
- package/dist/getChromePassword-GTIXL733.js +2 -0
- package/dist/getChromePassword-GTIXL733.js.map +1 -0
- package/dist/getCookie-43FKMQEZ.js +2 -0
- package/dist/getFirefoxCookie-OJYYZFZP.js +2 -0
- package/dist/getGroupedRenderedCookies-P5VZXZUC.js +2 -0
- package/dist/getMergedRenderedCookies-C6TXK2I4.js +2 -0
- package/dist/index.cjs +3 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -1
- package/jest.setup.js +8 -1
- package/package.json +11 -6
- package/tsconfig.build.json +7 -3
- package/tsup.cli.ts +27 -0
- package/tsup.config.ts +27 -0
- package/tsup.lib.ts +27 -0
- package/dist/chunk-4I5M3M7H.js +0 -6
- package/dist/chunk-4I5M3M7H.js.map +0 -1
- package/dist/chunk-ACXFQWII.js +0 -2
- package/dist/chunk-DR2EQC4R.js +0 -2
- package/dist/chunk-DR2EQC4R.js.map +0 -1
- package/dist/chunk-S5FU4HO5.js +0 -2
- package/dist/chunk-S5FU4HO5.js.map +0 -1
- package/dist/chunk-TUGIEFXM.js +0 -2
- package/dist/chunk-TUGIEFXM.js.map +0 -1
- package/dist/cli/cli.cjs +0 -8
- package/dist/cli/cli.cjs.map +0 -1
- package/dist/cli/cli.d.ts +0 -1
- package/dist/cli/cli.js +0 -4
- package/dist/cli/cli.js.map +0 -1
- package/dist/getChromeCookie-P623SIWB.js +0 -2
- package/dist/getChromePassword-74BC3LXO.js +0 -2
- package/dist/getChromePassword-74BC3LXO.js.map +0 -1
- package/dist/getCookie-FBQKCKJB.js +0 -2
- package/dist/getFirefoxCookie-CGJJJ7VC.js +0 -2
- package/dist/getGroupedRenderedCookies-RNB6DKBL.js +0 -2
- package/dist/getMergedRenderedCookies-NC3UTOIC.js +0 -2
- /package/dist/{chunk-BKU5PKJ5.js.map → chunk-HMKSQBDC.js.map} +0 -0
- /package/dist/{chunk-ACXFQWII.js.map → chunk-VMBA4NVU.js.map} +0 -0
- /package/dist/{chunk-FZ5IFH4R.js.map → chunk-W3JALMAX.js.map} +0 -0
- /package/dist/{cli/cli.d.cts → cli.d.cts} +0 -0
- /package/dist/{getChromeCookie-P623SIWB.js.map → getChromeCookie-4ZWACG6M.js.map} +0 -0
- /package/dist/{getCookie-FBQKCKJB.js.map → getCookie-43FKMQEZ.js.map} +0 -0
- /package/dist/{getFirefoxCookie-CGJJJ7VC.js.map → getFirefoxCookie-OJYYZFZP.js.map} +0 -0
- /package/dist/{getGroupedRenderedCookies-RNB6DKBL.js.map → getGroupedRenderedCookies-P5VZXZUC.js.map} +0 -0
- /package/dist/{getMergedRenderedCookies-NC3UTOIC.js.map → getMergedRenderedCookies-C6TXK2I4.js.map} +0 -0
package/dist/cli/cli.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
package/dist/cli/cli.js
DELETED
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import{a as k,b as C}from"../chunk-DR2EQC4R.js";import{a as h}from"../chunk-BKU5PKJ5.js";import"../chunk-4I5M3M7H.js";import{a,c as l}from"../chunk-TUGIEFXM.js";import"../chunk-ACXFQWII.js";function b(e){if(!e)return[];try{let o=[],t=new URL(e).hostname,i=t.split(".");o.push({name:"%",domain:t});for(let n=1;n<i.length-1;n++)o.push({name:"%",domain:`%.${i.slice(n).join(".")}`}),o.push({name:"%",domain:i.slice(n).join(".")});return o}catch(o){throw o instanceof TypeError?new Error("Invalid URL"):o}}import{parseArgs as A}from"node:util";function c(e){let{values:o,positionals:r}=A({args:e,options:{browser:{type:"string",short:"b"},profile:{type:"string",short:"p"},url:{type:"string",short:"u"},domain:{type:"string",short:"d"},name:{type:"string",short:"n"},help:{type:"boolean",short:"h"},version:{type:"boolean",short:"v"},verbose:{type:"boolean"}},allowPositionals:!0});return{values:o,positionals:r}}import{groupBy as E}from"lodash";import{join as I}from"path";import{readFileSync as Q}from"fs";var R=1706047360;function m(e,o){let r=o;for(;r<e.length&&e[r]!==0;)r++;return[e.toString("utf8",o,r),r+1]}function $(e,o){let r=e.readUInt32LE(o),t=o+43,n=e.readUInt32LE(t)-R,s=o+56,[p,u]=m(e,s);s=u;let[y,w]=m(e,s);s=w;let[P,O]=m(e,s);s=O;let[D,Y]=m(e,s);return[{name:y,value:D,domain:p.startsWith(".")?p.slice(1):p,path:P||"/",expiry:n,creation:n},r]}function B(e,o,r){let t=o+5,i=e.readUInt32BE(t),n=o+i,s=[],p=o+r;for(;n<p-8;)try{let[u,y]=$(e,n);s.push(u),n+=y}catch(u){console.warn(`Error decoding cookie at offset ${n}:`,u);break}return s}function x(e){let o=Q(e),r=o.readUInt32BE(4),t=[];for(let s=0;s<r;s++)t.push(o.readUInt32BE(8+s*4));let i=8+r*4,n=[];for(let s=0;s<r;s++)try{let p=B(o,i,t[s]);n.push(...p),i+=t[s]}catch(p){console.warn(`Error decoding page ${s}:`,p),i+=t[s]}return n}var d=class{constructor(){this.browserName="Safari"}getHomeDir(){let o=process.env.HOME;return typeof o!="string"||o.trim()===""?(l("SafariCookieQueryStrategy","HOME environment variable is not set"),null):o}getCookieDbPath(o){return I(o,"Library","Containers","com.apple.Safari","Data","Library","Cookies","Cookies.binarycookies")}decodeCookies(o,r,t){try{return x(o).filter(n=>n.name===r&&n.domain.includes(t)).map(n=>({domain:n.domain,name:n.name,value:n.value.toString(),expiry:typeof n.expiry=="number"&&n.expiry>0?new Date(n.expiry*1e3):"Infinity",meta:{file:o,browser:"Safari",decrypted:!1}}))}catch(i){return i instanceof Error?l("SafariCookieQueryStrategy",`Error decoding ${o}`,{error:i,name:r,domain:t}):l("SafariCookieQueryStrategy",`Error decoding ${o}`,{error:"Unknown error",name:r,domain:t}),[]}}async queryCookies(o,r){let t=this.getHomeDir();if(typeof t!="string"||t.length===0)return Promise.resolve([]);let i=this.getCookieDbPath(t);return Promise.resolve(this.decodeCookies(i,o,r))}};var f=class{constructor(){this.browserName="all";this.strategies=[C,h,d]}async queryCookies(o,r){return a.info(`Querying cookies for name: ${o}, domain: ${r}`),k(this.strategies,async t=>{try{return await new t().queryCookies(o,r)}catch(i){return i instanceof Error?a.error(`Error querying ${t.name}: ${i.message}`):a.error(`Error querying ${t.name}: Unknown error`),[]}})}};function U(e){return e.expiry==="Infinity"?{...e,expiry:"Infinity"}:typeof e.expiry=="number"?{...e,expiry:new Date(e.expiry*1e3)}:e}async function S(e,o={}){var s;let r=(s=o.strategy)!=null?s:new f,t=async p=>(await r.queryCookies(p.name,p.domain)).map(U),i=Array.isArray(e)?await Promise.all(e.map(t)):await t(e),n=Array.isArray(i)?i.flat():i;if(o.removeExpired===!0){let p=Date.now();n=n.filter(u=>u.expiry==="Infinity"||u.expiry instanceof Date&&u.expiry.getTime()>p)}return typeof o.limit=="number"&&o.limit>0&&(n=n.slice(0,o.limit)),n}function g(e,o=!1){if(e.length===0)return"No cookies found.";let r=[];r.push(`Found ${e.length} cookie${e.length===1?"":"s"}:`);for(let t of e)if(r.push(`- ${t.name}=${t.value}`),o){if(r.push(` Domain: ${t.domain}`),t.expiry!==void 0){let i=typeof t.expiry=="number"||t.expiry==="Infinity"?t.expiry:t.expiry.toISOString();r.push(` Expires: ${i}`)}t.meta&&r.push(` Metadata: ${JSON.stringify(t.meta,null,2)}`)}return r.join(`
|
|
3
|
-
`)}function F(e){a.log(e)}function N(e){let o=E(e,r=>{var t,i;return(i=(t=r.meta)==null?void 0:t.file)!=null?i:"unknown"});a.log(JSON.stringify(o,null,2))}function H(e){a.log(g(e))}function L(e){let o=E(e,r=>{var t,i;return(i=(t=r.meta)==null?void 0:t.file)!=null?i:"unknown"});for(let[r,t]of Object.entries(o))a.log(`${r}: ${g(t)}`)}function j(e){a.log(JSON.stringify(e,null,2))}function q(e){for(let o of e)a.log(o.value)}function M(e){return e.dump===!0||e.d===!0}function _(e){return e["dump-grouped"]===!0||e.D===!0}function T(e){return e.render===!0||e["render-merged"]===!0||e.r===!0}function G(e){return e["render-grouped"]===!0||e.R===!0}function J(e,o){if(M(o)){F(e);return}if(_(o)){N(e);return}if(T(o)){H(e);return}if(G(o)){L(e);return}if(o.output==="json"){j(e);return}q(e)}async function v(e,o,r,t,i){try{let n=await S(e,{limit:t,removeExpired:i});if(n.length===0){a.error("No results");return}let{values:s}=c(process.argv.slice(2));J(n,s)}catch(n){n instanceof Error?a.error(n.message):a.error("An unknown error occurred")}}function z(){a.log(`Usage: ${process.argv[1]} [name] [domain] [options]`),a.log("Options:"),a.log(" -h, --help: Show this help message"),a.log(" -v, --verbose: Enable verbose output"),a.log(" -d, --dump: Dump all results"),a.log(" -D, --dump-grouped: Dump all results, grouped by profile"),a.log(" -r, --render: Render all results")}function W(e){var t,i,n,s;let o=(t=e._[0])!=null?t:"%",r=(i=e._[1])!=null?i:"%";return{name:(n=e.name)!=null?n:o,domain:(s=e.domain)!=null?s:r}}function K(e){var r;let o=(r=e.url)!=null?r:e.u;return typeof o=="string"?b(o):[W(e)]}async function V(e){let o=K(e);e.verbose===!0&&a.log("cookieSpecs",o);try{await v(o,["chrome","firefox","safari"],["default"])}catch(r){r instanceof Error?a.error("Error querying cookies:",r.message):a.error("An unknown error occurred while querying cookies")}}async function X(){var r;let e=process.argv.slice(2),{values:o}=c(e);if(o.help===!0||o.h===!0){z();return}o.verbose=(r=o.verbose)!=null?r:o.v,await V(o)}X().catch(e=>{e instanceof Error?a.error("Fatal error:",e.message):a.error("An unknown fatal error occurred"),process.exit(1)});
|
|
4
|
-
//# sourceMappingURL=cli.js.map
|
package/dist/cli/cli.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/core/cookies/cookieSpecsFromUrl.ts","../../src/utils/argv.ts","../../src/cli/cliQueryCookies.ts","../../src/core/browsers/safari/SafariCookieQueryStrategy.ts","../../src/core/browsers/decodeBinaryCookies.ts","../../src/core/browsers/CompositeCookieQueryStrategy.ts","../../src/core/cookies/comboQueryCookieSpec.ts","../../src/core/cookies/resultsRendered.ts","../../src/cli/cli.ts"],"sourcesContent":["import type { CookieSpec } from \"../../types/CookieSpec\";\n\n/**\n * Generate cookie specifications from a URL by creating specs for both the exact domain\n * and its parent domains. This allows for proper cookie matching across domain levels.\n * @internal\n * @param url - The URL to generate cookie specs from (e.g., 'https://example.com')\n * @returns An array of cookie specifications for the URL and its parent domains\n * @throws {Error} If the URL is invalid or cannot be parsed\n * @example\n * // Basic usage with a simple URL\n * cookieSpecsFromUrl('https://sub.example.com')\n * // Returns: [\n * // { name: '%', domain: 'sub.example.com' },\n * // { name: '%', domain: '%.example.com' },\n * // { name: '%', domain: 'example.com' }\n * // ]\n * @example\n * // Error handling\n * try {\n * cookieSpecsFromUrl('invalid-url')\n * } catch (error) {\n * console.error(error.message) // \"Invalid URL\"\n * }\n */\nexport function cookieSpecsFromUrl(url: string): CookieSpec[] {\n if (!url) {\n return [];\n }\n\n try {\n const cookieSpecs: CookieSpec[] = [];\n const urlObj = new URL(url);\n const domain = urlObj.hostname;\n const parts = domain.split(\".\");\n\n // Add exact domain match\n cookieSpecs.push({\n name: \"%\",\n domain: domain,\n });\n\n // Generate specs for each subdomain level\n for (let i = 1; i < parts.length - 1; i++) {\n // Add wildcard for current level\n cookieSpecs.push({\n name: \"%\",\n domain: `%.${parts.slice(i).join(\".\")}`,\n });\n\n // Add exact domain for current level\n cookieSpecs.push({\n name: \"%\",\n domain: parts.slice(i).join(\".\"),\n });\n }\n\n return cookieSpecs;\n } catch (error) {\n if (error instanceof TypeError) {\n throw new Error(\"Invalid URL\");\n }\n throw error;\n }\n}\n","import { parseArgs } from \"node:util\";\n\n/**\n * Interface representing parsed command line arguments.\n * @property values - Record of option values parsed from command line\n * @property positionals - Array of positional arguments\n * @example\n * ```typescript\n * const args: ParsedArgs = {\n * values: {\n * browser: 'chrome',\n * profile: 'default',\n * verbose: true\n * },\n * positionals: ['script.js', 'input.txt']\n * }\n * ```\n */\ninterface ParsedArgs {\n /** Record of option values parsed from command line */\n values: Record<string, string | boolean | string[]>;\n /** Array of positional arguments */\n positionals: string[];\n}\n\n/**\n * Parses command line arguments into a structured format.\n * @internal\n * @param argv - Array of command line arguments to parse\n * @returns Parsed command line arguments object\n * @example\n * ```typescript\n * // Basic usage\n * const args = parseArgv(['--browser', 'chrome', '--verbose', 'script.js']);\n * // Returns: { values: { browser: 'chrome', verbose: true }, positionals: ['script.js'] }\n *\n * // Using short options\n * const args = parseArgv(['-b', 'firefox', '-v', 'script.js']);\n * // Returns: { values: { browser: 'firefox', verbose: true }, positionals: ['script.js'] }\n *\n * // Error handling\n * const args = parseArgv(['--invalid']); // Will throw error for unknown option\n * ```\n */\nexport function parseArgv(argv: string[]): ParsedArgs {\n const { values, positionals } = parseArgs({\n args: argv,\n options: {\n browser: {\n type: \"string\",\n short: \"b\",\n },\n profile: {\n type: \"string\",\n short: \"p\",\n },\n url: {\n type: \"string\",\n short: \"u\",\n },\n domain: {\n type: \"string\",\n short: \"d\",\n },\n name: {\n type: \"string\",\n short: \"n\",\n },\n help: {\n type: \"boolean\",\n short: \"h\",\n },\n version: {\n type: \"boolean\",\n short: \"v\",\n },\n verbose: {\n type: \"boolean\",\n },\n },\n allowPositionals: true,\n });\n\n return { values, positionals };\n}\n","// Third-party imports\nimport { groupBy } from \"lodash\";\n\n// Local imports - types\nimport { comboQueryCookieSpec } from \"@core/cookies/comboQueryCookieSpec\";\nimport { resultsRendered } from \"@core/cookies/resultsRendered\";\nimport { parseArgv } from \"@utils/argv\";\nimport logger from \"@utils/logger\";\n\nimport type { CookieSpec } from \"../types/CookieSpec\";\nimport type { ExportedCookie } from \"../types/ExportedCookie\";\n\ninterface ParsedArgs {\n dump?: boolean;\n d?: boolean;\n \"dump-grouped\"?: boolean;\n D?: boolean;\n render?: boolean;\n \"render-merged\"?: boolean;\n r?: boolean;\n \"render-grouped\"?: boolean;\n R?: boolean;\n output?: string;\n [key: string]: unknown;\n}\n\nfunction handleDumpOutput(results: ExportedCookie[]): void {\n logger.log(results);\n}\n\nfunction handleGroupedDumpOutput(results: ExportedCookie[]): void {\n const groupedByFile = groupBy(results, (r) => r.meta?.file ?? \"unknown\");\n logger.log(JSON.stringify(groupedByFile, null, 2));\n}\n\nfunction handleRenderOutput(results: ExportedCookie[]): void {\n logger.log(resultsRendered(results));\n}\n\nfunction handleGroupedRenderOutput(results: ExportedCookie[]): void {\n const groupedByFile = groupBy(results, (r) => r.meta?.file ?? \"unknown\");\n for (const [file, fileResults] of Object.entries(groupedByFile)) {\n logger.log(`${file}: ${resultsRendered(fileResults)}`);\n }\n}\n\nfunction handleJsonOutput(results: ExportedCookie[]): void {\n logger.log(JSON.stringify(results, null, 2));\n}\n\nfunction handleDefaultOutput(results: ExportedCookie[]): void {\n for (const result of results) {\n logger.log(result.value);\n }\n}\n\nfunction shouldHandleDump(args: ParsedArgs): boolean {\n return args.dump === true || args.d === true;\n}\n\nfunction shouldHandleGroupedDump(args: ParsedArgs): boolean {\n return args[\"dump-grouped\"] === true || args.D === true;\n}\n\nfunction shouldHandleRender(args: ParsedArgs): boolean {\n return (\n args.render === true || args[\"render-merged\"] === true || args.r === true\n );\n}\n\nfunction shouldHandleGroupedRender(args: ParsedArgs): boolean {\n return args[\"render-grouped\"] === true || args.R === true;\n}\n\nfunction handleOutput(results: ExportedCookie[], args: ParsedArgs): void {\n if (shouldHandleDump(args)) {\n handleDumpOutput(results);\n return;\n }\n\n if (shouldHandleGroupedDump(args)) {\n handleGroupedDumpOutput(results);\n return;\n }\n\n if (shouldHandleRender(args)) {\n handleRenderOutput(results);\n return;\n }\n\n if (shouldHandleGroupedRender(args)) {\n handleGroupedRenderOutput(results);\n return;\n }\n\n if (args.output === \"json\") {\n handleJsonOutput(results);\n return;\n }\n\n handleDefaultOutput(results);\n}\n\n/**\n * Query cookies from browsers using the CLI interface\n * @param cookieSpec - Cookie specification(s) to query for\n * @param browsers - List of browsers to query from\n * @param profiles - List of browser profiles to query from\n * @param limit - Optional limit on the number of results\n * @param removeExpired - Whether to remove expired cookies from results\n * @example\n * // Query cookies from all browsers for a specific domain\n * const cookies = await cliQueryCookies(\n * { name: '*', domain: 'example.com' },\n * ['chrome', 'firefox'],\n * ['default'],\n * 10,\n * true\n * );\n *\n * // Query multiple cookie specs\n * const multiCookies = await cliQueryCookies(\n * [\n * { name: 'session', domain: 'app.example.com' },\n * { name: 'auth', domain: 'auth.example.com' }\n * ],\n * ['chrome'],\n * ['default', 'profile1']\n * );\n *\n * // Handle errors\n * try {\n * const cookies = await cliQueryCookies(\n * { name: 'token', domain: 'api.example.com' },\n * ['chrome']\n * );\n * console.log(`Found ${cookies.length} cookies`);\n * } catch (error) {\n * console.error('Failed to query cookies:', error);\n * }\n */\nexport async function cliQueryCookies(\n cookieSpec: CookieSpec | CookieSpec[],\n browsers: string[],\n profiles: string[],\n limit?: number,\n removeExpired?: boolean,\n): Promise<void> {\n try {\n const results = await comboQueryCookieSpec(cookieSpec, {\n limit,\n removeExpired,\n });\n\n if (results.length === 0) {\n logger.error(\"No results\");\n return;\n }\n\n const { values: args } = parseArgv(process.argv.slice(2));\n handleOutput(results, args as ParsedArgs);\n } catch (error) {\n if (error instanceof Error) {\n logger.error(error.message);\n } else {\n logger.error(\"An unknown error occurred\");\n }\n }\n}\n","import { join } from \"path\";\n\nimport { logError } from \"@utils/logHelpers\";\n\nimport type { BrowserName } from \"../../../types/BrowserName\";\nimport type { CookieQueryStrategy } from \"../../../types/CookieQueryStrategy\";\nimport type { ExportedCookie } from \"../../../types/ExportedCookie\";\nimport { decodeBinaryCookies } from \"../decodeBinaryCookies\";\n\n/**\n * Strategy for querying cookies from Safari browser\n */\nexport class SafariCookieQueryStrategy implements CookieQueryStrategy {\n /**\n *\n */\n public readonly browserName: BrowserName = \"Safari\";\n\n /**\n * Gets the user's home directory from environment variables\n * @returns The home directory path or null if not set\n */\n private getHomeDir(): string | null {\n const homeDir = process.env.HOME;\n if (typeof homeDir !== \"string\" || homeDir.trim() === \"\") {\n logError(\n \"SafariCookieQueryStrategy\",\n \"HOME environment variable is not set\",\n );\n return null;\n }\n return homeDir;\n }\n\n /**\n * Gets the path to Safari's cookie database\n * @param homeDir - User's home directory path\n * @returns Path to Safari's cookie database\n */\n private getCookieDbPath(homeDir: string): string {\n return join(\n homeDir,\n \"Library\",\n \"Containers\",\n \"com.apple.Safari\",\n \"Data\",\n \"Library\",\n \"Cookies\",\n \"Cookies.binarycookies\",\n );\n }\n\n /**\n * Decodes cookies from Safari's binary cookie file\n * @param cookieDbPath - Path to the cookie database\n * @param name - Name of the cookie to find\n * @param domain - Domain to filter cookies by\n * @returns Array of exported cookies\n */\n private decodeCookies(\n cookieDbPath: string,\n name: string,\n domain: string,\n ): ExportedCookie[] {\n try {\n const cookies = decodeBinaryCookies(cookieDbPath);\n return cookies\n .filter(\n (cookie) => cookie.name === name && cookie.domain.includes(domain),\n )\n .map((cookie) => ({\n domain: cookie.domain,\n name: cookie.name,\n value: cookie.value.toString(),\n expiry:\n typeof cookie.expiry === \"number\" && cookie.expiry > 0\n ? new Date(cookie.expiry * 1000)\n : \"Infinity\",\n meta: {\n file: cookieDbPath,\n browser: \"Safari\" as const,\n decrypted: false,\n },\n }));\n } catch (error) {\n if (error instanceof Error) {\n logError(\n \"SafariCookieQueryStrategy\",\n `Error decoding ${cookieDbPath}`,\n { error, name, domain },\n );\n } else {\n logError(\n \"SafariCookieQueryStrategy\",\n `Error decoding ${cookieDbPath}`,\n { error: \"Unknown error\", name, domain },\n );\n }\n return [];\n }\n }\n\n /**\n * Query Safari's cookie storage for cookies matching the given criteria\n * @param name - Name of the cookie to find\n * @param domain - Domain to filter cookies by\n * @returns Array of matching cookies, or empty array if none found\n */\n public async queryCookies(\n name: string,\n domain: string,\n ): Promise<ExportedCookie[]> {\n const homeDir = this.getHomeDir();\n if (typeof homeDir !== \"string\" || homeDir.length === 0) {\n return Promise.resolve([]);\n }\n\n const cookieDbPath = this.getCookieDbPath(homeDir);\n return Promise.resolve(this.decodeCookies(cookieDbPath, name, domain));\n }\n}\n","import { readFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\ninterface CookieRow {\n name: string;\n value: string;\n domain: string;\n path: string;\n expiry: number;\n creation: number;\n flags?: number;\n}\n\n// The date offset for Safari cookies (until 2017)\nconst SAFARI_DATE_OFFSET = 1706047360;\n\nfunction readNullTerminatedString(\n buffer: Buffer,\n offset: number,\n): [string, number] {\n let end = offset;\n while (end < buffer.length && buffer[end] !== 0) {\n end++;\n }\n return [buffer.toString(\"utf8\", offset, end), end + 1];\n}\n\nfunction decodeCookieHeader(\n buffer: Buffer,\n offset: number,\n): [CookieRow, number] {\n // First 4 bytes are the cookie size in little-endian\n const size = buffer.readUInt32LE(offset);\n\n // Read the date at offset 0x2B (43 bytes from start)\n const dateOffset = offset + 0x2b;\n const date = buffer.readUInt32LE(dateOffset);\n const timestamp = date - SAFARI_DATE_OFFSET;\n\n // Dynamic fields start at offset 0x38 (56 bytes from start)\n let currentOffset = offset + 0x38;\n const [domain, nextOffset] = readNullTerminatedString(buffer, currentOffset);\n currentOffset = nextOffset;\n\n const [name, nextOffset2] = readNullTerminatedString(buffer, currentOffset);\n currentOffset = nextOffset2;\n\n // The fields are path, then value\n const [path, nextOffset3] = readNullTerminatedString(buffer, currentOffset);\n currentOffset = nextOffset3;\n\n const [value, _] = readNullTerminatedString(buffer, currentOffset);\n\n return [\n {\n name,\n value,\n domain: domain.startsWith(\".\") ? domain.slice(1) : domain,\n path: path || \"/\", // Default to root path if empty\n expiry: timestamp,\n creation: timestamp, // We don't have creation time in this format\n },\n size,\n ];\n}\n\nfunction decodePage(\n buffer: Buffer,\n offset: number,\n pageSize: number,\n): CookieRow[] {\n // Skip first 5 bytes\n const headerLengthOffset = offset + 5;\n // Next 4 bytes contain header length\n const headerLength = buffer.readUInt32BE(headerLengthOffset);\n\n let currentOffset = offset + headerLength;\n const cookies: CookieRow[] = [];\n const pageEnd = offset + pageSize;\n\n // Read cookies until we reach the page end\n while (currentOffset < pageEnd - 8) {\n try {\n const [cookie, size] = decodeCookieHeader(buffer, currentOffset);\n cookies.push(cookie);\n currentOffset += size;\n } catch (error) {\n console.warn(`Error decoding cookie at offset ${currentOffset}:`, error);\n break;\n }\n }\n\n return cookies;\n}\n\n/**\n * Decodes a Safari binary cookie file into an array of cookie objects.\n * @param cookieDbPath - Path to the Safari Cookies.binarycookies file\n * @returns Array of decoded cookie objects\n * @throws {Error} If the file cannot be read or has invalid format\n */\nexport function decodeBinaryCookies(cookieDbPath: string): CookieRow[] {\n const buffer = readFileSync(cookieDbPath);\n\n // Skip first 4 bytes (header)\n const numPages = buffer.readUInt32BE(4);\n\n // Read the page sizes array (4 bytes per page)\n const pageSizes: number[] = [];\n for (let i = 0; i < numPages; i++) {\n pageSizes.push(buffer.readUInt32BE(8 + i * 4));\n }\n\n // Skip the page sizes array\n let offset = 8 + numPages * 4;\n const cookies: CookieRow[] = [];\n\n // Process each page\n for (let i = 0; i < numPages; i++) {\n try {\n const pageCookies = decodePage(buffer, offset, pageSizes[i]);\n cookies.push(...pageCookies);\n offset += pageSizes[i];\n } catch (error) {\n console.warn(`Error decoding page ${i}:`, error);\n offset += pageSizes[i];\n }\n }\n\n return cookies;\n}\n\n/**\n * Retrieves cookies from Safari's binary cookie store.\n * @returns Array of decoded Safari cookies\n */\nexport function getSafariCookies(): CookieRow[] {\n const cookieDbPath = join(\n homedir(),\n \"Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookies\",\n );\n return decodeBinaryCookies(cookieDbPath);\n}\n","import { flatMapAsync } from \"@utils/flatMapAsync\";\nimport logger from \"@utils/logger\";\n\nimport type { CookieQueryStrategy } from \"../../types/CookieQueryStrategy\";\nimport type { ExportedCookie } from \"../../types/ExportedCookie\";\n\nimport { ChromeCookieQueryStrategy } from \"./chrome/ChromeCookieQueryStrategy\";\nimport { FirefoxCookieQueryStrategy } from \"./firefox/FirefoxCookieQueryStrategy\";\nimport { SafariCookieQueryStrategy } from \"./safari/SafariCookieQueryStrategy\";\n\ntype CookieStrategyConstructor = new () => CookieQueryStrategy;\n\n/**\n * A composite strategy that combines multiple cookie query strategies\n * This allows querying cookies from multiple browsers simultaneously\n * @example\n */\nexport class CompositeCookieQueryStrategy implements CookieQueryStrategy {\n /**\n *\n */\n public browserName = \"all\";\n\n private readonly strategies: CookieStrategyConstructor[];\n\n /**\n * Initializes with an empty array of strategies that can be added later\n */\n public constructor() {\n this.strategies = [\n ChromeCookieQueryStrategy,\n FirefoxCookieQueryStrategy,\n SafariCookieQueryStrategy,\n ];\n }\n\n /**\n * Queries cookies from all registered strategies\n * @param name - The name pattern to match cookies against\n * @param domain - The domain pattern to match cookies against\n * @returns A promise that resolves to an array of exported cookies from all strategies\n */\n public async queryCookies(\n name: string,\n domain: string,\n ): Promise<ExportedCookie[]> {\n logger.info(`Querying cookies for name: ${name}, domain: ${domain}`);\n\n return flatMapAsync(this.strategies, async (Strategy) => {\n try {\n const strategy = new Strategy();\n const cookies = await strategy.queryCookies(name, domain);\n return cookies;\n } catch (error) {\n if (error instanceof Error) {\n logger.error(`Error querying ${Strategy.name}: ${error.message}`);\n } else {\n logger.error(`Error querying ${Strategy.name}: Unknown error`);\n }\n return [];\n }\n });\n }\n}\n","import type { CookieQueryStrategy } from \"../../types/CookieQueryStrategy\";\nimport type { CookieSpec, MultiCookieSpec } from \"../../types/CookieSpec\";\nimport type { ExportedCookie } from \"../../types/ExportedCookie\";\nimport { CompositeCookieQueryStrategy } from \"../browsers/CompositeCookieQueryStrategy\";\n\n/**\n * Configuration options for cookie queries\n * @property {CookieQueryStrategy} [strategy] - Strategy to use for querying cookies\n * @property {number} [limit] - Maximum number of cookies to return\n * @property {boolean} [removeExpired] - Whether to filter out expired cookies\n */\ninterface QueryOptions {\n strategy?: CookieQueryStrategy;\n limit?: number;\n removeExpired?: boolean;\n}\n\n/**\n * Converts cookie expiry to consistent format\n * @internal\n * @param cookie - The cookie object to convert expiry for\n * @returns The cookie object with converted expiry\n */\nfunction convertExpiry(cookie: ExportedCookie): ExportedCookie {\n if (cookie.expiry === \"Infinity\") {\n return { ...cookie, expiry: \"Infinity\" };\n }\n if (typeof cookie.expiry === \"number\") {\n return { ...cookie, expiry: new Date(cookie.expiry * 1000) };\n }\n return cookie;\n}\n\n/**\n * Query cookies using multiple cookie specifications\n *\n * Allows querying cookies using either a single specification or multiple specifications\n * in parallel. Handles expiry dates and provides filtering options.\n * @param cookieSpec - The cookie specification(s) to query\n * @param options - Optional configuration for the query operation\n * @returns A promise that resolves to an array of matching cookies\n * @example\n * // Query single cookie spec\n * const cookies = await comboQueryCookieSpec({\n * name: \"session\",\n * domain: \"example.com\"\n * });\n * @example\n * // Query multiple specs with expired cookie removal\n * const cookies = await comboQueryCookieSpec([\n * { name: \"auth\", domain: \"api.example.com\" },\n * { name: \"prefs\", domain: \"example.com\" }\n * ], { removeExpired: true });\n */\nexport async function comboQueryCookieSpec(\n cookieSpec: MultiCookieSpec,\n options: QueryOptions = {},\n): Promise<ExportedCookie[]> {\n const strategy = options.strategy ?? new CompositeCookieQueryStrategy();\n\n const queryFn = async (cs: CookieSpec): Promise<ExportedCookie[]> => {\n const cookies = await strategy.queryCookies(cs.name, cs.domain);\n return cookies.map(convertExpiry);\n };\n\n const results = Array.isArray(cookieSpec)\n ? await Promise.all(cookieSpec.map(queryFn))\n : await queryFn(cookieSpec);\n\n let processed = Array.isArray(results) ? results.flat() : results;\n\n if (options.removeExpired === true) {\n const now = Date.now();\n processed = processed.filter(\n (cookie) =>\n cookie.expiry === \"Infinity\" ||\n (cookie.expiry instanceof Date && cookie.expiry.getTime() > now),\n );\n }\n\n if (typeof options.limit === \"number\" && options.limit > 0) {\n processed = processed.slice(0, options.limit);\n }\n\n return processed;\n}\n","import type { ExportedCookie } from \"../../types/ExportedCookie\";\n\n/**\n * Formats cookie query results into a human-readable string representation.\n * Supports both basic and verbose output formats.\n * @param cookies - Array of cookie objects to format. Each cookie must have at least name and value properties\n * @param verbose - When true, includes additional details like domain, expiry, and metadata\n * @returns A formatted string with one cookie per line\n * @example\n * // Basic usage\n * const cookies = [{ name: 'sessionId', value: '123abc' }];\n * resultsRendered(cookies);\n * // Returns:\n * // Found 1 cookie:\n * // - sessionId=123abc\n * @example\n * // Verbose output with multiple cookies\n * const cookies = [{\n * name: 'sessionId',\n * value: '123abc',\n * domain: 'example.com',\n * expiry: '2024-01-01T00:00:00.000Z'\n * }];\n * resultsRendered(cookies, true);\n * // Returns:\n * // Found 1 cookie:\n * // - sessionId=123abc\n * // Domain: example.com\n * // Expires: 2024-01-01T00:00:00.000Z\n */\nexport function resultsRendered(\n cookies: ExportedCookie[],\n verbose = false,\n): string {\n if (cookies.length === 0) {\n return \"No cookies found.\";\n }\n\n const lines: string[] = [];\n lines.push(\n `Found ${cookies.length} cookie${cookies.length === 1 ? \"\" : \"s\"}:`,\n );\n\n for (const cookie of cookies) {\n lines.push(`- ${cookie.name}=${cookie.value}`);\n if (verbose) {\n lines.push(` Domain: ${cookie.domain}`);\n if (cookie.expiry !== undefined) {\n const expiry =\n typeof cookie.expiry === \"number\" || cookie.expiry === \"Infinity\"\n ? cookie.expiry\n : cookie.expiry.toISOString();\n lines.push(` Expires: ${expiry}`);\n }\n if (cookie.meta) {\n lines.push(` Metadata: ${JSON.stringify(cookie.meta, null, 2)}`);\n }\n }\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * @internal\n */\nexport default resultsRendered;\n","#!/usr/bin/env node\n\n// Local imports - core\nimport { cookieSpecsFromUrl } from \"@core/cookies/cookieSpecsFromUrl\";\nimport { parseArgv } from \"@utils/argv\";\nimport logger from \"@utils/logger\";\n\nimport type { CookieSpec } from \"../types/CookieSpec\";\n\nimport { cliQueryCookies } from \"./cliQueryCookies\";\n\n// Type definitions\ninterface ParsedArgs {\n _: string[];\n help?: boolean;\n h?: boolean;\n verbose?: boolean;\n v?: boolean;\n dump?: boolean;\n d?: boolean;\n \"dump-grouped\"?: boolean;\n D?: boolean;\n render?: boolean;\n r?: boolean;\n url?: string;\n u?: string;\n name?: string;\n domain?: string;\n [key: string]: unknown;\n}\n\nfunction showHelp(): void {\n logger.log(`Usage: ${process.argv[1]} [name] [domain] [options]`);\n logger.log(`Options:`);\n logger.log(` -h, --help: Show this help message`);\n logger.log(` -v, --verbose: Enable verbose output`);\n logger.log(` -d, --dump: Dump all results`);\n logger.log(` -D, --dump-grouped: Dump all results, grouped by profile`);\n logger.log(` -r, --render: Render all results`);\n}\n\nfunction createCookieSpec(parsedArgs: ParsedArgs): CookieSpec {\n const defaultName = parsedArgs._[0] ?? \"%\";\n const defaultDomain = parsedArgs._[1] ?? \"%\";\n\n return {\n name: parsedArgs.name ?? defaultName,\n domain: parsedArgs.domain ?? defaultDomain,\n };\n}\n\nfunction getCookieSpecs(parsedArgs: ParsedArgs): CookieSpec[] {\n const argUrl = parsedArgs.url ?? parsedArgs.u;\n\n if (typeof argUrl === \"string\") {\n return cookieSpecsFromUrl(argUrl);\n }\n\n return [createCookieSpec(parsedArgs)];\n}\n\nasync function handleCookieQuery(parsedArgs: ParsedArgs): Promise<void> {\n const cookieSpecs = getCookieSpecs(parsedArgs);\n\n if (parsedArgs.verbose === true) {\n logger.log(\"cookieSpecs\", cookieSpecs);\n }\n\n try {\n await cliQueryCookies(\n cookieSpecs,\n [\"chrome\", \"firefox\", \"safari\"],\n [\"default\"],\n );\n } catch (error) {\n if (error instanceof Error) {\n logger.error(\"Error querying cookies:\", error.message);\n } else {\n logger.error(\"An unknown error occurred while querying cookies\");\n }\n }\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const { values: parsedArgs } = parseArgv(args) as unknown as {\n values: ParsedArgs;\n };\n\n if (parsedArgs.help === true || parsedArgs.h === true) {\n showHelp();\n return;\n }\n\n parsedArgs.verbose = parsedArgs.verbose ?? parsedArgs.v;\n await handleCookieQuery(parsedArgs);\n}\n\nmain().catch((error) => {\n if (error instanceof Error) {\n logger.error(\"Fatal error:\", error.message);\n } else {\n logger.error(\"An unknown fatal error occurred\");\n }\n process.exit(1);\n});\n"],"mappings":"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","names":["cookieSpecsFromUrl","url","cookieSpecs","domain","parts","i","error","parseArgs","parseArgv","argv","values","positionals","groupBy","join","readFileSync","SAFARI_DATE_OFFSET","readNullTerminatedString","buffer","offset","end","decodeCookieHeader","size","dateOffset","timestamp","currentOffset","domain","nextOffset","name","nextOffset2","path","nextOffset3","value","_","decodePage","pageSize","headerLengthOffset","headerLength","cookies","pageEnd","cookie","error","decodeBinaryCookies","cookieDbPath","readFileSync","numPages","pageSizes","i","pageCookies","SafariCookieQueryStrategy","homeDir","logError","join","cookieDbPath","name","domain","decodeBinaryCookies","cookie","error","CompositeCookieQueryStrategy","ChromeCookieQueryStrategy","FirefoxCookieQueryStrategy","SafariCookieQueryStrategy","name","domain","logger_default","flatMapAsync","Strategy","error","convertExpiry","cookie","comboQueryCookieSpec","cookieSpec","options","_a","strategy","CompositeCookieQueryStrategy","queryFn","cs","results","processed","now","resultsRendered","cookies","verbose","lines","cookie","expiry","handleDumpOutput","results","logger_default","handleGroupedDumpOutput","groupedByFile","groupBy","_a","_b","handleRenderOutput","resultsRendered","handleGroupedRenderOutput","file","fileResults","handleJsonOutput","handleDefaultOutput","result","shouldHandleDump","args","shouldHandleGroupedDump","shouldHandleRender","shouldHandleGroupedRender","handleOutput","cliQueryCookies","cookieSpec","browsers","profiles","limit","removeExpired","comboQueryCookieSpec","parseArgv","error","showHelp","logger_default","createCookieSpec","parsedArgs","_a","_b","_c","_d","defaultName","defaultDomain","getCookieSpecs","argUrl","cookieSpecsFromUrl","handleCookieQuery","cookieSpecs","cliQueryCookies","error","main","args","parseArgv"]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{b as t}from"./chunk-DR2EQC4R.js";import"./chunk-4I5M3M7H.js";import{a as r}from"./chunk-TUGIEFXM.js";import"./chunk-ACXFQWII.js";async function i(o){try{return await new t().queryCookies(o.name,o.domain)}catch(e){return r.warn("Error querying Chrome cookies:",e),[]}}var k=i;export{k as default,i as getChromeCookie};
|
|
2
|
-
//# sourceMappingURL=getChromeCookie-P623SIWB.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{c as i}from"./chunk-TUGIEFXM.js";import"./chunk-ACXFQWII.js";import l from"lodash/memoize";import{exec as m}from"child_process";import{promisify as u}from"util";var f=u(m),o=class extends Error{constructor(n,e,s){super(n);this.command=e;this.originalError=s;this.name="CommandExecutionError"}};function d(t,r){if(t instanceof o)throw i("Command execution failed",t,{command:t.command,originalError:t.originalError}),t;if(t instanceof Error){let e=new o(t.message,r,t);throw i("Failed to execute command",t,{command:r,stack:t.stack}),e}let n=new o("Unknown error occurred during command execution",r);throw i("Failed to execute command",null,{error:t,command:r}),n}async function a(t,r={}){if(!t||typeof t!="string")throw new o("Command must be a non-empty string",t);let n={encoding:"utf8",maxBuffer:5*1024*1024,timeout:3e4};try{let{stdout:e,stderr:s}=await f(t,{...n,...r}),c=e.trim();if(!c)throw s?new o(`Command failed with stderr: ${s}`,t):new o("Command returned empty result",t);return c}catch(e){d(e,t)}}var g=async()=>a('security find-generic-password -w -s "Chrome Safe Storage"'),P=l(g);export{P as getChromePassword};
|
|
2
|
-
//# sourceMappingURL=getChromePassword-74BC3LXO.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/browsers/chrome/macos/getChromePassword.ts","../src/utils/execSimple.ts"],"sourcesContent":["import memoize from \"lodash/memoize\";\n\nimport { execSimple } from \"@utils/execSimple\";\n\n/**\n * Retrieves the Chrome Safe Storage password from the macOS keychain\n * @returns A promise that resolves to the Chrome Safe Storage password\n * @throws {Error} If the password cannot be retrieved from the keychain\n */\nconst getChromeSafeStoragePassword = async (): Promise<string> => {\n const command = 'security find-generic-password -w -s \"Chrome Safe Storage\"';\n return execSimple(command);\n};\n\n/**\n * Memoized version of getChromeSafeStoragePassword that caches the result\n * to avoid repeated keychain queries\n * @returns A promise that resolves to the Chrome Safe Storage password\n * @throws {Error} If the password cannot be retrieved from the keychain\n * @example\n */\nexport const getChromePassword = memoize(getChromeSafeStoragePassword);\n","// External imports\nimport { exec, ExecOptions } from \"child_process\";\nimport { promisify } from \"util\";\n\n// Internal imports\nimport { logError } from \"@utils/logHelpers\";\n\nconst execPromise = promisify(exec);\n\n/**\n * Custom error class for command execution failures.\n * @property {string} command - The command that failed to execute\n * @property {Error} [originalError] - The underlying error that caused the failure\n * @throws CommandExecutionError Always throws with appropriate error context\n * @example\n * ```typescript\n * throw new CommandExecutionError(\n * 'Command timed out',\n * 'git status',\n * originalError\n * );\n * ```\n */\nclass CommandExecutionError extends Error {\n public constructor(\n message: string,\n public readonly command: string,\n public readonly originalError?: Error,\n ) {\n super(message);\n this.name = \"CommandExecutionError\";\n }\n}\n\n/**\n * Handles execution errors and throws appropriate CommandExecutionError.\n * @internal\n * @param error - The error that occurred during command execution\n * @param command - The command that was being executed when the error occurred\n * @throws CommandExecutionError Always throws with appropriate error context\n * @example\n * ```typescript\n * try {\n * await execPromise('invalid-command');\n * } catch (error) {\n * handleExecutionError(error, 'invalid-command');\n * }\n * ```\n */\nfunction handleExecutionError(error: unknown, command: string): never {\n if (error instanceof CommandExecutionError) {\n logError(\"Command execution failed\", error, {\n command: error.command,\n originalError: error.originalError,\n });\n throw error;\n }\n\n if (error instanceof Error) {\n const commandError = new CommandExecutionError(\n error.message,\n command,\n error,\n );\n logError(\"Failed to execute command\", error, {\n command,\n stack: error.stack,\n });\n throw commandError;\n }\n\n // Handle unknown error types\n const commandError = new CommandExecutionError(\n \"Unknown error occurred during command execution\",\n command,\n );\n logError(\"Failed to execute command\", null, {\n error,\n command,\n });\n throw commandError;\n}\n\n/**\n * Executes a shell command asynchronously and returns its output as a string.\n * @param command - The shell command to execute\n * @param options - Optional execution options that override the defaults\n * @returns A promise that resolves to the trimmed command output\n * @throws CommandExecutionError if the command returns an empty result, times out, or fails to execute\n * @example\n * ```typescript\n * // Basic usage\n * const gitStatus = await execSimple('git status');\n *\n * // With custom timeout\n * const output = await execSimple('long-running-command', { timeout: 60000 });\n *\n * // Error handling\n * try {\n * const result = await execSimple('git push');\n * } catch (error) {\n * if (error instanceof CommandExecutionError) {\n * console.error('Push failed:', error.message);\n * }\n * }\n * ```\n */\nexport async function execSimple(\n command: string,\n options: Partial<ExecOptions> = {},\n): Promise<string> {\n if (!command || typeof command !== \"string\") {\n throw new CommandExecutionError(\n \"Command must be a non-empty string\",\n command,\n );\n }\n\n const defaultOptions = {\n encoding: \"utf8\" as BufferEncoding,\n maxBuffer: 5 * 1024 * 1024, // 5MB buffer\n timeout: 30000, // 30 second timeout\n };\n\n try {\n const { stdout, stderr } = await execPromise(command, {\n ...defaultOptions,\n ...options,\n });\n const result = stdout.trim();\n\n if (!result) {\n if (stderr) {\n throw new CommandExecutionError(\n `Command failed with stderr: ${stderr}`,\n command,\n );\n }\n throw new CommandExecutionError(\"Command returned empty result\", command);\n }\n\n return result;\n } catch (error) {\n handleExecutionError(error, command);\n }\n}\n"],"mappings":"oEAAA,OAAOA,MAAa,iBCCpB,OAAS,QAAAC,MAAyB,gBAClC,OAAS,aAAAC,MAAiB,OAK1B,IAAMC,EAAcC,EAAUC,CAAI,EAgB5BC,EAAN,cAAoC,KAAM,CACjC,YACLC,EACgBC,EACAC,EAChB,CACA,MAAMF,CAAO,EAHG,aAAAC,EACA,mBAAAC,EAGhB,KAAK,KAAO,uBACd,CACF,EAiBA,SAASC,EAAqBC,EAAgBH,EAAwB,CACpE,GAAIG,aAAiBL,EACnB,MAAAM,EAAS,2BAA4BD,EAAO,CAC1C,QAASA,EAAM,QACf,cAAeA,EAAM,aACvB,CAAC,EACKA,EAGR,GAAIA,aAAiB,MAAO,CAC1B,IAAME,EAAe,IAAIP,EACvBK,EAAM,QACNH,EACAG,CACF,EACA,MAAAC,EAAS,4BAA6BD,EAAO,CAC3C,QAAAH,EACA,MAAOG,EAAM,KACf,CAAC,EACKE,CACR,CAGA,IAAMA,EAAe,IAAIP,EACvB,kDACAE,CACF,EACA,MAAAI,EAAS,4BAA6B,KAAM,CAC1C,MAAAD,EACA,QAAAH,CACF,CAAC,EACKK,CACR,CA0BA,eAAsBC,EACpBN,EACAO,EAAgC,CAAC,EAChB,CACjB,GAAI,CAACP,GAAW,OAAOA,GAAY,SACjC,MAAM,IAAIF,EACR,qCACAE,CACF,EAGF,IAAMQ,EAAiB,CACrB,SAAU,OACV,UAAW,EAAI,KAAO,KACtB,QAAS,GACX,EAEA,GAAI,CACF,GAAM,CAAE,OAAAC,EAAQ,OAAAC,CAAO,EAAI,MAAMf,EAAYK,EAAS,CACpD,GAAGQ,EACH,GAAGD,CACL,CAAC,EACKI,EAASF,EAAO,KAAK,EAE3B,GAAI,CAACE,EACH,MAAID,EACI,IAAIZ,EACR,+BAA+BY,CAAM,GACrCV,CACF,EAEI,IAAIF,EAAsB,gCAAiCE,CAAO,EAG1E,OAAOW,CACT,OAASR,EAAO,CACdD,EAAqBC,EAAOH,CAAO,CACrC,CACF,CDxIA,IAAMY,EAA+B,SAE5BC,EADS,4DACS,EAUdC,EAAoBC,EAAQH,CAA4B","names":["memoize","exec","promisify","execPromise","promisify","exec","CommandExecutionError","message","command","originalError","handleExecutionError","error","logError","commandError","execSimple","options","defaultOptions","stdout","stderr","result","getChromeSafeStoragePassword","execSimple","getChromePassword","memoize"]}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as t}from"./chunk-BKU5PKJ5.js";import"./chunk-4I5M3M7H.js";import{a as r}from"./chunk-TUGIEFXM.js";import"./chunk-ACXFQWII.js";async function i(e){try{return await new t().queryCookies(e.name,e.domain)}catch(o){return r.warn("Error querying Firefox cookies:",o instanceof Error?o.message:String(o)),[]}}var a=i;export{a as default,i as getFirefoxCookie};
|
|
2
|
-
//# sourceMappingURL=getFirefoxCookie-CGJJJ7VC.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as t}from"./chunk-S5FU4HO5.js";import{a as r}from"./chunk-FZ5IFH4R.js";import"./chunk-DR2EQC4R.js";import"./chunk-BKU5PKJ5.js";import"./chunk-4I5M3M7H.js";import{a as o}from"./chunk-TUGIEFXM.js";import"./chunk-ACXFQWII.js";async function p(i,n={}){try{let e=await r(i);return t(e,{...n,format:"grouped"})}catch(e){return o.warn("Error getting grouped rendered cookies:",e instanceof Error?e.message:String(e)),[]}}var g=p;export{g as default,p as getGroupedRenderedCookies};
|
|
2
|
-
//# sourceMappingURL=getGroupedRenderedCookies-RNB6DKBL.js.map
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as t}from"./chunk-S5FU4HO5.js";import{a as o}from"./chunk-FZ5IFH4R.js";import"./chunk-DR2EQC4R.js";import"./chunk-BKU5PKJ5.js";import"./chunk-4I5M3M7H.js";import{a as r}from"./chunk-TUGIEFXM.js";import"./chunk-ACXFQWII.js";async function m(i,n={}){try{let e=await o(i);return t(e,{...n,format:"merged"})}catch(e){return r.warn("Error getting merged rendered cookies:",e instanceof Error?e.message:String(e)),""}}var d=m;export{d as default,m as getMergedRenderedCookies};
|
|
2
|
-
//# sourceMappingURL=getMergedRenderedCookies-NC3UTOIC.js.map
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
/package/dist/{getMergedRenderedCookies-NC3UTOIC.js.map → getMergedRenderedCookies-C6TXK2I4.js.map}
RENAMED
|
File without changes
|