catalyst-relay 0.6.2 → 0.6.4
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 +15 -7
- package/dist/index.d.ts +15 -7
- package/dist/index.js +87 -34
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +87 -34
- 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";
|
|
@@ -1914,6 +1898,7 @@ async function updateClassInclude(client, className, includeType, source, lockHa
|
|
|
1914
1898
|
// src/core/adt/craud/activation.ts
|
|
1915
1899
|
var MAX_POLL_ATTEMPTS = 30;
|
|
1916
1900
|
var POLL_RETRY_DELAY_MS = 1e3;
|
|
1901
|
+
var LONG_POLL_TIMEOUT_MS = 36e5;
|
|
1917
1902
|
var RUN_ID_REGEX = /\/activation\/runs\/([^?/]+)/;
|
|
1918
1903
|
var BACKGROUND_RUN_MEDIA_TYPE = "application/vnd.sap.adt.backgroundrun.v1+xml";
|
|
1919
1904
|
async function activateObjects(client, objects) {
|
|
@@ -1976,7 +1961,8 @@ async function activateByReferences(client, references) {
|
|
|
1976
1961
|
method: "GET",
|
|
1977
1962
|
path: `/sap/bc/adt/activation/runs/${runId}`,
|
|
1978
1963
|
params: { "withLongPolling": "true" },
|
|
1979
|
-
headers: { "Accept": BACKGROUND_RUN_MEDIA_TYPE }
|
|
1964
|
+
headers: { "Accept": BACKGROUND_RUN_MEDIA_TYPE },
|
|
1965
|
+
timeout: LONG_POLL_TIMEOUT_MS
|
|
1980
1966
|
});
|
|
1981
1967
|
if (pollErr) return err(pollErr);
|
|
1982
1968
|
debug(`Activation poll attempt ${pollAttempt} status: ${pollRes.status}`);
|
|
@@ -3062,35 +3048,102 @@ function parseSearchResults(xml) {
|
|
|
3062
3048
|
return ok(results);
|
|
3063
3049
|
}
|
|
3064
3050
|
|
|
3065
|
-
// src/core/adt/transports/
|
|
3066
|
-
|
|
3067
|
-
|
|
3068
|
-
|
|
3069
|
-
|
|
3070
|
-
|
|
3071
|
-
|
|
3051
|
+
// src/core/adt/transports/getTransportTargets.ts
|
|
3052
|
+
var TARGET_VALUEHELP_PATH = "/sap/bc/adt/cts/transportrequests/valuehelp/target?name=*";
|
|
3053
|
+
var NAMEDITEM_CONTENT_TYPE = "application/vnd.sap.adt.nameditems.v1+xml";
|
|
3054
|
+
var NAMEDITEM_NS = "http://www.sap.com/adt/nameditem";
|
|
3055
|
+
async function getTransportTargets(client) {
|
|
3056
|
+
const [response, requestErr] = await client.request({
|
|
3057
|
+
method: "GET",
|
|
3058
|
+
path: TARGET_VALUEHELP_PATH,
|
|
3059
|
+
headers: { Accept: NAMEDITEM_CONTENT_TYPE }
|
|
3072
3060
|
});
|
|
3061
|
+
if (requestErr) return err(requestErr);
|
|
3062
|
+
if (!response.ok) {
|
|
3063
|
+
const text2 = await response.text();
|
|
3064
|
+
return err(new Error(`Failed to fetch transport targets: ${extractError(text2)}`));
|
|
3065
|
+
}
|
|
3066
|
+
const text = await response.text();
|
|
3067
|
+
const [targets, parseErr] = extractTargets(text);
|
|
3068
|
+
if (parseErr) return err(parseErr);
|
|
3069
|
+
return ok(targets);
|
|
3070
|
+
}
|
|
3071
|
+
function extractTargets(xml) {
|
|
3072
|
+
const [doc, parseErr] = safeParseXml(xml);
|
|
3073
|
+
if (parseErr) return err(parseErr);
|
|
3074
|
+
const targets = [];
|
|
3075
|
+
const items = doc.getElementsByTagNameNS(NAMEDITEM_NS, "namedItem");
|
|
3076
|
+
for (let i = 0; i < items.length; i++) {
|
|
3077
|
+
const item = items[i];
|
|
3078
|
+
if (!item) continue;
|
|
3079
|
+
const name = item.getElementsByTagNameNS(NAMEDITEM_NS, "name")[0]?.textContent;
|
|
3080
|
+
if (!name || !name.trim()) continue;
|
|
3081
|
+
const description = item.getElementsByTagNameNS(NAMEDITEM_NS, "description")[0]?.textContent;
|
|
3082
|
+
targets.push({ name: name.trim(), description: (description ?? "").trim() });
|
|
3083
|
+
}
|
|
3084
|
+
return ok(targets);
|
|
3085
|
+
}
|
|
3086
|
+
|
|
3087
|
+
// src/core/adt/transports/createTransport.ts
|
|
3088
|
+
var TRANSPORTREQUESTS_PATH = "/sap/bc/adt/cts/transportrequests";
|
|
3089
|
+
var TM_CONTENT_TYPE = "application/vnd.sap.adt.transportorganizer.v1+xml";
|
|
3090
|
+
var TM_NS = "http://www.sap.com/cts/adt/tm";
|
|
3091
|
+
var TRANSPORT_TYPE_CODES = {
|
|
3092
|
+
workbench: "K",
|
|
3093
|
+
customizing: "W"
|
|
3094
|
+
};
|
|
3095
|
+
async function createTransport(client, config, owner) {
|
|
3096
|
+
const [target, targetErr] = await resolveTarget(client, config.target);
|
|
3097
|
+
if (targetErr) return err(targetErr);
|
|
3098
|
+
const typeCode = TRANSPORT_TYPE_CODES[config.type ?? "workbench"];
|
|
3099
|
+
const body = `<?xml version="1.0" encoding="UTF-8"?>
|
|
3100
|
+
<tm:root xmlns:tm="${TM_NS}" tm:useraction="newrequest">
|
|
3101
|
+
<tm:request tm:desc="${escapeXml(config.description)}" tm:type="${typeCode}" tm:target="${escapeXml(target)}" tm:cts_project="">
|
|
3102
|
+
<tm:task tm:owner="${escapeXml(owner)}"/>
|
|
3103
|
+
</tm:request>
|
|
3104
|
+
</tm:root>`;
|
|
3073
3105
|
const [response, requestErr] = await client.request({
|
|
3074
3106
|
method: "POST",
|
|
3075
|
-
path:
|
|
3107
|
+
path: TRANSPORTREQUESTS_PATH,
|
|
3076
3108
|
headers: {
|
|
3077
|
-
"Content-Type":
|
|
3078
|
-
"Accept":
|
|
3109
|
+
"Content-Type": TM_CONTENT_TYPE,
|
|
3110
|
+
"Accept": TM_CONTENT_TYPE
|
|
3079
3111
|
},
|
|
3080
3112
|
body
|
|
3081
3113
|
});
|
|
3082
3114
|
if (requestErr) return err(requestErr);
|
|
3083
3115
|
if (!response.ok) {
|
|
3084
3116
|
const text2 = await response.text();
|
|
3085
|
-
|
|
3086
|
-
return err(new Error(`Failed to create transport for ${config.package}: ${errorMsg}`));
|
|
3117
|
+
return err(new Error(`Failed to create transport: ${extractError(text2)}`));
|
|
3087
3118
|
}
|
|
3088
3119
|
const text = await response.text();
|
|
3089
|
-
|
|
3090
|
-
|
|
3091
|
-
|
|
3120
|
+
return extractTransportNumber(text);
|
|
3121
|
+
}
|
|
3122
|
+
async function resolveTarget(client, explicit) {
|
|
3123
|
+
if (explicit) return ok(explicit);
|
|
3124
|
+
const [targets, targetsErr] = await getTransportTargets(client);
|
|
3125
|
+
if (targetsErr) return err(targetsErr);
|
|
3126
|
+
if (targets.length === 0) {
|
|
3127
|
+
return err(new Error("No transport targets available; pass an explicit target."));
|
|
3128
|
+
}
|
|
3129
|
+
if (targets.length === 1) {
|
|
3130
|
+
return ok(targets[0].name);
|
|
3131
|
+
}
|
|
3132
|
+
const options = targets.map((t) => `${t.name} (${t.description})`).join(", ");
|
|
3133
|
+
return err(new Error(
|
|
3134
|
+
`Multiple transport targets available; pass an explicit target. Options: ${options}`
|
|
3135
|
+
));
|
|
3136
|
+
}
|
|
3137
|
+
function extractTransportNumber(xml) {
|
|
3138
|
+
const [doc, parseErr] = safeParseXml(xml);
|
|
3139
|
+
if (parseErr) return err(parseErr);
|
|
3140
|
+
const request4 = doc.getElementsByTagNameNS(TM_NS, "request")[0];
|
|
3141
|
+
if (!request4) return err(new Error("Failed to parse transport number from response"));
|
|
3142
|
+
const number = request4.getAttributeNS(TM_NS, "number") || request4.getAttribute("tm:number");
|
|
3143
|
+
if (!number || !number.trim()) {
|
|
3144
|
+
return err(new Error("Failed to parse transport number from response"));
|
|
3092
3145
|
}
|
|
3093
|
-
return ok(
|
|
3146
|
+
return ok(number.trim());
|
|
3094
3147
|
}
|
|
3095
3148
|
|
|
3096
3149
|
// src/core/adt/transports/parseTransportTasks.ts
|
|
@@ -3757,7 +3810,7 @@ async function whereUsed(state, requestor, object) {
|
|
|
3757
3810
|
// src/client/methods/transport/createTransport.ts
|
|
3758
3811
|
async function createTransport2(state, requestor, transportConfig) {
|
|
3759
3812
|
if (!state.session) return err(new Error("Not logged in"));
|
|
3760
|
-
return createTransport(requestor, transportConfig);
|
|
3813
|
+
return createTransport(requestor, transportConfig, state.session.username);
|
|
3761
3814
|
}
|
|
3762
3815
|
|
|
3763
3816
|
// src/client/methods/transport/deleteTransport.ts
|