UNPKG

@salesforce/apex-node

Version:

Salesforce JS library for Apex

184 lines 7.68 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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); Object.defineProperty(exports, "__esModule", { value: true }); exports.ExecuteService = void 0; const fs_1 = require("fs"); const types_1 = require("./types"); const i18n_1 = require("../i18n"); const utils_1 = require("../utils"); const utils_2 = require("./utils"); const readline = __importStar(require("readline")); const elapsedTime_1 = require("../utils/elapsedTime"); const os = __importStar(require("node:os")); class ExecuteService { connection; constructor(connection) { this.connection = connection; } async executeAnonymous(options) { const data = await this.getApexCode(options); let count = 0; while (count < 2) { try { const request = this.buildExecRequest(data); const result = await this.connectionRequest(request); return this.jsonFormat(result); } catch (e) { if (e.name === 'ERROR_HTTP_500' && e.message?.includes('INVALID_SESSION_ID')) { await (0, utils_1.refreshAuth)(this.connection); count += 1; } else { throw new Error(i18n_1.nls.localize('unexpectedExecuteCommandError', e.message)); } } } throw new Error(i18n_1.nls.localize('authForAnonymousApexFailed')); } async getApexCode(options) { if (options.apexCode) { return String(options.apexCode); } else if (options.apexFilePath) { return this.readApexFile(options.apexFilePath); } else if (options.userInput) { return await this.getUserInput(); } else { throw new Error(i18n_1.nls.localize('optionExecAnonError')); } } readApexFile(filepath) { if (!(0, fs_1.existsSync)(filepath)) { throw new Error(i18n_1.nls.localize('fileNotFoundError', filepath)); } return (0, fs_1.readFileSync)(filepath, 'utf8'); } async getUserInput() { process.stdout.write(i18n_1.nls.localize('execAnonInputPrompt')); return new Promise((resolve, reject) => { const readInterface = readline.createInterface(process.stdin, process.stdout); const timeout = setTimeout(() => { reject(new Error(i18n_1.nls.localize('execAnonInputTimeout'))); readInterface.close(); }, 60000); let apexCode = ''; readInterface.on('line', (input) => { timeout.refresh(); apexCode = apexCode + input + os.EOL; }); readInterface.on('close', () => { resolve(apexCode); clearTimeout(timeout); }); readInterface.on('error', (err) => { reject(new Error(i18n_1.nls.localize('unexpectedExecAnonInputError', err.message))); }); }); } // Tooling API execute anonymous apex REST endpoint was not used because // it requires multiple api calls to turn on trace flag, execute anonymous apex, and get the generated debug log buildExecRequest(data) { const body = (0, utils_2.encodeBody)(this.connection.accessToken, data); const postEndpoint = `${this.connection.instanceUrl}/services/Soap/s/${this.connection.version}/${this.connection.accessToken.split('!')[0]}`; return { method: 'POST', url: postEndpoint, body, headers: { 'content-type': 'text/xml', soapaction: types_1.action } }; } jsonFormat(soapResponse) { const execAnonResponse = soapResponse[types_1.soapEnv][types_1.soapBody].executeAnonymousResponse.result; const formattedResponse = { compiled: execAnonResponse.compiled === 'true', success: execAnonResponse.success === 'true', logs: soapResponse[types_1.soapEnv][types_1.soapHeader]?.DebuggingInfo.debugLog }; if (!formattedResponse.success) { formattedResponse.diagnostic = [ { lineNumber: execAnonResponse.line, columnNumber: execAnonResponse.column, compileProblem: typeof execAnonResponse.compileProblem === 'object' ? '' : execAnonResponse.compileProblem, exceptionMessage: typeof execAnonResponse.exceptionMessage === 'object' ? '' : execAnonResponse.exceptionMessage, exceptionStackTrace: typeof execAnonResponse.exceptionStackTrace === 'object' ? '' : execAnonResponse.exceptionStackTrace } ]; } return formattedResponse; } async connectionRequest(requestData) { return this.connection.request(requestData); } } exports.ExecuteService = ExecuteService; __decorate([ (0, elapsedTime_1.elapsedTime)() ], ExecuteService.prototype, "executeAnonymous", null); __decorate([ (0, elapsedTime_1.elapsedTime)() ], ExecuteService.prototype, "getApexCode", null); __decorate([ (0, elapsedTime_1.elapsedTime)() ], ExecuteService.prototype, "readApexFile", null); __decorate([ (0, elapsedTime_1.elapsedTime)() ], ExecuteService.prototype, "getUserInput", null); __decorate([ (0, elapsedTime_1.elapsedTime)() ], ExecuteService.prototype, "jsonFormat", null); __decorate([ (0, elapsedTime_1.elapsedTime)() ], ExecuteService.prototype, "connectionRequest", null); //# sourceMappingURL=executeService.js.map