100 lines
3.0 KiB
JavaScript
100 lines
3.0 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.FeatureConfig = exports.FeatureManager = void 0;
|
|
exports.getObjectAtPath = getObjectAtPath;
|
|
const notify_1 = require("./features/notify");
|
|
const profiling_1 = require("./features/profiling");
|
|
const events_1 = require("./features/events");
|
|
const metrics_1 = require("./features/metrics");
|
|
const dependencies_1 = require("./features/dependencies");
|
|
const Debug = require("debug");
|
|
function getObjectAtPath(context, path) {
|
|
if (path.indexOf('.') === -1 && path.indexOf('[') === -1) {
|
|
return context[path];
|
|
}
|
|
let crumbs = path.split(/\.|\[|\]/g);
|
|
let i = -1;
|
|
let len = crumbs.length;
|
|
let result;
|
|
while (++i < len) {
|
|
if (i === 0)
|
|
result = context;
|
|
if (!crumbs[i])
|
|
continue;
|
|
if (result === undefined)
|
|
break;
|
|
result = result[crumbs[i]];
|
|
}
|
|
return result;
|
|
}
|
|
class AvailableFeature {
|
|
}
|
|
const availablesFeatures = [
|
|
{
|
|
name: 'notify',
|
|
optionsPath: '.',
|
|
module: notify_1.NotifyFeature
|
|
},
|
|
{
|
|
name: 'profiler',
|
|
optionsPath: 'profiling',
|
|
module: profiling_1.ProfilingFeature
|
|
},
|
|
{
|
|
name: 'events',
|
|
module: events_1.EventsFeature
|
|
},
|
|
{
|
|
name: 'metrics',
|
|
optionsPath: 'metrics',
|
|
module: metrics_1.MetricsFeature
|
|
},
|
|
{
|
|
name: 'dependencies',
|
|
module: dependencies_1.DependenciesFeature
|
|
}
|
|
];
|
|
class FeatureManager {
|
|
constructor() {
|
|
this.logger = Debug('axm:features');
|
|
}
|
|
init(options) {
|
|
for (let availableFeature of availablesFeatures) {
|
|
this.logger(`Creating feature ${availableFeature.name}`);
|
|
const feature = new availableFeature.module();
|
|
let config = undefined;
|
|
if (typeof availableFeature.optionsPath !== 'string') {
|
|
config = {};
|
|
}
|
|
else if (availableFeature.optionsPath === '.') {
|
|
config = options;
|
|
}
|
|
else {
|
|
config = getObjectAtPath(options, availableFeature.optionsPath);
|
|
}
|
|
this.logger(`Init feature ${availableFeature.name}`);
|
|
feature.init(config);
|
|
availableFeature.instance = feature;
|
|
}
|
|
}
|
|
get(name) {
|
|
const feature = availablesFeatures.find(feature => feature.name === name);
|
|
if (feature === undefined || feature.instance === undefined) {
|
|
throw new Error(`Tried to call feature ${name} which doesn't exist or wasn't initiated`);
|
|
}
|
|
return feature.instance;
|
|
}
|
|
destroy() {
|
|
for (let availableFeature of availablesFeatures) {
|
|
if (availableFeature.instance === undefined)
|
|
continue;
|
|
this.logger(`Destroy feature ${availableFeature.name}`);
|
|
availableFeature.instance.destroy();
|
|
}
|
|
}
|
|
}
|
|
exports.FeatureManager = FeatureManager;
|
|
class FeatureConfig {
|
|
}
|
|
exports.FeatureConfig = FeatureConfig;
|