@zowe/imperative
Version:
framework for building configurable CLIs
541 lines • 24.6 kB
TypeScript
import { IProfArgAttrs } from "./doc/IProfArgAttrs";
import { IProfAttrs } from "./doc/IProfAttrs";
import { IProfLocOsLoc } from "./doc/IProfLoc";
import { IProfMergeArgOpts } from "./doc/IProfMergeArgOpts";
import { IProfMergedArg } from "./doc/IProfMergedArg";
import { IConfigSchema } from "./doc/IConfigSchema";
import { IProfOpts } from "./doc/IProfOpts";
import { Config } from "./Config";
import { IConfigOpts } from "./doc/IConfigOpts";
import { IProfileLoaded, IProfileSchema } from "../../profiles";
import { IOptionsForAddConnProps, ISession, Session } from "../../rest";
import { IProfInfoUpdateKnownPropOpts, IProfInfoUpdatePropOpts } from "./doc/IProfInfoUpdatePropOpts";
import { IGetAllProfilesOptions } from "./doc/IProfInfoProps";
import { IProfInfoRemoveKnownPropOpts } from "./doc/IProfInfoRemoveKnownPropOpts";
import { IAddProfTypeResult, IExtenderTypeInfo } from "./doc/IExtenderOpts";
import { IConfigLayer } from "..";
/**
* This class provides functions to retrieve profile-related information.
* It can load the relevant configuration files, merge all possible
* profile argument values using the Zowe order-of-precedence, and
* access desired profile attributes from the Zowe configuration settings.
*
* Pseudocode examples:
* <pre>
* // Construct a new object. Use it to read the profiles from disk.
* // ProfileInfo functions throw a ProfInfoErr exception for errors.
* // You can catch those errors and test the errorCode for known
* // values. We are only showing the try/catch on the function
* // below, but it applies to any ProfileInfo function.
* profInfo = new ProfileInfo("zowe");
* try {
* await profInfo.readProfilesFromDisk();
* } catch(err) {
* if (err instanceof ProfInfoErr) {
* if (err.errcode == ProfInfoErr.CANT_GET_SCHEMA_URL) {
* youTakeAnAlternateAction();
* } else {
* // report the error
* }
* } else {
* // handle other exceptions
* }
* }
*
* // Maybe you want the list of all zosmf profiles
* let arrayOfProfiles = profInfo.getAllProfiles("zosmf");
* youDisplayTheListOfProfiles(arrayOfProfiles);
*
* // Maybe you want the default zosmf profile
* let zosmfProfile = profInfo.getDefaultProfile("zosmf");
* youUseTheProfile(zosmfProfile);
*
* // Maybe you want the arg values for the default JCLCheck profile
* let jckProfile = profInfo.getDefaultProfile("jclcheck");
* let jckMergedArgs = profInfo.mergeArgsForProfile(jckProfile);
* let jckFinalArgs = youPromptForMissingArgsAndCombineWithKnownArgs(
* jckMergedArgs.knownArgs, jckMergedArgs.missingArgs
* );
* youRunJclCheck(jckFinalArgs);
*
* // Maybe no profile of type "zosmf" even exists.
* let zosmfProfiles = profInfo.getAllProfiles("zosmf");
* if (zosmfProfiles.length == 0) {
* // No zosmf profile exists
* // Merge any required arg values for the zosmf profile type
* let zosmfMergedArgs =
* profInfo.mergeArgsForProfileType("zosmf");
*
* // Values of secure arguments must be loaded separately. You can
* // freely log the contents of zosmfMergedArgs without leaking secure
* // argument values, until they are loaded with the lines below.
* zosmfMergedArgs.knownArgs.forEach((arg) => {
* if (arg.secure) arg.argValue = profInfo.loadSecureArg(arg);
* });
*
* let finalZosmfArgs =
* youPromptForMissingArgsAndCombineWithKnownArgs(
* zosmfMergedArgs.knownArgs,
* zosmfMergedArgs.missingArgs
* );
* youRunSomeZosmfCommand(finalZosmfArgs);
* }
*
* // So you want to write to a config file?
* // You must use the Config API to write to a team configuration.
* // See the Config class documentation for functions to set
* // and save team config arguments.
*
* // Let's save some zosmf arguments from the example above.
* let yourZosmfArgsToWrite: IProfArgAttrs =
* youSetValuesToOverwrite(
* zosmfMergedArgs.knownArgs, zosmfMergedArgs.missingArgs
* );
*
* let configObj: Config = profInfo.getTeamConfig();
* youWriteArgValuesUsingConfigObj(
* configObj, yourZosmfArgsToWrite
* );
* </pre>
*/
export declare class ProfileInfo {
private mLoadedConfig;
private mAppName;
private mImpLogger;
private mOverrideWithEnv;
private mHasValidSchema;
/**
* Cache of profile schema objects mapped by profile type and config path
* if applicable. Example of map keys:
* - For team config: "/root/.zowe/zowe.config.json:zosmf"
*/
private mProfileSchemaCache;
private mCredentials;
private mExtendersJson;
/**
* Constructor for ProfileInfo class.
*
* @param appName
* The name of the application (like "zowe" in zowe.config.json)
* whose configuration you want to access.
*
* @param profInfoOpts
* Options that will control the behavior of ProfileInfo.
*/
constructor(appName: string, profInfoOpts?: IProfOpts);
/**
* Checks if a JSON web token is used for authenticating the given profile
* name. If so, it will decode the token to determine whether it has
* expired.
*
* @param {string | IProfileLoaded} profile
* The name of the profile or the profile object to check the JSON web
* token for
* @returns {boolean}
* Whether the token has expired for the given profile. Returns `false`
* if a token value is not set or the token type is LTPA2.
*/
hasTokenExpiredForProfile(profile: string | IProfileLoaded): boolean;
/**
* Update a given property in the config file.
* @param options Set of options needed to update a given property
*/
updateProperty(options: IProfInfoUpdatePropOpts): Promise<void>;
/**
* Update a given property with the value provided.
* This function only works for properties that can be found in the config files (including secure arrays).
* If the property cannot be found, this function will resolve to false
* @param options Set of options required to update a known property
*/
updateKnownProperty(options: IProfInfoUpdateKnownPropOpts): Promise<boolean>;
/**
* Remove a known property from the ProfileInfo class
* This method will call the updateKnownProperty method with a value set to `undefined` and serves as a helper function
* to make is easier to understand when a known property is removed.
* @example
* The example below describes how to remove a property
* ```
* // Using the removeKnownProperty method
* profileInfo.removeKnownProperty({mergedArgs, property: "someProperty"});
* // Using the updateKnownProperty method
* profileInfo.updateKnownProperty({mergedArgs, property: "someProperty", value: undefined, isSecure: false});
* ```
* @param options Set of options required to remove a known property
* @returns Returns a boolean indicating if the property has been removed
*/
removeKnownProperty(options: IProfInfoRemoveKnownPropOpts): Promise<boolean>;
/**
* Get all of the typed profiles in the configuration.
*
* @param profileType
* Limit selection to only profiles of the specified type.
* If not supplied, the names of all typed profiles are returned.
*
* @returns An array of profile attribute objects.
* In addition to the name, you get the profile type,
* an indicator of whether the profile is the default profile
* for that type, and the location of that profile.
*
* If no profile exists for the specified type (or if
* no profiles of any kind exist), we return an empty array
* ie, length is zero.
*/
getAllProfiles(profileType?: string, options?: IGetAllProfilesOptions): IProfAttrs[];
/**
* Get the default profile for the specified profile type.
*
* @param profileType
* The type of profile of interest.
*
* @returns The default profile. If no profile exists
* for the specified type, we return null;
*/
getDefaultProfile(profileType: string): IProfAttrs | null;
/**
* Get the Config object used to manipulate the team configuration on disk.
*
* Our current market direction is to encourage customers to edit the
* team configuration files in their favorite text editor.
*
* If you must ignore this recommended practice, you must use the Config
* class to manipulate the team config files. This class has a more detailed
* and therefore more complicated API, but it does contain functions to
* write data to the team configuration files.
*
* You must call ProfileInfo.readProfilesFromDisk() before calling this function.
*
* @returns An instance of the Config class that can be used to manipulate
* the team configuration on disk.
*/
getTeamConfig(): Config;
/**
* Helper function to identify if the existing config is secure or not
* @returns true if the teamConfig is storing credentials securely, false otherwise
*/
isSecured(): boolean;
/**
* Create a session from profile arguments that have been retrieved from
* ProfileInfo functions.
*
* @param profArgs
* An array of profile arguments.
*
* @param connOpts
* Options that alter our actions. See IOptionsForAddConnProps.
* The connOpts parameter need not be supplied.
* Default properties may be added to any supplied connOpts.
* The only option values used by this function are:
* connOpts.requestToken
* connOpts.defaultTokenType
*
* @returns A session that can be used to connect to a remote host.
*/
static createSession(profArgs: IProfArgAttrs[], connOpts?: IOptionsForAddConnProps): Session;
/**
* Merge all of the available values for arguments defined for the
* specified profile. Values are retrieved from the following sources.
* Each successive source will override the previous source.
* - A default value for the argument that is defined in the profile definition.
* - A value defined in the base profile.
* - A value defined in the specified service profile.
* - For a team configuration, both the base profile values and the
* service profile values will be overridden with values from a
* zowe.config.user.json file (if it exists).
* - An environment variable for that argument (if environment overrides
* are enabled).
*
* @param profile
* The profile whose arguments are to be merged.
*
* @param mergeOpts
* Options to use when merging arguments.
* This parameter is not required. Defaults will be used.
*
* @returns An object that contains an array of known profile argument
* values and an array of required profile arguments which
* have no value assigned. Either of the two arrays could be
* of zero length, depending on the user's configuration and
* environment.
*
* We will return null if the profile does not exist
* in the current Zowe configuration.
*/
mergeArgsForProfile(profile: IProfAttrs, mergeOpts?: IProfMergeArgOpts): IProfMergedArg;
/**
* Merge all of the available values for arguments defined for the
* specified profile type. See mergeArgsForProfile() for details
* about the merging algorithm.
* The intended use is when no profile of a specific type exists.
* The consumer app can prompt for values for missing arguments
* and then perform the desired operation.
*
* @param profileType
* The type of profile of interest.
*
* @param mergeOpts
* Options to use when merging arguments.
* This parameter is not required. Defaults will be used.
*
* @returns The complete set of required properties;
*/
mergeArgsForProfileType(profileType: string, mergeOpts?: IProfMergeArgOpts): IProfMergedArg;
/**
* Retrieves the Zowe CLI home directory. In the situation Imperative has
* not initialized it we use a default value.
* @returns {string} - Returns the Zowe home directory
* @deprecated Use ConfigUtils.getZoweDir()
*/
static getZoweDir(): string;
/**
* Returns an indicator that the user has no team configuration, but we
* detected the existence of old-school V1 profiles. We will not work with the
* V1 profiles. This function can let you tell a user that they are incorrectly
* trying to use V1 profiles.
* @deprecated Use non-static method instead to detect V2 profiles
* @returns {boolean} `true` if a V1 profile exists, and `false` otherwise.
*/
static get onlyV1ProfilesExist(): boolean;
/**
* Returns an indicator that the user has no team configuration, but we
* detected the existence of old-school V1 profiles. We will not work with the
* V1 profiles. This function can let you tell a user that they are incorrectly
* trying to use V1 profiles.
*
* @returns True - Means there is *NO* team config *AND* we detected that a V1 profile exists.
* False otherwise.
*/
get onlyV1ProfilesExist(): boolean;
/**
* Convert an IProfAttrs object into an IProfileLoaded objects
* This is a convenience function. IProfileLoaded was frequently passed
* among functions. This conversion function allows existing code to
* acquire values in the IProfAttrs structure but pass those values
* around in the older IProfileLoaded structure. The IProfAttrs
* properties will be copied as follows:
*
* IProfileLoaded.name <-- IProfAttrs.profName
* IProfileLoaded.type <-- IProfAttrs.profType
* IProfileLoaded.profile <-- profAttrs
*
* @param profAttrs
* A profile attributes object.
*
* @param dfltProfLoadedVals
* A JSON object containing additional names from IProfileLoaded for
* which a value should be supplied. IProfileLoaded contains more
* properties than IProfAttrs. The items in this object will be
* placed into the resulting IProfileLoaded object.
* We use type "any" because all of the required properties of
* IProfileLoaded will not be supplied by dfltProfLoadedVals.
* If dfltProfLoadedVals is not supplied, only the following minimal
* set if hard-coded properties will be added to the IProfileLoaded object.
*
* IProfileLoaded.message <-- "" (an empty string)
* IProfileLoaded.failNotFound <-- false
*
* @returns An IProfileLoaded object;
*/
static profAttrsToProfLoaded(profAttrs: IProfAttrs, dfltProfLoadedVals?: any): IProfileLoaded;
/**
* Read the team configuration files (if any exist).
*
* @param teamCfgOpts
* The optional choices related to reading a team configuration.
*/
readProfilesFromDisk(teamCfgOpts?: IConfigOpts): Promise<void>;
/**
* Checks whether the credential manager will load successfully.
* @returns
* True if it loaded successfully, or there is no credential manager
* configured in Imperative settings.json
*/
profileManagerWillLoad(): Promise<boolean>;
/**
* Returns whether a valid schema was found (works for v1 and v2 configs)
*/
get hasValidSchema(): boolean;
/**
* Gather information about the paths in osLoc
* @param profile Profile attributes gathered from getAllProfiles
*/
getOsLocInfo(profile: IProfAttrs): IProfLocOsLoc[];
/**
* Load value of secure argument from the vault.
* @param arg Secure argument object
*/
loadSecureArg(arg: IProfArgAttrs): any;
/**
* Initialize a session configuration object with the arguments
* from profArgs
*
* @param profArgs
* An array of profile argument attributes.
* @param argNames
* An array of argument names to load from the profile. Defaults to
* all arguments that have an associated ISession property.
*
* @returns A session containing all of the supplied profile argument
* attributes that are relevant to a session.
*/
static initSessCfg(profArgs: IProfArgAttrs[], argNames?: string[]): ISession;
/**
* Ensures that ProfileInfo.readProfilesFromDisk() is called before
* an operation that requires that information.
*/
private ensureReadFromDisk;
/**
* Load any profile schema objects found on disk and cache them. For team
* config, we check each config layer and load its schema JSON if there is
* one associated.
*/
private loadAllSchemas;
/**
* Adds a profile type to the loaded Zowe config.
* The profile type must first be added to the schema using `addProfileTypeToSchema`.
*
* @param {string} profileType The profile type to add
* @param [layerPath] A dot-separated path that points to a layer in the config (default: top-most layer)
*
* Example: “outer.prod” would add a profile into the “prod” layer (which is contained in “outer” layer)
* @returns {boolean} `true` if added to the loaded config; `false` otherwise
*/
addProfileToConfig(profileType: string, layerPath?: string): boolean;
/**
* Updates the schema of the provided config layer to contain the new profile type.
*
* @param {string} profileType The profile type to add into the schema
* @param {IProfileSchema} typeSchema The schema for the profile type
* @param {IConfigLayer} layer The config layer that matches the schema to update
* @param [versionChanged] Whether the version has changed for the schema (optional)
* @returns {boolean} `true` if added to the schema; `false` otherwise
*/
private updateSchemaAtLayer;
/**
* This helper function removes all command-related properties from the given schema properties object and returns it.
* This is so we can easily compare schemas from disk with those that are registered with type ICommandProfileSchema.
* It's also been added to avoid a breaking change (as we currently allow ICommandProfileSchema objects to be registered).
* @param obj The properties object from the schema
* @returns The properties object, but with all of the command-related properties removed
*/
private omitCmdPropsFromSchema;
private addToGlobalSchema;
/**
* Adds a profile type to the schema, and tracks its contribution in extenders.json.
*
* NOTE: `readProfilesFromDisk` must be called at least once before adding new profile types.
*
* @param {string} profileType The new profile type to add to the schema
* @param {IExtenderTypeInfo} typeInfo Type metadata for the profile type (schema, source app., optional version)
* @param [updateProjectSchema] Automatically update a project-level schema if one exists.
* @returns {IAddProfTypeResult} the result of adding the profile type to the schema
*/
addProfileTypeToSchema(profileType: string, typeInfo: IExtenderTypeInfo, updateProjectSchema?: boolean): IAddProfTypeResult;
/**
* Builds the entire schema based on the available profile types and application sources.
*
* @param [sources] Include profile types contributed by these sources when building the schema
* - Source applications are tracked in the “from” list for each profile type in extenders.json
* @param [layer] The config layer to build a schema for
* - If a layer is not specified, `buildSchema` will use the active layer.
* @returns {IConfigSchema} A config schema containing all applicable profile types
*/
buildSchema(sources?: string[], layer?: IConfigLayer): IConfigSchema;
/**
* @param [sources] (optional) Only include available types from the given list of sources
* @returns a list of all available profile types
*/
getProfileTypes(sources?: string[]): string[];
/**
* Returns the schema object belonging to the specified profile type.
*
* @param {string} profileType The profile type to retrieve the schema from
* @returns {IProfileSchema} The schema object provided by the specified profile type
*/
getSchemaForType(profileType: string): IProfileSchema;
/**
* List of secure properties with more details, like value, location, and type
*
* @param opts The user and global flags that specify one of the four
* config files (aka layers).
* @returns Array of secure property details
*/
secureFieldsWithDetails(opts?: {
user: boolean;
global: boolean;
}): IProfArgAttrs[];
/**
* Get all of the subprofiles in the configuration.
*
* @param path
* The short form profile name dotted path
* @param jsonPath
* The long form profile dotted path
* @param profObj
* The profiles object from the parent profile.
* Contains the subprofiles to search through.
* @param profileType
* Limit selection to only profiles of the specified type.
* If not supplied, the names of all typed profiles are returned.
*
* @returns An array of profile attribute objects.
* In addition to the name, you get the profile type,
* an indicator of whether the profile is the default profile
* for that type, and the location of that profile.
*
* If no profile exists for the specified type (or if
* no profiles of any kind exist), we return an empty array
* ie, length is zero.
*/
private getTeamSubProfiles;
/**
*
* @param path
* The short form profile name dotted path
* @param profileType
* Limit selection to profiles of the specified type
* @returns A boolean true if the profile is a default profile,
* and a boolean false if the profile is not a default profile
*/
private isDefaultTeamProfile;
/**
*
* @param jsonPath The long form JSON path of the profile we are searching for.
* @param excludeHomeDir The long form JSON path of the profile we are searching for.
* @returns A string array containing the location of all files containing the specified team profile
*/
private findTeamOsLocation;
/**
* Get arg data type from a "typeof" string. Arg data types can be basic
* types like string, number, and boolean. If they are any other type or a
* union of types, their type will be represented simply as object.
* @param propType The type of a profile property
*/
private argDataType;
/**
* Given a profile name and property name, compute the profile location
* object containing OS and JSON locations.
* @param opts Set of options that allow this method to get the profile location
*/
private argTeamConfigLoc;
/**
* Load the cached schema object for a profile type. Returns null if
* schema is not found in the cache.
* @param profile Profile attributes object
*/
private loadSchema;
/**
* Override values in a merged argument object with values found in
* environment variables. The choice to override environment variables is
* controlled by an option on the ProfileInfo constructor.
*
* @param mergedArgs
* On input, this must be an object containing merged arguments
* obtained from configuration settings. This function will override
* values in mergedArgs.knownArgs with values found in environment
* variables. It will also move arguments from mergedArgs.missingArgs
* into mergedArgs.knownArgs if a value is found in an environment
* variable for any missingArgs.
*/
private overrideWithEnv;
}
//# sourceMappingURL=ProfileInfo.d.ts.map