UNPKG

@rushstack/heft

Version:

Build all your JavaScript projects the same way: A way that works.

206 lines 11.9 kB
"use strict"; // Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. // See LICENSE in the project root for license information. Object.defineProperty(exports, "__esModule", { value: true }); exports.HeftParameterManager = void 0; const node_core_library_1 = require("@rushstack/node-core-library"); const ts_command_line_1 = require("@rushstack/ts-command-line"); class HeftParameterManager { get defaultParameters() { if (!this._isFinalized) { throw new node_core_library_1.InternalError('Parameters have not yet been finalized.'); } if (!this._defaultParameters) { this._defaultParameters = { clean: this._options.getIsClean(), debug: this._options.getIsDebug(), verbose: this._options.getIsVerbose(), production: this._options.getIsProduction(), locales: this._options.getLocales(), watch: this._options.getIsWatch() }; } return this._defaultParameters; } constructor(options) { // plugin defintiion => parameter accessors and defaults this._heftParametersByDefinition = new Map(); // plugin definition => Map< parameter long name => applied parameter > this._parametersByDefinition = new Map(); // parameter scope => plugin definition this._pluginDefinitionsByScope = new Map(); this._isFinalized = false; this._options = options; } /** * Add parameters provided by the specified plugin definition. Parameters will be registered with the * command line parameter provider after finalization. */ addPluginParameters(pluginDefinition) { if (this._isFinalized) { throw new node_core_library_1.InternalError('Parameters have already been finalized.'); } if (!this._parametersByDefinition.has(pluginDefinition)) { this._parametersByDefinition.set(pluginDefinition, new Map()); } } /** * Finalize and register parameters with the specified parameter provider. The parameter manager * can only be finalized once. */ finalizeParameters(commandLineParameterProvider) { if (this._isFinalized) { throw new node_core_library_1.InternalError('Parameters have already been finalized.'); } this._isFinalized = true; for (const pluginDefinition of this._parametersByDefinition.keys()) { this._addParametersToProvider(pluginDefinition, commandLineParameterProvider); } } /** * Get the finalized parameters for the specified plugin definition. */ getParametersForPlugin(pluginDefinition) { if (!this._isFinalized) { throw new node_core_library_1.InternalError('Parameters have not yet been finalized.'); } let heftParameters = this._heftParametersByDefinition.get(pluginDefinition); if (!heftParameters) { const parameters = this._parametersByDefinition.get(pluginDefinition); if (!parameters) { throw new node_core_library_1.InternalError(`Parameters from plugin ${JSON.stringify(pluginDefinition.pluginName)} in package ` + `${JSON.stringify(pluginDefinition.pluginPackageName)} were not added before finalization.`); } heftParameters = Object.assign(Object.assign({}, this.defaultParameters), { getChoiceParameter: (parameterLongName) => this._getParameter(parameters, parameterLongName, ts_command_line_1.CommandLineParameterKind.Choice), getChoiceListParameter: (parameterLongName) => this._getParameter(parameters, parameterLongName, ts_command_line_1.CommandLineParameterKind.ChoiceList), getFlagParameter: (parameterLongName) => this._getParameter(parameters, parameterLongName, ts_command_line_1.CommandLineParameterKind.Flag), getIntegerParameter: (parameterLongName) => this._getParameter(parameters, parameterLongName, ts_command_line_1.CommandLineParameterKind.Integer), getIntegerListParameter: (parameterLongName) => this._getParameter(parameters, parameterLongName, ts_command_line_1.CommandLineParameterKind.IntegerList), getStringParameter: (parameterLongName) => this._getParameter(parameters, parameterLongName, ts_command_line_1.CommandLineParameterKind.String), getStringListParameter: (parameterLongName) => this._getParameter(parameters, parameterLongName, ts_command_line_1.CommandLineParameterKind.StringList) }); this._heftParametersByDefinition.set(pluginDefinition, heftParameters); } return heftParameters; } /** * Add the parameters specified by a plugin definition to the command line parameter provider. * Duplicate parameters are allowed, as long as they have different parameter scopes. In this * case, the parameter will only be referencable by the CLI argument * "--<parameterScope>:<parameterName>". If there is no duplicate parameter, it will also be * referencable by the CLI argument "--<parameterName>". */ _addParametersToProvider(pluginDefinition, commandLineParameterProvider) { const existingDefinitionWithScope = this._pluginDefinitionsByScope.get(pluginDefinition.pluginParameterScope); if (existingDefinitionWithScope && existingDefinitionWithScope !== pluginDefinition) { throw new Error(`Plugin ${JSON.stringify(pluginDefinition.pluginName)} in package ` + `${JSON.stringify(pluginDefinition.pluginPackageName)} specifies the same parameter scope ` + `${JSON.stringify(pluginDefinition.pluginParameterScope)} as plugin ` + `${JSON.stringify(existingDefinitionWithScope.pluginName)} from package ` + `${JSON.stringify(existingDefinitionWithScope.pluginPackageName)}.`); } else { this._pluginDefinitionsByScope.set(pluginDefinition.pluginParameterScope, pluginDefinition); } const definedPluginParametersByName = this._parametersByDefinition.get(pluginDefinition); for (const parameter of pluginDefinition.pluginParameters) { let definedParameter; switch (parameter.parameterKind) { case 'choiceList': { definedParameter = commandLineParameterProvider.defineChoiceListParameter({ description: parameter.description, required: parameter.required, alternatives: parameter.alternatives.map((p) => p.name), parameterLongName: parameter.longName, parameterShortName: parameter.shortName, parameterScope: pluginDefinition.pluginParameterScope }); break; } case 'choice': { definedParameter = commandLineParameterProvider.defineChoiceParameter({ description: parameter.description, required: parameter.required, alternatives: parameter.alternatives.map((p) => p.name), defaultValue: parameter.defaultValue, parameterLongName: parameter.longName, parameterShortName: parameter.shortName, parameterScope: pluginDefinition.pluginParameterScope }); break; } case 'flag': { definedParameter = commandLineParameterProvider.defineFlagParameter({ description: parameter.description, required: parameter.required, parameterLongName: parameter.longName, parameterShortName: parameter.shortName, parameterScope: pluginDefinition.pluginParameterScope }); break; } case 'integerList': { definedParameter = commandLineParameterProvider.defineIntegerListParameter({ description: parameter.description, required: parameter.required, argumentName: parameter.argumentName, parameterLongName: parameter.longName, parameterShortName: parameter.shortName, parameterScope: pluginDefinition.pluginParameterScope }); break; } case 'integer': { definedParameter = commandLineParameterProvider.defineIntegerParameter({ description: parameter.description, required: parameter.required, argumentName: parameter.argumentName, defaultValue: parameter.defaultValue, parameterLongName: parameter.longName, parameterShortName: parameter.shortName, parameterScope: pluginDefinition.pluginParameterScope }); break; } case 'stringList': { definedParameter = commandLineParameterProvider.defineStringListParameter({ description: parameter.description, required: parameter.required, argumentName: parameter.argumentName, parameterLongName: parameter.longName, parameterShortName: parameter.shortName, parameterScope: pluginDefinition.pluginParameterScope }); break; } case 'string': { definedParameter = commandLineParameterProvider.defineStringParameter({ description: parameter.description, required: parameter.required, argumentName: parameter.argumentName, defaultValue: parameter.defaultValue, parameterLongName: parameter.longName, parameterShortName: parameter.shortName, parameterScope: pluginDefinition.pluginParameterScope }); break; } default: { // Need to cast to IParameterJson since it's inferred to be type 'never' throw new node_core_library_1.InternalError(`Unrecognized parameter kind: ${parameter.parameterKind}`); } } // Add the parameter to the map using the original long name, so that it can be retrieved by plugins // under the original long name. definedPluginParametersByName.set(parameter.longName, definedParameter); } } _getParameter(parametersByLongName, parameterLongName, expectedParameterKind) { const parameter = parametersByLongName.get(parameterLongName); if (!parameter) { throw new Error(`Parameter ${JSON.stringify(parameterLongName)} not found. Are you sure it was defined in ` + 'heft-plugin.json?'); } else if (parameter.kind !== expectedParameterKind) { throw new Error(`Parameter ${JSON.stringify(parameterLongName)} is of kind ` + `${JSON.stringify(ts_command_line_1.CommandLineParameterKind[parameter.kind])}, not of kind ` + `${JSON.stringify(ts_command_line_1.CommandLineParameterKind[expectedParameterKind])}.`); } return parameter; } } exports.HeftParameterManager = HeftParameterManager; //# sourceMappingURL=HeftParameterManager.js.map