abap-adt-api
Version:
Interface to Abap Developer Tools webservice
373 lines (372 loc) • 14.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parentTypeId = exports.isCreatableTypeId = exports.isNonGroupType = exports.CreatableTypes = exports.isPackageType = exports.isGroupType = exports.createTestInclude = exports.createObject = exports.validateNewObject = exports.objectPath = exports.loadTypes = exports.isBindingOptions = exports.isPackageOptions = exports.hasPackageOptions = exports.BindinTypes = void 0;
const sprintf_js_1 = require("sprintf-js");
const AdtException_1 = require("../AdtException");
const utilities_1 = require("../utilities");
exports.BindinTypes = [
{ description: "Odata V2 - Web API", bindingtype: "ODATA", category: "0" },
{ description: "Odata V2 - UI", bindingtype: "ODATA", category: "1" }
];
const hasPackageOptions = (o) => !!(o === null || o === void 0 ? void 0 : o.swcomp);
exports.hasPackageOptions = hasPackageOptions;
const isPackageOptions = (o) => (o === null || o === void 0 ? void 0 : o.objtype) === "DEVC/K" && (0, exports.hasPackageOptions)(o);
exports.isPackageOptions = isPackageOptions;
const isBindingOptions = (o) => (o === null || o === void 0 ? void 0 : o.objtype) === "SRVB/SVB" &&
!!(o === null || o === void 0 ? void 0 : o.service) &&
!!(o === null || o === void 0 ? void 0 : o.bindingtype);
exports.isBindingOptions = isBindingOptions;
const xmlEntry = (value, key) => value ? `<${key}>${(0, utilities_1.encodeEntity)(value)}</${key}>}` : `<${key}/>`;
const xmlAttribute = (value, key) => value ? `${key}="${(0, utilities_1.encodeEntity)(value)}"` : ``;
function createBodyPackage(options) {
const responsible = `adtcore:responsible="${options.responsible}"`;
const compname = xmlAttribute(options.swcomp, `pak:name`);
const description = xmlAttribute(options.description, "adtcore:description");
const superp = xmlAttribute(options.parentName, "adtcore:name");
const pkgname = xmlAttribute(options.name, "adtcore:name");
const pkgtype = xmlAttribute(options.packagetype, "pak:packageType");
return `<?xml version="1.0" encoding="UTF-8"?>
<pak:package xmlns:pak="http://www.sap.com/adt/packages"
xmlns:adtcore="http://www.sap.com/adt/core" ${description}
${pkgname} adtcore:type="DEVC/K" adtcore:version="active" ${responsible}>
<adtcore:packageRef adtcore:name="YMU_RAP"/>
<pak:attributes ${pkgtype}/>
<pak:superPackage ${superp}/>
<pak:applicationComponent/>
<pak:transport>
<pak:softwareComponent ${compname}/>
<pak:transportLayer pak:name="${(0, utilities_1.encodeEntity)(options.transportLayer)}"/>
</pak:transport>
<pak:translation/>
<pak:useAccesses/>
<pak:packageInterfaces/>
<pak:subPackages/>
</pak:package>`;
}
function createBodyFunc(options, type) {
const responsible = `adtcore:responsible="${options.responsible}"`;
return `<?xml version="1.0" encoding="UTF-8"?>
<${type.rootName} ${type.nameSpace}
xmlns:adtcore="http://www.sap.com/adt/core"
adtcore:description="${(0, utilities_1.encodeEntity)(options.description)}"
adtcore:name="${options.name}" adtcore:type="${options.objtype}">
<adtcore:containerRef adtcore:name="${options.parentName}"
adtcore:type="FUGR/F"
adtcore:uri="${options.parentPath}" />
</${type.rootName}>`;
}
function createBodySimple(options, type, body = "") {
const responsible = `adtcore:responsible="${options.responsible}"`;
body = body || `<adtcore:packageRef adtcore:name="${options.parentName}"/>`;
return `<?xml version="1.0" encoding="UTF-8"?>
<${type.rootName} ${type.nameSpace}
xmlns:adtcore="http://www.sap.com/adt/core"
adtcore:description="${(0, utilities_1.encodeEntity)(options.description)}"
adtcore:name="${options.name}" adtcore:type="${options.objtype}"
${responsible} ${type.extra || ""}>
${body}
</${type.rootName}>`;
}
function createBodyBinding(options, type) {
const body = `<adtcore:packageRef adtcore:name="${options.parentName}"/>
<srvb:services srvb:name="${options.name}">
<srvb:content srvb:version="0001">
<srvb:serviceDefinition adtcore:name="${options.service}"/>
</srvb:content>
</srvb:services>
<srvb:binding srvb:category="0" srvb:type="${options.bindingtype}" srvb:version="V2">
<srvb:implementation adtcore:name=""/>
</srvb:binding>`;
return createBodySimple(options, type, body);
}
function createBody(options, type) {
switch (type.typeId) {
case "DEVC/K":
if ((0, exports.isPackageOptions)(options))
return createBodyPackage(options);
throw (0, AdtException_1.adtException)("Can't create a Package with incomplete data");
case "FUGR/FF":
case "FUGR/I":
return createBodyFunc(options, type);
case "SRVB/SVB":
if ((0, exports.isBindingOptions)(options))
return createBodyBinding(options, type);
throw (0, AdtException_1.adtException)("Can't create service binding with incomplete data");
default:
return createBodySimple(options, type);
}
}
async function loadTypes(h) {
const response = await h.request("/sap/bc/adt/repository/typestructure", {
method: "POST"
});
const raw = (0, utilities_1.fullParse)(response.body);
return (0, utilities_1.xmlArray)(raw, "asx:abap", "asx:values", "DATA", "SEU_ADT_OBJECT_TYPE_DESCRIPTOR").map((x) => {
return { ...x, CAPABILITIES: (0, utilities_1.xmlArray)(x, "CAPABILITIES", "SEU_ACTION") };
});
}
exports.loadTypes = loadTypes;
function objectPath(typeIdOrObjectOptions, name, parentName) {
if (!(0, utilities_1.isString)(typeIdOrObjectOptions))
return objectPath(typeIdOrObjectOptions.objtype, typeIdOrObjectOptions.name, typeIdOrObjectOptions.parentName);
const encodedname = encodeURIComponent(name || "");
const ot = exports.CreatableTypes.get(typeIdOrObjectOptions);
if (!ot)
return "";
return ("/sap/bc/adt/" +
(0, sprintf_js_1.sprintf)(ot.creationPath, encodeURIComponent(parentName || "")) +
"/" +
encodedname);
}
exports.objectPath = objectPath;
async function validateNewObject(h, options) {
const ot = exports.CreatableTypes.get(options.objtype);
if (!ot)
throw (0, AdtException_1.adtException)("Unsupported object type");
if (!ot.validationPath)
throw (0, AdtException_1.adtException)(`Validation not supported for object ${ot} ${options.objname}`);
const response = await h.request("/sap/bc/adt/" + ot.validationPath, {
method: "POST",
qs: options
});
const raw = (0, utilities_1.fullParse)(response.body);
const results = (0, utilities_1.xmlArray)(raw, "asx:abap", "asx:values", "DATA");
const record = (results && results[0]) || {};
const { SEVERITY, SHORT_TEXT, CHECK_RESULT } = record;
if (SEVERITY === "ERROR")
throw (0, AdtException_1.adtException)(record.SHORT_TEXT);
return {
SEVERITY,
SHORT_TEXT,
success: !!CHECK_RESULT || !!SEVERITY
};
}
exports.validateNewObject = validateNewObject;
async function createObject(h, options) {
const ot = exports.CreatableTypes.get(options.objtype);
if (!ot)
throw (0, AdtException_1.adtException)("Unsupported object type");
const url = "/sap/bc/adt/" +
(0, sprintf_js_1.sprintf)(ot.creationPath, encodeURIComponent(options.parentName.toLowerCase()));
options.responsible = (options.responsible || h.username).toUpperCase();
const body = createBody(options, ot);
const qs = {};
if (options.transport)
qs.corrNr = options.transport;
// will raise exceptions on failure
await h.request(url, {
body,
headers: { "Content-Type": "application/*" },
method: "POST",
qs
});
}
exports.createObject = createObject;
async function createTestInclude(h, clas, lockHandle, corrNr) {
const body = `<?xml version="1.0" encoding="UTF-8"?><class:abapClassInclude
xmlns:class="http://www.sap.com/adt/oo/classes" xmlns:adtcore="http://www.sap.com/adt/core"
adtcore:name="dummy" class:includeType="testclasses"/>`;
await h.request(`/sap/bc/adt/oo/classes/${encodeURIComponent(clas)}/includes`, {
body,
headers: { "Content-Type": "application/*" },
method: "POST",
qs: { lockHandle, corrNr }
});
}
exports.createTestInclude = createTestInclude;
function isGroupType(type) {
return type === "FUGR/FF" || type === "FUGR/I";
}
exports.isGroupType = isGroupType;
function isPackageType(type) {
return type === "DEVC/K";
}
exports.isPackageType = isPackageType;
exports.CreatableTypes = new Map();
function isNonGroupType(type) {
return exports.CreatableTypes.has(type) && !isGroupType(type);
}
exports.isNonGroupType = isNonGroupType;
function isCreatableTypeId(type) {
return isGroupType(type) || isNonGroupType(type);
}
exports.isCreatableTypeId = isCreatableTypeId;
function parentTypeId(type) {
return isGroupType(type) ? "FUGR/F" : "DEVC/K";
}
exports.parentTypeId = parentTypeId;
const ctypes = [
{
creationPath: "programs/programs",
label: "Program",
nameSpace: 'xmlns:program="http://www.sap.com/adt/programs/programs"',
rootName: "program:abapProgram",
typeId: "PROG/P",
validationPath: "programs/validation",
maxLen: 30
},
{
creationPath: "oo/classes",
label: "Class",
nameSpace: 'xmlns:class="http://www.sap.com/adt/oo/classes"',
rootName: "class:abapClass",
typeId: "CLAS/OC",
validationPath: "oo/validation/objectname",
maxLen: 30
},
{
creationPath: "oo/interfaces",
label: "Interface",
nameSpace: 'xmlns:intf="http://www.sap.com/adt/oo/interfaces"',
rootName: "intf:abapInterface",
typeId: "INTF/OI",
validationPath: "oo/validation/objectname",
maxLen: 30
},
{
creationPath: "programs/includes",
label: "Include",
nameSpace: 'xmlns:include="http://www.sap.com/adt/programs/includes"',
rootName: "include:abapInclude",
typeId: "PROG/I",
validationPath: "includes/validation",
maxLen: 30
},
{
creationPath: "functions/groups",
label: "Function Group",
nameSpace: 'xmlns:group="http://www.sap.com/adt/functions/groups"',
rootName: "group:abapFunctionGroup",
typeId: "FUGR/F",
validationPath: "functions/validation",
maxLen: 26
},
{
creationPath: "functions/groups/%s/fmodules",
label: "Function module",
nameSpace: 'xmlns:fmodule="http://www.sap.com/adt/functions/fmodules"',
rootName: "fmodule:abapFunctionModule",
typeId: "FUGR/FF",
validationPath: "functions/validation",
maxLen: 30
},
{
creationPath: "functions/groups/%s/includes",
label: "Function group include",
nameSpace: 'xmlns:finclude="http://www.sap.com/adt/functions/fincludes"',
rootName: "finclude:abapFunctionGroupInclude",
typeId: "FUGR/I",
validationPath: "functions/validation",
maxLen: 3
},
{
creationPath: "ddic/ddl/sources",
label: "CDS Data Definitions",
nameSpace: 'xmlns:ddl="http://www.sap.com/adt/ddic/ddlsources"',
rootName: "ddl:ddlSource",
typeId: "DDLS/DF",
validationPath: "ddic/ddl/validation",
maxLen: 30
},
{
creationPath: "acm/dcl/sources",
label: "CDS Access Control",
nameSpace: 'xmlns:dcl="http://www.sap.com/adt/acm/dclsources"',
rootName: "dcl:dclSource",
typeId: "DCLS/DL",
validationPath: "acm/dcl/validation",
maxLen: 30
},
{
creationPath: "ddic/ddlx/sources",
label: "CDS metadata extensions",
nameSpace: 'xmlns:ddlx="http://www.sap.com/adt/ddic/ddlxsources"',
rootName: "ddlx:ddlxSource",
typeId: "DDLX/EX",
validationPath: "ddic/ddlx/sources/validation",
maxLen: 30
},
{
creationPath: "ddic/ddla/sources",
label: "CDS Annotation definitions",
nameSpace: 'xmlns:ddla="http://www.sap.com/adt/ddic/ddlasources"',
rootName: "ddla:ddlaSource",
typeId: "DDLA/ADF",
validationPath: "ddic/ddla/sources/validation",
maxLen: 30
},
{
creationPath: "packages",
label: "Package",
nameSpace: 'xmlns:pak="http://www.sap.com/adt/packages"',
rootName: "pak:package",
typeId: "DEVC/K",
validationPath: "packages/validation",
maxLen: 30
},
{
creationPath: "ddic/tables",
label: "Table",
nameSpace: 'xmlns:blue="http://www.sap.com/wbobj/blue"',
rootName: "blue:blueSource",
typeId: "TABL/DT",
validationPath: "ddic/tables/validation",
maxLen: 16
},
{
creationPath: "ddic/srvd/sources",
label: "Service definition",
nameSpace: 'xmlns:srvd="http://www.sap.com/adt/ddic/srvdsources"',
rootName: "srvd:srvdSource",
typeId: "SRVD/SRV",
validationPath: "ddic/srvd/sources/validation",
extra: `srvd:srvdSourceType="S"`,
maxLen: 30
},
{
creationPath: "aps/iam/auth",
rootName: "auth:auth",
nameSpace: 'xmlns:auth="http://www.sap.com/iam/auth"',
label: "Authorization field",
typeId: "AUTH",
validationPath: "aps/iam/auth/validation",
maxLen: 10
},
{
creationPath: "aps/iam/suso",
validationPath: "aps/iam/suso/validation",
rootName: "susob:suso",
nameSpace: `xmlns:susob="http://www.sap.com/iam/suso"`,
label: "Authorization object",
typeId: "SUSO/B",
maxLen: 10
},
{
creationPath: "ddic/dataelements",
validationPath: "ddic/dataelements/validation",
rootName: "blue:wbobj",
nameSpace: 'xmlns:blue="http://www.sap.com/wbobj/dictionary/dtel"',
label: "Data Element",
typeId: "DTEL/DE",
maxLen: 30
},
{
creationPath: "businessservices/bindings",
validationPath: "businessservices/bindings/validation",
rootName: "srvb:serviceBinding",
nameSpace: 'xmlns:srvb="http://www.sap.com/adt/ddic/ServiceBindings"',
label: "Service binding",
typeId: "SRVB/SVB",
maxLen: 26
},
{
creationPath: "messageclass",
validationPath: "messageclass/validation",
rootName: "mc:messageClass",
nameSpace: `xmlns:mc="http://www.sap.com/adt/MessageClass"`,
label: "Message class",
typeId: "MSAG/N",
maxLen: 20
}
];
ctypes.forEach(v => exports.CreatableTypes.set(v.typeId, v));