UNPKG

@altostra/core

Version:

Core library for shared types and logic

1 lines 5.16 kB
"use strict";var __awaiter=this&&this.__awaiter||function(e,t,r,i){return new(r||(r=Promise))((function(o,n){function a(e){try{s(i.next(e))}catch(e){n(e)}}function l(e){try{s(i.throw(e))}catch(e){n(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,l)}s((i=i.apply(e,t||[])).next())}))},__asyncValues=this&&this.__asyncValues||function(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,r=e[Symbol.asyncIterator];return r?r.call(e):(e="function"==typeof __values?__values(e):e[Symbol.iterator](),t={},i("next"),i("throw"),i("return"),t[Symbol.asyncIterator]=function(){return this},t);function i(r){t[r]=e[r]&&function(t){return new Promise((function(i,o){(function(e,t,r,i){Promise.resolve(i).then((function(t){e({value:t,done:r})}),t)})(i,o,(t=e[r](t)).done,t.value)}))}}},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.createProject=void 0;const fs_1=require("fs"),path_1=require("path"),util_1=require("util"),Blueprint_1=require("../../blueprint/Blueprint/Blueprint"),ISODate_1=require("../../common/CustomTypes/ISODate"),AltoError_1=require("../../common/Errors/AltoError"),FS_1=require("../../common/Utils/FS"),String_1=require("../../common/Utils/String"),concat_1=require("@reactivex/ix-es2015-cjs/iterable/concat"),empty_1=require("@reactivex/ix-es2015-cjs/iterable/empty"),distinct_1=require("@reactivex/ix-es2015-cjs/iterable/operators/distinct"),glob_1=__importDefault(require("glob")),jszip_1=require("jszip"),rimraf_1=__importDefault(require("rimraf")),Utils_1=require("../ProjectManager/Utils"),{mkdir:mkdir,rename:mv}=fs_1.promises,glob=(0,util_1.promisify)(glob_1.default),rimraf=(0,util_1.promisify)(rimraf_1.default);function createProject({path:e,name:t,id:r,template:i,force:o,description:n,created:a}){return __awaiter(this,void 0,void 0,(function*(){const[l,s]=yield Promise.all([i.getTemplateMetadata(),i.getZippedFiles()]);if(!l)throw AltoError_1.AltoError.create({message:"Failed fetching metadata for project template "+i.name,data:i});const c={id:r,name:t,type:"altostra",description:null!=n?n:l.description,created:null!=a?a:(0,ISODate_1.isoDate)(),blueprints:l.blueprints.map(e=>(0,Blueprint_1.mkBlueprint)(r,t,e))},u=(0,Utils_1.altostraDir)(e),d=(0,Utils_1.altostraProject)(e);if(yield mkdir(u,{recursive:!0}),!o&&(yield(0,FS_1.exists)(d)))throw AltoError_1.AltoError.create({message:"The directory is already initialized.\nIf you wish to reinitialize, either run 'init' with '--force', or clear the directory and try again.",data:{path:e,name:t,template:i}});return yield(0,FS_1.saveJsonFile)(d,c,{indent:2}),yield deployFiles({targetDir:e,included:l.includes,excluded:l.excludes,sourceZip:s,force:!!o}),c}))}exports.createProject=createProject;const alwaysExcluded=new Set(["template.json",".git",".gitignore"]),altostraFolder=".altostra";function deployFiles({targetDir:e,included:t,excluded:r,sourceZip:i,force:o}){return __awaiter(this,void 0,void 0,(function*(){if(!i)return;const n=yield extractZip(i,e=>{const t=e.toLowerCase();return!alwaysExcluded.has((0,path_1.basename)(t))&&".altostra"!==(0,path_1.basename)((0,path_1.dirname)(t))});0===(t=null!=t?t:[]).length&&t.push("**");const a=yield globAll(n,t,r);for(const t of a){const r=(0,path_1.relative)(n,t),i=(0,path_1.resolve)(e,r);o&&(yield(0,FS_1.deleteIfExists)(i)),yield mkdir((0,path_1.dirname)(i),{recursive:!0}),yield mv(t,i)}yield rimraf(n,{glob:!1})}))}function globAll(e,t,r){return __awaiter(this,void 0,void 0,(function*(){const i={},o={};let n=(0,empty_1.empty)();for(let a=t.pop();"string"==typeof a;a=t.pop())a=(0,String_1.trim)(a,{skipEnd:!0,trimPredicate:e=>"/"===e}),n=(0,concat_1.concat)(n,yield glob(a,{cache:i,statCache:o,cwd:e,dot:!0,ignore:r,nodir:!0,nonull:!1,absolute:!0,nomount:!0,nounique:!1}));return n.pipe((0,distinct_1.distinct)())}))}function extractZip(e,t){return __awaiter(this,void 0,void 0,(function*(){const r=yield(0,FS_1.createTempDir)("alto-template"),i=getZippedFiles(yield loadZipFromStream(e));for(const[e,o]of Object.entries(i))if(!t||t(e)){const t=(0,path_1.dirname)(e);if(t){const e=(0,path_1.join)(r,t);yield mkdir(e,{recursive:!0})}const i=(0,path_1.join)(r,e);yield writeFile(i,o.nodeStream())}return r}))}function loadZipFromStream(e){var t,r,i,o;return __awaiter(this,void 0,void 0,(function*(){const n=[];try{for(t=__asyncValues(e);!(r=yield t.next()).done;){const e=r.value;n.push(e)}}catch(e){i={error:e}}finally{try{r&&!r.done&&(o=t.return)&&(yield o.call(t))}finally{if(i)throw i.error}}return yield(0,jszip_1.loadAsync)(Buffer.concat(n))}))}function getZippedFiles(e){const t={};return(e=findTemplateRoot(e)).forEach((e,r)=>{r.dir||(t[e]=r)}),t}function findTemplateRoot(e){const t=Object.values(e.files).find(e=>e.dir&&".altostra"===(0,path_1.basename)(e.name));return t&&".altostra"!==t.name?e.folder((0,path_1.dirname)(t.name)):e}function writeFile(e,t){return new Promise((r,i)=>{const o=(0,fs_1.createWriteStream)(e,{autoClose:!0}).on("close",r).on("error",i);t.on("error",i).pipe(o,{end:!0})})}