UNPKG

@flxbl-io/sfp

Version:

sfp is a CLI tool to help you manage your Salesforce projects in an artifact centric model

157 lines 16.5 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); const sfp_logger_1 = __importStar(require("@flxbl-io/sfp-logger")); const retry = require('async-retry'); const ORDER_BY_FILTER = ' ORDER BY CreatedDate DESC'; class ScratchOrgInfoFetcher { constructor(hubOrg) { this.hubOrg = hubOrg; this.arrayToObject = (array, keyfield) => array.reduce((obj, item) => { obj[item[keyfield]] = item; return obj; }, {}); } async getScratchOrgRecordId(scratchOrgs) { if (scratchOrgs == undefined || scratchOrgs.length == 0) return; let hubConn = this.hubOrg.getConnection(); let scratchOrgIds = scratchOrgs .map(function (scratchOrg) { scratchOrg.orgId = scratchOrg.orgId.slice(0, 15); return `'${scratchOrg.orgId}'`; }) .join(','); let query = `SELECT Id, ScratchOrg FROM ScratchOrgInfo WHERE ScratchOrg IN ( ${scratchOrgIds} )`; sfp_logger_1.default.log('QUERY:' + query, sfp_logger_1.LoggerLevel.TRACE); return retry(async (bail) => { const results = (await hubConn.query(query)); let resultAsObject = this.arrayToObject(results.records, 'ScratchOrg'); sfp_logger_1.default.log(JSON.stringify(resultAsObject), sfp_logger_1.LoggerLevel.TRACE); scratchOrgs.forEach((scratchOrg) => { scratchOrg.recordId = resultAsObject[scratchOrg.orgId]['Id']; }); return scratchOrgs; }, { retries: 3, minTimeout: 3000 }); } async getScratchOrgsByTag(tag, isMyPool, unAssigned) { let hubConn = this.hubOrg.getConnection(); return retry(async (bail) => { let query; if (tag) query = `SELECT Pooltag__c, Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl, SfdxAuthUrl__c FROM ScratchOrgInfo WHERE Pooltag__c = '${tag}' AND Status = 'Active' `; else query = `SELECT Pooltag__c, Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl, SfdxAuthUrl__c FROM ScratchOrgInfo WHERE Pooltag__c != null AND Status = 'Active' `; if (isMyPool) { query = query + ` AND createdby.username = '${this.hubOrg.getUsername()}' `; } if (unAssigned) { // if new version compatible get Available / In progress query = query + `AND ( Allocation_status__c ='Available' OR Allocation_status__c = 'In Progress' ) `; } query = query + ORDER_BY_FILTER; sfp_logger_1.default.log('QUERY:' + query, sfp_logger_1.LoggerLevel.TRACE); const results = (await hubConn.query(query)); return results; }, { retries: 3, minTimeout: 3000 }); } async getOrphanedScratchOrgs() { let hubConn = this.hubOrg.getConnection(); return retry(async (bail) => { let query; query = `SELECT Id, Pooltag__c, SignupUsername, Description, ScratchOrg FROM ScratchOrgInfo WHERE Pooltag__c = null AND Status = 'Active'`; query = query + ORDER_BY_FILTER; sfp_logger_1.default.log('QUERY:' + query, sfp_logger_1.LoggerLevel.TRACE); const results = (await hubConn.query(query)); return results; }, { retries: 3, minTimeout: 3000 }); } async getActiveScratchOrgsByInfoId(scrathOrgIds) { let hubConn = this.hubOrg.getConnection(); return retry(async (bail) => { let query = `SELECT Id, SignupUsername FROM ActiveScratchOrg WHERE ScratchOrgInfoId IN (${scrathOrgIds}) `; sfp_logger_1.default.log('QUERY:' + query, sfp_logger_1.LoggerLevel.TRACE); const results = (await hubConn.query(query)); return results; }, { retries: 3, minTimeout: 3000 }); } async getCountOfActiveScratchOrgsByTag(tag) { let hubConn = this.hubOrg.getConnection(); return retry(async (bail) => { let query = `SELECT Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl FROM ScratchOrgInfo WHERE Pooltag__c = '${tag}' AND Status = 'Active' `; sfp_logger_1.default.log('QUERY:' + query, sfp_logger_1.LoggerLevel.TRACE); const results = (await hubConn.query(query)); sfp_logger_1.default.log('RESULT:' + JSON.stringify(results), sfp_logger_1.LoggerLevel.TRACE); return results.totalSize; }, { retries: 3, minTimeout: 3000 }); } async getCountOfActiveScratchOrgsByTagAndUsername(tag) { let hubConn = this.hubOrg.getConnection(); return retry(async (bail) => { let query = `SELECT Id, CreatedDate, ScratchOrg, ExpirationDate, SignupUsername, SignupEmail, Password__c, Allocation_status__c, LoginUrl FROM ScratchOrgInfo WHERE Pooltag__c = '${tag}' AND Status = 'Active' `; sfp_logger_1.default.log('QUERY:' + query, sfp_logger_1.LoggerLevel.TRACE); const results = (await hubConn.query(query)); return results.totalSize; }, { retries: 3, minTimeout: 3000 }); } async getActiveScratchOrgRecordIdGivenScratchOrg(scratchOrgId) { let hubConn = this.hubOrg.getConnection(); return retry(async (bail) => { let query = `SELECT Id FROM ActiveScratchOrg WHERE ScratchOrg = '${scratchOrgId}'`; let records = (await hubConn.query(query)).records; sfp_logger_1.default.log('Retrieve Active ScratchOrg Id:' + JSON.stringify(records), sfp_logger_1.LoggerLevel.TRACE); return records[0].Id; }, { retries: 3, minTimeout: 3000 }); } async getActiveScratchOrgRecordsAsMapByUser(hubOrg) { let conn = this.hubOrg.getConnection(); let query = 'SELECT count(id) In_Use, SignupEmail FROM ActiveScratchOrg GROUP BY SignupEmail ORDER BY count(id) DESC'; const results = (await conn.query(query)); sfp_logger_1.default.log(`Info Fetched: ${JSON.stringify(results)}`, sfp_logger_1.LoggerLevel.DEBUG); let scratchOrgRecordAsMapByUser = this.arrayToObject(results.records, 'SignupEmail'); return scratchOrgRecordAsMapByUser; } async getScratchOrgIdGivenUserName(username) { let conn = this.hubOrg.getConnection(); let query = `SELECT Id FROM ActiveScratchOrg WHERE SignupUsername = '${username}'`; return retry(async (bail) => { sfp_logger_1.default.log('QUERY:' + query, sfp_logger_1.LoggerLevel.TRACE); const results = (await conn.query(query)); return results.records[0].Id; }, { retries: 3, minTimeout: 3000 }); } async getScratchOrgInfoIdGivenUserName(username) { let conn = this.hubOrg.getConnection(); let query = `SELECT Id FROM ScratchOrgInfo WHERE SignupUsername = '${username}'`; return retry(async (bail) => { sfp_logger_1.default.log('QUERY:' + query, sfp_logger_1.LoggerLevel.TRACE); const results = (await conn.query(query)); return results.records[0].Id; }, { retries: 3, minTimeout: 3000 }); } } exports.default = ScratchOrgInfoFetcher; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NyYXRjaE9yZ0luZm9GZXRjaGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2NvcmUvc2NyYXRjaG9yZy9wb29sL3NlcnZpY2VzL2ZldGNoZXJzL1NjcmF0Y2hPcmdJbmZvRmV0Y2hlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsbUVBQThEO0FBRzlELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQztBQUNyQyxNQUFNLGVBQWUsR0FBRyw0QkFBNEIsQ0FBQztBQUVyRCxNQUFxQixxQkFBcUI7SUFDdEMsWUFBb0IsTUFBVztRQUFYLFdBQU0sR0FBTixNQUFNLENBQUs7UUE4S3ZCLGtCQUFhLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FDeEMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUN2QixHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQzNCLE9BQU8sR0FBRyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBbEx1QixDQUFDO0lBRTVCLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxXQUF5QjtRQUN4RCxJQUFJLFdBQVcsSUFBSSxTQUFTLElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQUUsT0FBTztRQUVoRSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRTFDLElBQUksYUFBYSxHQUFHLFdBQVc7YUFDMUIsR0FBRyxDQUFDLFVBQVUsVUFBVTtZQUNyQixVQUFVLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNqRCxPQUFPLElBQUksVUFBVSxDQUFD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