UNPKG

@grnsft/if-core

Version:

If core utilities.

112 lines 17.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PluginFactory = void 0; const utils_1 = require("../utils"); const arithmetic_helper_1 = require("../utils/arithmetic-helper"); /** * Creates plugin instance according to given parameters. */ const PluginFactory = (params) => (config = {}, parametersMetadata, mapping) => ({ metadata: { // Handles empty metadata inputs: { ...((params.metadata && params.metadata.inputs) || {}), ...parametersMetadata?.inputs, }, outputs: parametersMetadata?.outputs || (params.metadata && params.metadata.outputs) || {}, }, execute: async (inputs) => { const { implementation, configValidation, inputValidation, allowArithmeticExpressions, } = params; let evaluatedConfig; const expressionCleanedConfig = {}; const isArithmeticEnable = !!allowArithmeticExpressions; const mappedConfig = (0, utils_1.mapConfigIfNeeded)(config, mapping); if (isArithmeticEnable) { Object.entries(mappedConfig).forEach(([paramKey, paramValue]) => { mappedConfig[paramKey] = (0, arithmetic_helper_1.evaluateSimpleArithmeticExpression)(paramValue); }); inputs = inputs.map(input => { const evaluatedInput = (0, arithmetic_helper_1.evaluateInput)(input); // If the config is not provided, skip evaluating parameters functionality. if (Object.keys(config).length) { evaluatedConfig = (0, arithmetic_helper_1.evaluateConfig)({ config: mappedConfig, input: evaluatedInput, parametersToEvaluate: allowArithmeticExpressions, }); } return evaluatedInput; }); } // Validate config using the provided configValidation function or schema const safeConfig = configValidation ? typeof configValidation === 'function' ? configValidation(mappedConfig) : (0, utils_1.validate)(configValidation, mappedConfig) : config; // In case of the config is not provided, but the plugin has a default config, // evaluates config parameters if (isArithmeticEnable && !Object.keys(config).length && Object.keys(safeConfig).length) { inputs.forEach(input => { evaluatedConfig = (0, arithmetic_helper_1.evaluateConfig)({ config: mappedConfig, input: input, parametersToEvaluate: allowArithmeticExpressions, }); }); } // Check if arithmetic expressions are enabled, store the cleaned version of the expression into expressionCleanedConfig if (isArithmeticEnable) { Object.entries(safeConfig).forEach(([paramKey, paramValue]) => { expressionCleanedConfig[paramKey] = (0, arithmetic_helper_1.getParameterFromArithmeticExpression)(paramValue); }); } // Validate each input using the inputValidation function or schema const safeInputs = inputs.map((input, index) => { if (!inputValidation) { return input; } if (typeof inputValidation === 'function') { return inputValidation(input, Object.keys(expressionCleanedConfig).length ? expressionCleanedConfig : safeConfig, index); } return (0, utils_1.validate)(inputValidation, input, index); }); // Apply mapping to inputs if needed inputs = safeInputs.map((safeInput, index) => ({ ...(0, utils_1.mapInputIfNeeded)({ ...inputs[index], ...safeInput }, mapping), })); // Execute the callback with the validated and possibly mapped inputs const outputs = await implementation(inputs, { ...safeConfig, ...(evaluatedConfig || {}), mapping, }); let outputParam; // Check if arithmetic expressions are enabled, get output parameter if (isArithmeticEnable) { outputParam = Object.keys(outputs[0]).filter(output => !Object.keys(inputs[0]).includes(output))[0]; } return outputs.map((output, index) => { // Check if arithmetic expressions are enabled and outputParam exists, evaluate output parameter const resultOutput = isArithmeticEnable && outputParam ? (0, arithmetic_helper_1.evaluateArithmeticOutput)(outputParam, output) : output; // Merge input if it exists, otherwise just use the output const correspondingInput = (0, utils_1.removeMappedInputParameter)(inputs[index], mapping); return { ...correspondingInput, ...(0, utils_1.mapOutputIfNeeded)(resultOutput, mapping), }; }); }, }); exports.PluginFactory = PluginFactory; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW50ZXJmYWNlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxvQ0FNa0I7QUFTbEIsa0VBTW9DO0FBRXBDOztHQUVHO0FBQ0ksTUFBTSxhQUFhLEdBQ3hCLENBQW1CLE1BQThCLEVBQUUsRUFBRSxDQUNyRCxDQUNFLFNBQVksRUFBTyxFQUNuQixrQkFBNEMsRUFDNUMsT0FBc0IsRUFDdEIsRUFBRSxDQUFDLENBQUM7SUFDSixRQUFRLEVBQUU7UUFDUix5QkFBeUI7UUFDekIsTUFBTSxFQUFFO1lBQ04sR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN0RCxHQUFHLGtCQUFrQixFQUFFLE1BQU07U0FDOUI7UUFDRCxPQUFPLEVBQ0wsa0JBQWtCLEVBQUUsT0FBTztZQUMzQixDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUM7WUFDNUMsRUFBRTtLQUNMO0lBQ0QsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFzQixFQUFFLEVBQUU7UUFDeEMsTUFBTSxFQUNKLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLDBCQUEwQixHQUMzQixHQUFHLE1BQU0sQ0FBQztRQUNYLElBQUksZUFBZSxDQUFDO1FBQ3BCLE1BQU0sdUJBQXVCLEdBQWlCLEVBQUUsQ0FBQztRQUNqRCxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQywwQkFBMEIsQ0FBQztRQUN4RCxNQUFNLFlBQVksR0FBaUIsSUFBQSx5QkFBaUIsRUFBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFdEUsSUFBSSxrQkFBa0IsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FB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USxRQUFBLGFBQWEsaUJBcUpyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7eiwgWm9kVHlwZX0gZnJvbSAnem9kJztcblxuaW1wb3J0IHtcbiAgbWFwQ29uZmlnSWZOZWVkZWQsXG4gIG1hcElucHV0SWZOZWVkZWQsXG4gIG1hcE91dHB1dElmTmVlZGVkLFxuICByZW1vdmVNYXBwZWRJbnB1dFBhcmFtZXRlcixcbiAgdmFsaWRhdGUsXG59IGZyb20gJy4uL3V0aWxzJztcbmltcG9ydCB7XG4gIENvbmZpZ1BhcmFtcyxcbiAgTWFwcGluZ1BhcmFtcyxcbiAgUGx1Z2luRmFjdG9yeVBhcmFtcyxcbiAgUGx1Z2luUGFyYW1ldGVyc01ldGFkYXRhLFxuICBQbHVnaW5QYXJhbXMsXG59IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtcbiAgZXZhbHVhdGVJbnB1dCxcbiAgZXZhbHVhdGVDb25maWcsXG4gIGV2YWx1YXRlQXJpdGhtZXRpY091dHB1dCxcbiAgZ2V0UGFyYW1ldGVyRnJvbUFyaXRobWV0aWNFeHByZXNzaW9uLFxuICBldmFsdWF0ZVNpbXBsZUFyaXRobWV0aWNFeHByZXNzaW9uLFxufSBmcm9tICcuLi91dGlscy9hcml0aG1ldGljLWhlbHBlcic7XG5cbi8qKlxuICogQ3JlYXRlcyBwbHVnaW4gaW5zdGFuY2UgYWNjb3JkaW5nIHRvIGdpdmVuIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBjb25zdCBQbHVnaW5GYWN0b3J5ID1cbiAgPEMgPSBDb25maWdQYXJhbXM+KHBhcmFtczogUGx1Z2luRmFjdG9yeVBhcmFtczxDPikgPT5cbiAgKFxuICAgIGNvbmZpZzogQyA9IHt9IGFzIEMsXG4gICAgcGFyYW1ldGVyc01ldGFkYXRhOiBQbHVnaW5QYXJhbWV0ZXJzTWV0YWRhdGEsXG4gICAgbWFwcGluZzogTWFwcGluZ1BhcmFtc1xuICApID0+ICh7XG4gICAgbWV0YWRhdGE6IHtcbiAgICAgIC8vIEhhbmRsZXMgZW1wdHkgbWV0YWRhdGFcbiAgICAgIGlucHV0czoge1xuICAgICAgICAuLi4oKHBhcmFtcy5tZXRhZGF0YSAmJiBwYXJhbXMubWV0YWRhdGEuaW5wdXRzKSB8fCB7fSksXG4gICAgICAgIC4uLnBhcmFtZXRlcnNNZXRhZGF0YT8uaW5wdXRzLFxuICAgICAgfSxcbiAgICAgIG91dHB1dHM6XG4gICAgICAgIHBhcmFtZXRlcnNNZXRhZGF0YT8ub3V0cHV0cyB8fFxuICAgICAgICAocGFyYW1zLm1ldGFkYXRhICYmIHBhcmFtcy5tZXRhZGF0YS5vdXRwdXRzKSB8fFxuICAgICAgICB7fSxcbiAgICB9LFxuICAgIGV4ZWN1dGU6IGFzeW5jIChpbnB1dHM6IFBsdWdpblBhcmFtc1tdKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGltcGxlbWVudGF0aW9uLFxuICAgICAgICBjb25maWdWYWxpZGF0aW9uLFxuICAgICAgICBpbnB1dFZhbGlkYXRpb24sXG4gICAgICAgIGFsbG93QXJpdGhtZXRpY0V4cHJlc3Npb25zLFxuICAgICAgfSA9IHBhcmFtcztcbiAgICAgIGxldCBldmFsdWF0ZWRDb25maWc7XG4gICAgICBjb25zdCBleHByZXNzaW9uQ2xlYW5lZENvbmZpZzogQ29uZmlnUGFyYW1zID0ge307XG4gICAgICBjb25zdCBpc0FyaXRobWV0aWNFbmFibGUgPSAhIWFsbG93QXJpdGhtZXRpY0V4cHJlc3Npb25zO1xuICAgICAgY29uc3QgbWFwcGVkQ29uZmlnOiBDb25maWdQYXJhbXMgPSBtYXBDb25maWdJZk5lZWRlZChjb25maWcsIG1hcHBpbmcpO1xuXG4gICAgICBpZiAoaXNBcml0aG1ldGljRW5hYmxlKSB7XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKG1hcHBlZENvbmZpZykuZm9yRWFjaCgoW3BhcmFtS2V5LCBwYXJhbVZhbHVlXSkgPT4ge1xuICAgICAgICAgIG1hcHBlZENvbmZpZ1twYXJhbUtleV0gPVxuICAgICAgICAgICAgZXZhbHVhdGVTaW1wbGVBcml0aG1ldGljRXhwcmVzc2lvbihwYXJhbVZhbHVlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaW5wdXRzID0gaW5wdXRzLm1hcChpbnB1dCA9PiB7XG4gICAgICAgICAgY29uc3QgZXZhbHVhdGVkSW5wdXQgPSBldmFsdWF0ZUlucHV0KGlucHV0KTtcblxuICAgICAgICAgIC8vIElmIHRoZSBjb25maWcgaXMgbm90IHByb3ZpZGVkLCBza2lwIGV2YWx1YXRpbmcgcGFyYW1ldGVycyBmdW5jdGlvbmFsaXR5LlxuICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhjb25maWchKS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGV2YWx1YXRlZENvbmZpZyA9IGV2YWx1YXRlQ29uZmlnKHtcbiAgICAgICAgICAgICAgY29uZmlnOiBtYXBwZWRDb25maWcsXG4gICAgICAgICAgICAgIGlucHV0OiBldmFsdWF0ZWRJbnB1dCxcbiAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvRXZhbHVhdGU6IGFsbG93QXJpdGhtZXRpY0V4cHJlc3Npb25zLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGV2YWx1YXRlZElucHV0O1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgY29uZmlnIHVzaW5nIHRoZSBwcm92aWRlZCBjb25maWdWYWxpZGF0aW9uIGZ1bmN0aW9uIG9yIHNjaGVtYVxuICAgICAgY29uc3Qgc2FmZUNvbmZpZyA9IGNvbmZpZ1ZhbGlkYXRpb25cbiAgICAgICAgPyB0eXBlb2YgY29uZmlnVmFsaWRhdGlvbiA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gY29uZmlnVmFsaWRhdGlvbihtYXBwZWRDb25maWcpXG4gICAgICAgICAgOiB2YWxpZGF0ZTx6LmluZmVyPHR5cGVvZiBjb25maWdWYWxpZGF0aW9uPj4oXG4gICAgICAgICAgICAgIGNvbmZpZ1ZhbGlkYXRpb24gYXMgWm9kVHlwZTxhbnk+LFxuICAgICAgICAgICAgICBtYXBwZWRDb25maWdcbiAgICAgICAgICAgIClcbiAgICAgICAgOiBjb25maWc7XG5cbiAgICAgIC8vIEluIGNhc2Ugb2YgdGhlIGNvbmZpZyBpcyBub3QgcHJvdmlkZWQsIGJ1dCB0aGUgcGx1Z2luIGhhcyBhIGRlZmF1bHQgY29uZmlnLFxuICAgICAgLy8gZXZhbHVhdGVzIGNvbmZpZyBwYXJhbWV0ZXJzXG4gICAgICBpZiAoXG4gICAgICAgIGlzQXJpdGhtZXRpY0VuYWJsZSAmJlxuICAgICAgICAhT2JqZWN0LmtleXMoY29uZmlnISkubGVuZ3RoICYmXG4gICAgICAgIE9iamVjdC5rZXlzKHNhZmVDb25maWchKS5sZW5ndGhcbiAgICAgICkge1xuICAgICAgICBpbnB1dHMuZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgICAgICAgZXZhbHVhdGVkQ29uZmlnID0gZXZhbHVhdGVDb25maWcoe1xuICAgICAgICAgICAgY29uZmlnOiBtYXBwZWRDb25maWcsXG4gICAgICAgICAgICBpbnB1dDogaW5wdXQsXG4gICAgICAgICAgICBwYXJhbWV0ZXJzVG9FdmFsdWF0ZTogYWxsb3dBcml0aG1ldGljRXhwcmVzc2lvbnMsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBhcml0aG1ldGljIGV4cHJlc3Npb25zIGFyZSBlbmFibGVkLCBzdG9yZSB0aGUgY2xlYW5lZCB2ZXJzaW9uIG9mIHRoZSBleHByZXNzaW9uIGludG8gZXhwcmVzc2lvbkNsZWFuZWRDb25maWdcbiAgICAgIGlmIChpc0FyaXRobWV0aWNFbmFibGUpIHtcbiAgICAgICAgT2JqZWN0LmVudHJpZXMoc2FmZUNvbmZpZykuZm9yRWFjaCgoW3BhcmFtS2V5LCBwYXJhbVZhbHVlXSkgPT4ge1xuICAgICAgICAgIGV4cHJlc3Npb25DbGVhbmVkQ29uZmlnW3BhcmFtS2V5XSA9XG4gICAgICAgICAgICBnZXRQYXJhbWV0ZXJGcm9tQXJpdGhtZXRpY0V4cHJlc3Npb24ocGFyYW1WYWx1ZSBhcyBzdHJpbmcpO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gVmFsaWRhdGUgZWFjaCBpbnB1dCB1c2luZyB0aGUgaW5wdXRWYWxpZGF0aW9uIGZ1bmN0aW9uIG9yIHNjaGVtYVxuICAgICAgY29uc3Qgc2FmZUlucHV0cyA9IGlucHV0cy5tYXAoKGlucHV0LCBpbmRleCkgPT4ge1xuICAgICAgICBpZiAoIWlucHV0VmFsaWRhdGlvbikge1xuICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXRWYWxpZGF0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmV0dXJuIGlucHV0VmFsaWRhdGlvbihcbiAgICAgICAgICAgIGlucHV0LFxuICAgICAgICAgICAgT2JqZWN0LmtleXMoZXhwcmVzc2lvbkNsZWFuZWRDb25maWcpLmxlbmd0aFxuICAgICAgICAgICAgICA/IGV4cHJlc3Npb25DbGVhbmVkQ29uZmlnXG4gICAgICAgICAgICAgIDogc2FmZUNvbmZpZyxcbiAgICAgICAgICAgIGluZGV4XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWxpZGF0ZTx6LmluZmVyPHR5cGVvZiBpbnB1dFZhbGlkYXRpb24+PihcbiAgICAgICAgICBpbnB1dFZhbGlkYXRpb24gYXMgWm9kVHlwZTxhbnk+LFxuICAgICAgICAgIGlucHV0LFxuICAgICAgICAgIGluZGV4XG4gICAgICAgICk7XG4gICAgICB9KTtcblxuICAgICAgLy8gQXBwbHkgbWFwcGluZyB0byBpbnB1dHMgaWYgbmVlZGVkXG4gICAgICBpbnB1dHMgPSBzYWZlSW5wdXRzLm1hcCgoc2FmZUlucHV0LCBpbmRleCkgPT4gKHtcbiAgICAgICAgLi4ubWFwSW5wdXRJZk5lZWRlZCh7Li4uaW5wdXRzW2luZGV4XSwgLi4uc2FmZUlucHV0fSwgbWFwcGluZyksXG4gICAgICB9KSk7XG5cbiAgICAgIC8vIEV4ZWN1dGUgdGhlIGNhbGxiYWNrIHdpdGggdGhlIHZhbGlkYXRlZCBhbmQgcG9zc2libHkgbWFwcGVkIGlucHV0c1xuICAgICAgY29uc3Qgb3V0cHV0cyA9IGF3YWl0IGltcGxlbWVudGF0aW9uKGlucHV0cywge1xuICAgICAgICAuLi5zYWZlQ29uZmlnLFxuICAgICAgICAuLi4oZXZhbHVhdGVkQ29uZmlnIHx8IHt9KSxcbiAgICAgICAgbWFwcGluZyxcbiAgICAgIH0pO1xuXG4gICAgICBsZXQgb3V0cHV0UGFyYW06IHN0cmluZztcblxuICAgICAgLy8gQ2hlY2sgaWYgYXJpdGhtZXRpYyBleHByZXNzaW9ucyBhcmUgZW5hYmxlZCwgZ2V0IG91dHB1dCBwYXJhbWV0ZXJcbiAgICAgIGlmIChpc0FyaXRobWV0aWNFbmFibGUpIHtcbiAgICAgICAgb3V0cHV0UGFyYW0gPSBPYmplY3Qua2V5cyhvdXRwdXRzWzBdKS5maWx0ZXIoXG4gICAgICAgICAgb3V0cHV0ID0+ICFPYmplY3Qua2V5cyhpbnB1dHNbMF0pLmluY2x1ZGVzKG91dHB1dClcbiAgICAgICAgKVswXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG91dHB1dHMubWFwKChvdXRwdXQsIGluZGV4KSA9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMgYXJlIGVuYWJsZWQgYW5kIG91dHB1dFBhcmFtIGV4aXN0cywgZXZhbHVhdGUgb3V0cHV0IHBhcmFtZXRlclxuICAgICAgICBjb25zdCByZXN1bHRPdXRwdXQgPVxuICAgICAgICAgIGlzQXJpdGhtZXRpY0VuYWJsZSAmJiBvdXRwdXRQYXJhbVxuICAgICAgICAgICAgPyBldmFsdWF0ZUFyaXRobWV0aWNPdXRwdXQob3V0cHV0UGFyYW0sIG91dHB1dClcbiAgICAgICAgICAgIDogb3V0cHV0O1xuXG4gICAgICAgIC8vIE1lcmdlIGlucHV0IGlmIGl0IGV4aXN0cywgb3RoZXJ3aXNlIGp1c3QgdXNlIHRoZSBvdXRwdXRcbiAgICAgICAgY29uc3QgY29ycmVzcG9uZGluZ0lucHV0ID0gcmVtb3ZlTWFwcGVkSW5wdXRQYXJhbWV0ZXIoXG4gICAgICAgICAgaW5wdXRzW2luZGV4XSxcbiAgICAgICAgICBtYXBwaW5nXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAuLi5jb3JyZXNwb25kaW5nSW5wdXQsXG4gICAgICAgICAgLi4ubWFwT3V0cHV0SWZOZWVkZWQocmVzdWx0T3V0cHV0LCBtYXBwaW5nKSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xuIl19