@orchestrator/core
Version:
> Core package of Orchestrator library.
95 lines • 16.1 kB
JavaScript
import { Injectable, Injector } from '@angular/core';
import { genIoType } from '@orchestrator/gen-io-ts';
import { fold as foldEither, isLeft, left, map } from 'fp-ts/lib/Either';
import { fold, none, some } from 'fp-ts/lib/Option';
import { pipe } from 'fp-ts/function';
import { ErrorStrategy } from '../error-strategy/error-strategy';
import { getConfigs } from '../metadata/configuration';
import { getArgName, isArgOptional } from '../util';
import { FunctionError } from './function-error';
import { InvalidConfigurationError } from './invalid-configuration-error';
import { OptionFunction, } from './option/function';
import * as i0 from "@angular/core";
import * as i1 from "../error-strategy/error-strategy";
export class ConfigurationService {
constructor(errorStrategy, injector) {
this.errorStrategy = errorStrategy;
this.injector = injector;
this.codecMap = new Map();
}
decode(type, config, injector) {
return pipe(this.validate(type, config), map((c) => this.processFunctions(type, c, config, injector)), foldEither(() => config, (decodedConfig) => decodedConfig));
}
validate(type, config) {
const validation = pipe(this.getCodecFor(type), fold(() => left([]), (codec) => codec.decode(config)));
if (isLeft(validation) && type) {
this.errorStrategy.handle(new InvalidConfigurationError(type, validation, config));
}
return validation;
}
getMetaOf(type) {
return getConfigs(type.prototype);
}
getCodecFor(type) {
if (!type) {
return none;
}
const codec = this.codecMap.get(type) || genIoType(type);
this.codecMap.set(type, codec); // Set codec back to cache
return some(codec);
}
processFunctions(type, config, originalConfig, injector = this.injector) {
const meta = this.getMetaOf(type);
meta
.filter((m) => m.decorator === OptionFunction && config[m.prop])
.forEach((m) => {
const customInjectorFactory = m.args[0];
const customInjector = customInjectorFactory
? customInjectorFactory(injector)
: injector;
const { args, fn } = this.bindFunction(config[m.prop], customInjector);
config[m.prop] = fn;
config[m.prop] = this.guardFunction(config[m.prop], type, String(m.prop), originalConfig[m.prop], args);
});
return config;
}
bindFunction(fn, injector) {
const { args, body } = fn;
const resolvedArgs = args
.filter((arg) => !arg.startsWith('$'))
.map((arg) => this.resolveArg(arg, injector));
const boundFn = fn.bind(null, ...resolvedArgs);
boundFn.args = args;
boundFn.body = body;
return { fn: boundFn, args: resolvedArgs };
}
guardFunction(fn, configType, fnName, fnBody, boundArgs) {
const guardedFn = ((...args) => {
try {
return fn(...args);
}
catch (e) {
this.errorStrategy.handle(new FunctionError(configType, e, fnName, fnBody, [
...boundArgs,
...args,
]));
}
});
guardedFn.args = fn.args;
guardedFn.body = fn.body;
return guardedFn;
}
resolveArg(argExpr, injector) {
const arg = getArgName(argExpr);
const isOptional = isArgOptional(argExpr);
// Dynamically resolve function arguments - no type info available
const res = injector.get(arg, isOptional ? null : Injector.THROW_IF_NOT_FOUND);
return res === null && isOptional ? undefined : res;
}
}
/** @nocollapse */ /** @nocollapse */ ConfigurationService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: ConfigurationService, deps: [{ token: i1.ErrorStrategy }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable });
/** @nocollapse */ /** @nocollapse */ ConfigurationService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: ConfigurationService });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.0", ngImport: i0, type: ConfigurationService, decorators: [{
type: Injectable
}], ctorParameters: function () { return [{ type: i1.ErrorStrategy }, { type: i0.Injector }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb3JlL3NyYy9saWIvY29uZmlnL2NvbmZpZ3VyYXRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBUSxNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLElBQUksSUFBSSxVQUFVLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBVSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHdEMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ2pFLE9BQU8sRUFBcUIsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDMUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDcEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQzFFLE9BQU8sRUFHTCxjQUFjLEdBQ2YsTUFBTSxtQkFBbUIsQ0FBQzs7O0FBRzNCLE1BQU0sT0FBTyxvQkFBb0I7SUFHL0IsWUFDVSxhQUE0QixFQUM1QixRQUFrQjtRQURsQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBSnBCLGFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztJQUtuRCxDQUFDO0lBSUosTUFBTSxDQUFPLElBQWEsRUFBRSxN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Q0FBQyxDQUNILENBQUM7YUFDSDtRQUNILENBQUMsQ0FBZ0MsQ0FBQztRQUVsQyxTQUFTLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDekIsU0FBUyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1FBRXpCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFTyxVQUFVLENBQUMsT0FBZSxFQUFFLFFBQWtCO1FBQ3BELE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoQyxNQUFNLFVBQVUsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFMUMsa0VBQWtFO1FBQ2xFLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQ3RCLEdBQUcsRUFDSCxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGtCQUFrQixDQUNoRCxDQUFDO1FBRUYsT0FBTyxHQUFHLEtBQUssSUFBSSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDdEQsQ0FBQzs7dUpBMUlVLG9CQUFvQjsySkFBcEIsb0JBQW9COzJGQUFwQixvQkFBb0I7a0JBRGhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgVHlwZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2VuSW9UeXBlIH0gZnJvbSAnQG9yY2hlc3RyYXRvci9nZW4taW8tdHMnO1xuaW1wb3J0IHsgZm9sZCBhcyBmb2xkRWl0aGVyLCBpc0xlZnQsIGxlZnQsIG1hcCB9IGZyb20gJ2ZwLXRzL2xpYi9FaXRoZXInO1xuaW1wb3J0IHsgZm9sZCwgbm9uZSwgT3B0aW9uLCBzb21lIH0gZnJvbSAnZnAtdHMvbGliL09wdGlvbic7XG5pbXBvcnQgeyBwaXBlIH0gZnJvbSAnZnAtdHMvZnVuY3Rpb24nO1xuaW1wb3J0IHsgRXJyb3JzLCBUeXBlIGFzIElvQ29kZWMsIFZhbGlkYXRpb24gfSBmcm9tICdpby10cyc7XG5cbmltcG9ydCB7IEVycm9yU3RyYXRlZ3kgfSBmcm9tICcuLi9lcnJvci1zdHJhdGVneS9lcnJvci1zdHJhdGVneSc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uTWV0YSwgZ2V0Q29uZmlncyB9IGZyb20gJy4uL21ldGFkYXRhL2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgZ2V0QXJnTmFtZSwgaXNBcmdPcHRpb25hbCB9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHsgRnVuY3Rpb25FcnJvciB9IGZyb20gJy4vZnVuY3Rpb24tZXJyb3InO1xuaW1wb3J0IHsgSW52YWxpZENvbmZpZ3VyYXRpb25FcnJvciB9IGZyb20gJy4vaW52YWxpZC1jb25maWd1cmF0aW9uLWVycm9yJztcbmltcG9ydCB7XG4gIEN1c3RvbUluamVjdG9yRmFjdG9yeSxcbiAgRnVuY3Rpb25XaXRoTWV0YSxcbiAgT3B0aW9uRnVuY3Rpb24sXG59IGZyb20gJy4vb3B0aW9uL2Z1bmN0aW9uJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvbmZpZ3VyYXRpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSBjb2RlY01hcCA9IG5ldyBNYXA8VHlwZTxhbnk+LCBJb0NvZGVjPGFueT4+KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlcnJvclN0cmF0ZWd5OiBFcnJvclN0cmF0ZWd5LFxuICAgIHByaXZhdGUgaW5qZWN0b3I6IEluamVjdG9yLFxuICApIHt9XG5cbiAgZGVjb2RlPFQ+KHR5cGU6IFR5cGU8VD4sIGNvbmZpZzogVCwgaW5qZWN0b3I/OiBJbmplY3Rvcik6IFQ7XG4gIGRlY29kZTxULCBDPih0eXBlOiBUeXBlPFQ+LCBjb25maWc6IEMsIGluamVjdG9yPzogSW5qZWN0b3IpOiBUIHwgQztcbiAgZGVjb2RlPFQsIEM+KHR5cGU6IFR5cGU8VD4sIGNvbmZpZzogQywgaW5qZWN0b3I/OiBJbmplY3Rvcik6IFQgfCBDIHtcbiAgICByZXR1cm4gcGlwZShcbiAgICAgIHRoaXMudmFsaWRhdGUodHlwZSwgY29uZmlnKSxcbiAgICAgIG1hcCgoYykgPT4gdGhpcy5wcm9jZXNzRnVuY3Rpb25zKHR5cGUsIGMsIGNvbmZpZywgaW5qZWN0b3IpKSxcbiAgICAgIGZvbGRFaXRoZXIoXG4gICAgICAgICgpID0+IGNvbmZpZyxcbiAgICAgICAgKGRlY29kZWRDb25maWcpID0+IGRlY29kZWRDb25maWcsXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICB2YWxpZGF0ZTxULCBDPih0eXBlOiBUeXBlPFQ+LCBjb25maWc6IEMpOiBWYWxpZGF0aW9uPFQgfCBDPiB7XG4gICAgY29uc3QgdmFsaWRhdGlvbiA9IHBpcGUoXG4gICAgICB0aGlzLmdldENvZGVjRm9yKHR5cGUpLFxuICAgICAgZm9sZChcbiAgICAgICAgKCkgPT4gbGVmdDxFcnJvcnMsIFQ+KFtdKSxcbiAgICAgICAgKGNvZGVjKSA9PiBjb2RlYy5kZWNvZGUoY29uZmlnKSxcbiAgICAgICksXG4gICAgKTtcblxuICAgIGlmIChpc0xlZnQodmFsaWRhdGlvbikgJiYgdHlwZSkge1xuICAgICAgdGhpcy5lcnJvclN0cmF0ZWd5LmhhbmRsZShcbiAgICAgICAgbmV3IEludmFsaWRDb25maWd1cmF0aW9uRXJyb3IodHlwZSwgdmFsaWRhdGlvbiwgY29uZmlnKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbGlkYXRpb247XG4gIH1cblxuICBnZXRNZXRhT2YodHlwZTogVHlwZTxhbnk+KTogQ29uZmlndXJhdGlvbk1ldGFbXSB7XG4gICAgcmV0dXJuIGdldENvbmZpZ3ModHlwZS5wcm90b3R5cGUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb2RlY0ZvcjxUPih0eXBlOiBUeXBlPFQ+KTogT3B0aW9uPElvQ29kZWM8VD4+IHtcbiAgICBpZiAoIXR5cGUpIHtcbiAgICAgIHJldHVybiBub25lO1xuICAgIH1cblxuICAgIGNvbnN0IGNvZGVjID0gdGhpcy5jb2RlY01hcC5nZXQodHlwZSkgfHwgZ2VuSW9UeXBlKHR5cGUpO1xuICAgIHRoaXMuY29kZWNNYXAuc2V0KHR5cGUsIGNvZGVjKTsgLy8gU2V0IGNvZGVjIGJhY2sgdG8gY2FjaGVcbiAgICByZXR1cm4gc29tZShjb2RlYyk7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NGdW5jdGlvbnM8VD4oXG4gICAgdHlwZTogVHlwZTxUPixcbiAgICBjb25maWc6IFQsXG4gICAgb3JpZ2luYWxDb25maWc6IGFueSxcbiAgICBpbmplY3RvciA9IHRoaXMuaW5qZWN0b3IsXG4gICk6IFQge1xuICAgIGNvbnN0IG1ldGEgPSB0aGlzLmdldE1ldGFPZih0eXBlKTtcblxuICAgIG1ldGFcbiAgICAgIC5maWx0ZXIoKG0pID0+IG0uZGVjb3JhdG9yID09PSBPcHRpb25GdW5jdGlvbiAmJiBjb25maWdbbS5wcm9wXSlcbiAgICAgIC5mb3JFYWNoKChtKSA9PiB7XG4gICAgICAgIGNvbnN0IGN1c3RvbUluamVjdG9yRmFjdG9yeSA9IG0uYXJnc1swXSBhcyBDdXN0b21JbmplY3RvckZhY3Rvcnk7XG4gICAgICAgIGNvbnN0IGN1c3RvbUluamVjdG9yID0gY3VzdG9tSW5qZWN0b3JGYWN0b3J5XG4gICAgICAgICAgPyBjdXN0b21JbmplY3RvckZhY3RvcnkoaW5qZWN0b3IpXG4gICAgICAgICAgOiBpbmplY3RvcjtcblxuICAgICAgICBjb25zdCB7IGFyZ3MsIGZuIH0gPSB0aGlzLmJpbmRGdW5jdGlvbihjb25maWdbbS5wcm9wXSwgY3VzdG9tSW5qZWN0b3IpO1xuXG4gICAgICAgIGNvbmZpZ1ttLnByb3BdID0gZm47XG4gICAgICAgIGNvbmZpZ1ttLnByb3BdID0gdGhpcy5ndWFyZEZ1bmN0aW9uKFxuICAgICAgICAgIGNvbmZpZ1ttLnByb3BdLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgU3RyaW5nKG0ucHJvcCksXG4gICAgICAgICAgb3JpZ2luYWxDb25maWdbbS5wcm9wXSxcbiAgICAgICAgICBhcmdzLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kRnVuY3Rpb24oXG4gICAgZm46IEZ1bmN0aW9uV2l0aE1ldGEsXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICApOiB7IGZuOiBGdW5jdGlvbldpdGhNZXRhOyBhcmdzOiBhbnlbXSB9IHtcbiAgICBjb25zdCB7IGFyZ3MsIGJvZHkgfSA9IGZuO1xuXG4gICAgY29uc3QgcmVzb2x2ZWRBcmdzID0gYXJnc1xuICAgICAgLmZpbHRlcigoYXJnKSA9PiAhYXJnLnN0YXJ0c1dpdGgoJyQnKSlcbiAgICAgIC5tYXAoKGFyZykgPT4gdGhpcy5yZXNvbHZlQXJnKGFyZywgaW5qZWN0b3IpKTtcblxuICAgIGNvbnN0IGJvdW5kRm4gPSBmbi5iaW5kKG51bGwsIC4uLnJlc29sdmVkQXJncykgYXMgRnVuY3Rpb25XaXRoTWV0YTtcbiAgICBib3VuZEZuLmFyZ3MgPSBhcmdzO1xuICAgIGJvdW5kRm4uYm9keSA9IGJvZHk7XG5cbiAgICByZXR1cm4geyBmbjogYm91bmRGbiwgYXJnczogcmVzb2x2ZWRBcmdzIH07XG4gIH1cblxuICBwcml2YXRlIGd1YXJkRnVuY3Rpb24oXG4gICAgZm46IEZ1bmN0aW9uV2l0aE1ldGEsXG4gICAgY29uZmlnVHlwZTogVHlwZTxhbnk+LFxuICAgIGZuTmFtZTogc3RyaW5nLFxuICAgIGZuQm9keTogc3RyaW5nLFxuICAgIGJvdW5kQXJnczogYW55W10sXG4gICk6IEZ1bmN0aW9uV2l0aE1ldGEge1xuICAgIGNvbnN0IGd1YXJkZWRGbiA9ICgoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBmbiguLi5hcmdzKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5lcnJvclN0cmF0ZWd5LmhhbmRsZShcbiAgICAgICAgICBuZXcgRnVuY3Rpb25FcnJvcihjb25maWdUeXBlLCBlLCBmbk5hbWUsIGZuQm9keSwgW1xuICAgICAgICAgICAgLi4uYm91bmRBcmdzLFxuICAgICAgICAgICAgLi4uYXJncyxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KSBhcyB1bmtub3duIGFzIEZ1bmN0aW9uV2l0aE1ldGE7XG5cbiAgICBndWFyZGVkRm4uYXJncyA9IGZuLmFyZ3M7XG4gICAgZ3VhcmRlZEZuLmJvZHkgPSBmbi5ib2R5O1xuXG4gICAgcmV0dXJuIGd1YXJkZWRGbjtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUFyZyhhcmdFeHByOiBzdHJpbmcsIGluamVjdG9yOiBJbmplY3Rvcik6IGFueSB7XG4gICAgY29uc3QgYXJnID0gZ2V0QXJnTmFtZShhcmdFeHByKTtcbiAgICBjb25zdCBpc09wdGlvbmFsID0gaXNBcmdPcHRpb25hbChhcmdFeHByKTtcblxuICAgIC8vIER5bmFtaWNhbGx5IHJlc29sdmUgZnVuY3Rpb24gYXJndW1lbnRzIC0gbm8gdHlwZSBpbmZvIGF2YWlsYWJsZVxuICAgIGNvbnN0IHJlcyA9IGluamVjdG9yLmdldChcbiAgICAgIGFyZyxcbiAgICAgIGlzT3B0aW9uYWwgPyBudWxsIDogSW5qZWN0b3IuVEhST1dfSUZfTk9UX0ZPVU5ELFxuICAgICk7XG5cbiAgICByZXR1cm4gcmVzID09PSBudWxsICYmIGlzT3B0aW9uYWwgPyB1bmRlZmluZWQgOiByZXM7XG4gIH1cbn1cbiJdfQ==