renovate 44.14.2 → 44.14.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/proxy.js +8 -0
- package/dist/proxy.js.map +1 -1
- package/dist/util/host-rules.d.ts +7 -1
- package/dist/util/host-rules.js +13 -2
- package/dist/util/host-rules.js.map +1 -1
- package/dist/util/sanitize.js.map +1 -1
- package/dist/workers/global/index.js +2 -0
- package/dist/workers/global/index.js.map +1 -1
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
package/dist/proxy.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { addSecretForSanitizing } from "./util/sanitize.js";
|
|
1
2
|
import { logger } from "./logger/index.js";
|
|
3
|
+
import { parseUrl } from "./util/url.js";
|
|
2
4
|
import { isNonEmptyString } from "@sindresorhus/is";
|
|
3
5
|
import { createGlobalProxyAgent } from "global-agent";
|
|
4
6
|
//#region lib/proxy.ts
|
|
@@ -7,7 +9,12 @@ const envVars = [
|
|
|
7
9
|
"HTTPS_PROXY",
|
|
8
10
|
"NO_PROXY"
|
|
9
11
|
];
|
|
12
|
+
const proxyEnvVarsWithCredentials = ["HTTP_PROXY", "HTTPS_PROXY"];
|
|
10
13
|
let agent = false;
|
|
14
|
+
function sanitizeProxyCredentials(envVar) {
|
|
15
|
+
const uri = parseUrl(process.env[envVar]);
|
|
16
|
+
if (uri?.password) addSecretForSanitizing(uri.password, "global");
|
|
17
|
+
}
|
|
11
18
|
function bootstrap() {
|
|
12
19
|
envVars.forEach((envVar) => {
|
|
13
20
|
/* v8 ignore next -- env is case-insensitive on windows */
|
|
@@ -17,6 +24,7 @@ function bootstrap() {
|
|
|
17
24
|
process.env[envVar.toLowerCase()] = process.env[envVar];
|
|
18
25
|
}
|
|
19
26
|
});
|
|
27
|
+
proxyEnvVarsWithCredentials.forEach(sanitizeProxyCredentials);
|
|
20
28
|
if (isNonEmptyString(process.env.HTTP_PROXY) || isNonEmptyString(process.env.HTTPS_PROXY)) {
|
|
21
29
|
createGlobalProxyAgent({ environmentVariableNamespace: "" });
|
|
22
30
|
agent = true;
|
package/dist/proxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"proxy.js","names":[],"sources":["../lib/proxy.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { createGlobalProxyAgent } from 'global-agent';\nimport { logger } from './logger/index.ts';\n\nconst envVars = ['HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY'];\n\nlet agent = false;\n\nexport function bootstrap(): void {\n envVars.forEach((envVar) => {\n /* v8 ignore next -- env is case-insensitive on windows */\n if (\n typeof process.env[envVar] === 'undefined' &&\n typeof process.env[envVar.toLowerCase()] !== 'undefined'\n ) {\n process.env[envVar] = process.env[envVar.toLowerCase()];\n }\n\n if (process.env[envVar]) {\n logger.debug(`Detected ${envVar} value in env`);\n process.env[envVar.toLowerCase()] = process.env[envVar];\n }\n });\n\n if (\n isNonEmptyString(process.env.HTTP_PROXY) ||\n isNonEmptyString(process.env.HTTPS_PROXY)\n ) {\n createGlobalProxyAgent({\n environmentVariableNamespace: '',\n });\n agent = true;\n } else {\n // for testing only, does not reset global agent\n agent = false;\n }\n}\n\n// will be used by our http layer later\nexport function hasProxy(): boolean {\n return agent === true;\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"proxy.js","names":[],"sources":["../lib/proxy.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { createGlobalProxyAgent } from 'global-agent';\nimport { logger } from './logger/index.ts';\nimport { addSecretForSanitizing } from './util/sanitize.ts';\nimport { parseUrl } from './util/url.ts';\n\nconst envVars = ['HTTP_PROXY', 'HTTPS_PROXY', 'NO_PROXY'];\nconst proxyEnvVarsWithCredentials = ['HTTP_PROXY', 'HTTPS_PROXY'];\n\nlet agent = false;\n\nfunction sanitizeProxyCredentials(envVar: string): void {\n const uri = parseUrl(process.env[envVar]);\n if (uri?.password) {\n addSecretForSanitizing(uri.password, 'global');\n }\n}\n\nexport function bootstrap(): void {\n envVars.forEach((envVar) => {\n /* v8 ignore next -- env is case-insensitive on windows */\n if (\n typeof process.env[envVar] === 'undefined' &&\n typeof process.env[envVar.toLowerCase()] !== 'undefined'\n ) {\n process.env[envVar] = process.env[envVar.toLowerCase()];\n }\n\n if (process.env[envVar]) {\n logger.debug(`Detected ${envVar} value in env`);\n process.env[envVar.toLowerCase()] = process.env[envVar];\n }\n });\n\n proxyEnvVarsWithCredentials.forEach(sanitizeProxyCredentials);\n\n if (\n isNonEmptyString(process.env.HTTP_PROXY) ||\n isNonEmptyString(process.env.HTTPS_PROXY)\n ) {\n createGlobalProxyAgent({\n environmentVariableNamespace: '',\n });\n agent = true;\n } else {\n // for testing only, does not reset global agent\n agent = false;\n }\n}\n\n// will be used by our http layer later\nexport function hasProxy(): boolean {\n return agent === true;\n}\n"],"mappings":";;;;;;AAMA,MAAM,UAAU;CAAC;CAAc;CAAe;AAAU;AACxD,MAAM,8BAA8B,CAAC,cAAc,aAAa;AAEhE,IAAI,QAAQ;AAEZ,SAAS,yBAAyB,QAAsB;CACtD,MAAM,MAAM,SAAS,QAAQ,IAAI,OAAO;CACxC,IAAI,KAAK,UACP,uBAAuB,IAAI,UAAU,QAAQ;AAEjD;AAEA,SAAgB,YAAkB;CAChC,QAAQ,SAAS,WAAW;;EAE1B,IACE,OAAO,QAAQ,IAAI,YAAY,eAC/B,OAAO,QAAQ,IAAI,OAAO,YAAY,OAAO,aAE7C,QAAQ,IAAI,UAAU,QAAQ,IAAI,OAAO,YAAY;EAGvD,IAAI,QAAQ,IAAI,SAAS;GACvB,OAAO,MAAM,YAAY,OAAO,cAAc;GAC9C,QAAQ,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI;EAClD;CACF,CAAC;CAED,4BAA4B,QAAQ,wBAAwB;CAE5D,IACE,iBAAiB,QAAQ,IAAI,UAAU,KACvC,iBAAiB,QAAQ,IAAI,WAAW,GACxC;EACA,uBAAuB,EACrB,8BAA8B,GAChC,CAAC;EACD,QAAQ;CACV,OAEE,QAAQ;AAEZ;AAGA,SAAgB,WAAoB;CAClC,OAAO,UAAU;AACnB"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import { CombinedHostRule, HostRule } from "../types/host-rules.js";
|
|
2
2
|
import "../types/index.js";
|
|
3
3
|
//#region lib/util/host-rules.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Fields within `HostRule`s that must have their value registered for sanitising through `sanitize.addSecretForSanitizing()`.
|
|
6
|
+
*
|
|
7
|
+
* Kept in sync with `redactedFields` through tests.
|
|
8
|
+
*/
|
|
9
|
+
declare const confidentialFields: (keyof HostRule)[];
|
|
4
10
|
interface LegacyHostRule {
|
|
5
11
|
hostName?: string;
|
|
6
12
|
domainName?: string;
|
|
@@ -32,5 +38,5 @@ declare function findAll({ hostType }: {
|
|
|
32
38
|
declare function getAll(): HostRule[];
|
|
33
39
|
declare function clear(): void;
|
|
34
40
|
//#endregion
|
|
35
|
-
export { HostRuleSearch, LegacyHostRule, add, clear, find, findAll, getAll, hostType, hosts, matchesHost, migrateRule };
|
|
41
|
+
export { HostRuleSearch, LegacyHostRule, add, clear, confidentialFields, find, findAll, getAll, hostType, hosts, matchesHost, migrateRule };
|
|
36
42
|
//# sourceMappingURL=host-rules.d.ts.map
|
package/dist/util/host-rules.js
CHANGED
|
@@ -6,6 +6,18 @@ import { isHttpUrl, massageHostUrl, parseUrl } from "./url.js";
|
|
|
6
6
|
import { isFalsy, isString, isTruthy, isUndefined } from "@sindresorhus/is";
|
|
7
7
|
//#region lib/util/host-rules.ts
|
|
8
8
|
let hostRules = [];
|
|
9
|
+
/**
|
|
10
|
+
* Fields within `HostRule`s that must have their value registered for sanitising through `sanitize.addSecretForSanitizing()`.
|
|
11
|
+
*
|
|
12
|
+
* Kept in sync with `redactedFields` through tests.
|
|
13
|
+
*/
|
|
14
|
+
const confidentialFields = [
|
|
15
|
+
"password",
|
|
16
|
+
"token",
|
|
17
|
+
"httpsPrivateKey",
|
|
18
|
+
"httpsCertificate",
|
|
19
|
+
"httpsCertificateAuthority"
|
|
20
|
+
];
|
|
9
21
|
function migrateRule(rule) {
|
|
10
22
|
const cloned = clone(rule);
|
|
11
23
|
delete cloned.hostName;
|
|
@@ -28,7 +40,6 @@ function migrateRule(rule) {
|
|
|
28
40
|
}
|
|
29
41
|
function add(params) {
|
|
30
42
|
const rule = migrateRule(params);
|
|
31
|
-
const confidentialFields = ["password", "token"];
|
|
32
43
|
if (rule.matchHost) {
|
|
33
44
|
rule.matchHost = massageHostUrl(rule.matchHost);
|
|
34
45
|
rule.resolvedHost = parseUrl(rule.matchHost)?.hostname ?? rule.matchHost;
|
|
@@ -125,6 +136,6 @@ function clear() {
|
|
|
125
136
|
clearRepoSanitizedSecretsList();
|
|
126
137
|
}
|
|
127
138
|
//#endregion
|
|
128
|
-
export { add, clear, find, findAll, getAll, hostType, hosts, matchesHost, migrateRule };
|
|
139
|
+
export { add, clear, confidentialFields, find, findAll, getAll, hostType, hosts, matchesHost, migrateRule };
|
|
129
140
|
|
|
130
141
|
//# sourceMappingURL=host-rules.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"host-rules.js","names":[],"sources":["../../lib/util/host-rules.ts"],"sourcesContent":["import { isFalsy, isString, isTruthy, isUndefined } from '@sindresorhus/is';\nimport { logger } from '../logger/index.ts';\nimport type { CombinedHostRule, HostRule } from '../types/index.ts';\nimport { clone } from './clone.ts';\nimport * as sanitize from './sanitize.ts';\nimport { toBase64 } from './string.ts';\nimport { isHttpUrl, massageHostUrl, parseUrl } from './url.ts';\n\nlet hostRules: HostRule[] = [];\n\nexport interface LegacyHostRule {\n hostName?: string;\n domainName?: string;\n baseUrl?: string;\n host?: string;\n endpoint?: string;\n}\n\nexport function migrateRule(rule: LegacyHostRule & HostRule): HostRule {\n const cloned: LegacyHostRule & HostRule = clone(rule);\n delete cloned.hostName;\n delete cloned.domainName;\n delete cloned.baseUrl;\n const result: HostRule = cloned;\n\n const { matchHost } = result;\n const { hostName, domainName, baseUrl } = rule;\n const hostValues = [matchHost, hostName, domainName, baseUrl].filter(Boolean);\n if (hostValues.length === 1) {\n const [matchHost] = hostValues;\n result.matchHost = matchHost;\n } else if (hostValues.length > 1) {\n throw new Error(\n `hostRules cannot contain more than one host-matching field - use \"matchHost\" only.`,\n );\n }\n\n return result;\n}\n\nexport function add(params: HostRule): void {\n const rule = migrateRule(params);\n\n
|
|
1
|
+
{"version":3,"file":"host-rules.js","names":[],"sources":["../../lib/util/host-rules.ts"],"sourcesContent":["import { isFalsy, isString, isTruthy, isUndefined } from '@sindresorhus/is';\nimport { logger } from '../logger/index.ts';\nimport type { CombinedHostRule, HostRule } from '../types/index.ts';\nimport { clone } from './clone.ts';\nimport * as sanitize from './sanitize.ts';\nimport { toBase64 } from './string.ts';\nimport { isHttpUrl, massageHostUrl, parseUrl } from './url.ts';\n\nlet hostRules: HostRule[] = [];\n\n/**\n * Fields within `HostRule`s that must have their value registered for sanitising through `sanitize.addSecretForSanitizing()`.\n *\n * Kept in sync with `redactedFields` through tests.\n */\nexport const confidentialFields: (keyof HostRule)[] = [\n 'password',\n 'token',\n 'httpsPrivateKey',\n /* not actually sensitive, but redacted nonetheless */\n 'httpsCertificate',\n /* not actually sensitive, but redacted nonetheless */\n 'httpsCertificateAuthority',\n];\n\nexport interface LegacyHostRule {\n hostName?: string;\n domainName?: string;\n baseUrl?: string;\n host?: string;\n endpoint?: string;\n}\n\nexport function migrateRule(rule: LegacyHostRule & HostRule): HostRule {\n const cloned: LegacyHostRule & HostRule = clone(rule);\n delete cloned.hostName;\n delete cloned.domainName;\n delete cloned.baseUrl;\n const result: HostRule = cloned;\n\n const { matchHost } = result;\n const { hostName, domainName, baseUrl } = rule;\n const hostValues = [matchHost, hostName, domainName, baseUrl].filter(Boolean);\n if (hostValues.length === 1) {\n const [matchHost] = hostValues;\n result.matchHost = matchHost;\n } else if (hostValues.length > 1) {\n throw new Error(\n `hostRules cannot contain more than one host-matching field - use \"matchHost\" only.`,\n );\n }\n\n return result;\n}\n\nexport function add(params: HostRule): void {\n const rule = migrateRule(params);\n\n if (rule.matchHost) {\n rule.matchHost = massageHostUrl(rule.matchHost);\n const parsedUrl = parseUrl(rule.matchHost);\n rule.resolvedHost = parsedUrl?.hostname ?? rule.matchHost;\n confidentialFields.forEach((field) => {\n if (rule[field]) {\n logger.debug(\n // TODO: types (#22198)\n `Adding ${field} authentication for ${rule.matchHost!} (hostType=${\n rule.hostType\n }) to hostRules`,\n );\n }\n });\n }\n confidentialFields.forEach((field) => {\n const secret = rule[field];\n if (isString(secret) && secret.length > 3) {\n sanitize.addSecretForSanitizing(secret);\n }\n });\n if (rule.username && rule.password) {\n sanitize.addSecretForSanitizing(\n toBase64(`${rule.username}:${rule.password}`),\n );\n }\n hostRules.push(rule);\n}\n\nexport interface HostRuleSearch {\n hostType?: string;\n url?: string;\n readOnly?: boolean;\n}\n\nexport function matchesHost(url: string, matchHost: string): boolean {\n const parsedUrl = parseUrl(url);\n if (!parsedUrl) {\n return false;\n }\n\n const parsedMatchHost = parseUrl(matchHost);\n if (isHttpUrl(parsedUrl) && isHttpUrl(parsedMatchHost)) {\n return parsedUrl.href.startsWith(parsedMatchHost!.href);\n }\n\n const { hostname } = parsedUrl;\n if (!hostname) {\n return false;\n }\n\n if (hostname === matchHost) {\n return true;\n }\n\n const topLevelSuffix = matchHost.startsWith('.')\n ? matchHost\n : `.${matchHost}`;\n return hostname.endsWith(topLevelSuffix);\n}\n\nfunction fromShorterToLongerMatchHost(a: HostRule, b: HostRule): number {\n if (!a.matchHost || !b.matchHost) {\n return 0;\n }\n return a.matchHost.length - b.matchHost.length;\n}\n\nfunction hostRuleRank({ hostType, matchHost, readOnly }: HostRule): number {\n if ((hostType || readOnly) && matchHost) {\n return 3;\n }\n\n if (matchHost) {\n return 2;\n }\n\n if (hostType) {\n return 1;\n }\n\n return 0;\n}\n\nfunction fromLowerToHigherRank(a: HostRule, b: HostRule): number {\n return hostRuleRank(a) - hostRuleRank(b);\n}\n\nexport function find(search: HostRuleSearch): CombinedHostRule {\n if ([search.hostType, search.url].every(isFalsy)) {\n logger.warn({ search }, 'Invalid hostRules search');\n return {};\n }\n\n // Sort primarily by rank, and secondarily by matchHost length\n const sortedRules = hostRules\n .sort(fromShorterToLongerMatchHost)\n .sort(fromLowerToHigherRank);\n\n const matchedRules: HostRule[] = [];\n for (const rule of sortedRules) {\n let hostTypeMatch = true;\n let hostMatch = true;\n let readOnlyMatch = true;\n\n if (rule.hostType) {\n hostTypeMatch = false;\n // v8 ignore else -- TODO: add test #40625\n if (search.hostType === rule.hostType) {\n hostTypeMatch = true;\n }\n }\n\n if (rule.matchHost && rule.resolvedHost) {\n hostMatch = false;\n if (search.url) {\n hostMatch = matchesHost(search.url, rule.matchHost);\n }\n }\n\n if (!isUndefined(rule.readOnly)) {\n readOnlyMatch = false;\n // v8 ignore else -- TODO: add test #40625\n if (search.readOnly === rule.readOnly) {\n readOnlyMatch = true;\n hostTypeMatch = true; // When we match `readOnly`, we don't care about `hostType`\n }\n }\n\n if (hostTypeMatch && readOnlyMatch && hostMatch) {\n matchedRules.push(clone(rule));\n }\n }\n\n const res: HostRule = Object.assign({}, ...matchedRules);\n delete res.hostType;\n delete res.resolvedHost;\n delete res.matchHost;\n delete res.readOnly;\n return res;\n}\n\nexport function hosts({ hostType }: { hostType: string }): string[] {\n return hostRules\n .filter((rule) => rule.hostType === hostType)\n .map((rule) => rule.resolvedHost)\n .filter(isTruthy);\n}\n\nexport function hostType({ url }: { url: string }): string | null {\n return (\n hostRules\n .filter((rule) => rule.matchHost && matchesHost(url, rule.matchHost))\n .sort(fromShorterToLongerMatchHost)\n .map((rule) => rule.hostType)\n .filter(isTruthy)\n .pop() ?? null\n );\n}\n\nexport function findAll({ hostType }: { hostType: string }): HostRule[] {\n return hostRules.filter((rule) => rule.hostType === hostType);\n}\n\n/**\n * @returns a deep copy of all known host rules without any filtering\n */\nexport function getAll(): HostRule[] {\n return clone(hostRules);\n}\n\nexport function clear(): void {\n logger.debug('Clearing hostRules');\n hostRules = [];\n sanitize.clearRepoSanitizedSecretsList();\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.js","names":[],"sources":["../../lib/util/sanitize.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { toBase64 } from './string.ts';\n\nconst globalSecrets = new Set<string>();\nconst repoSecrets = new Set<string>();\n\nexport const redactedFields = [\n 'authorization',\n 'token',\n 'githubAppKey',\n 'npmToken',\n 'npmrc',\n 'privateKey',\n 'privateKeyOld',\n 'gitPrivateKey',\n 'forkToken',\n 'password',\n 'httpsCertificate',\n 'httpsPrivateKey',\n 'httpsCertificateAuthority',\n];\n\n// TODO: returns null or undefined only when input is null or undefined.\nexport function sanitize(input: string): string;\nexport function sanitize(\n input: string | null | undefined,\n): string | null | undefined;\nexport function sanitize(\n input: string | null | undefined,\n): string | null | undefined {\n if (!input) {\n return input;\n }\n let output: string = input;\n [globalSecrets, repoSecrets].forEach((secrets) => {\n secrets.forEach((secret) => {\n while (output.includes(secret)) {\n output = output.replace(secret, '**redacted**');\n }\n });\n });\n return output;\n}\n\nconst GITHUB_APP_TOKEN_PREFIX = 'x-access-token:';\n\nexport function addSecretForSanitizing(\n secret: string | undefined,\n type = 'repo',\n): void {\n if (!isNonEmptyString(secret)) {\n return;\n }\n const secrets = type === 'repo' ? repoSecrets : globalSecrets;\n secrets.add(secret);\n secrets.add(toBase64(secret));\n if (secret.startsWith(GITHUB_APP_TOKEN_PREFIX)) {\n const trimmedSecret = secret.replace(GITHUB_APP_TOKEN_PREFIX, '');\n secrets.add(trimmedSecret);\n secrets.add(toBase64(trimmedSecret));\n }\n}\n\nexport function clearRepoSanitizedSecretsList(): void {\n repoSecrets.clear();\n}\n\nexport function clearGlobalSanitizedSecretsList(): void {\n globalSecrets.clear();\n}\n"],"mappings":";;;AAGA,MAAM,gCAAgB,IAAI,IAAY;AACtC,MAAM,8BAAc,IAAI,IAAY;AAEpC,MAAa,iBAAiB;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;
|
|
1
|
+
{"version":3,"file":"sanitize.js","names":[],"sources":["../../lib/util/sanitize.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { toBase64 } from './string.ts';\n\nconst globalSecrets = new Set<string>();\nconst repoSecrets = new Set<string>();\n\nexport const redactedFields = [\n 'authorization',\n 'token',\n 'githubAppKey',\n 'npmToken',\n 'npmrc',\n 'privateKey',\n 'privateKeyOld',\n 'gitPrivateKey',\n 'forkToken',\n 'password',\n /* not actually sensitive, but redacted nonetheless */\n 'httpsCertificate',\n 'httpsPrivateKey',\n /* not actually sensitive, but redacted nonetheless */\n 'httpsCertificateAuthority',\n];\n\n// TODO: returns null or undefined only when input is null or undefined.\nexport function sanitize(input: string): string;\nexport function sanitize(\n input: string | null | undefined,\n): string | null | undefined;\nexport function sanitize(\n input: string | null | undefined,\n): string | null | undefined {\n if (!input) {\n return input;\n }\n let output: string = input;\n [globalSecrets, repoSecrets].forEach((secrets) => {\n secrets.forEach((secret) => {\n while (output.includes(secret)) {\n output = output.replace(secret, '**redacted**');\n }\n });\n });\n return output;\n}\n\nconst GITHUB_APP_TOKEN_PREFIX = 'x-access-token:';\n\nexport function addSecretForSanitizing(\n secret: string | undefined,\n type = 'repo',\n): void {\n if (!isNonEmptyString(secret)) {\n return;\n }\n const secrets = type === 'repo' ? repoSecrets : globalSecrets;\n secrets.add(secret);\n secrets.add(toBase64(secret));\n if (secret.startsWith(GITHUB_APP_TOKEN_PREFIX)) {\n const trimmedSecret = secret.replace(GITHUB_APP_TOKEN_PREFIX, '');\n secrets.add(trimmedSecret);\n secrets.add(toBase64(trimmedSecret));\n }\n}\n\nexport function clearRepoSanitizedSecretsList(): void {\n repoSecrets.clear();\n}\n\nexport function clearGlobalSanitizedSecretsList(): void {\n globalSecrets.clear();\n}\n"],"mappings":";;;AAGA,MAAM,gCAAgB,IAAI,IAAY;AACtC,MAAM,8BAAc,IAAI,IAAY;AAEpC,MAAa,iBAAiB;CAC5B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CAEA;AACF;AAOA,SAAgB,SACd,OAC2B;CAC3B,IAAI,CAAC,OACH,OAAO;CAET,IAAI,SAAiB;CACrB,CAAC,eAAe,WAAW,CAAC,CAAC,SAAS,YAAY;EAChD,QAAQ,SAAS,WAAW;GAC1B,OAAO,OAAO,SAAS,MAAM,GAC3B,SAAS,OAAO,QAAQ,QAAQ,cAAc;EAElD,CAAC;CACH,CAAC;CACD,OAAO;AACT;AAEA,MAAM,0BAA0B;AAEhC,SAAgB,uBACd,QACA,OAAO,QACD;CACN,IAAI,CAAC,iBAAiB,MAAM,GAC1B;CAEF,MAAM,UAAU,SAAS,SAAS,cAAc;CAChD,QAAQ,IAAI,MAAM;CAClB,QAAQ,IAAI,SAAS,MAAM,CAAC;CAC5B,IAAI,OAAO,WAAW,uBAAuB,GAAG;EAC9C,MAAM,gBAAgB,OAAO,QAAQ,yBAAyB,EAAE;EAChE,QAAQ,IAAI,aAAa;EACzB,QAAQ,IAAI,SAAS,aAAa,CAAC;CACrC;AACF;AAEA,SAAgB,gCAAsC;CACpD,YAAY,MAAM;AACpB"}
|
|
@@ -95,6 +95,8 @@ async function start() {
|
|
|
95
95
|
try {
|
|
96
96
|
if (isNonEmptyStringAndNotWhitespace(env.AWS_SECRET_ACCESS_KEY)) addSecretForSanitizing(env.AWS_SECRET_ACCESS_KEY, "global");
|
|
97
97
|
if (isNonEmptyStringAndNotWhitespace(env.AWS_SESSION_TOKEN)) addSecretForSanitizing(env.AWS_SESSION_TOKEN, "global");
|
|
98
|
+
if (isNonEmptyStringAndNotWhitespace(env.COREPACK_NPM_TOKEN)) addSecretForSanitizing(env.COREPACK_NPM_TOKEN, "global");
|
|
99
|
+
if (isNonEmptyStringAndNotWhitespace(env.COREPACK_NPM_PASSWORD)) addSecretForSanitizing(env.COREPACK_NPM_PASSWORD, "global");
|
|
98
100
|
await instrument("config", async () => {
|
|
99
101
|
config = await getGlobalConfig();
|
|
100
102
|
GlobalConfig.set({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["configParser.filterConfig","hostRules.add","repositoryWorker.renovateRepository"],"sources":["../../../lib/workers/global/index.ts"],"sourcesContent":["import {\n ATTR_VCS_OWNER_NAME,\n ATTR_VCS_PROVIDER_NAME,\n ATTR_VCS_REPOSITORY_NAME,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport {\n isNonEmptyObject,\n isNonEmptyString,\n isNonEmptyStringAndNotWhitespace,\n isString,\n} from '@sindresorhus/is';\nimport { ERROR } from 'bunyan';\nimport fs from 'fs-extra';\nimport semver from 'semver';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../config/global.ts';\nimport * as configParser from '../../config/index.ts';\nimport { resolveConfigPresets } from '../../config/presets/index.ts';\nimport { validateConfigSecretsAndVariables } from '../../config/secrets.ts';\nimport type {\n AllConfig,\n InternalGlobalConfigOptions,\n RenovateConfig,\n RenovateRepository,\n RepoGlobalConfig,\n} from '../../config/types.ts';\nimport { CONFIG_PRESETS_INVALID } from '../../constants/error-messages.ts';\nimport { pkg } from '../../expose.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport {\n exportStats,\n finalizeReport,\n} from '../../instrumentation/reporting.ts';\nimport { getProblems, logLevel, logger, setMeta } from '../../logger/index.ts';\nimport { setGlobalLogLevelRemaps } from '../../logger/remap.ts';\nimport { getEnv } from '../../util/env.ts';\nimport * as hostRules from '../../util/host-rules.ts';\nimport * as queue from '../../util/http/queue.ts';\nimport * as throttle from '../../util/http/throttle.ts';\nimport { regexEngineStatus } from '../../util/regex.ts';\nimport { addSecretForSanitizing } from '../../util/sanitize.ts';\nimport { coerceString } from '../../util/string.ts';\nimport * as repositoryWorker from '../repository/index.ts';\nimport type { RepositoryWorkerConfig } from '../repository/init/types.ts';\nimport { autodiscoverRepositories } from './autodiscover.ts';\nimport { parseConfigs } from './config/parse/index.ts';\nimport { globalFinalize, globalInitialize } from './initialize.ts';\nimport { isLimitReached } from './limits.ts';\n\nfunction applyGlobalOption<\n K extends keyof RepoGlobalConfig | keyof InternalGlobalConfigOptions,\n>(\n target: RepoGlobalConfig & InternalGlobalConfigOptions,\n source: RepoGlobalConfig & InternalGlobalConfigOptions,\n key: K,\n): void {\n target[key] = source[key];\n delete source[key];\n}\n\nexport async function getRepositoryConfig(\n globalConfig: RenovateConfig,\n repository: RenovateRepository,\n): Promise<RepositoryWorkerConfig> {\n const repoIsString = isString(repository);\n const repoName = repoIsString ? repository : repository.repository;\n\n const repoConfig: RepositoryWorkerConfig = {\n ...globalConfig,\n repository: repoName,\n };\n\n if (!repoIsString) {\n const { repository: _repository, ...repositoryEntryConfig } = repository;\n\n // Promote GlobalConfig.OPTIONS keys into repoConfig directly so that\n // GlobalConfig.set(repoConfig) in the repository worker picks them up\n // with per-repo overrides before onboarding checks run.\n for (const option of GlobalConfig.OPTIONS) {\n if (option in repositoryEntryConfig) {\n applyGlobalOption(repoConfig, repositoryEntryConfig, option);\n }\n }\n\n if (isNonEmptyObject(repositoryEntryConfig)) {\n // mergeRenovateConfig later resolves this repositories[] object-entry\n // config in the correct order\n repoConfig.repositoryEntryConfig = repositoryEntryConfig;\n }\n }\n\n const repoParts = repoName.split('/');\n repoParts.pop();\n repoConfig.parentOrg = repoParts.join('/');\n repoConfig.topLevelOrg = repoParts.shift();\n const platform = GlobalConfig.get('platform');\n repoConfig.localDir =\n platform === 'local'\n ? process.cwd()\n : // TODO: types (#22198)\n upath.join(repoConfig.baseDir!, `./repos/${platform}/${repoName}`);\n await fs.ensureDir(repoConfig.localDir);\n delete repoConfig.baseDir;\n return configParser.filterConfig(repoConfig, 'repository');\n}\n\nfunction getGlobalConfig(): Promise<RenovateConfig> {\n return parseConfigs(getEnv(), process.argv);\n}\n\nfunction haveReachedLimits(): boolean {\n if (isLimitReached('Commits')) {\n logger.info('Max commits created for this run.');\n return true;\n }\n return false;\n}\n\n/* istanbul ignore next */\nfunction checkEnv(): void {\n const range = pkg.engines.node;\n if (process.release?.name !== 'node' || !process.versions?.node) {\n logger.warn(\n { release: process.release, versions: process.versions },\n 'Unknown node environment detected.',\n );\n } else if (!semver.satisfies(process.versions?.node, range)) {\n logger.error(\n { versions: process.versions, range },\n 'Unsupported node environment detected. Please update your node version.',\n );\n }\n}\n\nexport async function validatePresets(config: AllConfig): Promise<void> {\n logger.debug('validatePresets()');\n try {\n await resolveConfigPresets(config);\n } catch (err) /* istanbul ignore next */ {\n logger.error({ err }, CONFIG_PRESETS_INVALID);\n throw new Error(CONFIG_PRESETS_INVALID);\n }\n}\n\nexport async function start(): Promise<number> {\n logger.info({ renovateVersion: pkg.version }, 'Renovate started');\n // istanbul ignore next\n if (regexEngineStatus.type === 'available') {\n logger.debug('Using RE2 regex engine');\n } else if (regexEngineStatus.type === 'unavailable') {\n logger.warn(\n { err: regexEngineStatus.err },\n 'RE2 not usable, falling back to RegExp',\n );\n } else if (regexEngineStatus.type === 'ignored') {\n logger.debug('RE2 regex engine is ignored via RENOVATE_X_IGNORE_RE2');\n }\n\n let config: AllConfig;\n const env = getEnv();\n try {\n if (isNonEmptyStringAndNotWhitespace(env.AWS_SECRET_ACCESS_KEY)) {\n addSecretForSanitizing(env.AWS_SECRET_ACCESS_KEY, 'global');\n }\n if (isNonEmptyStringAndNotWhitespace(env.AWS_SESSION_TOKEN)) {\n addSecretForSanitizing(env.AWS_SESSION_TOKEN, 'global');\n }\n\n await instrument('config', async () => {\n // read global config from file, env and cli args\n config = await getGlobalConfig();\n\n // Set allowedHeaders and userAgent in case hostRules headers are configured in file config\n GlobalConfig.set({\n allowedHeaders: config.allowedHeaders,\n userAgent: config.userAgent,\n });\n // initialize all submodules\n config = await globalInitialize(config);\n\n // Set platform, endpoint, allowedHeaders and userAgent in case local presets are used\n GlobalConfig.set({\n allowedHeaders: config.allowedHeaders,\n platform: config.platform,\n endpoint: config.endpoint,\n userAgent: config.userAgent,\n });\n\n await validatePresets(config);\n\n setGlobalLogLevelRemaps(config.logLevelRemap);\n\n checkEnv();\n\n // validate secrets and variables. Will throw and abort if invalid\n validateConfigSecretsAndVariables(config);\n });\n\n // autodiscover repositories (needs to come after platform initialization)\n config = await instrument('discover', () =>\n autodiscoverRepositories(config),\n );\n\n if (isNonEmptyString(config.writeDiscoveredRepos)) {\n const content = JSON.stringify(config.repositories);\n await fs.writeFile(config.writeDiscoveredRepos, content);\n logger.info(\n `Written discovered repositories to ${config.writeDiscoveredRepos}`,\n );\n return 0;\n }\n\n // Iterate through repositories sequentially\n for (const repository of config.repositories!) {\n if (haveReachedLimits()) {\n break;\n }\n\n const { owner, repo } = repositoryToOwnerAndRepo(\n typeof repository === 'string' ? repository : repository.repository,\n );\n\n await instrument(\n 'repository',\n async () => {\n const repoConfig = await getRepositoryConfig(config, repository);\n if (repoConfig.hostRules) {\n logger.debug('Reinitializing hostRules for repo');\n hostRules.clear();\n repoConfig.hostRules.forEach((rule) => hostRules.add(rule));\n repoConfig.hostRules = [];\n }\n\n // host rules can change concurrency\n queue.clear();\n throttle.clear();\n\n await repositoryWorker.renovateRepository(repoConfig);\n setMeta({});\n },\n {\n attributes: {\n [ATTR_VCS_PROVIDER_NAME]: config.platform,\n [ATTR_VCS_OWNER_NAME]: owner,\n [ATTR_VCS_REPOSITORY_NAME]: repo,\n /** @deprecated TODO remove */\n repository:\n typeof repository === 'string'\n ? repository\n : repository.repository,\n },\n },\n );\n }\n\n finalizeReport();\n await exportStats(config);\n } catch (err) /* istanbul ignore next */ {\n if (err.message.startsWith('Init: ')) {\n logger.fatal(\n { errorMessage: err.message.substring(6) },\n 'Initialization error',\n );\n } else {\n logger.fatal({ err }, 'Unknown error');\n }\n if (!config!) {\n // return early if we can't parse config options\n logger.debug(`Missing config`);\n return 2;\n }\n } finally {\n await globalFinalize(config!);\n if (logLevel() === 'info') {\n logger.info(\n `Renovate was run at log level \"${logLevel()}\". Set LOG_LEVEL=debug in environment variables to see extended debug logs.`,\n );\n }\n }\n const loggerErrors = getProblems().filter((p) => p.level >= ERROR);\n if (loggerErrors.length) {\n logger.info(\n { loggerErrors },\n 'Renovate is exiting with a non-zero code due to the following logged errors',\n );\n return 1;\n }\n return 0;\n}\n\nfunction repositoryToOwnerAndRepo(fullName: string): {\n owner: string;\n repo: string;\n} {\n const parts = fullName.split('/');\n const repo = coerceString(parts.pop());\n const owner = parts.join('/');\n return { owner, repo };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["configParser.filterConfig","hostRules.add","repositoryWorker.renovateRepository"],"sources":["../../../lib/workers/global/index.ts"],"sourcesContent":["import {\n ATTR_VCS_OWNER_NAME,\n ATTR_VCS_PROVIDER_NAME,\n ATTR_VCS_REPOSITORY_NAME,\n} from '@opentelemetry/semantic-conventions/incubating';\nimport {\n isNonEmptyObject,\n isNonEmptyString,\n isNonEmptyStringAndNotWhitespace,\n isString,\n} from '@sindresorhus/is';\nimport { ERROR } from 'bunyan';\nimport fs from 'fs-extra';\nimport semver from 'semver';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../config/global.ts';\nimport * as configParser from '../../config/index.ts';\nimport { resolveConfigPresets } from '../../config/presets/index.ts';\nimport { validateConfigSecretsAndVariables } from '../../config/secrets.ts';\nimport type {\n AllConfig,\n InternalGlobalConfigOptions,\n RenovateConfig,\n RenovateRepository,\n RepoGlobalConfig,\n} from '../../config/types.ts';\nimport { CONFIG_PRESETS_INVALID } from '../../constants/error-messages.ts';\nimport { pkg } from '../../expose.ts';\nimport { instrument } from '../../instrumentation/index.ts';\nimport {\n exportStats,\n finalizeReport,\n} from '../../instrumentation/reporting.ts';\nimport { getProblems, logLevel, logger, setMeta } from '../../logger/index.ts';\nimport { setGlobalLogLevelRemaps } from '../../logger/remap.ts';\nimport { getEnv } from '../../util/env.ts';\nimport * as hostRules from '../../util/host-rules.ts';\nimport * as queue from '../../util/http/queue.ts';\nimport * as throttle from '../../util/http/throttle.ts';\nimport { regexEngineStatus } from '../../util/regex.ts';\nimport { addSecretForSanitizing } from '../../util/sanitize.ts';\nimport { coerceString } from '../../util/string.ts';\nimport * as repositoryWorker from '../repository/index.ts';\nimport type { RepositoryWorkerConfig } from '../repository/init/types.ts';\nimport { autodiscoverRepositories } from './autodiscover.ts';\nimport { parseConfigs } from './config/parse/index.ts';\nimport { globalFinalize, globalInitialize } from './initialize.ts';\nimport { isLimitReached } from './limits.ts';\n\nfunction applyGlobalOption<\n K extends keyof RepoGlobalConfig | keyof InternalGlobalConfigOptions,\n>(\n target: RepoGlobalConfig & InternalGlobalConfigOptions,\n source: RepoGlobalConfig & InternalGlobalConfigOptions,\n key: K,\n): void {\n target[key] = source[key];\n delete source[key];\n}\n\nexport async function getRepositoryConfig(\n globalConfig: RenovateConfig,\n repository: RenovateRepository,\n): Promise<RepositoryWorkerConfig> {\n const repoIsString = isString(repository);\n const repoName = repoIsString ? repository : repository.repository;\n\n const repoConfig: RepositoryWorkerConfig = {\n ...globalConfig,\n repository: repoName,\n };\n\n if (!repoIsString) {\n const { repository: _repository, ...repositoryEntryConfig } = repository;\n\n // Promote GlobalConfig.OPTIONS keys into repoConfig directly so that\n // GlobalConfig.set(repoConfig) in the repository worker picks them up\n // with per-repo overrides before onboarding checks run.\n for (const option of GlobalConfig.OPTIONS) {\n if (option in repositoryEntryConfig) {\n applyGlobalOption(repoConfig, repositoryEntryConfig, option);\n }\n }\n\n if (isNonEmptyObject(repositoryEntryConfig)) {\n // mergeRenovateConfig later resolves this repositories[] object-entry\n // config in the correct order\n repoConfig.repositoryEntryConfig = repositoryEntryConfig;\n }\n }\n\n const repoParts = repoName.split('/');\n repoParts.pop();\n repoConfig.parentOrg = repoParts.join('/');\n repoConfig.topLevelOrg = repoParts.shift();\n const platform = GlobalConfig.get('platform');\n repoConfig.localDir =\n platform === 'local'\n ? process.cwd()\n : // TODO: types (#22198)\n upath.join(repoConfig.baseDir!, `./repos/${platform}/${repoName}`);\n await fs.ensureDir(repoConfig.localDir);\n delete repoConfig.baseDir;\n return configParser.filterConfig(repoConfig, 'repository');\n}\n\nfunction getGlobalConfig(): Promise<RenovateConfig> {\n return parseConfigs(getEnv(), process.argv);\n}\n\nfunction haveReachedLimits(): boolean {\n if (isLimitReached('Commits')) {\n logger.info('Max commits created for this run.');\n return true;\n }\n return false;\n}\n\n/* istanbul ignore next */\nfunction checkEnv(): void {\n const range = pkg.engines.node;\n if (process.release?.name !== 'node' || !process.versions?.node) {\n logger.warn(\n { release: process.release, versions: process.versions },\n 'Unknown node environment detected.',\n );\n } else if (!semver.satisfies(process.versions?.node, range)) {\n logger.error(\n { versions: process.versions, range },\n 'Unsupported node environment detected. Please update your node version.',\n );\n }\n}\n\nexport async function validatePresets(config: AllConfig): Promise<void> {\n logger.debug('validatePresets()');\n try {\n await resolveConfigPresets(config);\n } catch (err) /* istanbul ignore next */ {\n logger.error({ err }, CONFIG_PRESETS_INVALID);\n throw new Error(CONFIG_PRESETS_INVALID);\n }\n}\n\nexport async function start(): Promise<number> {\n logger.info({ renovateVersion: pkg.version }, 'Renovate started');\n // istanbul ignore next\n if (regexEngineStatus.type === 'available') {\n logger.debug('Using RE2 regex engine');\n } else if (regexEngineStatus.type === 'unavailable') {\n logger.warn(\n { err: regexEngineStatus.err },\n 'RE2 not usable, falling back to RegExp',\n );\n } else if (regexEngineStatus.type === 'ignored') {\n logger.debug('RE2 regex engine is ignored via RENOVATE_X_IGNORE_RE2');\n }\n\n let config: AllConfig;\n const env = getEnv();\n try {\n if (isNonEmptyStringAndNotWhitespace(env.AWS_SECRET_ACCESS_KEY)) {\n addSecretForSanitizing(env.AWS_SECRET_ACCESS_KEY, 'global');\n }\n if (isNonEmptyStringAndNotWhitespace(env.AWS_SESSION_TOKEN)) {\n addSecretForSanitizing(env.AWS_SESSION_TOKEN, 'global');\n }\n if (isNonEmptyStringAndNotWhitespace(env.COREPACK_NPM_TOKEN)) {\n addSecretForSanitizing(env.COREPACK_NPM_TOKEN, 'global');\n }\n if (isNonEmptyStringAndNotWhitespace(env.COREPACK_NPM_PASSWORD)) {\n addSecretForSanitizing(env.COREPACK_NPM_PASSWORD, 'global');\n }\n\n await instrument('config', async () => {\n // read global config from file, env and cli args\n config = await getGlobalConfig();\n\n // Set allowedHeaders and userAgent in case hostRules headers are configured in file config\n GlobalConfig.set({\n allowedHeaders: config.allowedHeaders,\n userAgent: config.userAgent,\n });\n // initialize all submodules\n config = await globalInitialize(config);\n\n // Set platform, endpoint, allowedHeaders and userAgent in case local presets are used\n GlobalConfig.set({\n allowedHeaders: config.allowedHeaders,\n platform: config.platform,\n endpoint: config.endpoint,\n userAgent: config.userAgent,\n });\n\n await validatePresets(config);\n\n setGlobalLogLevelRemaps(config.logLevelRemap);\n\n checkEnv();\n\n // validate secrets and variables. Will throw and abort if invalid\n validateConfigSecretsAndVariables(config);\n });\n\n // autodiscover repositories (needs to come after platform initialization)\n config = await instrument('discover', () =>\n autodiscoverRepositories(config),\n );\n\n if (isNonEmptyString(config.writeDiscoveredRepos)) {\n const content = JSON.stringify(config.repositories);\n await fs.writeFile(config.writeDiscoveredRepos, content);\n logger.info(\n `Written discovered repositories to ${config.writeDiscoveredRepos}`,\n );\n return 0;\n }\n\n // Iterate through repositories sequentially\n for (const repository of config.repositories!) {\n if (haveReachedLimits()) {\n break;\n }\n\n const { owner, repo } = repositoryToOwnerAndRepo(\n typeof repository === 'string' ? repository : repository.repository,\n );\n\n await instrument(\n 'repository',\n async () => {\n const repoConfig = await getRepositoryConfig(config, repository);\n if (repoConfig.hostRules) {\n logger.debug('Reinitializing hostRules for repo');\n hostRules.clear();\n repoConfig.hostRules.forEach((rule) => hostRules.add(rule));\n repoConfig.hostRules = [];\n }\n\n // host rules can change concurrency\n queue.clear();\n throttle.clear();\n\n await repositoryWorker.renovateRepository(repoConfig);\n setMeta({});\n },\n {\n attributes: {\n [ATTR_VCS_PROVIDER_NAME]: config.platform,\n [ATTR_VCS_OWNER_NAME]: owner,\n [ATTR_VCS_REPOSITORY_NAME]: repo,\n /** @deprecated TODO remove */\n repository:\n typeof repository === 'string'\n ? repository\n : repository.repository,\n },\n },\n );\n }\n\n finalizeReport();\n await exportStats(config);\n } catch (err) /* istanbul ignore next */ {\n if (err.message.startsWith('Init: ')) {\n logger.fatal(\n { errorMessage: err.message.substring(6) },\n 'Initialization error',\n );\n } else {\n logger.fatal({ err }, 'Unknown error');\n }\n if (!config!) {\n // return early if we can't parse config options\n logger.debug(`Missing config`);\n return 2;\n }\n } finally {\n await globalFinalize(config!);\n if (logLevel() === 'info') {\n logger.info(\n `Renovate was run at log level \"${logLevel()}\". Set LOG_LEVEL=debug in environment variables to see extended debug logs.`,\n );\n }\n }\n const loggerErrors = getProblems().filter((p) => p.level >= ERROR);\n if (loggerErrors.length) {\n logger.info(\n { loggerErrors },\n 'Renovate is exiting with a non-zero code due to the following logged errors',\n );\n return 1;\n }\n return 0;\n}\n\nfunction repositoryToOwnerAndRepo(fullName: string): {\n owner: string;\n repo: string;\n} {\n const parts = fullName.split('/');\n const repo = coerceString(parts.pop());\n const owner = parts.join('/');\n return { owner, repo };\n}\n"],"mappings":"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"}
|
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": "44.14.
|
|
4
|
+
"version": "44.14.4",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"renovate": "dist/renovate.js",
|
|
@@ -267,7 +267,7 @@
|
|
|
267
267
|
"graphql": "16.14.2",
|
|
268
268
|
"husky": "9.1.7",
|
|
269
269
|
"jest-extended": "7.0.0",
|
|
270
|
-
"lint-staged": "17.
|
|
270
|
+
"lint-staged": "17.3.0",
|
|
271
271
|
"markdownlint-cli2": "0.23.2",
|
|
272
272
|
"markdownlint-cli2-formatter-template": "0.0.4",
|
|
273
273
|
"memfs": "4.64.0",
|
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 44.14.
|
|
3
|
+
"title": "JSON schema for Renovate 44.14.4 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "44.14.
|
|
5
|
+
"x-renovate-version": "44.14.4",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|