UNPKG

@orchestrator/core

Version:
63 lines 10.6 kB
import { Property } from '@orchestrator/gen-io-ts'; import { chain } from 'fp-ts/lib/Either'; import { pipe } from 'fp-ts/function'; import * as t from 'io-ts'; import { addConfig } from '../../metadata/configuration'; import { parseFunction } from '../../util'; export const CUSTOM_FUNCTION_ARGUMENT_PREFIX = '$'; export const FunctionFromMeta = new t.Type('FunctionFromMeta', isFunctionWithMeta, (m, c) => pipe(t.UnknownRecord.validate(m, c), chain((obj) => { if (!hasFunctionMeta(obj)) { return t.failure(m, c); } // Move custom arguments to the end obj.args.sort((arg1, arg2) => { const is1Custom = arg1.startsWith(CUSTOM_FUNCTION_ARGUMENT_PREFIX); const is2Custom = arg2.startsWith(CUSTOM_FUNCTION_ARGUMENT_PREFIX); if (is1Custom === is2Custom) { return 0; } return is1Custom ? 1 : -1; }); const fn = new Function(...obj.args, obj.body); fn.args = obj.args; fn.body = obj.body; return t.success(fn); })), (fn) => ({ args: fn.args, body: fn.body })); export const FunctionFromString = new t.Type('FunctionFromString', isFunctionWithMeta, (m, c) => pipe(t.string.validate(m, c), chain((str) => { try { return FunctionFromMeta.validate(parseFunction(str), c); } catch { return t.failure(str, c); } })), (fn) => fn.toString()); // eslint-disable-next-line @typescript-eslint/ban-types export const FunctionWithMeta = new t.Type('FunctionWithMeta', isFunctionWithMeta, (m, c) => pipe(t.Function.validate(m, c), chain((fn) => { try { // Reconstruct function from string to reorder arguments return FunctionFromString.validate(fn.toString(), c); } catch { return t.failure(fn, c); } })), (fn) => fn); export function OptionFunction(customInjector) { const decorator = Property({ typeFactory: () => t.union([FunctionFromString, FunctionFromMeta, FunctionWithMeta]), }); return (target, prop) => { decorator(target, prop); addConfig(target, { prop, decorator: OptionFunction, args: [customInjector], }); }; } function hasFunctionMeta(obj) { return obj && Array.isArray(obj.args) && typeof obj.body === 'string'; } function isFunctionWithMeta(fn) { return typeof fn === 'function' && hasFunctionMeta(fn); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvcmUvc3JjL2xpYi9jb25maWcvb3B0aW9uL2Z1bmN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNuRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RDLE9BQU8sS0FBSyxDQUFDLE1BQU0sT0FBTyxDQUFDO0FBRTNCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBVzNDLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLEdBQUcsQ0FBQztBQUVuRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ3hDLGtCQUFrQixFQUNsQixrQkFBa0IsRUFDbEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDUCxJQUFJLENBQ0YsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUM5QixLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtJQUNaLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDekIsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUN4QjtJQUVELG1DQUFtQztJQUNuQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRTtRQUMzQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLCtCQUErQixDQUFDLENBQUM7UUFD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SUFBSSxFQUFFLENBQUMsY0FBYyxDQUFDO1NBQ3ZCLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxHQUFRO0lBQy9CLE9BQU8sR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7QUFDeEUsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsRUFBTztJQUNqQyxPQUFPLE9BQU8sRUFBRSxLQUFLLFVBQVUsSUFBSSxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDekQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBQcm9wZXJ0eSB9IGZyb20gJ0BvcmNoZXN0cmF0b3IvZ2VuLWlvLXRzJztcbmltcG9ydCB7IGNoYWluIH0gZnJvbSAnZnAtdHMvbGliL0VpdGhlcic7XG5pbXBvcnQgeyBwaXBlIH0gZnJvbSAnZnAtdHMvZnVuY3Rpb24nO1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5cbmltcG9ydCB7IGFkZENvbmZpZyB9IGZyb20gJy4uLy4uL21ldGFkYXRhL2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgcGFyc2VGdW5jdGlvbiB9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5leHBvcnQgdHlwZSBDdXN0b21JbmplY3RvckZhY3RvcnkgPSAocGFyZW50SW5qZWN0b3I6IEluamVjdG9yKSA9PiBJbmplY3RvcjtcblxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbk1ldGEge1xuICBhcmdzOiBzdHJpbmdbXTtcbiAgYm9keTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZ1bmN0aW9uV2l0aE1ldGEgZXh0ZW5kcyBGdW5jdGlvbiwgRnVuY3Rpb25NZXRhIHt9XG5cbmV4cG9ydCBjb25zdCBDVVNUT01fRlVOQ1RJT05fQVJHVU1FTlRfUFJFRklYID0gJyQnO1xuXG5leHBvcnQgY29uc3QgRnVuY3Rpb25Gcm9tTWV0YSA9IG5ldyB0LlR5cGU8RnVuY3Rpb25XaXRoTWV0YSwgRnVuY3Rpb25NZXRhPihcbiAgJ0Z1bmN0aW9uRnJvbU1ldGEnLFxuICBpc0Z1bmN0aW9uV2l0aE1ldGEsXG4gIChtLCBjKSA9PlxuICAgIHBpcGUoXG4gICAgICB0LlVua25vd25SZWNvcmQudmFsaWRhdGUobSwgYyksXG4gICAgICBjaGFpbigob2JqKSA9PiB7XG4gICAgICAgIGlmICghaGFzRnVuY3Rpb25NZXRhKG9iaikpIHtcbiAgICAgICAgICByZXR1cm4gdC5mYWlsdXJlKG0sIGMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTW92ZSBjdXN0b20gYXJndW1lbnRzIHRvIHRoZSBlbmRcbiAgICAgICAgb2JqLmFyZ3Muc29ydCgoYXJnMSwgYXJnMikgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzMUN1c3RvbSA9IGFyZzEuc3RhcnRzV2l0aChDVVNUT01fRlVOQ1RJT05fQVJHVU1FTlRfUFJFRklYKTtcbiAgICAgICAgICBjb25zdCBpczJDdXN0b20gPSBhcmcyLnN0YXJ0c1dpdGgoQ1VTVE9NX0ZVTkNUSU9OX0FSR1VNRU5UX1BSRUZJWCk7XG5cbiAgICAgICAgICBpZiAoaXMxQ3VzdG9tID09PSBpczJDdXN0b20pIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBpczFDdXN0b20gPyAxIDogLTE7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGZuID0gbmV3IEZ1bmN0aW9uKC4uLm9iai5hcmdzLCBvYmouYm9keSkgYXMgRnVuY3Rpb25XaXRoTWV0YTtcbiAgICAgICAgZm4uYXJncyA9IG9iai5hcmdzO1xuICAgICAgICBmbi5ib2R5ID0gb2JqLmJvZHk7XG5cbiAgICAgICAgcmV0dXJuIHQuc3VjY2Vzcyhmbik7XG4gICAgICB9KSxcbiAgICApLFxuICAoZm4pID0+ICh7IGFyZ3M6IGZuLmFyZ3MsIGJvZHk6IGZuLmJvZHkgfSksXG4pO1xuXG5leHBvcnQgY29uc3QgRnVuY3Rpb25Gcm9tU3RyaW5nID0gbmV3IHQuVHlwZTxGdW5jdGlvbldpdGhNZXRhLCBzdHJpbmc+KFxuICAnRnVuY3Rpb25Gcm9tU3RyaW5nJyxcbiAgaXNGdW5jdGlvbldpdGhNZXRhLFxuICAobSwgYykgPT5cbiAgICBwaXBlKFxuICAgICAgdC5zdHJpbmcudmFsaWRhdGUobSwgYyksXG4gICAgICBjaGFpbigoc3RyKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uRnJvbU1ldGEudmFsaWRhdGUocGFyc2VGdW5jdGlvbihzdHIpLCBjKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIHQuZmFpbHVyZShzdHIsIGMpO1xuICAgICAgICB9XG4gICAgICB9KSxcbiAgICApLFxuICAoZm4pID0+IGZuLnRvU3RyaW5nKCksXG4pO1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xuZXhwb3J0IGNvbnN0IEZ1bmN0aW9uV2l0aE1ldGEgPSBuZXcgdC5UeXBlPEZ1bmN0aW9uV2l0aE1ldGEsIEZ1bmN0aW9uPihcbiAgJ0Z1bmN0aW9uV2l0aE1ldGEnLFxuICBpc0Z1bmN0aW9uV2l0aE1ldGEsXG4gIChtLCBjKSA9PlxuICAgIHBpcGUoXG4gICAgICB0LkZ1bmN0aW9uLnZhbGlkYXRlKG0sIGMpLFxuICAgICAgY2hhaW4oKGZuKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gUmVjb25zdHJ1Y3QgZnVuY3Rpb24gZnJvbSBzdHJpbmcgdG8gcmVvcmRlciBhcmd1bWVudHNcbiAgICAgICAgICByZXR1cm4gRnVuY3Rpb25Gcm9tU3RyaW5nLnZhbGlkYXRlKGZuLnRvU3RyaW5nKCksIGMpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gdC5mYWlsdXJlKGZuLCBjKTtcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgKSxcbiAgKGZuKSA9PiBmbixcbik7XG5cbmV4cG9ydCBmdW5jdGlvbiBPcHRpb25GdW5jdGlvbihcbiAgY3VzdG9tSW5qZWN0b3I/OiBDdXN0b21JbmplY3RvckZhY3RvcnksXG4pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIGNvbnN0IGRlY29yYXRvciA9IFByb3BlcnR5KHtcbiAgICB0eXBlRmFjdG9yeTogKCkgPT5cbiAgICAgIHQudW5pb24oW0Z1bmN0aW9uRnJvbVN0cmluZywgRnVuY3Rpb25Gcm9tTWV0YSwgRnVuY3Rpb25XaXRoTWV0YV0pLFxuICB9KTtcbiAgcmV0dXJuICh0YXJnZXQsIHByb3ApID0+IHtcbiAgICBkZWNvcmF0b3IodGFyZ2V0LCBwcm9wKTtcbiAgICBhZGRDb25maWcodGFyZ2V0LCB7XG4gICAgICBwcm9wLFxuICAgICAgZGVjb3JhdG9yOiBPcHRpb25GdW5jdGlvbixcbiAgICAgIGFyZ3M6IFtjdXN0b21JbmplY3Rvcl0sXG4gICAgfSk7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGhhc0Z1bmN0aW9uTWV0YShvYmo6IGFueSk6IG9iaiBpcyBGdW5jdGlvbk1ldGEge1xuICByZXR1cm4gb2JqICYmIEFycmF5LmlzQXJyYXkob2JqLmFyZ3MpICYmIHR5cGVvZiBvYmouYm9keSA9PT0gJ3N0cmluZyc7XG59XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb25XaXRoTWV0YShmbjogYW55KTogZm4gaXMgRnVuY3Rpb25XaXRoTWV0YSB7XG4gIHJldHVybiB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgJiYgaGFzRnVuY3Rpb25NZXRhKGZuKTtcbn1cbiJdfQ==