arc-1 0.6.9 → 0.7.0
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/README.md +12 -9
- package/bin/arc1-cli.js +10 -0
- package/bin/arc1.js +1 -1
- package/dist/adt/abapgit.d.ts +39 -0
- package/dist/adt/abapgit.d.ts.map +1 -0
- package/dist/adt/abapgit.js +333 -0
- package/dist/adt/abapgit.js.map +1 -0
- package/dist/adt/cds-impact.d.ts +35 -0
- package/dist/adt/cds-impact.d.ts.map +1 -1
- package/dist/adt/cds-impact.js +71 -0
- package/dist/adt/cds-impact.js.map +1 -1
- package/dist/adt/client.d.ts +4 -1
- package/dist/adt/client.d.ts.map +1 -1
- package/dist/adt/client.js +18 -5
- package/dist/adt/client.js.map +1 -1
- package/dist/adt/config.d.ts +1 -0
- package/dist/adt/config.d.ts.map +1 -1
- package/dist/adt/config.js +1 -0
- package/dist/adt/config.js.map +1 -1
- package/dist/adt/crud.d.ts.map +1 -1
- package/dist/adt/crud.js +74 -8
- package/dist/adt/crud.js.map +1 -1
- package/dist/adt/devtools.d.ts +39 -3
- package/dist/adt/devtools.d.ts.map +1 -1
- package/dist/adt/devtools.js +237 -25
- package/dist/adt/devtools.js.map +1 -1
- package/dist/adt/diagnostics.d.ts +69 -7
- package/dist/adt/diagnostics.d.ts.map +1 -1
- package/dist/adt/diagnostics.js +694 -36
- package/dist/adt/diagnostics.js.map +1 -1
- package/dist/adt/errors.d.ts +36 -2
- package/dist/adt/errors.d.ts.map +1 -1
- package/dist/adt/errors.js +111 -11
- package/dist/adt/errors.js.map +1 -1
- package/dist/adt/features.d.ts.map +1 -1
- package/dist/adt/features.js +3 -0
- package/dist/adt/features.js.map +1 -1
- package/dist/adt/gcts.d.ts +68 -0
- package/dist/adt/gcts.d.ts.map +1 -0
- package/dist/adt/gcts.js +239 -0
- package/dist/adt/gcts.js.map +1 -0
- package/dist/adt/http.d.ts.map +1 -1
- package/dist/adt/http.js +86 -1
- package/dist/adt/http.js.map +1 -1
- package/dist/adt/rap-handlers.d.ts +165 -0
- package/dist/adt/rap-handlers.d.ts.map +1 -0
- package/dist/adt/rap-handlers.js +835 -0
- package/dist/adt/rap-handlers.js.map +1 -0
- package/dist/adt/rap-preflight.d.ts +43 -0
- package/dist/adt/rap-preflight.d.ts.map +1 -0
- package/dist/adt/rap-preflight.js +405 -0
- package/dist/adt/rap-preflight.js.map +1 -0
- package/dist/adt/safety.d.ts +60 -33
- package/dist/adt/safety.d.ts.map +1 -1
- package/dist/adt/safety.js +204 -113
- package/dist/adt/safety.js.map +1 -1
- package/dist/adt/transport.d.ts +1 -1
- package/dist/adt/transport.d.ts.map +1 -1
- package/dist/adt/transport.js +6 -3
- package/dist/adt/transport.js.map +1 -1
- package/dist/adt/types.d.ts +225 -0
- package/dist/adt/types.d.ts.map +1 -1
- package/dist/adt/xml-parser.d.ts +15 -1
- package/dist/adt/xml-parser.d.ts.map +1 -1
- package/dist/adt/xml-parser.js +28 -15
- package/dist/adt/xml-parser.js.map +1 -1
- package/dist/authz/policy.d.ts +53 -0
- package/dist/authz/policy.d.ts.map +1 -0
- package/dist/authz/policy.js +199 -0
- package/dist/authz/policy.js.map +1 -0
- package/dist/cli-args.d.ts +14 -0
- package/dist/cli-args.d.ts.map +1 -0
- package/dist/cli-args.js +62 -0
- package/dist/cli-args.js.map +1 -0
- package/dist/cli.d.ts +13 -7
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +252 -55
- package/dist/cli.js.map +1 -1
- package/dist/extract-sap-cookies.d.ts +24 -0
- package/dist/extract-sap-cookies.d.ts.map +1 -0
- package/dist/extract-sap-cookies.js +317 -0
- package/dist/extract-sap-cookies.js.map +1 -0
- package/dist/handlers/hyperfocused.d.ts +4 -3
- package/dist/handlers/hyperfocused.d.ts.map +1 -1
- package/dist/handlers/hyperfocused.js +25 -16
- package/dist/handlers/hyperfocused.js.map +1 -1
- package/dist/handlers/intent.d.ts +4 -12
- package/dist/handlers/intent.d.ts.map +1 -1
- package/dist/handlers/intent.js +1448 -89
- package/dist/handlers/intent.js.map +1 -1
- package/dist/handlers/schemas.d.ts +83 -11
- package/dist/handlers/schemas.d.ts.map +1 -1
- package/dist/handlers/schemas.js +115 -4
- package/dist/handlers/schemas.js.map +1 -1
- package/dist/handlers/tools.d.ts +4 -3
- package/dist/handlers/tools.d.ts.map +1 -1
- package/dist/handlers/tools.js +342 -143
- package/dist/handlers/tools.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7 -6
- package/dist/index.js.map +1 -1
- package/dist/probe/catalog.d.ts +30 -0
- package/dist/probe/catalog.d.ts.map +1 -0
- package/dist/probe/catalog.js +196 -0
- package/dist/probe/catalog.js.map +1 -0
- package/dist/probe/fixtures.d.ts +54 -0
- package/dist/probe/fixtures.d.ts.map +1 -0
- package/dist/probe/fixtures.js +94 -0
- package/dist/probe/fixtures.js.map +1 -0
- package/dist/probe/format.d.ts +10 -0
- package/dist/probe/format.d.ts.map +1 -0
- package/dist/probe/format.js +114 -0
- package/dist/probe/format.js.map +1 -0
- package/dist/probe/quality.d.ts +13 -0
- package/dist/probe/quality.d.ts.map +1 -0
- package/dist/probe/quality.js +50 -0
- package/dist/probe/quality.js.map +1 -0
- package/dist/probe/runner.d.ts +48 -0
- package/dist/probe/runner.d.ts.map +1 -0
- package/dist/probe/runner.js +211 -0
- package/dist/probe/runner.js.map +1 -0
- package/dist/probe/types.d.ts +159 -0
- package/dist/probe/types.d.ts.map +1 -0
- package/dist/probe/types.js +11 -0
- package/dist/probe/types.js.map +1 -0
- package/dist/server/audit.d.ts +26 -3
- package/dist/server/audit.d.ts.map +1 -1
- package/dist/server/audit.js +12 -1
- package/dist/server/audit.js.map +1 -1
- package/dist/server/config.d.ts +34 -19
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +327 -187
- package/dist/server/config.js.map +1 -1
- package/dist/server/deny-actions.d.ts +31 -0
- package/dist/server/deny-actions.d.ts.map +1 -0
- package/dist/server/deny-actions.js +156 -0
- package/dist/server/deny-actions.js.map +1 -0
- package/dist/server/effective-policy-log.d.ts +27 -0
- package/dist/server/effective-policy-log.d.ts.map +1 -0
- package/dist/server/effective-policy-log.js +103 -0
- package/dist/server/effective-policy-log.js.map +1 -0
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +15 -16
- package/dist/server/http.js.map +1 -1
- package/dist/server/server.d.ts +38 -4
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +234 -31
- package/dist/server/server.js.map +1 -1
- package/dist/server/types.d.ts +31 -13
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +11 -10
- package/dist/server/types.js.map +1 -1
- package/dist/server/xsuaa.d.ts +1 -2
- package/dist/server/xsuaa.d.ts.map +1 -1
- package/dist/server/xsuaa.js +13 -14
- package/dist/server/xsuaa.js.map +1 -1
- package/package.json +9 -3
package/README.md
CHANGED
|
@@ -14,12 +14,13 @@ Built for organizations that need AI-assisted SAP development with guardrails. I
|
|
|
14
14
|
|
|
15
15
|
### Security & Admin Controls
|
|
16
16
|
|
|
17
|
-
- **Safe by default** — read-only, no free SQL, no table preview, no
|
|
18
|
-
- **
|
|
17
|
+
- **Safe by default** — read-only, no free SQL, no table preview, no transport writes, no Git writes. Enable each capability with explicit `SAP_ALLOW_*` flags
|
|
18
|
+
- **Action deny list** — block specific tool actions with `SAP_DENY_ACTIONS` (for example `SAPWrite.delete`), without exposing low-level operation codes to admins
|
|
19
19
|
- **Package restrictions** — limit AI write operations (create, update, delete) to specific packages with wildcards (`--allowed-packages "Z*,$TMP"`). Read operations are not restricted by package — use SAP's native authorization for read-level access control
|
|
20
|
-
- **Data access control** — enable table data preview (`--
|
|
21
|
-
- **Transport safety** —
|
|
22
|
-
- **
|
|
20
|
+
- **Data access control** — enable table data preview (`--allow-data-preview=true`) or free-form SQL (`--allow-free-sql=true`) only when needed
|
|
21
|
+
- **Transport safety** — transport reads are available for review, while transport mutations require both `--allow-writes` and `--allow-transport-writes`. Update/delete operations auto-use the lock correction number when no explicit transport is provided
|
|
22
|
+
- **Git workflow safety** — Git operations are disabled by default. Enable explicitly with `--allow-git-writes` / `SAP_ALLOW_GIT_WRITES=true`
|
|
23
|
+
- **API-key profiles** — multi-key HTTP deployments can assign `viewer`, `viewer-data`, `viewer-sql`, `developer`, `developer-data`, `developer-sql`, or `admin` per key
|
|
23
24
|
- **Writes restricted to `$TMP` when enabled** — only local/throwaway objects; writing to transportable packages requires explicit `--allowed-packages`
|
|
24
25
|
|
|
25
26
|
### Authentication
|
|
@@ -42,7 +43,7 @@ Deploy ARC-1 as a Cloud Foundry app on SAP BTP with full platform integration:
|
|
|
42
43
|
|
|
43
44
|
### Token Efficiency
|
|
44
45
|
|
|
45
|
-
- **
|
|
46
|
+
- **12 intent-based tools** (~5K schema tokens) instead of 200+ individual tools — keeps the LLM's context window small
|
|
46
47
|
- **Method-level read/edit** — read or update a single class method, not the whole source (up to 20x fewer tokens)
|
|
47
48
|
- **Context compression** — `SAPContext` returns public API contracts of all dependencies in one call (7-30x compression)
|
|
48
49
|
|
|
@@ -66,7 +67,7 @@ See **[docs/caching.md](docs/caching.md)** for full documentation.
|
|
|
66
67
|
|
|
67
68
|
### Tools Refined for Real-World Usage
|
|
68
69
|
|
|
69
|
-
The
|
|
70
|
+
The 12 tools are designed from real LLM interaction feedback:
|
|
70
71
|
|
|
71
72
|
| Tool | What it does |
|
|
72
73
|
|------|-------------|
|
|
@@ -77,6 +78,7 @@ The 11 tools are designed from real LLM interaction feedback:
|
|
|
77
78
|
| **SAPNavigate** | Go-to-definition, find references, code completion |
|
|
78
79
|
| **SAPQuery** | Execute ABAP SQL with table-not-found suggestions |
|
|
79
80
|
| **SAPTransport** | CTS transport management (list/create/release/delete/reassign), transport requirement checks, and reverse lookup history (`action="history"`) |
|
|
81
|
+
| **SAPGit** | Git-based ABAP workflows across gCTS and abapGit (list/clone/pull/push/commit/branch/unlink) with backend auto-selection and safety gating (`--allow-git-writes`) |
|
|
80
82
|
| **SAPContext** | Compressed dependency context (`action="deps"`), reverse dependency lookup (`action="usages"`), and CDS upstream/downstream impact analysis (`action="impact"` for DDLS) |
|
|
81
83
|
| **SAPLint** | Local ABAP lint (system-aware presets, auto-fix, pre-write validation) + ADT PrettyPrint (server-side formatting) |
|
|
82
84
|
| **SAPDiagnose** | Syntax check, ABAP Unit tests, ATC code quality, short dumps, profiler traces |
|
|
@@ -88,10 +90,11 @@ Tool definitions automatically adapt to the target system (BTP vs on-premise), r
|
|
|
88
90
|
|
|
89
91
|
ARC-1 probes the SAP system at startup and adapts its behavior:
|
|
90
92
|
|
|
91
|
-
- Detects HANA, abapGit, RAP/CDS, AMDP, UI5, and transport availability
|
|
93
|
+
- Detects HANA, gCTS, abapGit, RAP/CDS, AMDP, UI5, and transport availability
|
|
92
94
|
- Auto-detects BTP vs on-premise systems
|
|
93
95
|
- Maps SAP_BASIS release to the correct ABAP language version
|
|
94
96
|
- Each feature can be forced on/off or left on auto-detect
|
|
97
|
+
- In shared-credential mode (technical user), runs a startup auth preflight once and blocks SAP tool calls with a clear error on 401/403 to avoid repeated failed logins and potential user lockout
|
|
95
98
|
|
|
96
99
|
## Quick Start
|
|
97
100
|
|
|
@@ -115,7 +118,7 @@ Full documentation is available at **[marianfoo.github.io/arc-1](https://marianf
|
|
|
115
118
|
| [Configuration](https://marianfoo.github.io/arc-1/configuration-reference/) | Every flag and env var, one table |
|
|
116
119
|
| [Updating](https://marianfoo.github.io/arc-1/updating/) | Update procedures per install method |
|
|
117
120
|
| [Enterprise Auth](https://marianfoo.github.io/arc-1/enterprise-auth/) | Layer A / Layer B auth internals, coexistence matrix |
|
|
118
|
-
| [Tool Reference](https://marianfoo.github.io/arc-1/tools/) | Complete reference for all
|
|
121
|
+
| [Tool Reference](https://marianfoo.github.io/arc-1/tools/) | Complete reference for all 12 tools |
|
|
119
122
|
| [Architecture](https://marianfoo.github.io/arc-1/architecture/) | System architecture with diagrams |
|
|
120
123
|
| [AI Usage Patterns](https://marianfoo.github.io/arc-1/mcp-usage/) | Agent workflow patterns and best practices |
|
|
121
124
|
|
package/bin/arc1-cli.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// ARC-1 CLI — direct tool invocation entry point
|
|
4
|
+
// Delegates to compiled TypeScript (dist/cli.js).
|
|
5
|
+
//
|
|
6
|
+
// This bin is separate from `arc1` because the MCP server entry (`bin/arc1.js` → dist/index.js)
|
|
7
|
+
// must own stdin/stdout cleanly for the JSON-RPC stream. `arc1-cli` is for command-line use
|
|
8
|
+
// (read, activate, syntax, call, extract-cookies, …) and exits after a single invocation.
|
|
9
|
+
|
|
10
|
+
import('../dist/cli.js');
|
package/bin/arc1.js
CHANGED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* abapGit ADT bridge client helpers.
|
|
3
|
+
*
|
|
4
|
+
* Bridge endpoints live under /sap/bc/adt/abapgit/* and use XML payloads.
|
|
5
|
+
*/
|
|
6
|
+
import type { AdtHttpClient } from './http.js';
|
|
7
|
+
import { type SafetyConfig } from './safety.js';
|
|
8
|
+
import type { AbapGitExternalInfo, AbapGitObject, AbapGitRepo, AbapGitStaging } from './types.js';
|
|
9
|
+
export declare function parseAbapGitRepos(xml: string): AbapGitRepo[];
|
|
10
|
+
export declare function parseAbapGitExternalInfo(xml: string): AbapGitExternalInfo;
|
|
11
|
+
export declare function parseAbapGitObjects(xml: string): AbapGitObject[];
|
|
12
|
+
export declare function listRepos(http: AdtHttpClient, safety: SafetyConfig): Promise<AbapGitRepo[]>;
|
|
13
|
+
export declare function getExternalInfo(http: AdtHttpClient, safety: SafetyConfig, url: string, user?: string, password?: string): Promise<AbapGitExternalInfo>;
|
|
14
|
+
export declare function createRepo(http: AdtHttpClient, safety: SafetyConfig, params: {
|
|
15
|
+
package: string;
|
|
16
|
+
url: string;
|
|
17
|
+
branchName?: string;
|
|
18
|
+
transportRequest?: string;
|
|
19
|
+
user?: string;
|
|
20
|
+
password?: string;
|
|
21
|
+
}): Promise<AbapGitRepo[]>;
|
|
22
|
+
export declare function pullRepo(http: AdtHttpClient, safety: SafetyConfig, repoId: string, params?: {
|
|
23
|
+
package?: string;
|
|
24
|
+
url?: string;
|
|
25
|
+
branchName?: string;
|
|
26
|
+
transportRequest?: string;
|
|
27
|
+
user?: string;
|
|
28
|
+
password?: string;
|
|
29
|
+
}): Promise<AbapGitObject[]>;
|
|
30
|
+
export declare function unlinkRepo(http: AdtHttpClient, safety: SafetyConfig, repoId: string): Promise<void>;
|
|
31
|
+
export declare function stageRepo(http: AdtHttpClient, safety: SafetyConfig, repo: AbapGitRepo): Promise<AbapGitStaging>;
|
|
32
|
+
export declare function pushRepo(http: AdtHttpClient, safety: SafetyConfig, repo: AbapGitRepo, staging: AbapGitStaging): Promise<void>;
|
|
33
|
+
export declare function checkRepo(http: AdtHttpClient, safety: SafetyConfig, repo: AbapGitRepo): Promise<{
|
|
34
|
+
ok: boolean;
|
|
35
|
+
message: string | null;
|
|
36
|
+
}>;
|
|
37
|
+
export declare function switchBranch(http: AdtHttpClient, safety: SafetyConfig, repoId: string, branch: string, create?: boolean): Promise<void>;
|
|
38
|
+
export declare function createBranch(http: AdtHttpClient, safety: SafetyConfig, repoId: string, branch: string): Promise<void>;
|
|
39
|
+
//# sourceMappingURL=abapgit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abapgit.d.ts","sourceRoot":"","sources":["../../src/adt/abapgit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* abapGit ADT bridge client helpers.
|
|
3
|
+
*
|
|
4
|
+
* Bridge endpoints live under /sap/bc/adt/abapgit/* and use XML payloads.
|
|
5
|
+
*/
|
|
6
|
+
import { AdtApiError, classifyAbapgitError } from './errors.js';
|
|
7
|
+
import { checkGit, checkOperation, checkPackage, OperationType } from './safety.js';
|
|
8
|
+
import { escapeXmlAttr, findDeepNodes, parseXml } from './xml-parser.js';
|
|
9
|
+
const ABAPGIT_BASE = '/sap/bc/adt/abapgit';
|
|
10
|
+
const REPOS_V2 = 'application/abapgit.adt.repos.v2+xml';
|
|
11
|
+
const REPO_V3 = 'application/abapgit.adt.repo.v3+xml';
|
|
12
|
+
const REPO_STAGE_V1 = 'application/abapgit.adt.repo.stage.v1+xml';
|
|
13
|
+
const EXTERNAL_INFO_REQUEST_V2 = 'application/abapgit.adt.repo.info.ext.request.v2+xml';
|
|
14
|
+
const EXTERNAL_INFO_RESPONSE_V2 = 'application/abapgit.adt.repo.info.ext.response.v2+xml';
|
|
15
|
+
function boolish(value) {
|
|
16
|
+
if (value === true || value === false)
|
|
17
|
+
return value;
|
|
18
|
+
const norm = String(value ?? '')
|
|
19
|
+
.trim()
|
|
20
|
+
.toLowerCase();
|
|
21
|
+
if (!norm)
|
|
22
|
+
return undefined;
|
|
23
|
+
if (norm === 'true' || norm === 'x' || norm === '1')
|
|
24
|
+
return true;
|
|
25
|
+
if (norm === 'false' || norm === '0')
|
|
26
|
+
return false;
|
|
27
|
+
return undefined;
|
|
28
|
+
}
|
|
29
|
+
function field(node, ...keys) {
|
|
30
|
+
for (const key of keys) {
|
|
31
|
+
const attr = node[`@_${key}`];
|
|
32
|
+
if (attr !== undefined && attr !== null && String(attr).trim() !== '')
|
|
33
|
+
return String(attr);
|
|
34
|
+
const direct = node[key];
|
|
35
|
+
if (typeof direct === 'string' && direct.trim() !== '')
|
|
36
|
+
return direct;
|
|
37
|
+
if (typeof direct === 'object' && direct !== null) {
|
|
38
|
+
const text = direct['#text'];
|
|
39
|
+
if (typeof text === 'string' && text.trim() !== '')
|
|
40
|
+
return text;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
function encodePassword(password) {
|
|
46
|
+
return Buffer.from(password, 'utf-8').toString('base64');
|
|
47
|
+
}
|
|
48
|
+
function authHeaders(user, password) {
|
|
49
|
+
if (!user || !password)
|
|
50
|
+
return {};
|
|
51
|
+
return {
|
|
52
|
+
Username: user,
|
|
53
|
+
Password: encodePassword(password),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
function absolutizeLink(href) {
|
|
57
|
+
if (/^https?:\/\//i.test(href)) {
|
|
58
|
+
const u = new URL(href);
|
|
59
|
+
return `${u.pathname}${u.search}`;
|
|
60
|
+
}
|
|
61
|
+
if (href.startsWith('/'))
|
|
62
|
+
return href;
|
|
63
|
+
return `${ABAPGIT_BASE}/${href}`;
|
|
64
|
+
}
|
|
65
|
+
function findRepoLink(repo, type) {
|
|
66
|
+
const relNeedle = type.replace('_link', '');
|
|
67
|
+
const link = repo.links.find((candidate) => {
|
|
68
|
+
const rel = candidate.rel.toLowerCase();
|
|
69
|
+
const href = candidate.href.toLowerCase();
|
|
70
|
+
const candidateType = (candidate.type ?? '').toLowerCase();
|
|
71
|
+
if (candidateType === type)
|
|
72
|
+
return true;
|
|
73
|
+
if (rel.endsWith(`/${relNeedle}`) || rel.includes(`/${relNeedle}/`))
|
|
74
|
+
return true;
|
|
75
|
+
if (relNeedle === 'check') {
|
|
76
|
+
if (rel.endsWith('/checks') || rel.includes('/checks/'))
|
|
77
|
+
return true;
|
|
78
|
+
if (href.endsWith('/checks') || href.includes('/checks/'))
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
return href.endsWith(`/${relNeedle}`) || href.includes(`/${relNeedle}/`);
|
|
82
|
+
});
|
|
83
|
+
if (!link) {
|
|
84
|
+
throw new Error(`abapGit repository ${repo.key} does not expose a ${type} HATEOAS link.`);
|
|
85
|
+
}
|
|
86
|
+
return {
|
|
87
|
+
...link,
|
|
88
|
+
href: absolutizeLink(link.href),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
function parseAbapGitLinks(node) {
|
|
92
|
+
const links = findDeepNodes(node, 'link');
|
|
93
|
+
return links
|
|
94
|
+
.map((link) => ({
|
|
95
|
+
rel: field(link, 'rel') ?? '',
|
|
96
|
+
href: field(link, 'href') ?? '',
|
|
97
|
+
type: field(link, 'type'),
|
|
98
|
+
title: field(link, 'title'),
|
|
99
|
+
}))
|
|
100
|
+
.filter((link) => Boolean(link.rel) && Boolean(link.href));
|
|
101
|
+
}
|
|
102
|
+
export function parseAbapGitRepos(xml) {
|
|
103
|
+
const parsed = parseXml(xml);
|
|
104
|
+
const repositories = findDeepNodes(parsed, 'repository');
|
|
105
|
+
return repositories
|
|
106
|
+
.map((repo) => {
|
|
107
|
+
const links = parseAbapGitLinks(repo);
|
|
108
|
+
const writeProtected = boolish(field(repo, 'writeProtected', 'write_protected'));
|
|
109
|
+
return {
|
|
110
|
+
key: field(repo, 'key', 'repoKey', 'id') ?? '',
|
|
111
|
+
package: field(repo, 'package', 'packageName') ?? '',
|
|
112
|
+
url: field(repo, 'url') ?? '',
|
|
113
|
+
branchName: field(repo, 'branchName', 'branch_name', 'branch') ?? '',
|
|
114
|
+
selectedBranch: field(repo, 'selectedBranch', 'selected_branch'),
|
|
115
|
+
deserializedBy: field(repo, 'deserializedBy', 'deserialized_by'),
|
|
116
|
+
...(writeProtected !== undefined ? { writeProtected } : {}),
|
|
117
|
+
createdBy: field(repo, 'createdBy', 'created_by'),
|
|
118
|
+
createdAt: field(repo, 'createdAt', 'created_at'),
|
|
119
|
+
dotAbapGit: field(repo, 'dotAbapGit', 'dot_abapgit'),
|
|
120
|
+
links,
|
|
121
|
+
};
|
|
122
|
+
})
|
|
123
|
+
.filter((repo) => repo.key && repo.package && repo.url);
|
|
124
|
+
}
|
|
125
|
+
export function parseAbapGitExternalInfo(xml) {
|
|
126
|
+
const parsed = parseXml(xml);
|
|
127
|
+
const infoNode = findDeepNodes(parsed, 'externalRepoInfo')[0] ?? parsed;
|
|
128
|
+
const branches = findDeepNodes(infoNode, 'branch').map((branch) => {
|
|
129
|
+
const name = field(branch, 'name', 'branchName', 'displayName') ?? '';
|
|
130
|
+
return {
|
|
131
|
+
name,
|
|
132
|
+
isHead: boolish(field(branch, 'head', 'isHead')),
|
|
133
|
+
sha1: field(branch, 'sha1', 'hash'),
|
|
134
|
+
};
|
|
135
|
+
});
|
|
136
|
+
const userNode = findDeepNodes(infoNode, 'user')[0];
|
|
137
|
+
const user = userNode
|
|
138
|
+
? {
|
|
139
|
+
name: field(userNode, 'name', 'user'),
|
|
140
|
+
email: field(userNode, 'email', 'mail'),
|
|
141
|
+
}
|
|
142
|
+
: undefined;
|
|
143
|
+
return {
|
|
144
|
+
accessMode: field(infoNode, 'accessMode', 'access_mode'),
|
|
145
|
+
defaultBranch: field(infoNode, 'defaultBranch', 'default_branch'),
|
|
146
|
+
selectedBranch: field(infoNode, 'selectedBranch', 'selected_branch'),
|
|
147
|
+
branches: branches.filter((branch) => branch.name),
|
|
148
|
+
...(user ? { user } : {}),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
export function parseAbapGitObjects(xml) {
|
|
152
|
+
const parsed = parseXml(xml);
|
|
153
|
+
const objectNodes = findDeepNodes(parsed, 'object');
|
|
154
|
+
return objectNodes.map((node) => ({
|
|
155
|
+
type: field(node, 'type'),
|
|
156
|
+
name: field(node, 'name'),
|
|
157
|
+
package: field(node, 'package', 'packageName'),
|
|
158
|
+
path: field(node, 'path'),
|
|
159
|
+
state: field(node, 'state'),
|
|
160
|
+
operation: field(node, 'operation'),
|
|
161
|
+
}));
|
|
162
|
+
}
|
|
163
|
+
async function requestAbapGit(path, run) {
|
|
164
|
+
try {
|
|
165
|
+
return await run();
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
if (err instanceof AdtApiError) {
|
|
169
|
+
const parsed = classifyAbapgitError(err.responseBody ?? '');
|
|
170
|
+
if (parsed.message || parsed.namespace) {
|
|
171
|
+
const detail = [parsed.namespace ? `[${parsed.namespace}]` : undefined, parsed.message]
|
|
172
|
+
.filter(Boolean)
|
|
173
|
+
.join(' ');
|
|
174
|
+
throw new AdtApiError(detail, err.statusCode, err.path || path, err.responseBody);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
throw err;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function buildRepoPayloadXml(params) {
|
|
181
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
182
|
+
<abapgitrepo:repository xmlns:abapgitrepo="http://www.sap.com/adt/abapgit/repository">
|
|
183
|
+
<abapgitrepo:package>${escapeXmlAttr(params.package)}</abapgitrepo:package>
|
|
184
|
+
<abapgitrepo:url>${escapeXmlAttr(params.url)}</abapgitrepo:url>
|
|
185
|
+
${params.branchName ? `<abapgitrepo:branchName>${escapeXmlAttr(params.branchName)}</abapgitrepo:branchName>` : ''}
|
|
186
|
+
${params.transportRequest ? `<abapgitrepo:transportRequest>${escapeXmlAttr(params.transportRequest)}</abapgitrepo:transportRequest>` : ''}
|
|
187
|
+
${params.user ? `<abapgitrepo:remoteUser>${escapeXmlAttr(params.user)}</abapgitrepo:remoteUser>` : ''}
|
|
188
|
+
${params.password ? `<abapgitrepo:remotePassword>${escapeXmlAttr(params.password)}</abapgitrepo:remotePassword>` : ''}
|
|
189
|
+
</abapgitrepo:repository>`;
|
|
190
|
+
}
|
|
191
|
+
function buildExternalInfoRequestXml(url, user, password) {
|
|
192
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
193
|
+
<abapgitexternalrepo:externalRepoInfoRequest xmlns:abapgitexternalrepo="http://www.sap.com/adt/abapgit/externalRepo">
|
|
194
|
+
<abapgitexternalrepo:url>${escapeXmlAttr(url)}</abapgitexternalrepo:url>
|
|
195
|
+
${user ? `<abapgitexternalrepo:remoteUser>${escapeXmlAttr(user)}</abapgitexternalrepo:remoteUser>` : ''}
|
|
196
|
+
${password ? `<abapgitexternalrepo:remotePassword>${escapeXmlAttr(password)}</abapgitexternalrepo:remotePassword>` : ''}
|
|
197
|
+
</abapgitexternalrepo:externalRepoInfoRequest>`;
|
|
198
|
+
}
|
|
199
|
+
function buildStagingPayloadXml(staging) {
|
|
200
|
+
const objects = (staging.objects ?? [])
|
|
201
|
+
.map((object) => {
|
|
202
|
+
const attrs = [
|
|
203
|
+
object.type ? `type="${escapeXmlAttr(object.type)}"` : '',
|
|
204
|
+
object.name ? `name="${escapeXmlAttr(object.name)}"` : '',
|
|
205
|
+
object.package ? `package="${escapeXmlAttr(object.package)}"` : '',
|
|
206
|
+
object.path ? `path="${escapeXmlAttr(object.path)}"` : '',
|
|
207
|
+
object.state ? `state="${escapeXmlAttr(object.state)}"` : '',
|
|
208
|
+
object.operation ? `operation="${escapeXmlAttr(object.operation)}"` : '',
|
|
209
|
+
]
|
|
210
|
+
.filter(Boolean)
|
|
211
|
+
.join(' ');
|
|
212
|
+
return ` <abapgitrepo:object ${attrs}/>`;
|
|
213
|
+
})
|
|
214
|
+
.join('\n');
|
|
215
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
216
|
+
<abapgitrepo:objects xmlns:abapgitrepo="http://www.sap.com/adt/abapgit/repository">
|
|
217
|
+
${objects}
|
|
218
|
+
</abapgitrepo:objects>`;
|
|
219
|
+
}
|
|
220
|
+
export async function listRepos(http, safety) {
|
|
221
|
+
checkOperation(safety, OperationType.Read, 'AbapGitListRepos');
|
|
222
|
+
const path = `${ABAPGIT_BASE}/repos`;
|
|
223
|
+
const resp = await requestAbapGit(path, () => http.get(path, { Accept: REPOS_V2 }));
|
|
224
|
+
return parseAbapGitRepos(resp.body);
|
|
225
|
+
}
|
|
226
|
+
export async function getExternalInfo(http, safety, url, user, password) {
|
|
227
|
+
checkOperation(safety, OperationType.Read, 'AbapGitExternalInfo');
|
|
228
|
+
const path = `${ABAPGIT_BASE}/externalrepoinfo`;
|
|
229
|
+
const body = buildExternalInfoRequestXml(url, user, password);
|
|
230
|
+
const resp = await requestAbapGit(path, () => http.post(path, body, EXTERNAL_INFO_REQUEST_V2, {
|
|
231
|
+
Accept: EXTERNAL_INFO_RESPONSE_V2,
|
|
232
|
+
...authHeaders(user, password),
|
|
233
|
+
}));
|
|
234
|
+
return parseAbapGitExternalInfo(resp.body);
|
|
235
|
+
}
|
|
236
|
+
export async function createRepo(http, safety, params) {
|
|
237
|
+
checkOperation(safety, OperationType.Create, 'AbapGitCreateRepo');
|
|
238
|
+
checkGit(safety, 'clone');
|
|
239
|
+
checkPackage(safety, params.package);
|
|
240
|
+
const path = `${ABAPGIT_BASE}/repos`;
|
|
241
|
+
const body = buildRepoPayloadXml(params);
|
|
242
|
+
const resp = await requestAbapGit(path, () => http.post(path, body, REPO_V3, {
|
|
243
|
+
Accept: REPO_V3,
|
|
244
|
+
...authHeaders(params.user, params.password),
|
|
245
|
+
}));
|
|
246
|
+
return parseAbapGitRepos(resp.body);
|
|
247
|
+
}
|
|
248
|
+
export async function pullRepo(http, safety, repoId, params = {}) {
|
|
249
|
+
checkOperation(safety, OperationType.Update, 'AbapGitPullRepo');
|
|
250
|
+
checkGit(safety, 'pull');
|
|
251
|
+
const path = `${ABAPGIT_BASE}/repos/${encodeURIComponent(repoId)}/pull`;
|
|
252
|
+
const body = buildRepoPayloadXml({
|
|
253
|
+
package: params.package ?? '$TMP',
|
|
254
|
+
url: params.url ?? '',
|
|
255
|
+
branchName: params.branchName,
|
|
256
|
+
transportRequest: params.transportRequest,
|
|
257
|
+
user: params.user,
|
|
258
|
+
password: params.password,
|
|
259
|
+
});
|
|
260
|
+
const resp = await requestAbapGit(path, () => http.post(path, body, REPO_V3, {
|
|
261
|
+
Accept: REPO_STAGE_V1,
|
|
262
|
+
...authHeaders(params.user, params.password),
|
|
263
|
+
}));
|
|
264
|
+
return parseAbapGitObjects(resp.body);
|
|
265
|
+
}
|
|
266
|
+
export async function unlinkRepo(http, safety, repoId) {
|
|
267
|
+
checkOperation(safety, OperationType.Delete, 'AbapGitUnlinkRepo');
|
|
268
|
+
checkGit(safety, 'unlink');
|
|
269
|
+
const path = `${ABAPGIT_BASE}/repos/${encodeURIComponent(repoId)}`;
|
|
270
|
+
await requestAbapGit(path, () => http.delete(path, { Accept: REPO_V3 }));
|
|
271
|
+
}
|
|
272
|
+
export async function stageRepo(http, safety, repo) {
|
|
273
|
+
checkOperation(safety, OperationType.Update, 'AbapGitStageRepo');
|
|
274
|
+
checkGit(safety, 'stage');
|
|
275
|
+
const link = findRepoLink(repo, 'stage_link');
|
|
276
|
+
const resp = await requestAbapGit(link.href, () => http.get(link.href, {
|
|
277
|
+
Accept: REPO_STAGE_V1,
|
|
278
|
+
'Content-Type': REPO_STAGE_V1,
|
|
279
|
+
}));
|
|
280
|
+
const objects = parseAbapGitObjects(resp.body).map((object) => object);
|
|
281
|
+
return {
|
|
282
|
+
repoKey: repo.key,
|
|
283
|
+
branchName: repo.branchName,
|
|
284
|
+
objects,
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
export async function pushRepo(http, safety, repo, staging) {
|
|
288
|
+
checkOperation(safety, OperationType.Update, 'AbapGitPushRepo');
|
|
289
|
+
checkGit(safety, 'push');
|
|
290
|
+
const link = findRepoLink(repo, 'push_link');
|
|
291
|
+
const body = buildStagingPayloadXml(staging);
|
|
292
|
+
await requestAbapGit(link.href, () => http.post(link.href, body, REPO_STAGE_V1, {
|
|
293
|
+
Accept: REPO_STAGE_V1,
|
|
294
|
+
}));
|
|
295
|
+
}
|
|
296
|
+
export async function checkRepo(http, safety, repo) {
|
|
297
|
+
checkOperation(safety, OperationType.Read, 'AbapGitCheckRepo');
|
|
298
|
+
const link = findRepoLink(repo, 'check_link');
|
|
299
|
+
// Live trial returns 5xx with `<namespace id="org.abapgit.adt"/>` + message like
|
|
300
|
+
// "HTTP error 421" when the remote Git registry is unreachable. That's diagnostic
|
|
301
|
+
// info the LLM should see — normalise to {ok:false,message} rather than throwing.
|
|
302
|
+
let resp;
|
|
303
|
+
try {
|
|
304
|
+
resp = await http.post(link.href, '', undefined, { Accept: REPO_V3 });
|
|
305
|
+
}
|
|
306
|
+
catch (err) {
|
|
307
|
+
if (err instanceof AdtApiError) {
|
|
308
|
+
const parsed = classifyAbapgitError(err.responseBody ?? '');
|
|
309
|
+
if (parsed.namespace === 'org.abapgit.adt') {
|
|
310
|
+
return { ok: false, message: parsed.message ?? AdtApiError.extractCleanMessage(err.responseBody ?? '') };
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
throw err;
|
|
314
|
+
}
|
|
315
|
+
if (!resp.body || resp.body.trim().length === 0) {
|
|
316
|
+
return { ok: true, message: null };
|
|
317
|
+
}
|
|
318
|
+
const parsed = classifyAbapgitError(resp.body);
|
|
319
|
+
return {
|
|
320
|
+
ok: false,
|
|
321
|
+
message: parsed.message ?? AdtApiError.extractCleanMessage(resp.body),
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
export async function switchBranch(http, safety, repoId, branch, create = false) {
|
|
325
|
+
checkOperation(safety, OperationType.Update, 'AbapGitSwitchBranch');
|
|
326
|
+
checkGit(safety, create ? 'create_branch' : 'switch_branch');
|
|
327
|
+
const path = `${ABAPGIT_BASE}/repos/${encodeURIComponent(repoId)}/branches/${encodeURIComponent(branch)}?create=${create ? 'true' : 'false'}`;
|
|
328
|
+
await requestAbapGit(path, () => http.post(path, '', undefined, { Accept: REPO_V3 }));
|
|
329
|
+
}
|
|
330
|
+
export async function createBranch(http, safety, repoId, branch) {
|
|
331
|
+
await switchBranch(http, safety, repoId, branch, true);
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=abapgit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"abapgit.js","sourceRoot":"","sources":["../../src/adt/abapgit.ts"],"names":[],"mappings":"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"}
|
package/dist/adt/cds-impact.d.ts
CHANGED
|
@@ -17,9 +17,44 @@ export interface CdsImpactDownstream {
|
|
|
17
17
|
byBucket: Record<string, number>;
|
|
18
18
|
};
|
|
19
19
|
}
|
|
20
|
+
export interface SiblingExtensionCandidate {
|
|
21
|
+
name: string;
|
|
22
|
+
packageName: string;
|
|
23
|
+
metadataExtensions: number;
|
|
24
|
+
}
|
|
25
|
+
export interface SiblingExtensionFindingInput {
|
|
26
|
+
targetName: string;
|
|
27
|
+
targetPackageName?: string;
|
|
28
|
+
stem: string;
|
|
29
|
+
targetMetadataExtensions: number;
|
|
30
|
+
siblings: SiblingExtensionCandidate[];
|
|
31
|
+
}
|
|
32
|
+
export interface SiblingExtensionFinding {
|
|
33
|
+
code: 'SIBLING_METADATA_EXTENSION_MISMATCH';
|
|
34
|
+
targetName: string;
|
|
35
|
+
targetPackageName?: string;
|
|
36
|
+
stem: string;
|
|
37
|
+
siblingsWithMetadataExtensions: SiblingExtensionCandidate[];
|
|
38
|
+
message: string;
|
|
39
|
+
}
|
|
20
40
|
interface ClassifyOptions {
|
|
21
41
|
includeIndirect?: boolean;
|
|
22
42
|
}
|
|
23
43
|
export declare function classifyCdsImpact(results: WhereUsedResult[], options?: ClassifyOptions): CdsImpactDownstream;
|
|
44
|
+
/**
|
|
45
|
+
* Derive a conservative sibling stem from a DDLS object name.
|
|
46
|
+
* Example: ZI_SALESDATA3 -> ZI_SALESDATA
|
|
47
|
+
*/
|
|
48
|
+
export declare function deriveSiblingStem(name: string): string;
|
|
49
|
+
/**
|
|
50
|
+
* Conservative sibling matcher: same stem, not the same object, and only
|
|
51
|
+
* empty-or-numeric suffixes after the stem.
|
|
52
|
+
*/
|
|
53
|
+
export declare function isSiblingNameMatch(targetName: string, candidateName: string, stem: string): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Build a sibling-extension consistency finding when the target has no DDLX
|
|
56
|
+
* consumers but one or more siblings do.
|
|
57
|
+
*/
|
|
58
|
+
export declare function buildSiblingExtensionFinding(input: SiblingExtensionFindingInput): SiblingExtensionFinding | null;
|
|
24
59
|
export {};
|
|
25
60
|
//# sourceMappingURL=cds-impact.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cds-impact.d.ts","sourceRoot":"","sources":["../../src/adt/cds-impact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,kBAAkB,EAAE,eAAe,EAAE,CAAC;IACtC,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,cAAc,EAAE,eAAe,EAAE,CAAC;IAClC,kBAAkB,EAAE,eAAe,EAAE,CAAC;IACtC,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;CACH;AAED,UAAU,eAAe;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAiBD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,mBAAmB,CAwD5G"}
|
|
1
|
+
{"version":3,"file":"cds-impact.d.ts","sourceRoot":"","sources":["../../src/adt/cds-impact.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,kBAAkB,EAAE,eAAe,EAAE,CAAC;IACtC,eAAe,EAAE,eAAe,EAAE,CAAC;IACnC,cAAc,EAAE,eAAe,EAAE,CAAC;IAClC,kBAAkB,EAAE,eAAe,EAAE,CAAC;IACtC,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,aAAa,EAAE,eAAe,EAAE,CAAC;IACjC,KAAK,EAAE,eAAe,EAAE,CAAC;IACzB,OAAO,EAAE;QACP,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KAClC,CAAC;CACH;AAED,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,4BAA4B;IAC3C,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,wBAAwB,EAAE,MAAM,CAAC;IACjC,QAAQ,EAAE,yBAAyB,EAAE,CAAC;CACvC;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,qCAAqC,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B,EAAE,yBAAyB,EAAE,CAAC;IAC5D,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,eAAe;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAiBD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG,mBAAmB,CAwD5G;AAgCD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAiBnG;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,4BAA4B,GAAG,uBAAuB,GAAG,IAAI,CA+BhH"}
|
package/dist/adt/cds-impact.js
CHANGED
|
@@ -88,4 +88,75 @@ function bucketForType(type) {
|
|
|
88
88
|
return 'other';
|
|
89
89
|
}
|
|
90
90
|
}
|
|
91
|
+
/**
|
|
92
|
+
* Derive a conservative sibling stem from a DDLS object name.
|
|
93
|
+
* Example: ZI_SALESDATA3 -> ZI_SALESDATA
|
|
94
|
+
*/
|
|
95
|
+
export function deriveSiblingStem(name) {
|
|
96
|
+
const normalized = normalizeName(name);
|
|
97
|
+
if (!normalized)
|
|
98
|
+
return '';
|
|
99
|
+
const withoutNumericSuffix = normalized.replace(/\d+$/, '');
|
|
100
|
+
return withoutNumericSuffix || normalized;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Conservative sibling matcher: same stem, not the same object, and only
|
|
104
|
+
* empty-or-numeric suffixes after the stem.
|
|
105
|
+
*/
|
|
106
|
+
export function isSiblingNameMatch(targetName, candidateName, stem) {
|
|
107
|
+
const target = normalizeName(targetName);
|
|
108
|
+
const candidate = normalizeName(candidateName);
|
|
109
|
+
const normalizedStem = deriveSiblingStem(stem);
|
|
110
|
+
if (!target || !candidate || !normalizedStem)
|
|
111
|
+
return false;
|
|
112
|
+
if (target === candidate)
|
|
113
|
+
return false;
|
|
114
|
+
if (!target.startsWith(normalizedStem) || !candidate.startsWith(normalizedStem))
|
|
115
|
+
return false;
|
|
116
|
+
const targetSuffix = target.slice(normalizedStem.length);
|
|
117
|
+
const candidateSuffix = candidate.slice(normalizedStem.length);
|
|
118
|
+
if (!isNumericVariantSuffix(targetSuffix) || !isNumericVariantSuffix(candidateSuffix)) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
return targetSuffix !== candidateSuffix;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Build a sibling-extension consistency finding when the target has no DDLX
|
|
125
|
+
* consumers but one or more siblings do.
|
|
126
|
+
*/
|
|
127
|
+
export function buildSiblingExtensionFinding(input) {
|
|
128
|
+
if (input.targetMetadataExtensions > 0)
|
|
129
|
+
return null;
|
|
130
|
+
const siblingsWithMetadataExtensions = input.siblings
|
|
131
|
+
.filter((sibling) => sibling.metadataExtensions > 0)
|
|
132
|
+
.sort((left, right) => {
|
|
133
|
+
if (right.metadataExtensions !== left.metadataExtensions) {
|
|
134
|
+
return right.metadataExtensions - left.metadataExtensions;
|
|
135
|
+
}
|
|
136
|
+
return left.name.localeCompare(right.name);
|
|
137
|
+
});
|
|
138
|
+
if (siblingsWithMetadataExtensions.length === 0)
|
|
139
|
+
return null;
|
|
140
|
+
const siblingSummary = siblingsWithMetadataExtensions
|
|
141
|
+
.map((sibling) => `${sibling.name} (${sibling.metadataExtensions})`)
|
|
142
|
+
.join(', ');
|
|
143
|
+
const packageHint = input.targetPackageName ? ` in package ${input.targetPackageName}` : '';
|
|
144
|
+
const message = `Possible sibling metadata-extension inconsistency${packageHint}: ` +
|
|
145
|
+
`${input.targetName} has 0 DDLX consumers while sibling DDLS for stem "${input.stem}" have DDLX consumers ` +
|
|
146
|
+
`(${siblingSummary}).`;
|
|
147
|
+
return {
|
|
148
|
+
code: 'SIBLING_METADATA_EXTENSION_MISMATCH',
|
|
149
|
+
targetName: input.targetName,
|
|
150
|
+
targetPackageName: input.targetPackageName,
|
|
151
|
+
stem: input.stem,
|
|
152
|
+
siblingsWithMetadataExtensions,
|
|
153
|
+
message,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
function normalizeName(value) {
|
|
157
|
+
return String(value).trim().toUpperCase();
|
|
158
|
+
}
|
|
159
|
+
function isNumericVariantSuffix(value) {
|
|
160
|
+
return value.length === 0 || /^\d+$/.test(value);
|
|
161
|
+
}
|
|
91
162
|
//# sourceMappingURL=cds-impact.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cds-impact.js","sourceRoot":"","sources":["../../src/adt/cds-impact.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cds-impact.js","sourceRoot":"","sources":["../../src/adt/cds-impact.ts"],"names":[],"mappings":"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"}
|