@prismatic-io/spectral
Version:
Utility library for building Prismatic connectors and code-native integrations
165 lines (164 loc) • 8.95 kB
JavaScript
;
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;