renovate 43.25.3 → 43.25.5

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.
@@ -32,24 +32,7 @@ function applyAuthorization(inOptions) {
32
32
  }
33
33
  return options;
34
34
  }
35
- function isAmazon(options) {
36
- return !!options.search?.includes("X-Amz-Algorithm");
37
- }
38
- function isAzureBlob(options) {
39
- return !!(options.hostname?.endsWith(".blob.core.windows.net") && options.href?.includes("/docker/registry"));
40
- }
41
- function removeAuthorization(options) {
42
- if (!options.password && !options.headers?.authorization) return;
43
- if (isAmazon(options) || isAzureBlob(options)) {
44
- // v8 ignore else -- TODO: add test #40625
45
- if (!options.href?.split?.("/")?.[2]?.split(":")?.[1]) delete options.port;
46
- // v8 ignore else -- TODO: add test #40625
47
- if (options?.headers?.authorization) delete options.headers.authorization;
48
- delete options.username;
49
- delete options.password;
50
- }
51
- }
52
35
 
53
36
  //#endregion
54
- export { applyAuthorization, removeAuthorization };
37
+ export { applyAuthorization };
55
38
  //# sourceMappingURL=auth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","names":[],"sources":["../../../lib/util/http/auth.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport type { Options } from 'got';\nimport {\n FORGEJO_API_USING_HOST_TYPES,\n GITEA_API_USING_HOST_TYPES,\n GITHUB_API_USING_HOST_TYPES,\n GITLAB_API_USING_HOST_TYPES,\n} from '../../constants/index.ts';\nimport type { GotOptions } from './types.ts';\n\nexport type AuthGotOptions = Pick<\n GotOptions,\n | 'hostType'\n | 'headers'\n | 'noAuth'\n | 'context'\n | 'token'\n | 'username'\n | 'password'\n>;\n\nexport function applyAuthorization<GotOptions extends AuthGotOptions>(\n inOptions: GotOptions,\n): GotOptions {\n const options: GotOptions = { ...inOptions };\n\n if (isNonEmptyString(options.headers?.authorization) || options.noAuth) {\n return options;\n }\n\n options.headers ??= {};\n if (options.token) {\n const authType = options.context?.authType;\n if (authType) {\n if (authType === 'Token-Only') {\n options.headers.authorization = options.token;\n } else {\n options.headers.authorization = `${authType} ${options.token}`;\n }\n } else if (\n options.hostType &&\n FORGEJO_API_USING_HOST_TYPES.includes(options.hostType)\n ) {\n options.headers.authorization = `Bearer ${options.token}`;\n } else if (\n options.hostType &&\n GITEA_API_USING_HOST_TYPES.includes(options.hostType)\n ) {\n // Gitea v1.8.0 and later support `Bearer` as alternate to `token`\n // https://github.com/go-gitea/gitea/pull/5378\n options.headers.authorization = `Bearer ${options.token}`;\n } else if (\n options.hostType &&\n GITHUB_API_USING_HOST_TYPES.includes(options.hostType)\n ) {\n options.headers.authorization = `token ${options.token}`;\n if (options.token.startsWith('x-access-token:')) {\n const appToken = options.token.replace('x-access-token:', '');\n options.headers.authorization = `token ${appToken}`;\n // v8 ignore else -- TODO: add test #40625\n if (isString(options.headers.accept)) {\n options.headers.accept = options.headers.accept.replace(\n 'application/vnd.github.v3+json',\n 'application/vnd.github.machine-man-preview+json',\n );\n }\n }\n } else if (\n options.hostType &&\n GITLAB_API_USING_HOST_TYPES.includes(options.hostType)\n ) {\n // GitLab versions earlier than 12.2 only support authentication with\n // a personal access token, which is 20 characters long.\n if (options.token.length === 20) {\n options.headers['Private-token'] = options.token;\n } else {\n options.headers.authorization = `Bearer ${options.token}`;\n }\n } else {\n options.headers.authorization = `Bearer ${options.token}`;\n }\n delete options.token;\n } else if (options.password !== undefined) {\n // Otherwise got will add username and password to url and header\n const auth = Buffer.from(\n `${options.username ?? ''}:${options.password}`,\n ).toString('base64');\n options.headers.authorization = `Basic ${auth}`;\n delete options.username;\n delete options.password;\n }\n return options;\n}\n\n// isAmazon return true if request options contains Amazon related headers\nfunction isAmazon(options: Options): boolean {\n return !!options.search?.includes('X-Amz-Algorithm');\n}\n\n// isAzureBlob return true if request options contains Azure container registry related data\nfunction isAzureBlob(options: Options): boolean {\n return !!(\n options.hostname?.endsWith('.blob.core.windows.net') && // lgtm [js/incomplete-url-substring-sanitization]\n options.href?.includes('/docker/registry')\n );\n}\n\n// removeAuthorization from the redirect options\nexport function removeAuthorization(options: Options): void {\n if (!options.password && !options.headers?.authorization) {\n return;\n }\n\n // Check if request has been redirected to Amazon or an Azure blob (ACR)\n if (isAmazon(options) || isAzureBlob(options)) {\n // if there is no port in the redirect URL string, then delete it from the redirect options.\n // This can be evaluated for removal after upgrading to Got v10\n const portInUrl = options.href?.split?.('/')?.[2]?.split(':')?.[1];\n // v8 ignore else -- TODO: add test #40625\n if (!portInUrl) {\n delete options.port; // Redirect will instead use 80 or 443 for HTTP or HTTPS respectively\n }\n\n // registry is hosted on Amazon or Azure blob, redirect url includes\n // authentication which is not required and should be removed\n // v8 ignore else -- TODO: add test #40625\n if (options?.headers?.authorization) {\n delete options.headers.authorization;\n }\n delete options.username;\n delete options.password;\n }\n}\n"],"mappings":";;;;AAqBA,SAAgB,mBACd,WACY;CACZ,MAAM,UAAsB,EAAE,GAAG,WAAW;AAE5C,KAAI,iBAAiB,QAAQ,SAAS,cAAc,IAAI,QAAQ,OAC9D,QAAO;AAGT,SAAQ,YAAY,EAAE;AACtB,KAAI,QAAQ,OAAO;EACjB,MAAM,WAAW,QAAQ,SAAS;AAClC,MAAI,SACF,KAAI,aAAa,aACf,SAAQ,QAAQ,gBAAgB,QAAQ;MAExC,SAAQ,QAAQ,gBAAgB,GAAG,SAAS,GAAG,QAAQ;WAGzD,QAAQ,YACR,6BAA6B,SAAS,QAAQ,SAAS,CAEvD,SAAQ,QAAQ,gBAAgB,UAAU,QAAQ;WAElD,QAAQ,YACR,2BAA2B,SAAS,QAAQ,SAAS,CAIrD,SAAQ,QAAQ,gBAAgB,UAAU,QAAQ;WAElD,QAAQ,YACR,4BAA4B,SAAS,QAAQ,SAAS,EACtD;AACA,WAAQ,QAAQ,gBAAgB,SAAS,QAAQ;AACjD,OAAI,QAAQ,MAAM,WAAW,kBAAkB,EAAE;IAC/C,MAAM,WAAW,QAAQ,MAAM,QAAQ,mBAAmB,GAAG;AAC7D,YAAQ,QAAQ,gBAAgB,SAAS;;AAEzC,QAAI,SAAS,QAAQ,QAAQ,OAAO,CAClC,SAAQ,QAAQ,SAAS,QAAQ,QAAQ,OAAO,QAC9C,kCACA,kDACD;;aAIL,QAAQ,YACR,4BAA4B,SAAS,QAAQ,SAAS,CAItD,KAAI,QAAQ,MAAM,WAAW,GAC3B,SAAQ,QAAQ,mBAAmB,QAAQ;MAE3C,SAAQ,QAAQ,gBAAgB,UAAU,QAAQ;MAGpD,SAAQ,QAAQ,gBAAgB,UAAU,QAAQ;AAEpD,SAAO,QAAQ;YACN,QAAQ,aAAa,QAAW;EAEzC,MAAM,OAAO,OAAO,KAClB,GAAG,QAAQ,YAAY,GAAG,GAAG,QAAQ,WACtC,CAAC,SAAS,SAAS;AACpB,UAAQ,QAAQ,gBAAgB,SAAS;AACzC,SAAO,QAAQ;AACf,SAAO,QAAQ;;AAEjB,QAAO;;AAIT,SAAS,SAAS,SAA2B;AAC3C,QAAO,CAAC,CAAC,QAAQ,QAAQ,SAAS,kBAAkB;;AAItD,SAAS,YAAY,SAA2B;AAC9C,QAAO,CAAC,EACN,QAAQ,UAAU,SAAS,yBAAyB,IACpD,QAAQ,MAAM,SAAS,mBAAmB;;AAK9C,SAAgB,oBAAoB,SAAwB;AAC1D,KAAI,CAAC,QAAQ,YAAY,CAAC,QAAQ,SAAS,cACzC;AAIF,KAAI,SAAS,QAAQ,IAAI,YAAY,QAAQ,EAAE;;AAK7C,MAAI,CAFc,QAAQ,MAAM,QAAQ,IAAI,GAAG,IAAI,MAAM,IAAI,GAAG,GAG9D,QAAO,QAAQ;;AAMjB,MAAI,SAAS,SAAS,cACpB,QAAO,QAAQ,QAAQ;AAEzB,SAAO,QAAQ;AACf,SAAO,QAAQ"}
1
+ {"version":3,"file":"auth.js","names":[],"sources":["../../../lib/util/http/auth.ts"],"sourcesContent":["import { isNonEmptyString, isString } from '@sindresorhus/is';\nimport {\n FORGEJO_API_USING_HOST_TYPES,\n GITEA_API_USING_HOST_TYPES,\n GITHUB_API_USING_HOST_TYPES,\n GITLAB_API_USING_HOST_TYPES,\n} from '../../constants/index.ts';\nimport type { GotOptions } from './types.ts';\n\nexport type AuthGotOptions = Pick<\n GotOptions,\n | 'hostType'\n | 'headers'\n | 'noAuth'\n | 'context'\n | 'token'\n | 'username'\n | 'password'\n>;\n\nexport function applyAuthorization<GotOptions extends AuthGotOptions>(\n inOptions: GotOptions,\n): GotOptions {\n const options: GotOptions = { ...inOptions };\n\n if (isNonEmptyString(options.headers?.authorization) || options.noAuth) {\n return options;\n }\n\n options.headers ??= {};\n if (options.token) {\n const authType = options.context?.authType;\n if (authType) {\n if (authType === 'Token-Only') {\n options.headers.authorization = options.token;\n } else {\n options.headers.authorization = `${authType} ${options.token}`;\n }\n } else if (\n options.hostType &&\n FORGEJO_API_USING_HOST_TYPES.includes(options.hostType)\n ) {\n options.headers.authorization = `Bearer ${options.token}`;\n } else if (\n options.hostType &&\n GITEA_API_USING_HOST_TYPES.includes(options.hostType)\n ) {\n // Gitea v1.8.0 and later support `Bearer` as alternate to `token`\n // https://github.com/go-gitea/gitea/pull/5378\n options.headers.authorization = `Bearer ${options.token}`;\n } else if (\n options.hostType &&\n GITHUB_API_USING_HOST_TYPES.includes(options.hostType)\n ) {\n options.headers.authorization = `token ${options.token}`;\n if (options.token.startsWith('x-access-token:')) {\n const appToken = options.token.replace('x-access-token:', '');\n options.headers.authorization = `token ${appToken}`;\n // v8 ignore else -- TODO: add test #40625\n if (isString(options.headers.accept)) {\n options.headers.accept = options.headers.accept.replace(\n 'application/vnd.github.v3+json',\n 'application/vnd.github.machine-man-preview+json',\n );\n }\n }\n } else if (\n options.hostType &&\n GITLAB_API_USING_HOST_TYPES.includes(options.hostType)\n ) {\n // GitLab versions earlier than 12.2 only support authentication with\n // a personal access token, which is 20 characters long.\n if (options.token.length === 20) {\n options.headers['Private-token'] = options.token;\n } else {\n options.headers.authorization = `Bearer ${options.token}`;\n }\n } else {\n options.headers.authorization = `Bearer ${options.token}`;\n }\n delete options.token;\n } else if (options.password !== undefined) {\n // Otherwise got will add username and password to url and header\n const auth = Buffer.from(\n `${options.username ?? ''}:${options.password}`,\n ).toString('base64');\n options.headers.authorization = `Basic ${auth}`;\n delete options.username;\n delete options.password;\n }\n return options;\n}\n"],"mappings":";;;;AAoBA,SAAgB,mBACd,WACY;CACZ,MAAM,UAAsB,EAAE,GAAG,WAAW;AAE5C,KAAI,iBAAiB,QAAQ,SAAS,cAAc,IAAI,QAAQ,OAC9D,QAAO;AAGT,SAAQ,YAAY,EAAE;AACtB,KAAI,QAAQ,OAAO;EACjB,MAAM,WAAW,QAAQ,SAAS;AAClC,MAAI,SACF,KAAI,aAAa,aACf,SAAQ,QAAQ,gBAAgB,QAAQ;MAExC,SAAQ,QAAQ,gBAAgB,GAAG,SAAS,GAAG,QAAQ;WAGzD,QAAQ,YACR,6BAA6B,SAAS,QAAQ,SAAS,CAEvD,SAAQ,QAAQ,gBAAgB,UAAU,QAAQ;WAElD,QAAQ,YACR,2BAA2B,SAAS,QAAQ,SAAS,CAIrD,SAAQ,QAAQ,gBAAgB,UAAU,QAAQ;WAElD,QAAQ,YACR,4BAA4B,SAAS,QAAQ,SAAS,EACtD;AACA,WAAQ,QAAQ,gBAAgB,SAAS,QAAQ;AACjD,OAAI,QAAQ,MAAM,WAAW,kBAAkB,EAAE;IAC/C,MAAM,WAAW,QAAQ,MAAM,QAAQ,mBAAmB,GAAG;AAC7D,YAAQ,QAAQ,gBAAgB,SAAS;;AAEzC,QAAI,SAAS,QAAQ,QAAQ,OAAO,CAClC,SAAQ,QAAQ,SAAS,QAAQ,QAAQ,OAAO,QAC9C,kCACA,kDACD;;aAIL,QAAQ,YACR,4BAA4B,SAAS,QAAQ,SAAS,CAItD,KAAI,QAAQ,MAAM,WAAW,GAC3B,SAAQ,QAAQ,mBAAmB,QAAQ;MAE3C,SAAQ,QAAQ,gBAAgB,UAAU,QAAQ;MAGpD,SAAQ,QAAQ,gBAAgB,UAAU,QAAQ;AAEpD,SAAO,QAAQ;YACN,QAAQ,aAAa,QAAW;EAEzC,MAAM,OAAO,OAAO,KAClB,GAAG,QAAQ,YAAY,GAAG,GAAG,QAAQ,WACtC,CAAC,SAAS,SAAS;AACpB,UAAQ,QAAQ,gBAAgB,SAAS;AACzC,SAAO,QAAQ;AACf,SAAO,QAAQ;;AAEjB,QAAO"}
@@ -15,6 +15,13 @@ var BitbucketServerHttp = class extends HttpBase {
15
15
  constructor(type = "bitbucket-server", options) {
16
16
  super(type, options);
17
17
  }
18
+ extraOptions() {
19
+ return super.extraOptions().concat([
20
+ "paginate",
21
+ "limit",
22
+ "maxPages"
23
+ ]);
24
+ }
18
25
  async requestJsonUnsafe(method, options) {
19
26
  const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);
20
27
  const opts = {
@@ -1 +1 @@
1
- {"version":3,"file":"bitbucket-server.js","names":[],"sources":["../../../lib/util/http/bitbucket-server.ts"],"sourcesContent":["import { isArray, isNonEmptyObject } from '@sindresorhus/is';\nimport { HttpBase, type InternalJsonUnsafeOptions } from './http.ts';\nimport type { HttpMethod, HttpOptions, HttpResponse } from './types.ts';\n\nconst MAX_LIMIT = 100;\nconst MAX_PAGES = 100;\n\nlet baseUrl: string;\nexport const setBaseUrl = (url: string): void => {\n baseUrl = url;\n};\n\nexport interface BitbucketServerHttpOptions extends HttpOptions {\n paginate?: boolean;\n limit?: number;\n maxPages?: number;\n}\n\ninterface PagedResult<T = unknown> {\n nextPageStart?: number;\n values: T[];\n}\n\nexport class BitbucketServerHttp extends HttpBase<BitbucketServerHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(type = 'bitbucket-server', options?: BitbucketServerHttpOptions) {\n super(type, options);\n }\n\n protected override async requestJsonUnsafe<T>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<BitbucketServerHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);\n const opts = { ...options, url: resolvedUrl };\n opts.httpOptions ??= {};\n opts.httpOptions.headers ??= {};\n opts.httpOptions.headers['X-Atlassian-Token'] = 'no-check';\n\n const paginate = opts.httpOptions.paginate;\n if (paginate) {\n const limit = opts.httpOptions.limit ?? MAX_LIMIT;\n resolvedUrl.searchParams.set('limit', limit.toString());\n }\n\n const result = await super.requestJsonUnsafe<T | PagedResult<T>>(\n method,\n opts,\n );\n\n if (paginate && isPagedResult(result.body)) {\n // v8 ignore else -- TODO: add test #40625\n if (opts.httpOptions) {\n delete opts.httpOptions.cacheProvider;\n opts.httpOptions.memCache = false;\n }\n\n const collectedValues = [...result.body.values];\n let nextPageStart = result.body.nextPageStart;\n\n let maxPages = opts.httpOptions.maxPages ?? MAX_PAGES;\n while (nextPageStart && --maxPages > 0) {\n resolvedUrl.searchParams.set('start', nextPageStart.toString());\n\n const nextResult = await super.requestJsonUnsafe<PagedResult<T>>(\n method,\n opts,\n );\n collectedValues.push(...nextResult.body.values);\n nextPageStart = nextResult.body.nextPageStart;\n }\n\n return { ...result, body: collectedValues as T };\n }\n\n return result as HttpResponse<T>;\n }\n}\n\nfunction isPagedResult(obj: unknown): obj is PagedResult {\n return isNonEmptyObject(obj) && isArray(obj.values);\n}\n"],"mappings":";;;;AAIA,MAAM,YAAY;AAClB,MAAM,YAAY;AAElB,IAAI;AACJ,MAAa,cAAc,QAAsB;AAC/C,WAAU;;AAcZ,IAAa,sBAAb,cAAyC,SAAqC;CAC5E,IAAuB,UAA8B;AACnD,SAAO;;CAGT,YAAY,OAAO,oBAAoB,SAAsC;AAC3E,QAAM,MAAM,QAAQ;;CAGtB,MAAyB,kBACvB,QACA,SAC0B;EAC1B,MAAM,cAAc,KAAK,WAAW,QAAQ,KAAK,QAAQ,YAAY;EACrE,MAAM,OAAO;GAAE,GAAG;GAAS,KAAK;GAAa;AAC7C,OAAK,gBAAgB,EAAE;AACvB,OAAK,YAAY,YAAY,EAAE;AAC/B,OAAK,YAAY,QAAQ,uBAAuB;EAEhD,MAAM,WAAW,KAAK,YAAY;AAClC,MAAI,UAAU;GACZ,MAAM,QAAQ,KAAK,YAAY,SAAS;AACxC,eAAY,aAAa,IAAI,SAAS,MAAM,UAAU,CAAC;;EAGzD,MAAM,SAAS,MAAM,MAAM,kBACzB,QACA,KACD;AAED,MAAI,YAAY,cAAc,OAAO,KAAK,EAAE;;AAE1C,OAAI,KAAK,aAAa;AACpB,WAAO,KAAK,YAAY;AACxB,SAAK,YAAY,WAAW;;GAG9B,MAAM,kBAAkB,CAAC,GAAG,OAAO,KAAK,OAAO;GAC/C,IAAI,gBAAgB,OAAO,KAAK;GAEhC,IAAI,WAAW,KAAK,YAAY,YAAY;AAC5C,UAAO,iBAAiB,EAAE,WAAW,GAAG;AACtC,gBAAY,aAAa,IAAI,SAAS,cAAc,UAAU,CAAC;IAE/D,MAAM,aAAa,MAAM,MAAM,kBAC7B,QACA,KACD;AACD,oBAAgB,KAAK,GAAG,WAAW,KAAK,OAAO;AAC/C,oBAAgB,WAAW,KAAK;;AAGlC,UAAO;IAAE,GAAG;IAAQ,MAAM;IAAsB;;AAGlD,SAAO;;;AAIX,SAAS,cAAc,KAAkC;AACvD,QAAO,iBAAiB,IAAI,IAAI,QAAQ,IAAI,OAAO"}
1
+ {"version":3,"file":"bitbucket-server.js","names":[],"sources":["../../../lib/util/http/bitbucket-server.ts"],"sourcesContent":["import { isArray, isNonEmptyObject } from '@sindresorhus/is';\nimport { HttpBase, type InternalJsonUnsafeOptions } from './http.ts';\nimport type { HttpMethod, HttpOptions, HttpResponse } from './types.ts';\n\nconst MAX_LIMIT = 100;\nconst MAX_PAGES = 100;\n\nlet baseUrl: string;\nexport const setBaseUrl = (url: string): void => {\n baseUrl = url;\n};\n\nexport interface BitbucketServerHttpOptions extends HttpOptions {\n paginate?: boolean;\n limit?: number;\n maxPages?: number;\n}\n\ninterface PagedResult<T = unknown> {\n nextPageStart?: number;\n values: T[];\n}\n\nexport class BitbucketServerHttp extends HttpBase<BitbucketServerHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(type = 'bitbucket-server', options?: BitbucketServerHttpOptions) {\n super(type, options);\n }\n\n protected override extraOptions(): readonly string[] {\n return super\n .extraOptions()\n .concat([\n 'paginate',\n 'limit',\n 'maxPages',\n ] as (keyof BitbucketServerHttpOptions)[]);\n }\n\n protected override async requestJsonUnsafe<T>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<BitbucketServerHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);\n const opts = { ...options, url: resolvedUrl };\n opts.httpOptions ??= {};\n opts.httpOptions.headers ??= {};\n opts.httpOptions.headers['X-Atlassian-Token'] = 'no-check';\n\n const paginate = opts.httpOptions.paginate;\n if (paginate) {\n const limit = opts.httpOptions.limit ?? MAX_LIMIT;\n resolvedUrl.searchParams.set('limit', limit.toString());\n }\n\n const result = await super.requestJsonUnsafe<T | PagedResult<T>>(\n method,\n opts,\n );\n\n if (paginate && isPagedResult(result.body)) {\n // v8 ignore else -- TODO: add test #40625\n if (opts.httpOptions) {\n delete opts.httpOptions.cacheProvider;\n opts.httpOptions.memCache = false;\n }\n\n const collectedValues = [...result.body.values];\n let nextPageStart = result.body.nextPageStart;\n\n let maxPages = opts.httpOptions.maxPages ?? MAX_PAGES;\n while (nextPageStart && --maxPages > 0) {\n resolvedUrl.searchParams.set('start', nextPageStart.toString());\n\n const nextResult = await super.requestJsonUnsafe<PagedResult<T>>(\n method,\n opts,\n );\n collectedValues.push(...nextResult.body.values);\n nextPageStart = nextResult.body.nextPageStart;\n }\n\n return { ...result, body: collectedValues as T };\n }\n\n return result as HttpResponse<T>;\n }\n}\n\nfunction isPagedResult(obj: unknown): obj is PagedResult {\n return isNonEmptyObject(obj) && isArray(obj.values);\n}\n"],"mappings":";;;;AAIA,MAAM,YAAY;AAClB,MAAM,YAAY;AAElB,IAAI;AACJ,MAAa,cAAc,QAAsB;AAC/C,WAAU;;AAcZ,IAAa,sBAAb,cAAyC,SAAqC;CAC5E,IAAuB,UAA8B;AACnD,SAAO;;CAGT,YAAY,OAAO,oBAAoB,SAAsC;AAC3E,QAAM,MAAM,QAAQ;;CAGtB,AAAmB,eAAkC;AACnD,SAAO,MACJ,cAAc,CACd,OAAO;GACN;GACA;GACA;GACD,CAAyC;;CAG9C,MAAyB,kBACvB,QACA,SAC0B;EAC1B,MAAM,cAAc,KAAK,WAAW,QAAQ,KAAK,QAAQ,YAAY;EACrE,MAAM,OAAO;GAAE,GAAG;GAAS,KAAK;GAAa;AAC7C,OAAK,gBAAgB,EAAE;AACvB,OAAK,YAAY,YAAY,EAAE;AAC/B,OAAK,YAAY,QAAQ,uBAAuB;EAEhD,MAAM,WAAW,KAAK,YAAY;AAClC,MAAI,UAAU;GACZ,MAAM,QAAQ,KAAK,YAAY,SAAS;AACxC,eAAY,aAAa,IAAI,SAAS,MAAM,UAAU,CAAC;;EAGzD,MAAM,SAAS,MAAM,MAAM,kBACzB,QACA,KACD;AAED,MAAI,YAAY,cAAc,OAAO,KAAK,EAAE;;AAE1C,OAAI,KAAK,aAAa;AACpB,WAAO,KAAK,YAAY;AACxB,SAAK,YAAY,WAAW;;GAG9B,MAAM,kBAAkB,CAAC,GAAG,OAAO,KAAK,OAAO;GAC/C,IAAI,gBAAgB,OAAO,KAAK;GAEhC,IAAI,WAAW,KAAK,YAAY,YAAY;AAC5C,UAAO,iBAAiB,EAAE,WAAW,GAAG;AACtC,gBAAY,aAAa,IAAI,SAAS,cAAc,UAAU,CAAC;IAE/D,MAAM,aAAa,MAAM,MAAM,kBAC7B,QACA,KACD;AACD,oBAAgB,KAAK,GAAG,WAAW,KAAK,OAAO;AAC/C,oBAAgB,WAAW,KAAK;;AAGlC,UAAO;IAAE,GAAG;IAAQ,MAAM;IAAsB;;AAGlD,SAAO;;;AAIX,SAAS,cAAc,KAAkC;AACvD,QAAO,iBAAiB,IAAI,IAAI,QAAQ,IAAI,OAAO"}
@@ -15,6 +15,9 @@ var BitbucketHttp = class extends HttpBase {
15
15
  constructor(type = "bitbucket", options) {
16
16
  super(type, options);
17
17
  }
18
+ extraOptions() {
19
+ return super.extraOptions().concat(["paginate", "pagelen"]);
20
+ }
18
21
  async requestJsonUnsafe(method, options) {
19
22
  const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);
20
23
  const opts = {
@@ -1 +1 @@
1
- {"version":3,"file":"bitbucket.js","names":[],"sources":["../../../lib/util/http/bitbucket.ts"],"sourcesContent":["import { isNonEmptyObject, isNullOrUndefined } from '@sindresorhus/is';\nimport type { PagedResult } from '../../modules/platform/bitbucket/types.ts';\nimport { HttpBase, type InternalJsonUnsafeOptions } from './http.ts';\nimport type { HttpMethod, HttpOptions, HttpResponse } from './types.ts';\n\nconst MAX_PAGES = 100;\nconst MAX_PAGELEN = 100;\n\nlet baseUrl = 'https://api.bitbucket.org/';\n\nexport function setBaseUrl(url: string): void {\n baseUrl = url;\n}\n\nexport interface BitbucketHttpOptions extends HttpOptions {\n paginate?: boolean;\n pagelen?: number;\n}\n\nexport class BitbucketHttp extends HttpBase<BitbucketHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(type = 'bitbucket', options?: BitbucketHttpOptions) {\n super(type, options);\n }\n\n protected override async requestJsonUnsafe<T>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<BitbucketHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);\n const opts: InternalJsonUnsafeOptions<BitbucketHttpOptions> = {\n ...options,\n url: resolvedUrl,\n };\n const paginate = opts.httpOptions?.paginate;\n\n if (paginate && !hasPagelen(resolvedUrl)) {\n const pagelen = opts.httpOptions!.pagelen ?? MAX_PAGELEN;\n resolvedUrl.searchParams.set('pagelen', pagelen.toString());\n }\n\n const result = await super.requestJsonUnsafe<T | PagedResult<T>>(\n method,\n opts,\n );\n\n if (paginate && isPagedResult(result.body)) {\n // v8 ignore else -- TODO: add test #40625\n if (opts.httpOptions) {\n opts.httpOptions.memCache = false;\n }\n const resultBody = result.body;\n let nextURL = result.body.next;\n let page = 1;\n\n for (; nextURL && page <= MAX_PAGES; page++) {\n opts.url = nextURL;\n const nextResult = await super.requestJsonUnsafe<PagedResult<T>>(\n method,\n opts,\n );\n\n resultBody.values.push(...nextResult.body.values);\n nextURL = nextResult.body.next;\n }\n\n // Override other page-related attributes\n resultBody.pagelen = resultBody.values.length;\n /* v8 ignore next -- hard to test all branches */\n resultBody.size =\n page <= MAX_PAGES ? resultBody.values.length : undefined;\n // v8 ignore next -- hard to test all branches\n resultBody.next = page <= MAX_PAGES ? nextURL : undefined;\n }\n\n return result as HttpResponse<T>;\n }\n}\n\nfunction hasPagelen(url: URL): boolean {\n return !isNullOrUndefined(url.searchParams.get('pagelen'));\n}\n\nfunction isPagedResult<T>(obj: any): obj is PagedResult<T> {\n return isNonEmptyObject(obj) && Array.isArray(obj.values);\n}\n"],"mappings":";;;;AAKA,MAAM,YAAY;AAClB,MAAM,cAAc;AAEpB,IAAI,UAAU;AAEd,SAAgB,WAAW,KAAmB;AAC5C,WAAU;;AAQZ,IAAa,gBAAb,cAAmC,SAA+B;CAChE,IAAuB,UAA8B;AACnD,SAAO;;CAGT,YAAY,OAAO,aAAa,SAAgC;AAC9D,QAAM,MAAM,QAAQ;;CAGtB,MAAyB,kBACvB,QACA,SAC0B;EAC1B,MAAM,cAAc,KAAK,WAAW,QAAQ,KAAK,QAAQ,YAAY;EACrE,MAAM,OAAwD;GAC5D,GAAG;GACH,KAAK;GACN;EACD,MAAM,WAAW,KAAK,aAAa;AAEnC,MAAI,YAAY,CAAC,WAAW,YAAY,EAAE;GACxC,MAAM,UAAU,KAAK,YAAa,WAAW;AAC7C,eAAY,aAAa,IAAI,WAAW,QAAQ,UAAU,CAAC;;EAG7D,MAAM,SAAS,MAAM,MAAM,kBACzB,QACA,KACD;AAED,MAAI,YAAY,cAAc,OAAO,KAAK,EAAE;;AAE1C,OAAI,KAAK,YACP,MAAK,YAAY,WAAW;GAE9B,MAAM,aAAa,OAAO;GAC1B,IAAI,UAAU,OAAO,KAAK;GAC1B,IAAI,OAAO;AAEX,UAAO,WAAW,QAAQ,WAAW,QAAQ;AAC3C,SAAK,MAAM;IACX,MAAM,aAAa,MAAM,MAAM,kBAC7B,QACA,KACD;AAED,eAAW,OAAO,KAAK,GAAG,WAAW,KAAK,OAAO;AACjD,cAAU,WAAW,KAAK;;AAI5B,cAAW,UAAU,WAAW,OAAO;;AAEvC,cAAW,OACT,QAAQ,YAAY,WAAW,OAAO,SAAS;;AAEjD,cAAW,OAAO,QAAQ,YAAY,UAAU;;AAGlD,SAAO;;;AAIX,SAAS,WAAW,KAAmB;AACrC,QAAO,CAAC,kBAAkB,IAAI,aAAa,IAAI,UAAU,CAAC;;AAG5D,SAAS,cAAiB,KAAiC;AACzD,QAAO,iBAAiB,IAAI,IAAI,MAAM,QAAQ,IAAI,OAAO"}
1
+ {"version":3,"file":"bitbucket.js","names":[],"sources":["../../../lib/util/http/bitbucket.ts"],"sourcesContent":["import { isNonEmptyObject, isNullOrUndefined } from '@sindresorhus/is';\nimport type { PagedResult } from '../../modules/platform/bitbucket/types.ts';\nimport { HttpBase, type InternalJsonUnsafeOptions } from './http.ts';\nimport type { HttpMethod, HttpOptions, HttpResponse } from './types.ts';\n\nconst MAX_PAGES = 100;\nconst MAX_PAGELEN = 100;\n\nlet baseUrl = 'https://api.bitbucket.org/';\n\nexport function setBaseUrl(url: string): void {\n baseUrl = url;\n}\n\nexport interface BitbucketHttpOptions extends HttpOptions {\n paginate?: boolean;\n pagelen?: number;\n}\n\nexport class BitbucketHttp extends HttpBase<BitbucketHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(type = 'bitbucket', options?: BitbucketHttpOptions) {\n super(type, options);\n }\n\n protected override extraOptions(): readonly string[] {\n return super\n .extraOptions()\n .concat(['paginate', 'pagelen'] as (keyof BitbucketHttpOptions)[]);\n }\n\n protected override async requestJsonUnsafe<T>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<BitbucketHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);\n const opts: InternalJsonUnsafeOptions<BitbucketHttpOptions> = {\n ...options,\n url: resolvedUrl,\n };\n const paginate = opts.httpOptions?.paginate;\n\n if (paginate && !hasPagelen(resolvedUrl)) {\n const pagelen = opts.httpOptions!.pagelen ?? MAX_PAGELEN;\n resolvedUrl.searchParams.set('pagelen', pagelen.toString());\n }\n\n const result = await super.requestJsonUnsafe<T | PagedResult<T>>(\n method,\n opts,\n );\n\n if (paginate && isPagedResult(result.body)) {\n // v8 ignore else -- TODO: add test #40625\n if (opts.httpOptions) {\n opts.httpOptions.memCache = false;\n }\n const resultBody = result.body;\n let nextURL = result.body.next;\n let page = 1;\n\n for (; nextURL && page <= MAX_PAGES; page++) {\n opts.url = nextURL;\n const nextResult = await super.requestJsonUnsafe<PagedResult<T>>(\n method,\n opts,\n );\n\n resultBody.values.push(...nextResult.body.values);\n nextURL = nextResult.body.next;\n }\n\n // Override other page-related attributes\n resultBody.pagelen = resultBody.values.length;\n /* v8 ignore next -- hard to test all branches */\n resultBody.size =\n page <= MAX_PAGES ? resultBody.values.length : undefined;\n // v8 ignore next -- hard to test all branches\n resultBody.next = page <= MAX_PAGES ? nextURL : undefined;\n }\n\n return result as HttpResponse<T>;\n }\n}\n\nfunction hasPagelen(url: URL): boolean {\n return !isNullOrUndefined(url.searchParams.get('pagelen'));\n}\n\nfunction isPagedResult<T>(obj: any): obj is PagedResult<T> {\n return isNonEmptyObject(obj) && Array.isArray(obj.values);\n}\n"],"mappings":";;;;AAKA,MAAM,YAAY;AAClB,MAAM,cAAc;AAEpB,IAAI,UAAU;AAEd,SAAgB,WAAW,KAAmB;AAC5C,WAAU;;AAQZ,IAAa,gBAAb,cAAmC,SAA+B;CAChE,IAAuB,UAA8B;AACnD,SAAO;;CAGT,YAAY,OAAO,aAAa,SAAgC;AAC9D,QAAM,MAAM,QAAQ;;CAGtB,AAAmB,eAAkC;AACnD,SAAO,MACJ,cAAc,CACd,OAAO,CAAC,YAAY,UAAU,CAAmC;;CAGtE,MAAyB,kBACvB,QACA,SAC0B;EAC1B,MAAM,cAAc,KAAK,WAAW,QAAQ,KAAK,QAAQ,YAAY;EACrE,MAAM,OAAwD;GAC5D,GAAG;GACH,KAAK;GACN;EACD,MAAM,WAAW,KAAK,aAAa;AAEnC,MAAI,YAAY,CAAC,WAAW,YAAY,EAAE;GACxC,MAAM,UAAU,KAAK,YAAa,WAAW;AAC7C,eAAY,aAAa,IAAI,WAAW,QAAQ,UAAU,CAAC;;EAG7D,MAAM,SAAS,MAAM,MAAM,kBACzB,QACA,KACD;AAED,MAAI,YAAY,cAAc,OAAO,KAAK,EAAE;;AAE1C,OAAI,KAAK,YACP,MAAK,YAAY,WAAW;GAE9B,MAAM,aAAa,OAAO;GAC1B,IAAI,UAAU,OAAO,KAAK;GAC1B,IAAI,OAAO;AAEX,UAAO,WAAW,QAAQ,WAAW,QAAQ;AAC3C,SAAK,MAAM;IACX,MAAM,aAAa,MAAM,MAAM,kBAC7B,QACA,KACD;AAED,eAAW,OAAO,KAAK,GAAG,WAAW,KAAK,OAAO;AACjD,cAAU,WAAW,KAAK;;AAI5B,cAAW,UAAU,WAAW,OAAO;;AAEvC,cAAW,OACT,QAAQ,YAAY,WAAW,OAAO,SAAS;;AAEjD,cAAW,OAAO,QAAQ,YAAY,UAAU;;AAGlD,SAAO;;;AAIX,SAAS,WAAW,KAAmB;AACrC,QAAO,CAAC,kBAAkB,IAAI,aAAa,IAAI,UAAU,CAAC;;AAG5D,SAAS,cAAiB,KAAiC;AACzD,QAAO,iBAAiB,IAAI,IAAI,MAAM,QAAQ,IAAI,OAAO"}
@@ -18,6 +18,9 @@ var ForgejoHttp = class extends HttpBase {
18
18
  constructor(hostType, options) {
19
19
  super(hostType ?? "forgejo", options);
20
20
  }
21
+ extraOptions() {
22
+ return super.extraOptions().concat(["paginate"]);
23
+ }
21
24
  async requestJsonUnsafe(method, options) {
22
25
  const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);
23
26
  const opts = {
@@ -1 +1 @@
1
- {"version":3,"file":"forgejo.js","names":[],"sources":["../../../lib/util/http/forgejo.ts"],"sourcesContent":["import { isArray, isPlainObject } from '@sindresorhus/is';\nimport { HttpBase, type InternalJsonUnsafeOptions } from './http.ts';\nimport type { HttpMethod, HttpOptions, HttpResponse } from './types.ts';\n\nlet baseUrl: string;\nexport const setBaseUrl = (newBaseUrl: string): void => {\n baseUrl = newBaseUrl.replace(/\\/*$/, '/'); // TODO #12875\n};\n\nexport interface ForgejoHttpOptions extends HttpOptions {\n paginate?: boolean;\n}\n\nfunction getPaginationContainer<T = unknown>(body: unknown): T[] | null {\n if (isArray(body) && body.length) {\n return body as T[];\n }\n\n if (isPlainObject(body) && isArray(body?.data) && body.data.length) {\n return body.data as T[];\n }\n\n return null;\n}\n\nexport class ForgejoHttp extends HttpBase<ForgejoHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(hostType?: string, options?: HttpOptions) {\n super(hostType ?? 'forgejo', options);\n }\n\n protected override async requestJsonUnsafe<T = unknown>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<ForgejoHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);\n const opts = {\n ...options,\n url: resolvedUrl,\n };\n const res = await super.requestJsonUnsafe<T>(method, opts);\n const pc = getPaginationContainer<T>(res.body);\n if (opts.httpOptions?.paginate && pc) {\n delete opts.httpOptions.cacheProvider;\n opts.httpOptions.memCache = false;\n\n delete opts.httpOptions.paginate;\n const total = parseInt(res.headers['x-total-count'] as string);\n let nextPage = parseInt(resolvedUrl.searchParams.get('page') ?? '1');\n\n while (total && pc.length < total) {\n nextPage += 1;\n resolvedUrl.searchParams.set('page', nextPage.toString());\n\n const nextRes = await super.requestJsonUnsafe<T>(method, opts);\n const nextPc = getPaginationContainer<T>(nextRes.body);\n if (nextPc === null) {\n break;\n }\n\n pc.push(...nextPc);\n }\n }\n\n return res;\n }\n}\n"],"mappings":";;;;AAIA,IAAI;AACJ,MAAa,cAAc,eAA6B;AACtD,WAAU,WAAW,QAAQ,QAAQ,IAAI;;AAO3C,SAAS,uBAAoC,MAA2B;AACtE,KAAI,QAAQ,KAAK,IAAI,KAAK,OACxB,QAAO;AAGT,KAAI,cAAc,KAAK,IAAI,QAAQ,MAAM,KAAK,IAAI,KAAK,KAAK,OAC1D,QAAO,KAAK;AAGd,QAAO;;AAGT,IAAa,cAAb,cAAiC,SAA6B;CAC5D,IAAuB,UAA8B;AACnD,SAAO;;CAGT,YAAY,UAAmB,SAAuB;AACpD,QAAM,YAAY,WAAW,QAAQ;;CAGvC,MAAyB,kBACvB,QACA,SAC0B;EAC1B,MAAM,cAAc,KAAK,WAAW,QAAQ,KAAK,QAAQ,YAAY;EACrE,MAAM,OAAO;GACX,GAAG;GACH,KAAK;GACN;EACD,MAAM,MAAM,MAAM,MAAM,kBAAqB,QAAQ,KAAK;EAC1D,MAAM,KAAK,uBAA0B,IAAI,KAAK;AAC9C,MAAI,KAAK,aAAa,YAAY,IAAI;AACpC,UAAO,KAAK,YAAY;AACxB,QAAK,YAAY,WAAW;AAE5B,UAAO,KAAK,YAAY;GACxB,MAAM,QAAQ,SAAS,IAAI,QAAQ,iBAA2B;GAC9D,IAAI,WAAW,SAAS,YAAY,aAAa,IAAI,OAAO,IAAI,IAAI;AAEpE,UAAO,SAAS,GAAG,SAAS,OAAO;AACjC,gBAAY;AACZ,gBAAY,aAAa,IAAI,QAAQ,SAAS,UAAU,CAAC;IAGzD,MAAM,SAAS,wBADC,MAAM,MAAM,kBAAqB,QAAQ,KAAK,EACb,KAAK;AACtD,QAAI,WAAW,KACb;AAGF,OAAG,KAAK,GAAG,OAAO;;;AAItB,SAAO"}
1
+ {"version":3,"file":"forgejo.js","names":[],"sources":["../../../lib/util/http/forgejo.ts"],"sourcesContent":["import { isArray, isPlainObject } from '@sindresorhus/is';\nimport { HttpBase, type InternalJsonUnsafeOptions } from './http.ts';\nimport type { HttpMethod, HttpOptions, HttpResponse } from './types.ts';\n\nlet baseUrl: string;\nexport const setBaseUrl = (newBaseUrl: string): void => {\n baseUrl = newBaseUrl.replace(/\\/*$/, '/'); // TODO #12875\n};\n\nexport interface ForgejoHttpOptions extends HttpOptions {\n paginate?: boolean;\n}\n\nfunction getPaginationContainer<T = unknown>(body: unknown): T[] | null {\n if (isArray(body) && body.length) {\n return body as T[];\n }\n\n if (isPlainObject(body) && isArray(body?.data) && body.data.length) {\n return body.data as T[];\n }\n\n return null;\n}\n\nexport class ForgejoHttp extends HttpBase<ForgejoHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(hostType?: string, options?: HttpOptions) {\n super(hostType ?? 'forgejo', options);\n }\n\n protected override extraOptions(): readonly string[] {\n return super\n .extraOptions()\n .concat(['paginate'] as (keyof ForgejoHttpOptions)[]);\n }\n\n protected override async requestJsonUnsafe<T = unknown>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<ForgejoHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);\n const opts = {\n ...options,\n url: resolvedUrl,\n };\n const res = await super.requestJsonUnsafe<T>(method, opts);\n const pc = getPaginationContainer<T>(res.body);\n if (opts.httpOptions?.paginate && pc) {\n delete opts.httpOptions.cacheProvider;\n opts.httpOptions.memCache = false;\n\n delete opts.httpOptions.paginate;\n const total = parseInt(res.headers['x-total-count'] as string);\n let nextPage = parseInt(resolvedUrl.searchParams.get('page') ?? '1');\n\n while (total && pc.length < total) {\n nextPage += 1;\n resolvedUrl.searchParams.set('page', nextPage.toString());\n\n const nextRes = await super.requestJsonUnsafe<T>(method, opts);\n const nextPc = getPaginationContainer<T>(nextRes.body);\n if (nextPc === null) {\n break;\n }\n\n pc.push(...nextPc);\n }\n }\n\n return res;\n }\n}\n"],"mappings":";;;;AAIA,IAAI;AACJ,MAAa,cAAc,eAA6B;AACtD,WAAU,WAAW,QAAQ,QAAQ,IAAI;;AAO3C,SAAS,uBAAoC,MAA2B;AACtE,KAAI,QAAQ,KAAK,IAAI,KAAK,OACxB,QAAO;AAGT,KAAI,cAAc,KAAK,IAAI,QAAQ,MAAM,KAAK,IAAI,KAAK,KAAK,OAC1D,QAAO,KAAK;AAGd,QAAO;;AAGT,IAAa,cAAb,cAAiC,SAA6B;CAC5D,IAAuB,UAA8B;AACnD,SAAO;;CAGT,YAAY,UAAmB,SAAuB;AACpD,QAAM,YAAY,WAAW,QAAQ;;CAGvC,AAAmB,eAAkC;AACnD,SAAO,MACJ,cAAc,CACd,OAAO,CAAC,WAAW,CAAiC;;CAGzD,MAAyB,kBACvB,QACA,SAC0B;EAC1B,MAAM,cAAc,KAAK,WAAW,QAAQ,KAAK,QAAQ,YAAY;EACrE,MAAM,OAAO;GACX,GAAG;GACH,KAAK;GACN;EACD,MAAM,MAAM,MAAM,MAAM,kBAAqB,QAAQ,KAAK;EAC1D,MAAM,KAAK,uBAA0B,IAAI,KAAK;AAC9C,MAAI,KAAK,aAAa,YAAY,IAAI;AACpC,UAAO,KAAK,YAAY;AACxB,QAAK,YAAY,WAAW;AAE5B,UAAO,KAAK,YAAY;GACxB,MAAM,QAAQ,SAAS,IAAI,QAAQ,iBAA2B;GAC9D,IAAI,WAAW,SAAS,YAAY,aAAa,IAAI,OAAO,IAAI,IAAI;AAEpE,UAAO,SAAS,GAAG,SAAS,OAAO;AACjC,gBAAY;AACZ,gBAAY,aAAa,IAAI,QAAQ,SAAS,UAAU,CAAC;IAGzD,MAAM,SAAS,wBADC,MAAM,MAAM,kBAAqB,QAAQ,KAAK,EACb,KAAK;AACtD,QAAI,WAAW,KACb;AAGF,OAAG,KAAK,GAAG,OAAO;;;AAItB,SAAO"}
@@ -18,6 +18,9 @@ var GiteaHttp = class extends HttpBase {
18
18
  constructor(hostType, options) {
19
19
  super(hostType ?? "gitea", options);
20
20
  }
21
+ extraOptions() {
22
+ return super.extraOptions().concat(["paginate"]);
23
+ }
21
24
  async requestJsonUnsafe(method, options) {
22
25
  const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);
23
26
  const opts = {
@@ -1 +1 @@
1
- {"version":3,"file":"gitea.js","names":[],"sources":["../../../lib/util/http/gitea.ts"],"sourcesContent":["import { isArray, isPlainObject } from '@sindresorhus/is';\nimport { HttpBase, type InternalJsonUnsafeOptions } from './http.ts';\nimport type { HttpMethod, HttpOptions, HttpResponse } from './types.ts';\n\nlet baseUrl: string;\nexport const setBaseUrl = (newBaseUrl: string): void => {\n baseUrl = newBaseUrl.replace(/\\/*$/, '/'); // TODO #12875\n};\n\nexport interface GiteaHttpOptions extends HttpOptions {\n paginate?: boolean;\n}\n\nfunction getPaginationContainer<T = unknown>(body: unknown): T[] | null {\n if (isArray(body) && body.length) {\n return body as T[];\n }\n\n if (isPlainObject(body) && isArray(body?.data) && body.data.length) {\n return body.data as T[];\n }\n\n return null;\n}\n\nexport class GiteaHttp extends HttpBase<GiteaHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(hostType?: string, options?: HttpOptions) {\n super(hostType ?? 'gitea', options);\n }\n\n protected override async requestJsonUnsafe<T = unknown>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<GiteaHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);\n const opts = {\n ...options,\n url: resolvedUrl,\n };\n const res = await super.requestJsonUnsafe<T>(method, opts);\n const pc = getPaginationContainer<T>(res.body);\n if (opts.httpOptions?.paginate && pc) {\n delete opts.httpOptions.cacheProvider;\n opts.httpOptions.memCache = false;\n\n delete opts.httpOptions.paginate;\n const total = parseInt(res.headers['x-total-count'] as string);\n let nextPage = parseInt(resolvedUrl.searchParams.get('page') ?? '1');\n\n while (total && pc.length < total) {\n nextPage += 1;\n resolvedUrl.searchParams.set('page', nextPage.toString());\n\n const nextRes = await super.requestJsonUnsafe<T>(method, opts);\n const nextPc = getPaginationContainer<T>(nextRes.body);\n if (nextPc === null) {\n break;\n }\n\n pc.push(...nextPc);\n }\n }\n\n return res;\n }\n}\n"],"mappings":";;;;AAIA,IAAI;AACJ,MAAa,cAAc,eAA6B;AACtD,WAAU,WAAW,QAAQ,QAAQ,IAAI;;AAO3C,SAAS,uBAAoC,MAA2B;AACtE,KAAI,QAAQ,KAAK,IAAI,KAAK,OACxB,QAAO;AAGT,KAAI,cAAc,KAAK,IAAI,QAAQ,MAAM,KAAK,IAAI,KAAK,KAAK,OAC1D,QAAO,KAAK;AAGd,QAAO;;AAGT,IAAa,YAAb,cAA+B,SAA2B;CACxD,IAAuB,UAA8B;AACnD,SAAO;;CAGT,YAAY,UAAmB,SAAuB;AACpD,QAAM,YAAY,SAAS,QAAQ;;CAGrC,MAAyB,kBACvB,QACA,SAC0B;EAC1B,MAAM,cAAc,KAAK,WAAW,QAAQ,KAAK,QAAQ,YAAY;EACrE,MAAM,OAAO;GACX,GAAG;GACH,KAAK;GACN;EACD,MAAM,MAAM,MAAM,MAAM,kBAAqB,QAAQ,KAAK;EAC1D,MAAM,KAAK,uBAA0B,IAAI,KAAK;AAC9C,MAAI,KAAK,aAAa,YAAY,IAAI;AACpC,UAAO,KAAK,YAAY;AACxB,QAAK,YAAY,WAAW;AAE5B,UAAO,KAAK,YAAY;GACxB,MAAM,QAAQ,SAAS,IAAI,QAAQ,iBAA2B;GAC9D,IAAI,WAAW,SAAS,YAAY,aAAa,IAAI,OAAO,IAAI,IAAI;AAEpE,UAAO,SAAS,GAAG,SAAS,OAAO;AACjC,gBAAY;AACZ,gBAAY,aAAa,IAAI,QAAQ,SAAS,UAAU,CAAC;IAGzD,MAAM,SAAS,wBADC,MAAM,MAAM,kBAAqB,QAAQ,KAAK,EACb,KAAK;AACtD,QAAI,WAAW,KACb;AAGF,OAAG,KAAK,GAAG,OAAO;;;AAItB,SAAO"}
1
+ {"version":3,"file":"gitea.js","names":[],"sources":["../../../lib/util/http/gitea.ts"],"sourcesContent":["import { isArray, isPlainObject } from '@sindresorhus/is';\nimport { HttpBase, type InternalJsonUnsafeOptions } from './http.ts';\nimport type { HttpMethod, HttpOptions, HttpResponse } from './types.ts';\n\nlet baseUrl: string;\nexport const setBaseUrl = (newBaseUrl: string): void => {\n baseUrl = newBaseUrl.replace(/\\/*$/, '/'); // TODO #12875\n};\n\nexport interface GiteaHttpOptions extends HttpOptions {\n paginate?: boolean;\n}\n\nfunction getPaginationContainer<T = unknown>(body: unknown): T[] | null {\n if (isArray(body) && body.length) {\n return body as T[];\n }\n\n if (isPlainObject(body) && isArray(body?.data) && body.data.length) {\n return body.data as T[];\n }\n\n return null;\n}\n\nexport class GiteaHttp extends HttpBase<GiteaHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(hostType?: string, options?: HttpOptions) {\n super(hostType ?? 'gitea', options);\n }\n\n protected override extraOptions(): readonly string[] {\n return super\n .extraOptions()\n .concat(['paginate'] as (keyof GiteaHttpOptions)[]);\n }\n\n protected override async requestJsonUnsafe<T = unknown>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<GiteaHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);\n const opts = {\n ...options,\n url: resolvedUrl,\n };\n const res = await super.requestJsonUnsafe<T>(method, opts);\n const pc = getPaginationContainer<T>(res.body);\n if (opts.httpOptions?.paginate && pc) {\n delete opts.httpOptions.cacheProvider;\n opts.httpOptions.memCache = false;\n\n delete opts.httpOptions.paginate;\n const total = parseInt(res.headers['x-total-count'] as string);\n let nextPage = parseInt(resolvedUrl.searchParams.get('page') ?? '1');\n\n while (total && pc.length < total) {\n nextPage += 1;\n resolvedUrl.searchParams.set('page', nextPage.toString());\n\n const nextRes = await super.requestJsonUnsafe<T>(method, opts);\n const nextPc = getPaginationContainer<T>(nextRes.body);\n if (nextPc === null) {\n break;\n }\n\n pc.push(...nextPc);\n }\n }\n\n return res;\n }\n}\n"],"mappings":";;;;AAIA,IAAI;AACJ,MAAa,cAAc,eAA6B;AACtD,WAAU,WAAW,QAAQ,QAAQ,IAAI;;AAO3C,SAAS,uBAAoC,MAA2B;AACtE,KAAI,QAAQ,KAAK,IAAI,KAAK,OACxB,QAAO;AAGT,KAAI,cAAc,KAAK,IAAI,QAAQ,MAAM,KAAK,IAAI,KAAK,KAAK,OAC1D,QAAO,KAAK;AAGd,QAAO;;AAGT,IAAa,YAAb,cAA+B,SAA2B;CACxD,IAAuB,UAA8B;AACnD,SAAO;;CAGT,YAAY,UAAmB,SAAuB;AACpD,QAAM,YAAY,SAAS,QAAQ;;CAGrC,AAAmB,eAAkC;AACnD,SAAO,MACJ,cAAc,CACd,OAAO,CAAC,WAAW,CAA+B;;CAGvD,MAAyB,kBACvB,QACA,SAC0B;EAC1B,MAAM,cAAc,KAAK,WAAW,QAAQ,KAAK,QAAQ,YAAY;EACrE,MAAM,OAAO;GACX,GAAG;GACH,KAAK;GACN;EACD,MAAM,MAAM,MAAM,MAAM,kBAAqB,QAAQ,KAAK;EAC1D,MAAM,KAAK,uBAA0B,IAAI,KAAK;AAC9C,MAAI,KAAK,aAAa,YAAY,IAAI;AACpC,UAAO,KAAK,YAAY;AACxB,QAAK,YAAY,WAAW;AAE5B,UAAO,KAAK,YAAY;GACxB,MAAM,QAAQ,SAAS,IAAI,QAAQ,iBAA2B;GAC9D,IAAI,WAAW,SAAS,YAAY,aAAa,IAAI,OAAO,IAAI,IAAI;AAEpE,UAAO,SAAS,GAAG,SAAS,OAAO;AACjC,gBAAY;AACZ,gBAAY,aAAa,IAAI,QAAQ,SAAS,UAAU,CAAC;IAGzD,MAAM,SAAS,wBADC,MAAM,MAAM,kBAAqB,QAAQ,KAAK,EACb,KAAK;AACtD,QAAI,WAAW,KACb;AAGF,OAAG,KAAK,GAAG,OAAO;;;AAItB,SAAO"}
@@ -30,6 +30,7 @@ type GraphqlPageCache = Record<string, GraphqlPageCacheItem>;
30
30
  declare class GithubHttp extends HttpBase<GithubHttpOptions> {
31
31
  protected get baseUrl(): string | undefined;
32
32
  constructor(hostType?: string, options?: HttpOptions);
33
+ protected extraOptions(): readonly string[];
33
34
  protected processOptions(url: URL, opts: InternalHttpOptions & GithubBaseHttpOptions): void;
34
35
  protected handleError(url: string | URL, opts: HttpOptions, err: GotLegacyError): never;
35
36
  protected requestJsonUnsafe<T>(method: HttpMethod, options: InternalJsonUnsafeOptions<GithubHttpOptions>): Promise<HttpResponse<T>>;
@@ -164,6 +164,14 @@ var GithubHttp = class extends HttpBase {
164
164
  constructor(hostType = "github", options) {
165
165
  super(hostType, options);
166
166
  }
167
+ extraOptions() {
168
+ return super.extraOptions().concat([
169
+ "pageLimit",
170
+ "paginate",
171
+ "paginationField",
172
+ "repository"
173
+ ]);
174
+ }
167
175
  processOptions(url, opts) {
168
176
  if (!opts.token) {
169
177
  const authUrl = new URL(url);
@@ -1 +1 @@
1
- {"version":3,"file":"github.js","names":["hostRules.find","p.all"],"sources":["../../../lib/util/http/github.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyObject,\n isNullOrUndefined,\n isPlainObject,\n} from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport {\n PLATFORM_BAD_CREDENTIALS,\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_CHANGED,\n} from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { getCache } from '../cache/repository/index.ts';\nimport { getEnv } from '../env.ts';\nimport * as hostRules from '../host-rules.ts';\nimport { maskToken } from '../mask.ts';\nimport * as p from '../promises.ts';\nimport { range } from '../range.ts';\nimport { regEx } from '../regex.ts';\nimport { joinUrlParts, parseLinkHeader, parseUrl } from '../url.ts';\nimport { findMatchingRule } from './host-rules.ts';\nimport {\n HttpBase,\n type InternalHttpOptions,\n type InternalJsonUnsafeOptions,\n} from './http.ts';\nimport type { GotLegacyError } from './legacy.ts';\nimport type {\n GraphqlOptions,\n HttpMethod,\n HttpOptions,\n HttpResponse,\n} from './types.ts';\n\nconst githubBaseUrl = 'https://api.github.com/';\nlet baseUrl = githubBaseUrl;\nexport const setBaseUrl = (url: string): void => {\n baseUrl = url;\n};\n\nexport interface GithubBaseHttpOptions extends HttpOptions {\n repository?: string;\n}\n\nexport interface GithubHttpOptions extends GithubBaseHttpOptions {\n paginate?: boolean | string;\n paginationField?: string;\n pageLimit?: number;\n}\n\ninterface GithubGraphqlRepoData<T = unknown> {\n repository?: T;\n}\n\nexport type GithubGraphqlResponse<T = unknown> =\n | {\n data: T;\n errors?: never;\n }\n | {\n data?: never;\n errors: {\n type?: string;\n message: string;\n }[];\n };\n\nfunction handleGotError(\n err: GotLegacyError,\n url: string | URL,\n opts: GithubBaseHttpOptions,\n): Error {\n const path = url.toString();\n let message = err.message || '';\n const body = err.response?.body;\n if (isPlainObject(body) && 'message' in body) {\n message = String(body.message);\n }\n if (\n err.code === 'ERR_HTTP2_STREAM_ERROR' ||\n err.code === 'ENOTFOUND' ||\n err.code === 'ETIMEDOUT' ||\n err.code === 'EAI_AGAIN' ||\n err.code === 'ECONNRESET'\n ) {\n logger.debug({ err }, 'GitHub failure: RequestError');\n return new ExternalHostError(err, 'github');\n }\n if (err.name === 'ParseError') {\n logger.debug({ err }, '');\n return new ExternalHostError(err, 'github');\n }\n if (err.statusCode && err.statusCode >= 500 && err.statusCode < 600) {\n logger.debug({ err }, 'GitHub failure: 5xx');\n return new ExternalHostError(err, 'github');\n }\n if (\n err.statusCode === 403 &&\n message.startsWith('You have triggered an abuse detection mechanism')\n ) {\n logger.debug({ err }, 'GitHub failure: abuse detection');\n return new Error(PLATFORM_RATE_LIMIT_EXCEEDED);\n }\n if (\n err.statusCode === 403 &&\n message.startsWith('You have exceeded a secondary rate limit')\n ) {\n logger.warn({ err }, 'GitHub failure: secondary rate limit');\n return new Error(PLATFORM_RATE_LIMIT_EXCEEDED);\n }\n if (err.statusCode === 403 && message.includes('Upgrade to GitHub Pro')) {\n logger.debug(`Endpoint: ${path}, needs paid GitHub plan`);\n return err;\n }\n if (err.statusCode === 403 && message.includes('rate limit exceeded')) {\n logger.debug({ err }, 'GitHub failure: rate limit');\n\n const parsed = parseUrl(baseUrl);\n\n const rule = hostRules.find({ url: baseUrl });\n if (rule.token || rule.password) {\n logger.once.warn(\n 'Rate limit exceeded for api.github.com, even though we are authenticated',\n );\n } else {\n if (parsed?.hostname === 'api.github.com') {\n logger.once.warn(\n {\n documentationUrl:\n 'https://docs.renovatebot.com/getting-started/running/#githubcom-token-for-changelogs-and-tools',\n },\n `Rate limit exceeded for ${parsed.host}, as no hostRules set for this host. Please set a GITHUB_COM_TOKEN`,\n );\n } else {\n logger.once.warn(\n `Rate limit exceeded for ${parsed!.host}, as no hostRules set for this host`,\n );\n }\n }\n\n return new Error(PLATFORM_RATE_LIMIT_EXCEEDED);\n }\n if (\n err.statusCode === 403 &&\n message.startsWith('Resource not accessible by integration')\n ) {\n logger.debug(\n { err },\n 'GitHub failure: Resource not accessible by integration',\n );\n return new Error(PLATFORM_INTEGRATION_UNAUTHORIZED);\n }\n if (err.statusCode === 401) {\n // Warn once for github.com token if unauthorized\n const hostname = parseUrl(url)?.hostname;\n // v8 ignore else -- TODO: add test #40625\n if (hostname === 'github.com' || hostname === 'api.github.com') {\n logger.once.warn('github.com token 401 unauthorized');\n }\n if (message.includes('Bad credentials')) {\n const rateLimit = err.headers?.['x-ratelimit-limit'] ?? -1;\n logger.debug(\n {\n token: maskToken(opts.token),\n err,\n },\n 'GitHub failure: Bad credentials',\n );\n if (rateLimit === '60') {\n return new ExternalHostError(err, 'github');\n }\n return new Error(PLATFORM_BAD_CREDENTIALS);\n }\n }\n if (err.statusCode === 422) {\n if (\n message.includes('Review cannot be requested from pull request author')\n ) {\n return err;\n } else if (err.body?.errors?.find((e: any) => e.field === 'milestone')) {\n return err;\n } else if (err.body?.errors?.find((e: any) => e.code === 'invalid')) {\n logger.debug({ err }, 'Received invalid response - aborting');\n return new Error(REPOSITORY_CHANGED);\n } else if (\n err.body?.errors?.find((e: any) =>\n e.message?.startsWith('A pull request already exists'),\n )\n ) {\n return err;\n }\n logger.debug({ err }, '422 Error thrown from GitHub');\n return new ExternalHostError(err, 'github');\n }\n if (\n err.statusCode === 410 &&\n err.body?.message === 'Issues are disabled for this repo'\n ) {\n return err;\n }\n return err;\n}\n\ninterface GraphqlPaginatedContent<T = unknown> {\n nodes: T[];\n edges: T[];\n pageInfo: { hasNextPage: boolean; endCursor: string };\n}\n\nfunction constructAcceptString(input?: any): string {\n const defaultAccept = 'application/vnd.github.v3+json';\n const acceptStrings =\n typeof input === 'string' ? input.split(regEx(/\\s*,\\s*/)) : [];\n\n // TODO: regression of #6736\n // v8 ignore else -- TODO: add test #40625\n if (\n !acceptStrings.some((x) => x === defaultAccept) &&\n (!acceptStrings.some((x) => x.startsWith('application/vnd.github.')) ||\n acceptStrings.length < 2)\n ) {\n acceptStrings.push(defaultAccept);\n }\n return acceptStrings.join(', ');\n}\n\nconst MAX_GRAPHQL_PAGE_SIZE = 100;\n\ninterface GraphqlPageCacheItem {\n pageLastResizedAt: string;\n pageSize: number;\n}\n\nexport type GraphqlPageCache = Record<string, GraphqlPageCacheItem>;\n\nfunction getGraphqlPageSize(\n fieldName: string,\n defaultPageSize = MAX_GRAPHQL_PAGE_SIZE,\n): number {\n const cache = getCache();\n const graphqlPageCache = cache?.platform?.github\n ?.graphqlPageCache as GraphqlPageCache;\n const cachedRecord = graphqlPageCache?.[fieldName];\n\n if (graphqlPageCache && cachedRecord) {\n logger.debug(\n { fieldName, ...cachedRecord },\n 'GraphQL page size: found cached value',\n );\n\n const oldPageSize = cachedRecord.pageSize;\n\n const now = DateTime.local();\n const then = DateTime.fromISO(cachedRecord.pageLastResizedAt);\n const expiry = then.plus({ hours: 24 });\n if (now > expiry) {\n const newPageSize = Math.min(oldPageSize * 2, MAX_GRAPHQL_PAGE_SIZE);\n if (newPageSize < MAX_GRAPHQL_PAGE_SIZE) {\n const timestamp = now.toISO();\n\n logger.debug(\n { fieldName, oldPageSize, newPageSize, timestamp },\n 'GraphQL page size: expanding',\n );\n\n cachedRecord.pageLastResizedAt = timestamp;\n cachedRecord.pageSize = newPageSize;\n } else {\n logger.debug(\n { fieldName, oldPageSize, newPageSize },\n 'GraphQL page size: expanded to default page size',\n );\n\n delete graphqlPageCache[fieldName];\n }\n\n return newPageSize;\n }\n\n return oldPageSize;\n }\n\n return defaultPageSize;\n}\n\nfunction setGraphqlPageSize(fieldName: string, newPageSize: number): void {\n const oldPageSize = getGraphqlPageSize(fieldName);\n if (newPageSize !== oldPageSize) {\n const now = DateTime.local();\n const pageLastResizedAt = now.toISO();\n logger.debug(\n { fieldName, oldPageSize, newPageSize, timestamp: pageLastResizedAt },\n 'GraphQL page size: shrinking',\n );\n const cache = getCache();\n cache.platform ??= {};\n cache.platform.github ??= {};\n cache.platform.github.graphqlPageCache ??= {};\n const graphqlPageCache = cache.platform.github\n .graphqlPageCache as GraphqlPageCache;\n graphqlPageCache[fieldName] = {\n pageLastResizedAt,\n pageSize: newPageSize,\n };\n }\n}\n\nfunction replaceUrlBase(url: URL, baseUrl: string): URL {\n const relativeUrl = `${url.pathname}${url.search}`;\n return new URL(relativeUrl, baseUrl);\n}\n\nexport class GithubHttp extends HttpBase<GithubHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(hostType = 'github', options?: HttpOptions) {\n super(hostType, options);\n }\n\n protected override processOptions(\n url: URL,\n opts: InternalHttpOptions & GithubBaseHttpOptions,\n ): void {\n if (!opts.token) {\n const authUrl = new URL(url);\n\n if (opts.repository) {\n // set authUrl to https://api.github.com/repos/org/repo or https://gihub.domain.com/api/v3/repos/org/repo\n authUrl.hash = '';\n authUrl.search = '';\n authUrl.pathname = joinUrlParts(\n authUrl.pathname.startsWith('/api/v3') ? '/api/v3' : '',\n 'repos',\n `${opts.repository}`,\n );\n }\n\n let readOnly = opts.readOnly;\n const { method = 'get' } = opts;\n if (\n readOnly === undefined &&\n ['get', 'head'].includes(method.toLowerCase())\n ) {\n readOnly = true;\n }\n const { token } = findMatchingRule(authUrl.toString(), {\n hostType: this.hostType,\n readOnly,\n });\n opts.token = token;\n }\n\n const accept = constructAcceptString(opts.headers?.accept);\n\n opts.headers = {\n ...opts.headers,\n accept,\n };\n }\n\n protected override handleError(\n url: string | URL,\n opts: HttpOptions,\n err: GotLegacyError,\n ): never {\n throw handleGotError(err, url, opts);\n }\n\n protected override async requestJsonUnsafe<T>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<GithubHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const httpOptions = options.httpOptions ?? {};\n const resolvedUrl = this.resolveUrl(options.url, httpOptions);\n const opts = {\n ...options,\n url: resolvedUrl,\n };\n\n const result = await super.requestJsonUnsafe<T>(method, opts);\n if (httpOptions.paginate) {\n delete httpOptions.cacheProvider;\n httpOptions.memCache = false;\n // Check if result is paginated\n const pageLimit = httpOptions.pageLimit ?? 10;\n const linkHeader = parseLinkHeader(result?.headers?.link);\n const next = linkHeader?.next;\n const env = getEnv();\n if (next?.url && linkHeader?.last?.page) {\n let lastPage = parseInt(linkHeader.last.page);\n // v8 ignore else -- TODO: add test #40625\n if (!env.RENOVATE_PAGINATE_ALL && httpOptions.paginate !== 'all') {\n lastPage = Math.min(pageLimit, lastPage);\n }\n const baseUrl = httpOptions.baseUrl ?? this.baseUrl;\n const parsedUrl = new URL(next.url, baseUrl);\n const rebasePagination =\n !!baseUrl &&\n !!env.RENOVATE_X_REBASE_PAGINATION_LINKS &&\n // Preserve github.com URLs for use cases like release notes\n parsedUrl.origin !== 'https://api.github.com';\n const firstPageUrl = rebasePagination\n ? replaceUrlBase(parsedUrl, baseUrl)\n : parsedUrl;\n const queue = [...range(2, lastPage)].map(\n (pageNumber) => (): Promise<HttpResponse<T>> => {\n // copy before modifying searchParams\n const nextUrl = new URL(firstPageUrl);\n nextUrl.searchParams.set('page', String(pageNumber));\n return super.requestJsonUnsafe<T>(method, {\n ...opts,\n url: nextUrl,\n });\n },\n );\n const pages = await p.all(queue);\n // v8 ignore else -- TODO: add test #40625\n if (httpOptions.paginationField && isPlainObject(result.body)) {\n const paginatedResult = result.body[httpOptions.paginationField];\n // v8 ignore else -- TODO: add test #40625\n if (isArray<T>(paginatedResult)) {\n for (const nextPage of pages) {\n // v8 ignore else -- TODO: add test #40625\n if (isPlainObject(nextPage.body)) {\n const nextPageResults =\n nextPage.body[httpOptions.paginationField];\n // v8 ignore else -- TODO: add test #40625\n if (isArray<T>(nextPageResults)) {\n paginatedResult.push(...nextPageResults);\n }\n }\n }\n }\n } else if (isArray<T>(result.body)) {\n for (const nextPage of pages) {\n // v8 ignore else -- TODO: add test #40625\n if (isArray<T>(nextPage.body)) {\n result.body.push(...nextPage.body);\n }\n }\n }\n }\n }\n return result;\n }\n\n public async requestGraphql<T = unknown>(\n query: string,\n options: GraphqlOptions = {},\n ): Promise<GithubGraphqlResponse<T> | null> {\n const path = 'graphql';\n\n const { paginate, count = MAX_GRAPHQL_PAGE_SIZE, cursor = null } = options;\n let { variables } = options;\n if (paginate) {\n variables = {\n ...variables,\n count,\n cursor,\n };\n }\n const body = variables ? { query, variables } : { query };\n\n const opts: GithubBaseHttpOptions = {\n baseUrl: baseUrl.replace('/v3/', '/'), // GHE uses unversioned graphql path\n body,\n headers: { accept: options?.acceptHeader },\n readOnly: options.readOnly,\n };\n if (options.token) {\n opts.token = options.token;\n }\n logger.trace(`Performing Github GraphQL request`);\n\n try {\n const res = await this.postJson<GithubGraphqlResponse<T>>(path, opts);\n return res?.body;\n } catch (err) {\n logger.debug({ err, query, options }, 'Unexpected GraphQL Error');\n if (err instanceof ExternalHostError && count && count > 10) {\n logger.info('Reducing pagination count to workaround graphql errors');\n return null;\n }\n throw handleGotError(err, path, opts);\n }\n }\n\n async queryRepoField<T = Record<string, unknown>>(\n query: string,\n fieldName: string,\n options: GraphqlOptions = {},\n ): Promise<T[]> {\n const result: T[] = [];\n\n const { paginate = true } = options;\n\n let optimalCount: null | number = null;\n let count = getGraphqlPageSize(\n fieldName,\n options.count ?? MAX_GRAPHQL_PAGE_SIZE,\n );\n let limit = options.limit ?? 1000;\n let cursor: string | null = null;\n\n let isIterating = true;\n while (isIterating) {\n const res = await this.requestGraphql<GithubGraphqlRepoData<T>>(query, {\n ...options,\n count: Math.min(count, limit),\n cursor,\n paginate,\n });\n const repositoryData = res?.data?.repository;\n if (\n isNonEmptyObject(repositoryData) &&\n !isNullOrUndefined(repositoryData[fieldName])\n ) {\n optimalCount = count;\n\n const {\n nodes = [],\n edges = [],\n pageInfo,\n } = repositoryData[fieldName] as GraphqlPaginatedContent<T>;\n result.push(...nodes);\n result.push(...edges);\n\n limit = Math.max(0, limit - nodes.length - edges.length);\n\n if (limit === 0) {\n isIterating = false;\n } else if (paginate && pageInfo) {\n const { hasNextPage, endCursor } = pageInfo;\n if (hasNextPage && endCursor) {\n cursor = endCursor;\n } else {\n isIterating = false;\n }\n }\n } else {\n count = Math.floor(count / 2);\n if (count === 0) {\n logger.warn({ query, options, res }, 'Error fetching GraphQL nodes');\n isIterating = false;\n }\n }\n\n if (!paginate) {\n isIterating = false;\n }\n }\n\n if (optimalCount && optimalCount < MAX_GRAPHQL_PAGE_SIZE) {\n setGraphqlPageSize(fieldName, optimalCount);\n }\n\n return result;\n }\n\n /**\n * Get the raw text file from a URL.\n * Only use this method to fetch text files.\n *\n * @param url Full API URL, contents path or path inside the repository to the file\n * @param options\n *\n * @example url = 'https://api.github.com/repos/renovatebot/renovate/contents/package.json'\n * @example url = 'renovatebot/renovate/contents/package.json'\n * @example url = 'package.json' & options.repository = 'renovatebot/renovate'\n */\n public async getRawTextFile(\n url: string,\n options: InternalHttpOptions & GithubBaseHttpOptions = {},\n ): Promise<HttpResponse> {\n const newOptions: InternalHttpOptions & GithubBaseHttpOptions = {\n ...options,\n headers: {\n accept: 'application/vnd.github.raw+json',\n },\n };\n\n let newURL = url;\n const httpRegex = regEx(/^https?:\\/\\//);\n if (options.repository && !httpRegex.test(options.repository)) {\n newURL = joinUrlParts(options.repository, 'contents', url);\n }\n\n return await this.getText(newURL, newOptions);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"github.js","names":["hostRules.find","p.all"],"sources":["../../../lib/util/http/github.ts"],"sourcesContent":["import {\n isArray,\n isNonEmptyObject,\n isNullOrUndefined,\n isPlainObject,\n} from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport {\n PLATFORM_BAD_CREDENTIALS,\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_CHANGED,\n} from '../../constants/error-messages.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { getCache } from '../cache/repository/index.ts';\nimport { getEnv } from '../env.ts';\nimport * as hostRules from '../host-rules.ts';\nimport { maskToken } from '../mask.ts';\nimport * as p from '../promises.ts';\nimport { range } from '../range.ts';\nimport { regEx } from '../regex.ts';\nimport { joinUrlParts, parseLinkHeader, parseUrl } from '../url.ts';\nimport { findMatchingRule } from './host-rules.ts';\nimport {\n HttpBase,\n type InternalHttpOptions,\n type InternalJsonUnsafeOptions,\n} from './http.ts';\nimport type { GotLegacyError } from './legacy.ts';\nimport type {\n GraphqlOptions,\n HttpMethod,\n HttpOptions,\n HttpResponse,\n} from './types.ts';\n\nconst githubBaseUrl = 'https://api.github.com/';\nlet baseUrl = githubBaseUrl;\nexport const setBaseUrl = (url: string): void => {\n baseUrl = url;\n};\n\nexport interface GithubBaseHttpOptions extends HttpOptions {\n repository?: string;\n}\n\nexport interface GithubHttpOptions extends GithubBaseHttpOptions {\n paginate?: boolean | string;\n paginationField?: string;\n pageLimit?: number;\n}\n\ninterface GithubGraphqlRepoData<T = unknown> {\n repository?: T;\n}\n\nexport type GithubGraphqlResponse<T = unknown> =\n | {\n data: T;\n errors?: never;\n }\n | {\n data?: never;\n errors: {\n type?: string;\n message: string;\n }[];\n };\n\nfunction handleGotError(\n err: GotLegacyError,\n url: string | URL,\n opts: GithubBaseHttpOptions,\n): Error {\n const path = url.toString();\n let message = err.message || '';\n const body = err.response?.body;\n if (isPlainObject(body) && 'message' in body) {\n message = String(body.message);\n }\n if (\n err.code === 'ERR_HTTP2_STREAM_ERROR' ||\n err.code === 'ENOTFOUND' ||\n err.code === 'ETIMEDOUT' ||\n err.code === 'EAI_AGAIN' ||\n err.code === 'ECONNRESET'\n ) {\n logger.debug({ err }, 'GitHub failure: RequestError');\n return new ExternalHostError(err, 'github');\n }\n if (err.name === 'ParseError') {\n logger.debug({ err }, '');\n return new ExternalHostError(err, 'github');\n }\n if (err.statusCode && err.statusCode >= 500 && err.statusCode < 600) {\n logger.debug({ err }, 'GitHub failure: 5xx');\n return new ExternalHostError(err, 'github');\n }\n if (\n err.statusCode === 403 &&\n message.startsWith('You have triggered an abuse detection mechanism')\n ) {\n logger.debug({ err }, 'GitHub failure: abuse detection');\n return new Error(PLATFORM_RATE_LIMIT_EXCEEDED);\n }\n if (\n err.statusCode === 403 &&\n message.startsWith('You have exceeded a secondary rate limit')\n ) {\n logger.warn({ err }, 'GitHub failure: secondary rate limit');\n return new Error(PLATFORM_RATE_LIMIT_EXCEEDED);\n }\n if (err.statusCode === 403 && message.includes('Upgrade to GitHub Pro')) {\n logger.debug(`Endpoint: ${path}, needs paid GitHub plan`);\n return err;\n }\n if (err.statusCode === 403 && message.includes('rate limit exceeded')) {\n logger.debug({ err }, 'GitHub failure: rate limit');\n\n const parsed = parseUrl(baseUrl);\n\n const rule = hostRules.find({ url: baseUrl });\n if (rule.token || rule.password) {\n logger.once.warn(\n 'Rate limit exceeded for api.github.com, even though we are authenticated',\n );\n } else {\n if (parsed?.hostname === 'api.github.com') {\n logger.once.warn(\n {\n documentationUrl:\n 'https://docs.renovatebot.com/getting-started/running/#githubcom-token-for-changelogs-and-tools',\n },\n `Rate limit exceeded for ${parsed.host}, as no hostRules set for this host. Please set a GITHUB_COM_TOKEN`,\n );\n } else {\n logger.once.warn(\n `Rate limit exceeded for ${parsed!.host}, as no hostRules set for this host`,\n );\n }\n }\n\n return new Error(PLATFORM_RATE_LIMIT_EXCEEDED);\n }\n if (\n err.statusCode === 403 &&\n message.startsWith('Resource not accessible by integration')\n ) {\n logger.debug(\n { err },\n 'GitHub failure: Resource not accessible by integration',\n );\n return new Error(PLATFORM_INTEGRATION_UNAUTHORIZED);\n }\n if (err.statusCode === 401) {\n // Warn once for github.com token if unauthorized\n const hostname = parseUrl(url)?.hostname;\n // v8 ignore else -- TODO: add test #40625\n if (hostname === 'github.com' || hostname === 'api.github.com') {\n logger.once.warn('github.com token 401 unauthorized');\n }\n if (message.includes('Bad credentials')) {\n const rateLimit = err.headers?.['x-ratelimit-limit'] ?? -1;\n logger.debug(\n {\n token: maskToken(opts.token),\n err,\n },\n 'GitHub failure: Bad credentials',\n );\n if (rateLimit === '60') {\n return new ExternalHostError(err, 'github');\n }\n return new Error(PLATFORM_BAD_CREDENTIALS);\n }\n }\n if (err.statusCode === 422) {\n if (\n message.includes('Review cannot be requested from pull request author')\n ) {\n return err;\n } else if (err.body?.errors?.find((e: any) => e.field === 'milestone')) {\n return err;\n } else if (err.body?.errors?.find((e: any) => e.code === 'invalid')) {\n logger.debug({ err }, 'Received invalid response - aborting');\n return new Error(REPOSITORY_CHANGED);\n } else if (\n err.body?.errors?.find((e: any) =>\n e.message?.startsWith('A pull request already exists'),\n )\n ) {\n return err;\n }\n logger.debug({ err }, '422 Error thrown from GitHub');\n return new ExternalHostError(err, 'github');\n }\n if (\n err.statusCode === 410 &&\n err.body?.message === 'Issues are disabled for this repo'\n ) {\n return err;\n }\n return err;\n}\n\ninterface GraphqlPaginatedContent<T = unknown> {\n nodes: T[];\n edges: T[];\n pageInfo: { hasNextPage: boolean; endCursor: string };\n}\n\nfunction constructAcceptString(input?: any): string {\n const defaultAccept = 'application/vnd.github.v3+json';\n const acceptStrings =\n typeof input === 'string' ? input.split(regEx(/\\s*,\\s*/)) : [];\n\n // TODO: regression of #6736\n // v8 ignore else -- TODO: add test #40625\n if (\n !acceptStrings.some((x) => x === defaultAccept) &&\n (!acceptStrings.some((x) => x.startsWith('application/vnd.github.')) ||\n acceptStrings.length < 2)\n ) {\n acceptStrings.push(defaultAccept);\n }\n return acceptStrings.join(', ');\n}\n\nconst MAX_GRAPHQL_PAGE_SIZE = 100;\n\ninterface GraphqlPageCacheItem {\n pageLastResizedAt: string;\n pageSize: number;\n}\n\nexport type GraphqlPageCache = Record<string, GraphqlPageCacheItem>;\n\nfunction getGraphqlPageSize(\n fieldName: string,\n defaultPageSize = MAX_GRAPHQL_PAGE_SIZE,\n): number {\n const cache = getCache();\n const graphqlPageCache = cache?.platform?.github\n ?.graphqlPageCache as GraphqlPageCache;\n const cachedRecord = graphqlPageCache?.[fieldName];\n\n if (graphqlPageCache && cachedRecord) {\n logger.debug(\n { fieldName, ...cachedRecord },\n 'GraphQL page size: found cached value',\n );\n\n const oldPageSize = cachedRecord.pageSize;\n\n const now = DateTime.local();\n const then = DateTime.fromISO(cachedRecord.pageLastResizedAt);\n const expiry = then.plus({ hours: 24 });\n if (now > expiry) {\n const newPageSize = Math.min(oldPageSize * 2, MAX_GRAPHQL_PAGE_SIZE);\n if (newPageSize < MAX_GRAPHQL_PAGE_SIZE) {\n const timestamp = now.toISO();\n\n logger.debug(\n { fieldName, oldPageSize, newPageSize, timestamp },\n 'GraphQL page size: expanding',\n );\n\n cachedRecord.pageLastResizedAt = timestamp;\n cachedRecord.pageSize = newPageSize;\n } else {\n logger.debug(\n { fieldName, oldPageSize, newPageSize },\n 'GraphQL page size: expanded to default page size',\n );\n\n delete graphqlPageCache[fieldName];\n }\n\n return newPageSize;\n }\n\n return oldPageSize;\n }\n\n return defaultPageSize;\n}\n\nfunction setGraphqlPageSize(fieldName: string, newPageSize: number): void {\n const oldPageSize = getGraphqlPageSize(fieldName);\n if (newPageSize !== oldPageSize) {\n const now = DateTime.local();\n const pageLastResizedAt = now.toISO();\n logger.debug(\n { fieldName, oldPageSize, newPageSize, timestamp: pageLastResizedAt },\n 'GraphQL page size: shrinking',\n );\n const cache = getCache();\n cache.platform ??= {};\n cache.platform.github ??= {};\n cache.platform.github.graphqlPageCache ??= {};\n const graphqlPageCache = cache.platform.github\n .graphqlPageCache as GraphqlPageCache;\n graphqlPageCache[fieldName] = {\n pageLastResizedAt,\n pageSize: newPageSize,\n };\n }\n}\n\nfunction replaceUrlBase(url: URL, baseUrl: string): URL {\n const relativeUrl = `${url.pathname}${url.search}`;\n return new URL(relativeUrl, baseUrl);\n}\n\nexport class GithubHttp extends HttpBase<GithubHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(hostType = 'github', options?: HttpOptions) {\n super(hostType, options);\n }\n\n protected override extraOptions(): readonly string[] {\n return super\n .extraOptions()\n .concat([\n 'pageLimit',\n 'paginate',\n 'paginationField',\n 'repository',\n ] as (keyof GithubHttpOptions)[]);\n }\n\n protected override processOptions(\n url: URL,\n opts: InternalHttpOptions & GithubBaseHttpOptions,\n ): void {\n if (!opts.token) {\n const authUrl = new URL(url);\n\n if (opts.repository) {\n // set authUrl to https://api.github.com/repos/org/repo or https://gihub.domain.com/api/v3/repos/org/repo\n authUrl.hash = '';\n authUrl.search = '';\n authUrl.pathname = joinUrlParts(\n authUrl.pathname.startsWith('/api/v3') ? '/api/v3' : '',\n 'repos',\n `${opts.repository}`,\n );\n }\n\n let readOnly = opts.readOnly;\n const { method = 'get' } = opts;\n if (\n readOnly === undefined &&\n ['get', 'head'].includes(method.toLowerCase())\n ) {\n readOnly = true;\n }\n const { token } = findMatchingRule(authUrl.toString(), {\n hostType: this.hostType,\n readOnly,\n });\n opts.token = token;\n }\n\n const accept = constructAcceptString(opts.headers?.accept);\n\n opts.headers = {\n ...opts.headers,\n accept,\n };\n }\n\n protected override handleError(\n url: string | URL,\n opts: HttpOptions,\n err: GotLegacyError,\n ): never {\n throw handleGotError(err, url, opts);\n }\n\n protected override async requestJsonUnsafe<T>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<GithubHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const httpOptions = options.httpOptions ?? {};\n const resolvedUrl = this.resolveUrl(options.url, httpOptions);\n const opts = {\n ...options,\n url: resolvedUrl,\n };\n\n const result = await super.requestJsonUnsafe<T>(method, opts);\n if (httpOptions.paginate) {\n delete httpOptions.cacheProvider;\n httpOptions.memCache = false;\n // Check if result is paginated\n const pageLimit = httpOptions.pageLimit ?? 10;\n const linkHeader = parseLinkHeader(result?.headers?.link);\n const next = linkHeader?.next;\n const env = getEnv();\n if (next?.url && linkHeader?.last?.page) {\n let lastPage = parseInt(linkHeader.last.page);\n // v8 ignore else -- TODO: add test #40625\n if (!env.RENOVATE_PAGINATE_ALL && httpOptions.paginate !== 'all') {\n lastPage = Math.min(pageLimit, lastPage);\n }\n const baseUrl = httpOptions.baseUrl ?? this.baseUrl;\n const parsedUrl = new URL(next.url, baseUrl);\n const rebasePagination =\n !!baseUrl &&\n !!env.RENOVATE_X_REBASE_PAGINATION_LINKS &&\n // Preserve github.com URLs for use cases like release notes\n parsedUrl.origin !== 'https://api.github.com';\n const firstPageUrl = rebasePagination\n ? replaceUrlBase(parsedUrl, baseUrl)\n : parsedUrl;\n const queue = [...range(2, lastPage)].map(\n (pageNumber) => (): Promise<HttpResponse<T>> => {\n // copy before modifying searchParams\n const nextUrl = new URL(firstPageUrl);\n nextUrl.searchParams.set('page', String(pageNumber));\n return super.requestJsonUnsafe<T>(method, {\n ...opts,\n url: nextUrl,\n });\n },\n );\n const pages = await p.all(queue);\n // v8 ignore else -- TODO: add test #40625\n if (httpOptions.paginationField && isPlainObject(result.body)) {\n const paginatedResult = result.body[httpOptions.paginationField];\n // v8 ignore else -- TODO: add test #40625\n if (isArray<T>(paginatedResult)) {\n for (const nextPage of pages) {\n // v8 ignore else -- TODO: add test #40625\n if (isPlainObject(nextPage.body)) {\n const nextPageResults =\n nextPage.body[httpOptions.paginationField];\n // v8 ignore else -- TODO: add test #40625\n if (isArray<T>(nextPageResults)) {\n paginatedResult.push(...nextPageResults);\n }\n }\n }\n }\n } else if (isArray<T>(result.body)) {\n for (const nextPage of pages) {\n // v8 ignore else -- TODO: add test #40625\n if (isArray<T>(nextPage.body)) {\n result.body.push(...nextPage.body);\n }\n }\n }\n }\n }\n return result;\n }\n\n public async requestGraphql<T = unknown>(\n query: string,\n options: GraphqlOptions = {},\n ): Promise<GithubGraphqlResponse<T> | null> {\n const path = 'graphql';\n\n const { paginate, count = MAX_GRAPHQL_PAGE_SIZE, cursor = null } = options;\n let { variables } = options;\n if (paginate) {\n variables = {\n ...variables,\n count,\n cursor,\n };\n }\n const body = variables ? { query, variables } : { query };\n\n const opts: GithubBaseHttpOptions = {\n baseUrl: baseUrl.replace('/v3/', '/'), // GHE uses unversioned graphql path\n body,\n headers: { accept: options?.acceptHeader },\n readOnly: options.readOnly,\n };\n if (options.token) {\n opts.token = options.token;\n }\n logger.trace(`Performing Github GraphQL request`);\n\n try {\n const res = await this.postJson<GithubGraphqlResponse<T>>(path, opts);\n return res?.body;\n } catch (err) {\n logger.debug({ err, query, options }, 'Unexpected GraphQL Error');\n if (err instanceof ExternalHostError && count && count > 10) {\n logger.info('Reducing pagination count to workaround graphql errors');\n return null;\n }\n throw handleGotError(err, path, opts);\n }\n }\n\n async queryRepoField<T = Record<string, unknown>>(\n query: string,\n fieldName: string,\n options: GraphqlOptions = {},\n ): Promise<T[]> {\n const result: T[] = [];\n\n const { paginate = true } = options;\n\n let optimalCount: null | number = null;\n let count = getGraphqlPageSize(\n fieldName,\n options.count ?? MAX_GRAPHQL_PAGE_SIZE,\n );\n let limit = options.limit ?? 1000;\n let cursor: string | null = null;\n\n let isIterating = true;\n while (isIterating) {\n const res = await this.requestGraphql<GithubGraphqlRepoData<T>>(query, {\n ...options,\n count: Math.min(count, limit),\n cursor,\n paginate,\n });\n const repositoryData = res?.data?.repository;\n if (\n isNonEmptyObject(repositoryData) &&\n !isNullOrUndefined(repositoryData[fieldName])\n ) {\n optimalCount = count;\n\n const {\n nodes = [],\n edges = [],\n pageInfo,\n } = repositoryData[fieldName] as GraphqlPaginatedContent<T>;\n result.push(...nodes);\n result.push(...edges);\n\n limit = Math.max(0, limit - nodes.length - edges.length);\n\n if (limit === 0) {\n isIterating = false;\n } else if (paginate && pageInfo) {\n const { hasNextPage, endCursor } = pageInfo;\n if (hasNextPage && endCursor) {\n cursor = endCursor;\n } else {\n isIterating = false;\n }\n }\n } else {\n count = Math.floor(count / 2);\n if (count === 0) {\n logger.warn({ query, options, res }, 'Error fetching GraphQL nodes');\n isIterating = false;\n }\n }\n\n if (!paginate) {\n isIterating = false;\n }\n }\n\n if (optimalCount && optimalCount < MAX_GRAPHQL_PAGE_SIZE) {\n setGraphqlPageSize(fieldName, optimalCount);\n }\n\n return result;\n }\n\n /**\n * Get the raw text file from a URL.\n * Only use this method to fetch text files.\n *\n * @param url Full API URL, contents path or path inside the repository to the file\n * @param options\n *\n * @example url = 'https://api.github.com/repos/renovatebot/renovate/contents/package.json'\n * @example url = 'renovatebot/renovate/contents/package.json'\n * @example url = 'package.json' & options.repository = 'renovatebot/renovate'\n */\n public async getRawTextFile(\n url: string,\n options: InternalHttpOptions & GithubBaseHttpOptions = {},\n ): Promise<HttpResponse> {\n const newOptions: InternalHttpOptions & GithubBaseHttpOptions = {\n ...options,\n headers: {\n accept: 'application/vnd.github.raw+json',\n },\n };\n\n let newURL = url;\n const httpRegex = regEx(/^https?:\\/\\//);\n if (options.repository && !httpRegex.test(options.repository)) {\n newURL = joinUrlParts(options.repository, 'contents', url);\n }\n\n return await this.getText(newURL, newOptions);\n }\n}\n"],"mappings":"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"}
@@ -10,6 +10,7 @@ interface GitlabHttpOptions extends HttpOptions {
10
10
  declare class GitlabHttp extends HttpBase<GitlabHttpOptions> {
11
11
  protected get baseUrl(): string | undefined;
12
12
  constructor(type?: string, options?: GitlabHttpOptions);
13
+ protected extraOptions(): readonly string[];
13
14
  protected requestJsonUnsafe<T = unknown>(method: HttpMethod, options: InternalJsonUnsafeOptions<GitlabHttpOptions>): Promise<HttpResponse<T>>;
14
15
  protected handleError(url: string | URL, _httpOptions: HttpOptions, err: Error): never;
15
16
  protected calculateRetryDelay(retryObject: RetryObject): number;
@@ -18,6 +18,9 @@ var GitlabHttp = class extends HttpBase {
18
18
  constructor(type = "gitlab", options) {
19
19
  super(type, options);
20
20
  }
21
+ extraOptions() {
22
+ return super.extraOptions().concat(["paginate"]);
23
+ }
21
24
  async requestJsonUnsafe(method, options) {
22
25
  const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);
23
26
  const opts = {
@@ -1 +1 @@
1
- {"version":3,"file":"gitlab.js","names":[],"sources":["../../../lib/util/http/gitlab.ts"],"sourcesContent":["import { isArray, isString } from '@sindresorhus/is';\nimport { RequestError, type RetryObject } from 'got';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { getEnv } from '../env.ts';\nimport { parseLinkHeader, parseUrl } from '../url.ts';\nimport { HttpBase, type InternalJsonUnsafeOptions } from './http.ts';\nimport type { HttpMethod, HttpOptions, HttpResponse } from './types.ts';\n\nlet baseUrl = 'https://gitlab.com/api/v4/';\nexport const setBaseUrl = (url: string): void => {\n baseUrl = url;\n};\n\nexport interface GitlabHttpOptions extends HttpOptions {\n paginate?: boolean;\n}\n\nexport class GitlabHttp extends HttpBase<GitlabHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(type = 'gitlab', options?: GitlabHttpOptions) {\n super(type, options);\n }\n\n protected override async requestJsonUnsafe<T = unknown>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<GitlabHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);\n const opts = {\n ...options,\n url: resolvedUrl,\n };\n opts.httpOptions ??= {};\n opts.httpOptions.throwHttpErrors = true;\n\n const result = await super.requestJsonUnsafe<T>(method, opts);\n if (opts.httpOptions.paginate && isArray(result.body)) {\n opts.httpOptions.memCache = false;\n\n // Check if result is paginated\n try {\n const linkHeader = parseLinkHeader(result.headers.link);\n const nextUrl = linkHeader?.next?.url\n ? parseUrl(linkHeader.next.url)\n : null;\n if (nextUrl) {\n if (getEnv().GITLAB_IGNORE_REPO_URL) {\n const defaultEndpoint = new URL(baseUrl);\n nextUrl.protocol = defaultEndpoint.protocol;\n nextUrl.host = defaultEndpoint.host;\n }\n\n opts.url = nextUrl;\n\n const nextResult = await this.requestJsonUnsafe<T>(method, opts);\n // v8 ignore else -- TODO: add test #40625\n if (isArray(nextResult.body)) {\n result.body.push(...nextResult.body);\n }\n }\n } catch (err) {\n logger.warn({ err }, 'Pagination error');\n }\n }\n return result;\n }\n\n protected override handleError(\n url: string | URL,\n _httpOptions: HttpOptions,\n err: Error,\n ): never {\n if (err instanceof RequestError && err.response?.statusCode) {\n if (err.response.statusCode === 404) {\n logger.trace({ err }, 'GitLab 404');\n logger.debug({ url }, 'GitLab API 404');\n throw err;\n }\n logger.debug({ err }, 'Gitlab API error');\n if (\n err.response.statusCode === 429 ||\n (err.response.statusCode >= 500 && err.response.statusCode < 600)\n ) {\n throw new ExternalHostError(err, 'gitlab');\n }\n }\n const platformFailureCodes = [\n 'EAI_AGAIN',\n 'ECONNRESET',\n 'ETIMEDOUT',\n 'UNABLE_TO_VERIFY_LEAF_SIGNATURE',\n ];\n // TODO: fix test, should be `RequestError`\n if (\n 'code' in err &&\n isString(err.code) &&\n platformFailureCodes.includes(err.code)\n ) {\n throw new ExternalHostError(err, 'gitlab');\n }\n if (err.name === 'ParseError') {\n throw new ExternalHostError(err, 'gitlab');\n }\n throw err;\n }\n\n protected override calculateRetryDelay(retryObject: RetryObject): number {\n const { error, attemptCount, retryOptions } = retryObject;\n if (\n attemptCount <= retryOptions.limit &&\n error.options.method === 'POST' &&\n error.response?.statusCode === 409 &&\n error.response.rawBody.toString().includes('Resource lock')\n ) {\n const noise = Math.random() * 100;\n return 2 ** (attemptCount - 1) * 1000 + noise;\n }\n\n return super.calculateRetryDelay(retryObject);\n }\n}\n"],"mappings":";;;;;;;;;AASA,IAAI,UAAU;AACd,MAAa,cAAc,QAAsB;AAC/C,WAAU;;AAOZ,IAAa,aAAb,cAAgC,SAA4B;CAC1D,IAAuB,UAA8B;AACnD,SAAO;;CAGT,YAAY,OAAO,UAAU,SAA6B;AACxD,QAAM,MAAM,QAAQ;;CAGtB,MAAyB,kBACvB,QACA,SAC0B;EAC1B,MAAM,cAAc,KAAK,WAAW,QAAQ,KAAK,QAAQ,YAAY;EACrE,MAAM,OAAO;GACX,GAAG;GACH,KAAK;GACN;AACD,OAAK,gBAAgB,EAAE;AACvB,OAAK,YAAY,kBAAkB;EAEnC,MAAM,SAAS,MAAM,MAAM,kBAAqB,QAAQ,KAAK;AAC7D,MAAI,KAAK,YAAY,YAAY,QAAQ,OAAO,KAAK,EAAE;AACrD,QAAK,YAAY,WAAW;AAG5B,OAAI;IACF,MAAM,aAAa,gBAAgB,OAAO,QAAQ,KAAK;IACvD,MAAM,UAAU,YAAY,MAAM,MAC9B,SAAS,WAAW,KAAK,IAAI,GAC7B;AACJ,QAAI,SAAS;AACX,SAAI,QAAQ,CAAC,wBAAwB;MACnC,MAAM,kBAAkB,IAAI,IAAI,QAAQ;AACxC,cAAQ,WAAW,gBAAgB;AACnC,cAAQ,OAAO,gBAAgB;;AAGjC,UAAK,MAAM;KAEX,MAAM,aAAa,MAAM,KAAK,kBAAqB,QAAQ,KAAK;;AAEhE,SAAI,QAAQ,WAAW,KAAK,CAC1B,QAAO,KAAK,KAAK,GAAG,WAAW,KAAK;;YAGjC,KAAK;AACZ,WAAO,KAAK,EAAE,KAAK,EAAE,mBAAmB;;;AAG5C,SAAO;;CAGT,AAAmB,YACjB,KACA,cACA,KACO;AACP,MAAI,eAAe,gBAAgB,IAAI,UAAU,YAAY;AAC3D,OAAI,IAAI,SAAS,eAAe,KAAK;AACnC,WAAO,MAAM,EAAE,KAAK,EAAE,aAAa;AACnC,WAAO,MAAM,EAAE,KAAK,EAAE,iBAAiB;AACvC,UAAM;;AAER,UAAO,MAAM,EAAE,KAAK,EAAE,mBAAmB;AACzC,OACE,IAAI,SAAS,eAAe,OAC3B,IAAI,SAAS,cAAc,OAAO,IAAI,SAAS,aAAa,IAE7D,OAAM,IAAI,kBAAkB,KAAK,SAAS;;AAU9C,MACE,UAAU,OACV,SAAS,IAAI,KAAK,IATS;GAC3B;GACA;GACA;GACA;GACD,CAKsB,SAAS,IAAI,KAAK,CAEvC,OAAM,IAAI,kBAAkB,KAAK,SAAS;AAE5C,MAAI,IAAI,SAAS,aACf,OAAM,IAAI,kBAAkB,KAAK,SAAS;AAE5C,QAAM;;CAGR,AAAmB,oBAAoB,aAAkC;EACvE,MAAM,EAAE,OAAO,cAAc,iBAAiB;AAC9C,MACE,gBAAgB,aAAa,SAC7B,MAAM,QAAQ,WAAW,UACzB,MAAM,UAAU,eAAe,OAC/B,MAAM,SAAS,QAAQ,UAAU,CAAC,SAAS,gBAAgB,EAC3D;GACA,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,UAAO,MAAM,eAAe,KAAK,MAAO;;AAG1C,SAAO,MAAM,oBAAoB,YAAY"}
1
+ {"version":3,"file":"gitlab.js","names":[],"sources":["../../../lib/util/http/gitlab.ts"],"sourcesContent":["import { isArray, isString } from '@sindresorhus/is';\nimport { RequestError, type RetryObject } from 'got';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport { getEnv } from '../env.ts';\nimport { parseLinkHeader, parseUrl } from '../url.ts';\nimport { HttpBase, type InternalJsonUnsafeOptions } from './http.ts';\nimport type { HttpMethod, HttpOptions, HttpResponse } from './types.ts';\n\nlet baseUrl = 'https://gitlab.com/api/v4/';\nexport const setBaseUrl = (url: string): void => {\n baseUrl = url;\n};\n\nexport interface GitlabHttpOptions extends HttpOptions {\n paginate?: boolean;\n}\n\nexport class GitlabHttp extends HttpBase<GitlabHttpOptions> {\n protected override get baseUrl(): string | undefined {\n return baseUrl;\n }\n\n constructor(type = 'gitlab', options?: GitlabHttpOptions) {\n super(type, options);\n }\n\n protected override extraOptions(): readonly string[] {\n return super\n .extraOptions()\n .concat(['paginate'] as (keyof GitlabHttpOptions)[]);\n }\n\n protected override async requestJsonUnsafe<T = unknown>(\n method: HttpMethod,\n options: InternalJsonUnsafeOptions<GitlabHttpOptions>,\n ): Promise<HttpResponse<T>> {\n const resolvedUrl = this.resolveUrl(options.url, options.httpOptions);\n const opts = {\n ...options,\n url: resolvedUrl,\n };\n opts.httpOptions ??= {};\n opts.httpOptions.throwHttpErrors = true;\n\n const result = await super.requestJsonUnsafe<T>(method, opts);\n if (opts.httpOptions.paginate && isArray(result.body)) {\n opts.httpOptions.memCache = false;\n\n // Check if result is paginated\n try {\n const linkHeader = parseLinkHeader(result.headers.link);\n const nextUrl = linkHeader?.next?.url\n ? parseUrl(linkHeader.next.url)\n : null;\n if (nextUrl) {\n if (getEnv().GITLAB_IGNORE_REPO_URL) {\n const defaultEndpoint = new URL(baseUrl);\n nextUrl.protocol = defaultEndpoint.protocol;\n nextUrl.host = defaultEndpoint.host;\n }\n\n opts.url = nextUrl;\n\n const nextResult = await this.requestJsonUnsafe<T>(method, opts);\n // v8 ignore else -- TODO: add test #40625\n if (isArray(nextResult.body)) {\n result.body.push(...nextResult.body);\n }\n }\n } catch (err) {\n logger.warn({ err }, 'Pagination error');\n }\n }\n return result;\n }\n\n protected override handleError(\n url: string | URL,\n _httpOptions: HttpOptions,\n err: Error,\n ): never {\n if (err instanceof RequestError && err.response?.statusCode) {\n if (err.response.statusCode === 404) {\n logger.trace({ err }, 'GitLab 404');\n logger.debug({ url }, 'GitLab API 404');\n throw err;\n }\n logger.debug({ err }, 'Gitlab API error');\n if (\n err.response.statusCode === 429 ||\n (err.response.statusCode >= 500 && err.response.statusCode < 600)\n ) {\n throw new ExternalHostError(err, 'gitlab');\n }\n }\n const platformFailureCodes = [\n 'EAI_AGAIN',\n 'ECONNRESET',\n 'ETIMEDOUT',\n 'UNABLE_TO_VERIFY_LEAF_SIGNATURE',\n ];\n // TODO: fix test, should be `RequestError`\n if (\n 'code' in err &&\n isString(err.code) &&\n platformFailureCodes.includes(err.code)\n ) {\n throw new ExternalHostError(err, 'gitlab');\n }\n if (err.name === 'ParseError') {\n throw new ExternalHostError(err, 'gitlab');\n }\n throw err;\n }\n\n protected override calculateRetryDelay(retryObject: RetryObject): number {\n const { error, attemptCount, retryOptions } = retryObject;\n if (\n attemptCount <= retryOptions.limit &&\n error.options.method === 'POST' &&\n error.response?.statusCode === 409 &&\n error.response.rawBody.toString().includes('Resource lock')\n ) {\n const noise = Math.random() * 100;\n return 2 ** (attemptCount - 1) * 1000 + noise;\n }\n\n return super.calculateRetryDelay(retryObject);\n }\n}\n"],"mappings":";;;;;;;;;AASA,IAAI,UAAU;AACd,MAAa,cAAc,QAAsB;AAC/C,WAAU;;AAOZ,IAAa,aAAb,cAAgC,SAA4B;CAC1D,IAAuB,UAA8B;AACnD,SAAO;;CAGT,YAAY,OAAO,UAAU,SAA6B;AACxD,QAAM,MAAM,QAAQ;;CAGtB,AAAmB,eAAkC;AACnD,SAAO,MACJ,cAAc,CACd,OAAO,CAAC,WAAW,CAAgC;;CAGxD,MAAyB,kBACvB,QACA,SAC0B;EAC1B,MAAM,cAAc,KAAK,WAAW,QAAQ,KAAK,QAAQ,YAAY;EACrE,MAAM,OAAO;GACX,GAAG;GACH,KAAK;GACN;AACD,OAAK,gBAAgB,EAAE;AACvB,OAAK,YAAY,kBAAkB;EAEnC,MAAM,SAAS,MAAM,MAAM,kBAAqB,QAAQ,KAAK;AAC7D,MAAI,KAAK,YAAY,YAAY,QAAQ,OAAO,KAAK,EAAE;AACrD,QAAK,YAAY,WAAW;AAG5B,OAAI;IACF,MAAM,aAAa,gBAAgB,OAAO,QAAQ,KAAK;IACvD,MAAM,UAAU,YAAY,MAAM,MAC9B,SAAS,WAAW,KAAK,IAAI,GAC7B;AACJ,QAAI,SAAS;AACX,SAAI,QAAQ,CAAC,wBAAwB;MACnC,MAAM,kBAAkB,IAAI,IAAI,QAAQ;AACxC,cAAQ,WAAW,gBAAgB;AACnC,cAAQ,OAAO,gBAAgB;;AAGjC,UAAK,MAAM;KAEX,MAAM,aAAa,MAAM,KAAK,kBAAqB,QAAQ,KAAK;;AAEhE,SAAI,QAAQ,WAAW,KAAK,CAC1B,QAAO,KAAK,KAAK,GAAG,WAAW,KAAK;;YAGjC,KAAK;AACZ,WAAO,KAAK,EAAE,KAAK,EAAE,mBAAmB;;;AAG5C,SAAO;;CAGT,AAAmB,YACjB,KACA,cACA,KACO;AACP,MAAI,eAAe,gBAAgB,IAAI,UAAU,YAAY;AAC3D,OAAI,IAAI,SAAS,eAAe,KAAK;AACnC,WAAO,MAAM,EAAE,KAAK,EAAE,aAAa;AACnC,WAAO,MAAM,EAAE,KAAK,EAAE,iBAAiB;AACvC,UAAM;;AAER,UAAO,MAAM,EAAE,KAAK,EAAE,mBAAmB;AACzC,OACE,IAAI,SAAS,eAAe,OAC3B,IAAI,SAAS,cAAc,OAAO,IAAI,SAAS,aAAa,IAE7D,OAAM,IAAI,kBAAkB,KAAK,SAAS;;AAU9C,MACE,UAAU,OACV,SAAS,IAAI,KAAK,IATS;GAC3B;GACA;GACA;GACA;GACD,CAKsB,SAAS,IAAI,KAAK,CAEvC,OAAM,IAAI,kBAAkB,KAAK,SAAS;AAE5C,MAAI,IAAI,SAAS,aACf,OAAM,IAAI,kBAAkB,KAAK,SAAS;AAE5C,QAAM;;CAGR,AAAmB,oBAAoB,aAAkC;EACvE,MAAM,EAAE,OAAO,cAAc,iBAAiB;AAC9C,MACE,gBAAgB,aAAa,SAC7B,MAAM,QAAQ,WAAW,UACzB,MAAM,UAAU,eAAe,OAC/B,MAAM,SAAS,QAAQ,UAAU,CAAC,SAAS,gBAAgB,EAC3D;GACA,MAAM,QAAQ,KAAK,QAAQ,GAAG;AAC9B,UAAO,MAAM,eAAe,KAAK,MAAO;;AAG1C,SAAO,MAAM,oBAAoB,YAAY"}
@@ -1,9 +1,12 @@
1
1
  import { coerceString } from "../string.js";
2
2
  import { logger } from "../../logger/index.js";
3
+ import { clone } from "../clone.js";
3
4
  import { HttpStats } from "../stats.js";
4
5
  import "./legacy.js";
5
6
  import { coerceNumber } from "../number.js";
6
7
  import { hooks } from "./hooks.js";
8
+ import { GotExtraOptionKeys } from "./types.js";
9
+ import { isNumber } from "@sindresorhus/is";
7
10
  import _got, { RequestError, RequestError as RequestError$1 } from "got";
8
11
 
9
12
  //#region lib/util/http/got.ts
@@ -47,7 +50,19 @@ async function fetch(url, options, queueStats) {
47
50
  function stream(url, options) {
48
51
  return got.stream(url, options);
49
52
  }
53
+ /**
54
+ * Removes non-got options and normalizes some options to match got's expected format.
55
+ * @param options options to normalize
56
+ * @returns normalized got options
57
+ */
58
+ function normalize(options, keysToRemove) {
59
+ const opts = clone(options);
60
+ for (const key of [...GotExtraOptionKeys, ...keysToRemove]) delete opts[key];
61
+ const normalizedOptions = opts;
62
+ if (isNumber(opts.timeout)) normalizedOptions.timeout = { request: opts.timeout };
63
+ return normalizedOptions;
64
+ }
50
65
 
51
66
  //#endregion
52
- export { RequestError$1 as RequestError, fetch, stream };
67
+ export { RequestError$1 as RequestError, fetch, normalize, stream };
53
68
  //# sourceMappingURL=got.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"got.js","names":[],"sources":["../../../lib/util/http/got.ts"],"sourcesContent":["// TODO: refactor code to remove this (#9651)\nimport './legacy.ts';\n\nimport type { Options } from 'got';\nimport _got, { RequestError } from 'got';\nimport type { SetRequired } from 'type-fest';\nimport { logger } from '../../logger/index.ts';\nimport { coerceNumber } from '../number.ts';\nimport { type HttpRequestStatsDataPoint, HttpStats } from '../stats.ts';\nimport { coerceString } from '../string.ts';\nimport { hooks } from './hooks.ts';\nimport type { GotBufferOptions, GotOptions, HttpResponse } from './types.ts';\n\nexport { RequestError } from 'got';\n\nconst got = _got as unknown as typeof _got.default;\n\ntype QueueStatsData = Pick<HttpRequestStatsDataPoint, 'queueMs'>;\n\nexport async function fetch(\n url: string,\n options: SetRequired<GotOptions, 'method'>,\n queueStats: QueueStatsData,\n): Promise<HttpResponse<unknown>> {\n logger.trace({ url, options }, 'got request');\n\n let duration = 0;\n let statusCode = 0;\n try {\n // Cheat the TS compiler using `as` to pick a specific overload.\n // Otherwise it doesn't typecheck.\n const resp = await got(url, { ...options, hooks } as GotBufferOptions);\n statusCode = resp.statusCode;\n duration = coerceNumber(resp.timings.phases.total, 0);\n return resp;\n } catch (error) {\n // v8 ignore else -- TODO: add test #40625\n if (error instanceof RequestError) {\n statusCode = coerceNumber(error.response?.statusCode, -1);\n duration = coerceNumber(error.timings?.phases.total, -1);\n const method = options.method.toUpperCase();\n const code = coerceString(error.code, 'UNKNOWN');\n const retryCount = coerceNumber(error.request?.retryCount, -1);\n logger.debug(\n `${method} ${url} = (code=${code}, statusCode=${statusCode} retryCount=${retryCount}, duration=${duration})`,\n );\n }\n\n throw error;\n /* v8 ignore next: 🐛 https://github.com/bcoe/c8/issues/229 */\n } finally {\n HttpStats.write({\n method: options.method,\n url,\n reqMs: duration,\n queueMs: queueStats.queueMs,\n status: statusCode,\n });\n }\n}\n\nexport function stream(\n url: string,\n options: Omit<Options, 'isStream'>,\n): NodeJS.ReadableStream {\n return got.stream(url, options);\n}\n"],"mappings":";;;;;;;;;AAeA,MAAM,MAAM;AAIZ,eAAsB,MACpB,KACA,SACA,YACgC;AAChC,QAAO,MAAM;EAAE;EAAK;EAAS,EAAE,cAAc;CAE7C,IAAI,WAAW;CACf,IAAI,aAAa;AACjB,KAAI;EAGF,MAAM,OAAO,MAAM,IAAI,KAAK;GAAE,GAAG;GAAS;GAAO,CAAqB;AACtE,eAAa,KAAK;AAClB,aAAW,aAAa,KAAK,QAAQ,OAAO,OAAO,EAAE;AACrD,SAAO;UACA,OAAO;;AAEd,MAAI,iBAAiB,cAAc;AACjC,gBAAa,aAAa,MAAM,UAAU,YAAY,GAAG;AACzD,cAAW,aAAa,MAAM,SAAS,OAAO,OAAO,GAAG;GACxD,MAAM,SAAS,QAAQ,OAAO,aAAa;GAC3C,MAAM,OAAO,aAAa,MAAM,MAAM,UAAU;GAChD,MAAM,aAAa,aAAa,MAAM,SAAS,YAAY,GAAG;AAC9D,UAAO,MACL,GAAG,OAAO,GAAG,IAAI,WAAW,KAAK,eAAe,WAAW,cAAc,WAAW,aAAa,SAAS,GAC3G;;AAGH,QAAM;WAEE;AACR,YAAU,MAAM;GACd,QAAQ,QAAQ;GAChB;GACA,OAAO;GACP,SAAS,WAAW;GACpB,QAAQ;GACT,CAAC;;;AAIN,SAAgB,OACd,KACA,SACuB;AACvB,QAAO,IAAI,OAAO,KAAK,QAAQ"}
1
+ {"version":3,"file":"got.js","names":[],"sources":["../../../lib/util/http/got.ts"],"sourcesContent":["// TODO: refactor code to remove this (#9651)\nimport './legacy.ts';\n\nimport { isNumber } from '@sindresorhus/is';\nimport type { Options } from 'got';\nimport _got, { RequestError } from 'got';\nimport type { SetRequired } from 'type-fest';\nimport { logger } from '../../logger/index.ts';\nimport { clone } from '../clone.ts';\nimport { coerceNumber } from '../number.ts';\nimport { type HttpRequestStatsDataPoint, HttpStats } from '../stats.ts';\nimport { coerceString } from '../string.ts';\nimport { hooks } from './hooks.ts';\nimport {\n type GotBufferOptions,\n GotExtraOptionKeys,\n type GotOptions,\n type HttpResponse,\n} from './types.ts';\n\nexport { RequestError } from 'got';\n\nconst got = _got as unknown as typeof _got.default;\n\ntype QueueStatsData = Pick<HttpRequestStatsDataPoint, 'queueMs'>;\n\nexport async function fetch(\n url: string,\n options: SetRequired<GotOptions, 'method'>,\n queueStats: QueueStatsData,\n): Promise<HttpResponse<unknown>> {\n logger.trace({ url, options }, 'got request');\n\n let duration = 0;\n let statusCode = 0;\n try {\n // Cheat the TS compiler using `as` to pick a specific overload.\n // Otherwise it doesn't typecheck.\n const resp = await got(url, { ...options, hooks } as GotBufferOptions);\n statusCode = resp.statusCode;\n duration = coerceNumber(resp.timings.phases.total, 0);\n return resp;\n } catch (error) {\n // v8 ignore else -- TODO: add test #40625\n if (error instanceof RequestError) {\n statusCode = coerceNumber(error.response?.statusCode, -1);\n duration = coerceNumber(error.timings?.phases.total, -1);\n const method = options.method.toUpperCase();\n const code = coerceString(error.code, 'UNKNOWN');\n const retryCount = coerceNumber(error.request?.retryCount, -1);\n logger.debug(\n `${method} ${url} = (code=${code}, statusCode=${statusCode} retryCount=${retryCount}, duration=${duration})`,\n );\n }\n\n throw error;\n /* v8 ignore next: 🐛 https://github.com/bcoe/c8/issues/229 */\n } finally {\n HttpStats.write({\n method: options.method,\n url,\n reqMs: duration,\n queueMs: queueStats.queueMs,\n status: statusCode,\n });\n }\n}\n\nexport function stream(\n url: string,\n options: Omit<Options, 'isStream'>,\n): NodeJS.ReadableStream {\n return got.stream(url, options);\n}\n\n/**\n * Removes non-got options and normalizes some options to match got's expected format.\n * @param options options to normalize\n * @returns normalized got options\n */\nexport function normalize<T extends Options = Options>(\n options: T,\n keysToRemove: readonly string[],\n): T {\n const opts = clone(options);\n\n for (const key of [...GotExtraOptionKeys, ...keysToRemove]) {\n // @ts-expect-error -- delete extra options before passing to got\n delete opts[key];\n }\n\n // optimize options for got v12+\n const normalizedOptions = opts as unknown as T;\n\n if (isNumber(opts.timeout)) {\n normalizedOptions.timeout = { request: opts.timeout };\n }\n\n return normalizedOptions;\n}\n"],"mappings":";;;;;;;;;;;;AAsBA,MAAM,MAAM;AAIZ,eAAsB,MACpB,KACA,SACA,YACgC;AAChC,QAAO,MAAM;EAAE;EAAK;EAAS,EAAE,cAAc;CAE7C,IAAI,WAAW;CACf,IAAI,aAAa;AACjB,KAAI;EAGF,MAAM,OAAO,MAAM,IAAI,KAAK;GAAE,GAAG;GAAS;GAAO,CAAqB;AACtE,eAAa,KAAK;AAClB,aAAW,aAAa,KAAK,QAAQ,OAAO,OAAO,EAAE;AACrD,SAAO;UACA,OAAO;;AAEd,MAAI,iBAAiB,cAAc;AACjC,gBAAa,aAAa,MAAM,UAAU,YAAY,GAAG;AACzD,cAAW,aAAa,MAAM,SAAS,OAAO,OAAO,GAAG;GACxD,MAAM,SAAS,QAAQ,OAAO,aAAa;GAC3C,MAAM,OAAO,aAAa,MAAM,MAAM,UAAU;GAChD,MAAM,aAAa,aAAa,MAAM,SAAS,YAAY,GAAG;AAC9D,UAAO,MACL,GAAG,OAAO,GAAG,IAAI,WAAW,KAAK,eAAe,WAAW,cAAc,WAAW,aAAa,SAAS,GAC3G;;AAGH,QAAM;WAEE;AACR,YAAU,MAAM;GACd,QAAQ,QAAQ;GAChB;GACA,OAAO;GACP,SAAS,WAAW;GACpB,QAAQ;GACT,CAAC;;;AAIN,SAAgB,OACd,KACA,SACuB;AACvB,QAAO,IAAI,OAAO,KAAK,QAAQ;;;;;;;AAQjC,SAAgB,UACd,SACA,cACG;CACH,MAAM,OAAO,MAAM,QAAQ;AAE3B,MAAK,MAAM,OAAO,CAAC,GAAG,oBAAoB,GAAG,aAAa,CAExD,QAAO,KAAK;CAId,MAAM,oBAAoB;AAE1B,KAAI,SAAS,KAAK,QAAQ,CACxB,mBAAkB,UAAU,EAAE,SAAS,KAAK,SAAS;AAGvD,QAAO"}
@@ -20,6 +20,12 @@ declare abstract class HttpBase<JSONOpts extends HttpOptions = HttpOptions, Opts
20
20
  protected hostType: string;
21
21
  constructor(hostType: string, options?: HttpOptions);
22
22
  private request;
23
+ private _normalizeOptions;
24
+ /**
25
+ * Returns Renovate extra options which needs to be removed before passing to got.
26
+ * @returns extra Renovate options.
27
+ */
28
+ protected extraOptions(): readonly string[];
23
29
  protected processOptions(_url: URL, _options: InternalHttpOptions): void;
24
30
  protected handleError(_url: string | URL, _httpOptions: HttpOptions, err: Error): never;
25
31
  resolveUrl(requestUrl: string | URL, options?: HttpOptions | undefined): URL;
@@ -10,11 +10,11 @@ import { ExternalHostError } from "../../types/errors/external-host-error.js";
10
10
  import { acquireLock } from "../mutex.js";
11
11
  import { ObsoleteCacheHitLogger } from "../stats.js";
12
12
  import { copyResponse } from "./util.js";
13
- import { fetch, stream } from "./got.js";
13
+ import { fetch, normalize, stream } from "./got.js";
14
14
  import { hash } from "../hash.js";
15
15
  import { Result } from "../result.js";
16
16
  import { Toml } from "../schema-utils/index.js";
17
- import { applyAuthorization, removeAuthorization } from "./auth.js";
17
+ import { applyAuthorization } from "./auth.js";
18
18
  import { applyHostRule, findMatchingRule } from "./host-rules.js";
19
19
  import { getQueue } from "./queue.js";
20
20
  import { getRetryAfter, wrapWithRetry } from "./retry-after.js";
@@ -59,7 +59,6 @@ var HttpBase = class {
59
59
  const method = options.method.toLowerCase();
60
60
  const isReadMethod = ["head", "get"].includes(method);
61
61
  logger.trace(`HTTP request: ${method.toUpperCase()} ${url}`);
62
- options.hooks = { beforeRedirect: [removeAuthorization] };
63
62
  applyDefaultHeaders(options);
64
63
  if (isUndefined(options.readOnly) && isReadMethod) options.readOnly = true;
65
64
  const hostRule = findMatchingRule(url, options);
@@ -95,7 +94,7 @@ var HttpBase = class {
95
94
  const cachedResponse = await cacheProvider?.bypassServer(options.method, url);
96
95
  if (cachedResponse) return cachedResponse;
97
96
  const queueMs = Date.now() - startTime;
98
- return fetch(url, options, { queueMs });
97
+ return fetch(url, this._normalizeOptions(options), { queueMs });
99
98
  } finally {
100
99
  releaseLock?.();
101
100
  }
@@ -125,6 +124,20 @@ var HttpBase = class {
125
124
  this.handleError(requestUrl, httpOptions, err);
126
125
  }
127
126
  }
127
+ _normalizeOptions(options) {
128
+ return normalize(options, this.extraOptions());
129
+ }
130
+ /**
131
+ * Returns Renovate extra options which needs to be removed before passing to got.
132
+ * @returns extra Renovate options.
133
+ */
134
+ extraOptions() {
135
+ return [
136
+ "baseUrl",
137
+ "cacheProvider",
138
+ "readOnly"
139
+ ];
140
+ }
128
141
  processOptions(_url, _options) {}
129
142
  handleError(_url, _httpOptions, err) {
130
143
  throw err;
@@ -312,7 +325,7 @@ var HttpBase = class {
312
325
  combinedOptions = applyHostRule(resolvedUrl, combinedOptions, hostRule);
313
326
  if (combinedOptions.enabled === false) throw new Error(HOST_DISABLED);
314
327
  combinedOptions = applyAuthorization(combinedOptions);
315
- return stream(resolvedUrl, combinedOptions);
328
+ return stream(resolvedUrl, this._normalizeOptions(combinedOptions));
316
329
  }
317
330
  async getToml(arg1, arg2, arg3) {
318
331
  const { url, schema, httpOptions } = this.resolveArgs(arg1, arg2, arg3);
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","names":["memCache.get"],"sources":["../../../lib/util/http/http.ts"],"sourcesContent":["import { isPlainObject, isUndefined } from '@sindresorhus/is';\nimport merge from 'deepmerge';\nimport type { Options, RetryObject } from 'got';\nimport type { Merge, SetRequired } from 'type-fest';\nimport type { z } from 'zod/v3';\nimport { ZodType } from 'zod/v3';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_DISABLED } from '../../constants/error-messages.ts';\nimport { pkg } from '../../expose.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport * as memCache from '../cache/memory/index.ts';\nimport { getEnv } from '../env.ts';\nimport { hash } from '../hash.ts';\nimport { acquireLock } from '../mutex.ts';\nimport { type AsyncResult, Result } from '../result.ts';\nimport { Toml } from '../schema-utils/index.ts';\nimport { ObsoleteCacheHitLogger } from '../stats.ts';\nimport { isHttpUrl, parseUrl, resolveBaseUrl } from '../url.ts';\nimport { parseSingleYaml } from '../yaml.ts';\nimport { applyAuthorization, removeAuthorization } from './auth.ts';\nimport type { HttpCacheProvider } from './cache/types.ts';\nimport { fetch, stream } from './got.ts';\nimport { applyHostRule, findMatchingRule } from './host-rules.ts';\n\nimport { getQueue } from './queue.ts';\nimport { getRetryAfter, wrapWithRetry } from './retry-after.ts';\nimport { getThrottle } from './throttle.ts';\nimport type {\n GotOptions,\n GotStreamOptions,\n GotTask,\n HttpMethod,\n HttpOptions,\n HttpResponse,\n SafeJsonError,\n} from './types.ts';\nimport { copyResponse } from './util.ts';\n\nexport interface InternalJsonUnsafeOptions<\n Opts extends HttpOptions = HttpOptions,\n> {\n url: string | URL;\n httpOptions?: Opts;\n}\n\nexport interface InternalJsonOptions<\n Opts extends HttpOptions,\n ResT = unknown,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n> extends InternalJsonUnsafeOptions<Opts> {\n schema?: Schema;\n}\n\nexport type InternalGotOptions = SetRequired<GotOptions, 'method' | 'context'>;\n\nexport interface InternalHttpOptions extends HttpOptions {\n json?: HttpOptions['body'];\n\n method?: HttpMethod;\n\n parseJson?: Options['parseJson'];\n}\n\nexport function applyDefaultHeaders(options: Options): void {\n const renovateVersion = pkg.version;\n options.headers = {\n ...options.headers,\n 'user-agent':\n GlobalConfig.get('userAgent') ??\n `Renovate/${renovateVersion} (https://github.com/renovatebot/renovate)`,\n };\n}\n\nexport abstract class HttpBase<\n JSONOpts extends HttpOptions = HttpOptions,\n Opts extends HttpOptions = HttpOptions,\n> {\n private readonly options: InternalGotOptions;\n\n protected get baseUrl(): string | undefined {\n return undefined;\n }\n\n protected hostType: string;\n\n constructor(hostType: string, options: HttpOptions = {}) {\n this.hostType = hostType;\n const retryLimit = getEnv().NODE_ENV === 'test' ? 0 : 2;\n this.options = merge<InternalGotOptions>(\n options,\n {\n method: 'get',\n context: { hostType },\n retry: {\n calculateDelay: (retryObject) =>\n this.calculateRetryDelay(retryObject),\n limit: retryLimit,\n maxRetryAfter: 0, // Don't rely on `got` retry-after handling, just let it fail and then we'll handle it\n },\n },\n { isMergeableObject: isPlainObject },\n );\n }\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions,\n ): Promise<HttpResponse<string>>;\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions & { responseType: 'text' },\n ): Promise<HttpResponse<string>>;\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions & { responseType: 'buffer' },\n ): Promise<HttpResponse<Buffer>>;\n private async request<T = unknown>(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions & { responseType: 'json' },\n ): Promise<HttpResponse<T>>;\n\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions,\n ): Promise<HttpResponse<unknown>> {\n const resolvedUrl = this.resolveUrl(requestUrl, httpOptions);\n const url = resolvedUrl.toString();\n\n this.processOptions(resolvedUrl, httpOptions);\n\n let options = merge<InternalGotOptions, InternalHttpOptions>(\n {\n ...this.options,\n hostType: this.hostType,\n },\n httpOptions,\n { isMergeableObject: isPlainObject },\n );\n\n const method = options.method.toLowerCase();\n const isReadMethod = ['head', 'get'].includes(method);\n\n logger.trace(`HTTP request: ${method.toUpperCase()} ${url}`);\n\n options.hooks = {\n beforeRedirect: [removeAuthorization],\n };\n\n applyDefaultHeaders(options);\n\n if (isUndefined(options.readOnly) && isReadMethod) {\n options.readOnly = true;\n }\n\n const hostRule = findMatchingRule(url, options);\n options = applyHostRule(url, options, hostRule);\n if (options.enabled === false) {\n logger.debug(`Host is disabled - rejecting request. HostUrl: ${url}`);\n throw new Error(HOST_DISABLED);\n }\n options = applyAuthorization(options);\n const timeout = options.timeout ?? 60000;\n options.timeout = timeout;\n\n let cacheProvider: HttpCacheProvider | undefined;\n if (isReadMethod && options.cacheProvider) {\n cacheProvider = options.cacheProvider;\n }\n\n const memCacheKey =\n !process.env.RENOVATE_X_DISABLE_HTTP_MEMCACHE &&\n !cacheProvider &&\n options.memCache !== false &&\n isReadMethod\n ? hash(\n `got-${JSON.stringify({\n url,\n headers: options.headers,\n method,\n })}`,\n )\n : null;\n\n let resPromise: Promise<HttpResponse<unknown>> | null = null;\n\n // Cache GET requests unless memCache=false\n if (memCacheKey) {\n resPromise = memCache.get(memCacheKey);\n\n /* v8 ignore next: temporary code */\n if (resPromise && !cacheProvider) {\n ObsoleteCacheHitLogger.write(url);\n }\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (!resPromise) {\n if (cacheProvider) {\n await cacheProvider.setCacheHeaders(method, url, options);\n }\n\n const startTime = Date.now();\n const httpTask: GotTask = async () => {\n let releaseLock: undefined | (() => void);\n if (isReadMethod) {\n releaseLock = await acquireLock(\n `${options.method} ${url}`,\n 'http-mutex',\n timeout * 2,\n );\n }\n try {\n const cachedResponse = await cacheProvider?.bypassServer<unknown>(\n options.method,\n url,\n );\n if (cachedResponse) {\n return cachedResponse;\n }\n\n const queueMs = Date.now() - startTime;\n return fetch(url, options, { queueMs });\n } finally {\n releaseLock?.();\n }\n };\n\n const throttle = getThrottle(url);\n const throttledTask = throttle ? () => throttle.add(httpTask) : httpTask;\n\n const queue = getQueue(url);\n const queuedTask = queue ? () => queue.add(throttledTask) : throttledTask;\n\n const { maxRetryAfter = 60 } = hostRule;\n resPromise = wrapWithRetry(queuedTask, url, getRetryAfter, maxRetryAfter);\n\n if (memCacheKey) {\n memCache.set(memCacheKey, resPromise);\n }\n }\n\n try {\n const res = await resPromise;\n const deepCopyNeeded = !!memCacheKey && res.statusCode !== 304;\n const resCopy = copyResponse(res, deepCopyNeeded);\n resCopy.authorization = !!options?.headers?.authorization;\n\n if (cacheProvider) {\n return await cacheProvider.wrapServerResponse(method, url, resCopy);\n }\n\n return resCopy;\n } catch (err) {\n const { abortOnError, abortIgnoreStatusCodes } = options;\n if (abortOnError && !abortIgnoreStatusCodes?.includes(err.statusCode)) {\n throw new ExternalHostError(err);\n }\n\n const staleResponse = await cacheProvider?.bypassServer<string | Buffer>(\n method,\n url,\n true,\n );\n if (staleResponse) {\n logger.debug(\n { err },\n `Request error: returning stale cache instead for ${url}`,\n );\n return staleResponse;\n }\n\n this.handleError(requestUrl, httpOptions, err);\n }\n }\n\n protected processOptions(_url: URL, _options: InternalHttpOptions): void {\n // noop\n }\n\n protected handleError(\n _url: string | URL,\n _httpOptions: HttpOptions,\n err: Error,\n ): never {\n throw err;\n }\n\n resolveUrl(\n requestUrl: string | URL,\n options: HttpOptions | undefined = undefined,\n ): URL {\n let url = requestUrl;\n\n if (url instanceof URL) {\n // already a aboslute URL\n return url;\n }\n\n const baseUrl = options?.baseUrl ?? this.baseUrl;\n if (baseUrl) {\n url = resolveBaseUrl(baseUrl, url);\n }\n\n const parsedUrl = parseUrl(url);\n if (!parsedUrl || !isHttpUrl(parsedUrl)) {\n logger.error(\n { url: requestUrl, baseUrl, resolvedUrl: url },\n 'Request Error: cannot parse url',\n );\n throw new Error('Invalid URL');\n }\n return parsedUrl;\n }\n\n protected calculateRetryDelay({ computedValue }: RetryObject): number {\n return computedValue;\n }\n\n get(\n url: string,\n options: HttpOptions = {},\n ): Promise<HttpResponse<string | Buffer>> {\n return this.request(url, options);\n }\n\n head(url: string, options: HttpOptions = {}): Promise<HttpResponse<never>> {\n // to complex to validate\n return this.request(url, {\n ...options,\n responseType: 'text',\n method: 'head',\n }) as Promise<HttpResponse<never>>;\n }\n\n getText(\n url: string | URL,\n options: HttpOptions = {},\n ): Promise<HttpResponse<string>> {\n return this.request(url, { ...options, responseType: 'text' });\n }\n\n getBuffer(\n url: string | URL,\n options: HttpOptions = {},\n ): Promise<HttpResponse<Buffer>> {\n return this.request(url, { ...options, responseType: 'buffer' });\n }\n\n protected requestJsonUnsafe<ResT>(\n method: HttpMethod,\n { url, httpOptions: requestOptions }: InternalJsonUnsafeOptions<JSONOpts>,\n ): Promise<HttpResponse<ResT>> {\n const { body: json, ...httpOptions } = { ...requestOptions };\n const opts: InternalHttpOptions = {\n ...httpOptions,\n method,\n };\n // signal that we expect a json response\n opts.headers = {\n accept: 'application/json',\n ...opts.headers,\n };\n if (json) {\n opts.json = json;\n }\n return this.request<ResT>(url, { ...opts, responseType: 'json' });\n }\n\n private async requestJson<ResT, Schema extends ZodType<ResT> = ZodType<ResT>>(\n method: HttpMethod,\n options: InternalJsonOptions<JSONOpts, ResT, Schema>,\n ): Promise<HttpResponse<ResT>> {\n const res = await this.requestJsonUnsafe<ResT>(method, options);\n\n if (options.schema) {\n res.body = await options.schema.parseAsync(res.body);\n }\n\n return res;\n }\n\n private resolveArgs<ResT = unknown>(\n arg1: string,\n arg2: JSONOpts | ZodType<ResT> | undefined,\n arg3: ZodType<ResT> | undefined,\n ): InternalJsonOptions<JSONOpts, ResT> {\n const res: InternalJsonOptions<JSONOpts, ResT> = { url: arg1 };\n\n if (arg2 instanceof ZodType) {\n res.schema = arg2;\n } else if (arg2) {\n res.httpOptions = arg2;\n }\n\n if (arg3) {\n res.schema = arg3;\n }\n\n return res;\n }\n\n async getPlain(url: string, options?: Opts): Promise<HttpResponse> {\n const opt = options ?? {};\n return await this.getText(url, {\n headers: {\n Accept: 'text/plain',\n },\n ...opt,\n });\n }\n\n /**\n * @deprecated use `getYaml` instead\n */\n async getYamlUnchecked<ResT>(\n url: string,\n options?: Opts,\n ): Promise<HttpResponse<ResT>> {\n const res = await this.getText(url, options);\n const body = parseSingleYaml<ResT>(res.body);\n return { ...res, body };\n }\n\n async getYaml<Schema extends ZodType<any, any, any>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getYaml<Schema extends ZodType<any, any, any>>(\n url: string,\n options: Opts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getYaml<Schema extends ZodType<any, any, any>>(\n arg1: string,\n arg2?: Opts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>> {\n const url = arg1;\n let schema: Schema;\n let httpOptions: Opts | undefined;\n if (arg3) {\n schema = arg3;\n httpOptions = arg2 as Opts;\n } else {\n schema = arg2 as Schema;\n }\n\n const opts: InternalHttpOptions = {\n ...httpOptions,\n method: 'get',\n };\n\n const res = await this.getText(url, opts);\n const body = await schema.parseAsync(parseSingleYaml(res.body));\n return { ...res, body };\n }\n\n getYamlSafe<\n ResT extends NonNullable<unknown>,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n >(url: string, schema: Schema): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getYamlSafe<\n ResT extends NonNullable<unknown>,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n >(\n url: string,\n options: Opts,\n schema: Schema,\n ): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getYamlSafe<\n ResT extends NonNullable<unknown>,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n >(\n arg1: string,\n arg2: Opts | Schema,\n arg3?: Schema,\n ): AsyncResult<ResT, SafeJsonError> {\n const url = arg1;\n let schema: Schema;\n let httpOptions: Opts | undefined;\n if (arg3) {\n schema = arg3;\n httpOptions = arg2 as Opts;\n } else {\n schema = arg2 as Schema;\n }\n\n let res: AsyncResult<HttpResponse<ResT>, SafeJsonError>;\n if (httpOptions) {\n res = Result.wrap(this.getYaml(url, httpOptions, schema));\n } else {\n res = Result.wrap(this.getYaml(url, schema));\n }\n\n return res.transform((response) => Result.ok(response.body));\n }\n\n /**\n * Request JSON and return the response without any validation.\n *\n * The usage of this method is discouraged, please use `getJson` instead.\n *\n * If you're new to Zod schema validation library:\n * - consult the [documentation of Zod library](https://github.com/colinhacks/zod?tab=readme-ov-file#basic-usage)\n * - search the Renovate codebase for 'zod' module usage\n * - take a look at the `schema-utils.ts` file for Renovate-specific schemas and utilities\n */\n getJsonUnchecked<ResT = unknown>(\n url: string,\n options?: JSONOpts,\n ): Promise<HttpResponse<ResT>> {\n return this.requestJson<ResT>('get', { url, httpOptions: options });\n }\n\n /**\n * Request JSON with a Zod schema for the response,\n * throwing an error if the response is not valid.\n *\n * @param url\n * @param schema Zod schema for the response\n */\n getJson<Schema extends ZodType<any, any, any>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n getJson<Schema extends ZodType<any, any, any>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n getJson<Schema extends ZodType<any, any, any>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>> {\n const args = this.resolveArgs<z.infer<Schema>>(arg1, arg2, arg3);\n return this.requestJson<z.infer<Schema>>('get', args);\n }\n\n /**\n * Request JSON with a Zod schema for the response,\n * wrapping response data in a `Result` class.\n *\n * @param url\n * @param schema Zod schema for the response\n */\n getJsonSafe<ResT extends NonNullable<unknown>, Schema extends ZodType<ResT>>(\n url: string,\n schema: Schema,\n ): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getJsonSafe<ResT extends NonNullable<unknown>, Schema extends ZodType<ResT>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getJsonSafe<ResT extends NonNullable<unknown>, Schema extends ZodType<ResT>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): AsyncResult<ResT, SafeJsonError> {\n const args = this.resolveArgs<ResT>(arg1, arg2, arg3);\n return Result.wrap(this.requestJson<ResT>('get', args)).transform(\n (response) => Result.ok(response.body),\n );\n }\n\n /**\n * @deprecated use `head` instead\n */\n headJson(url: string, httpOptions?: JSONOpts): Promise<HttpResponse<never>> {\n return this.requestJson<never>('head', { url, httpOptions });\n }\n\n postJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n postJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n postJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n postJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs(arg1, arg2, arg3);\n return this.requestJson<T>('post', args);\n }\n\n putJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n putJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n putJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n putJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: ZodType,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs(arg1, arg2, arg3);\n return this.requestJson<T>('put', args);\n }\n\n patchJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n patchJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n patchJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n patchJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs(arg1, arg2, arg3);\n return this.requestJson<T>('patch', args);\n }\n\n deleteJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n deleteJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n deleteJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n deleteJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs(arg1, arg2, arg3);\n return this.requestJson<T>('delete', args);\n }\n\n stream(url: string, options?: HttpOptions): NodeJS.ReadableStream {\n let combinedOptions: Merge<\n GotStreamOptions,\n SetRequired<InternalHttpOptions, 'method'>\n > = {\n ...this.options,\n hostType: this.hostType,\n ...options,\n method: 'get',\n };\n\n const resolvedUrl = this.resolveUrl(url, options).toString();\n\n applyDefaultHeaders(combinedOptions);\n\n // v8 ignore else -- TODO: add test #40625\n if (\n isUndefined(combinedOptions.readOnly) &&\n ['head', 'get'].includes(combinedOptions.method)\n ) {\n combinedOptions.readOnly = true;\n }\n\n const hostRule = findMatchingRule(url, combinedOptions);\n combinedOptions = applyHostRule(resolvedUrl, combinedOptions, hostRule);\n if (combinedOptions.enabled === false) {\n throw new Error(HOST_DISABLED);\n }\n combinedOptions = applyAuthorization(combinedOptions);\n\n return stream(resolvedUrl, combinedOptions);\n }\n\n async getToml<Schema extends ZodType<any, any, any>>(\n url: string,\n schema?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getToml<Schema extends ZodType<any, any, any>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getToml<Schema extends ZodType<any, any, any>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>> {\n const { url, schema, httpOptions } = this.resolveArgs<z.infer<Schema>>(\n arg1,\n arg2,\n arg3,\n );\n\n const opts: InternalHttpOptions = {\n ...httpOptions,\n method: 'get',\n headers: {\n 'Content-Type': 'application/toml',\n ...httpOptions?.headers,\n },\n };\n\n const res = await this.getText(url, opts);\n if (schema) {\n res.body = await Toml.pipe(schema).parseAsync(res.body);\n } else {\n res.body = (await Toml.parseAsync(res.body)) as z.infer<Schema>;\n }\n\n return res;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"http.js","names":["memCache.get"],"sources":["../../../lib/util/http/http.ts"],"sourcesContent":["import { isPlainObject, isUndefined } from '@sindresorhus/is';\nimport merge from 'deepmerge';\nimport type { Options, RetryObject } from 'got';\nimport type { Merge, SetRequired } from 'type-fest';\nimport type { z } from 'zod/v3';\nimport { ZodType } from 'zod/v3';\nimport { GlobalConfig } from '../../config/global.ts';\nimport { HOST_DISABLED } from '../../constants/error-messages.ts';\nimport { pkg } from '../../expose.ts';\nimport { logger } from '../../logger/index.ts';\nimport { ExternalHostError } from '../../types/errors/external-host-error.ts';\nimport * as memCache from '../cache/memory/index.ts';\nimport { getEnv } from '../env.ts';\nimport { hash } from '../hash.ts';\nimport { acquireLock } from '../mutex.ts';\nimport { type AsyncResult, Result } from '../result.ts';\nimport { Toml } from '../schema-utils/index.ts';\nimport { ObsoleteCacheHitLogger } from '../stats.ts';\nimport { isHttpUrl, parseUrl, resolveBaseUrl } from '../url.ts';\nimport { parseSingleYaml } from '../yaml.ts';\nimport { applyAuthorization } from './auth.ts';\nimport type { HttpCacheProvider } from './cache/types.ts';\nimport { fetch, normalize, stream } from './got.ts';\nimport { applyHostRule, findMatchingRule } from './host-rules.ts';\n\nimport { getQueue } from './queue.ts';\nimport { getRetryAfter, wrapWithRetry } from './retry-after.ts';\nimport { getThrottle } from './throttle.ts';\nimport type {\n GotOptions,\n GotStreamOptions,\n GotTask,\n HttpMethod,\n HttpOptions,\n HttpResponse,\n SafeJsonError,\n} from './types.ts';\nimport { copyResponse } from './util.ts';\n\nexport interface InternalJsonUnsafeOptions<\n Opts extends HttpOptions = HttpOptions,\n> {\n url: string | URL;\n httpOptions?: Opts;\n}\n\nexport interface InternalJsonOptions<\n Opts extends HttpOptions,\n ResT = unknown,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n> extends InternalJsonUnsafeOptions<Opts> {\n schema?: Schema;\n}\n\nexport type InternalGotOptions = SetRequired<GotOptions, 'method' | 'context'>;\n\nexport interface InternalHttpOptions extends HttpOptions {\n json?: HttpOptions['body'];\n\n method?: HttpMethod;\n\n parseJson?: Options['parseJson'];\n}\n\nexport function applyDefaultHeaders(options: Options): void {\n const renovateVersion = pkg.version;\n options.headers = {\n ...options.headers,\n 'user-agent':\n GlobalConfig.get('userAgent') ??\n `Renovate/${renovateVersion} (https://github.com/renovatebot/renovate)`,\n };\n}\n\nexport abstract class HttpBase<\n JSONOpts extends HttpOptions = HttpOptions,\n Opts extends HttpOptions = HttpOptions,\n> {\n private readonly options: InternalGotOptions;\n\n protected get baseUrl(): string | undefined {\n return undefined;\n }\n\n protected hostType: string;\n\n constructor(hostType: string, options: HttpOptions = {}) {\n this.hostType = hostType;\n const retryLimit = getEnv().NODE_ENV === 'test' ? 0 : 2;\n this.options = merge<InternalGotOptions>(\n options,\n {\n method: 'get',\n context: { hostType },\n retry: {\n calculateDelay: (retryObject) =>\n this.calculateRetryDelay(retryObject),\n limit: retryLimit,\n maxRetryAfter: 0, // Don't rely on `got` retry-after handling, just let it fail and then we'll handle it\n },\n },\n { isMergeableObject: isPlainObject },\n );\n }\n\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions,\n ): Promise<HttpResponse<string>>;\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions & { responseType: 'text' },\n ): Promise<HttpResponse<string>>;\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions & { responseType: 'buffer' },\n ): Promise<HttpResponse<Buffer>>;\n private async request<T = unknown>(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions & { responseType: 'json' },\n ): Promise<HttpResponse<T>>;\n\n private async request(\n requestUrl: string | URL,\n httpOptions: InternalHttpOptions,\n ): Promise<HttpResponse<unknown>> {\n const resolvedUrl = this.resolveUrl(requestUrl, httpOptions);\n const url = resolvedUrl.toString();\n\n this.processOptions(resolvedUrl, httpOptions);\n\n let options = merge<InternalGotOptions, InternalHttpOptions>(\n {\n ...this.options,\n hostType: this.hostType,\n },\n httpOptions,\n { isMergeableObject: isPlainObject },\n );\n\n const method = options.method.toLowerCase();\n const isReadMethod = ['head', 'get'].includes(method);\n\n logger.trace(`HTTP request: ${method.toUpperCase()} ${url}`);\n\n applyDefaultHeaders(options);\n\n if (isUndefined(options.readOnly) && isReadMethod) {\n options.readOnly = true;\n }\n\n const hostRule = findMatchingRule(url, options);\n options = applyHostRule(url, options, hostRule);\n if (options.enabled === false) {\n logger.debug(`Host is disabled - rejecting request. HostUrl: ${url}`);\n throw new Error(HOST_DISABLED);\n }\n options = applyAuthorization(options);\n const timeout = options.timeout ?? 60000;\n options.timeout = timeout;\n\n let cacheProvider: HttpCacheProvider | undefined;\n if (isReadMethod && options.cacheProvider) {\n cacheProvider = options.cacheProvider;\n }\n\n const memCacheKey =\n !process.env.RENOVATE_X_DISABLE_HTTP_MEMCACHE &&\n !cacheProvider &&\n options.memCache !== false &&\n isReadMethod\n ? hash(\n `got-${JSON.stringify({\n url,\n headers: options.headers,\n method,\n })}`,\n )\n : null;\n\n let resPromise: Promise<HttpResponse<unknown>> | null = null;\n\n // Cache GET requests unless memCache=false\n if (memCacheKey) {\n resPromise = memCache.get(memCacheKey);\n\n /* v8 ignore next: temporary code */\n if (resPromise && !cacheProvider) {\n ObsoleteCacheHitLogger.write(url);\n }\n }\n\n // v8 ignore else -- TODO: add test #40625\n if (!resPromise) {\n if (cacheProvider) {\n await cacheProvider.setCacheHeaders(method, url, options);\n }\n\n const startTime = Date.now();\n const httpTask: GotTask = async () => {\n let releaseLock: undefined | (() => void);\n if (isReadMethod) {\n releaseLock = await acquireLock(\n `${options.method} ${url}`,\n 'http-mutex',\n timeout * 2,\n );\n }\n try {\n const cachedResponse = await cacheProvider?.bypassServer<unknown>(\n options.method,\n url,\n );\n if (cachedResponse) {\n return cachedResponse;\n }\n\n const queueMs = Date.now() - startTime;\n return fetch(url, this._normalizeOptions(options), {\n queueMs,\n });\n } finally {\n releaseLock?.();\n }\n };\n\n const throttle = getThrottle(url);\n const throttledTask = throttle ? () => throttle.add(httpTask) : httpTask;\n\n const queue = getQueue(url);\n const queuedTask = queue ? () => queue.add(throttledTask) : throttledTask;\n\n const { maxRetryAfter = 60 } = hostRule;\n resPromise = wrapWithRetry(queuedTask, url, getRetryAfter, maxRetryAfter);\n\n if (memCacheKey) {\n memCache.set(memCacheKey, resPromise);\n }\n }\n\n try {\n const res = await resPromise;\n const deepCopyNeeded = !!memCacheKey && res.statusCode !== 304;\n const resCopy = copyResponse(res, deepCopyNeeded);\n resCopy.authorization = !!options?.headers?.authorization;\n\n if (cacheProvider) {\n return await cacheProvider.wrapServerResponse(method, url, resCopy);\n }\n\n return resCopy;\n } catch (err) {\n const { abortOnError, abortIgnoreStatusCodes } = options;\n if (abortOnError && !abortIgnoreStatusCodes?.includes(err.statusCode)) {\n throw new ExternalHostError(err);\n }\n\n const staleResponse = await cacheProvider?.bypassServer<string | Buffer>(\n method,\n url,\n true,\n );\n if (staleResponse) {\n logger.debug(\n { err },\n `Request error: returning stale cache instead for ${url}`,\n );\n return staleResponse;\n }\n\n this.handleError(requestUrl, httpOptions, err);\n }\n }\n\n private _normalizeOptions<T extends Options>(options: T): T {\n return normalize(options, this.extraOptions());\n }\n\n /**\n * Returns Renovate extra options which needs to be removed before passing to got.\n * @returns extra Renovate options.\n */\n protected extraOptions(): readonly string[] {\n return ['baseUrl', 'cacheProvider', 'readOnly'] as (keyof HttpOptions)[];\n }\n\n protected processOptions(_url: URL, _options: InternalHttpOptions): void {\n // noop\n }\n\n protected handleError(\n _url: string | URL,\n _httpOptions: HttpOptions,\n err: Error,\n ): never {\n throw err;\n }\n\n resolveUrl(\n requestUrl: string | URL,\n options: HttpOptions | undefined = undefined,\n ): URL {\n let url = requestUrl;\n\n if (url instanceof URL) {\n // already a aboslute URL\n return url;\n }\n\n const baseUrl = options?.baseUrl ?? this.baseUrl;\n if (baseUrl) {\n url = resolveBaseUrl(baseUrl, url);\n }\n\n const parsedUrl = parseUrl(url);\n if (!parsedUrl || !isHttpUrl(parsedUrl)) {\n logger.error(\n { url: requestUrl, baseUrl, resolvedUrl: url },\n 'Request Error: cannot parse url',\n );\n throw new Error('Invalid URL');\n }\n return parsedUrl;\n }\n\n protected calculateRetryDelay({ computedValue }: RetryObject): number {\n return computedValue;\n }\n\n get(\n url: string,\n options: HttpOptions = {},\n ): Promise<HttpResponse<string | Buffer>> {\n return this.request(url, options);\n }\n\n head(url: string, options: HttpOptions = {}): Promise<HttpResponse<never>> {\n // to complex to validate\n return this.request(url, {\n ...options,\n responseType: 'text',\n method: 'head',\n }) as Promise<HttpResponse<never>>;\n }\n\n getText(\n url: string | URL,\n options: HttpOptions = {},\n ): Promise<HttpResponse<string>> {\n return this.request(url, { ...options, responseType: 'text' });\n }\n\n getBuffer(\n url: string | URL,\n options: HttpOptions = {},\n ): Promise<HttpResponse<Buffer>> {\n return this.request(url, { ...options, responseType: 'buffer' });\n }\n\n protected requestJsonUnsafe<ResT>(\n method: HttpMethod,\n { url, httpOptions: requestOptions }: InternalJsonUnsafeOptions<JSONOpts>,\n ): Promise<HttpResponse<ResT>> {\n const { body: json, ...httpOptions } = { ...requestOptions };\n const opts: InternalHttpOptions = {\n ...httpOptions,\n method,\n };\n // signal that we expect a json response\n opts.headers = {\n accept: 'application/json',\n ...opts.headers,\n };\n if (json) {\n opts.json = json;\n }\n return this.request<ResT>(url, { ...opts, responseType: 'json' });\n }\n\n private async requestJson<ResT, Schema extends ZodType<ResT> = ZodType<ResT>>(\n method: HttpMethod,\n options: InternalJsonOptions<JSONOpts, ResT, Schema>,\n ): Promise<HttpResponse<ResT>> {\n const res = await this.requestJsonUnsafe<ResT>(method, options);\n\n if (options.schema) {\n res.body = await options.schema.parseAsync(res.body);\n }\n\n return res;\n }\n\n private resolveArgs<ResT = unknown>(\n arg1: string,\n arg2: JSONOpts | ZodType<ResT> | undefined,\n arg3: ZodType<ResT> | undefined,\n ): InternalJsonOptions<JSONOpts, ResT> {\n const res: InternalJsonOptions<JSONOpts, ResT> = { url: arg1 };\n\n if (arg2 instanceof ZodType) {\n res.schema = arg2;\n } else if (arg2) {\n res.httpOptions = arg2;\n }\n\n if (arg3) {\n res.schema = arg3;\n }\n\n return res;\n }\n\n async getPlain(url: string, options?: Opts): Promise<HttpResponse> {\n const opt = options ?? {};\n return await this.getText(url, {\n headers: {\n Accept: 'text/plain',\n },\n ...opt,\n });\n }\n\n /**\n * @deprecated use `getYaml` instead\n */\n async getYamlUnchecked<ResT>(\n url: string,\n options?: Opts,\n ): Promise<HttpResponse<ResT>> {\n const res = await this.getText(url, options);\n const body = parseSingleYaml<ResT>(res.body);\n return { ...res, body };\n }\n\n async getYaml<Schema extends ZodType<any, any, any>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getYaml<Schema extends ZodType<any, any, any>>(\n url: string,\n options: Opts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getYaml<Schema extends ZodType<any, any, any>>(\n arg1: string,\n arg2?: Opts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>> {\n const url = arg1;\n let schema: Schema;\n let httpOptions: Opts | undefined;\n if (arg3) {\n schema = arg3;\n httpOptions = arg2 as Opts;\n } else {\n schema = arg2 as Schema;\n }\n\n const opts: InternalHttpOptions = {\n ...httpOptions,\n method: 'get',\n };\n\n const res = await this.getText(url, opts);\n const body = await schema.parseAsync(parseSingleYaml(res.body));\n return { ...res, body };\n }\n\n getYamlSafe<\n ResT extends NonNullable<unknown>,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n >(url: string, schema: Schema): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getYamlSafe<\n ResT extends NonNullable<unknown>,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n >(\n url: string,\n options: Opts,\n schema: Schema,\n ): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getYamlSafe<\n ResT extends NonNullable<unknown>,\n Schema extends ZodType<ResT> = ZodType<ResT>,\n >(\n arg1: string,\n arg2: Opts | Schema,\n arg3?: Schema,\n ): AsyncResult<ResT, SafeJsonError> {\n const url = arg1;\n let schema: Schema;\n let httpOptions: Opts | undefined;\n if (arg3) {\n schema = arg3;\n httpOptions = arg2 as Opts;\n } else {\n schema = arg2 as Schema;\n }\n\n let res: AsyncResult<HttpResponse<ResT>, SafeJsonError>;\n if (httpOptions) {\n res = Result.wrap(this.getYaml(url, httpOptions, schema));\n } else {\n res = Result.wrap(this.getYaml(url, schema));\n }\n\n return res.transform((response) => Result.ok(response.body));\n }\n\n /**\n * Request JSON and return the response without any validation.\n *\n * The usage of this method is discouraged, please use `getJson` instead.\n *\n * If you're new to Zod schema validation library:\n * - consult the [documentation of Zod library](https://github.com/colinhacks/zod?tab=readme-ov-file#basic-usage)\n * - search the Renovate codebase for 'zod' module usage\n * - take a look at the `schema-utils.ts` file for Renovate-specific schemas and utilities\n */\n getJsonUnchecked<ResT = unknown>(\n url: string,\n options?: JSONOpts,\n ): Promise<HttpResponse<ResT>> {\n return this.requestJson<ResT>('get', { url, httpOptions: options });\n }\n\n /**\n * Request JSON with a Zod schema for the response,\n * throwing an error if the response is not valid.\n *\n * @param url\n * @param schema Zod schema for the response\n */\n getJson<Schema extends ZodType<any, any, any>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n getJson<Schema extends ZodType<any, any, any>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n getJson<Schema extends ZodType<any, any, any>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>> {\n const args = this.resolveArgs<z.infer<Schema>>(arg1, arg2, arg3);\n return this.requestJson<z.infer<Schema>>('get', args);\n }\n\n /**\n * Request JSON with a Zod schema for the response,\n * wrapping response data in a `Result` class.\n *\n * @param url\n * @param schema Zod schema for the response\n */\n getJsonSafe<ResT extends NonNullable<unknown>, Schema extends ZodType<ResT>>(\n url: string,\n schema: Schema,\n ): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getJsonSafe<ResT extends NonNullable<unknown>, Schema extends ZodType<ResT>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): AsyncResult<z.infer<Schema>, SafeJsonError>;\n getJsonSafe<ResT extends NonNullable<unknown>, Schema extends ZodType<ResT>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): AsyncResult<ResT, SafeJsonError> {\n const args = this.resolveArgs<ResT>(arg1, arg2, arg3);\n return Result.wrap(this.requestJson<ResT>('get', args)).transform(\n (response) => Result.ok(response.body),\n );\n }\n\n /**\n * @deprecated use `head` instead\n */\n headJson(url: string, httpOptions?: JSONOpts): Promise<HttpResponse<never>> {\n return this.requestJson<never>('head', { url, httpOptions });\n }\n\n postJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n postJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n postJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n postJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs(arg1, arg2, arg3);\n return this.requestJson<T>('post', args);\n }\n\n putJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n putJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n putJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n putJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: ZodType,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs(arg1, arg2, arg3);\n return this.requestJson<T>('put', args);\n }\n\n patchJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n patchJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n patchJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n patchJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs(arg1, arg2, arg3);\n return this.requestJson<T>('patch', args);\n }\n\n deleteJson<T>(url: string, options?: JSONOpts): Promise<HttpResponse<T>>;\n deleteJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n deleteJson<T, Schema extends ZodType<T> = ZodType<T>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n deleteJson<T = unknown, Schema extends ZodType<T> = ZodType<T>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<T>> {\n const args = this.resolveArgs(arg1, arg2, arg3);\n return this.requestJson<T>('delete', args);\n }\n\n stream(url: string, options?: HttpOptions): NodeJS.ReadableStream {\n let combinedOptions: Merge<\n GotStreamOptions,\n SetRequired<InternalHttpOptions, 'method'>\n > = {\n ...this.options,\n hostType: this.hostType,\n ...options,\n method: 'get',\n };\n\n const resolvedUrl = this.resolveUrl(url, options).toString();\n\n applyDefaultHeaders(combinedOptions);\n\n // v8 ignore else -- TODO: add test #40625\n if (\n isUndefined(combinedOptions.readOnly) &&\n ['head', 'get'].includes(combinedOptions.method)\n ) {\n combinedOptions.readOnly = true;\n }\n\n const hostRule = findMatchingRule(url, combinedOptions);\n combinedOptions = applyHostRule(resolvedUrl, combinedOptions, hostRule);\n if (combinedOptions.enabled === false) {\n throw new Error(HOST_DISABLED);\n }\n combinedOptions = applyAuthorization(combinedOptions);\n\n return stream(resolvedUrl, this._normalizeOptions(combinedOptions));\n }\n\n async getToml<Schema extends ZodType<any, any, any>>(\n url: string,\n schema?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getToml<Schema extends ZodType<any, any, any>>(\n url: string,\n options: JSONOpts,\n schema: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>>;\n async getToml<Schema extends ZodType<any, any, any>>(\n arg1: string,\n arg2?: JSONOpts | Schema,\n arg3?: Schema,\n ): Promise<HttpResponse<z.infer<Schema>>> {\n const { url, schema, httpOptions } = this.resolveArgs<z.infer<Schema>>(\n arg1,\n arg2,\n arg3,\n );\n\n const opts: InternalHttpOptions = {\n ...httpOptions,\n method: 'get',\n headers: {\n 'Content-Type': 'application/toml',\n ...httpOptions?.headers,\n },\n };\n\n const res = await this.getText(url, opts);\n if (schema) {\n res.body = await Toml.pipe(schema).parseAsync(res.body);\n } else {\n res.body = (await Toml.parseAsync(res.body)) as z.infer<Schema>;\n }\n\n return res;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAgEA,SAAgB,oBAAoB,SAAwB;CAC1D,MAAM,kBAAkB,IAAI;AAC5B,SAAQ,UAAU;EAChB,GAAG,QAAQ;EACX,cACE,aAAa,IAAI,YAAY,IAC7B,YAAY,gBAAgB;EAC/B;;AAGH,IAAsB,WAAtB,MAGE;CACA,AAAiB;CAEjB,IAAc,UAA8B;CAI5C,AAAU;CAEV,YAAY,UAAkB,UAAuB,EAAE,EAAE;AACvD,OAAK,WAAW;EAChB,MAAM,aAAa,QAAQ,CAAC,aAAa,SAAS,IAAI;AACtD,OAAK,UAAU,MACb,SACA;GACE,QAAQ;GACR,SAAS,EAAE,UAAU;GACrB,OAAO;IACL,iBAAiB,gBACf,KAAK,oBAAoB,YAAY;IACvC,OAAO;IACP,eAAe;IAChB;GACF,EACD,EAAE,mBAAmB,eAAe,CACrC;;CAoBH,MAAc,QACZ,YACA,aACgC;EAChC,MAAM,cAAc,KAAK,WAAW,YAAY,YAAY;EAC5D,MAAM,MAAM,YAAY,UAAU;AAElC,OAAK,eAAe,aAAa,YAAY;EAE7C,IAAI,UAAU,MACZ;GACE,GAAG,KAAK;GACR,UAAU,KAAK;GAChB,EACD,aACA,EAAE,mBAAmB,eAAe,CACrC;EAED,MAAM,SAAS,QAAQ,OAAO,aAAa;EAC3C,MAAM,eAAe,CAAC,QAAQ,MAAM,CAAC,SAAS,OAAO;AAErD,SAAO,MAAM,iBAAiB,OAAO,aAAa,CAAC,GAAG,MAAM;AAE5D,sBAAoB,QAAQ;AAE5B,MAAI,YAAY,QAAQ,SAAS,IAAI,aACnC,SAAQ,WAAW;EAGrB,MAAM,WAAW,iBAAiB,KAAK,QAAQ;AAC/C,YAAU,cAAc,KAAK,SAAS,SAAS;AAC/C,MAAI,QAAQ,YAAY,OAAO;AAC7B,UAAO,MAAM,kDAAkD,MAAM;AACrE,SAAM,IAAI,MAAM,cAAc;;AAEhC,YAAU,mBAAmB,QAAQ;EACrC,MAAM,UAAU,QAAQ,WAAW;AACnC,UAAQ,UAAU;EAElB,IAAI;AACJ,MAAI,gBAAgB,QAAQ,cAC1B,iBAAgB,QAAQ;EAG1B,MAAM,cACJ,CAAC,QAAQ,IAAI,oCACb,CAAC,iBACD,QAAQ,aAAa,SACrB,eACI,KACE,OAAO,KAAK,UAAU;GACpB;GACA,SAAS,QAAQ;GACjB;GACD,CAAC,GACH,GACD;EAEN,IAAI,aAAoD;AAGxD,MAAI,aAAa;AACf,gBAAaA,IAAa,YAAY;;AAGtC,OAAI,cAAc,CAAC,cACjB,wBAAuB,MAAM,IAAI;;;AAKrC,MAAI,CAAC,YAAY;AACf,OAAI,cACF,OAAM,cAAc,gBAAgB,QAAQ,KAAK,QAAQ;GAG3D,MAAM,YAAY,KAAK,KAAK;GAC5B,MAAM,WAAoB,YAAY;IACpC,IAAI;AACJ,QAAI,aACF,eAAc,MAAM,YAClB,GAAG,QAAQ,OAAO,GAAG,OACrB,cACA,UAAU,EACX;AAEH,QAAI;KACF,MAAM,iBAAiB,MAAM,eAAe,aAC1C,QAAQ,QACR,IACD;AACD,SAAI,eACF,QAAO;KAGT,MAAM,UAAU,KAAK,KAAK,GAAG;AAC7B,YAAO,MAAM,KAAK,KAAK,kBAAkB,QAAQ,EAAE,EACjD,SACD,CAAC;cACM;AACR,oBAAe;;;GAInB,MAAM,WAAW,YAAY,IAAI;GACjC,MAAM,gBAAgB,iBAAiB,SAAS,IAAI,SAAS,GAAG;GAEhE,MAAM,QAAQ,SAAS,IAAI;GAC3B,MAAM,aAAa,cAAc,MAAM,IAAI,cAAc,GAAG;GAE5D,MAAM,EAAE,gBAAgB,OAAO;AAC/B,gBAAa,cAAc,YAAY,KAAK,eAAe,cAAc;AAEzE,OAAI,YACF,KAAa,aAAa,WAAW;;AAIzC,MAAI;GACF,MAAM,MAAM,MAAM;GAElB,MAAM,UAAU,aAAa,KADN,CAAC,CAAC,eAAe,IAAI,eAAe,IACV;AACjD,WAAQ,gBAAgB,CAAC,CAAC,SAAS,SAAS;AAE5C,OAAI,cACF,QAAO,MAAM,cAAc,mBAAmB,QAAQ,KAAK,QAAQ;AAGrE,UAAO;WACA,KAAK;GACZ,MAAM,EAAE,cAAc,2BAA2B;AACjD,OAAI,gBAAgB,CAAC,wBAAwB,SAAS,IAAI,WAAW,CACnE,OAAM,IAAI,kBAAkB,IAAI;GAGlC,MAAM,gBAAgB,MAAM,eAAe,aACzC,QACA,KACA,KACD;AACD,OAAI,eAAe;AACjB,WAAO,MACL,EAAE,KAAK,EACP,oDAAoD,MACrD;AACD,WAAO;;AAGT,QAAK,YAAY,YAAY,aAAa,IAAI;;;CAIlD,AAAQ,kBAAqC,SAAe;AAC1D,SAAO,UAAU,SAAS,KAAK,cAAc,CAAC;;;;;;CAOhD,AAAU,eAAkC;AAC1C,SAAO;GAAC;GAAW;GAAiB;GAAW;;CAGjD,AAAU,eAAe,MAAW,UAAqC;CAIzE,AAAU,YACR,MACA,cACA,KACO;AACP,QAAM;;CAGR,WACE,YACA,UAAmC,QAC9B;EACL,IAAI,MAAM;AAEV,MAAI,eAAe,IAEjB,QAAO;EAGT,MAAM,UAAU,SAAS,WAAW,KAAK;AACzC,MAAI,QACF,OAAM,eAAe,SAAS,IAAI;EAGpC,MAAM,YAAY,SAAS,IAAI;AAC/B,MAAI,CAAC,aAAa,CAAC,UAAU,UAAU,EAAE;AACvC,UAAO,MACL;IAAE,KAAK;IAAY;IAAS,aAAa;IAAK,EAC9C,kCACD;AACD,SAAM,IAAI,MAAM,cAAc;;AAEhC,SAAO;;CAGT,AAAU,oBAAoB,EAAE,iBAAsC;AACpE,SAAO;;CAGT,IACE,KACA,UAAuB,EAAE,EACe;AACxC,SAAO,KAAK,QAAQ,KAAK,QAAQ;;CAGnC,KAAK,KAAa,UAAuB,EAAE,EAAgC;AAEzE,SAAO,KAAK,QAAQ,KAAK;GACvB,GAAG;GACH,cAAc;GACd,QAAQ;GACT,CAAC;;CAGJ,QACE,KACA,UAAuB,EAAE,EACM;AAC/B,SAAO,KAAK,QAAQ,KAAK;GAAE,GAAG;GAAS,cAAc;GAAQ,CAAC;;CAGhE,UACE,KACA,UAAuB,EAAE,EACM;AAC/B,SAAO,KAAK,QAAQ,KAAK;GAAE,GAAG;GAAS,cAAc;GAAU,CAAC;;CAGlE,AAAU,kBACR,QACA,EAAE,KAAK,aAAa,kBACS;EAC7B,MAAM,EAAE,MAAM,MAAM,GAAG,gBAAgB,EAAE,GAAG,gBAAgB;EAC5D,MAAM,OAA4B;GAChC,GAAG;GACH;GACD;AAED,OAAK,UAAU;GACb,QAAQ;GACR,GAAG,KAAK;GACT;AACD,MAAI,KACF,MAAK,OAAO;AAEd,SAAO,KAAK,QAAc,KAAK;GAAE,GAAG;GAAM,cAAc;GAAQ,CAAC;;CAGnE,MAAc,YACZ,QACA,SAC6B;EAC7B,MAAM,MAAM,MAAM,KAAK,kBAAwB,QAAQ,QAAQ;AAE/D,MAAI,QAAQ,OACV,KAAI,OAAO,MAAM,QAAQ,OAAO,WAAW,IAAI,KAAK;AAGtD,SAAO;;CAGT,AAAQ,YACN,MACA,MACA,MACqC;EACrC,MAAM,MAA2C,EAAE,KAAK,MAAM;AAE9D,MAAI,gBAAgB,QAClB,KAAI,SAAS;WACJ,KACT,KAAI,cAAc;AAGpB,MAAI,KACF,KAAI,SAAS;AAGf,SAAO;;CAGT,MAAM,SAAS,KAAa,SAAuC;EACjE,MAAM,MAAM,WAAW,EAAE;AACzB,SAAO,MAAM,KAAK,QAAQ,KAAK;GAC7B,SAAS,EACP,QAAQ,cACT;GACD,GAAG;GACJ,CAAC;;;;;CAMJ,MAAM,iBACJ,KACA,SAC6B;EAC7B,MAAM,MAAM,MAAM,KAAK,QAAQ,KAAK,QAAQ;EAC5C,MAAM,OAAO,gBAAsB,IAAI,KAAK;AAC5C,SAAO;GAAE,GAAG;GAAK;GAAM;;CAYzB,MAAM,QACJ,MACA,MACA,MACwC;EACxC,MAAM,MAAM;EACZ,IAAI;EACJ,IAAI;AACJ,MAAI,MAAM;AACR,YAAS;AACT,iBAAc;QAEd,UAAS;EAGX,MAAM,OAA4B;GAChC,GAAG;GACH,QAAQ;GACT;EAED,MAAM,MAAM,MAAM,KAAK,QAAQ,KAAK,KAAK;EACzC,MAAM,OAAO,MAAM,OAAO,WAAW,gBAAgB,IAAI,KAAK,CAAC;AAC/D,SAAO;GAAE,GAAG;GAAK;GAAM;;CAezB,YAIE,MACA,MACA,MACkC;EAClC,MAAM,MAAM;EACZ,IAAI;EACJ,IAAI;AACJ,MAAI,MAAM;AACR,YAAS;AACT,iBAAc;QAEd,UAAS;EAGX,IAAI;AACJ,MAAI,YACF,OAAM,OAAO,KAAK,KAAK,QAAQ,KAAK,aAAa,OAAO,CAAC;MAEzD,OAAM,OAAO,KAAK,KAAK,QAAQ,KAAK,OAAO,CAAC;AAG9C,SAAO,IAAI,WAAW,aAAa,OAAO,GAAG,SAAS,KAAK,CAAC;;;;;;;;;;;;CAa9D,iBACE,KACA,SAC6B;AAC7B,SAAO,KAAK,YAAkB,OAAO;GAAE;GAAK,aAAa;GAAS,CAAC;;CAmBrE,QACE,MACA,MACA,MACwC;EACxC,MAAM,OAAO,KAAK,YAA6B,MAAM,MAAM,KAAK;AAChE,SAAO,KAAK,YAA6B,OAAO,KAAK;;CAmBvD,YACE,MACA,MACA,MACkC;EAClC,MAAM,OAAO,KAAK,YAAkB,MAAM,MAAM,KAAK;AACrD,SAAO,OAAO,KAAK,KAAK,YAAkB,OAAO,KAAK,CAAC,CAAC,WACrD,aAAa,OAAO,GAAG,SAAS,KAAK,CACvC;;;;;CAMH,SAAS,KAAa,aAAsD;AAC1E,SAAO,KAAK,YAAmB,QAAQ;GAAE;GAAK;GAAa,CAAC;;CAa9D,SACE,MACA,MACA,MAC0B;EAC1B,MAAM,OAAO,KAAK,YAAY,MAAM,MAAM,KAAK;AAC/C,SAAO,KAAK,YAAe,QAAQ,KAAK;;CAa1C,QACE,MACA,MACA,MAC0B;EAC1B,MAAM,OAAO,KAAK,YAAY,MAAM,MAAM,KAAK;AAC/C,SAAO,KAAK,YAAe,OAAO,KAAK;;CAazC,UACE,MACA,MACA,MAC0B;EAC1B,MAAM,OAAO,KAAK,YAAY,MAAM,MAAM,KAAK;AAC/C,SAAO,KAAK,YAAe,SAAS,KAAK;;CAa3C,WACE,MACA,MACA,MAC0B;EAC1B,MAAM,OAAO,KAAK,YAAY,MAAM,MAAM,KAAK;AAC/C,SAAO,KAAK,YAAe,UAAU,KAAK;;CAG5C,OAAO,KAAa,SAA8C;EAChE,IAAI,kBAGA;GACF,GAAG,KAAK;GACR,UAAU,KAAK;GACf,GAAG;GACH,QAAQ;GACT;EAED,MAAM,cAAc,KAAK,WAAW,KAAK,QAAQ,CAAC,UAAU;AAE5D,sBAAoB,gBAAgB;;AAGpC,MACE,YAAY,gBAAgB,SAAS,IACrC,CAAC,QAAQ,MAAM,CAAC,SAAS,gBAAgB,OAAO,CAEhD,iBAAgB,WAAW;EAG7B,MAAM,WAAW,iBAAiB,KAAK,gBAAgB;AACvD,oBAAkB,cAAc,aAAa,iBAAiB,SAAS;AACvE,MAAI,gBAAgB,YAAY,MAC9B,OAAM,IAAI,MAAM,cAAc;AAEhC,oBAAkB,mBAAmB,gBAAgB;AAErD,SAAO,OAAO,aAAa,KAAK,kBAAkB,gBAAgB,CAAC;;CAYrE,MAAM,QACJ,MACA,MACA,MACwC;EACxC,MAAM,EAAE,KAAK,QAAQ,gBAAgB,KAAK,YACxC,MACA,MACA,KACD;EAED,MAAM,OAA4B;GAChC,GAAG;GACH,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,GAAG,aAAa;IACjB;GACF;EAED,MAAM,MAAM,MAAM,KAAK,QAAQ,KAAK,KAAK;AACzC,MAAI,OACF,KAAI,OAAO,MAAM,KAAK,KAAK,OAAO,CAAC,WAAW,IAAI,KAAK;MAEvD,KAAI,OAAQ,MAAM,KAAK,WAAW,IAAI,KAAK;AAG7C,SAAO"}
@@ -13,17 +13,28 @@ type GotBufferOptions = OptionsOfBufferResponseBody & GotExtraOptions;
13
13
  type GotTextOptions = OptionsOfTextResponseBody & GotExtraOptions;
14
14
  type GotJSONOptions = OptionsOfJSONResponseBody & GotExtraOptions;
15
15
  type GotStreamOptions = Options & GotExtraOptions;
16
+ /**
17
+ * Renovate extra options.
18
+ */
16
19
  interface GotExtraOptions {
17
20
  abortOnError?: boolean;
18
21
  abortIgnoreStatusCodes?: number[];
19
- timeout?: number;
20
22
  token?: string;
21
23
  hostType?: string;
22
24
  enabled?: boolean;
23
25
  memCache?: boolean;
24
26
  noAuth?: boolean;
25
27
  context?: GotContextOptions;
28
+ /**
29
+ * Got request timeout, overrides got interface.
30
+ * Do not delete in `normalizeGotOptions`.
31
+ */
32
+ timeout?: number;
26
33
  }
34
+ /**
35
+ * Renovate extra options that are not part of `got` options.
36
+ */
37
+ declare const GotExtraOptionKeys: (keyof GotExtraOptions)[];
27
38
  type OutgoingHttpHeaders = Record<string, string | string[] | undefined>;
28
39
  type GraphqlVariables = Record<string, unknown>;
29
40
  interface GraphqlOptions {
@@ -36,6 +47,10 @@ interface GraphqlOptions {
36
47
  token?: string;
37
48
  readOnly?: boolean;
38
49
  }
50
+ /**
51
+ * Renovate http options that are partly not part of `got` options.
52
+ * Remember to delete these in `normalizeGotOptions` before passing to `got`.
53
+ */
39
54
  interface HttpOptions {
40
55
  body?: any;
41
56
  username?: string;
@@ -75,5 +90,5 @@ interface ConcurrencyLimitRule {
75
90
  }
76
91
  type SafeJsonError = RequestError | ZodError | EmptyResultError;
77
92
  //#endregion
78
- export { ConcurrencyLimitRule, GotBufferOptions, GotContextOptions, GotExtraOptions, GotJSONOptions, GotOptions, GotStreamOptions, GotTask, GotTextOptions, GraphqlOptions, GraphqlVariables, HttpHeaders, HttpMethod, HttpOptions, HttpResponse, OutgoingHttpHeaders, SafeJsonError, Task, ThrottleLimitRule };
93
+ export { ConcurrencyLimitRule, GotBufferOptions, GotContextOptions, GotExtraOptionKeys, GotExtraOptions, GotJSONOptions, GotOptions, GotStreamOptions, GotTask, GotTextOptions, GraphqlOptions, GraphqlVariables, HttpHeaders, HttpMethod, HttpOptions, HttpResponse, OutgoingHttpHeaders, SafeJsonError, Task, ThrottleLimitRule };
79
94
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1,17 @@
1
- export { };
1
+ //#region lib/util/http/types.ts
2
+ /**
3
+ * Renovate extra options that are not part of `got` options.
4
+ */
5
+ const GotExtraOptionKeys = [
6
+ "abortOnError",
7
+ "abortIgnoreStatusCodes",
8
+ "enabled",
9
+ "hostType",
10
+ "memCache",
11
+ "noAuth",
12
+ "token"
13
+ ];
14
+
15
+ //#endregion
16
+ export { GotExtraOptionKeys };
17
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../lib/util/http/types.ts"],"sourcesContent":["import type { IncomingHttpHeaders } from 'node:http';\nimport type {\n Options,\n OptionsOfBufferResponseBody,\n OptionsOfJSONResponseBody,\n OptionsOfTextResponseBody,\n RequestError,\n} from 'got';\nimport type { ZodError } from 'zod/v3';\nimport type { HttpCacheProvider } from './cache/types.ts';\nimport type { EmptyResultError } from './errors.ts';\n\nexport type GotContextOptions = {\n authType?: string;\n} & Record<string, unknown>;\n\n// TODO: Move options to context\nexport type GotOptions = GotBufferOptions | GotTextOptions | GotJSONOptions;\nexport type GotBufferOptions = OptionsOfBufferResponseBody & GotExtraOptions;\nexport type GotTextOptions = OptionsOfTextResponseBody & GotExtraOptions;\nexport type GotJSONOptions = OptionsOfJSONResponseBody & GotExtraOptions;\n\nexport type GotStreamOptions = Options & GotExtraOptions;\n\n/**\n * Renovate extra options.\n */\nexport interface GotExtraOptions {\n abortOnError?: boolean;\n abortIgnoreStatusCodes?: number[];\n\n token?: string;\n hostType?: string;\n enabled?: boolean;\n memCache?: boolean;\n noAuth?: boolean;\n context?: GotContextOptions;\n\n /**\n * Got request timeout, overrides got interface.\n * Do not delete in `normalizeGotOptions`.\n */\n timeout?: number;\n}\n\n/**\n * Renovate extra options that are not part of `got` options.\n */\nexport const GotExtraOptionKeys: (keyof GotExtraOptions)[] = [\n 'abortOnError',\n 'abortIgnoreStatusCodes',\n 'enabled',\n 'hostType',\n 'memCache',\n 'noAuth',\n 'token',\n];\n\nexport type OutgoingHttpHeaders = Record<string, string | string[] | undefined>;\n\nexport type GraphqlVariables = Record<string, unknown>;\n\nexport interface GraphqlOptions {\n variables?: GraphqlVariables;\n paginate?: boolean;\n count?: number;\n limit?: number;\n cursor?: string | null;\n acceptHeader?: string;\n token?: string;\n readOnly?: boolean;\n}\n\n/**\n * Renovate http options that are partly not part of `got` options.\n * Remember to delete these in `normalizeGotOptions` before passing to `got`.\n */\nexport interface HttpOptions {\n body?: any;\n username?: string;\n password?: string;\n baseUrl?: string;\n headers?: OutgoingHttpHeaders;\n\n /**\n * Do not use authentication\n */\n noAuth?: boolean;\n\n throwHttpErrors?: boolean;\n\n token?: string;\n memCache?: boolean;\n cacheProvider?: HttpCacheProvider;\n readOnly?: boolean;\n}\n\nexport interface HttpHeaders extends IncomingHttpHeaders {\n link?: string | undefined;\n}\n\nexport type HttpMethod = 'get' | 'post' | 'put' | 'patch' | 'delete' | 'head';\n\nexport interface HttpResponse<T = string> {\n statusCode: number;\n body: T;\n headers: HttpHeaders;\n authorization?: boolean;\n cached?: boolean;\n}\n\nexport type Task<T> = () => Promise<T>;\nexport type GotTask<T = unknown> = Task<HttpResponse<T>>;\n\nexport interface ThrottleLimitRule {\n matchHost: string;\n throttleMs: number;\n}\n\nexport interface ConcurrencyLimitRule {\n matchHost: string;\n concurrency: number;\n}\n\nexport type SafeJsonError = RequestError | ZodError | EmptyResultError;\n"],"mappings":";;;;AAgDA,MAAa,qBAAgD;CAC3D;CACA;CACA;CACA;CACA;CACA;CACA;CACD"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "renovate",
3
3
  "description": "Automated dependency updates. Flexible so you don't need to be.",
4
- "version": "43.25.3",
4
+ "version": "43.25.5",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -1,7 +1,7 @@
1
1
  {
2
- "title": "JSON schema for Renovate 43.25.3 config files (https://renovatebot.com/)",
2
+ "title": "JSON schema for Renovate 43.25.5 config files (https://renovatebot.com/)",
3
3
  "$schema": "http://json-schema.org/draft-07/schema#",
4
- "x-renovate-version": "43.25.3",
4
+ "x-renovate-version": "43.25.5",
5
5
  "allowComments": true,
6
6
  "type": "object",
7
7
  "properties": {