UNPKG

@oclif/core

Version:

base library for oclif CLIs

119 lines (118 loc) 5.16 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.cacheCommand = cacheCommand; const aggregate_flags_1 = require("./aggregate-flags"); const cache_default_value_1 = require("./cache-default-value"); const ensure_arg_object_1 = require("./ensure-arg-object"); const util_1 = require("./util"); // In order to collect static properties up the inheritance chain, we need to recursively // access the prototypes until there's nothing left. This allows us to combine baseFlags // and flags as well as add in the json flag if enableJsonFlag is enabled. function mergePrototype(result, cmd) { const proto = Object.getPrototypeOf(cmd); const filteredProto = (0, util_1.pickBy)(proto, (v) => v !== undefined); return Object.keys(proto).length > 0 ? mergePrototype({ ...filteredProto, ...result }, proto) : result; } async function cacheFlags(cmdFlags, respectNoCacheDefault) { const promises = Object.entries(cmdFlags).map(async ([name, flag]) => [ name, { aliases: flag.aliases, char: flag.char, charAliases: flag.charAliases, dependsOn: flag.dependsOn, deprecateAliases: flag.deprecateAliases, deprecated: flag.deprecated, description: flag.description, env: flag.env, exclusive: flag.exclusive, helpGroup: flag.helpGroup, helpLabel: flag.helpLabel, hidden: flag.hidden, name, noCacheDefault: flag.noCacheDefault, relationships: flag.relationships, required: flag.required, summary: flag.summary, ...(flag.type === 'boolean' ? { allowNo: flag.allowNo, type: flag.type, } : { default: await (0, cache_default_value_1.cacheDefaultValue)(flag, respectNoCacheDefault), delimiter: flag.delimiter, hasDynamicHelp: typeof flag.defaultHelp === 'function', helpValue: flag.helpValue, multiple: flag.multiple, options: flag.options, type: flag.type, }), }, ]); return Object.fromEntries(await Promise.all(promises)); } async function cacheArgs(cmdArgs, respectNoCacheDefault) { const promises = Object.entries(cmdArgs).map(async ([name, arg]) => [ name, { default: await (0, cache_default_value_1.cacheDefaultValue)(arg, respectNoCacheDefault), description: arg.description, hidden: arg.hidden, name, noCacheDefault: arg.noCacheDefault, options: arg.options, required: arg.required, }, ]); return Object.fromEntries(await Promise.all(promises)); } async function cacheCommand(uncachedCmd, plugin, respectNoCacheDefault = false) { const cmd = mergePrototype(uncachedCmd, uncachedCmd); // @ts-expect-error because v2 commands have flags stored in _flags const uncachedFlags = cmd.flags ?? cmd._flags; // @ts-expect-error because v2 commands have base flags stored in _baseFlags const uncachedBaseFlags = cmd.baseFlags ?? cmd._baseFlags; const [flags, args] = await Promise.all([ cacheFlags((0, aggregate_flags_1.aggregateFlags)(uncachedFlags, uncachedBaseFlags, cmd.enableJsonFlag), respectNoCacheDefault), cacheArgs((0, ensure_arg_object_1.ensureArgObject)(cmd.args), respectNoCacheDefault), ]); const stdProperties = { // Replace all spaces in aliases with colons to standardize them. aliases: (cmd.aliases ?? []).map((a) => a.replaceAll(' ', ':')), args, deprecateAliases: cmd.deprecateAliases, deprecationOptions: cmd.deprecationOptions, description: cmd.description, // Support both `examples` and `example` for backwards compatibility. examples: cmd.examples ?? cmd.example, flags, hasDynamicHelp: Object.values(flags).some((f) => f.hasDynamicHelp), hidden: cmd.hidden, hiddenAliases: cmd.hiddenAliases ?? [], id: cmd.id, pluginAlias: plugin && plugin.alias, pluginName: plugin && plugin.name, pluginType: plugin && plugin.type, state: cmd.state, strict: cmd.strict, summary: cmd.summary, usage: cmd.usage, }; // do not include these properties in manifest const ignoreCommandProperties = [ 'plugin', '_flags', '_enableJsonFlag', '_globalFlags', '_baseFlags', 'baseFlags', '_--', '_base', ]; // Add in any additional properties that are not standard command properties. const stdKeysAndIgnored = new Set([...ignoreCommandProperties, ...Object.keys(stdProperties)]); const keysToAdd = Object.keys(cmd).filter((property) => !stdKeysAndIgnored.has(property)); const additionalProperties = Object.fromEntries(keysToAdd.map((key) => [key, cmd[key]])); return { ...stdProperties, ...additionalProperties }; }