UNPKG

abap-adt-api

Version:

Interface to Abap Developer Tools webservice

300 lines (299 loc) 14.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.debuggerSetVariableValue = exports.debuggerGoToStackOld = exports.debuggerGoToStack = exports.debuggerStep = exports.debuggerVariables = exports.debuggerChildVariables = exports.simpleDebuggerStack = exports.debuggerStack = exports.debuggerSaveSettings = exports.debuggerAttach = exports.debuggerDeleteBreakpoints = exports.debuggerSetBreakpoints = exports.isDebuggerBreakpoint = exports.debuggerDeleteListener = exports.debuggerListen = exports.debuggerListeners = exports.isDebuggee = exports.isDebugListenerError = exports.debugMetaIsComplex = void 0; const __1 = require(".."); const utilities_1 = require("../utilities"); const urlparser_1 = require("./urlparser"); const debugMetaIsComplex = (m) => !["simple", "string", "boxedcomp", "anonymcomp", "unknown"].find(e => e === m); exports.debugMetaIsComplex = debugMetaIsComplex; const parseStep = (body) => { var _a; const raw = (0, utilities_1.fullParse)(body, { removeNSPrefix: true }); checkException(raw); const attrs = (0, utilities_1.xmlNodeAttr)(raw.step); const settings = (0, utilities_1.xmlNodeAttr)((_a = raw === null || raw === void 0 ? void 0 : raw.step) === null || _a === void 0 ? void 0 : _a.settings); const actions = (0, utilities_1.xmlArray)(raw, "step", "actions", "action").map(utilities_1.xmlNodeAttr); return { ...attrs, actions, settings }; }; const convertVariable = (v) => ({ ...v, TABLE_LINES: (0, utilities_1.toInt)(v.TABLE_LINES), LENGTH: (0, utilities_1.toInt)(v.LENGTH), INHERITANCE_LEVEL: (0, utilities_1.toInt)(v.INHERITANCE_LEVEL), VALUE: v.VALUE, ID: v.ID, NAME: v.NAME }); const parseVariables = (body) => { const raw = (0, utilities_1.fullParse)(body, { removeNSPrefix: true, parseTagValue: false, numberParseOptions: utilities_1.numberParseOptions }); const variables = (0, utilities_1.xmlArray)(raw, "abap", "values", "DATA", "STPDA_ADT_VARIABLE") .map(convertVariable); return variables; }; const parseChildVariables = (body) => { const raw = (0, utilities_1.fullParse)(body, { removeNSPrefix: true, parseTagValue: false, numberParseOptions: utilities_1.numberParseOptions }); const hierarchies = (0, utilities_1.xmlArray)(raw, "abap", "values", "DATA", "HIERARCHIES", "STPDA_ADT_VARIABLE_HIERARCHY"); const variables = (0, utilities_1.xmlArray)(raw, "abap", "values", "DATA", "VARIABLES", "STPDA_ADT_VARIABLE") .map(convertVariable); return { hierarchies, variables }; }; const parseStack = (body) => { const raw = (0, utilities_1.fullParse)(body, { removeNSPrefix: true }); const stack = (0, utilities_1.xmlArray)(raw, "stack", "stackEntry") .map(utilities_1.xmlNodeAttr) .map(x => ({ ...x, uri: (0, urlparser_1.parseUri)(x.uri) })); const attrs = (0, utilities_1.xmlNodeAttr)(raw.stack); return { ...attrs, stack }; }; const parseDebugSettings = (body) => { const raw = (0, utilities_1.fullParse)(body, { removeNSPrefix: true }); return (0, utilities_1.xmlNodeAttr)(raw.settings); }; const parseAttach = (body) => { const raw = (0, utilities_1.fullParse)(body, { removeNSPrefix: true }); const attrs = (0, utilities_1.xmlNodeAttr)(raw.attach); const reachedBreakpoints = (0, utilities_1.xmlArray)(raw, "attach", "reachedBreakpoints", "breakpoint").map(utilities_1.xmlNodeAttr); const actions = (0, utilities_1.xmlArray)(raw, "attach", "actions", "action").map(utilities_1.xmlNodeAttr); return { ...attrs, actions, reachedBreakpoints }; }; const parseBreakpoints = (body) => { const raw = (0, utilities_1.fullParse)(body, { removeNSPrefix: true }); return (0, utilities_1.xmlArray)(raw, "breakpoints", "breakpoint") .map(utilities_1.xmlNodeAttr) .map(x => { if (x.uri) return { ...x, uri: (0, urlparser_1.parseUri)(x.uri) }; return x; }); }; const parseDebugError = (raw) => { if (raw.exception) { const { namespace: { "@_id": namespace }, type: { "@_id": type }, localizedMessage, message } = raw.exception; const parseMessage = (m) => ({ text: m["#text"], lang: m["@_lang"] }); const entries = {}; for (const ex of (0, utilities_1.xmlArray)(raw.exception, "properties", "entry")) entries[ex["@_key"]] = ex["#text"]; return { ...entries, namespace, type, message: parseMessage(message), localizedMessage: parseMessage(localizedMessage) }; } }; const checkException = (raw) => { const e = parseDebugError(raw); if (e) { const err = new Error(e.message.text); err.extra = e; throw err; } }; const isDebugListenerError = (e) => !!e && "conflictText" in e && "com.sap.adt.communicationFramework.subType" in e; exports.isDebugListenerError = isDebugListenerError; const isDebuggee = (d) => !!d && !["CLIENT", "DEBUGGEE_ID", "TERMINAL_ID", "IDE_ID", "DEBUGGEE_USER"].find(f => !(f in d)); exports.isDebuggee = isDebuggee; const parseDebugListeners = (body) => { if (!body) return; const raw = (0, utilities_1.fullParse)(body, { removeNSPrefix: true }); const err = parseDebugError(raw); if (err) return err; const debug = (0, utilities_1.xmlNode)(raw, "abap", "values", "DATA", "STPDA_DEBUGGEE"); return { ...debug, URI: (0, urlparser_1.parseUri)(debug.URI) }; }; async function debuggerListeners(h, debuggingMode, terminalId, ideId, requestUser, checkConflict = true) { const qs = { debuggingMode, requestUser, terminalId, ideId, checkConflict }; const response = await h.request("/sap/bc/adt/debugger/listeners", { qs }); if (!response.body) return; const raw = (0, utilities_1.fullParse)(response.body, { removeNSPrefix: true }); return parseDebugError(raw); } exports.debuggerListeners = debuggerListeners; async function debuggerListen(h, debuggingMode, terminalId, ideId, requestUser, checkConflict = true, isNotifiedOnConflict = true) { const qs = { debuggingMode, requestUser, terminalId, ideId, checkConflict, isNotifiedOnConflict }; const response = await h.request("/sap/bc/adt/debugger/listeners", { method: "POST", timeout: 360000000, qs }); return parseDebugListeners(response.body); } exports.debuggerListen = debuggerListen; async function debuggerDeleteListener(h, debuggingMode, terminalId, ideId, requestUser) { const qs = { debuggingMode, requestUser, terminalId, ideId, checkConflict: false, notifyConflict: true }; await h.request("/sap/bc/adt/debugger/listeners", { method: "DELETE", qs }); } exports.debuggerDeleteListener = debuggerDeleteListener; const formatBreakpoint = (clientId) => (b) => { if ((0, utilities_1.isString)(b)) return `<breakpoint xmlns:adtcore="http://www.sap.com/adt/core" kind="line" clientId="${clientId}" skipCount="0" adtcore:uri="${b}"/>`; const uri = `adtcore:uri="${b.uri.uri}#start=${b.uri.range.start.line}"`; const condition = b.condition ? `condition="${b.condition}"` : ``; return `<breakpoint xmlns:adtcore="http://www.sap.com/adt/core" kind="${b.kind}" clientId="${b.clientId}" skipCount="0" ${uri} ${condition}/>`; }; const isDebuggerBreakpoint = (x) => "uri" in x; exports.isDebuggerBreakpoint = isDebuggerBreakpoint; async function debuggerSetBreakpoints(h, debuggingMode, terminalId, ideId, clientId, breakpoints, requestUser, scope = "external", systemDebugging = false, deactivated = false, syncScopeUri = "") { const syncScope = syncScopeUri ? `<syncScope mode="partial"><adtcore:objectReference xmlns:adtcore="http://www.sap.com/adt/core" adtcore:uri="${syncScopeUri}"/></syncScope>` : `<syncScope mode="full"></syncScope>`; const body = `<?xml version="1.0" encoding="UTF-8"?> <dbg:breakpoints scope="${scope}" debuggingMode="${debuggingMode}" requestUser="${requestUser}" terminalId="${terminalId}" ideId="${ideId}" systemDebugging="${systemDebugging}" deactivated="${deactivated}" xmlns:dbg="http://www.sap.com/adt/debugger"> ${syncScope} ${breakpoints.map(formatBreakpoint(clientId)).join("")} </dbg:breakpoints>`; const headers = { "Content-Type": "application/xml", Accept: "application/xml" }; const response = await h.request("/sap/bc/adt/debugger/breakpoints", { method: "POST", headers, body }); return parseBreakpoints(response.body); } exports.debuggerSetBreakpoints = debuggerSetBreakpoints; async function debuggerDeleteBreakpoints(h, breakpoint, debuggingMode, terminalId, ideId, requestUser, scope = "external") { const headers = { Accept: "application/xml" }; const qs = { scope, debuggingMode, requestUser, terminalId, ideId }; await h.request(`/sap/bc/adt/debugger/breakpoints/${encodeURIComponent(breakpoint.id)}`, { method: "DELETE", headers, qs }); } exports.debuggerDeleteBreakpoints = debuggerDeleteBreakpoints; async function debuggerAttach(h, debuggingMode, debuggeeId, requestUser = "", dynproDebugging = true) { const headers = { Accept: "application/xml" }; const qs = { method: "attach", debuggeeId, dynproDebugging, debuggingMode, requestUser }; const response = await h.request("/sap/bc/adt/debugger", { method: "POST", headers, qs }); return parseAttach(response.body); } exports.debuggerAttach = debuggerAttach; async function debuggerSaveSettings(h, settings) { const headers = { "Content-Type": "application/xml", Accept: "application/xml" }; const { systemDebugging = false, createExceptionObject = false, backgroundRFC = false, sharedObjectDebugging = false, showDataAging = true, updateDebugging = false } = settings; const body = `<?xml version="1.0" encoding="UTF-8"?> <dbg:settings xmlns:dbg="http://www.sap.com/adt/debugger" systemDebugging="${systemDebugging}" createExceptionObject="${createExceptionObject}" backgroundRFC="${backgroundRFC}" sharedObjectDebugging="${sharedObjectDebugging}" showDataAging="${showDataAging}" updateDebugging="${updateDebugging}"> </dbg:settings>`; const qs = { method: "setDebuggerSettings" }; const response = await h.request("/sap/bc/adt/debugger", { method: "POST", headers, body, qs }); return parseDebugSettings(response.body); } exports.debuggerSaveSettings = debuggerSaveSettings; async function debuggerStack(h, semanticURIs = true) { const headers = { Accept: "application/xml" }; const qs = { method: "getStack", emode: "_", semanticURIs }; const response = await h.request("/sap/bc/adt/debugger/stack", { headers, qs }); return parseStack(response.body); } exports.debuggerStack = debuggerStack; async function simpleDebuggerStack(h, semanticURIs = true) { const headers = { Accept: "application/xml" }; const qs = { method: "getStack", emode: "_", semanticURIs }; const response = await h.request("/sap/bc/adt/debugger", { headers, method: "POST", qs }); return parseStack(response.body); } exports.simpleDebuggerStack = simpleDebuggerStack; async function debuggerChildVariables(h, parents = ["@ROOT", "@DATAAGING"]) { const headers = { Accept: "application/vnd.sap.as+xml;charset=UTF-8;dataname=com.sap.adt.debugger.ChildVariables", "Content-Type": "application/vnd.sap.as+xml; charset=UTF-8; dataname=com.sap.adt.debugger.ChildVariables" }; const hierarchies = parents.map(p => `<STPDA_ADT_VARIABLE_HIERARCHY><PARENT_ID>${(0, utilities_1.encodeEntity)(p)}</PARENT_ID></STPDA_ADT_VARIABLE_HIERARCHY>`); const body = `<?xml version="1.0" encoding="UTF-8" ?><asx:abap version="1.0" xmlns:asx="http://www.sap.com/abapxml"><asx:values><DATA> <HIERARCHIES>${hierarchies.join("")}</HIERARCHIES> </DATA></asx:values></asx:abap>`; const qs = { method: "getChildVariables" }; const response = await h.request("/sap/bc/adt/debugger", { method: "POST", headers, qs, body }); return parseChildVariables(response.body); } exports.debuggerChildVariables = debuggerChildVariables; async function debuggerVariables(h, parents) { const headers = { Accept: "application/vnd.sap.as+xml;charset=UTF-8;dataname=com.sap.adt.debugger.Variables", "Content-Type": "application/vnd.sap.as+xml; charset=UTF-8; dataname=com.sap.adt.debugger.Variables" }; const mainBody = parents.map(p => `<STPDA_ADT_VARIABLE><ID>${(0, utilities_1.encodeEntity)(p)}</ID></STPDA_ADT_VARIABLE>`).join(""); const body = `<?xml version="1.0" encoding="UTF-8" ?><asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"><asx:values> <DATA>${mainBody}</DATA></asx:values></asx:abap>`; const qs = { method: "getVariables" }; const response = await h.request("/sap/bc/adt/debugger", { method: "POST", headers, qs, body }); return parseVariables(response.body); } exports.debuggerVariables = debuggerVariables; async function debuggerStep(h, method, uri) { const headers = { Accept: "application/xml" }; const response = await h.request("/sap/bc/adt/debugger", { method: "POST", headers, qs: { method, uri } }); return parseStep(response.body); } exports.debuggerStep = debuggerStep; async function debuggerGoToStack(h, stackUri) { if (!stackUri.match(/^\/sap\/bc\/adt\/debugger\/stack\/type\/[\w]+\/position\/\d+$/)) throw (0, __1.adtException)(`Invalid stack URL: ${stackUri}`); await h.request(stackUri, { method: "PUT" }); } exports.debuggerGoToStack = debuggerGoToStack; async function debuggerGoToStackOld(h, position) { const qs = { method: "setStackPosition", position }; await h.request(`/sap/bc/adt/debugger`, { method: "POST", qs }); } exports.debuggerGoToStackOld = debuggerGoToStackOld; async function debuggerSetVariableValue(h, variableName, value) { const qs = { variableName }; const resp = await h.request(`/sap/bc/adt/debugger?method=setVariableValue`, { method: "POST", qs, body: value }); return resp.body; } exports.debuggerSetVariableValue = debuggerSetVariableValue;