UNPKG

7.08 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const _ = require("lodash");
4const GraphQL = require("../../internal/graph/graphQL");
5const metadata_1 = require("./metadata");
6/**
7 * Extract metadata from a handler instance. We need an
8 * instance to pull the decorator data from
9 * @param h handler instance
10 * @return {any}
11 */
12function metadataFromInstance(h) {
13 let md = null;
14 if (metadata_1.isEventHandlerMetadata(h)) {
15 md = addName(h);
16 }
17 else if (metadata_1.isCommandHandlerMetadata(h)) {
18 md = addName(h);
19 }
20 else {
21 // We need to find the instance from which to extract metadata.
22 // It will be the handler itself unless it implements the optional freshParametersInstance method
23 const knowsHowToMakeMyParams = h;
24 if (!!knowsHowToMakeMyParams.freshParametersInstance) {
25 const paramsInstance = knowsHowToMakeMyParams.freshParametersInstance();
26 if (!paramsInstance.__kind) {
27 paramsInstance.__kind = "parameters";
28 }
29 md = metadataFromDecorator(h, paramsInstance);
30 }
31 else {
32 md = metadataFromDecorator(h, h);
33 }
34 }
35 // Clone metadata as otherwise we mess with previous created instances
36 return _.cloneDeep(md);
37}
38exports.metadataFromInstance = metadataFromInstance;
39function addName(r) {
40 if (!r.name) {
41 r.name = r.constructor.name;
42 }
43 return r;
44}
45function metadataFromDecorator(h, params) {
46 switch (params.__kind) {
47 case "command-handler":
48 return {
49 name: params.__name,
50 description: params.__description,
51 tags: params.__tags ? params.__tags : [],
52 intent: params.__intent ? params.__intent : [],
53 auto_submit: params.__autoSubmit,
54 parameters: parametersFromInstance(params),
55 mapped_parameters: mappedParameterMetadataFromInstance(params),
56 secrets: secretsMetadataFromInstance(params),
57 values: valueMetadataFromInstance(params),
58 };
59 case "parameters":
60 return {
61 name: h.__name,
62 description: h.__description,
63 tags: h.__tags ? h.__tags : [],
64 intent: h.__intent ? h.__intent : [],
65 auto_submit: h.__autoSubmit,
66 parameters: parametersFromInstance(params),
67 mapped_parameters: mappedParameterMetadataFromInstance(params),
68 secrets: secretsMetadataFromInstance(params),
69 values: valueMetadataFromInstance(params),
70 };
71 case "event-handler":
72 // Remove any linebreaks and spaces from those subscription
73 const subscription = GraphQL.inlineQuery(GraphQL.replaceOperationName(params.__subscription, h.__name));
74 const subscriptionName = GraphQL.operationName(subscription);
75 return {
76 name: h.__name,
77 description: h.__description,
78 tags: h.__tags ? h.__tags : [],
79 subscription,
80 subscriptionName,
81 secrets: secretsMetadataFromInstance(h),
82 values: valueMetadataFromInstance(h),
83 };
84 default:
85 throw new Error(`Unsupported automation '${params.constructor.name}'`);
86 }
87}
88function parametersFromInstance(r, prefix = "") {
89 const directParams = directParameters(r, prefix);
90 const nestedParameters = _.flatten(Object.keys(r)
91 .map(key => [key, r[key]])
92 .filter(nestedFieldInfo => !!nestedFieldInfo[1])
93 .filter(nestedFieldInfo => typeof nestedFieldInfo[1] === "object")
94 .map(nestedFieldInfo => parametersFromInstance(nestedFieldInfo[1], prefix + nestedFieldInfo[0] + ".")));
95 const allParameters = directParams.concat(nestedParameters);
96 return allParameters.sort((p1, p2) => {
97 const o1 = p1.order || Number.MAX_SAFE_INTEGER;
98 const o2 = p2.order || Number.MAX_SAFE_INTEGER;
99 return o1 - o2;
100 });
101}
102function directParameters(r, prefix) {
103 return !!r && r.__parameters ? r.__parameters.map(p => {
104 const nameToUse = prefix + p.name;
105 const parameter = {
106 name: nameToUse,
107 pattern: p.pattern ? p.pattern.source : "^.*$",
108 description: p.description,
109 required: p.required,
110 group: p.group,
111 displayable: p.displayable !== false,
112 type: p.type,
113 max_length: p.maxLength,
114 min_length: p.minLength,
115 valid_input: p.validInput,
116 default_value: r[p.name],
117 display_name: p.displayName ? p.displayName : nameToUse,
118 order: p.order,
119 control: p.control,
120 };
121 // Make this optional parameter explicit
122 if (parameter.default_value) {
123 // right now the bot only supports string parameter values
124 parameter.default_value = parameter.default_value.toString();
125 }
126 return parameter;
127 }) : [];
128}
129function secretsMetadataFromInstance(r, prefix = "") {
130 const directSecrets = !!r && r.__secrets ? r.__secrets.map(s => ({ name: prefix + s.name, uri: s.uri })) : [];
131 const nestedParameters = _.flatten(Object.keys(r)
132 .map(key => [key, r[key]])
133 .filter(nestedFieldInfo => !!nestedFieldInfo[1])
134 .filter(nestedFieldInfo => typeof nestedFieldInfo[1] === "object")
135 .map(nestedFieldInfo => secretsMetadataFromInstance(nestedFieldInfo[1], prefix + nestedFieldInfo[0] + ".")));
136 return directSecrets.concat(nestedParameters);
137}
138function mappedParameterMetadataFromInstance(r, prefix = "") {
139 const directMappedParams = !!r && r.__mappedParameters ? r.__mappedParameters.map(mp => ({
140 name: prefix + mp.name,
141 uri: mp.uri,
142 required: mp.required !== false,
143 })) : [];
144 const nestedParameters = _.flatten(Object.keys(r)
145 .map(key => [key, r[key]])
146 .filter(nestedFieldInfo => !!nestedFieldInfo[1])
147 .filter(nestedFieldInfo => typeof nestedFieldInfo[1] === "object")
148 .map(nestedFieldInfo => mappedParameterMetadataFromInstance(nestedFieldInfo[1], prefix + nestedFieldInfo[0] + ".")));
149 return directMappedParams.concat(nestedParameters);
150}
151function valueMetadataFromInstance(r, prefix = "") {
152 const directValues = !!r && r.__values ? r.__values.map(mp => ({
153 name: prefix + mp.name,
154 path: mp.value.path,
155 required: mp.value.required !== false,
156 type: mp.value.type ? mp.value.type : "string",
157 })) : [];
158 const nestedValues = _.flatten(Object.keys(r)
159 .map(key => [key, r[key]])
160 .filter(nestedFieldInfo => !!nestedFieldInfo[1])
161 .filter(nestedFieldInfo => typeof nestedFieldInfo[1] === "object")
162 .map(nestedFieldInfo => valueMetadataFromInstance(nestedFieldInfo[1], prefix + nestedFieldInfo[0] + ".")));
163 return directValues.concat(nestedValues);
164}
165//# sourceMappingURL=metadataReading.js.map
\No newline at end of file