{
  "version": 3,
  "sources": ["../../../../src/packages/npm-resolver/fetch.ts"],
  "sourcesContent": ["import url from 'node:url';\nimport { requestRetryLogger } from '../core-loggers/index.ts';\nimport {\n  FetchError,\n  type FetchErrorRequest,\n  type FetchErrorResponse,\n  PnpmError,\n} from '../error/index.ts';\nimport type {\n  FetchFromRegistry,\n  RetryTimeoutOptions,\n} from '../fetching-types/index.ts';\nimport * as retry from '@zkochan/retry';\nimport type { PackageMeta } from './pickPackage.ts';\n\ninterface RegistryResponse {\n  status: number;\n  statusText: string;\n  json: () => Promise<PackageMeta>;\n}\n\n// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\nconst semverRegex =\n  // eslint-disable-next-line optimize-regex/optimize-regex\n  /(.*)(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n\nexport class RegistryResponseError extends FetchError {\n  readonly pkgName: string;\n\n  constructor(\n    request: FetchErrorRequest,\n    response: FetchErrorResponse,\n    pkgName: string\n  ) {\n    let hint: string | undefined;\n\n    if (response.status === 404) {\n      hint = `${pkgName} is not in the npm registry, or you have no permission to fetch it.`;\n\n      const matched = pkgName.match(semverRegex);\n\n      if (matched != null) {\n        hint += ` Did you mean ${matched[1]}?`;\n      }\n    }\n\n    super(request, response, hint);\n\n    this.pkgName = pkgName;\n  }\n}\n\nexport async function fromRegistry(\n  fetch: FetchFromRegistry,\n  fetchOpts: { retry: RetryTimeoutOptions; timeout: number },\n  pkgName: string,\n  registry: string,\n  authHeaderValue?: string | undefined\n): Promise<PackageMeta> {\n  const uri = toUri(pkgName, registry);\n\n  const op = retry.operation(fetchOpts.retry);\n\n  return new Promise((resolve, reject) => {\n    op.attempt(async (attempt) => {\n      let response: RegistryResponse;\n      try {\n        response = (await fetch(uri, {\n          authHeaderValue,\n          compress: true,\n          retry: fetchOpts.retry,\n          timeout: fetchOpts.timeout,\n        })) as RegistryResponse;\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      } catch (error: any) {\n        reject(\n          new PnpmError(\n            'META_FETCH_FAIL',\n            `GET ${uri}: ${error.message as string}`,\n            { attempts: attempt }\n          )\n        );\n\n        return;\n      }\n\n      if (response.status > 400) {\n        const request = {\n          authHeaderValue,\n          url: uri,\n        };\n\n        reject(new RegistryResponseError(request, response, pkgName));\n\n        return;\n      }\n\n      // Here we only retry broken JSON responses.\n      // Other HTTP issues are retried by the @pnpm/fetch library\n      try {\n        resolve(await response.json());\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      } catch (error: any) {\n        const timeout = op.retry(\n          new PnpmError('BROKEN_METADATA_JSON', error.message)\n        );\n\n        if (timeout === false) {\n          reject(op.mainError());\n          return;\n        }\n\n        requestRetryLogger.debug({\n          attempt,\n          error,\n          maxRetries: fetchOpts.retry.retries ?? 0,\n          method: 'GET',\n          timeout,\n          url: uri,\n        });\n      }\n    });\n  });\n}\n\nfunction toUri(pkgName: string, registry: string): string {\n  let encodedName: string;\n\n  if (pkgName[0] === '@') {\n    encodedName = `@${encodeURIComponent(pkgName.slice(1))}`;\n  } else {\n    encodedName = encodeURIComponent(pkgName);\n  }\n\n  return new url.URL(\n    encodedName,\n    registry.endsWith('/') ? registry : `${registry}/`\n  ).toString();\n}\n"],
  "mappings": "AAAA,OAAO,SAAS;AAChB,SAAS,0BAA0B;AACnC;AAAA,EACE;AAAA,EAGA;AAAA,OACK;AAKP,YAAY,WAAW;AAUvB,MAAM;AAAA;AAAA,EAEJ;AAAA;AAEK,MAAM,8BAA8B,WAAW;AAAA,EAC3C;AAAA,EAET,YACE,SACA,UACA,SACA;AACA,QAAI;AAEJ,QAAI,SAAS,WAAW,KAAK;AAC3B,aAAO,GAAG,OAAO;AAEjB,YAAM,UAAU,QAAQ,MAAM,WAAW;AAEzC,UAAI,WAAW,MAAM;AACnB,gBAAQ,iBAAiB,QAAQ,CAAC,CAAC;AAAA,MACrC;AAAA,IACF;AAEA,UAAM,SAAS,UAAU,IAAI;AAE7B,SAAK,UAAU;AAAA,EACjB;AACF;AAEA,eAAsB,aACpB,OACA,WACA,SACA,UACA,iBACsB;AACtB,QAAM,MAAM,MAAM,SAAS,QAAQ;AAEnC,QAAM,KAAK,MAAM,UAAU,UAAU,KAAK;AAE1C,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,OAAG,QAAQ,OAAO,YAAY;AAC5B,UAAI;AACJ,UAAI;AACF,mBAAY,MAAM,MAAM,KAAK;AAAA,UAC3B;AAAA,UACA,UAAU;AAAA,UACV,OAAO,UAAU;AAAA,UACjB,SAAS,UAAU;AAAA,QACrB,CAAC;AAAA,MAEH,SAAS,OAAY;AACnB;AAAA,UACE,IAAI;AAAA,YACF;AAAA,YACA,OAAO,GAAG,KAAK,MAAM,OAAiB;AAAA,YACtC,EAAE,UAAU,QAAQ;AAAA,UACtB;AAAA,QACF;AAEA;AAAA,MACF;AAEA,UAAI,SAAS,SAAS,KAAK;AACzB,cAAM,UAAU;AAAA,UACd;AAAA,UACA,KAAK;AAAA,QACP;AAEA,eAAO,IAAI,sBAAsB,SAAS,UAAU,OAAO,CAAC;AAE5D;AAAA,MACF;AAIA,UAAI;AACF,gBAAQ,MAAM,SAAS,KAAK,CAAC;AAAA,MAE/B,SAAS,OAAY;AACnB,cAAM,UAAU,GAAG;AAAA,UACjB,IAAI,UAAU,wBAAwB,MAAM,OAAO;AAAA,QACrD;AAEA,YAAI,YAAY,OAAO;AACrB,iBAAO,GAAG,UAAU,CAAC;AACrB;AAAA,QACF;AAEA,2BAAmB,MAAM;AAAA,UACvB;AAAA,UACA;AAAA,UACA,YAAY,UAAU,MAAM,WAAW;AAAA,UACvC,QAAQ;AAAA,UACR;AAAA,UACA,KAAK;AAAA,QACP,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,MAAM,SAAiB,UAA0B;AACxD,MAAI;AAEJ,MAAI,QAAQ,CAAC,MAAM,KAAK;AACtB,kBAAc,IAAI,mBAAmB,QAAQ,MAAM,CAAC,CAAC,CAAC;AAAA,EACxD,OAAO;AACL,kBAAc,mBAAmB,OAAO;AAAA,EAC1C;AAEA,SAAO,IAAI,IAAI;AAAA,IACb;AAAA,IACA,SAAS,SAAS,GAAG,IAAI,WAAW,GAAG,QAAQ;AAAA,EACjD,EAAE,SAAS;AACb;",
  "names": []
}
