@salesforce/apex-node
Version:
Salesforce JS library for Apex
184 lines • 7.68 kB
JavaScript
;
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