UNPKG

markscript-core

Version:

A library for building JavaScript or TypeScript projects with MarkLogic.

131 lines 5.71 kB
var s = require('typescript-schema'); var p = require('typescript-package'); var path = require('path'); var fs = require('fs'); (function (BuildModelPersistance) { BuildModelPersistance[BuildModelPersistance["NONE"] = 0] = "NONE"; BuildModelPersistance[BuildModelPersistance["NO_SOURCE"] = 1] = "NO_SOURCE"; BuildModelPersistance[BuildModelPersistance["ALL"] = 2] = "ALL"; })(exports.BuildModelPersistance || (exports.BuildModelPersistance = {})); var BuildModelPersistance = exports.BuildModelPersistance; var Build = (function () { function Build(options) { this.tasks = {}; var self = this; this.options = options; options.plugins.forEach(function (plugin) { if (plugin.tasks) { Object.keys(plugin.tasks).forEach(function (key) { self.tasks[key] = plugin.tasks[key]; }); } }); if (options.tasks) { Object.keys(options.tasks).forEach(function (key) { self.tasks[key] = options.tasks[key]; }); } } Build.prototype.runTasks = function (names) { var persistsModel = this.options.buildModelPersistance === 1 || this.options.buildModelPersistance === 2; var persistedModelFileName; var buildDir = path.join(this.options.pkgDir, this.options.buildModelPersistanceFolder || '.build'); if (!fs.existsSync(buildDir)) { fs.mkdirSync(buildDir); } if (persistsModel) { persistedModelFileName = path.join(buildDir, 'build-model.json'); } var self = this; var buildModel; var server; if (!Array.isArray(names)) { names = [names]; } var i = -1; function executeTask() { i++; if (i === names.length) { return Promise.resolve(true); } var name = names[i]; var task = self.tasks[name]; if (!task) { throw new Error("Task \"" + name + "\" not in list of tasks: " + Object.keys(self.tasks)); } var rebuildServer = false; if (!buildModel && !task.requiresFreshModel && persistedModelFileName && fs.existsSync(persistedModelFileName)) { buildModel = deserialiseBuildModel(fs.readFileSync(persistedModelFileName).toString(), self.options.plugins); rebuildServer = true; } else if (!buildModel || task.requiresFreshModel) { var buildTypeModel = self.options.buildTypeModel; if (!buildTypeModel && self.options.isTypeScript) { var rawPackage_1 = p.packageAstToFactory(self.options.pkgDir); buildTypeModel = rawPackage_1.construct(s.factoryToReflective())().modules; } var runtimeTypeModel = self.options.buildTypeModel; if (!runtimeTypeModel && self.options.isTypeScript) { var rawPackage = p.packageAstToFactory(self.options.buildConfig.assetBaseDir ? path.join(self.options.pkgDir, self.options.buildConfig.assetBaseDir) : self.options.pkgDir); runtimeTypeModel = rawPackage.construct(s.factoryToReflective())().modules; } buildModel = generateBuildModel(self.options.buildConfig, self.options.plugins, self.options.pkgDir, buildTypeModel, runtimeTypeModel, buildDir); if (persistsModel) { fs.writeFileSync(persistedModelFileName, serialiseBuildModel(buildModel, self.options.plugins, self.options.buildModelPersistance)); } rebuildServer = true; } if (rebuildServer) { server = new self.options.runtime(buildModel, self.options.buildConfig, self.options.pkgDir); } var serverPromise = (server && server.start) ? server.start() : Promise.resolve(true); return serverPromise.then(function () { return task.execute(buildModel, self.options.buildConfig, server); }).then(executeTask); } return executeTask(); }; return Build; })(); exports.Build = Build; function serialiseBuildModel(buildModel, plugins, buildModelPersistance) { var serialisable = {}; plugins.forEach(function (plugin) { if (plugin.jsonify) { var s_1 = plugin.jsonify(buildModel); Object.keys(s_1).forEach(function (key) { serialisable[key] = s_1[key]; }); } }); return JSON.stringify(serialisable, null, ' '); } function deserialiseBuildModel(buildModelString, plugins) { var serialisable = JSON.parse(buildModelString); var buildModel = {}; plugins.forEach(function (plugin) { if (plugin.dejsonify) { var s_2 = plugin.dejsonify(serialisable); Object.keys(s_2).forEach(function (key) { buildModel[key] = s_2[key]; }); } }); return buildModel; } function generateBuildModel(buildConfig, plugins, pkgDir, typeModel, assetTypeModel, buildDir) { var buildModel = { databases: {}, servers: {}, ruleSets: [], modules: {}, extensions: {}, tasks: {}, alerts: {} }; plugins.forEach(function (plugin) { buildModel = plugin.generate(buildModel, buildConfig, pkgDir, typeModel, assetTypeModel, buildDir); }); return buildModel; } //# sourceMappingURL=build.js.map