renovate 41.24.0 → 41.25.1

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.
@@ -4,6 +4,7 @@ exports.parseFileConfig = parseFileConfig;
4
4
  const tslib_1 = require("tslib");
5
5
  const json_dup_key_validator_1 = tslib_1.__importDefault(require("json-dup-key-validator"));
6
6
  const json5_1 = tslib_1.__importDefault(require("json5"));
7
+ const strip_json_comments_1 = tslib_1.__importDefault(require("strip-json-comments"));
7
8
  const upath_1 = tslib_1.__importDefault(require("upath"));
8
9
  const logger_1 = require("../logger");
9
10
  const common_1 = require("../util/common");
@@ -25,8 +26,9 @@ function parseFileConfig(fileName, fileContents) {
25
26
  }
26
27
  }
27
28
  else {
29
+ const jsonString = (0, strip_json_comments_1.default)(fileContents);
28
30
  let allowDuplicateKeys = true;
29
- let jsonValidationError = json_dup_key_validator_1.default.validate(fileContents, allowDuplicateKeys);
31
+ let jsonValidationError = json_dup_key_validator_1.default.validate(jsonString, allowDuplicateKeys);
30
32
  if (jsonValidationError) {
31
33
  const validationError = 'Invalid JSON (parsing failed)';
32
34
  const validationMessage = jsonValidationError;
@@ -37,7 +39,7 @@ function parseFileConfig(fileName, fileContents) {
37
39
  };
38
40
  }
39
41
  allowDuplicateKeys = false;
40
- jsonValidationError = json_dup_key_validator_1.default.validate(fileContents, allowDuplicateKeys);
42
+ jsonValidationError = json_dup_key_validator_1.default.validate(jsonString, allowDuplicateKeys);
41
43
  if (jsonValidationError) {
42
44
  const validationError = 'Duplicate keys in JSON';
43
45
  const validationMessage = JSON.stringify(jsonValidationError);
@@ -1 +1 @@
1
- {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../lib/config/parse.ts"],"names":[],"mappings":";;AAMA,0CAoEC;;AA1ED,4FAAmD;AACnD,0DAA0B;AAC1B,0DAA0B;AAC1B,sCAAmC;AACnC,2CAA2C;AAE3C,SAAgB,eAAe,CAC7B,QAAgB,EAChB,YAAoB;IAIpB,MAAM,QAAQ,GAAG,eAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,eAAK,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QACtE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,eAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,0BAA0B,CAAC,CAAC;YACrE,MAAM,eAAe,GAAG,gCAAgC,CAAC;YACzD,MAAM,iBAAiB,GAAG,wBAAwB,GAAG,CAAC,OAAO,CAAC,UAAU,CACtE,GAAG,EACH,GAAG,CACJ,IAAI,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,eAAe;gBACf,iBAAiB;aAClB,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,kBAAkB,GAAG,IAAI,CAAC;QAC9B,IAAI,mBAAmB,GAAG,gCAAa,CAAC,QAAQ,CAC9C,YAAY,EACZ,kBAAkB,CACnB,CAAC;QACF,IAAI,mBAAmB,EAAE,CAAC;YACxB,MAAM,eAAe,GAAG,+BAA+B,CAAC;YACxD,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;YAC9C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,eAAe;gBACf,iBAAiB;aAClB,CAAC;QACJ,CAAC;QACD,kBAAkB,GAAG,KAAK,CAAC;QAC3B,mBAAmB,GAAG,gCAAa,CAAC,QAAQ,CAC1C,YAAY,EACZ,kBAAkB,CACnB,CAAC;QACF,IAAI,mBAAmB,EAAE,CAAC;YACxB,MAAM,eAAe,GAAG,wBAAwB,CAAC;YACjD,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAC9D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,eAAe;gBACf,iBAAiB;aAClB,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,cAAc,EAAE,IAAA,kBAAS,EAAC,YAAY,EAAE,QAAQ,CAAC;aAClD,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,eAAM,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,EAAE,+BAA+B,CAAC,CAAC;YAChE,MAAM,eAAe,GAAG,+BAA+B,CAAC;YACxD,MAAM,iBAAiB,GAAG,wBAAwB,GAAG,CAAC,OAAO,CAAC,UAAU,CACtE,GAAG,EACH,GAAG,CACJ,IAAI,CAAC;YACN,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC;QAChE,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import jsonValidator from 'json-dup-key-validator';\nimport JSON5 from 'json5';\nimport upath from 'upath';\nimport { logger } from '../logger';\nimport { parseJson } from '../util/common';\n\nexport function parseFileConfig(\n fileName: string,\n fileContents: string,\n):\n | { success: true; parsedContents: unknown }\n | { success: false; validationError: string; validationMessage: string } {\n const fileType = upath.extname(fileName);\n\n if (fileType === '.json5') {\n try {\n return { success: true, parsedContents: JSON5.parse(fileContents) };\n } catch (err) {\n logger.debug({ fileName, fileContents }, 'Error parsing JSON5 file');\n const validationError = 'Invalid JSON5 (parsing failed)';\n const validationMessage = `JSON5.parse error: \\`${err.message.replaceAll(\n '`',\n \"'\",\n )}\\``;\n return {\n success: false,\n validationError,\n validationMessage,\n };\n }\n } else {\n let allowDuplicateKeys = true;\n let jsonValidationError = jsonValidator.validate(\n fileContents,\n allowDuplicateKeys,\n );\n if (jsonValidationError) {\n const validationError = 'Invalid JSON (parsing failed)';\n const validationMessage = jsonValidationError;\n return {\n success: false,\n validationError,\n validationMessage,\n };\n }\n allowDuplicateKeys = false;\n jsonValidationError = jsonValidator.validate(\n fileContents,\n allowDuplicateKeys,\n );\n if (jsonValidationError) {\n const validationError = 'Duplicate keys in JSON';\n const validationMessage = JSON.stringify(jsonValidationError);\n return {\n success: false,\n validationError,\n validationMessage,\n };\n }\n try {\n return {\n success: true,\n parsedContents: parseJson(fileContents, fileName),\n };\n } catch (err) {\n logger.debug({ fileContents }, 'Error parsing renovate config');\n const validationError = 'Invalid JSON (parsing failed)';\n const validationMessage = `JSON.parse error: \\`${err.message.replaceAll(\n '`',\n \"'\",\n )}\\``;\n return { success: false, validationError, validationMessage };\n }\n }\n}\n"]}
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../lib/config/parse.ts"],"names":[],"mappings":";;AAOA,0CAqEC;;AA5ED,4FAAmD;AACnD,0DAA0B;AAC1B,sFAAoD;AACpD,0DAA0B;AAC1B,sCAAmC;AACnC,2CAA2C;AAE3C,SAAgB,eAAe,CAC7B,QAAgB,EAChB,YAAoB;IAIpB,MAAM,QAAQ,GAAG,eAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEzC,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC;YACH,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,eAAK,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,CAAC;QACtE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,eAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,EAAE,0BAA0B,CAAC,CAAC;YACrE,MAAM,eAAe,GAAG,gCAAgC,CAAC;YACzD,MAAM,iBAAiB,GAAG,wBAAwB,GAAG,CAAC,OAAO,CAAC,UAAU,CACtE,GAAG,EACH,GAAG,CACJ,IAAI,CAAC;YACN,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,eAAe;gBACf,iBAAiB;aAClB,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,GAAG,IAAA,6BAAiB,EAAC,YAAY,CAAC,CAAC;QACnD,IAAI,kBAAkB,GAAG,IAAI,CAAC;QAC9B,IAAI,mBAAmB,GAAG,gCAAa,CAAC,QAAQ,CAC9C,UAAU,EACV,kBAAkB,CACnB,CAAC;QACF,IAAI,mBAAmB,EAAE,CAAC;YACxB,MAAM,eAAe,GAAG,+BAA+B,CAAC;YACxD,MAAM,iBAAiB,GAAG,mBAAmB,CAAC;YAC9C,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,eAAe;gBACf,iBAAiB;aAClB,CAAC;QACJ,CAAC;QACD,kBAAkB,GAAG,KAAK,CAAC;QAC3B,mBAAmB,GAAG,gCAAa,CAAC,QAAQ,CAC1C,UAAU,EACV,kBAAkB,CACnB,CAAC;QACF,IAAI,mBAAmB,EAAE,CAAC;YACxB,MAAM,eAAe,GAAG,wBAAwB,CAAC;YACjD,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;YAC9D,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,eAAe;gBACf,iBAAiB;aAClB,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,cAAc,EAAE,IAAA,kBAAS,EAAC,YAAY,EAAE,QAAQ,CAAC;aAClD,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,eAAM,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,EAAE,+BAA+B,CAAC,CAAC;YAChE,MAAM,eAAe,GAAG,+BAA+B,CAAC;YACxD,MAAM,iBAAiB,GAAG,wBAAwB,GAAG,CAAC,OAAO,CAAC,UAAU,CACtE,GAAG,EACH,GAAG,CACJ,IAAI,CAAC;YACN,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC;QAChE,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import jsonValidator from 'json-dup-key-validator';\nimport JSON5 from 'json5';\nimport stripJsonComments from 'strip-json-comments';\nimport upath from 'upath';\nimport { logger } from '../logger';\nimport { parseJson } from '../util/common';\n\nexport function parseFileConfig(\n fileName: string,\n fileContents: string,\n):\n | { success: true; parsedContents: unknown }\n | { success: false; validationError: string; validationMessage: string } {\n const fileType = upath.extname(fileName);\n\n if (fileType === '.json5') {\n try {\n return { success: true, parsedContents: JSON5.parse(fileContents) };\n } catch (err) {\n logger.debug({ fileName, fileContents }, 'Error parsing JSON5 file');\n const validationError = 'Invalid JSON5 (parsing failed)';\n const validationMessage = `JSON5.parse error: \\`${err.message.replaceAll(\n '`',\n \"'\",\n )}\\``;\n return {\n success: false,\n validationError,\n validationMessage,\n };\n }\n } else {\n const jsonString = stripJsonComments(fileContents);\n let allowDuplicateKeys = true;\n let jsonValidationError = jsonValidator.validate(\n jsonString,\n allowDuplicateKeys,\n );\n if (jsonValidationError) {\n const validationError = 'Invalid JSON (parsing failed)';\n const validationMessage = jsonValidationError;\n return {\n success: false,\n validationError,\n validationMessage,\n };\n }\n allowDuplicateKeys = false;\n jsonValidationError = jsonValidator.validate(\n jsonString,\n allowDuplicateKeys,\n );\n if (jsonValidationError) {\n const validationError = 'Duplicate keys in JSON';\n const validationMessage = JSON.stringify(jsonValidationError);\n return {\n success: false,\n validationError,\n validationMessage,\n };\n }\n try {\n return {\n success: true,\n parsedContents: parseJson(fileContents, fileName),\n };\n } catch (err) {\n logger.debug({ fileContents }, 'Error parsing renovate config');\n const validationError = 'Invalid JSON (parsing failed)';\n const validationMessage = `JSON.parse error: \\`${err.message.replaceAll(\n '`',\n \"'\",\n )}\\``;\n return { success: false, validationError, validationMessage };\n }\n }\n}\n"]}
@@ -86,6 +86,7 @@
86
86
  "cake": "https://github.com/cake-build/cake",
87
87
  "cake-issues": "https://github.com/cake-contrib/Cake.Issues",
88
88
  "capacitor": "https://github.com/ionic-team/capacitor",
89
+ "cedar": "https://github.com/cedarjs/cedar/",
89
90
  "chakra-ui": "https://github.com/chakra-ui/chakra-ui",
90
91
  "chromely": "https://github.com/chromelyapps/Chromely",
91
92
  "citation-js": "https://github.com/citation-js/citation-js",
@@ -47,7 +47,7 @@ class ApiCache {
47
47
  ? luxon_1.DateTime.fromISO(oldItem.updated_at)
48
48
  : null;
49
49
  if (!(0, dequal_1.dequal)(oldItem, newItem)) {
50
- logger_1.logger.debug(`PR cache: updating item ${number}`);
50
+ logger_1.logger.trace(`PR cache: updating item ${number}`);
51
51
  items[number] = newItem;
52
52
  }
53
53
  needNextPage = itemOldTime ? itemOldTime < itemNewTime : true;
@@ -1 +1 @@
1
- {"version":3,"file":"api-cache.js","sourceRoot":"","sources":["../../../../lib/modules/platform/github/api-cache.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAChC,iCAAiC;AACjC,4CAAyC;AAGzC,MAAa,QAAQ;IACC;IAApB,YAAoB,KAAsB;QAAtB,UAAK,GAAL,KAAK,CAAiB;IAAG,CAAC;IAE9C,QAAQ;QACN,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,IAAO;QAChB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACvC,CAAC;IAED;;;;;;;;;OASG;IACH,SAAS,CAAC,IAAS;QACjB,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC7B,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAElC,IAAI,YAAY,GAAG,IAAI,CAAC;QAExB,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YAE9B,MAAM,WAAW,GAAG,gBAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,WAAW,GAAG,OAAO,EAAE,UAAU;gBACrC,CAAC,CAAC,gBAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;gBACtC,CAAC,CAAC,IAAI,CAAC;YAET,IAAI,CAAC,IAAA,eAAM,EAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC9B,eAAM,CAAC,KAAK,CAAC,2BAA2B,MAAM,EAAE,CAAC,CAAC;gBAClD,KAAK,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;YAC1B,CAAC;YAED,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;YAE9D,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,gBAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1E,IAAI,CAAC,YAAY,IAAI,WAAW,GAAG,YAAY,EAAE,CAAC;gBAChD,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;YACpC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;QAEvC,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AAhED,4BAgEC","sourcesContent":["import { dequal } from 'dequal';\nimport { DateTime } from 'luxon';\nimport { logger } from '../../../logger';\nimport type { ApiPageCache, ApiPageItem } from './types';\n\nexport class ApiCache<T extends ApiPageItem> {\n constructor(private cache: ApiPageCache<T>) {}\n\n getItems(): T[] {\n const items = Object.values(this.cache.items);\n return items;\n }\n\n getItem(number: number): T | null {\n return this.cache.items[number] ?? null;\n }\n\n /**\n * It intentionally doesn't alter `lastModified` cache field.\n *\n * The point is to allow cache modifications during run, but\n * force fetching and refreshing of modified items next run.\n */\n updateItem(item: T): void {\n this.cache.items[item.number] = item;\n }\n\n /**\n * Copies items from `page` to `cache`.\n * Updates internal cache timestamp.\n *\n * @param cache Cache object\n * @param page List of cacheable items, sorted by `updated_at` field\n * starting from the most recently updated.\n * @returns `true` when the next page is likely to contain fresh items,\n * otherwise `false`.\n */\n reconcile(page: T[]): boolean {\n const { items } = this.cache;\n let { lastModified } = this.cache;\n\n let needNextPage = true;\n\n for (const newItem of page) {\n const number = newItem.number;\n const oldItem = items[number];\n\n const itemNewTime = DateTime.fromISO(newItem.updated_at);\n const itemOldTime = oldItem?.updated_at\n ? DateTime.fromISO(oldItem.updated_at)\n : null;\n\n if (!dequal(oldItem, newItem)) {\n logger.debug(`PR cache: updating item ${number}`);\n items[number] = newItem;\n }\n\n needNextPage = itemOldTime ? itemOldTime < itemNewTime : true;\n\n const cacheOldTime = lastModified ? DateTime.fromISO(lastModified) : null;\n if (!cacheOldTime || itemNewTime > cacheOldTime) {\n lastModified = newItem.updated_at;\n }\n }\n\n this.cache.lastModified = lastModified;\n\n return needNextPage;\n }\n}\n"]}
1
+ {"version":3,"file":"api-cache.js","sourceRoot":"","sources":["../../../../lib/modules/platform/github/api-cache.ts"],"names":[],"mappings":";;;AAAA,mCAAgC;AAChC,iCAAiC;AACjC,4CAAyC;AAGzC,MAAa,QAAQ;IACC;IAApB,YAAoB,KAAsB;QAAtB,UAAK,GAAL,KAAK,CAAiB;IAAG,CAAC;IAE9C,QAAQ;QACN,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,CAAC,MAAc;QACpB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,IAAO;QAChB,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACvC,CAAC;IAED;;;;;;;;;OASG;IACH,SAAS,CAAC,IAAS;QACjB,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAC7B,IAAI,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;QAElC,IAAI,YAAY,GAAG,IAAI,CAAC;QAExB,KAAK,MAAM,OAAO,IAAI,IAAI,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;YAC9B,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;YAE9B,MAAM,WAAW,GAAG,gBAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,WAAW,GAAG,OAAO,EAAE,UAAU;gBACrC,CAAC,CAAC,gBAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;gBACtC,CAAC,CAAC,IAAI,CAAC;YAET,IAAI,CAAC,IAAA,eAAM,EAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;gBAC9B,eAAM,CAAC,KAAK,CAAC,2BAA2B,MAAM,EAAE,CAAC,CAAC;gBAClD,KAAK,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;YAC1B,CAAC;YAED,YAAY,GAAG,WAAW,CAAC,CAAC,CAAC,WAAW,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;YAE9D,MAAM,YAAY,GAAG,YAAY,CAAC,CAAC,CAAC,gBAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC1E,IAAI,CAAC,YAAY,IAAI,WAAW,GAAG,YAAY,EAAE,CAAC;gBAChD,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;YACpC,CAAC;QACH,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,YAAY,CAAC;QAEvC,OAAO,YAAY,CAAC;IACtB,CAAC;CACF;AAhED,4BAgEC","sourcesContent":["import { dequal } from 'dequal';\nimport { DateTime } from 'luxon';\nimport { logger } from '../../../logger';\nimport type { ApiPageCache, ApiPageItem } from './types';\n\nexport class ApiCache<T extends ApiPageItem> {\n constructor(private cache: ApiPageCache<T>) {}\n\n getItems(): T[] {\n const items = Object.values(this.cache.items);\n return items;\n }\n\n getItem(number: number): T | null {\n return this.cache.items[number] ?? null;\n }\n\n /**\n * It intentionally doesn't alter `lastModified` cache field.\n *\n * The point is to allow cache modifications during run, but\n * force fetching and refreshing of modified items next run.\n */\n updateItem(item: T): void {\n this.cache.items[item.number] = item;\n }\n\n /**\n * Copies items from `page` to `cache`.\n * Updates internal cache timestamp.\n *\n * @param cache Cache object\n * @param page List of cacheable items, sorted by `updated_at` field\n * starting from the most recently updated.\n * @returns `true` when the next page is likely to contain fresh items,\n * otherwise `false`.\n */\n reconcile(page: T[]): boolean {\n const { items } = this.cache;\n let { lastModified } = this.cache;\n\n let needNextPage = true;\n\n for (const newItem of page) {\n const number = newItem.number;\n const oldItem = items[number];\n\n const itemNewTime = DateTime.fromISO(newItem.updated_at);\n const itemOldTime = oldItem?.updated_at\n ? DateTime.fromISO(oldItem.updated_at)\n : null;\n\n if (!dequal(oldItem, newItem)) {\n logger.trace(`PR cache: updating item ${number}`);\n items[number] = newItem;\n }\n\n needNextPage = itemOldTime ? itemOldTime < itemNewTime : true;\n\n const cacheOldTime = lastModified ? DateTime.fromISO(lastModified) : null;\n if (!cacheOldTime || itemNewTime > cacheOldTime) {\n lastModified = newItem.updated_at;\n }\n }\n\n this.cache.lastModified = lastModified;\n\n return needNextPage;\n }\n}\n"]}
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": "41.24.0",
4
+ "version": "41.25.1",
5
5
  "type": "commonjs",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -253,6 +253,7 @@
253
253
  "simple-git": "3.28.0",
254
254
  "slugify": "1.6.6",
255
255
  "source-map-support": "0.5.21",
256
+ "strip-json-comments": "5.0.2",
256
257
  "toml-eslint-parser": "0.10.0",
257
258
  "tslib": "2.8.1",
258
259
  "upath": "2.0.1",
@@ -327,7 +328,7 @@
327
328
  "eslint-plugin-import-x": "4.16.1",
328
329
  "eslint-plugin-promise": "7.2.1",
329
330
  "expect-more-jest": "5.5.0",
330
- "globals": "16.2.0",
331
+ "globals": "16.3.0",
331
332
  "graphql": "16.11.0",
332
333
  "husky": "9.1.7",
333
334
  "jest-extended": "6.0.0",
@@ -344,7 +345,7 @@
344
345
  "tsx": "4.20.3",
345
346
  "type-fest": "4.41.0",
346
347
  "typescript": "5.8.3",
347
- "typescript-eslint": "8.35.0",
348
+ "typescript-eslint": "8.35.1",
348
349
  "unified": "11.0.5",
349
350
  "vite": "6.3.5",
350
351
  "vite-tsconfig-paths": "5.1.4",