@altostra/core
Version:
Core library for shared types and logic
1 lines • 6.24 kB
JavaScript
;var _SAMManager_wd,_SAMManager_sam,_SAMManager_args,_SAMManager_buildDir,_SAMManager_logger,_SAMManager_templateFilePath,__awaiter=this&&this.__awaiter||function(e,t,a,r){return new(a||(a=Promise))((function(i,s){function o(e){try{_(r.next(e))}catch(e){s(e)}}function n(e){try{_(r.throw(e))}catch(e){s(e)}}function _(e){var t;e.done?i(e.value):(t=e.value,t instanceof a?t:new a((function(e){e(t)}))).then(o,n)}_((r=r.apply(e,t||[])).next())}))},__classPrivateFieldSet=this&&this.__classPrivateFieldSet||function(e,t,a,r,i){if("m"===r)throw new TypeError("Private method is not writable");if("a"===r&&!i)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!i:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===r?i.call(e,a):i?i.value=a:t.set(e,a),a},__classPrivateFieldGet=this&&this.__classPrivateFieldGet||function(e,t,a,r){if("a"===a&&!r)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!r:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===a?r:"a"===a?r.call(e):r?r.value:t.get(e)},__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.SAMManager=void 0;const fs_1=require("fs"),path_1=require("path"),CfnTemplate_1=require("../../../aws/CloudFormation/CfnTemplate"),Errors_1=require("../../../common/Errors"),Logging_1=require("../../../common/Logging"),process_1=require("../../../common/Utils/process"),type_validations_1=require("@altostra/type-validations"),iterable_1=require("@reactivex/ix-es2015-cjs/iterable"),of_1=require("@reactivex/ix-es2015-cjs/iterable/of"),filter_1=require("@reactivex/ix-es2015-cjs/iterable/operators/filter"),map_1=require("@reactivex/ix-es2015-cjs/iterable/operators/map"),js_yaml_1=__importDefault(require("js-yaml"));class SAMManager{constructor({currentDirectory:e,samExecutable:t,buildArguments:a,logger:r,templatePath:i="template.yaml"}={}){_SAMManager_wd.set(this,void 0),_SAMManager_sam.set(this,void 0),_SAMManager_args.set(this,void 0),_SAMManager_buildDir.set(this,void 0),_SAMManager_logger.set(this,void 0),_SAMManager_templateFilePath.set(this,void 0),__classPrivateFieldSet(this,_SAMManager_wd,null!=e?e:process.cwd(),"f"),__classPrivateFieldSet(this,_SAMManager_sam,null!=t?t:"sam","f"),__classPrivateFieldSet(this,_SAMManager_args,["build",...null!=a?a:[]],"f"),__classPrivateFieldSet(this,_SAMManager_buildDir,getBuildDirFromArgs(__classPrivateFieldGet(this,_SAMManager_args,"f")),"f"),__classPrivateFieldSet(this,_SAMManager_templateFilePath,(0,path_1.join)(__classPrivateFieldGet(this,_SAMManager_buildDir,"f"),"template.yaml"),"f"),__classPrivateFieldGet(this,_SAMManager_args,"f").push("-t",i),__classPrivateFieldSet(this,_SAMManager_logger,null!=r?r:(0,Logging_1.nullLogger)("SAMManager",Logging_1.operationLoggingSeverities),"f")}packSAMProject(){return __awaiter(this,void 0,void 0,(function*(){return yield this._withLogging("Validating",()=>__awaiter(this,void 0,void 0,(function*(){return validateArgs(__classPrivateFieldGet(this,_SAMManager_args,"f"))}))),yield this._withLogging("Running SAM-CLI build",()=>this._buildSAM()),yield this._withLogging("Preparing project",()=>this._prepareForPackage()),{packageDir:__classPrivateFieldGet(this,_SAMManager_buildDir,"f"),template:__classPrivateFieldGet(this,_SAMManager_templateFilePath,"f")}}))}_buildSAM(){return __awaiter(this,void 0,void 0,(function*(){const e=[],t=[],{code:a}=yield(0,process_1.spawnAndWait)(__classPrivateFieldGet(this,_SAMManager_sam,"f"),__classPrivateFieldGet(this,_SAMManager_args,"f"),{cwd:__classPrivateFieldGet(this,_SAMManager_wd,"f"),stdio:["ignore","pipe","pipe"],handleChildProcess:a=>{a.stdout.on("data",t=>e.push(t.toString("utf8"))),a.stderr.on("data",e=>t.push(e.toString("utf8")))},throwOnNoZeroExit:!1}),r=t.join("").trim();r&&__classPrivateFieldGet(this,_SAMManager_logger,"f").verbose("STDERR:\n"+r);const i=e.join("");if(__classPrivateFieldGet(this,_SAMManager_logger,"f").verbose(i),a)throw Errors_1.AltoError.create("SAM-CLI terminated with non-zero exit code.",{data:{exitCode:a,errStr:r,outStr:i}})}))}_prepareForPackage(){return __awaiter(this,void 0,void 0,(function*(){const e=yield fs_1.promises.readFile(__classPrivateFieldGet(this,_SAMManager_templateFilePath,"f"),{encoding:"utf8"}),t=js_yaml_1.default.load(e),a=(0,type_validations_1.arrayRejectionReasons)();if(!(0,CfnTemplate_1.isCfnTemplate)(t,a))throw Errors_1.AltoError.create("The built CloudFormation template appears to be invalid",{data:{template:t,rejections:[...a]}});const r=(0,iterable_1.from)(Object.values(t.Resources)).pipe((0,filter_1.filter)(e=>"AWS::Serverless::Function"===e.Type));for(const{Properties:e}of r)"Image"===e.PackageType||"InlineCode"in e||(e.Handler=`${e.CodeUri}/${e.Handler}`,e.CodeUri="./");yield fs_1.promises.writeFile(__classPrivateFieldGet(this,_SAMManager_templateFilePath,"f"),JSON.stringify(t),{encoding:"utf8"})}))}_withLogging(e,t,a){return(0,Logging_1.withOperationLogging)(__classPrivateFieldGet(this,_SAMManager_logger,"f"),e,t,void 0,a)}}function validateArgs(e){const t=new Set(e);if(["-u","--use-container"].some(e=>t.has(e)))throw Errors_1.AltoError.create("Containers are not supported by Altostra.\nPlease contact support and express your desire to support them.")}function getBuildDirFromArgs(e){const t=[...(0,of_1.of)("-b","--build-dir").pipe((0,map_1.map)(t=>e.indexOf(t)),(0,filter_1.filter)(e=>-1!==e),(0,map_1.map)(e=>e+1))];switch(t.length){case 0:return".aws-sam/build";case 1:{const a=t[0];if(e.length>a)return e[a];throw Errors_1.AltoError.create(`Invalid SAM arguments.\nNo directory is specified after the '${e[a-1]}' argument`,{data:{args:e}})}default:throw Errors_1.AltoError.create("Invalid SAM arguments.\nBuilding directory option is specified more than once.",{data:{args:e}})}}exports.SAMManager=SAMManager,_SAMManager_wd=new WeakMap,_SAMManager_sam=new WeakMap,_SAMManager_args=new WeakMap,_SAMManager_buildDir=new WeakMap,_SAMManager_logger=new WeakMap,_SAMManager_templateFilePath=new WeakMap;