catalyst-relay 0.6.1 → 0.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +16 -7
- package/dist/index.d.ts +16 -7
- package/dist/index.js +110 -33
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +110 -33
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1025,22 +1025,6 @@ function escapeXml(str) {
|
|
|
1025
1025
|
}
|
|
1026
1026
|
return str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'");
|
|
1027
1027
|
}
|
|
1028
|
-
function dictToAbapXml(data, root = "DATA") {
|
|
1029
|
-
const innerElements = Object.entries(data).map(([key, value]) => {
|
|
1030
|
-
if (value) {
|
|
1031
|
-
return `<${key}>${escapeXml(value)}</${key}>`;
|
|
1032
|
-
}
|
|
1033
|
-
return `<${key}/>`;
|
|
1034
|
-
}).join("\n ");
|
|
1035
|
-
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
1036
|
-
<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0">
|
|
1037
|
-
<asx:values>
|
|
1038
|
-
<${root}>
|
|
1039
|
-
${innerElements}
|
|
1040
|
-
</${root}>
|
|
1041
|
-
</asx:values>
|
|
1042
|
-
</asx:abap>`;
|
|
1043
|
-
}
|
|
1044
1028
|
|
|
1045
1029
|
// src/core/utils/csrf.ts
|
|
1046
1030
|
var FETCH_CSRF_TOKEN = "fetch";
|
|
@@ -1868,6 +1852,23 @@ async function updateObject(client, object, lockHandle, transport) {
|
|
|
1868
1852
|
}
|
|
1869
1853
|
|
|
1870
1854
|
// src/core/adt/craud/classInclude.ts
|
|
1855
|
+
async function readClassInclude(client, className, includeType) {
|
|
1856
|
+
const [config, configErr] = requireConfig("aclass");
|
|
1857
|
+
if (configErr) return err(configErr);
|
|
1858
|
+
debug(`Read class include ${className}/${includeType}`);
|
|
1859
|
+
const [response, requestErr] = await client.request({
|
|
1860
|
+
method: "GET",
|
|
1861
|
+
path: `/sap/bc/adt/${config.endpoint}/${className.toLowerCase()}/includes/${includeType}`,
|
|
1862
|
+
headers: { "Accept": "text/plain" }
|
|
1863
|
+
});
|
|
1864
|
+
const [content, checkErr] = await checkResponse(
|
|
1865
|
+
response,
|
|
1866
|
+
requestErr,
|
|
1867
|
+
`Failed to read ${includeType} include of class ${className}`
|
|
1868
|
+
);
|
|
1869
|
+
if (checkErr) return err(checkErr);
|
|
1870
|
+
return ok(content);
|
|
1871
|
+
}
|
|
1871
1872
|
async function updateClassInclude(client, className, includeType, source, lockHandle, transport) {
|
|
1872
1873
|
const [config, configErr] = requireConfig("aclass");
|
|
1873
1874
|
if (configErr) return err(configErr);
|
|
@@ -3045,35 +3046,102 @@ function parseSearchResults(xml) {
|
|
|
3045
3046
|
return ok(results);
|
|
3046
3047
|
}
|
|
3047
3048
|
|
|
3048
|
-
// src/core/adt/transports/
|
|
3049
|
-
|
|
3050
|
-
|
|
3051
|
-
|
|
3052
|
-
|
|
3053
|
-
|
|
3054
|
-
|
|
3049
|
+
// src/core/adt/transports/getTransportTargets.ts
|
|
3050
|
+
var TARGET_VALUEHELP_PATH = "/sap/bc/adt/cts/transportrequests/valuehelp/target?name=*";
|
|
3051
|
+
var NAMEDITEM_CONTENT_TYPE = "application/vnd.sap.adt.nameditems.v1+xml";
|
|
3052
|
+
var NAMEDITEM_NS = "http://www.sap.com/adt/nameditem";
|
|
3053
|
+
async function getTransportTargets(client) {
|
|
3054
|
+
const [response, requestErr] = await client.request({
|
|
3055
|
+
method: "GET",
|
|
3056
|
+
path: TARGET_VALUEHELP_PATH,
|
|
3057
|
+
headers: { Accept: NAMEDITEM_CONTENT_TYPE }
|
|
3055
3058
|
});
|
|
3059
|
+
if (requestErr) return err(requestErr);
|
|
3060
|
+
if (!response.ok) {
|
|
3061
|
+
const text2 = await response.text();
|
|
3062
|
+
return err(new Error(`Failed to fetch transport targets: ${extractError(text2)}`));
|
|
3063
|
+
}
|
|
3064
|
+
const text = await response.text();
|
|
3065
|
+
const [targets, parseErr] = extractTargets(text);
|
|
3066
|
+
if (parseErr) return err(parseErr);
|
|
3067
|
+
return ok(targets);
|
|
3068
|
+
}
|
|
3069
|
+
function extractTargets(xml) {
|
|
3070
|
+
const [doc, parseErr] = safeParseXml(xml);
|
|
3071
|
+
if (parseErr) return err(parseErr);
|
|
3072
|
+
const targets = [];
|
|
3073
|
+
const items = doc.getElementsByTagNameNS(NAMEDITEM_NS, "namedItem");
|
|
3074
|
+
for (let i = 0; i < items.length; i++) {
|
|
3075
|
+
const item = items[i];
|
|
3076
|
+
if (!item) continue;
|
|
3077
|
+
const name = item.getElementsByTagNameNS(NAMEDITEM_NS, "name")[0]?.textContent;
|
|
3078
|
+
if (!name || !name.trim()) continue;
|
|
3079
|
+
const description = item.getElementsByTagNameNS(NAMEDITEM_NS, "description")[0]?.textContent;
|
|
3080
|
+
targets.push({ name: name.trim(), description: (description ?? "").trim() });
|
|
3081
|
+
}
|
|
3082
|
+
return ok(targets);
|
|
3083
|
+
}
|
|
3084
|
+
|
|
3085
|
+
// src/core/adt/transports/createTransport.ts
|
|
3086
|
+
var TRANSPORTREQUESTS_PATH = "/sap/bc/adt/cts/transportrequests";
|
|
3087
|
+
var TM_CONTENT_TYPE = "application/vnd.sap.adt.transportorganizer.v1+xml";
|
|
3088
|
+
var TM_NS = "http://www.sap.com/cts/adt/tm";
|
|
3089
|
+
var TRANSPORT_TYPE_CODES = {
|
|
3090
|
+
workbench: "K",
|
|
3091
|
+
customizing: "W"
|
|
3092
|
+
};
|
|
3093
|
+
async function createTransport(client, config, owner) {
|
|
3094
|
+
const [target, targetErr] = await resolveTarget(client, config.target);
|
|
3095
|
+
if (targetErr) return err(targetErr);
|
|
3096
|
+
const typeCode = TRANSPORT_TYPE_CODES[config.type ?? "workbench"];
|
|
3097
|
+
const body = `<?xml version="1.0" encoding="UTF-8"?>
|
|
3098
|
+
<tm:root xmlns:tm="${TM_NS}" tm:useraction="newrequest">
|
|
3099
|
+
<tm:request tm:desc="${escapeXml(config.description)}" tm:type="${typeCode}" tm:target="${escapeXml(target)}" tm:cts_project="">
|
|
3100
|
+
<tm:task tm:owner="${escapeXml(owner)}"/>
|
|
3101
|
+
</tm:request>
|
|
3102
|
+
</tm:root>`;
|
|
3056
3103
|
const [response, requestErr] = await client.request({
|
|
3057
3104
|
method: "POST",
|
|
3058
|
-
path:
|
|
3105
|
+
path: TRANSPORTREQUESTS_PATH,
|
|
3059
3106
|
headers: {
|
|
3060
|
-
"Content-Type":
|
|
3061
|
-
"Accept":
|
|
3107
|
+
"Content-Type": TM_CONTENT_TYPE,
|
|
3108
|
+
"Accept": TM_CONTENT_TYPE
|
|
3062
3109
|
},
|
|
3063
3110
|
body
|
|
3064
3111
|
});
|
|
3065
3112
|
if (requestErr) return err(requestErr);
|
|
3066
3113
|
if (!response.ok) {
|
|
3067
3114
|
const text2 = await response.text();
|
|
3068
|
-
|
|
3069
|
-
return err(new Error(`Failed to create transport for ${config.package}: ${errorMsg}`));
|
|
3115
|
+
return err(new Error(`Failed to create transport: ${extractError(text2)}`));
|
|
3070
3116
|
}
|
|
3071
3117
|
const text = await response.text();
|
|
3072
|
-
|
|
3073
|
-
|
|
3074
|
-
|
|
3118
|
+
return extractTransportNumber(text);
|
|
3119
|
+
}
|
|
3120
|
+
async function resolveTarget(client, explicit) {
|
|
3121
|
+
if (explicit) return ok(explicit);
|
|
3122
|
+
const [targets, targetsErr] = await getTransportTargets(client);
|
|
3123
|
+
if (targetsErr) return err(targetsErr);
|
|
3124
|
+
if (targets.length === 0) {
|
|
3125
|
+
return err(new Error("No transport targets available; pass an explicit target."));
|
|
3126
|
+
}
|
|
3127
|
+
if (targets.length === 1) {
|
|
3128
|
+
return ok(targets[0].name);
|
|
3075
3129
|
}
|
|
3076
|
-
|
|
3130
|
+
const options = targets.map((t) => `${t.name} (${t.description})`).join(", ");
|
|
3131
|
+
return err(new Error(
|
|
3132
|
+
`Multiple transport targets available; pass an explicit target. Options: ${options}`
|
|
3133
|
+
));
|
|
3134
|
+
}
|
|
3135
|
+
function extractTransportNumber(xml) {
|
|
3136
|
+
const [doc, parseErr] = safeParseXml(xml);
|
|
3137
|
+
if (parseErr) return err(parseErr);
|
|
3138
|
+
const request4 = doc.getElementsByTagNameNS(TM_NS, "request")[0];
|
|
3139
|
+
if (!request4) return err(new Error("Failed to parse transport number from response"));
|
|
3140
|
+
const number = request4.getAttributeNS(TM_NS, "number") || request4.getAttribute("tm:number");
|
|
3141
|
+
if (!number || !number.trim()) {
|
|
3142
|
+
return err(new Error("Failed to parse transport number from response"));
|
|
3143
|
+
}
|
|
3144
|
+
return ok(number.trim());
|
|
3077
3145
|
}
|
|
3078
3146
|
|
|
3079
3147
|
// src/core/adt/transports/parseTransportTasks.ts
|
|
@@ -3584,6 +3652,12 @@ async function update(state, requestor, object, transport) {
|
|
|
3584
3652
|
return ok(void 0);
|
|
3585
3653
|
}
|
|
3586
3654
|
|
|
3655
|
+
// src/client/methods/craud/specialcases/classes/readClassInclude.ts
|
|
3656
|
+
async function readClassInclude2(state, requestor, className, includeType) {
|
|
3657
|
+
if (!state.session) return err(new Error("Not logged in"));
|
|
3658
|
+
return readClassInclude(requestor, className, includeType);
|
|
3659
|
+
}
|
|
3660
|
+
|
|
3587
3661
|
// src/client/methods/craud/specialcases/classes/writeClassInclude.ts
|
|
3588
3662
|
async function writeClassInclude(state, requestor, className, includeType, source, transport) {
|
|
3589
3663
|
if (!state.session) return err(new Error("Not logged in"));
|
|
@@ -3734,7 +3808,7 @@ async function whereUsed(state, requestor, object) {
|
|
|
3734
3808
|
// src/client/methods/transport/createTransport.ts
|
|
3735
3809
|
async function createTransport2(state, requestor, transportConfig) {
|
|
3736
3810
|
if (!state.session) return err(new Error("Not logged in"));
|
|
3737
|
-
return createTransport(requestor, transportConfig);
|
|
3811
|
+
return createTransport(requestor, transportConfig, state.session.username);
|
|
3738
3812
|
}
|
|
3739
3813
|
|
|
3740
3814
|
// src/client/methods/transport/deleteTransport.ts
|
|
@@ -4120,6 +4194,9 @@ var ADTClientImpl = class {
|
|
|
4120
4194
|
async update(object, transport) {
|
|
4121
4195
|
return update(this.state, this.requestor, object, transport);
|
|
4122
4196
|
}
|
|
4197
|
+
async readClassInclude(className, includeType) {
|
|
4198
|
+
return readClassInclude2(this.state, this.requestor, className, includeType);
|
|
4199
|
+
}
|
|
4123
4200
|
async writeClassInclude(className, includeType, source, transport) {
|
|
4124
4201
|
return writeClassInclude(this.state, this.requestor, className, includeType, source, transport);
|
|
4125
4202
|
}
|