@accordproject/concerto-core
Version:
Core Implementation for the Concerto Modeling Language
144 lines • 6.02 kB
JavaScript
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
const fs = __importStar(require("fs"));
const concerto_cto_1 = require("@accordproject/concerto-cto");
const concerto_util_1 = require("@accordproject/concerto-util");
const ModelFile = require("./introspect/modelfile");
const ModelManager = require("./modelmanager");
/**
* Create a ModelManager from model files, with an optional system model.
*
* If a ctoFile is not provided, the Accord Project system model is used.
*
* @class
* @memberof module:concerto-core
*/
class ModelLoader {
/**
* Add model file
*
* @param {object} modelFileLoader - the model loader
* @param {object} modelManager - the model manager
* @param {string} ctoFile - the model file
* @return {Promise<ModelManager>} the model manager
* @private
*/
static async addModel(modelFileLoader, modelManager, ctoFile) {
let modelFile = null;
if (modelFileLoader.accepts(ctoFile)) {
modelFile = await modelFileLoader.load(ctoFile);
}
else {
const content = fs.readFileSync(ctoFile, 'utf8');
const ast = concerto_cto_1.Parser.parse(content, ctoFile);
modelFile = new ModelFile(modelManager, ast, content, ctoFile);
}
modelManager.addModelFile(modelFile, null, modelFile.getName(), true);
return modelManager;
}
/**
* Load models in a new model manager
*
* @param {string[]} ctoFiles - the CTO files (can be local file paths or URLs)
* @param {object} options - optional parameters
* @param {boolean} [options.offline] - do not resolve external models
* @param {number} [options.utcOffset] - UTC Offset for this execution
* @return {Promise<ModelManager>} the model manager
*/
static async loadModelManager(ctoFiles, options = { offline: false }) {
const opts = options || { offline: false };
let modelManager = new ModelManager(opts);
// How to create a modelfile from the external content
const processFile = (name, data) => {
const ast = concerto_cto_1.Parser.parse(data);
return new ModelFile(modelManager, ast, data, name);
};
const modelFileLoader = new concerto_util_1.DefaultFileLoader(processFile);
// Load user models
for (let ctoFile of ctoFiles) {
modelManager = await ModelLoader.addModel(modelFileLoader, modelManager, ctoFile);
}
// Validate the models, either offline or with external model resolution
if (opts && opts.offline) {
modelManager.validateModelFiles();
return modelManager;
}
else {
await modelManager.updateExternalModels();
return modelManager;
}
}
/**
* Load system and models in a new model manager from model files objects
*
* @param {object[]} modelFiles - An array of Concerto files as strings or ModelFile objects.
* @param {string[]} [fileNames] - An optional array of file names to associate with the model files
* @param {object} options - optional parameters
* @param {boolean} [options.offline] - do not resolve external models
* @param {number} [options.utcOffset] - UTC Offset for this execution
* @return {Promise<ModelManager>} the model manager
*/
static async loadModelManagerFromModelFiles(modelFiles, fileNames, options = { offline: false }) {
const opts = options || { offline: false };
// FIX: Cast to 'any' to bypass strict constructor signature check
let modelManager = new ModelManager(opts);
// Load system model
modelManager.addModelFiles(modelFiles, fileNames, true);
// Validate the models, either offline or with external model resolution
if (opts && opts.offline) {
modelManager.validateModelFiles();
return modelManager;
}
else {
await modelManager.updateExternalModels();
return modelManager;
}
}
}
module.exports = ModelLoader;
//# sourceMappingURL=modelloader.js.map