in lib/application.ts [327:453]
public static fromConfigObject(
hostSettings: Settings,
jsValue: any,
basePath: string): ApplicationSettings {
utils.ensureSchema(jsValue, this.APP_CONFIG_SCHEMA);
let appSettings: ApplicationSettings = {
baseDir: basePath,
id: jsValue.id,
description: jsValue.description,
allowPerRequestOverride: jsValue.allowPerRequestOverride,
defaultExecutionStack: jsValue.defaultExecutionStack,
objectContextDef: hostSettings.objectContextDef,
metrics: []
};
// Optional: allowPerRequestOverride.
// Inherit host settings if it's not provided from application.
if (appSettings.allowPerRequestOverride == null) {
appSettings.allowPerRequestOverride = hostSettings.allowPerRequestOverride;
}
// Optional: defaultExecutionStack.
// Inherit host settings if it's not provided from application.
if (appSettings.defaultExecutionStack == null) {
appSettings.defaultExecutionStack = hostSettings.defaultExecutionStack;
}
// Required: 'objectTypes'
let typeDefFiles: string[] = jsValue.objectTypes;
let typeDefinitions: TypeDef[] = [];
let typeToFileName: { [typeName: string]: string } = {};
for (let typeDefFile of typeDefFiles) {
let typeDefs = TypeConfig.fromConfig(path.resolve(basePath, typeDefFile));
for (let typeDefinition of typeDefs) {
if (typeToFileName.hasOwnProperty(typeDefinition.typeName)
&& !typeDefinition.override) {
throw new Error("Object type '"
+ typeDefinition.typeName
+ "' already exists in file '"
+ typeToFileName[typeDefinition.typeName]
+ "'. Did you forget to set property 'override' to true? ");
}
typeDefinitions.push(typeDefinition);
typeToFileName[typeDefinition.typeName] = typeDefFile;
}
}
// Optional: 'objectProviders'
let providerDefFiles: string[] = jsValue.objectProviders;
let providerDefinitions: ProviderDef[] = [];
let protocolToFileName: { [protocolName: string]: string } = {};
if (providerDefFiles != null) {
for (let providerDefFile of providerDefFiles) {
let providerDefs = ProviderConfig.fromConfig(path.resolve(basePath, providerDefFile));
for (let providerDef of providerDefs) {
if (protocolToFileName.hasOwnProperty(providerDef.protocol)
&& !providerDef.override) {
throw new Error("Object provider with protocol '"
+ providerDef.protocol
+ "' already exists in file '"
+ protocolToFileName[providerDef.protocol]
+ "' .Did you forget to set property 'override' to true? ");
}
providerDefinitions.push(providerDef);
protocolToFileName[providerDef.protocol] = providerDefFile;
}
}
}
// Required: 'namedObjects'
let namedObjectDefFiles: string[] = jsValue.namedObjects;
let namedObjectDefinitions: NamedObjectDef[] = [];
let nameToFileName: {[objectName: string]: string} = {};
for (let namedObjectDefFile of namedObjectDefFiles) {
let objectDefs = NamedObjectConfig.fromConfig(path.resolve(basePath, namedObjectDefFile));
for (let objectDef of objectDefs) {
if (nameToFileName.hasOwnProperty(objectDef.name)
&& !objectDef.override) {
throw new Error("Named object'"
+ objectDef.name
+ "' already exists in file '"
+ nameToFileName[objectDef.name]
+ "'. Did you forget to set property 'override' to true? ");
}
namedObjectDefinitions.push(objectDef);
nameToFileName[objectDef.name] = namedObjectDefFile;
}
}
appSettings.objectContextDef = new ScopedObjectContextDef(
hostSettings.objectContextDef,
typeDefinitions,
providerDefinitions,
namedObjectDefinitions,
true // Enable depenency check.
);
// Optional: 'metrics'
let metricDefObject: any = jsValue.metrics;
if (metricDefObject != null) {
let sectionName = metricDefObject.sectionName;
let metricDefFiles: string[] = metricDefObject.definition;
let metricToFilename: { [metricName: string]: string } = {}
metricDefFiles.forEach(metricDefFile => {
let metricDefs = MetricConfig.fromConfig(
sectionName,
path.resolve(basePath, metricDefFile));
metricDefs.forEach(metricDef => {
if (metricToFilename.hasOwnProperty(metricDef.name)) {
throw new Error("Metric '"
+ metricDef.name
+ "' already defined in file '"
+ metricToFilename[metricDef.name]
+ "'.");
}
appSettings.metrics.push(metricDef);
metricToFilename[metricDef.name] = metricDefFile;
});
});
}
return appSettings;
}