UNPKG

6.16 kBJavaScriptView Raw
1"use strict";
2/*
3 * Copyright © 2020 Atomist, Inc.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17Object.defineProperty(exports, "__esModule", { value: true });
18exports.commandRequestParameterPromptFactory = exports.AtomistContinuationMimeType = exports.NoParameterPrompt = void 0;
19const _ = require("lodash");
20const handlerRegistrations_1 = require("../../api-helper/machine/handlerRegistrations");
21/* tslint:disable:cyclomatic-complexity */
22/**
23 * No-op NoParameterPrompt implementation that never prompts for new parameters
24 * @constructor
25 */
26const NoParameterPrompt = async () => ({});
27exports.NoParameterPrompt = NoParameterPrompt;
28exports.AtomistContinuationMimeType = "application/x-atomist-continuation+json";
29/* tslint:disable:cyclomatic-complexity */
30/**
31 * Default ParameterPromptFactory that uses the WebSocket connection to send parameter prompts to the backend.
32 * @param ctx
33 */
34function commandRequestParameterPromptFactory(ctx) {
35 return async (parameters, options = {}) => {
36 const trigger = ctx.trigger;
37 const existingParameters = trigger.parameters;
38 const newParameters = _.cloneDeep(parameters);
39 // Find out if - and if - which parameters are actually missing
40 let requiredMissing = false;
41 const params = {};
42 for (const parameter in parameters) {
43 if (parameters.hasOwnProperty(parameter)) {
44 const existingParameter = existingParameters.find(p => p.name === parameter);
45 if (!existingParameter) {
46 // If required isn't defined it means the parameter is required
47 if (newParameters[parameter].required || newParameters[parameter].required === undefined) {
48 requiredMissing = true;
49 }
50 }
51 else {
52 // Do some validation against the rules
53 const parameterDefinition = newParameters[parameter];
54 const value = existingParameter.value;
55 // Force question
56 if (parameterDefinition.force) {
57 trigger.parameters = trigger.parameters.filter(p => p.name !== parameter);
58 requiredMissing = true;
59 continue;
60 }
61 // Verify pattern
62 if (parameterDefinition.pattern && !!value && !value.match(parameterDefinition.pattern)) {
63 requiredMissing = true;
64 continue;
65 }
66 // Verify minLength
67 const minLength = parameterDefinition.minLength || parameterDefinition.min_length;
68 if (minLength !== undefined && !!value && value.length < minLength) {
69 requiredMissing = true;
70 continue;
71 }
72 // Verify maxLength
73 const maxLength = parameterDefinition.maxLength || parameterDefinition.max_length;
74 if (maxLength !== undefined && !!value && value.length > maxLength) {
75 requiredMissing = true;
76 continue;
77 }
78 params[parameter] = existingParameter.value;
79 delete newParameters[parameter];
80 }
81 }
82 }
83 // If no parameters are missing we can return the already collected parameters
84 if (!requiredMissing) {
85 return params;
86 }
87 // Set up the thread_ts for this response message
88 let threadTs;
89 if (options.thread === true && !!trigger.source) {
90 threadTs = _.get(trigger.source, "slack.message.ts");
91 }
92 else if (typeof options.thread === "string") {
93 threadTs = options.thread;
94 }
95 const destination = _.cloneDeep(trigger.source);
96 _.set(destination, "slack.thread_ts", threadTs);
97 // Create a continuation message using the existing HandlerResponse and mixing in parameters
98 // and parameter_specs
99 const response = {
100 api_version: "1",
101 correlation_id: trigger.correlation_id,
102 team: trigger.team,
103 command: trigger.command,
104 source: trigger.source,
105 destinations: [destination],
106 parameters: [...(trigger.parameters || []), ...(trigger.mapped_parameters || [])],
107 auto_submit: !!options.autoSubmit ? options.autoSubmit : undefined,
108 question: !!options.parameterStyle ? options.parameterStyle.toString() : undefined,
109 parameter_specs: _.map(newParameters, (v, k) => ({
110 name: k,
111 description: v.description,
112 required: v.required !== undefined ? v.required : true,
113 pattern: v.pattern ? v.pattern.source : undefined,
114 valid_input: v.validInput,
115 max_length: v.maxLength,
116 min_length: v.minLength,
117 display_name: v.displayName,
118 default_value: v.defaultValue,
119 type: v.type,
120 })),
121 content_type: exports.AtomistContinuationMimeType,
122 };
123 await ctx.messageClient.respond(response);
124 throw new handlerRegistrations_1.CommandListenerExecutionInterruptError(`Prompting for new parameters: ${_.map(newParameters, (v, k) => k).join(", ")}`);
125 };
126}
127exports.commandRequestParameterPromptFactory = commandRequestParameterPromptFactory;
128/* tslint:enable:cyclomatic-complexity */
129//# sourceMappingURL=parameterPrompt.js.map
\No newline at end of file