renovate 42.85.5 → 42.85.6

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.
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  "use strict";
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
4
5
  require("source-map-support/register");
5
6
  require("./punycode.cjs");
6
7
  const dequal_1 = require("dequal");
@@ -9,6 +10,7 @@ const app_strings_1 = require("./config/app-strings");
9
10
  const massage_1 = require("./config/massage");
10
11
  const migration_1 = require("./config/migration");
11
12
  const validation_1 = require("./config/validation");
13
+ const expose_cjs_1 = require("./expose.cjs");
12
14
  const logger_1 = require("./logger");
13
15
  const env_1 = require("./util/env");
14
16
  const file_1 = require("./workers/global/config/parse/file");
@@ -37,96 +39,118 @@ async function validate(configType, desc, config, strict, isPreset = false) {
37
39
  }
38
40
  }
39
41
  (async () => {
40
- const strictArgIndex = process.argv.indexOf('--strict');
41
- const strict = strictArgIndex >= 0;
42
- if (strict) {
43
- process.argv.splice(strictArgIndex, 1);
44
- }
45
- if (process.argv.length > 2) {
46
- for (const file of process.argv.slice(2)) {
47
- try {
48
- if (!(await (0, fs_extra_1.pathExists)(file))) {
49
- returnVal = 1;
50
- logger_1.logger.error({ file }, 'File does not exist');
51
- break;
52
- }
53
- const parsedContent = await (0, util_1.getParsedContent)(file);
42
+ const program = new commander_1.Command('renovate-config-validator')
43
+ .summary('Validate Renovate configuration files')
44
+ .description(`Validate your Renovate configuration (repo config, shared presets or global configuration) files\n` +
45
+ 'If no [config-files...] are given, renovate-config-validator will look at the default config file locations (https://docs.renovatebot.com/configuration-options/)')
46
+ .addHelpText('after', `
47
+ Examples:
48
+
49
+ $ renovate-config-validator
50
+ $ renovate-config-validator --strict
51
+ $ renovate-config-validator first_config.json
52
+ $ renovate-config-validator --strict config.js
53
+ $ env RENOVATE_CONFIG_FILE=obscure-name.json renovate-config-validator`)
54
+ .argument('[config-files...]')
55
+ .version(expose_cjs_1.pkg.version, '-v, --version')
56
+ .option('--strict', 'Fail command if any configuration warnings, errors, or a migration is needed')
57
+ // allow us to manage the exit code
58
+ .exitOverride();
59
+ program.action(async (files, opts) => {
60
+ const strict = opts.strict ?? false;
61
+ if (files.length) {
62
+ for (const file of files) {
54
63
  try {
55
- logger_1.logger.info(`Validating ${file}`);
56
- await validate('global', file, parsedContent, strict);
64
+ if (!(await (0, fs_extra_1.pathExists)(file))) {
65
+ returnVal = 1;
66
+ logger_1.logger.error({ file }, 'File does not exist');
67
+ break;
68
+ }
69
+ const parsedContent = await (0, util_1.getParsedContent)(file);
70
+ try {
71
+ logger_1.logger.info(`Validating ${file}`);
72
+ await validate('global', file, parsedContent, strict);
73
+ }
74
+ catch (err) {
75
+ logger_1.logger.warn({ file, err }, 'File is not valid Renovate config');
76
+ returnVal = 1;
77
+ }
57
78
  }
58
79
  catch (err) {
59
- logger_1.logger.warn({ file, err }, 'File is not valid Renovate config');
80
+ logger_1.logger.warn({ file, err }, 'File could not be parsed');
60
81
  returnVal = 1;
61
82
  }
62
83
  }
63
- catch (err) {
64
- logger_1.logger.warn({ file, err }, 'File could not be parsed');
65
- returnVal = 1;
66
- }
67
84
  }
68
- }
69
- else {
70
- for (const file of (0, app_strings_1.getConfigFileNames)().filter((name) => name !== 'package.json')) {
71
- try {
72
- if (!(await (0, fs_extra_1.pathExists)(file))) {
73
- continue;
74
- }
75
- const parsedContent = await (0, util_1.getParsedContent)(file);
85
+ else {
86
+ for (const file of (0, app_strings_1.getConfigFileNames)().filter((name) => name !== 'package.json')) {
76
87
  try {
77
- logger_1.logger.info(`Validating ${file}`);
78
- await validate('repo', file, parsedContent, strict);
88
+ if (!(await (0, fs_extra_1.pathExists)(file))) {
89
+ continue;
90
+ }
91
+ const parsedContent = await (0, util_1.getParsedContent)(file);
92
+ try {
93
+ logger_1.logger.info(`Validating ${file}`);
94
+ await validate('repo', file, parsedContent, strict);
95
+ }
96
+ catch (err) {
97
+ logger_1.logger.warn({ file, err }, 'File is not valid Renovate config');
98
+ returnVal = 1;
99
+ }
79
100
  }
80
101
  catch (err) {
81
- logger_1.logger.warn({ file, err }, 'File is not valid Renovate config');
102
+ logger_1.logger.warn({ file, err }, 'File could not be parsed');
82
103
  returnVal = 1;
83
104
  }
84
105
  }
85
- catch (err) {
86
- logger_1.logger.warn({ file, err }, 'File could not be parsed');
87
- returnVal = 1;
106
+ try {
107
+ const pkgJson = JSON.parse(await (0, fs_extra_1.readFile)('package.json', 'utf8'));
108
+ if (pkgJson.renovate) {
109
+ logger_1.logger.info(`Validating package.json > renovate`);
110
+ await validate('repo', 'package.json > renovate', pkgJson.renovate, strict);
111
+ }
112
+ if (pkgJson['renovate-config']) {
113
+ logger_1.logger.info(`Validating package.json > renovate-config`);
114
+ for (const presetConfig of Object.values(pkgJson['renovate-config'])) {
115
+ await validate('repo', 'package.json > renovate-config', presetConfig, strict, true);
116
+ }
117
+ }
88
118
  }
89
- }
90
- try {
91
- const pkgJson = JSON.parse(await (0, fs_extra_1.readFile)('package.json', 'utf8'));
92
- if (pkgJson.renovate) {
93
- logger_1.logger.info(`Validating package.json > renovate`);
94
- await validate('repo', 'package.json > renovate', pkgJson.renovate, strict);
119
+ catch {
120
+ // ignore
95
121
  }
96
- if (pkgJson['renovate-config']) {
97
- logger_1.logger.info(`Validating package.json > renovate-config`);
98
- for (const presetConfig of Object.values(pkgJson['renovate-config'])) {
99
- await validate('repo', 'package.json > renovate-config', presetConfig, strict, true);
122
+ try {
123
+ const env = (0, env_1.getEnv)();
124
+ const fileConfig = await (0, file_1.getConfig)(env);
125
+ if (!(0, dequal_1.dequal)(fileConfig, {})) {
126
+ const file = env.RENOVATE_CONFIG_FILE ?? 'config.js';
127
+ logger_1.logger.info(`Validating ${file}`);
128
+ try {
129
+ await validate('global', file, fileConfig, strict);
130
+ }
131
+ catch (err) {
132
+ logger_1.logger.error({ file, err }, 'File is not valid Renovate config');
133
+ returnVal = 1;
134
+ }
100
135
  }
101
136
  }
102
- }
103
- catch {
104
- // ignore
105
- }
106
- try {
107
- const env = (0, env_1.getEnv)();
108
- const fileConfig = await (0, file_1.getConfig)(env);
109
- if (!(0, dequal_1.dequal)(fileConfig, {})) {
110
- const file = env.RENOVATE_CONFIG_FILE ?? 'config.js';
111
- logger_1.logger.info(`Validating ${file}`);
112
- try {
113
- await validate('global', file, fileConfig, strict);
114
- }
115
- catch (err) {
116
- logger_1.logger.error({ file, err }, 'File is not valid Renovate config');
117
- returnVal = 1;
118
- }
137
+ catch {
138
+ // ignore
119
139
  }
120
140
  }
121
- catch {
122
- // ignore
141
+ if (returnVal !== 0) {
142
+ process.exit(returnVal);
123
143
  }
124
- }
125
- if (returnVal !== 0) {
126
- process.exit(returnVal);
127
- }
128
- logger_1.logger.info('Config validated successfully');
144
+ logger_1.logger.info('Config validated successfully');
145
+ });
146
+ await program.parseAsync();
129
147
  })().catch((e) => {
148
+ if (e instanceof commander_1.CommanderError) {
149
+ // Commander throws an error at the end of Action execution i.e. as part of the `help` command, and so we don't want to return an error code in this case
150
+ if (e.code === 'commander.helpDisplayed') {
151
+ return;
152
+ }
153
+ }
130
154
  // oxlint-disable-next-line no-console -- intentional: display critical error on CLI
131
155
  console.error(e);
132
156
  process.exit(99);
@@ -1 +1 @@
1
- {"version":3,"file":"config-validator.js","sourceRoot":"","sources":["../lib/config-validator.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport 'source-map-support/register';\nimport './punycode.cjs';\nimport { dequal } from 'dequal';\nimport { pathExists, readFile } from 'fs-extra';\nimport { getConfigFileNames } from './config/app-strings';\nimport { massageConfig } from './config/massage';\nimport { migrateConfig } from './config/migration';\nimport type { RenovateConfig } from './config/types';\nimport { validateConfig } from './config/validation';\nimport { logger } from './logger';\nimport { getEnv } from './util/env';\nimport { getConfig as getFileConfig } from './workers/global/config/parse/file';\nimport { getParsedContent } from './workers/global/config/parse/util';\n\nlet returnVal = 0;\n\nasync function validate(\n configType: 'global' | 'repo',\n desc: string,\n config: RenovateConfig,\n strict: boolean,\n isPreset = false,\n): Promise<void> {\n const { isMigrated, migratedConfig } = migrateConfig(config);\n if (isMigrated) {\n logger.warn(\n {\n oldConfig: config,\n newConfig: migratedConfig,\n },\n 'Config migration necessary',\n );\n if (strict) {\n returnVal = 1;\n }\n }\n const massagedConfig = massageConfig(migratedConfig);\n const res = await validateConfig(configType, massagedConfig, isPreset);\n if (res.errors.length) {\n logger.error(\n { file: desc, errors: res.errors },\n 'Found errors in configuration',\n );\n returnVal = 1;\n }\n if (res.warnings.length) {\n logger.warn(\n { file: desc, warnings: res.warnings },\n 'Found errors in configuration',\n );\n returnVal = 1;\n }\n}\n\ninterface PackageJson {\n renovate?: RenovateConfig;\n 'renovate-config'?: Record<string, RenovateConfig>;\n}\n\n(async () => {\n const strictArgIndex = process.argv.indexOf('--strict');\n const strict = strictArgIndex >= 0;\n if (strict) {\n process.argv.splice(strictArgIndex, 1);\n }\n if (process.argv.length > 2) {\n for (const file of process.argv.slice(2)) {\n try {\n if (!(await pathExists(file))) {\n returnVal = 1;\n logger.error({ file }, 'File does not exist');\n break;\n }\n const parsedContent = await getParsedContent(file);\n try {\n logger.info(`Validating ${file}`);\n await validate('global', file, parsedContent, strict);\n } catch (err) {\n logger.warn({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n } catch (err) {\n logger.warn({ file, err }, 'File could not be parsed');\n returnVal = 1;\n }\n }\n } else {\n for (const file of getConfigFileNames().filter(\n (name) => name !== 'package.json',\n )) {\n try {\n if (!(await pathExists(file))) {\n continue;\n }\n const parsedContent = await getParsedContent(file);\n try {\n logger.info(`Validating ${file}`);\n await validate('repo', file, parsedContent, strict);\n } catch (err) {\n logger.warn({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n } catch (err) {\n logger.warn({ file, err }, 'File could not be parsed');\n returnVal = 1;\n }\n }\n try {\n const pkgJson = JSON.parse(\n await readFile('package.json', 'utf8'),\n ) as PackageJson;\n if (pkgJson.renovate) {\n logger.info(`Validating package.json > renovate`);\n await validate(\n 'repo',\n 'package.json > renovate',\n pkgJson.renovate,\n strict,\n );\n }\n if (pkgJson['renovate-config']) {\n logger.info(`Validating package.json > renovate-config`);\n for (const presetConfig of Object.values(pkgJson['renovate-config'])) {\n await validate(\n 'repo',\n 'package.json > renovate-config',\n presetConfig,\n strict,\n true,\n );\n }\n }\n } catch {\n // ignore\n }\n try {\n const env = getEnv();\n const fileConfig = await getFileConfig(env);\n if (!dequal(fileConfig, {})) {\n const file = env.RENOVATE_CONFIG_FILE ?? 'config.js';\n logger.info(`Validating ${file}`);\n try {\n await validate('global', file, fileConfig, strict);\n } catch (err) {\n logger.error({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n }\n } catch {\n // ignore\n }\n }\n if (returnVal !== 0) {\n process.exit(returnVal);\n }\n logger.info('Config validated successfully');\n})().catch((e) => {\n // oxlint-disable-next-line no-console -- intentional: display critical error on CLI\n console.error(e);\n process.exit(99);\n});\n"]}
1
+ {"version":3,"file":"config-validator.js","sourceRoot":"","sources":["../lib/config-validator.ts"],"names":[],"mappings":"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","sourcesContent":["#!/usr/bin/env node\nimport { Command, CommanderError } from 'commander';\nimport 'source-map-support/register';\nimport './punycode.cjs';\nimport { dequal } from 'dequal';\nimport { pathExists, readFile } from 'fs-extra';\nimport { getConfigFileNames } from './config/app-strings';\nimport { massageConfig } from './config/massage';\nimport { migrateConfig } from './config/migration';\nimport type { RenovateConfig } from './config/types';\nimport { validateConfig } from './config/validation';\nimport { pkg } from './expose.cjs';\nimport { logger } from './logger';\nimport { getEnv } from './util/env';\nimport { getConfig as getFileConfig } from './workers/global/config/parse/file';\nimport { getParsedContent } from './workers/global/config/parse/util';\n\nlet returnVal = 0;\n\nasync function validate(\n configType: 'global' | 'repo',\n desc: string,\n config: RenovateConfig,\n strict: boolean,\n isPreset = false,\n): Promise<void> {\n const { isMigrated, migratedConfig } = migrateConfig(config);\n if (isMigrated) {\n logger.warn(\n {\n oldConfig: config,\n newConfig: migratedConfig,\n },\n 'Config migration necessary',\n );\n if (strict) {\n returnVal = 1;\n }\n }\n const massagedConfig = massageConfig(migratedConfig);\n const res = await validateConfig(configType, massagedConfig, isPreset);\n if (res.errors.length) {\n logger.error(\n { file: desc, errors: res.errors },\n 'Found errors in configuration',\n );\n returnVal = 1;\n }\n if (res.warnings.length) {\n logger.warn(\n { file: desc, warnings: res.warnings },\n 'Found errors in configuration',\n );\n returnVal = 1;\n }\n}\n\ninterface PackageJson {\n renovate?: RenovateConfig;\n 'renovate-config'?: Record<string, RenovateConfig>;\n}\n\n(async () => {\n const program = new Command('renovate-config-validator')\n .summary('Validate Renovate configuration files')\n .description(\n `Validate your Renovate configuration (repo config, shared presets or global configuration) files\\n` +\n 'If no [config-files...] are given, renovate-config-validator will look at the default config file locations (https://docs.renovatebot.com/configuration-options/)',\n )\n .addHelpText(\n 'after',\n `\nExamples:\n\n $ renovate-config-validator\n $ renovate-config-validator --strict\n $ renovate-config-validator first_config.json\n $ renovate-config-validator --strict config.js\n $ env RENOVATE_CONFIG_FILE=obscure-name.json renovate-config-validator`,\n )\n .argument('[config-files...]')\n .version(pkg.version, '-v, --version')\n .option(\n '--strict',\n 'Fail command if any configuration warnings, errors, or a migration is needed',\n )\n // allow us to manage the exit code\n .exitOverride();\n\n program.action(async (files, opts) => {\n const strict = opts.strict ?? false;\n\n if (files.length) {\n for (const file of files) {\n try {\n if (!(await pathExists(file))) {\n returnVal = 1;\n logger.error({ file }, 'File does not exist');\n break;\n }\n const parsedContent = await getParsedContent(file);\n try {\n logger.info(`Validating ${file}`);\n await validate('global', file, parsedContent, strict);\n } catch (err) {\n logger.warn({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n } catch (err) {\n logger.warn({ file, err }, 'File could not be parsed');\n returnVal = 1;\n }\n }\n } else {\n for (const file of getConfigFileNames().filter(\n (name) => name !== 'package.json',\n )) {\n try {\n if (!(await pathExists(file))) {\n continue;\n }\n const parsedContent = await getParsedContent(file);\n try {\n logger.info(`Validating ${file}`);\n await validate('repo', file, parsedContent, strict);\n } catch (err) {\n logger.warn({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n } catch (err) {\n logger.warn({ file, err }, 'File could not be parsed');\n returnVal = 1;\n }\n }\n try {\n const pkgJson = JSON.parse(\n await readFile('package.json', 'utf8'),\n ) as PackageJson;\n if (pkgJson.renovate) {\n logger.info(`Validating package.json > renovate`);\n await validate(\n 'repo',\n 'package.json > renovate',\n pkgJson.renovate,\n strict,\n );\n }\n if (pkgJson['renovate-config']) {\n logger.info(`Validating package.json > renovate-config`);\n for (const presetConfig of Object.values(\n pkgJson['renovate-config'],\n )) {\n await validate(\n 'repo',\n 'package.json > renovate-config',\n presetConfig,\n strict,\n true,\n );\n }\n }\n } catch {\n // ignore\n }\n try {\n const env = getEnv();\n const fileConfig = await getFileConfig(env);\n if (!dequal(fileConfig, {})) {\n const file = env.RENOVATE_CONFIG_FILE ?? 'config.js';\n logger.info(`Validating ${file}`);\n try {\n await validate('global', file, fileConfig, strict);\n } catch (err) {\n logger.error({ file, err }, 'File is not valid Renovate config');\n returnVal = 1;\n }\n }\n } catch {\n // ignore\n }\n }\n if (returnVal !== 0) {\n process.exit(returnVal);\n }\n logger.info('Config validated successfully');\n });\n\n await program.parseAsync();\n})().catch((e) => {\n if (e instanceof CommanderError) {\n // Commander throws an error at the end of Action execution i.e. as part of the `help` command, and so we don't want to return an error code in this case\n if (e.code === 'commander.helpDisplayed') {\n return;\n }\n }\n\n // oxlint-disable-next-line no-console -- intentional: display critical error on CLI\n console.error(e);\n process.exit(99);\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": "42.85.5",
4
+ "version": "42.85.6",
5
5
  "type": "commonjs",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",
@@ -217,6 +217,7 @@
217
217
  "re2": "1.23.0"
218
218
  },
219
219
  "devDependencies": {
220
+ "@commander-js/extra-typings": "14.0.0",
220
221
  "@containerbase/eslint-plugin": "1.1.27",
221
222
  "@containerbase/istanbul-reports-html": "1.1.24",
222
223
  "@containerbase/semantic-release-pnpm": "1.3.15",
@@ -1,7 +1,7 @@
1
1
  {
2
- "title": "JSON schema for Renovate 42.85.5 config files (https://renovatebot.com/)",
2
+ "title": "JSON schema for Renovate 42.85.6 config files (https://renovatebot.com/)",
3
3
  "$schema": "http://json-schema.org/draft-07/schema#",
4
- "x-renovate-version": "42.85.5",
4
+ "x-renovate-version": "42.85.6",
5
5
  "allowComments": true,
6
6
  "type": "object",
7
7
  "properties": {