catalyst-relay 0.5.5 → 0.5.7
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 +23 -1
- package/dist/index.d.ts +23 -1
- package/dist/index.js +201 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +201 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -2472,6 +2472,189 @@ async function createTransport(client, config) {
|
|
|
2472
2472
|
return ok(transportId);
|
|
2473
2473
|
}
|
|
2474
2474
|
|
|
2475
|
+
// src/core/adt/transports/getTransportContents.ts
|
|
2476
|
+
var ACCEPT_HEADER = "application/vnd.sap.adt.transportorganizer.v1+xml";
|
|
2477
|
+
async function getTransportContents(client, transportId) {
|
|
2478
|
+
const [response, requestErr] = await client.request({
|
|
2479
|
+
method: "GET",
|
|
2480
|
+
path: `/sap/bc/adt/cts/transportrequests/${transportId}`,
|
|
2481
|
+
headers: {
|
|
2482
|
+
"Accept": ACCEPT_HEADER
|
|
2483
|
+
}
|
|
2484
|
+
});
|
|
2485
|
+
if (requestErr) return err(requestErr);
|
|
2486
|
+
if (!response.ok) {
|
|
2487
|
+
const text2 = await response.text();
|
|
2488
|
+
const errorMsg = extractError(text2);
|
|
2489
|
+
return err(new Error(`Failed to read transport ${transportId}: ${errorMsg}`));
|
|
2490
|
+
}
|
|
2491
|
+
const text = await response.text();
|
|
2492
|
+
const [doc, parseErr] = safeParseXml(text);
|
|
2493
|
+
if (parseErr) return err(parseErr);
|
|
2494
|
+
const objects = [];
|
|
2495
|
+
const elements = doc.getElementsByTagName("tm:abap_object");
|
|
2496
|
+
for (let i = 0; i < elements.length; i++) {
|
|
2497
|
+
const el = elements[i];
|
|
2498
|
+
if (!el) continue;
|
|
2499
|
+
const name = el.getAttribute("tm:name");
|
|
2500
|
+
if (!name) continue;
|
|
2501
|
+
objects.push({
|
|
2502
|
+
name,
|
|
2503
|
+
description: el.getAttribute("tm:obj_desc") || el.getAttribute("tm:obj_info") || "",
|
|
2504
|
+
pgmid: el.getAttribute("tm:pgmid") || "",
|
|
2505
|
+
type: el.getAttribute("tm:type") || "",
|
|
2506
|
+
position: el.getAttribute("tm:position") || ""
|
|
2507
|
+
});
|
|
2508
|
+
}
|
|
2509
|
+
return ok(objects);
|
|
2510
|
+
}
|
|
2511
|
+
|
|
2512
|
+
// src/core/adt/transports/removeFromTransport.ts
|
|
2513
|
+
var ACCEPT_HEADER2 = "application/vnd.sap.adt.transportorganizer.v1+xml";
|
|
2514
|
+
async function removeTransportEntry(client, transportId, object) {
|
|
2515
|
+
const body = [
|
|
2516
|
+
'<?xml version="1.0" encoding="ASCII"?>',
|
|
2517
|
+
`<tm:root xmlns:tm="http://www.sap.com/cts/adt/tm" tm:number="${escapeXml(transportId)}" tm:useraction="removeobject">`,
|
|
2518
|
+
" <tm:request>",
|
|
2519
|
+
` <tm:abap_object tm:name="${escapeXml(object.name)}" tm:obj_desc="${escapeXml(object.description)}" tm:pgmid="${escapeXml(object.pgmid)}" tm:type="${escapeXml(object.type)}" tm:position="${escapeXml(object.position)}"/>`,
|
|
2520
|
+
" </tm:request>",
|
|
2521
|
+
"</tm:root>"
|
|
2522
|
+
].join("\n");
|
|
2523
|
+
const [response, requestErr] = await client.request({
|
|
2524
|
+
method: "PUT",
|
|
2525
|
+
path: `/sap/bc/adt/cts/transportrequests/${transportId}`,
|
|
2526
|
+
headers: {
|
|
2527
|
+
"Accept": ACCEPT_HEADER2,
|
|
2528
|
+
"Content-Type": "text/plain"
|
|
2529
|
+
},
|
|
2530
|
+
body
|
|
2531
|
+
});
|
|
2532
|
+
if (requestErr) return err(requestErr);
|
|
2533
|
+
if (!response.ok) {
|
|
2534
|
+
const text = await response.text();
|
|
2535
|
+
const errorMsg = extractError(text);
|
|
2536
|
+
return err(new Error(`Failed to remove ${object.name} from transport ${transportId}: ${errorMsg}`));
|
|
2537
|
+
}
|
|
2538
|
+
return ok(void 0);
|
|
2539
|
+
}
|
|
2540
|
+
async function removeFromTransport(client, transportId, objectName) {
|
|
2541
|
+
const [objects, listErr] = await getTransportContents(client, transportId);
|
|
2542
|
+
if (listErr) return err(listErr);
|
|
2543
|
+
const object = objects.find((o) => o.name === objectName);
|
|
2544
|
+
if (!object) {
|
|
2545
|
+
return err(new Error(`Object '${objectName}' not found on transport ${transportId}`));
|
|
2546
|
+
}
|
|
2547
|
+
return removeTransportEntry(client, transportId, object);
|
|
2548
|
+
}
|
|
2549
|
+
|
|
2550
|
+
// src/core/adt/transports/deleteTransport.ts
|
|
2551
|
+
var ACCEPT_HEADER3 = "application/vnd.sap.adt.transportorganizer.v1+xml";
|
|
2552
|
+
function parseTransportTasks(doc) {
|
|
2553
|
+
const tasks = [];
|
|
2554
|
+
const taskElements = doc.getElementsByTagName("tm:task");
|
|
2555
|
+
for (let i = 0; i < taskElements.length; i++) {
|
|
2556
|
+
const taskEl = taskElements[i];
|
|
2557
|
+
if (!taskEl) continue;
|
|
2558
|
+
const taskId = taskEl.getAttribute("tm:number");
|
|
2559
|
+
if (!taskId) continue;
|
|
2560
|
+
const objects = [];
|
|
2561
|
+
const objectElements = taskEl.getElementsByTagName("tm:abap_object");
|
|
2562
|
+
for (let j = 0; j < objectElements.length; j++) {
|
|
2563
|
+
const el = objectElements[j];
|
|
2564
|
+
if (!el) continue;
|
|
2565
|
+
const name = el.getAttribute("tm:name");
|
|
2566
|
+
if (!name) continue;
|
|
2567
|
+
objects.push({
|
|
2568
|
+
name,
|
|
2569
|
+
description: el.getAttribute("tm:obj_desc") || el.getAttribute("tm:obj_info") || "",
|
|
2570
|
+
pgmid: el.getAttribute("tm:pgmid") || "",
|
|
2571
|
+
type: el.getAttribute("tm:type") || "",
|
|
2572
|
+
position: el.getAttribute("tm:position") || ""
|
|
2573
|
+
});
|
|
2574
|
+
}
|
|
2575
|
+
tasks.push({ taskId, objects });
|
|
2576
|
+
}
|
|
2577
|
+
return tasks;
|
|
2578
|
+
}
|
|
2579
|
+
async function sortAndCompress(client, taskId) {
|
|
2580
|
+
const [response, requestErr] = await client.request({
|
|
2581
|
+
method: "POST",
|
|
2582
|
+
path: `/sap/bc/adt/cts/transportrequests/${taskId}/sortandcompress`,
|
|
2583
|
+
headers: { "Accept": ACCEPT_HEADER3 }
|
|
2584
|
+
});
|
|
2585
|
+
if (requestErr) return err(requestErr);
|
|
2586
|
+
if (!response.ok) {
|
|
2587
|
+
const text = await response.text();
|
|
2588
|
+
const errorMsg = extractError(text);
|
|
2589
|
+
return err(new Error(`Failed to sort and compress task ${taskId}: ${errorMsg}`));
|
|
2590
|
+
}
|
|
2591
|
+
return ok(void 0);
|
|
2592
|
+
}
|
|
2593
|
+
async function deleteRequest(client, id) {
|
|
2594
|
+
const [response, requestErr] = await client.request({
|
|
2595
|
+
method: "DELETE",
|
|
2596
|
+
path: `/sap/bc/adt/cts/transportrequests/${id}`,
|
|
2597
|
+
headers: { "Accept": ACCEPT_HEADER3 }
|
|
2598
|
+
});
|
|
2599
|
+
if (requestErr) return err(requestErr);
|
|
2600
|
+
if (!response.ok) {
|
|
2601
|
+
const text = await response.text();
|
|
2602
|
+
const errorMsg = extractError(text);
|
|
2603
|
+
return err(new Error(`Failed to delete ${id}: ${errorMsg}`));
|
|
2604
|
+
}
|
|
2605
|
+
return ok(void 0);
|
|
2606
|
+
}
|
|
2607
|
+
async function deleteTransport(client, transportId, removeObjects = false) {
|
|
2608
|
+
const [response, requestErr] = await client.request({
|
|
2609
|
+
method: "GET",
|
|
2610
|
+
path: `/sap/bc/adt/cts/transportrequests/${transportId}`,
|
|
2611
|
+
headers: { "Accept": ACCEPT_HEADER3 }
|
|
2612
|
+
});
|
|
2613
|
+
if (requestErr) return err(requestErr);
|
|
2614
|
+
if (!response.ok) {
|
|
2615
|
+
const text2 = await response.text();
|
|
2616
|
+
const errorMsg = extractError(text2);
|
|
2617
|
+
return err(new Error(`Failed to read transport ${transportId}: ${errorMsg}`));
|
|
2618
|
+
}
|
|
2619
|
+
const text = await response.text();
|
|
2620
|
+
const [doc, parseErr] = safeParseXml(text);
|
|
2621
|
+
if (parseErr) return err(parseErr);
|
|
2622
|
+
const tasks = parseTransportTasks(doc);
|
|
2623
|
+
for (const task of tasks) {
|
|
2624
|
+
if (removeObjects && task.objects.length > 0) {
|
|
2625
|
+
const [, compressErr] = await sortAndCompress(client, task.taskId);
|
|
2626
|
+
if (compressErr) return err(compressErr);
|
|
2627
|
+
const [taskResponse, taskReadErr] = await client.request({
|
|
2628
|
+
method: "GET",
|
|
2629
|
+
path: `/sap/bc/adt/cts/transportrequests/${task.taskId}`,
|
|
2630
|
+
headers: { "Accept": ACCEPT_HEADER3 }
|
|
2631
|
+
});
|
|
2632
|
+
if (taskReadErr) return err(taskReadErr);
|
|
2633
|
+
const taskText = await taskResponse.text();
|
|
2634
|
+
const [taskDoc, taskParseErr] = safeParseXml(taskText);
|
|
2635
|
+
if (taskParseErr) return err(taskParseErr);
|
|
2636
|
+
const elements = taskDoc.getElementsByTagName("tm:abap_object");
|
|
2637
|
+
for (let i = 0; i < elements.length; i++) {
|
|
2638
|
+
const el = elements[i];
|
|
2639
|
+
if (!el) continue;
|
|
2640
|
+
const name = el.getAttribute("tm:name");
|
|
2641
|
+
if (!name) continue;
|
|
2642
|
+
const [, removeErr] = await removeTransportEntry(client, task.taskId, {
|
|
2643
|
+
name,
|
|
2644
|
+
description: el.getAttribute("tm:obj_desc") || el.getAttribute("tm:obj_info") || "",
|
|
2645
|
+
pgmid: el.getAttribute("tm:pgmid") || "",
|
|
2646
|
+
type: el.getAttribute("tm:type") || "",
|
|
2647
|
+
position: el.getAttribute("tm:position") || ""
|
|
2648
|
+
});
|
|
2649
|
+
if (removeErr) return err(removeErr);
|
|
2650
|
+
}
|
|
2651
|
+
}
|
|
2652
|
+
const [, taskErr] = await deleteRequest(client, task.taskId);
|
|
2653
|
+
if (taskErr) return err(taskErr);
|
|
2654
|
+
}
|
|
2655
|
+
return deleteRequest(client, transportId);
|
|
2656
|
+
}
|
|
2657
|
+
|
|
2475
2658
|
// src/core/adt/craud/gitDiff.ts
|
|
2476
2659
|
import { diffArrays } from "diff";
|
|
2477
2660
|
function computeDiff(serverLines, localLines) {
|
|
@@ -2729,6 +2912,18 @@ async function createTransport2(state, requestor, transportConfig) {
|
|
|
2729
2912
|
return createTransport(requestor, transportConfig);
|
|
2730
2913
|
}
|
|
2731
2914
|
|
|
2915
|
+
// src/client/methods/transport/deleteTransport.ts
|
|
2916
|
+
async function deleteTransport2(state, requestor, transportId, removeObjects = false) {
|
|
2917
|
+
if (!state.session) return err(new Error("Not logged in"));
|
|
2918
|
+
return deleteTransport(requestor, transportId, removeObjects);
|
|
2919
|
+
}
|
|
2920
|
+
|
|
2921
|
+
// src/client/methods/transport/removeFromTransport.ts
|
|
2922
|
+
async function removeFromTransport2(state, requestor, transportId, objectName) {
|
|
2923
|
+
if (!state.session) return err(new Error("Not logged in"));
|
|
2924
|
+
return removeFromTransport(requestor, transportId, objectName);
|
|
2925
|
+
}
|
|
2926
|
+
|
|
2732
2927
|
// src/client/methods/diff/gitDiff.ts
|
|
2733
2928
|
async function gitDiff2(state, requestor, objects) {
|
|
2734
2929
|
if (!state.session) return err(new Error("Not logged in"));
|
|
@@ -3105,6 +3300,12 @@ var ADTClientImpl = class {
|
|
|
3105
3300
|
async createTransport(transportConfig) {
|
|
3106
3301
|
return createTransport2(this.state, this.requestor, transportConfig);
|
|
3107
3302
|
}
|
|
3303
|
+
async deleteTransport(transportId, removeObjects = false) {
|
|
3304
|
+
return deleteTransport2(this.state, this.requestor, transportId, removeObjects);
|
|
3305
|
+
}
|
|
3306
|
+
async removeFromTransport(transportId, objectName) {
|
|
3307
|
+
return removeFromTransport2(this.state, this.requestor, transportId, objectName);
|
|
3308
|
+
}
|
|
3108
3309
|
// --- Diff Operations ---
|
|
3109
3310
|
async gitDiff(objects) {
|
|
3110
3311
|
return gitDiff2(this.state, this.requestor, objects);
|