catalyst-relay 0.2.2 → 0.2.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 +51 -4
- package/dist/index.d.ts +51 -4
- package/dist/index.js +95 -33
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +94 -33
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -373,7 +373,7 @@ function requireConfig(extension) {
|
|
|
373
373
|
return [config, null];
|
|
374
374
|
}
|
|
375
375
|
|
|
376
|
-
// src/core/adt/read.ts
|
|
376
|
+
// src/core/adt/craud/read.ts
|
|
377
377
|
async function readObject(client, object) {
|
|
378
378
|
const [config, configErr] = requireConfig(object.extension);
|
|
379
379
|
if (configErr) return err(configErr);
|
|
@@ -397,7 +397,7 @@ async function readObject(client, object) {
|
|
|
397
397
|
return ok(result);
|
|
398
398
|
}
|
|
399
399
|
|
|
400
|
-
// src/core/adt/lock.ts
|
|
400
|
+
// src/core/adt/craud/lock.ts
|
|
401
401
|
async function lockObject(client, object) {
|
|
402
402
|
const [config, configErr] = requireConfig(object.extension);
|
|
403
403
|
if (configErr) return err(configErr);
|
|
@@ -445,7 +445,7 @@ async function unlockObject(client, object, lockHandle) {
|
|
|
445
445
|
return ok(void 0);
|
|
446
446
|
}
|
|
447
447
|
|
|
448
|
-
// src/core/adt/create.ts
|
|
448
|
+
// src/core/adt/craud/create.ts
|
|
449
449
|
async function createObject(client, object, packageName, transport, username) {
|
|
450
450
|
const [config, configErr] = requireConfig(object.extension);
|
|
451
451
|
if (configErr) return err(configErr);
|
|
@@ -482,7 +482,7 @@ async function createObject(client, object, packageName, transport, username) {
|
|
|
482
482
|
return ok(void 0);
|
|
483
483
|
}
|
|
484
484
|
|
|
485
|
-
// src/core/adt/update.ts
|
|
485
|
+
// src/core/adt/craud/update.ts
|
|
486
486
|
async function updateObject(client, object, lockHandle, transport) {
|
|
487
487
|
const [config, configErr] = requireConfig(object.extension);
|
|
488
488
|
if (configErr) return err(configErr);
|
|
@@ -510,7 +510,7 @@ async function updateObject(client, object, lockHandle, transport) {
|
|
|
510
510
|
return ok(void 0);
|
|
511
511
|
}
|
|
512
512
|
|
|
513
|
-
// src/core/adt/delete.ts
|
|
513
|
+
// src/core/adt/craud/delete.ts
|
|
514
514
|
async function deleteObject(client, object, lockHandle, transport) {
|
|
515
515
|
const [config, configErr] = requireConfig(object.extension);
|
|
516
516
|
if (configErr) return err(configErr);
|
|
@@ -535,7 +535,7 @@ async function deleteObject(client, object, lockHandle, transport) {
|
|
|
535
535
|
return ok(void 0);
|
|
536
536
|
}
|
|
537
537
|
|
|
538
|
-
// src/core/adt/activation.ts
|
|
538
|
+
// src/core/adt/craud/activation.ts
|
|
539
539
|
async function activateObjects(client, objects) {
|
|
540
540
|
if (objects.length === 0) {
|
|
541
541
|
return ok([]);
|
|
@@ -645,7 +645,7 @@ function extractActivationErrors(objects, xml, _extension) {
|
|
|
645
645
|
return ok(results);
|
|
646
646
|
}
|
|
647
647
|
|
|
648
|
-
// src/core/adt/tree.ts
|
|
648
|
+
// src/core/adt/discovery/tree.ts
|
|
649
649
|
async function getTree(client, query) {
|
|
650
650
|
const internalQuery = {};
|
|
651
651
|
if (query.package) {
|
|
@@ -762,7 +762,7 @@ function parseTreeResponse(xml) {
|
|
|
762
762
|
return ok({ nodes, packages });
|
|
763
763
|
}
|
|
764
764
|
|
|
765
|
-
// src/core/adt/packages.ts
|
|
765
|
+
// src/core/adt/discovery/packages.ts
|
|
766
766
|
async function getPackages(client) {
|
|
767
767
|
const [treeResult, treeErr] = await getTreeInternal(client, {}, "*");
|
|
768
768
|
if (treeErr) {
|
|
@@ -771,7 +771,7 @@ async function getPackages(client) {
|
|
|
771
771
|
return ok(treeResult.packages);
|
|
772
772
|
}
|
|
773
773
|
|
|
774
|
-
// src/core/adt/transports.ts
|
|
774
|
+
// src/core/adt/transports/transports.ts
|
|
775
775
|
async function getTransports(client, packageName) {
|
|
776
776
|
const contentType = "application/vnd.sap.as+xml; charset=UTF-8; dataname=com.sap.adt.transport.service.checkData";
|
|
777
777
|
const body = `<?xml version="1.0" encoding="UTF-8"?>
|
|
@@ -840,7 +840,7 @@ function extractTransports(xml) {
|
|
|
840
840
|
return ok(transports);
|
|
841
841
|
}
|
|
842
842
|
|
|
843
|
-
// src/core/adt/previewParser.ts
|
|
843
|
+
// src/core/adt/data_extraction/previewParser.ts
|
|
844
844
|
function parseDataPreview(xml, maxRows, isTable) {
|
|
845
845
|
const [doc, parseErr] = safeParseXml(xml);
|
|
846
846
|
if (parseErr) {
|
|
@@ -899,7 +899,7 @@ function parseDataPreview(xml, maxRows, isTable) {
|
|
|
899
899
|
return ok(dataFrame);
|
|
900
900
|
}
|
|
901
901
|
|
|
902
|
-
// src/core/adt/dataPreview.ts
|
|
902
|
+
// src/core/adt/data_extraction/dataPreview.ts
|
|
903
903
|
async function previewData(client, query) {
|
|
904
904
|
const extension = query.objectType === "table" ? "astabldt" : "asddls";
|
|
905
905
|
const config = getConfigByExtension(extension);
|
|
@@ -939,11 +939,83 @@ async function previewData(client, query) {
|
|
|
939
939
|
return ok(dataFrame);
|
|
940
940
|
}
|
|
941
941
|
|
|
942
|
-
// src/core/adt/
|
|
942
|
+
// src/core/adt/data_extraction/queryBuilder.ts
|
|
943
|
+
function quoteString(value) {
|
|
944
|
+
return typeof value == "string" ? "'" + value + "'" : "" + value;
|
|
945
|
+
}
|
|
946
|
+
function basicFilterToWhere(filter) {
|
|
947
|
+
return `${filter.field} ${filter.operator} ${quoteString(filter.value)}`;
|
|
948
|
+
}
|
|
949
|
+
function betweenFilterToWhere(filter) {
|
|
950
|
+
return `${filter.field} between ${quoteString(filter.minimum)} and ${quoteString(filter.maximum)}`;
|
|
951
|
+
}
|
|
952
|
+
function listFilterToWhere(filter) {
|
|
953
|
+
return `${filter.field} ${filter.include ? "" : "not "}in ( ${filter.values.map(quoteString).join(", ")} )`;
|
|
954
|
+
}
|
|
955
|
+
function queryFilterToWhere(filter) {
|
|
956
|
+
if (filter.type === "list") return listFilterToWhere(filter);
|
|
957
|
+
if (filter.type === "between") return betweenFilterToWhere(filter);
|
|
958
|
+
return basicFilterToWhere(filter);
|
|
959
|
+
}
|
|
960
|
+
function queryFiltersToWhere(filters) {
|
|
961
|
+
if (filters.length === 0) return "";
|
|
962
|
+
return `
|
|
963
|
+
where ${filters.map(queryFilterToWhere).join(" and ")}`;
|
|
964
|
+
}
|
|
965
|
+
function sortingsToOrderBy(sortings) {
|
|
966
|
+
if (sortings.length === 0) return "";
|
|
967
|
+
return `
|
|
968
|
+
order by ${sortings.map((s) => `${s.field} ${s.direction}`).join(", ")}`;
|
|
969
|
+
}
|
|
970
|
+
function fieldsToGroupbyClause(fields) {
|
|
971
|
+
if (fields.length === 0) return "";
|
|
972
|
+
return `
|
|
973
|
+
group by ${fields.join(", ")}`;
|
|
974
|
+
}
|
|
975
|
+
function aggregationToFieldDefinition(aggregation) {
|
|
976
|
+
if (aggregation.function === "count") {
|
|
977
|
+
return `count( distinct main~${aggregation.field} ) as ${aggregation.field}`;
|
|
978
|
+
}
|
|
979
|
+
return `${aggregation.function}( main~${aggregation.field} ) as ${aggregation.field}`;
|
|
980
|
+
}
|
|
981
|
+
function parametersToSQLParams(params) {
|
|
982
|
+
if (params.length === 0) return "";
|
|
983
|
+
return `( ${params.map((p) => `${p.name} = ${quoteString(p.value)}`).join(", ")})`;
|
|
984
|
+
}
|
|
985
|
+
function buildSQLQuery(query) {
|
|
986
|
+
const [parameters, filters, sortings, aggregations] = [query.parameters ?? [], query.filters ?? [], query.sortings ?? [], query.aggregations ?? []];
|
|
987
|
+
const groupingFields = query.fields.filter((f) => !aggregations.find((a) => a.field === f));
|
|
988
|
+
if (sortings.filter((s) => !query.fields.includes(s.field)).length > 0) {
|
|
989
|
+
return err(new Error("Sorting fields must be included in the selected fields."));
|
|
990
|
+
}
|
|
991
|
+
let selectClause = "select\n";
|
|
992
|
+
const fieldSelections = [];
|
|
993
|
+
for (const field of query.fields) {
|
|
994
|
+
const aggregation = aggregations.find((a) => a.field === field);
|
|
995
|
+
if (aggregation) {
|
|
996
|
+
fieldSelections.push(` ${aggregationToFieldDefinition(aggregation)}`);
|
|
997
|
+
continue;
|
|
998
|
+
}
|
|
999
|
+
fieldSelections.push(` main~${field}`);
|
|
1000
|
+
}
|
|
1001
|
+
selectClause += fieldSelections.join(",\n") + `
|
|
1002
|
+
from ${query.objectName}${parametersToSQLParams(parameters)} as main
|
|
1003
|
+
`;
|
|
1004
|
+
const [whereClause, groupbyClause, orderbyClause] = [queryFiltersToWhere(filters), aggregations.length ? fieldsToGroupbyClause(groupingFields) : "", sortingsToOrderBy(sortings)];
|
|
1005
|
+
const result = {
|
|
1006
|
+
objectName: query.objectName,
|
|
1007
|
+
objectType: query.objectType,
|
|
1008
|
+
sqlQuery: `${selectClause}${whereClause}${groupbyClause}${orderbyClause}`
|
|
1009
|
+
};
|
|
1010
|
+
if (query.limit !== void 0) result.limit = query.limit;
|
|
1011
|
+
return ok(result);
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
// src/core/adt/data_extraction/distinct.ts
|
|
943
1015
|
var MAX_ROW_COUNT = 5e4;
|
|
944
|
-
async function getDistinctValues(client, objectName, column, objectType = "view") {
|
|
1016
|
+
async function getDistinctValues(client, objectName, parameters, column, objectType = "view") {
|
|
945
1017
|
const columnName = column.toUpperCase();
|
|
946
|
-
const sqlQuery = `SELECT ${columnName} AS value, COUNT(*) AS
|
|
1018
|
+
const sqlQuery = `SELECT ${columnName} AS value, COUNT(*) AS ValueCount FROM ${objectName}${parametersToSQLParams(parameters)} GROUP BY ${columnName} ORDER BY ValueCount DESCENDING`;
|
|
947
1019
|
const [dataFrame, error] = await previewData(client, {
|
|
948
1020
|
objectName,
|
|
949
1021
|
objectType,
|
|
@@ -960,7 +1032,7 @@ async function getDistinctValues(client, objectName, column, objectType = "view"
|
|
|
960
1032
|
return ok({ column, values });
|
|
961
1033
|
}
|
|
962
1034
|
|
|
963
|
-
// src/core/adt/count.ts
|
|
1035
|
+
// src/core/adt/data_extraction/count.ts
|
|
964
1036
|
async function countRows(client, objectName, objectType) {
|
|
965
1037
|
const sqlQuery = `SELECT COUNT(*) AS count FROM ${objectName}`;
|
|
966
1038
|
const [dataFrame, error] = await previewData(client, {
|
|
@@ -983,7 +1055,7 @@ async function countRows(client, objectName, objectType) {
|
|
|
983
1055
|
return ok(count);
|
|
984
1056
|
}
|
|
985
1057
|
|
|
986
|
-
// src/core/adt/searchObjects.ts
|
|
1058
|
+
// src/core/adt/discovery/searchObjects.ts
|
|
987
1059
|
async function searchObjects(client, query, types) {
|
|
988
1060
|
const searchPattern = query || "*";
|
|
989
1061
|
const objectTypes = types && types.length > 0 ? types : getAllTypes();
|
|
@@ -1050,7 +1122,7 @@ function parseSearchResults(xml) {
|
|
|
1050
1122
|
return ok(results);
|
|
1051
1123
|
}
|
|
1052
1124
|
|
|
1053
|
-
// src/core/adt/whereUsed.ts
|
|
1125
|
+
// src/core/adt/discovery/whereUsed.ts
|
|
1054
1126
|
async function findWhereUsed(client, object) {
|
|
1055
1127
|
const config = getConfigByExtension(object.extension);
|
|
1056
1128
|
if (!config) {
|
|
@@ -1124,7 +1196,7 @@ function parseWhereUsed(xml) {
|
|
|
1124
1196
|
return ok(dependencies);
|
|
1125
1197
|
}
|
|
1126
1198
|
|
|
1127
|
-
// src/core/adt/createTransport.ts
|
|
1199
|
+
// src/core/adt/transports/createTransport.ts
|
|
1128
1200
|
async function createTransport(client, config) {
|
|
1129
1201
|
const body = dictToAbapXml({
|
|
1130
1202
|
DEVCLASS: config.package,
|
|
@@ -1155,7 +1227,7 @@ async function createTransport(client, config) {
|
|
|
1155
1227
|
return ok(transportId);
|
|
1156
1228
|
}
|
|
1157
1229
|
|
|
1158
|
-
// src/core/adt/gitDiff.ts
|
|
1230
|
+
// src/core/adt/craud/gitDiff.ts
|
|
1159
1231
|
import { diffArrays } from "diff";
|
|
1160
1232
|
function computeDiff(serverLines, localLines) {
|
|
1161
1233
|
const changes = diffArrays(serverLines, localLines);
|
|
@@ -2103,9 +2175,9 @@ var ADTClientImpl = class {
|
|
|
2103
2175
|
if (!this.state.session) return err(new Error("Not logged in"));
|
|
2104
2176
|
return previewData(this.requestor, query);
|
|
2105
2177
|
}
|
|
2106
|
-
async getDistinctValues(objectName, column, objectType = "view") {
|
|
2178
|
+
async getDistinctValues(objectName, parameters, column, objectType = "view") {
|
|
2107
2179
|
if (!this.state.session) return err(new Error("Not logged in"));
|
|
2108
|
-
return getDistinctValues(this.requestor, objectName, column, objectType);
|
|
2180
|
+
return getDistinctValues(this.requestor, objectName, parameters, column, objectType);
|
|
2109
2181
|
}
|
|
2110
2182
|
async countRows(objectName, objectType) {
|
|
2111
2183
|
if (!this.state.session) return err(new Error("Not logged in"));
|
|
@@ -2150,19 +2222,8 @@ function createClient(config) {
|
|
|
2150
2222
|
}
|
|
2151
2223
|
return ok(new ADTClientImpl(config));
|
|
2152
2224
|
}
|
|
2153
|
-
|
|
2154
|
-
// src/core/config.ts
|
|
2155
|
-
import { readFileSync } from "fs";
|
|
2156
|
-
import { z as z2 } from "zod";
|
|
2157
|
-
var systemConfigSchema = z2.record(
|
|
2158
|
-
z2.string(),
|
|
2159
|
-
z2.object({
|
|
2160
|
-
adt: z2.string().url().optional(),
|
|
2161
|
-
odata: z2.string().url().optional(),
|
|
2162
|
-
instance_num: z2.string().optional()
|
|
2163
|
-
})
|
|
2164
|
-
);
|
|
2165
2225
|
export {
|
|
2226
|
+
buildSQLQuery,
|
|
2166
2227
|
createClient,
|
|
2167
2228
|
err,
|
|
2168
2229
|
ok
|