@altostra/core
Version:
Core library for shared types and logic
1 lines • 3.48 kB
JavaScript
;var __awaiter=this&&this.__awaiter||function(t,r,e,i){return new(e||(e=Promise))((function(o,n){function l(t){try{s(i.next(t))}catch(t){n(t)}}function a(t){try{s(i.throw(t))}catch(t){n(t)}}function s(t){var r;t.done?o(t.value):(r=t.value,r instanceof e?r:new e((function(t){t(r)}))).then(l,a)}s((i=i.apply(t,r||[])).next())}))},__importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.FileProjectManager=void 0;const fs_1=require("fs"),path_1=__importDefault(require("path")),blueprint_1=require("../../blueprint"),AltoError_1=require("../../common/Errors/AltoError"),Array_1=require("../../common/Utils/Array"),FS_1=require("../../common/Utils/FS"),type_validations_1=require("@altostra/type-validations"),Types_1=require("../Types"),ProjectInitializers_1=require("./ProjectInitializers");class FileProjectManager{constructor(t){this.rootFolder=t}get projectFile(){if(!this.rootFolder)throw new AltoError_1.AltoError("File Project Manager is not in an operational state.");return path_1.default.join(this.rootFolder,".altostra/project.json")}getProject(){return __awaiter(this,void 0,void 0,(function*(){try{const t=yield(0,FS_1.loadJsonFile)(this.projectFile),r=(0,type_validations_1.arrayRejectionReasons)();if("string"!=typeof t.name||"string"!=typeof t.description||!(0,Array_1.isArray)(t.blueprints))throw AltoError_1.AltoError.create("Invalid project file format.",{data:{filePath:this.projectFile}});if(!(0,Types_1.isProject)(t,r))throw AltoError_1.AltoError.create("Project file is corrupted.",{data:{rejections:[...r],filePath:this.projectFile}});return t}catch(t){throw AltoError_1.AltoError.wrapError(t,{message:"Unable to load project file from disk.",data:{filePath:this.projectFile}})}}))}get canOperate(){return"string"==typeof this.rootFolder}get projectAvailable(){return(0,FS_1.exists)(this.projectFile)}initProject(t=ProjectInitializers_1.emptyProjectInitializer){return __awaiter(this,void 0,void 0,(function*(){try{if(yield this.projectAvailable)return yield this.getProject();{const r=yield t();return yield(0,FS_1.saveJsonFile)(this.projectFile,r),r}}catch(t){throw new AltoError_1.AltoError("Failed to initialize project file.",t)}}))}removeProject(){return __awaiter(this,void 0,void 0,(function*(){(yield this.projectAvailable)&&(yield fs_1.promises.unlink(this.projectFile))}))}storeBlueprint(t,r=defaultStoreBlueprintOptions){return __awaiter(this,void 0,void 0,(function*(){let e;try{e=yield this.getProject()}catch(t){}if(r.initProjectIfMissing&&!e)try{e=yield this.initProject()}catch(t){throw new AltoError_1.AltoError("Failed to initialize a new project.",t)}else if(!e)throw new AltoError_1.AltoError("Unable to store the Blueprint because the project is not initialized.");try{return e.blueprints[0]=t,yield(0,FS_1.saveJsonFile)(this.projectFile,e)}catch(t){throw new AltoError_1.AltoError("Unable to write project file to disk.",t)}}))}getBlueprint(){return __awaiter(this,void 0,void 0,(function*(){try{const t=yield this.getProject();return t&&(0,Array_1.isNonEmptyArray)(t.blueprints)?(0,blueprint_1.mkBlueprint)(t.blueprints[0]):void 0}catch(t){if(t instanceof TypeError)throw new AltoError_1.AltoError("Invalid Blueprint format.",t);throw new AltoError_1.AltoError("Unable to load Blueprint from project file.",t)}}))}}exports.FileProjectManager=FileProjectManager;const defaultStoreBlueprintOptions={initProjectIfMissing:!0};