aws-cdk
Version:
AWS CDK CLI, the command line tool for CDK apps
96 lines • 12.6 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.findUnknownOptions = findUnknownOptions;
// eslint-disable-next-line @typescript-eslint/no-require-imports
const config = require('../cli-type-registry.json');
/**
* Build a set of all known option names for a given option definitions object.
* Includes the kebab-case name, its camelCase equivalent, all aliases, and negativeAliases.
*
* @param optionDefs - Option definitions keyed by their kebab-case CLI names
* (as defined in cli-type-registry.json). Each key is converted to camelCase
* and both forms are included in the returned set.
*/
function collectKnownOptions(optionDefs) {
const known = new Set();
for (const [name, def] of Object.entries(optionDefs)) {
known.add(name);
known.add(kebabToCamel(name));
if (def.alias) {
const aliases = Array.isArray(def.alias) ? def.alias : [def.alias];
for (const a of aliases) {
known.add(a);
}
}
if (def.negativeAlias) {
known.add(def.negativeAlias);
}
}
return known;
}
/** Pre-computed set of known global options (static, doesn't depend on argv) */
const globalKnownOptions = collectKnownOptions(config.globalOptions);
/** Reverse mapping from command alias to canonical command name */
const commandAliasMap = new Map();
for (const [name, def] of Object.entries(config.commands)) {
if (def.aliases) {
for (const alias of def.aliases) {
commandAliasMap.set(alias, name);
}
}
}
/** yargs internal keys that are always present in argv */
const yargsInternals = new Set(['_', '$0', 'help', 'h', 'version']);
/**
* Detect unrecognized CLI options.
*
* Yargs does not enable strict option checking by default, so unknown flags
* are silently swallowed. This function compares the parsed argv keys against
* the known global and command options from the CLI type registry and returns
* any that don't match.
*/
function findUnknownOptions(argv) {
const command = argv._[0];
const canonicalCommand = commandAliasMap.get(command) ?? command;
const commandDef = config.commands[canonicalCommand];
const commandKnownOptions = commandDef?.options
? collectKnownOptions(commandDef.options)
: new Set();
const positionalArgRaw = commandDef?.arg?.name;
const positionalArgs = positionalArgRaw
? new Set([positionalArgRaw, positionalArgRaw.toLowerCase()])
: new Set();
const unknown = [];
for (const key of Object.keys(argv)) {
if (argv[key] === undefined) {
continue;
}
if (yargsInternals.has(key) || positionalArgs.has(key)) {
continue;
}
if (globalKnownOptions.has(key) || commandKnownOptions.has(key)) {
continue;
}
// yargs .env('CDK') injects CDK_* environment variables as camelCase argv
// keys (e.g. CDK_INTEG_ATMOSPHERE_POOL -> integAtmospherePool). These are
// intentional configuration from the environment, not user typos.
if (isFromEnvPrefix(key, 'CDK')) {
continue;
}
unknown.push(key);
}
return unknown;
}
function kebabToCamel(str) {
return str.replace(/-([a-z])/g, (_, c) => c.toUpperCase());
}
/**
* Checks whether a camelCase argv key was injected by yargs' .env(PREFIX)
* feature. yargs converts PREFIX_FOO_BAR env vars into camelCase keys
* (fooBar). We reverse the mapping and check if the env var exists.
*/
function isFromEnvPrefix(key, prefix) {
const screamingSnake = key.replace(/[A-Z]/g, (m) => `_${m}`).toUpperCase();
return process.env[`${prefix}_${screamingSnake}`] !== undefined;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2stdW5rbm93bi1vcHRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2hlY2stdW5rbm93bi1vcHRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBcURBLGdEQW9DQztBQXpGRCxpRUFBaUU7QUFDakUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLDJCQUEyQixDQUFDLENBQUM7QUFFcEQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsbUJBQW1CLENBQUMsVUFBK0I7SUFDMUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUNoQyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBTSxVQUFVLENBQUMsRUFBRSxDQUFDO1FBQzFELEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUM5QixJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNkLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNuRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2YsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN0QixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixN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QUNsRCxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzNFLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sSUFBSSxjQUFjLEVBQUUsQ0FBQyxLQUFLLFNBQVMsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbmNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NsaS10eXBlLXJlZ2lzdHJ5Lmpzb24nKTtcblxuLyoqXG4gKiBCdWlsZCBhIHNldCBvZiBhbGwga25vd24gb3B0aW9uIG5hbWVzIGZvciBhIGdpdmVuIG9wdGlvbiBkZWZpbml0aW9ucyBvYmplY3QuXG4gKiBJbmNsdWRlcyB0aGUga2ViYWItY2FzZSBuYW1lLCBpdHMgY2FtZWxDYXNlIGVxdWl2YWxlbnQsIGFsbCBhbGlhc2VzLCBhbmQgbmVnYXRpdmVBbGlhc2VzLlxuICpcbiAqIEBwYXJhbSBvcHRpb25EZWZzIC0gT3B0aW9uIGRlZmluaXRpb25zIGtleWVkIGJ5IHRoZWlyIGtlYmFiLWNhc2UgQ0xJIG5hbWVzXG4gKiAgIChhcyBkZWZpbmVkIGluIGNsaS10eXBlLXJlZ2lzdHJ5Lmpzb24pLiBFYWNoIGtleSBpcyBjb252ZXJ0ZWQgdG8gY2FtZWxDYXNlXG4gKiAgIGFuZCBib3RoIGZvcm1zIGFyZSBpbmNsdWRlZCBpbiB0aGUgcmV0dXJuZWQgc2V0LlxuICovXG5mdW5jdGlvbiBjb2xsZWN0S25vd25PcHRpb25zKG9wdGlvbkRlZnM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGtub3duID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgW25hbWUsIGRlZl0gb2YgT2JqZWN0LmVudHJpZXM8YW55PihvcHRpb25EZWZzKSkge1xuICAgIGtub3duLmFkZChuYW1lKTtcbiAgICBrbm93bi5hZGQoa2ViYWJUb0NhbWVsKG5hbWUpKTtcbiAgICBpZiAoZGVmLmFsaWFzKSB7XG4gICAgICBjb25zdCBhbGlhc2VzID0gQXJyYXkuaXNBcnJheShkZWYuYWxpYXMpID8gZGVmLmFsaWFzIDogW2RlZi5hbGlhc107XG4gICAgICBmb3IgKGNvbnN0IGEgb2YgYWxpYXNlcykge1xuICAgICAgICBrbm93bi5hZGQoYSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWYubmVnYXRpdmVBbGlhcykge1xuICAgICAga25vd24uYWRkKGRlZi5uZWdhdGl2ZUFsaWFzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGtub3duO1xufVxuXG4vKiogUHJlLWNvbXB1dGVkIHNldCBvZiBrbm93biBnbG9iYWwgb3B0aW9ucyAoc3RhdGljLCBkb2Vzbid0IGRlcGVuZCBvbiBhcmd2KSAqL1xuY29uc3QgZ2xvYmFsS25vd25PcHRpb25zID0gY29sbGVjdEtub3duT3B0aW9ucyhjb25maWcuZ2xvYmFsT3B0aW9ucyk7XG5cbi8qKiBSZXZlcnNlIG1hcHBpbmcgZnJvbSBjb21tYW5kIGFsaWFzIHRvIGNhbm9uaWNhbCBjb21tYW5kIG5hbWUgKi9cbmNvbnN0IGNvbW1hbmRBbGlhc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5mb3IgKGNvbnN0IFtuYW1lLCBkZWZdIG9mIE9iamVjdC5lbnRyaWVzPGFueT4oY29uZmlnLmNvbW1hbmRzKSkge1xuICBpZiAoZGVmLmFsaWFzZXMpIHtcbiAgICBmb3IgKGNvbnN0IGFsaWFzIG9mIGRlZi5hbGlhc2VzKSB7XG4gICAgICBjb21tYW5kQWxpYXNNYXAuc2V0KGFsaWFzLCBuYW1lKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIHlhcmdzIGludGVybmFsIGtleXMgdGhhdCBhcmUgYWx3YXlzIHByZXNlbnQgaW4gYXJndiAqL1xuY29uc3QgeWFyZ3NJbnRlcm5hbHMgPSBuZXcgU2V0KFsnXycsICckMCcsICdoZWxwJywgJ2gnLCAndmVyc2lvbiddKTtcblxuLyoqXG4gKiBEZXRlY3QgdW5yZWNvZ25pemVkIENMSSBvcHRpb25zLlxuICpcbiAqIFlhcmdzIGRvZXMgbm90IGVuYWJsZSBzdHJpY3Qgb3B0aW9uIGNoZWNraW5nIGJ5IGRlZmF1bHQsIHNvIHVua25vd24gZmxhZ3NcbiAqIGFyZSBzaWxlbnRseSBzd2FsbG93ZWQuIFRoaXMgZnVuY3Rpb24gY29tcGFyZXMgdGhlIHBhcnNlZCBhcmd2IGtleXMgYWdhaW5zdFxuICogdGhlIGtub3duIGdsb2JhbCBhbmQgY29tbWFuZCBvcHRpb25zIGZyb20gdGhlIENMSSB0eXBlIHJlZ2lzdHJ5IGFuZCByZXR1cm5zXG4gKiBhbnkgdGhhdCBkb24ndCBtYXRjaC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRVbmtub3duT3B0aW9ucyhhcmd2OiBhbnkpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGNvbW1hbmQgPSBhcmd2Ll9bMF07XG4gIGNvbnN0IGNhbm9uaWNhbENvbW1hbmQgPSBjb21tYW5kQWxpYXNNYXAuZ2V0KGNvbW1hbmQpID8/IGNvbW1hbmQ7XG5cbiAgY29uc3QgY29tbWFuZERlZiA9IGNvbmZpZy5jb21tYW5kc1tjYW5vbmljYWxDb21tYW5kXTtcbiAgY29uc3QgY29tbWFuZEtub3duT3B0aW9ucyA9IGNvbW1hbmREZWY/Lm9wdGlvbnNcbiAgICA/IGNvbGxlY3RLbm93bk9wdGlvbnMoY29tbWFuZERlZi5vcHRpb25zKVxuICAgIDogbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3QgcG9zaXRpb25hbEFyZ1JhdyA9IGNvbW1hbmREZWY/LmFyZz8ubmFtZTtcbiAgY29uc3QgcG9zaXRpb25hbEFyZ3MgPSBwb3NpdGlvbmFsQXJnUmF3XG4gICAgPyBuZXcgU2V0KFtwb3NpdGlvbmFsQXJnUmF3LCBwb3NpdGlvbmFsQXJnUmF3LnRvTG93ZXJDYXNlKCldKVxuICAgIDogbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3QgdW5rbm93bjogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoYXJndikpIHtcbiAgICBpZiAoYXJndltrZXldID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoeWFyZ3NJbnRlcm5hbHMuaGFzKGtleSkgfHwgcG9zaXRpb25hbEFyZ3MuaGFzKGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoZ2xvYmFsS25vd25PcHRpb25zLmhhcyhrZXkpIHx8IGNvbW1hbmRLbm93bk9wdGlvbnMuaGFzKGtleSkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICAvLyB5YXJncyAuZW52KCdDREsnKSBpbmplY3RzIENES18qIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBjYW1lbENhc2UgYXJndlxuICAgIC8vIGtleXMgKGUuZy4gQ0RLX0lOVEVHX0FUTU9TUEhFUkVfUE9PTCAtPiBpbnRlZ0F0bW9zcGhlcmVQb29sKS4gVGhlc2UgYXJlXG4gICAgLy8gaW50ZW50aW9uYWwgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBlbnZpcm9ubWVudCwgbm90IHVzZXIgdHlwb3MuXG4gICAgaWYgKGlzRnJvbUVudlByZWZpeChrZXksICdDREsnKSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgdW5rbm93bi5wdXNoKGtleSk7XG4gIH1cblxuICByZXR1cm4gdW5rbm93bjtcbn1cblxuZnVuY3Rpb24ga2ViYWJUb0NhbWVsKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC8tKFthLXpdKS9nLCAoXywgYykgPT4gYy50b1VwcGVyQ2FzZSgpKTtcbn1cblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBhIGNhbWVsQ2FzZSBhcmd2IGtleSB3YXMgaW5qZWN0ZWQgYnkgeWFyZ3MnIC5lbnYoUFJFRklYKVxuICogZmVhdHVyZS4geWFyZ3MgY29udmVydHMgUFJFRklYX0ZPT19CQVIgZW52IHZhcnMgaW50byBjYW1lbENhc2Uga2V5c1xuICogKGZvb0JhcikuIFdlIHJldmVyc2UgdGhlIG1hcHBpbmcgYW5kIGNoZWNrIGlmIHRoZSBlbnYgdmFyIGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gaXNGcm9tRW52UHJlZml4KGtleTogc3RyaW5nLCBwcmVmaXg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBzY3JlYW1pbmdTbmFrZSA9IGtleS5yZXBsYWNlKC9bQS1aXS9nLCAobSkgPT4gYF8ke219YCkudG9VcHBlckNhc2UoKTtcbiAgcmV0dXJuIHByb2Nlc3MuZW52W2Ake3ByZWZpeH1fJHtzY3JlYW1pbmdTbmFrZX1gXSAhPT0gdW5kZWZpbmVkO1xufVxuIl19