@altostra/core
Version:
Core library for shared types and logic
1 lines • 15.8 kB
JavaScript
"use strict";var _BitbucketGitHost_instances,_BitbucketGitHost_axios,_BitbucketGitHost_auth,_BitbucketGitHost_authToken,_BitbucketGitHost_logger,_BitbucketGitHost_workspace_get,_BitbucketGitHost_validateToken,_BitbucketGitHost_setAuthHeaders,__awaiter=this&&this.__awaiter||function(t,e,i,s){return new(i||(i=Promise))((function(r,a){function o(t){try{_(s.next(t))}catch(t){a(t)}}function n(t){try{_(s.throw(t))}catch(t){a(t)}}function _(t){var e;t.done?r(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,n)}_((s=s.apply(t,e||[])).next())}))},__classPrivateFieldSet=this&&this.__classPrivateFieldSet||function(t,e,i,s,r){if("m"===s)throw new TypeError("Private method is not writable");if("a"===s&&!r)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof e?t!==e||!r:!e.has(t))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===s?r.call(t,i):r?r.value=i:e.set(t,i),i},__classPrivateFieldGet=this&&this.__classPrivateFieldGet||function(t,e,i,s){if("a"===i&&!s)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof e?t!==e||!s:!e.has(t))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===i?s:"a"===i?s.call(t):s?s.value:e.get(t)},__rest=this&&this.__rest||function(t,e){var i={};for(var s in t)Object.prototype.hasOwnProperty.call(t,s)&&e.indexOf(s)<0&&(i[s]=t[s]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var r=0;for(s=Object.getOwnPropertySymbols(t);r<s.length;r++)e.indexOf(s[r])<0&&Object.prototype.propertyIsEnumerable.call(t,s[r])&&(i[s[r]]=t[s[r]])}return i},__asyncValues=this&&this.__asyncValues||function(t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e,i=t[Symbol.asyncIterator];return i?i.call(t):(t="function"==typeof __values?__values(t):t[Symbol.iterator](),e={},s("next"),s("throw"),s("return"),e[Symbol.asyncIterator]=function(){return this},e);function s(i){e[i]=t[i]&&function(e){return new Promise((function(s,r){(function(t,e,i,s){Promise.resolve(s).then((function(e){t({value:e,done:i})}),e)})(s,r,(e=t[i](e)).done,e.value)}))}}},__importDefault=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.BitbucketGitHost=void 0;const path_1=require("path"),NonEmptyString_1=require("../../common/CustomTypes/NonEmptyString"),Errors_1=require("../../common/Errors"),AltoError_1=require("../../common/Errors/AltoError"),Logging_1=require("../../common/Logging"),Axios_1=require("../../common/Utils/Axios"),Pagination_1=require("../../common/Utils/Pagination"),Url_1=require("../../common/Utils/Url"),type_validations_1=require("@altostra/type-validations"),from_1=require("@reactivex/ix-es2015-cjs/iterable/from"),filter_1=require("@reactivex/ix-es2015-cjs/iterable/operators/filter"),map_1=require("@reactivex/ix-es2015-cjs/iterable/operators/map"),axios_1=__importDefault(require("axios")),axios_retry_1=__importDefault(require("axios-retry")),form_data_1=__importDefault(require("form-data")),Common_1=require("../Common"),BitbucketGitUtils_1=require("../git-utils/Bitbucket/BitbucketGitUtils"),Types_1=require("./Types"),{join:join,relative:relative,extname:extname}=path_1.posix,BITBUCKET_URL="https://api.bitbucket.org",BASE_URL=BITBUCKET_URL+"/2.0/repositories",createRepositoryResponseValidation=(0,type_validations_1.assertBy)((0,type_validations_1.objectOf)({links:(0,type_validations_1.objectOf)({html:(0,type_validations_1.objectOf)({href:NonEmptyString_1.isNonEmptyString})})}),(0,Types_1.createAPIErrorFactory)("Repository creation"));class BitbucketGitHost extends BitbucketGitUtils_1.BitbucketGitUtils{constructor(t){var{axios:e}=t,i=t.authentication,{accessToken:s}=i,r=__rest(i,["accessToken"]),{logger:a=(0,Logging_1.nullLogger)()}=t;super({userAccount:r.userAccount}),_BitbucketGitHost_instances.add(this),_BitbucketGitHost_axios.set(this,void 0),_BitbucketGitHost_auth.set(this,void 0),_BitbucketGitHost_authToken.set(this,void 0),_BitbucketGitHost_logger.set(this,void 0),__classPrivateFieldSet(this,_BitbucketGitHost_logger,a.appendSource("BitbucketGitHost"),"f"),__classPrivateFieldSet(this,_BitbucketGitHost_axios,null!=e?e:axios_1.default.create(),"f"),__classPrivateFieldSet(this,_BitbucketGitHost_auth,Object.assign(Object.assign({},r),s&&{accessToken:"string"==typeof s?()=>__awaiter(this,void 0,void 0,(function*(){return s})):s}),"f"),__classPrivateFieldGet(this,_BitbucketGitHost_axios,"f").interceptors.response.use(void 0,(0,Common_1.createErrorHandler)({provider:"BitBucket",hostErrorMapping:bitbucketHostError})),e||(0,axios_retry_1.default)(__classPrivateFieldGet(this,_BitbucketGitHost_axios,"f"),{retries:0,retryDelay:axios_retry_1.default.exponentialDelay})}getHeadSha(t,e){return __awaiter(this,void 0,void 0,(function*(){try{null!=e||(e=yield this.getDefaultBranch(t));const i=BASE_URL+Url_1.asUrl`/${__classPrivateFieldGet(this,_BitbucketGitHost_instances,"a",_BitbucketGitHost_workspace_get)}/${t}/refs/branches/${e}`,{data:s}=yield __classPrivateFieldGet(this,_BitbucketGitHost_axios,"f").get(i,{headers:yield __classPrivateFieldGet(this,_BitbucketGitHost_instances,"m",_BitbucketGitHost_setAuthHeaders).call(this)});return(0,Types_1.getBranchResponseValidation)(s),s.target.hash}catch(i){throw AltoError_1.AltoError.wrapError(i,{message:"Failed to get HEAD SHA",data:{workspace:__classPrivateFieldGet(this,_BitbucketGitHost_instances,"a",_BitbucketGitHost_workspace_get),branch:e,repository:t}})}}))}createRepository({name:t,privateRepo:e}){return __awaiter(this,void 0,void 0,(function*(){const i=BASE_URL+Url_1.asUrl`/${__classPrivateFieldGet(this,_BitbucketGitHost_instances,"a",_BitbucketGitHost_workspace_get)}/${t}`;try{const t=(yield __classPrivateFieldGet(this,_BitbucketGitHost_axios,"f").post(i,{scm:"git",is_private:e},{headers:yield __classPrivateFieldGet(this,_BitbucketGitHost_instances,"m",_BitbucketGitHost_setAuthHeaders).call(this)})).data;return createRepositoryResponseValidation(t),{repoUrl:t.links.html.href}}catch(i){throw AltoError_1.AltoError.wrapError(i,{message:"Failed to create BitBucket repository",data:{workspace:__classPrivateFieldGet(this,_BitbucketGitHost_instances,"a",_BitbucketGitHost_workspace_get),name:t,privateRepo:e}})}}))}commitFiles({commitMessage:t,targetRepositoryName:e,filesToCommit:i,targetBranch:s}){return __awaiter(this,void 0,void 0,(function*(){const r=BASE_URL+Url_1.asUrl`/${__classPrivateFieldGet(this,_BitbucketGitHost_instances,"a",_BitbucketGitHost_workspace_get)}/${e}/src`,a=new form_data_1.default,o=(0,from_1.from)(Object.entries(i)).pipe((0,filter_1.filter)(([,t])=>!!t));for(const[t,e]of o)a.append(t,e);a.append("message",t),void 0!==s&&a.append("branch",s);let n=!1;return yield AltoError_1.AltoError.wrapPromise(__classPrivateFieldGet(this,_BitbucketGitHost_axios,"f").post(r,a,{maxContentLength:1/0,maxBodyLength:1/0,headers:yield __classPrivateFieldGet(this,_BitbucketGitHost_instances,"m",_BitbucketGitHost_setAuthHeaders).call(this,Object.assign({},a.getHeaders())),"axios-retry":{retryCondition:t=>{var e;const i=404===(null===(e=t.response)||void 0===e?void 0:e.status);return i&&(n=!0),i},retries:3}}),{message:`Committing files to ${e} failed`,data:()=>({targetRepositoryName:e,targetBranch:s,filesToCommit:i})}),n&&__classPrivateFieldGet(this,_BitbucketGitHost_logger,"f").error("BitBucket is eventually consistent"),yield this.getHeadSha(e,s)}))}listRepositories(t){return __awaiter(this,void 0,void 0,(function*(){const e=t?Url_1.asUrl`?role=member&q=${`name~"${function(t){return t.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}(t)}"`}`:"",i=`${BASE_URL}/${__classPrivateFieldGet(this,_BitbucketGitHost_instances,"a",_BitbucketGitHost_workspace_get)}${e}`;return yield AltoError_1.AltoError.wrapPromise((0,Pagination_1.getAllPages)({getPage:t=>__awaiter(this,void 0,void 0,(function*(){return yield __classPrivateFieldGet(this,_BitbucketGitHost_axios,"f").get(null!=t?t:i,{headers:yield __classPrivateFieldGet(this,_BitbucketGitHost_instances,"m",_BitbucketGitHost_setAuthHeaders).call(this)})})),getCursor:t=>t.data.next,appendPage:(t,e)=>{const i=e.data.values.map(t=>t.full_name).map(t=>t.substr(t.indexOf("/")+1));return t?t.concat(i):i}}),{message:"Failed to retrieve repositories"})}))}downloadFile(t,e){var i,s,r;return __awaiter(this,void 0,void 0,(function*(){const a=join("src",yield this.getDefaultBranch(t),e),o=BASE_URL+Url_1.asUrl`/${__classPrivateFieldGet(this,_BitbucketGitHost_instances,"a",_BitbucketGitHost_workspace_get)}/${t}/`+a,n=yield AltoError_1.AltoError.wrapPromise(__classPrivateFieldGet(this,_BitbucketGitHost_axios,"f").get(o,{headers:yield __classPrivateFieldGet(this,_BitbucketGitHost_instances,"m",_BitbucketGitHost_setAuthHeaders).call(this),responseType:"stream"}),{message:`Could not download file ${e} from ${t}`});if(null===(r=n.headers["Content-Type"])||void 0===r?void 0:r.startsWith("application/json"))throw new AltoError_1.AltoError("Cannot download a directory. Please specify a path to file and try again.");const _=[];try{for(var c,l=__asyncValues(n.data);!(c=yield l.next()).done;){const t=c.value;_.push(t)}}catch(t){i={error:t}}finally{try{c&&!c.done&&(s=l.return)&&(yield s.call(l))}finally{if(i)throw i.error}}return Buffer.concat(_)}))}downloadRepo(t){return __awaiter(this,void 0,void 0,(function*(){const e=yield this.getDefaultBranch(t),i=BITBUCKET_URL+Url_1.asUrl`/${__classPrivateFieldGet(this,_BitbucketGitHost_instances,"a",_BitbucketGitHost_workspace_get)}/${t}/get/${e}.zip`;return(yield AltoError_1.AltoError.wrapPromise(__classPrivateFieldGet(this,_BitbucketGitHost_axios,"f").get(i,{headers:yield __classPrivateFieldGet(this,_BitbucketGitHost_instances,"m",_BitbucketGitHost_setAuthHeaders).call(this),responseType:"stream"}),{message:"Failed downloading repository"})).data}))}createBranch(t,e){var i,s,r;return __awaiter(this,void 0,void 0,(function*(){const a=BASE_URL+Url_1.asUrl`/${__classPrivateFieldGet(this,_BitbucketGitHost_instances,"a",_BitbucketGitHost_workspace_get)}/${t}/refs/branches`,o={name:e,target:{hash:"HEAD"}};try{yield __classPrivateFieldGet(this,_BitbucketGitHost_axios,"f").post(a,o,{headers:yield __classPrivateFieldGet(this,_BitbucketGitHost_instances,"m",_BitbucketGitHost_setAuthHeaders).call(this)})}catch(t){if((0,Axios_1.isAxiosError)(t)&&"BRANCH_ALREADY_EXISTS"===(null===(r=null===(s=null===(i=t.response)||void 0===i?void 0:i.data)||void 0===s?void 0:s.data)||void 0===r?void 0:r.key))return;throw AltoError_1.AltoError.wrapError(t,{message:"Branch creation failed"})}}))}createPullRequest({repository:t,sourceBranch:e,targetBranch:i,title:s,content:r}){var a;return __awaiter(this,void 0,void 0,(function*(){const o=BASE_URL+Url_1.asUrl`/${__classPrivateFieldGet(this,_BitbucketGitHost_instances,"a",_BitbucketGitHost_workspace_get)}/${t}/pullrequests`,n=Object.assign(Object.assign({title:s,source:{branch:{name:e}}},i&&{destination:{branch:{name:i}}}),r&&{description:r}),{data:_}=yield AltoError_1.AltoError.wrapPromise(__classPrivateFieldGet(this,_BitbucketGitHost_axios,"f").post(o,n,{headers:yield __classPrivateFieldGet(this,_BitbucketGitHost_instances,"m",_BitbucketGitHost_setAuthHeaders).call(this)}),{message:"Branch creation failed"});(0,Types_1.validateCreatePullRequestResponse)(_);const c=null===(a=_.links.html)||void 0===a?void 0:a.href;if(!c)throw AltoError_1.AltoError.create("Could not get created PR url");return c}))}getDefaultBranch(t){return __awaiter(this,void 0,void 0,(function*(){const e=BASE_URL+Url_1.asUrl`/${__classPrivateFieldGet(this,_BitbucketGitHost_instances,"a",_BitbucketGitHost_workspace_get)}/${t}`,{data:i}=yield AltoError_1.AltoError.wrapPromise(__classPrivateFieldGet(this,_BitbucketGitHost_axios,"f").get(e,{headers:yield __classPrivateFieldGet(this,_BitbucketGitHost_instances,"m",_BitbucketGitHost_setAuthHeaders).call(this)}),{message:"Failed to get repository metadata"});return(0,Types_1.validateBitbucketRepository)(i),(0,NonEmptyString_1.nonEmptyString)(i.mainbranch.name)}))}listFiles(t,{path:e,extFilter:i}={}){return __awaiter(this,void 0,void 0,(function*(){const s=join("src",yield this.getDefaultBranch(t),e||"/"),r=BASE_URL+Url_1.asUrl`/${__classPrivateFieldGet(this,_BitbucketGitHost_instances,"a",_BitbucketGitHost_workspace_get)}/${t}/`+s;let a;try{const{data:t}=yield __classPrivateFieldGet(this,_BitbucketGitHost_axios,"f").get(r+"?format=meta",{headers:yield __classPrivateFieldGet(this,_BitbucketGitHost_instances,"m",_BitbucketGitHost_setAuthHeaders).call(this)});(0,Types_1.validateObjectMetadata)(t),a=t}catch(i){if((0,Axios_1.isAxiosError)(i)&&404===Number(i.code))throw Errors_1.UserFacingError.wrapError(i,{message:"Path does not exist in the repository.",category:"user-fault",type:"path-not-exist",data:{repository:t,path:e}});throw i}if("commit_directory"!==a.type)throw Errors_1.UserFacingError.create("Invalid path.\nThe path leads to a file rather than a directory.",{category:"user-fault",type:"path-is-file",data:{repository:t,path:e}});const o=yield(0,Pagination_1.getAllPages)({getPage:t=>__awaiter(this,void 0,void 0,(function*(){const{data:e}=yield __classPrivateFieldGet(this,_BitbucketGitHost_axios,"f").get(null!=t?t:r,{headers:yield __classPrivateFieldGet(this,_BitbucketGitHost_instances,"m",_BitbucketGitHost_setAuthHeaders).call(this)});return(0,Types_1.validateDirectoryListing)(e),e})),getCursor:t=>t.next,appendPage:(t,e)=>(null!=t||(t=[]),t.push(...e.values),t)});let n=(0,from_1.from)(o).pipe((0,filter_1.filter)(t=>"commit_file"===t.type),(0,map_1.map)(t=>t.path));if(e&&(n=n.pipe((0,map_1.map)(t=>relative(e,t)))),(i=(0,Common_1.normalizeExtFilter)(i)).length>0){const t=new Set(i);n=n.pipe((0,filter_1.filter)(e=>t.has(extname(e).toLowerCase())))}return[...n]}))}getGitUtilsInitialization(){return{type:"bitbucket",userAccount:__classPrivateFieldGet(this,_BitbucketGitHost_auth,"f").userAccount}}validateAuthentication(){return __awaiter(this,void 0,void 0,(function*(){yield __classPrivateFieldGet(this,_BitbucketGitHost_instances,"m",_BitbucketGitHost_validateToken).call(this)}))}}function bitbucketHostError(t){var e,i;return Errors_1.UserFacingError.wrapError(t,{category:"server-fault",type:"bitbucket-server-error",message:"It appears that BitBucket is unavailable.\nThis might be a temporary error, please try again or contact support.",data:{status:null===(e=t.response)||void 0===e?void 0:e.status,message:null===(i=t.response)||void 0===i?void 0:i.statusText}})}exports.BitbucketGitHost=BitbucketGitHost,_BitbucketGitHost_axios=new WeakMap,_BitbucketGitHost_auth=new WeakMap,_BitbucketGitHost_authToken=new WeakMap,_BitbucketGitHost_logger=new WeakMap,_BitbucketGitHost_instances=new WeakSet,_BitbucketGitHost_workspace_get=function(){var t;return null!==(t=__classPrivateFieldGet(this,_BitbucketGitHost_auth,"f").workspaceUUID)&&void 0!==t?t:__classPrivateFieldGet(this,_BitbucketGitHost_auth,"f").userAccount},_BitbucketGitHost_validateToken=function(){return __awaiter(this,void 0,void 0,(function*(){return void 0!==__classPrivateFieldGet(this,_BitbucketGitHost_auth,"f").accessToken&&void 0===__classPrivateFieldGet(this,_BitbucketGitHost_authToken,"f")&&__classPrivateFieldSet(this,_BitbucketGitHost_authToken,yield __classPrivateFieldGet(this,_BitbucketGitHost_auth,"f").accessToken(),"f"),__classPrivateFieldGet(this,_BitbucketGitHost_authToken,"f")}))},_BitbucketGitHost_setAuthHeaders=function(t){return __awaiter(this,void 0,void 0,(function*(){const e=yield __classPrivateFieldGet(this,_BitbucketGitHost_instances,"m",_BitbucketGitHost_validateToken).call(this);return Object.assign(Object.assign({"content-type":"application/json"},t),e&&{Authorization:"Bearer "+e})}))};