| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268 |
- // lib/pathMatch.ts
- function pathMatch(reqPath, cookiePath) {
- if (cookiePath === reqPath) {
- return true;
- }
- const idx = reqPath.indexOf(cookiePath);
- if (idx === 0) {
- if (cookiePath[cookiePath.length - 1] === "/") {
- return true;
- }
- if (reqPath.startsWith(cookiePath) && reqPath[cookiePath.length] === "/") {
- return true;
- }
- }
- return false;
- }
- // lib/getPublicSuffix.ts
- import { getDomain } from "tldts";
- var SPECIAL_USE_DOMAINS = ["local", "example", "invalid", "localhost", "test"];
- var SPECIAL_TREATMENT_DOMAINS = ["localhost", "invalid"];
- var defaultGetPublicSuffixOptions = {
- allowSpecialUseDomain: false,
- ignoreError: false
- };
- function getPublicSuffix(domain, options = {}) {
- options = { ...defaultGetPublicSuffixOptions, ...options };
- const domainParts = domain.split(".");
- const topLevelDomain = domainParts[domainParts.length - 1];
- const allowSpecialUseDomain = !!options.allowSpecialUseDomain;
- const ignoreError = !!options.ignoreError;
- if (allowSpecialUseDomain && topLevelDomain !== void 0 && SPECIAL_USE_DOMAINS.includes(topLevelDomain)) {
- if (domainParts.length > 1) {
- const secondLevelDomain = domainParts[domainParts.length - 2];
- return `${secondLevelDomain}.${topLevelDomain}`;
- } else if (SPECIAL_TREATMENT_DOMAINS.includes(topLevelDomain)) {
- return topLevelDomain;
- }
- }
- if (!ignoreError && topLevelDomain !== void 0 && SPECIAL_USE_DOMAINS.includes(topLevelDomain)) {
- throw new Error(
- `Cookie has domain set to the public suffix "${topLevelDomain}" which is a special use domain. To allow this, configure your CookieJar with {allowSpecialUseDomain: true, rejectPublicSuffixes: false}.`
- );
- }
- const publicSuffix = getDomain(domain, {
- allowIcannDomains: true,
- allowPrivateDomains: true
- });
- if (publicSuffix) return publicSuffix;
- }
- // lib/permuteDomain.ts
- function permuteDomain(domain, allowSpecialUseDomain) {
- const pubSuf = getPublicSuffix(domain, {
- allowSpecialUseDomain
- });
- if (!pubSuf) {
- return void 0;
- }
- if (pubSuf == domain) {
- return [domain];
- }
- if (domain.slice(-1) == ".") {
- domain = domain.slice(0, -1);
- }
- const prefix = domain.slice(0, -(pubSuf.length + 1));
- const parts = prefix.split(".").reverse();
- let cur = pubSuf;
- const permutations = [cur];
- while (parts.length) {
- const part = parts.shift();
- cur = `${part}.${cur}`;
- permutations.push(cur);
- }
- return permutations;
- }
- // lib/store.ts
- var Store = class {
- constructor() {
- this.synchronous = false;
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- findCookie(_domain, _path, _key, _callback) {
- throw new Error("findCookie is not implemented");
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- findCookies(_domain, _path, _allowSpecialUseDomain = false, _callback) {
- throw new Error("findCookies is not implemented");
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- putCookie(_cookie, _callback) {
- throw new Error("putCookie is not implemented");
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- updateCookie(_oldCookie, _newCookie, _callback) {
- throw new Error("updateCookie is not implemented");
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- removeCookie(_domain, _path, _key, _callback) {
- throw new Error("removeCookie is not implemented");
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- removeCookies(_domain, _path, _callback) {
- throw new Error("removeCookies is not implemented");
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- removeAllCookies(_callback) {
- throw new Error("removeAllCookies is not implemented");
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- getAllCookies(_callback) {
- throw new Error(
- "getAllCookies is not implemented (therefore jar cannot be serialized)"
- );
- }
- };
- // lib/utils.ts
- var objectToString = (obj) => Object.prototype.toString.call(obj);
- var safeArrayToString = (arr, seenArrays) => {
- if (typeof arr.join !== "function") return objectToString(arr);
- seenArrays.add(arr);
- const mapped = arr.map(
- (val) => val === null || val === void 0 || seenArrays.has(val) ? "" : safeToStringImpl(val, seenArrays)
- );
- return mapped.join();
- };
- var safeToStringImpl = (val, seenArrays = /* @__PURE__ */ new WeakSet()) => {
- if (typeof val !== "object" || val === null) {
- return String(val);
- } else if (typeof val.toString === "function") {
- return Array.isArray(val) ? (
- // Arrays have a weird custom toString that we need to replicate
- safeArrayToString(val, seenArrays)
- ) : (
- // eslint-disable-next-line @typescript-eslint/no-base-to-string
- String(val)
- );
- } else {
- return objectToString(val);
- }
- };
- var safeToString = (val) => safeToStringImpl(val);
- function createPromiseCallback(cb) {
- let callback;
- let resolve;
- let reject;
- const promise = new Promise((_resolve, _reject) => {
- resolve = _resolve;
- reject = _reject;
- });
- if (typeof cb === "function") {
- callback = (err, result) => {
- try {
- if (err) cb(err);
- else cb(null, result);
- } catch (e) {
- reject(e instanceof Error ? e : new Error());
- }
- };
- } else {
- callback = (err, result) => {
- try {
- if (err) reject(err);
- else resolve(result);
- } catch (e) {
- reject(e instanceof Error ? e : new Error());
- }
- };
- }
- return {
- promise,
- callback,
- resolve: (value) => {
- callback(null, value);
- return promise;
- },
- reject: (error) => {
- callback(error);
- return promise;
- }
- };
- }
- function inOperator(k, o) {
- return k in o;
- }
- // lib/memstore.ts
- var MemoryCookieStore = class extends Store {
- /**
- * Create a new {@link MemoryCookieStore}.
- */
- constructor() {
- super();
- this.synchronous = true;
- this.idx = /* @__PURE__ */ Object.create(null);
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- findCookie(domain, path, key, callback) {
- const promiseCallback = createPromiseCallback(callback);
- if (domain == null || path == null || key == null) {
- return promiseCallback.resolve(void 0);
- }
- const result = this.idx[domain]?.[path]?.[key];
- return promiseCallback.resolve(result);
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- findCookies(domain, path, allowSpecialUseDomain = false, callback) {
- if (typeof allowSpecialUseDomain === "function") {
- callback = allowSpecialUseDomain;
- allowSpecialUseDomain = true;
- }
- const results = [];
- const promiseCallback = createPromiseCallback(callback);
- if (!domain) {
- return promiseCallback.resolve([]);
- }
- let pathMatcher;
- if (!path) {
- pathMatcher = function matchAll(domainIndex) {
- for (const curPath in domainIndex) {
- const pathIndex = domainIndex[curPath];
- for (const key in pathIndex) {
- const value = pathIndex[key];
- if (value) {
- results.push(value);
- }
- }
- }
- };
- } else {
- pathMatcher = function matchRFC(domainIndex) {
- for (const cookiePath in domainIndex) {
- if (pathMatch(path, cookiePath)) {
- const pathIndex = domainIndex[cookiePath];
- for (const key in pathIndex) {
- const value = pathIndex[key];
- if (value) {
- results.push(value);
- }
- }
- }
- }
- };
- }
- const domains = permuteDomain(domain, allowSpecialUseDomain) || [domain];
- const idx = this.idx;
- domains.forEach((curDomain) => {
- const domainIndex = idx[curDomain];
- if (!domainIndex) {
- return;
- }
- pathMatcher(domainIndex);
- });
- return promiseCallback.resolve(results);
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- putCookie(cookie, callback) {
- const promiseCallback = createPromiseCallback(callback);
- const { domain, path, key } = cookie;
- if (domain == null || path == null || key == null) {
- return promiseCallback.resolve(void 0);
- }
- const domainEntry = this.idx[domain] ?? /* @__PURE__ */ Object.create(null);
- this.idx[domain] = domainEntry;
- const pathEntry = domainEntry[path] ?? /* @__PURE__ */ Object.create(null);
- domainEntry[path] = pathEntry;
- pathEntry[key] = cookie;
- return promiseCallback.resolve(void 0);
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- updateCookie(_oldCookie, newCookie, callback) {
- if (callback) this.putCookie(newCookie, callback);
- else return this.putCookie(newCookie);
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- removeCookie(domain, path, key, callback) {
- const promiseCallback = createPromiseCallback(callback);
- delete this.idx[domain]?.[path]?.[key];
- return promiseCallback.resolve(void 0);
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- removeCookies(domain, path, callback) {
- const promiseCallback = createPromiseCallback(callback);
- const domainEntry = this.idx[domain];
- if (domainEntry) {
- if (path) {
- delete domainEntry[path];
- } else {
- delete this.idx[domain];
- }
- }
- return promiseCallback.resolve(void 0);
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- removeAllCookies(callback) {
- const promiseCallback = createPromiseCallback(callback);
- this.idx = /* @__PURE__ */ Object.create(null);
- return promiseCallback.resolve(void 0);
- }
- /**
- * @internal No doc because this is an overload that supports the implementation
- */
- getAllCookies(callback) {
- const promiseCallback = createPromiseCallback(callback);
- const cookies = [];
- const idx = this.idx;
- const domains = Object.keys(idx);
- domains.forEach((domain) => {
- const domainEntry = idx[domain] ?? {};
- const paths = Object.keys(domainEntry);
- paths.forEach((path) => {
- const pathEntry = domainEntry[path] ?? {};
- const keys = Object.keys(pathEntry);
- keys.forEach((key) => {
- const keyEntry = pathEntry[key];
- if (keyEntry != null) {
- cookies.push(keyEntry);
- }
- });
- });
- });
- cookies.sort((a, b) => {
- return (a.creationIndex || 0) - (b.creationIndex || 0);
- });
- return promiseCallback.resolve(cookies);
- }
- };
- // lib/validators.ts
- function isNonEmptyString(data) {
- return isString(data) && data !== "";
- }
- function isEmptyString(data) {
- return data === "" || data instanceof String && data.toString() === "";
- }
- function isString(data) {
- return typeof data === "string" || data instanceof String;
- }
- function isObject(data) {
- return objectToString(data) === "[object Object]";
- }
- function validate(bool, cbOrMessage, message) {
- if (bool) return;
- const cb = typeof cbOrMessage === "function" ? cbOrMessage : void 0;
- let options = typeof cbOrMessage === "function" ? message : cbOrMessage;
- if (!isObject(options)) options = "[object Object]";
- const err = new ParameterError(safeToString(options));
- if (cb) cb(err);
- else throw err;
- }
- var ParameterError = class extends Error {
- };
- // lib/version.ts
- var version = "6.0.0";
- // lib/cookie/constants.ts
- var PrefixSecurityEnum = {
- SILENT: "silent",
- STRICT: "strict",
- DISABLED: "unsafe-disabled"
- };
- Object.freeze(PrefixSecurityEnum);
- var IP_V6_REGEX = `
- \\[?(?:
- (?:[a-fA-F\\d]{1,4}:){7}(?:[a-fA-F\\d]{1,4}|:)|
- (?:[a-fA-F\\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|:[a-fA-F\\d]{1,4}|:)|
- (?:[a-fA-F\\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,2}|:)|
- (?:[a-fA-F\\d]{1,4}:){4}(?:(?::[a-fA-F\\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,3}|:)|
- (?:[a-fA-F\\d]{1,4}:){3}(?:(?::[a-fA-F\\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,4}|:)|
- (?:[a-fA-F\\d]{1,4}:){2}(?:(?::[a-fA-F\\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,5}|:)|
- (?:[a-fA-F\\d]{1,4}:){1}(?:(?::[a-fA-F\\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,6}|:)|
- (?::(?:(?::[a-fA-F\\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,7}|:))
- )(?:%[0-9a-zA-Z]{1,})?\\]?
- `.replace(/\s*\/\/.*$/gm, "").replace(/\n/g, "").trim();
- var IP_V6_REGEX_OBJECT = new RegExp(`^${IP_V6_REGEX}$`);
- var IP_V4_REGEX = `(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])`;
- var IP_V4_REGEX_OBJECT = new RegExp(`^${IP_V4_REGEX}$`);
- // lib/cookie/canonicalDomain.ts
- function domainToASCII(domain) {
- return new URL(`http://${domain}`).hostname;
- }
- function canonicalDomain(domainName) {
- if (domainName == null) {
- return void 0;
- }
- let str = domainName.trim().replace(/^\./, "");
- if (IP_V6_REGEX_OBJECT.test(str)) {
- if (!str.startsWith("[")) {
- str = "[" + str;
- }
- if (!str.endsWith("]")) {
- str = str + "]";
- }
- return domainToASCII(str).slice(1, -1);
- }
- if (/[^\u0001-\u007f]/.test(str)) {
- return domainToASCII(str);
- }
- return str.toLowerCase();
- }
- // lib/cookie/formatDate.ts
- function formatDate(date) {
- return date.toUTCString();
- }
- // lib/cookie/parseDate.ts
- var DATE_DELIM = /[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]/;
- var MONTH_TO_NUM = {
- jan: 0,
- feb: 1,
- mar: 2,
- apr: 3,
- may: 4,
- jun: 5,
- jul: 6,
- aug: 7,
- sep: 8,
- oct: 9,
- nov: 10,
- dec: 11
- };
- function parseDigits(token, minDigits, maxDigits, trailingOK) {
- let count = 0;
- while (count < token.length) {
- const c = token.charCodeAt(count);
- if (c <= 47 || c >= 58) {
- break;
- }
- count++;
- }
- if (count < minDigits || count > maxDigits) {
- return;
- }
- if (!trailingOK && count != token.length) {
- return;
- }
- return parseInt(token.slice(0, count), 10);
- }
- function parseTime(token) {
- const parts = token.split(":");
- const result = [0, 0, 0];
- if (parts.length !== 3) {
- return;
- }
- for (let i = 0; i < 3; i++) {
- const trailingOK = i == 2;
- const numPart = parts[i];
- if (numPart === void 0) {
- return;
- }
- const num = parseDigits(numPart, 1, 2, trailingOK);
- if (num === void 0) {
- return;
- }
- result[i] = num;
- }
- return result;
- }
- function parseMonth(token) {
- token = String(token).slice(0, 3).toLowerCase();
- switch (token) {
- case "jan":
- return MONTH_TO_NUM.jan;
- case "feb":
- return MONTH_TO_NUM.feb;
- case "mar":
- return MONTH_TO_NUM.mar;
- case "apr":
- return MONTH_TO_NUM.apr;
- case "may":
- return MONTH_TO_NUM.may;
- case "jun":
- return MONTH_TO_NUM.jun;
- case "jul":
- return MONTH_TO_NUM.jul;
- case "aug":
- return MONTH_TO_NUM.aug;
- case "sep":
- return MONTH_TO_NUM.sep;
- case "oct":
- return MONTH_TO_NUM.oct;
- case "nov":
- return MONTH_TO_NUM.nov;
- case "dec":
- return MONTH_TO_NUM.dec;
- default:
- return;
- }
- }
- function parseDate(cookieDate) {
- if (!cookieDate) {
- return;
- }
- const tokens = cookieDate.split(DATE_DELIM);
- let hour;
- let minute;
- let second;
- let dayOfMonth;
- let month;
- let year;
- for (let i = 0; i < tokens.length; i++) {
- const token = (tokens[i] ?? "").trim();
- if (!token.length) {
- continue;
- }
- if (second === void 0) {
- const result = parseTime(token);
- if (result) {
- hour = result[0];
- minute = result[1];
- second = result[2];
- continue;
- }
- }
- if (dayOfMonth === void 0) {
- const result = parseDigits(token, 1, 2, true);
- if (result !== void 0) {
- dayOfMonth = result;
- continue;
- }
- }
- if (month === void 0) {
- const result = parseMonth(token);
- if (result !== void 0) {
- month = result;
- continue;
- }
- }
- if (year === void 0) {
- const result = parseDigits(token, 2, 4, true);
- if (result !== void 0) {
- year = result;
- if (year >= 70 && year <= 99) {
- year += 1900;
- } else if (year >= 0 && year <= 69) {
- year += 2e3;
- }
- }
- }
- }
- if (dayOfMonth === void 0 || month === void 0 || year === void 0 || hour === void 0 || minute === void 0 || second === void 0 || dayOfMonth < 1 || dayOfMonth > 31 || year < 1601 || hour > 23 || minute > 59 || second > 59) {
- return;
- }
- return new Date(Date.UTC(year, month, dayOfMonth, hour, minute, second));
- }
- // lib/cookie/cookie.ts
- var COOKIE_OCTETS = /^[\x21\x23-\x2B\x2D-\x3A\x3C-\x5B\x5D-\x7E]+$/;
- var PATH_VALUE = /[\x20-\x3A\x3C-\x7E]+/;
- var CONTROL_CHARS = /[\x00-\x1F]/;
- var TERMINATORS = ["\n", "\r", "\0"];
- function trimTerminator(str) {
- if (isEmptyString(str)) return str;
- for (let t = 0; t < TERMINATORS.length; t++) {
- const terminator = TERMINATORS[t];
- const terminatorIdx = terminator ? str.indexOf(terminator) : -1;
- if (terminatorIdx !== -1) {
- str = str.slice(0, terminatorIdx);
- }
- }
- return str;
- }
- function parseCookiePair(cookiePair, looseMode) {
- cookiePair = trimTerminator(cookiePair);
- let firstEq = cookiePair.indexOf("=");
- if (looseMode) {
- if (firstEq === 0) {
- cookiePair = cookiePair.substring(1);
- firstEq = cookiePair.indexOf("=");
- }
- } else {
- if (firstEq <= 0) {
- return void 0;
- }
- }
- let cookieName, cookieValue;
- if (firstEq <= 0) {
- cookieName = "";
- cookieValue = cookiePair.trim();
- } else {
- cookieName = cookiePair.slice(0, firstEq).trim();
- cookieValue = cookiePair.slice(firstEq + 1).trim();
- }
- if (CONTROL_CHARS.test(cookieName) || CONTROL_CHARS.test(cookieValue)) {
- return void 0;
- }
- const c = new Cookie();
- c.key = cookieName;
- c.value = cookieValue;
- return c;
- }
- function parse(str, options) {
- if (isEmptyString(str) || !isString(str)) {
- return void 0;
- }
- str = str.trim();
- const firstSemi = str.indexOf(";");
- const cookiePair = firstSemi === -1 ? str : str.slice(0, firstSemi);
- const c = parseCookiePair(cookiePair, options?.loose ?? false);
- if (!c) {
- return void 0;
- }
- if (firstSemi === -1) {
- return c;
- }
- const unparsed = str.slice(firstSemi + 1).trim();
- if (unparsed.length === 0) {
- return c;
- }
- const cookie_avs = unparsed.split(";");
- while (cookie_avs.length) {
- const av = (cookie_avs.shift() ?? "").trim();
- if (av.length === 0) {
- continue;
- }
- const av_sep = av.indexOf("=");
- let av_key, av_value;
- if (av_sep === -1) {
- av_key = av;
- av_value = null;
- } else {
- av_key = av.slice(0, av_sep);
- av_value = av.slice(av_sep + 1);
- }
- av_key = av_key.trim().toLowerCase();
- if (av_value) {
- av_value = av_value.trim();
- }
- switch (av_key) {
- case "expires":
- if (av_value) {
- const exp = parseDate(av_value);
- if (exp) {
- c.expires = exp;
- }
- }
- break;
- case "max-age":
- if (av_value) {
- if (/^-?[0-9]+$/.test(av_value)) {
- const delta = parseInt(av_value, 10);
- c.setMaxAge(delta);
- }
- }
- break;
- case "domain":
- if (av_value) {
- const domain = av_value.trim().replace(/^\./, "");
- if (domain) {
- c.domain = domain.toLowerCase();
- }
- }
- break;
- case "path":
- c.path = av_value && av_value[0] === "/" ? av_value : null;
- break;
- case "secure":
- c.secure = true;
- break;
- case "httponly":
- c.httpOnly = true;
- break;
- case "samesite":
- switch (av_value ? av_value.toLowerCase() : "") {
- case "strict":
- c.sameSite = "strict";
- break;
- case "lax":
- c.sameSite = "lax";
- break;
- case "none":
- c.sameSite = "none";
- break;
- default:
- c.sameSite = void 0;
- break;
- }
- break;
- default:
- c.extensions = c.extensions || [];
- c.extensions.push(av);
- break;
- }
- }
- return c;
- }
- function fromJSON(str) {
- if (!str || isEmptyString(str)) {
- return void 0;
- }
- let obj;
- if (typeof str === "string") {
- try {
- obj = JSON.parse(str);
- } catch {
- return void 0;
- }
- } else {
- obj = str;
- }
- const c = new Cookie();
- Cookie.serializableProperties.forEach((prop) => {
- if (obj && typeof obj === "object" && inOperator(prop, obj)) {
- const val = obj[prop];
- if (val === void 0) {
- return;
- }
- if (inOperator(prop, cookieDefaults) && val === cookieDefaults[prop]) {
- return;
- }
- switch (prop) {
- case "key":
- case "value":
- case "sameSite":
- if (typeof val === "string") {
- c[prop] = val;
- }
- break;
- case "expires":
- case "creation":
- case "lastAccessed":
- if (typeof val === "number" || typeof val === "string" || val instanceof Date) {
- c[prop] = obj[prop] == "Infinity" ? "Infinity" : new Date(val);
- } else if (val === null) {
- c[prop] = null;
- }
- break;
- case "maxAge":
- if (typeof val === "number" || val === "Infinity" || val === "-Infinity") {
- c[prop] = val;
- }
- break;
- case "domain":
- case "path":
- if (typeof val === "string" || val === null) {
- c[prop] = val;
- }
- break;
- case "secure":
- case "httpOnly":
- if (typeof val === "boolean") {
- c[prop] = val;
- }
- break;
- case "extensions":
- if (Array.isArray(val) && val.every((item) => typeof item === "string")) {
- c[prop] = val;
- }
- break;
- case "hostOnly":
- case "pathIsDefault":
- if (typeof val === "boolean" || val === null) {
- c[prop] = val;
- }
- break;
- }
- }
- });
- return c;
- }
- var cookieDefaults = {
- // the order in which the RFC has them:
- key: "",
- value: "",
- expires: "Infinity",
- maxAge: null,
- domain: null,
- path: null,
- secure: false,
- httpOnly: false,
- extensions: null,
- // set by the CookieJar:
- hostOnly: null,
- pathIsDefault: null,
- creation: null,
- lastAccessed: null,
- sameSite: void 0
- };
- var _Cookie = class _Cookie {
- /**
- * Create a new Cookie instance.
- * @public
- * @param options - The attributes to set on the cookie
- */
- constructor(options = {}) {
- this.key = options.key ?? cookieDefaults.key;
- this.value = options.value ?? cookieDefaults.value;
- this.expires = options.expires ?? cookieDefaults.expires;
- this.maxAge = options.maxAge ?? cookieDefaults.maxAge;
- this.domain = options.domain ?? cookieDefaults.domain;
- this.path = options.path ?? cookieDefaults.path;
- this.secure = options.secure ?? cookieDefaults.secure;
- this.httpOnly = options.httpOnly ?? cookieDefaults.httpOnly;
- this.extensions = options.extensions ?? cookieDefaults.extensions;
- this.creation = options.creation ?? cookieDefaults.creation;
- this.hostOnly = options.hostOnly ?? cookieDefaults.hostOnly;
- this.pathIsDefault = options.pathIsDefault ?? cookieDefaults.pathIsDefault;
- this.lastAccessed = options.lastAccessed ?? cookieDefaults.lastAccessed;
- this.sameSite = options.sameSite ?? cookieDefaults.sameSite;
- this.creation = options.creation ?? /* @__PURE__ */ new Date();
- Object.defineProperty(this, "creationIndex", {
- configurable: false,
- enumerable: false,
- // important for assert.deepEqual checks
- writable: true,
- value: ++_Cookie.cookiesCreated
- });
- this.creationIndex = _Cookie.cookiesCreated;
- }
- [Symbol.for("nodejs.util.inspect.custom")]() {
- const now = Date.now();
- const hostOnly = this.hostOnly != null ? this.hostOnly.toString() : "?";
- const createAge = this.creation && this.creation !== "Infinity" ? `${String(now - this.creation.getTime())}ms` : "?";
- const accessAge = this.lastAccessed && this.lastAccessed !== "Infinity" ? `${String(now - this.lastAccessed.getTime())}ms` : "?";
- return `Cookie="${this.toString()}; hostOnly=${hostOnly}; aAge=${accessAge}; cAge=${createAge}"`;
- }
- /**
- * For convenience in using `JSON.stringify(cookie)`. Returns a plain-old Object that can be JSON-serialized.
- *
- * @remarks
- * - Any `Date` properties (such as {@link Cookie.expires}, {@link Cookie.creation}, and {@link Cookie.lastAccessed}) are exported in ISO format (`Date.toISOString()`).
- *
- * - Custom Cookie properties are discarded. In tough-cookie 1.x, since there was no {@link Cookie.toJSON} method explicitly defined, all enumerable properties were captured.
- * If you want a property to be serialized, add the property name to {@link Cookie.serializableProperties}.
- */
- toJSON() {
- const obj = {};
- for (const prop of _Cookie.serializableProperties) {
- const val = this[prop];
- if (val === cookieDefaults[prop]) {
- continue;
- }
- switch (prop) {
- case "key":
- case "value":
- case "sameSite":
- if (typeof val === "string") {
- obj[prop] = val;
- }
- break;
- case "expires":
- case "creation":
- case "lastAccessed":
- if (typeof val === "number" || typeof val === "string" || val instanceof Date) {
- obj[prop] = val == "Infinity" ? "Infinity" : new Date(val).toISOString();
- } else if (val === null) {
- obj[prop] = null;
- }
- break;
- case "maxAge":
- if (typeof val === "number" || val === "Infinity" || val === "-Infinity") {
- obj[prop] = val;
- }
- break;
- case "domain":
- case "path":
- if (typeof val === "string" || val === null) {
- obj[prop] = val;
- }
- break;
- case "secure":
- case "httpOnly":
- if (typeof val === "boolean") {
- obj[prop] = val;
- }
- break;
- case "extensions":
- if (Array.isArray(val)) {
- obj[prop] = val;
- }
- break;
- case "hostOnly":
- case "pathIsDefault":
- if (typeof val === "boolean" || val === null) {
- obj[prop] = val;
- }
- break;
- }
- }
- return obj;
- }
- /**
- * Does a deep clone of this cookie, implemented exactly as `Cookie.fromJSON(cookie.toJSON())`.
- * @public
- */
- clone() {
- return fromJSON(this.toJSON());
- }
- /**
- * Validates cookie attributes for semantic correctness. Useful for "lint" checking any `Set-Cookie` headers you generate.
- * For now, it returns a boolean, but eventually could return a reason string.
- *
- * @remarks
- * Works for a few things, but is by no means comprehensive.
- *
- * @beta
- */
- validate() {
- if (!this.value || !COOKIE_OCTETS.test(this.value)) {
- return false;
- }
- if (this.expires != "Infinity" && !(this.expires instanceof Date) && !parseDate(this.expires)) {
- return false;
- }
- if (this.maxAge != null && this.maxAge !== "Infinity" && (this.maxAge === "-Infinity" || this.maxAge <= 0)) {
- return false;
- }
- if (this.path != null && !PATH_VALUE.test(this.path)) {
- return false;
- }
- const cdomain = this.cdomain();
- if (cdomain) {
- if (cdomain.match(/\.$/)) {
- return false;
- }
- const suffix = getPublicSuffix(cdomain);
- if (suffix == null) {
- return false;
- }
- }
- return true;
- }
- /**
- * Sets the 'Expires' attribute on a cookie.
- *
- * @remarks
- * When given a `string` value it will be parsed with {@link parseDate}. If the value can't be parsed as a cookie date
- * then the 'Expires' attribute will be set to `"Infinity"`.
- *
- * @param exp - the new value for the 'Expires' attribute of the cookie.
- */
- setExpires(exp) {
- if (exp instanceof Date) {
- this.expires = exp;
- } else {
- this.expires = parseDate(exp) || "Infinity";
- }
- }
- /**
- * Sets the 'Max-Age' attribute (in seconds) on a cookie.
- *
- * @remarks
- * Coerces `-Infinity` to `"-Infinity"` and `Infinity` to `"Infinity"` so it can be serialized to JSON.
- *
- * @param age - the new value for the 'Max-Age' attribute (in seconds).
- */
- setMaxAge(age) {
- if (age === Infinity) {
- this.maxAge = "Infinity";
- } else if (age === -Infinity) {
- this.maxAge = "-Infinity";
- } else {
- this.maxAge = age;
- }
- }
- /**
- * Encodes to a `Cookie` header value (specifically, the {@link Cookie.key} and {@link Cookie.value} properties joined with "=").
- * @public
- */
- cookieString() {
- const val = this.value || "";
- if (this.key) {
- return `${this.key}=${val}`;
- }
- return val;
- }
- /**
- * Encodes to a `Set-Cookie header` value.
- * @public
- */
- toString() {
- let str = this.cookieString();
- if (this.expires != "Infinity") {
- if (this.expires instanceof Date) {
- str += `; Expires=${formatDate(this.expires)}`;
- }
- }
- if (this.maxAge != null && this.maxAge != Infinity) {
- str += `; Max-Age=${String(this.maxAge)}`;
- }
- if (this.domain && !this.hostOnly) {
- str += `; Domain=${this.domain}`;
- }
- if (this.path) {
- str += `; Path=${this.path}`;
- }
- if (this.secure) {
- str += "; Secure";
- }
- if (this.httpOnly) {
- str += "; HttpOnly";
- }
- if (this.sameSite && this.sameSite !== "none") {
- if (this.sameSite.toLowerCase() === _Cookie.sameSiteCanonical.lax.toLowerCase()) {
- str += `; SameSite=${_Cookie.sameSiteCanonical.lax}`;
- } else if (this.sameSite.toLowerCase() === _Cookie.sameSiteCanonical.strict.toLowerCase()) {
- str += `; SameSite=${_Cookie.sameSiteCanonical.strict}`;
- } else {
- str += `; SameSite=${this.sameSite}`;
- }
- }
- if (this.extensions) {
- this.extensions.forEach((ext) => {
- str += `; ${ext}`;
- });
- }
- return str;
- }
- /**
- * Computes the TTL relative to now (milliseconds).
- *
- * @remarks
- * - `Infinity` is returned for cookies without an explicit expiry
- *
- * - `0` is returned if the cookie is expired.
- *
- * - Otherwise a time-to-live in milliseconds is returned.
- *
- * @param now - passing an explicit value is mostly used for testing purposes since this defaults to the `Date.now()`
- * @public
- */
- TTL(now = Date.now()) {
- if (this.maxAge != null && typeof this.maxAge === "number") {
- return this.maxAge <= 0 ? 0 : this.maxAge * 1e3;
- }
- const expires = this.expires;
- if (expires === "Infinity") {
- return Infinity;
- }
- return (expires?.getTime() ?? now) - (now || Date.now());
- }
- /**
- * Computes the absolute unix-epoch milliseconds that this cookie expires.
- *
- * The "Max-Age" attribute takes precedence over "Expires" (as per the RFC). The {@link Cookie.lastAccessed} attribute
- * (or the `now` parameter if given) is used to offset the {@link Cookie.maxAge} attribute.
- *
- * If Expires ({@link Cookie.expires}) is set, that's returned.
- *
- * @param now - can be used to provide a time offset (instead of {@link Cookie.lastAccessed}) to use when calculating the "Max-Age" value
- */
- expiryTime(now) {
- if (this.maxAge != null) {
- const relativeTo = now || this.lastAccessed || /* @__PURE__ */ new Date();
- const maxAge = typeof this.maxAge === "number" ? this.maxAge : -Infinity;
- const age = maxAge <= 0 ? -Infinity : maxAge * 1e3;
- if (relativeTo === "Infinity") {
- return Infinity;
- }
- return relativeTo.getTime() + age;
- }
- if (this.expires == "Infinity") {
- return Infinity;
- }
- return this.expires ? this.expires.getTime() : void 0;
- }
- /**
- * Similar to {@link Cookie.expiryTime}, computes the absolute unix-epoch milliseconds that this cookie expires and returns it as a Date.
- *
- * The "Max-Age" attribute takes precedence over "Expires" (as per the RFC). The {@link Cookie.lastAccessed} attribute
- * (or the `now` parameter if given) is used to offset the {@link Cookie.maxAge} attribute.
- *
- * If Expires ({@link Cookie.expires}) is set, that's returned.
- *
- * @param now - can be used to provide a time offset (instead of {@link Cookie.lastAccessed}) to use when calculating the "Max-Age" value
- */
- expiryDate(now) {
- const millisec = this.expiryTime(now);
- if (millisec == Infinity) {
- return /* @__PURE__ */ new Date(2147483647e3);
- } else if (millisec == -Infinity) {
- return /* @__PURE__ */ new Date(0);
- } else {
- return millisec == void 0 ? void 0 : new Date(millisec);
- }
- }
- /**
- * Indicates if the cookie has been persisted to a store or not.
- * @public
- */
- isPersistent() {
- return this.maxAge != null || this.expires != "Infinity";
- }
- /**
- * Calls {@link canonicalDomain} with the {@link Cookie.domain} property.
- * @public
- */
- canonicalizedDomain() {
- return canonicalDomain(this.domain);
- }
- /**
- * Alias for {@link Cookie.canonicalizedDomain}
- * @public
- */
- cdomain() {
- return canonicalDomain(this.domain);
- }
- /**
- * Parses a string into a Cookie object.
- *
- * @remarks
- * Note: when parsing a `Cookie` header it must be split by ';' before each Cookie string can be parsed.
- *
- * @example
- * ```
- * // parse a `Set-Cookie` header
- * const setCookieHeader = 'a=bcd; Expires=Tue, 18 Oct 2011 07:05:03 GMT'
- * const cookie = Cookie.parse(setCookieHeader)
- * cookie.key === 'a'
- * cookie.value === 'bcd'
- * cookie.expires === new Date(Date.parse('Tue, 18 Oct 2011 07:05:03 GMT'))
- * ```
- *
- * @example
- * ```
- * // parse a `Cookie` header
- * const cookieHeader = 'name=value; name2=value2; name3=value3'
- * const cookies = cookieHeader.split(';').map(Cookie.parse)
- * cookies[0].name === 'name'
- * cookies[0].value === 'value'
- * cookies[1].name === 'name2'
- * cookies[1].value === 'value2'
- * cookies[2].name === 'name3'
- * cookies[2].value === 'value3'
- * ```
- *
- * @param str - The `Set-Cookie` header or a Cookie string to parse.
- * @param options - Configures `strict` or `loose` mode for cookie parsing
- */
- static parse(str, options) {
- return parse(str, options);
- }
- /**
- * Does the reverse of {@link Cookie.toJSON}.
- *
- * @remarks
- * Any Date properties (such as .expires, .creation, and .lastAccessed) are parsed via Date.parse, not tough-cookie's parseDate, since ISO timestamps are being handled at this layer.
- *
- * @example
- * ```
- * const json = JSON.stringify({
- * key: 'alpha',
- * value: 'beta',
- * domain: 'example.com',
- * path: '/foo',
- * expires: '2038-01-19T03:14:07.000Z',
- * })
- * const cookie = Cookie.fromJSON(json)
- * cookie.key === 'alpha'
- * cookie.value === 'beta'
- * cookie.domain === 'example.com'
- * cookie.path === '/foo'
- * cookie.expires === new Date(Date.parse('2038-01-19T03:14:07.000Z'))
- * ```
- *
- * @param str - An unparsed JSON string or a value that has already been parsed as JSON
- */
- static fromJSON(str) {
- return fromJSON(str);
- }
- };
- _Cookie.cookiesCreated = 0;
- /**
- * @internal
- */
- _Cookie.sameSiteLevel = {
- strict: 3,
- lax: 2,
- none: 1
- };
- /**
- * @internal
- */
- _Cookie.sameSiteCanonical = {
- strict: "Strict",
- lax: "Lax"
- };
- /**
- * Cookie properties that will be serialized when using {@link Cookie.fromJSON} and {@link Cookie.toJSON}.
- * @public
- */
- _Cookie.serializableProperties = [
- "key",
- "value",
- "expires",
- "maxAge",
- "domain",
- "path",
- "secure",
- "httpOnly",
- "extensions",
- "hostOnly",
- "pathIsDefault",
- "creation",
- "lastAccessed",
- "sameSite"
- ];
- var Cookie = _Cookie;
- // lib/cookie/cookieCompare.ts
- var MAX_TIME = 2147483647e3;
- function cookieCompare(a, b) {
- let cmp;
- const aPathLen = a.path ? a.path.length : 0;
- const bPathLen = b.path ? b.path.length : 0;
- cmp = bPathLen - aPathLen;
- if (cmp !== 0) {
- return cmp;
- }
- const aTime = a.creation && a.creation instanceof Date ? a.creation.getTime() : MAX_TIME;
- const bTime = b.creation && b.creation instanceof Date ? b.creation.getTime() : MAX_TIME;
- cmp = aTime - bTime;
- if (cmp !== 0) {
- return cmp;
- }
- cmp = (a.creationIndex || 0) - (b.creationIndex || 0);
- return cmp;
- }
- // lib/cookie/defaultPath.ts
- function defaultPath(path) {
- if (!path || path.slice(0, 1) !== "/") {
- return "/";
- }
- if (path === "/") {
- return path;
- }
- const rightSlash = path.lastIndexOf("/");
- if (rightSlash === 0) {
- return "/";
- }
- return path.slice(0, rightSlash);
- }
- // lib/cookie/domainMatch.ts
- var IP_REGEX_LOWERCASE = /(?:^(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}$)|(?:^(?:(?:[a-f\d]{1,4}:){7}(?:[a-f\d]{1,4}|:)|(?:[a-f\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|:[a-f\d]{1,4}|:)|(?:[a-f\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,2}|:)|(?:[a-f\d]{1,4}:){4}(?:(?::[a-f\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,3}|:)|(?:[a-f\d]{1,4}:){3}(?:(?::[a-f\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,4}|:)|(?:[a-f\d]{1,4}:){2}(?:(?::[a-f\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,5}|:)|(?:[a-f\d]{1,4}:){1}(?:(?::[a-f\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,6}|:)|(?::(?:(?::[a-f\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(?:\.(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){3}|(?::[a-f\d]{1,4}){1,7}|:)))$)/;
- function domainMatch(domain, cookieDomain, canonicalize) {
- if (domain == null || cookieDomain == null) {
- return void 0;
- }
- let _str;
- let _domStr;
- if (canonicalize !== false) {
- _str = canonicalDomain(domain);
- _domStr = canonicalDomain(cookieDomain);
- } else {
- _str = domain;
- _domStr = cookieDomain;
- }
- if (_str == null || _domStr == null) {
- return void 0;
- }
- if (_str == _domStr) {
- return true;
- }
- const idx = _str.lastIndexOf(_domStr);
- if (idx <= 0) {
- return false;
- }
- if (_str.length !== _domStr.length + idx) {
- return false;
- }
- if (_str.substring(idx - 1, idx) !== ".") {
- return false;
- }
- return !IP_REGEX_LOWERCASE.test(_str);
- }
- // lib/cookie/secureContext.ts
- function isLoopbackV4(address) {
- const octets = address.split(".");
- return octets.length === 4 && octets[0] !== void 0 && parseInt(octets[0], 10) === 127;
- }
- function isLoopbackV6(address) {
- return address === "::1";
- }
- function isNormalizedLocalhostTLD(lowerHost) {
- return lowerHost.endsWith(".localhost");
- }
- function isLocalHostname(host) {
- const lowerHost = host.toLowerCase();
- return lowerHost === "localhost" || isNormalizedLocalhostTLD(lowerHost);
- }
- function hostNoBrackets(host) {
- if (host.length >= 2 && host.startsWith("[") && host.endsWith("]")) {
- return host.substring(1, host.length - 1);
- }
- return host;
- }
- function isPotentiallyTrustworthy(inputUrl, allowSecureOnLocal = true) {
- let url;
- if (typeof inputUrl === "string") {
- try {
- url = new URL(inputUrl);
- } catch {
- return false;
- }
- } else {
- url = inputUrl;
- }
- const scheme = url.protocol.replace(":", "").toLowerCase();
- const hostname = hostNoBrackets(url.hostname).replace(/\.+$/, "");
- if (scheme === "https" || scheme === "wss") {
- return true;
- }
- if (!allowSecureOnLocal) {
- return false;
- }
- if (IP_V4_REGEX_OBJECT.test(hostname)) {
- return isLoopbackV4(hostname);
- }
- if (IP_V6_REGEX_OBJECT.test(hostname)) {
- return isLoopbackV6(hostname);
- }
- return isLocalHostname(hostname);
- }
- // lib/cookie/cookieJar.ts
- var defaultSetCookieOptions = {
- loose: false,
- sameSiteContext: void 0,
- ignoreError: false,
- http: true
- };
- var defaultGetCookieOptions = {
- http: true,
- expire: true,
- allPaths: false,
- sameSiteContext: void 0,
- sort: void 0
- };
- var SAME_SITE_CONTEXT_VAL_ERR = 'Invalid sameSiteContext option for getCookies(); expected one of "strict", "lax", or "none"';
- function getCookieContext(url) {
- if (url && typeof url === "object" && "hostname" in url && typeof url.hostname === "string" && "pathname" in url && typeof url.pathname === "string" && "protocol" in url && typeof url.protocol === "string") {
- return {
- hostname: url.hostname,
- pathname: url.pathname,
- protocol: url.protocol
- };
- } else if (typeof url === "string") {
- try {
- return new URL(decodeURI(url));
- } catch {
- return new URL(url);
- }
- } else {
- throw new ParameterError("`url` argument is not a string or URL.");
- }
- }
- function checkSameSiteContext(value) {
- const context = String(value).toLowerCase();
- if (context === "none" || context === "lax" || context === "strict") {
- return context;
- } else {
- return void 0;
- }
- }
- function isSecurePrefixConditionMet(cookie) {
- const startsWithSecurePrefix = typeof cookie.key === "string" && cookie.key.startsWith("__Secure-");
- return !startsWithSecurePrefix || cookie.secure;
- }
- function isHostPrefixConditionMet(cookie) {
- const startsWithHostPrefix = typeof cookie.key === "string" && cookie.key.startsWith("__Host-");
- return !startsWithHostPrefix || Boolean(
- cookie.secure && cookie.hostOnly && cookie.path != null && cookie.path === "/"
- );
- }
- function getNormalizedPrefixSecurity(prefixSecurity) {
- const normalizedPrefixSecurity = prefixSecurity.toLowerCase();
- switch (normalizedPrefixSecurity) {
- case PrefixSecurityEnum.STRICT:
- case PrefixSecurityEnum.SILENT:
- case PrefixSecurityEnum.DISABLED:
- return normalizedPrefixSecurity;
- default:
- return PrefixSecurityEnum.SILENT;
- }
- }
- var CookieJar = class _CookieJar {
- /**
- * Creates a new `CookieJar` instance.
- *
- * @remarks
- * - If a custom store is not passed to the constructor, an in-memory store ({@link MemoryCookieStore} will be created and used.
- * - If a boolean value is passed as the `options` parameter, this is equivalent to passing `{ rejectPublicSuffixes: <value> }`
- *
- * @param store - a custom {@link Store} implementation (defaults to {@link MemoryCookieStore})
- * @param options - configures how cookies are processed by the cookie jar
- */
- constructor(store, options) {
- if (typeof options === "boolean") {
- options = { rejectPublicSuffixes: options };
- }
- this.rejectPublicSuffixes = options?.rejectPublicSuffixes ?? true;
- this.enableLooseMode = options?.looseMode ?? false;
- this.allowSpecialUseDomain = options?.allowSpecialUseDomain ?? true;
- this.allowSecureOnLocal = options?.allowSecureOnLocal ?? true;
- this.prefixSecurity = getNormalizedPrefixSecurity(
- options?.prefixSecurity ?? "silent"
- );
- this.store = store ?? new MemoryCookieStore();
- }
- callSync(fn) {
- if (!this.store.synchronous) {
- throw new Error(
- "CookieJar store is not synchronous; use async API instead."
- );
- }
- let syncErr = null;
- let syncResult = void 0;
- try {
- fn.call(this, (error, result) => {
- syncErr = error;
- syncResult = result;
- });
- } catch (err) {
- syncErr = err;
- }
- if (syncErr) throw syncErr;
- return syncResult;
- }
- /**
- * @internal No doc because this is the overload implementation
- */
- setCookie(cookie, url, options, callback) {
- if (typeof options === "function") {
- callback = options;
- options = void 0;
- }
- const promiseCallback = createPromiseCallback(callback);
- const cb = promiseCallback.callback;
- let context;
- try {
- if (typeof url === "string") {
- validate(
- isNonEmptyString(url),
- callback,
- safeToString(options)
- );
- }
- context = getCookieContext(url);
- if (typeof url === "function") {
- return promiseCallback.reject(new Error("No URL was specified"));
- }
- if (typeof options === "function") {
- options = defaultSetCookieOptions;
- }
- validate(typeof cb === "function", cb);
- if (!isNonEmptyString(cookie) && !isObject(cookie) && cookie instanceof String && cookie.length == 0) {
- return promiseCallback.resolve(void 0);
- }
- } catch (err) {
- return promiseCallback.reject(err);
- }
- const host = canonicalDomain(context.hostname) ?? null;
- const loose = options?.loose || this.enableLooseMode;
- let sameSiteContext = null;
- if (options?.sameSiteContext) {
- sameSiteContext = checkSameSiteContext(options.sameSiteContext);
- if (!sameSiteContext) {
- return promiseCallback.reject(new Error(SAME_SITE_CONTEXT_VAL_ERR));
- }
- }
- if (typeof cookie === "string" || cookie instanceof String) {
- const parsedCookie = Cookie.parse(cookie.toString(), { loose });
- if (!parsedCookie) {
- const err = new Error("Cookie failed to parse");
- return options?.ignoreError ? promiseCallback.resolve(void 0) : promiseCallback.reject(err);
- }
- cookie = parsedCookie;
- } else if (!(cookie instanceof Cookie)) {
- const err = new Error(
- "First argument to setCookie must be a Cookie object or string"
- );
- return options?.ignoreError ? promiseCallback.resolve(void 0) : promiseCallback.reject(err);
- }
- const now = options?.now || /* @__PURE__ */ new Date();
- if (this.rejectPublicSuffixes && cookie.domain) {
- try {
- const cdomain = cookie.cdomain();
- const suffix = typeof cdomain === "string" ? getPublicSuffix(cdomain, {
- allowSpecialUseDomain: this.allowSpecialUseDomain,
- ignoreError: options?.ignoreError
- }) : null;
- if (suffix == null && !IP_V6_REGEX_OBJECT.test(cookie.domain)) {
- const err = new Error("Cookie has domain set to a public suffix");
- return options?.ignoreError ? promiseCallback.resolve(void 0) : promiseCallback.reject(err);
- }
- } catch (err) {
- return options?.ignoreError ? promiseCallback.resolve(void 0) : (
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
- promiseCallback.reject(err)
- );
- }
- }
- if (cookie.domain) {
- if (!domainMatch(host ?? void 0, cookie.cdomain() ?? void 0, false)) {
- const err = new Error(
- `Cookie not in this host's domain. Cookie:${cookie.cdomain() ?? "null"} Request:${host ?? "null"}`
- );
- return options?.ignoreError ? promiseCallback.resolve(void 0) : promiseCallback.reject(err);
- }
- if (cookie.hostOnly == null) {
- cookie.hostOnly = false;
- }
- } else {
- cookie.hostOnly = true;
- cookie.domain = host;
- }
- if (!cookie.path || cookie.path[0] !== "/") {
- cookie.path = defaultPath(context.pathname);
- cookie.pathIsDefault = true;
- }
- if (options?.http === false && cookie.httpOnly) {
- const err = new Error("Cookie is HttpOnly and this isn't an HTTP API");
- return options.ignoreError ? promiseCallback.resolve(void 0) : promiseCallback.reject(err);
- }
- if (cookie.sameSite !== "none" && cookie.sameSite !== void 0 && sameSiteContext) {
- if (sameSiteContext === "none") {
- const err = new Error(
- "Cookie is SameSite but this is a cross-origin request"
- );
- return options?.ignoreError ? promiseCallback.resolve(void 0) : promiseCallback.reject(err);
- }
- }
- const ignoreErrorForPrefixSecurity = this.prefixSecurity === PrefixSecurityEnum.SILENT;
- const prefixSecurityDisabled = this.prefixSecurity === PrefixSecurityEnum.DISABLED;
- if (!prefixSecurityDisabled) {
- let errorFound = false;
- let errorMsg;
- if (!isSecurePrefixConditionMet(cookie)) {
- errorFound = true;
- errorMsg = "Cookie has __Secure prefix but Secure attribute is not set";
- } else if (!isHostPrefixConditionMet(cookie)) {
- errorFound = true;
- errorMsg = "Cookie has __Host prefix but either Secure or HostOnly attribute is not set or Path is not '/'";
- }
- if (errorFound) {
- return options?.ignoreError || ignoreErrorForPrefixSecurity ? promiseCallback.resolve(void 0) : promiseCallback.reject(new Error(errorMsg));
- }
- }
- const store = this.store;
- if (!store.updateCookie) {
- store.updateCookie = async function(_oldCookie, newCookie, cb2) {
- return this.putCookie(newCookie).then(
- () => cb2?.(null),
- (error) => cb2?.(error)
- );
- };
- }
- const withCookie = function withCookie2(err, oldCookie) {
- if (err) {
- cb(err);
- return;
- }
- const next = function(err2) {
- if (err2) {
- cb(err2);
- } else if (typeof cookie === "string") {
- cb(null, void 0);
- } else {
- cb(null, cookie);
- }
- };
- if (oldCookie) {
- if (options && "http" in options && options.http === false && oldCookie.httpOnly) {
- err = new Error("old Cookie is HttpOnly and this isn't an HTTP API");
- if (options.ignoreError) cb(null, void 0);
- else cb(err);
- return;
- }
- if (cookie instanceof Cookie) {
- cookie.creation = oldCookie.creation;
- cookie.creationIndex = oldCookie.creationIndex;
- cookie.lastAccessed = now;
- store.updateCookie(oldCookie, cookie, next);
- }
- } else {
- if (cookie instanceof Cookie) {
- cookie.creation = cookie.lastAccessed = now;
- store.putCookie(cookie, next);
- }
- }
- };
- store.findCookie(cookie.domain, cookie.path, cookie.key, withCookie);
- return promiseCallback.promise;
- }
- /**
- * Synchronously attempt to set the {@link Cookie} in the {@link CookieJar}.
- *
- * <strong>Note:</strong> Only works if the configured {@link Store} is also synchronous.
- *
- * @remarks
- * - If successfully persisted, the {@link Cookie} will have updated
- * {@link Cookie.creation}, {@link Cookie.lastAccessed} and {@link Cookie.hostOnly}
- * properties.
- *
- * - As per the RFC, the {@link Cookie.hostOnly} flag is set if there was no `Domain={value}`
- * attribute on the cookie string. The {@link Cookie.domain} property is set to the
- * fully-qualified hostname of `currentUrl` in this case. Matching this cookie requires an
- * exact hostname match (not a {@link domainMatch} as per usual)
- *
- * @param cookie - The cookie object or cookie string to store. A string value will be parsed into a cookie using {@link Cookie.parse}.
- * @param url - The domain to store the cookie with.
- * @param options - Configuration settings to use when storing the cookie.
- * @public
- */
- setCookieSync(cookie, url, options) {
- const setCookieFn = options ? this.setCookie.bind(this, cookie, url, options) : this.setCookie.bind(this, cookie, url);
- return this.callSync(setCookieFn);
- }
- /**
- * @internal No doc because this is the overload implementation
- */
- getCookies(url, options, callback) {
- if (typeof options === "function") {
- callback = options;
- options = defaultGetCookieOptions;
- } else if (options === void 0) {
- options = defaultGetCookieOptions;
- }
- const promiseCallback = createPromiseCallback(callback);
- const cb = promiseCallback.callback;
- let context;
- try {
- if (typeof url === "string") {
- validate(isNonEmptyString(url), cb, url);
- }
- context = getCookieContext(url);
- validate(
- isObject(options),
- cb,
- safeToString(options)
- );
- validate(typeof cb === "function", cb);
- } catch (parameterError) {
- return promiseCallback.reject(parameterError);
- }
- const host = canonicalDomain(context.hostname);
- const path = context.pathname || "/";
- const potentiallyTrustworthy = isPotentiallyTrustworthy(
- url,
- this.allowSecureOnLocal
- );
- let sameSiteLevel = 0;
- if (options.sameSiteContext) {
- const sameSiteContext = checkSameSiteContext(options.sameSiteContext);
- if (sameSiteContext == null) {
- return promiseCallback.reject(new Error(SAME_SITE_CONTEXT_VAL_ERR));
- }
- sameSiteLevel = Cookie.sameSiteLevel[sameSiteContext];
- if (!sameSiteLevel) {
- return promiseCallback.reject(new Error(SAME_SITE_CONTEXT_VAL_ERR));
- }
- }
- const http = options.http ?? true;
- const now = Date.now();
- const expireCheck = options.expire ?? true;
- const allPaths = options.allPaths ?? false;
- const store = this.store;
- function matchingCookie(c) {
- if (c.hostOnly) {
- if (c.domain != host) {
- return false;
- }
- } else {
- if (!domainMatch(host ?? void 0, c.domain ?? void 0, false)) {
- return false;
- }
- }
- if (!allPaths && typeof c.path === "string" && !pathMatch(path, c.path)) {
- return false;
- }
- if (c.secure && !potentiallyTrustworthy) {
- return false;
- }
- if (c.httpOnly && !http) {
- return false;
- }
- if (sameSiteLevel) {
- let cookieLevel;
- if (c.sameSite === "lax") {
- cookieLevel = Cookie.sameSiteLevel.lax;
- } else if (c.sameSite === "strict") {
- cookieLevel = Cookie.sameSiteLevel.strict;
- } else {
- cookieLevel = Cookie.sameSiteLevel.none;
- }
- if (cookieLevel > sameSiteLevel) {
- return false;
- }
- }
- const expiryTime = c.expiryTime();
- if (expireCheck && expiryTime != void 0 && expiryTime <= now) {
- store.removeCookie(c.domain, c.path, c.key, () => {
- });
- return false;
- }
- return true;
- }
- store.findCookies(
- host,
- allPaths ? null : path,
- this.allowSpecialUseDomain,
- (err, cookies) => {
- if (err) {
- cb(err);
- return;
- }
- if (cookies == null) {
- cb(null, []);
- return;
- }
- cookies = cookies.filter(matchingCookie);
- if ("sort" in options && options.sort !== false) {
- cookies = cookies.sort(cookieCompare);
- }
- const now2 = /* @__PURE__ */ new Date();
- for (const cookie of cookies) {
- cookie.lastAccessed = now2;
- }
- cb(null, cookies);
- }
- );
- return promiseCallback.promise;
- }
- /**
- * Synchronously retrieve the list of cookies that can be sent in a Cookie header for the
- * current URL.
- *
- * <strong>Note</strong>: Only works if the configured Store is also synchronous.
- *
- * @remarks
- * - The array of cookies returned will be sorted according to {@link cookieCompare}.
- *
- * - The {@link Cookie.lastAccessed} property will be updated on all returned cookies.
- *
- * @param url - The domain to store the cookie with.
- * @param options - Configuration settings to use when retrieving the cookies.
- */
- getCookiesSync(url, options) {
- return this.callSync(this.getCookies.bind(this, url, options)) ?? [];
- }
- /**
- * @internal No doc because this is the overload implementation
- */
- getCookieString(url, options, callback) {
- if (typeof options === "function") {
- callback = options;
- options = void 0;
- }
- const promiseCallback = createPromiseCallback(callback);
- const next = function(err, cookies) {
- if (err) {
- promiseCallback.callback(err);
- } else {
- promiseCallback.callback(
- null,
- cookies?.sort(cookieCompare).map((c) => c.cookieString()).join("; ")
- );
- }
- };
- this.getCookies(url, options, next);
- return promiseCallback.promise;
- }
- /**
- * Synchronous version of `.getCookieString()`. Accepts the same options as `.getCookies()` but returns a string suitable for a
- * `Cookie` header rather than an Array.
- *
- * <strong>Note</strong>: Only works if the configured Store is also synchronous.
- *
- * @param url - The domain to store the cookie with.
- * @param options - Configuration settings to use when retrieving the cookies.
- */
- getCookieStringSync(url, options) {
- return this.callSync(
- options ? this.getCookieString.bind(this, url, options) : this.getCookieString.bind(this, url)
- ) ?? "";
- }
- /**
- * @internal No doc because this is the overload implementation
- */
- getSetCookieStrings(url, options, callback) {
- if (typeof options === "function") {
- callback = options;
- options = void 0;
- }
- const promiseCallback = createPromiseCallback(
- callback
- );
- const next = function(err, cookies) {
- if (err) {
- promiseCallback.callback(err);
- } else {
- promiseCallback.callback(
- null,
- cookies?.map((c) => {
- return c.toString();
- })
- );
- }
- };
- this.getCookies(url, options, next);
- return promiseCallback.promise;
- }
- /**
- * Synchronous version of `.getSetCookieStrings()`. Returns an array of strings suitable for `Set-Cookie` headers.
- * Accepts the same options as `.getCookies()`.
- *
- * <strong>Note</strong>: Only works if the configured Store is also synchronous.
- *
- * @param url - The domain to store the cookie with.
- * @param options - Configuration settings to use when retrieving the cookies.
- */
- getSetCookieStringsSync(url, options = {}) {
- return this.callSync(this.getSetCookieStrings.bind(this, url, options)) ?? [];
- }
- /**
- * @internal No doc because this is the overload implementation
- */
- serialize(callback) {
- const promiseCallback = createPromiseCallback(callback);
- let type = this.store.constructor.name;
- if (isObject(type)) {
- type = null;
- }
- const serialized = {
- // The version of tough-cookie that serialized this jar. Generally a good
- // practice since future versions can make data import decisions based on
- // known past behavior. When/if this matters, use `semver`.
- version: `tough-cookie@${version}`,
- // add the store type, to make humans happy:
- storeType: type,
- // CookieJar configuration:
- rejectPublicSuffixes: this.rejectPublicSuffixes,
- enableLooseMode: this.enableLooseMode,
- allowSpecialUseDomain: this.allowSpecialUseDomain,
- prefixSecurity: getNormalizedPrefixSecurity(this.prefixSecurity),
- // this gets filled from getAllCookies:
- cookies: []
- };
- if (typeof this.store.getAllCookies !== "function") {
- return promiseCallback.reject(
- new Error(
- "store does not support getAllCookies and cannot be serialized"
- )
- );
- }
- this.store.getAllCookies((err, cookies) => {
- if (err) {
- promiseCallback.callback(err);
- return;
- }
- if (cookies == null) {
- promiseCallback.callback(null, serialized);
- return;
- }
- serialized.cookies = cookies.map((cookie) => {
- const serializedCookie = cookie.toJSON();
- delete serializedCookie.creationIndex;
- return serializedCookie;
- });
- promiseCallback.callback(null, serialized);
- });
- return promiseCallback.promise;
- }
- /**
- * Serialize the CookieJar if the underlying store supports `.getAllCookies`.
- *
- * <strong>Note</strong>: Only works if the configured Store is also synchronous.
- */
- serializeSync() {
- return this.callSync((callback) => {
- this.serialize(callback);
- });
- }
- /**
- * Alias of {@link CookieJar.serializeSync}. Allows the cookie to be serialized
- * with `JSON.stringify(cookieJar)`.
- */
- toJSON() {
- return this.serializeSync();
- }
- /**
- * Use the class method CookieJar.deserialize instead of calling this directly
- * @internal
- */
- _importCookies(serialized, callback) {
- let cookies = void 0;
- if (serialized && typeof serialized === "object" && inOperator("cookies", serialized) && Array.isArray(serialized.cookies)) {
- cookies = serialized.cookies;
- }
- if (!cookies) {
- callback(new Error("serialized jar has no cookies array"), void 0);
- return;
- }
- cookies = cookies.slice();
- const putNext = (err) => {
- if (err) {
- callback(err, void 0);
- return;
- }
- if (Array.isArray(cookies)) {
- if (!cookies.length) {
- callback(err, this);
- return;
- }
- let cookie;
- try {
- cookie = Cookie.fromJSON(cookies.shift());
- } catch (e) {
- callback(e instanceof Error ? e : new Error(), void 0);
- return;
- }
- if (cookie === void 0) {
- putNext(null);
- return;
- }
- this.store.putCookie(cookie, putNext);
- }
- };
- putNext(null);
- }
- /**
- * @internal
- */
- _importCookiesSync(serialized) {
- this.callSync(this._importCookies.bind(this, serialized));
- }
- /**
- * @internal No doc because this is the overload implementation
- */
- clone(newStore, callback) {
- if (typeof newStore === "function") {
- callback = newStore;
- newStore = void 0;
- }
- const promiseCallback = createPromiseCallback(callback);
- const cb = promiseCallback.callback;
- this.serialize((err, serialized) => {
- if (err) {
- return promiseCallback.reject(err);
- }
- return _CookieJar.deserialize(serialized ?? "", newStore, cb);
- });
- return promiseCallback.promise;
- }
- /**
- * @internal
- */
- _cloneSync(newStore) {
- const cloneFn = newStore && typeof newStore !== "function" ? this.clone.bind(this, newStore) : this.clone.bind(this);
- return this.callSync((callback) => {
- cloneFn(callback);
- });
- }
- /**
- * Produces a deep clone of this CookieJar. Modifications to the original do
- * not affect the clone, and vice versa.
- *
- * <strong>Note</strong>: Only works if both the configured Store and destination
- * Store are synchronous.
- *
- * @remarks
- * - When no {@link Store} is provided, a new {@link MemoryCookieStore} will be used.
- *
- * - Transferring between store types is supported so long as the source
- * implements `.getAllCookies()` and the destination implements `.putCookie()`.
- *
- * @param newStore - The target {@link Store} to clone cookies into.
- */
- cloneSync(newStore) {
- if (!newStore) {
- return this._cloneSync();
- }
- if (!newStore.synchronous) {
- throw new Error(
- "CookieJar clone destination store is not synchronous; use async API instead."
- );
- }
- return this._cloneSync(newStore);
- }
- /**
- * @internal No doc because this is the overload implementation
- */
- removeAllCookies(callback) {
- const promiseCallback = createPromiseCallback(callback);
- const cb = promiseCallback.callback;
- const store = this.store;
- if (typeof store.removeAllCookies === "function" && store.removeAllCookies !== Store.prototype.removeAllCookies) {
- store.removeAllCookies(cb);
- return promiseCallback.promise;
- }
- store.getAllCookies((err, cookies) => {
- if (err) {
- cb(err);
- return;
- }
- if (!cookies) {
- cookies = [];
- }
- if (cookies.length === 0) {
- cb(null, void 0);
- return;
- }
- let completedCount = 0;
- const removeErrors = [];
- const removeCookieCb = function removeCookieCb2(removeErr) {
- if (removeErr) {
- removeErrors.push(removeErr);
- }
- completedCount++;
- if (completedCount === cookies.length) {
- if (removeErrors[0]) cb(removeErrors[0]);
- else cb(null, void 0);
- return;
- }
- };
- cookies.forEach((cookie) => {
- store.removeCookie(
- cookie.domain,
- cookie.path,
- cookie.key,
- removeCookieCb
- );
- });
- });
- return promiseCallback.promise;
- }
- /**
- * Removes all cookies from the CookieJar.
- *
- * <strong>Note</strong>: Only works if the configured Store is also synchronous.
- *
- * @remarks
- * - This is a new backwards-compatible feature of tough-cookie version 2.5,
- * so not all Stores will implement it efficiently. For Stores that do not
- * implement `removeAllCookies`, the fallback is to call `removeCookie` after
- * `getAllCookies`.
- *
- * - If `getAllCookies` fails or isn't implemented in the Store, an error is returned.
- *
- * - If one or more of the `removeCookie` calls fail, only the first error is returned.
- */
- removeAllCookiesSync() {
- this.callSync((callback) => {
- this.removeAllCookies(callback);
- });
- }
- /**
- * @internal No doc because this is the overload implementation
- */
- static deserialize(strOrObj, store, callback) {
- if (typeof store === "function") {
- callback = store;
- store = void 0;
- }
- const promiseCallback = createPromiseCallback(callback);
- let serialized;
- if (typeof strOrObj === "string") {
- try {
- serialized = JSON.parse(strOrObj);
- } catch (e) {
- return promiseCallback.reject(e instanceof Error ? e : new Error());
- }
- } else {
- serialized = strOrObj;
- }
- const readSerializedProperty = (property) => {
- return serialized && typeof serialized === "object" && inOperator(property, serialized) ? serialized[property] : void 0;
- };
- const readSerializedBoolean = (property) => {
- const value = readSerializedProperty(property);
- return typeof value === "boolean" ? value : void 0;
- };
- const readSerializedString = (property) => {
- const value = readSerializedProperty(property);
- return typeof value === "string" ? value : void 0;
- };
- const jar = new _CookieJar(store, {
- rejectPublicSuffixes: readSerializedBoolean("rejectPublicSuffixes"),
- looseMode: readSerializedBoolean("enableLooseMode"),
- allowSpecialUseDomain: readSerializedBoolean("allowSpecialUseDomain"),
- prefixSecurity: getNormalizedPrefixSecurity(
- readSerializedString("prefixSecurity") ?? "silent"
- )
- });
- jar._importCookies(serialized, (err) => {
- if (err) {
- promiseCallback.callback(err);
- return;
- }
- promiseCallback.callback(null, jar);
- });
- return promiseCallback.promise;
- }
- /**
- * A new CookieJar is created and the serialized {@link Cookie} values are added to
- * the underlying store. Each {@link Cookie} is added via `store.putCookie(...)` in
- * the order in which they appear in the serialization.
- *
- * <strong>Note</strong>: Only works if the configured Store is also synchronous.
- *
- * @remarks
- * - When no {@link Store} is provided, a new {@link MemoryCookieStore} will be used.
- *
- * - As a convenience, if `strOrObj` is a string, it is passed through `JSON.parse` first.
- *
- * @param strOrObj - A JSON string or object representing the deserialized cookies.
- * @param store - The underlying store to persist the deserialized cookies into.
- */
- static deserializeSync(strOrObj, store) {
- const serialized = typeof strOrObj === "string" ? JSON.parse(strOrObj) : strOrObj;
- const readSerializedProperty = (property) => {
- return serialized && typeof serialized === "object" && inOperator(property, serialized) ? serialized[property] : void 0;
- };
- const readSerializedBoolean = (property) => {
- const value = readSerializedProperty(property);
- return typeof value === "boolean" ? value : void 0;
- };
- const readSerializedString = (property) => {
- const value = readSerializedProperty(property);
- return typeof value === "string" ? value : void 0;
- };
- const jar = new _CookieJar(store, {
- rejectPublicSuffixes: readSerializedBoolean("rejectPublicSuffixes"),
- looseMode: readSerializedBoolean("enableLooseMode"),
- allowSpecialUseDomain: readSerializedBoolean("allowSpecialUseDomain"),
- prefixSecurity: getNormalizedPrefixSecurity(
- readSerializedString("prefixSecurity") ?? "silent"
- )
- });
- if (!jar.store.synchronous) {
- throw new Error(
- "CookieJar store is not synchronous; use async API instead."
- );
- }
- jar._importCookiesSync(serialized);
- return jar;
- }
- /**
- * Alias of {@link CookieJar.deserializeSync}.
- *
- * @remarks
- * - When no {@link Store} is provided, a new {@link MemoryCookieStore} will be used.
- *
- * - As a convenience, if `strOrObj` is a string, it is passed through `JSON.parse` first.
- *
- * @param jsonString - A JSON string or object representing the deserialized cookies.
- * @param store - The underlying store to persist the deserialized cookies into.
- */
- static fromJSON(jsonString, store) {
- return _CookieJar.deserializeSync(jsonString, store);
- }
- };
- // lib/cookie/permutePath.ts
- function permutePath(path) {
- if (path === "/") {
- return ["/"];
- }
- const permutations = [path];
- while (path.length > 1) {
- const lindex = path.lastIndexOf("/");
- if (lindex === 0) {
- break;
- }
- path = path.slice(0, lindex);
- permutations.push(path);
- }
- permutations.push("/");
- return permutations;
- }
- // lib/cookie/index.ts
- function parse2(str, options) {
- return Cookie.parse(str, options);
- }
- function fromJSON2(str) {
- return Cookie.fromJSON(str);
- }
- export {
- Cookie,
- CookieJar,
- MemoryCookieStore,
- ParameterError,
- PrefixSecurityEnum,
- Store,
- canonicalDomain,
- cookieCompare,
- defaultPath,
- domainMatch,
- formatDate,
- fromJSON2 as fromJSON,
- getPublicSuffix,
- parse2 as parse,
- parseDate,
- pathMatch,
- permuteDomain,
- permutePath,
- version
- };
- /*!
- * Copyright (c) 2015-2020, Salesforce.com, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * 3. Neither the name of Salesforce.com nor the names of its contributors may
- * be used to endorse or promote products derived from this software without
- * specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
- * POSSIBILITY OF SUCH DAMAGE.
- */
- //# sourceMappingURL=index.js.map
|