catalyst-relay 0.5.10 → 0.5.12
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 +32 -17
- package/dist/index.d.ts +32 -17
- package/dist/index.js +273 -140
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +272 -140
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1192,6 +1192,14 @@ var OBJECT_CONFIG_MAP = {
|
|
|
1192
1192
|
type: "PROG/P",
|
|
1193
1193
|
label: "ABAP Program" /* PROGRAM */,
|
|
1194
1194
|
extension: "asprog"
|
|
1195
|
+
},
|
|
1196
|
+
"asinc": {
|
|
1197
|
+
endpoint: "programs/includes",
|
|
1198
|
+
nameSpace: 'xmlns:include="http://www.sap.com/adt/programs/includes"',
|
|
1199
|
+
rootName: "include:abapInclude",
|
|
1200
|
+
type: "PROG/I",
|
|
1201
|
+
label: "ABAP Include" /* INCLUDE */,
|
|
1202
|
+
extension: "asinc"
|
|
1195
1203
|
}
|
|
1196
1204
|
};
|
|
1197
1205
|
function getConfigByExtension(extension) {
|
|
@@ -1253,6 +1261,80 @@ async function readObject(client, object) {
|
|
|
1253
1261
|
return ok(result);
|
|
1254
1262
|
}
|
|
1255
1263
|
|
|
1264
|
+
// src/core/adt/discovery/whereUsed.ts
|
|
1265
|
+
async function findWhereUsed(client, object) {
|
|
1266
|
+
const config = getConfigByExtension(object.extension);
|
|
1267
|
+
if (!config) {
|
|
1268
|
+
return err(new Error(`Unsupported extension: ${object.extension}`));
|
|
1269
|
+
}
|
|
1270
|
+
const uri = `/sap/bc/adt/${config.endpoint}/${object.name}`;
|
|
1271
|
+
const body = `<?xml version="1.0" encoding="UTF-8"?>
|
|
1272
|
+
<usagereferences:usageReferenceRequest xmlns:usagereferences="http://www.sap.com/adt/ris/usageReferences">
|
|
1273
|
+
<usagereferences:affectedObjects/>
|
|
1274
|
+
</usagereferences:usageReferenceRequest>`;
|
|
1275
|
+
const [response, requestErr] = await client.request({
|
|
1276
|
+
method: "POST",
|
|
1277
|
+
path: "/sap/bc/adt/repository/informationsystem/usageReferences",
|
|
1278
|
+
params: {
|
|
1279
|
+
"uri": uri,
|
|
1280
|
+
"ris_request_type": "usageReferences"
|
|
1281
|
+
},
|
|
1282
|
+
headers: {
|
|
1283
|
+
"Content-Type": "application/vnd.sap.adt.repository.usagereferences.request.v1+xml",
|
|
1284
|
+
"Accept": "application/vnd.sap.adt.repository.usagereferences.result.v1+xml"
|
|
1285
|
+
},
|
|
1286
|
+
body
|
|
1287
|
+
});
|
|
1288
|
+
if (requestErr) {
|
|
1289
|
+
return err(requestErr);
|
|
1290
|
+
}
|
|
1291
|
+
if (!response.ok) {
|
|
1292
|
+
const text2 = await response.text();
|
|
1293
|
+
const errorMsg = extractError(text2);
|
|
1294
|
+
return err(new Error(`Where-used query failed: ${errorMsg}`));
|
|
1295
|
+
}
|
|
1296
|
+
const text = await response.text();
|
|
1297
|
+
const [dependencies, parseErr] = parseWhereUsed(text);
|
|
1298
|
+
if (parseErr) {
|
|
1299
|
+
return err(parseErr);
|
|
1300
|
+
}
|
|
1301
|
+
return ok(dependencies);
|
|
1302
|
+
}
|
|
1303
|
+
function parseWhereUsed(xml) {
|
|
1304
|
+
const [doc, parseErr] = safeParseXml(xml);
|
|
1305
|
+
if (parseErr) {
|
|
1306
|
+
return err(parseErr);
|
|
1307
|
+
}
|
|
1308
|
+
const dependencies = [];
|
|
1309
|
+
const referencedObjects = doc.getElementsByTagNameNS(
|
|
1310
|
+
"http://www.sap.com/adt/ris/usageReferences",
|
|
1311
|
+
"referencedObject"
|
|
1312
|
+
);
|
|
1313
|
+
for (let i = 0; i < referencedObjects.length; i++) {
|
|
1314
|
+
const refObj = referencedObjects[i];
|
|
1315
|
+
if (!refObj) continue;
|
|
1316
|
+
const adtObject = refObj.getElementsByTagNameNS(
|
|
1317
|
+
"http://www.sap.com/adt/ris/usageReferences",
|
|
1318
|
+
"adtObject"
|
|
1319
|
+
)[0];
|
|
1320
|
+
if (!adtObject) continue;
|
|
1321
|
+
const name = adtObject.getAttributeNS("http://www.sap.com/adt/core", "name") || adtObject.getAttribute("adtcore:name");
|
|
1322
|
+
const type = adtObject.getAttributeNS("http://www.sap.com/adt/core", "type") || adtObject.getAttribute("adtcore:type");
|
|
1323
|
+
if (!name || !type) continue;
|
|
1324
|
+
const config = getConfigByType(type);
|
|
1325
|
+
if (!config) continue;
|
|
1326
|
+
const packageRef = adtObject.getElementsByTagNameNS("http://www.sap.com/adt/core", "packageRef")[0];
|
|
1327
|
+
const packageName = packageRef ? packageRef.getAttributeNS("http://www.sap.com/adt/core", "name") || packageRef.getAttribute("adtcore:name") : "";
|
|
1328
|
+
dependencies.push({
|
|
1329
|
+
name,
|
|
1330
|
+
extension: config.extension,
|
|
1331
|
+
package: packageName || "",
|
|
1332
|
+
usageType: "reference"
|
|
1333
|
+
});
|
|
1334
|
+
}
|
|
1335
|
+
return ok(dependencies);
|
|
1336
|
+
}
|
|
1337
|
+
|
|
1256
1338
|
// src/core/adt/craud/lock.ts
|
|
1257
1339
|
async function lockObject(client, object) {
|
|
1258
1340
|
const [config, configErr] = requireConfig(object.extension);
|
|
@@ -1301,6 +1383,135 @@ async function unlockObject(client, object, lockHandle) {
|
|
|
1301
1383
|
return ok(void 0);
|
|
1302
1384
|
}
|
|
1303
1385
|
|
|
1386
|
+
// src/core/adt/craud/delete.ts
|
|
1387
|
+
async function deleteObject(client, object, lockHandle, transport) {
|
|
1388
|
+
const [config, configErr] = requireConfig(object.extension);
|
|
1389
|
+
if (configErr) return err(configErr);
|
|
1390
|
+
const params = {
|
|
1391
|
+
"lockHandle": lockHandle
|
|
1392
|
+
};
|
|
1393
|
+
if (transport) {
|
|
1394
|
+
params["corrNr"] = transport;
|
|
1395
|
+
}
|
|
1396
|
+
const [response, requestErr] = await client.request({
|
|
1397
|
+
method: "DELETE",
|
|
1398
|
+
path: `/sap/bc/adt/${config.endpoint}/${object.name}/source/main`,
|
|
1399
|
+
params,
|
|
1400
|
+
headers: { "Accept": "text/plain" }
|
|
1401
|
+
});
|
|
1402
|
+
const [_, checkErr] = await checkResponse(
|
|
1403
|
+
response,
|
|
1404
|
+
requestErr,
|
|
1405
|
+
`Failed to delete ${config.label} ${object.name}`
|
|
1406
|
+
);
|
|
1407
|
+
if (checkErr) return err(checkErr);
|
|
1408
|
+
return ok(void 0);
|
|
1409
|
+
}
|
|
1410
|
+
|
|
1411
|
+
// src/core/adt/craud/multiDelete.ts
|
|
1412
|
+
var ExternalReferencesError = class extends Error {
|
|
1413
|
+
constructor(references) {
|
|
1414
|
+
super(`Cannot delete: ${references.length} external reference(s) prevent the operation`);
|
|
1415
|
+
this.references = references;
|
|
1416
|
+
this.name = "ExternalReferencesError";
|
|
1417
|
+
}
|
|
1418
|
+
};
|
|
1419
|
+
function objKey(o) {
|
|
1420
|
+
return `${o.name.toLowerCase()}|${o.extension}`;
|
|
1421
|
+
}
|
|
1422
|
+
async function multiDeleteObjects(client, objects, transport) {
|
|
1423
|
+
if (objects.length === 0) return ok([]);
|
|
1424
|
+
for (const obj of objects) {
|
|
1425
|
+
if (!getConfigByExtension(obj.extension)) {
|
|
1426
|
+
return err(new Error(`Unsupported extension: ${obj.extension}`));
|
|
1427
|
+
}
|
|
1428
|
+
}
|
|
1429
|
+
const setKeys = /* @__PURE__ */ new Set();
|
|
1430
|
+
const unique = [];
|
|
1431
|
+
for (const obj of objects) {
|
|
1432
|
+
const key = objKey(obj);
|
|
1433
|
+
if (setKeys.has(key)) continue;
|
|
1434
|
+
setKeys.add(key);
|
|
1435
|
+
unique.push(obj);
|
|
1436
|
+
}
|
|
1437
|
+
const whereUsedResults = await Promise.all(
|
|
1438
|
+
unique.map((obj) => findWhereUsed(client, obj))
|
|
1439
|
+
);
|
|
1440
|
+
for (let i = 0; i < whereUsedResults.length; i++) {
|
|
1441
|
+
const [, e] = whereUsedResults[i];
|
|
1442
|
+
if (e) return err(new Error(`where-used failed for ${unique[i].name}: ${e.message}`));
|
|
1443
|
+
}
|
|
1444
|
+
const referencers = /* @__PURE__ */ new Map();
|
|
1445
|
+
const dependents = /* @__PURE__ */ new Map();
|
|
1446
|
+
const externalRefs = [];
|
|
1447
|
+
for (const obj of unique) {
|
|
1448
|
+
referencers.set(objKey(obj), []);
|
|
1449
|
+
dependents.set(objKey(obj), []);
|
|
1450
|
+
}
|
|
1451
|
+
for (let i = 0; i < unique.length; i++) {
|
|
1452
|
+
const obj = unique[i];
|
|
1453
|
+
const oKey = objKey(obj);
|
|
1454
|
+
const [deps] = whereUsedResults[i];
|
|
1455
|
+
for (const dep of deps) {
|
|
1456
|
+
const dKey = objKey(dep);
|
|
1457
|
+
if (dKey === oKey) continue;
|
|
1458
|
+
if (!setKeys.has(dKey)) {
|
|
1459
|
+
externalRefs.push({
|
|
1460
|
+
object: { name: obj.name, extension: obj.extension },
|
|
1461
|
+
referencedBy: dep
|
|
1462
|
+
});
|
|
1463
|
+
continue;
|
|
1464
|
+
}
|
|
1465
|
+
referencers.get(oKey).push(dKey);
|
|
1466
|
+
dependents.get(dKey).push(oKey);
|
|
1467
|
+
}
|
|
1468
|
+
}
|
|
1469
|
+
if (externalRefs.length > 0) {
|
|
1470
|
+
return err(new ExternalReferencesError(externalRefs));
|
|
1471
|
+
}
|
|
1472
|
+
const objByKey = /* @__PURE__ */ new Map();
|
|
1473
|
+
for (const obj of unique) objByKey.set(objKey(obj), obj);
|
|
1474
|
+
const inDegree = /* @__PURE__ */ new Map();
|
|
1475
|
+
for (const [k, refs] of referencers.entries()) {
|
|
1476
|
+
inDegree.set(k, refs.length);
|
|
1477
|
+
}
|
|
1478
|
+
const remaining = new Set(setKeys);
|
|
1479
|
+
const results = [];
|
|
1480
|
+
const deleteOne = async (obj) => {
|
|
1481
|
+
const [lockHandle, lockErr] = await lockObject(client, obj);
|
|
1482
|
+
if (lockErr) {
|
|
1483
|
+
return { name: obj.name, extension: obj.extension, status: "error", message: lockErr.message };
|
|
1484
|
+
}
|
|
1485
|
+
const [, deleteErr] = await deleteObject(client, obj, lockHandle, transport);
|
|
1486
|
+
if (deleteErr) {
|
|
1487
|
+
await unlockObject(client, obj, lockHandle);
|
|
1488
|
+
return { name: obj.name, extension: obj.extension, status: "error", message: deleteErr.message };
|
|
1489
|
+
}
|
|
1490
|
+
return { name: obj.name, extension: obj.extension, status: "success" };
|
|
1491
|
+
};
|
|
1492
|
+
while (remaining.size > 0) {
|
|
1493
|
+
const ready = [];
|
|
1494
|
+
for (const key of remaining) {
|
|
1495
|
+
if ((inDegree.get(key) ?? 0) === 0) ready.push(key);
|
|
1496
|
+
}
|
|
1497
|
+
const waveKeys = ready.length > 0 ? ready : [...remaining];
|
|
1498
|
+
const waveObjects = waveKeys.map((k) => objByKey.get(k));
|
|
1499
|
+
const waveResults = await Promise.all(waveObjects.map(deleteOne));
|
|
1500
|
+
for (let i = 0; i < waveResults.length; i++) {
|
|
1501
|
+
const result = waveResults[i];
|
|
1502
|
+
const key = waveKeys[i];
|
|
1503
|
+
results.push(result);
|
|
1504
|
+
remaining.delete(key);
|
|
1505
|
+
if (result.status === "success") {
|
|
1506
|
+
for (const o of dependents.get(key) ?? []) {
|
|
1507
|
+
inDegree.set(o, (inDegree.get(o) ?? 0) - 1);
|
|
1508
|
+
}
|
|
1509
|
+
}
|
|
1510
|
+
}
|
|
1511
|
+
}
|
|
1512
|
+
return ok(results);
|
|
1513
|
+
}
|
|
1514
|
+
|
|
1304
1515
|
// src/core/adt/craud/create.ts
|
|
1305
1516
|
async function createObject(client, object, packageName, transport, username) {
|
|
1306
1517
|
const [config, configErr] = requireConfig(object.extension);
|
|
@@ -1366,59 +1577,31 @@ async function updateObject(client, object, lockHandle, transport) {
|
|
|
1366
1577
|
return ok(void 0);
|
|
1367
1578
|
}
|
|
1368
1579
|
|
|
1369
|
-
// src/core/adt/craud/delete.ts
|
|
1370
|
-
async function deleteObject(client, object, lockHandle, transport) {
|
|
1371
|
-
const [config, configErr] = requireConfig(object.extension);
|
|
1372
|
-
if (configErr) return err(configErr);
|
|
1373
|
-
const params = {
|
|
1374
|
-
"lockHandle": lockHandle
|
|
1375
|
-
};
|
|
1376
|
-
if (transport) {
|
|
1377
|
-
params["corrNr"] = transport;
|
|
1378
|
-
}
|
|
1379
|
-
const [response, requestErr] = await client.request({
|
|
1380
|
-
method: "DELETE",
|
|
1381
|
-
path: `/sap/bc/adt/${config.endpoint}/${object.name}/source/main`,
|
|
1382
|
-
params,
|
|
1383
|
-
headers: { "Accept": "text/plain" }
|
|
1384
|
-
});
|
|
1385
|
-
const [_, checkErr] = await checkResponse(
|
|
1386
|
-
response,
|
|
1387
|
-
requestErr,
|
|
1388
|
-
`Failed to delete ${config.label} ${object.name}`
|
|
1389
|
-
);
|
|
1390
|
-
if (checkErr) return err(checkErr);
|
|
1391
|
-
return ok(void 0);
|
|
1392
|
-
}
|
|
1393
|
-
|
|
1394
1580
|
// src/core/adt/craud/activation.ts
|
|
1581
|
+
var MAX_POLL_ATTEMPTS = 30;
|
|
1582
|
+
var RUN_ID_REGEX = /\/activation\/runs\/([^?/]+)/;
|
|
1395
1583
|
async function activateObjects(client, objects) {
|
|
1396
1584
|
if (objects.length === 0) {
|
|
1397
1585
|
return ok([]);
|
|
1398
1586
|
}
|
|
1399
|
-
const extension = objects[0].extension;
|
|
1400
|
-
const config = getConfigByExtension(extension);
|
|
1401
|
-
if (!config) return err(new Error(`Unsupported extension: ${extension}`));
|
|
1402
1587
|
for (const obj of objects) {
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
}
|
|
1588
|
+
const config = getConfigByExtension(obj.extension);
|
|
1589
|
+
if (!config) return err(new Error(`Unsupported extension: ${obj.extension}`));
|
|
1406
1590
|
}
|
|
1407
|
-
const objectRefs = objects.map((obj) =>
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
adtcore:description="*"/>`).join("\n ");
|
|
1591
|
+
const objectRefs = objects.map((obj) => {
|
|
1592
|
+
const config = getConfigByExtension(obj.extension);
|
|
1593
|
+
return `<adtcore:objectReference adtcore:uri="/sap/bc/adt/${config.endpoint}/${obj.name.toLowerCase()}" adtcore:type="${config.type}" adtcore:name="${obj.name}"/>`;
|
|
1594
|
+
}).join("\n ");
|
|
1412
1595
|
const body = `<?xml version="1.0" encoding="UTF-8"?>
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
const [
|
|
1596
|
+
<adtcore:objectReferences xmlns:adtcore="http://www.sap.com/adt/core">
|
|
1597
|
+
${objectRefs}
|
|
1598
|
+
</adtcore:objectReferences>`;
|
|
1599
|
+
const [startRes, startErr] = await client.request({
|
|
1417
1600
|
method: "POST",
|
|
1418
|
-
path: "/sap/bc/adt/activation",
|
|
1601
|
+
path: "/sap/bc/adt/activation/runs",
|
|
1419
1602
|
params: {
|
|
1420
1603
|
"method": "activate",
|
|
1421
|
-
"
|
|
1604
|
+
"preauditRequested": "false"
|
|
1422
1605
|
},
|
|
1423
1606
|
headers: {
|
|
1424
1607
|
"Content-Type": "application/xml",
|
|
@@ -1426,23 +1609,54 @@ async function activateObjects(client, objects) {
|
|
|
1426
1609
|
},
|
|
1427
1610
|
body
|
|
1428
1611
|
});
|
|
1429
|
-
if (
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1612
|
+
if (startErr) return err(startErr);
|
|
1613
|
+
debug(`Activation run start status: ${startRes.status}`);
|
|
1614
|
+
if (!startRes.ok) {
|
|
1615
|
+
const errText = await startRes.text();
|
|
1616
|
+
return err(new Error(`Activation start failed: ${extractError(errText)}`));
|
|
1617
|
+
}
|
|
1618
|
+
const location = startRes.headers.get("location");
|
|
1619
|
+
if (!location) return err(new Error("Activation start response missing Location header"));
|
|
1620
|
+
const runIdMatch = RUN_ID_REGEX.exec(location);
|
|
1621
|
+
if (!runIdMatch || !runIdMatch[1]) {
|
|
1622
|
+
return err(new Error(`Could not extract run ID from Location header: ${location}`));
|
|
1623
|
+
}
|
|
1624
|
+
const runId = runIdMatch[1];
|
|
1625
|
+
debug(`Activation run ID: ${runId}`);
|
|
1626
|
+
let pollAttempt = 0;
|
|
1627
|
+
while (pollAttempt < MAX_POLL_ATTEMPTS) {
|
|
1628
|
+
const [pollRes, pollErr] = await client.request({
|
|
1629
|
+
method: "GET",
|
|
1630
|
+
path: `/sap/bc/adt/activation/runs/${runId}`,
|
|
1631
|
+
params: { "withLongPolling": "true" },
|
|
1632
|
+
headers: { "Accept": "application/xml" }
|
|
1633
|
+
});
|
|
1634
|
+
if (pollErr) return err(pollErr);
|
|
1635
|
+
debug(`Activation poll attempt ${pollAttempt + 1} status: ${pollRes.status}`);
|
|
1636
|
+
if (pollRes.ok) break;
|
|
1637
|
+
pollAttempt++;
|
|
1638
|
+
if (pollAttempt >= MAX_POLL_ATTEMPTS) {
|
|
1639
|
+
const errText = await pollRes.text();
|
|
1640
|
+
return err(new Error(`Activation run ${runId} did not complete: ${extractError(errText)}`));
|
|
1641
|
+
}
|
|
1442
1642
|
}
|
|
1643
|
+
const [resultsRes, resultsErr] = await client.request({
|
|
1644
|
+
method: "GET",
|
|
1645
|
+
path: `/sap/bc/adt/activation/results/${runId}`,
|
|
1646
|
+
headers: { "Accept": "application/xml" }
|
|
1647
|
+
});
|
|
1648
|
+
if (resultsErr) return err(resultsErr);
|
|
1649
|
+
const resultsText = await resultsRes.text();
|
|
1650
|
+
debug(`Activation results status: ${resultsRes.status}`);
|
|
1651
|
+
debug(`Activation results body: ${resultsText.substring(0, 500)}`);
|
|
1652
|
+
if (!resultsRes.ok) {
|
|
1653
|
+
return err(new Error(`Failed to fetch activation results: ${extractError(resultsText)}`));
|
|
1654
|
+
}
|
|
1655
|
+
const [results, parseErr] = extractActivationErrors(objects, resultsText);
|
|
1656
|
+
if (parseErr) return err(parseErr);
|
|
1443
1657
|
return ok(results);
|
|
1444
1658
|
}
|
|
1445
|
-
function extractActivationErrors(objects, xml
|
|
1659
|
+
function extractActivationErrors(objects, xml) {
|
|
1446
1660
|
const [doc, parseErr] = safeParseXml(xml);
|
|
1447
1661
|
if (parseErr) {
|
|
1448
1662
|
return err(parseErr);
|
|
@@ -2444,80 +2658,6 @@ function parseSearchResults(xml) {
|
|
|
2444
2658
|
return ok(results);
|
|
2445
2659
|
}
|
|
2446
2660
|
|
|
2447
|
-
// src/core/adt/discovery/whereUsed.ts
|
|
2448
|
-
async function findWhereUsed(client, object) {
|
|
2449
|
-
const config = getConfigByExtension(object.extension);
|
|
2450
|
-
if (!config) {
|
|
2451
|
-
return err(new Error(`Unsupported extension: ${object.extension}`));
|
|
2452
|
-
}
|
|
2453
|
-
const uri = `/sap/bc/adt/${config.endpoint}/${object.name}`;
|
|
2454
|
-
const body = `<?xml version="1.0" encoding="UTF-8"?>
|
|
2455
|
-
<usagereferences:usageReferenceRequest xmlns:usagereferences="http://www.sap.com/adt/ris/usageReferences">
|
|
2456
|
-
<usagereferences:affectedObjects/>
|
|
2457
|
-
</usagereferences:usageReferenceRequest>`;
|
|
2458
|
-
const [response, requestErr] = await client.request({
|
|
2459
|
-
method: "POST",
|
|
2460
|
-
path: "/sap/bc/adt/repository/informationsystem/usageReferences",
|
|
2461
|
-
params: {
|
|
2462
|
-
"uri": uri,
|
|
2463
|
-
"ris_request_type": "usageReferences"
|
|
2464
|
-
},
|
|
2465
|
-
headers: {
|
|
2466
|
-
"Content-Type": "application/vnd.sap.adt.repository.usagereferences.request.v1+xml",
|
|
2467
|
-
"Accept": "application/vnd.sap.adt.repository.usagereferences.result.v1+xml"
|
|
2468
|
-
},
|
|
2469
|
-
body
|
|
2470
|
-
});
|
|
2471
|
-
if (requestErr) {
|
|
2472
|
-
return err(requestErr);
|
|
2473
|
-
}
|
|
2474
|
-
if (!response.ok) {
|
|
2475
|
-
const text2 = await response.text();
|
|
2476
|
-
const errorMsg = extractError(text2);
|
|
2477
|
-
return err(new Error(`Where-used query failed: ${errorMsg}`));
|
|
2478
|
-
}
|
|
2479
|
-
const text = await response.text();
|
|
2480
|
-
const [dependencies, parseErr] = parseWhereUsed(text);
|
|
2481
|
-
if (parseErr) {
|
|
2482
|
-
return err(parseErr);
|
|
2483
|
-
}
|
|
2484
|
-
return ok(dependencies);
|
|
2485
|
-
}
|
|
2486
|
-
function parseWhereUsed(xml) {
|
|
2487
|
-
const [doc, parseErr] = safeParseXml(xml);
|
|
2488
|
-
if (parseErr) {
|
|
2489
|
-
return err(parseErr);
|
|
2490
|
-
}
|
|
2491
|
-
const dependencies = [];
|
|
2492
|
-
const referencedObjects = doc.getElementsByTagNameNS(
|
|
2493
|
-
"http://www.sap.com/adt/ris/usageReferences",
|
|
2494
|
-
"referencedObject"
|
|
2495
|
-
);
|
|
2496
|
-
for (let i = 0; i < referencedObjects.length; i++) {
|
|
2497
|
-
const refObj = referencedObjects[i];
|
|
2498
|
-
if (!refObj) continue;
|
|
2499
|
-
const adtObject = refObj.getElementsByTagNameNS(
|
|
2500
|
-
"http://www.sap.com/adt/ris/usageReferences",
|
|
2501
|
-
"adtObject"
|
|
2502
|
-
)[0];
|
|
2503
|
-
if (!adtObject) continue;
|
|
2504
|
-
const name = adtObject.getAttributeNS("http://www.sap.com/adt/core", "name") || adtObject.getAttribute("adtcore:name");
|
|
2505
|
-
const type = adtObject.getAttributeNS("http://www.sap.com/adt/core", "type") || adtObject.getAttribute("adtcore:type");
|
|
2506
|
-
if (!name || !type) continue;
|
|
2507
|
-
const config = getConfigByType(type);
|
|
2508
|
-
if (!config) continue;
|
|
2509
|
-
const packageRef = adtObject.getElementsByTagNameNS("http://www.sap.com/adt/core", "packageRef")[0];
|
|
2510
|
-
const packageName = packageRef ? packageRef.getAttributeNS("http://www.sap.com/adt/core", "name") || packageRef.getAttribute("adtcore:name") : "";
|
|
2511
|
-
dependencies.push({
|
|
2512
|
-
name,
|
|
2513
|
-
extension: config.extension,
|
|
2514
|
-
package: packageName || "",
|
|
2515
|
-
usageType: "reference"
|
|
2516
|
-
});
|
|
2517
|
-
}
|
|
2518
|
-
return ok(dependencies);
|
|
2519
|
-
}
|
|
2520
|
-
|
|
2521
2661
|
// src/core/adt/transports/createTransport.ts
|
|
2522
2662
|
async function createTransport(client, config) {
|
|
2523
2663
|
const body = dictToAbapXml({
|
|
@@ -2910,16 +3050,7 @@ async function activate(state, requestor, objects) {
|
|
|
2910
3050
|
// src/client/methods/craud/delete.ts
|
|
2911
3051
|
async function deleteObjects(state, requestor, objects, transport) {
|
|
2912
3052
|
if (!state.session) return err(new Error("Not logged in"));
|
|
2913
|
-
|
|
2914
|
-
const [lockHandle, lockErr] = await lockObject(requestor, obj);
|
|
2915
|
-
if (lockErr) return err(lockErr);
|
|
2916
|
-
const [, deleteErr] = await deleteObject(requestor, obj, lockHandle, transport);
|
|
2917
|
-
if (deleteErr) {
|
|
2918
|
-
await unlockObject(requestor, obj, lockHandle);
|
|
2919
|
-
return err(deleteErr);
|
|
2920
|
-
}
|
|
2921
|
-
}
|
|
2922
|
-
return ok(void 0);
|
|
3053
|
+
return multiDeleteObjects(requestor, objects, transport);
|
|
2923
3054
|
}
|
|
2924
3055
|
|
|
2925
3056
|
// src/client/methods/craud/checkSyntax.ts
|
|
@@ -3420,6 +3551,7 @@ function createClient(config) {
|
|
|
3420
3551
|
return ok(new ADTClientImpl(config));
|
|
3421
3552
|
}
|
|
3422
3553
|
export {
|
|
3554
|
+
ExternalReferencesError,
|
|
3423
3555
|
activateLogging,
|
|
3424
3556
|
buildSQLQuery,
|
|
3425
3557
|
createClient,
|