UNPKG

@prismatic-io/spectral

Version:

Utility library for building Prismatic connectors and code-native integrations

165 lines (164 loc) 8.95 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.createCNIPerform = exports.createCNIComponentRefPerform = exports.createCNIPollingPerform = exports.createPollingPerform = exports.createPerform = exports.cleanParams = exports.createPollingContext = void 0; const uniq_1 = __importDefault(require("lodash/uniq")); const context_1 = require("./context"); const convertIntegration_1 = require("./convertIntegration"); const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value); const createPollingContext = ({ context, invokeAction, }) => { return { polling: { invokeAction, getState: () => { const internal = context.instanceState.__prismaticInternal; const internalState = isRecord(internal) ? internal : {}; return isRecord(internalState.polling) ? internalState.polling : {}; }, setState: (newState) => { const internal = context.instanceState.__prismaticInternal; const internalState = isRecord(internal) ? internal : {}; context.instanceState.__prismaticInternal = Object.assign(Object.assign({}, internalState), { polling: newState }); }, }, }; }; exports.createPollingContext = createPollingContext; const cleanParams = (params, cleaners) => { const keys = (0, uniq_1.default)([...Object.keys(params), ...Object.keys(cleaners)]); return keys.reduce((result, key) => { const value = params[key]; const cleanFn = cleaners[key]; return Object.assign(Object.assign({}, result), { [key]: cleanFn ? cleanFn(value) : value }); }, {}); }; exports.cleanParams = cleanParams; const createPerform = (performFn, { inputCleaners, errorHandler }) => { return (...args) => __awaiter(void 0, void 0, void 0, function* () { try { if (args.length === 1) { const [params] = args; return yield performFn((0, exports.cleanParams)(params, inputCleaners)); } if (args.length === 2) { const [context, params] = args; const actionContext = Object.assign(Object.assign({}, context), { debug: (0, context_1.createDebugContext)(context), invokeFlow: (0, context_1.createInvokeFlow)(context) }); const result = yield performFn(actionContext, (0, exports.cleanParams)(params, inputCleaners)); (0, context_1.logDebugResults)(actionContext); return result; } const [context, payload, params] = args; const actionContext = Object.assign(Object.assign({}, context), { debug: (0, context_1.createDebugContext)(context), invokeFlow: (0, context_1.createInvokeFlow)(context) }); const result = yield performFn(actionContext, payload, (0, exports.cleanParams)(params, inputCleaners)); (0, context_1.logDebugResults)(actionContext); return result; } catch (error) { throw errorHandler ? yield errorHandler(error) : error; } }); }; exports.createPerform = createPerform; const createInvokePollAction = (context, action, { errorHandler }) => { return (params) => __awaiter(void 0, void 0, void 0, function* () { try { if (!action) { throw "Error: Attempted to invoke an action for a trigger with no pollAction defined."; } /* * By the time this is called, the inputs have already been cleaned * as part of the polling trigger setup. * * Running clean twice can have unwanted behavior depending on how users have implemented * their clean functions. */ return yield action.perform(Object.assign(Object.assign({}, context), { debug: (0, context_1.createDebugContext)(context) }), params); } catch (error) { throw errorHandler ? yield errorHandler(error) : error; } }); }; const createPollingPerform = (trigger, { inputCleaners, errorHandler }) => { return (context, payload, params) => __awaiter(void 0, void 0, void 0, function* () { try { const { pollAction } = trigger; const pollingContext = Object.assign(Object.assign({ invokeFlow: (0, context_1.createInvokeFlow)(context) }, (0, exports.createPollingContext)({ context, invokeAction: createInvokePollAction(context, pollAction, { errorHandler }), })), { debug: (0, context_1.createDebugContext)(context) }); const triggerPerform = (0, exports.createPerform)(trigger.perform, { inputCleaners, errorHandler, }); const combinedContext = Object.assign({}, context, pollingContext); const _a = yield triggerPerform(combinedContext, payload, params), { polledNoChanges } = _a, rest = __rest(_a, ["polledNoChanges"]); return Object.assign(Object.assign({}, rest), { resultType: polledNoChanges ? "polled_no_changes" : "completed" }); } catch (error) { throw errorHandler ? yield errorHandler(error) : error; } }); }; exports.createPollingPerform = createPollingPerform; const createCNIPollingPerform = ({ onTrigger, componentRegistry, }) => { return (context, payload, params) => __awaiter(void 0, void 0, void 0, function* () { const cniContext = (0, context_1.createCNIContext)(context, componentRegistry); const finalContext = Object.assign(Object.assign({}, cniContext), (0, exports.createPollingContext)({ context: cniContext, invokeAction: () => __awaiter(void 0, void 0, void 0, function* () { throw new Error("invokeAction is not available for code-native polling triggers. " + "Use getState/setState to manage polling state directly in your onTrigger function."); }), })); const result = yield onTrigger(finalContext, payload, params); if (result === undefined) { return undefined; } const { polledNoChanges } = result, rest = __rest(result, ["polledNoChanges"]); return Object.assign(Object.assign({}, rest), { resultType: polledNoChanges ? "polled_no_changes" : "completed" }); }); }; exports.createCNIPollingPerform = createCNIPollingPerform; const createCNIComponentRefPerform = ({ componentRegistry, componentRef, onTrigger, }) => { return (context, payload, params) => __awaiter(void 0, void 0, void 0, function* () { var _a; // @ts-expect-error: _components isn't part of the public API const _components = (_a = context._components) !== null && _a !== void 0 ? _a : { invokeTrigger: () => { }, }; const invokeTrigger = _components.invokeTrigger; const cniContext = (0, context_1.createCNIContext)(context, componentRegistry); return yield invokeTrigger((0, convertIntegration_1.invokeTriggerComponentInput)(componentRef, onTrigger, "perform"), cniContext, payload, params); }); }; exports.createCNIComponentRefPerform = createCNIComponentRefPerform; const createCNIPerform = ({ componentRegistry, onTrigger, }) => { return (context, payload, params) => __awaiter(void 0, void 0, void 0, function* () { const cniContext = (0, context_1.createCNIContext)(context, componentRegistry); return yield onTrigger(cniContext, payload, params); }); }; exports.createCNIPerform = createCNIPerform;