@mcp-abap-adt/adt-clients 31.1.0 → 32.2.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 +49 -6
- package/dist/batch/AdtBatchConnection.d.ts +29 -0
- package/dist/batch/AdtBatchConnection.d.ts.map +1 -0
- package/dist/batch/AdtBatchConnection.js +155 -0
- package/dist/batch/index.d.ts +2 -0
- package/dist/batch/index.d.ts.map +1 -0
- package/dist/batch/index.js +5 -0
- package/dist/batch/wire.d.ts +10 -0
- package/dist/batch/wire.d.ts.map +1 -0
- package/dist/batch/wire.js +88 -0
- package/dist/clients/AdtClient.d.ts +6 -6
- package/dist/clients/AdtClient.d.ts.map +1 -1
- package/dist/constants/contentTypes.d.ts +7 -2
- package/dist/constants/contentTypes.d.ts.map +1 -1
- package/dist/constants/contentTypes.js +10 -4
- package/dist/core/accessControl/versions.d.ts +1 -1
- package/dist/core/accessControl/versions.js +1 -1
- package/dist/core/appendStructure/versions.d.ts +1 -1
- package/dist/core/appendStructure/versions.js +1 -1
- package/dist/core/behaviorDefinition/versions.d.ts +1 -1
- package/dist/core/behaviorDefinition/versions.js +1 -1
- package/dist/core/behaviorImplementation/versions.d.ts +1 -1
- package/dist/core/behaviorImplementation/versions.js +1 -1
- package/dist/core/class/AdtClass.d.ts +6 -2
- package/dist/core/class/AdtClass.d.ts.map +1 -1
- package/dist/core/class/AdtClass.js +11 -0
- package/dist/core/class/enhancements.d.ts +4 -0
- package/dist/core/class/enhancements.d.ts.map +1 -0
- package/dist/core/class/enhancements.js +25 -0
- package/dist/core/class/types.d.ts +6 -0
- package/dist/core/class/types.d.ts.map +1 -1
- package/dist/core/class/types.js +2 -0
- package/dist/core/enhancement/AdtEnhancement.d.ts +10 -3
- package/dist/core/enhancement/AdtEnhancement.d.ts.map +1 -1
- package/dist/core/enhancement/AdtEnhancement.js +13 -1
- package/dist/core/enhancement/activation.d.ts +1 -1
- package/dist/core/enhancement/activation.js +1 -1
- package/dist/core/enhancement/create.d.ts +0 -2
- package/dist/core/enhancement/create.d.ts.map +1 -1
- package/dist/core/enhancement/create.js +30 -28
- package/dist/core/enhancement/read.d.ts +1 -1
- package/dist/core/enhancement/read.js +3 -3
- package/dist/core/enhancement/types.d.ts +8 -5
- package/dist/core/enhancement/types.d.ts.map +1 -1
- package/dist/core/enhancement/types.js +7 -10
- package/dist/core/enhancement/unlock.d.ts +1 -1
- package/dist/core/enhancement/unlock.js +1 -1
- package/dist/core/enhancement/update.d.ts +2 -0
- package/dist/core/enhancement/update.d.ts.map +1 -1
- package/dist/core/enhancement/update.js +21 -0
- package/dist/core/enhancement/versions.js +1 -1
- package/dist/core/functionGroup/AdtFunctionGroup.d.ts +6 -2
- package/dist/core/functionGroup/AdtFunctionGroup.d.ts.map +1 -1
- package/dist/core/functionGroup/AdtFunctionGroup.js +11 -0
- package/dist/core/functionGroup/create.js +1 -1
- package/dist/core/functionGroup/enhancements.d.ts +4 -0
- package/dist/core/functionGroup/enhancements.d.ts.map +1 -0
- package/dist/core/functionGroup/enhancements.js +25 -0
- package/dist/core/functionGroup/types.d.ts +6 -0
- package/dist/core/functionGroup/types.d.ts.map +1 -1
- package/dist/core/functionGroup/types.js +2 -0
- package/dist/core/functionInclude/versions.js +1 -1
- package/dist/core/functionModule/versions.js +1 -1
- package/dist/core/include/AdtInclude.d.ts +10 -2
- package/dist/core/include/AdtInclude.d.ts.map +1 -1
- package/dist/core/include/AdtInclude.js +20 -0
- package/dist/core/include/enhancements.d.ts +4 -0
- package/dist/core/include/enhancements.d.ts.map +1 -0
- package/dist/core/include/enhancements.js +27 -0
- package/dist/core/include/types.d.ts +6 -0
- package/dist/core/include/types.d.ts.map +1 -1
- package/dist/core/include/types.js +2 -0
- package/dist/core/program/AdtProgram.d.ts +6 -2
- package/dist/core/program/AdtProgram.d.ts.map +1 -1
- package/dist/core/program/AdtProgram.js +11 -0
- package/dist/core/program/enhancements.d.ts +4 -0
- package/dist/core/program/enhancements.d.ts.map +1 -0
- package/dist/core/program/enhancements.js +25 -0
- package/dist/core/program/types.d.ts +6 -0
- package/dist/core/program/types.d.ts.map +1 -1
- package/dist/core/program/types.js +2 -0
- package/dist/core/scalarFunction/versions.d.ts +1 -1
- package/dist/core/scalarFunction/versions.js +1 -1
- package/dist/core/scalarFunctionImplementation/versions.d.ts +1 -1
- package/dist/core/scalarFunctionImplementation/versions.js +1 -1
- package/dist/core/service/AdtService.js +2 -2
- package/dist/core/service/lock.d.ts +1 -1
- package/dist/core/service/lock.js +1 -1
- package/dist/core/service/types.d.ts +2 -2
- package/dist/core/serviceDefinition/versions.d.ts +1 -1
- package/dist/core/serviceDefinition/versions.js +1 -1
- package/dist/core/shared/AdtUtils.d.ts +5 -6
- package/dist/core/shared/AdtUtils.d.ts.map +1 -1
- package/dist/core/shared/AdtUtils.js +5 -6
- package/dist/core/structure/versions.d.ts +1 -1
- package/dist/core/structure/versions.js +1 -1
- package/dist/core/tabletype/versions.d.ts +1 -1
- package/dist/core/tabletype/versions.js +1 -1
- package/dist/core/transformation/versions.d.ts +1 -1
- package/dist/core/transformation/versions.js +1 -1
- package/dist/core/transport/AdtRequest.d.ts +2 -2
- package/dist/core/transport/AdtRequest.js +2 -2
- package/dist/core/transport/objects.d.ts +1 -1
- package/dist/core/transport/objects.js +1 -1
- package/dist/endpoints/objects.d.ts +22 -1
- package/dist/endpoints/objects.d.ts.map +1 -1
- package/dist/endpoints/objects.js +15 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/runtime/debugger/abap.d.ts.map +1 -1
- package/dist/runtime/debugger/abap.js +28 -40
- package/dist/runtime/debugger/batchPayload.d.ts +2 -16
- package/dist/runtime/debugger/batchPayload.d.ts.map +1 -1
- package/dist/runtime/debugger/batchPayload.js +5 -28
- package/dist/runtime/dumps/read.d.ts +1 -1
- package/dist/runtime/dumps/read.js +1 -1
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.d.ts.map +1 -1
- package/dist/runtime/index.js +3 -0
- package/dist/utils/activationUtils.d.ts.map +1 -1
- package/dist/utils/activationUtils.js +5 -9
- package/docs/usage/ADT_OBJECT_ENTITIES.md +5 -5
- package/docs/usage/BATCH.md +160 -0
- package/docs/usage/CLIENT_API_REFERENCE.md +170 -6
- package/docs/usage/ERRATA.md +1 -1
- package/docs/usage/MIGRATION-32.md +50 -0
- package/docs/usage/OBJECT_LIFECYCLE.md +1 -1
- package/docs/usage/STATEFUL_SESSION_GUIDE.md +2 -2
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -91,7 +91,7 @@ This package interacts with external packages **ONLY through interfaces**:
|
|
|
91
91
|
|
|
92
92
|
| package | what this package takes from it |
|
|
93
93
|
|---|---|
|
|
94
|
-
| [`@mcp-abap-adt/interfaces-adt`](https://www.npmjs.com/package/@mcp-abap-adt/interfaces-adt) `^
|
|
94
|
+
| [`@mcp-abap-adt/interfaces-adt`](https://www.npmjs.com/package/@mcp-abap-adt/interfaces-adt) `^18.0.0` | the capability atoms, every object's config, `IAdtResponse`, `IAnalyse`, `IAdtAnalyseOptions`, `IResultStrategy`, `ADT_NO_FAILURE`, `ADT_TASK_TYPE` |
|
|
95
95
|
| [`@mcp-abap-adt/interfaces-adt-connection`](https://www.npmjs.com/package/@mcp-abap-adt/interfaces-adt-connection) `^3.0.0` | `IAbapConnection`, `IAdtWireResponse`, `IAbapRequestOptions`, the connection capability atoms, `ADT_SESSION_ERROR` |
|
|
96
96
|
| [`@mcp-abap-adt/interfaces-network`](https://www.npmjs.com/package/@mcp-abap-adt/interfaces-network) `^2.0.1` | `IWebSocketTransport` and its four companions, `HttpError` |
|
|
97
97
|
| [`@mcp-abap-adt/interfaces-utils`](https://www.npmjs.com/package/@mcp-abap-adt/interfaces-utils) `^1.1.1` | `ILogger`, `LogLevel`, `XmlNode` |
|
|
@@ -162,7 +162,7 @@ npm install @mcp-abap-adt/adt-clients
|
|
|
162
162
|
|
|
163
163
|
6. **AbapDebugger, AmdpDebugger, MemorySnapshots**
|
|
164
164
|
- Standalone, from `@mcp-abap-adt/adt-clients/runtime` or the root: `new AbapDebugger(connection, logger, results?, { onConflict? })`
|
|
165
|
-
- One member per request, contracts `IAbapDebugger`, `IAmdpDebugger`, `IMemorySnapshots` from `@mcp-abap-adt/interfaces-adt` (contract
|
|
165
|
+
- One member per request, contracts `IAbapDebugger`, `IAmdpDebugger`, `IMemorySnapshots` from `@mcp-abap-adt/interfaces-adt` (contract 18 pairs with clients 32)
|
|
166
166
|
- **The identity states its mode.** `{ debuggingMode: 'user', requestUser, terminalId, ideId }`, or `{ debuggingMode: 'terminal', terminalId, ideId }`; `attach` takes the identity, not the user. A terminal-mode listener catches a run that carries its ids: `run(target, { debuggee: { terminalId, ideId } })` sends them in `SAP-PASSPORT` (since 29.1.0)
|
|
167
167
|
- **Breakpoints are replaced, not added to.** `setBreakpoints` and `syncBreakpoints` replace the identity's set, and `stopListener` deletes it: arm the whole set in one call
|
|
168
168
|
- **Two sessions.** The ABAP listener holds one stateful connection; each debuggee caught is attached on a new one, routed to its application server. The AMDP debugger answers events on one session and takes commands on another
|
|
@@ -177,6 +177,8 @@ npm install @mcp-abap-adt/adt-clients
|
|
|
177
177
|
| Behavior Definitions (BDEF) | ✅ |
|
|
178
178
|
| Interfaces (INTF) | ✅ |
|
|
179
179
|
| Programs (PROG) | ✅ |
|
|
180
|
+
| Includes (PROG/I) | ✅ |
|
|
181
|
+
| Enhancements (ENHO/XHB, ENHO/XHH, ENHS/XSB) | ✅ |
|
|
180
182
|
| Function Groups (FUGR) | ✅ |
|
|
181
183
|
| Function Modules (FUGR/FF) | ✅ |
|
|
182
184
|
| Function Includes (FUGR/I) | ✅ |
|
|
@@ -191,6 +193,18 @@ npm install @mcp-abap-adt/adt-clients
|
|
|
191
193
|
| Feature Toggles (FTG2/FT) | ✅ |
|
|
192
194
|
| Transports (TRNS) | ✅ |
|
|
193
195
|
|
|
196
|
+
`getEnhancement().updateMetadata()` writes the whole object document from
|
|
197
|
+
`options.source` under the caller's lock, then the caller unlocks and activates.
|
|
198
|
+
This writes BAdI spot definitions and container implementations; the result slot
|
|
199
|
+
is `metadataUpdated`. See the [BAdI example](docs/usage/CLIENT_API_REFERENCE.md#enhancements-and-their-hosts).
|
|
200
|
+
|
|
201
|
+
Class, program and function-group handlers also expose `readEnhancementElements`
|
|
202
|
+
and `readEnhancementOptions` (`IAdtEnhancementHost`). `getInclude()` exposes
|
|
203
|
+
both through `IAdtIncludeEnhancementHost`, with `context` set to the main
|
|
204
|
+
program name. The default answers XML; custom result sets provide
|
|
205
|
+
`enhancementElements` and `enhancementOptions`. These reads live on the hosts,
|
|
206
|
+
not `AdtUtils`. See [enhancement examples](docs/usage/CLIENT_API_REFERENCE.md#enhancements-and-their-hosts).
|
|
207
|
+
|
|
194
208
|
## Quick Start
|
|
195
209
|
|
|
196
210
|
### Using AdtClient (Recommended - High-Level CRUD API)
|
|
@@ -436,7 +450,7 @@ await utils.readObjectSource('view' satisfies AdtSourceObjectType, 'ZOK_I_CDS_TE
|
|
|
436
450
|
The `withLongPolling` parameter asks ADT to hold a read until the object is
|
|
437
451
|
available, instead of answering from whatever is there right now:
|
|
438
452
|
|
|
439
|
-
> **Measured caveat — do not rely on it for readiness.** On
|
|
453
|
+
> **Measured caveat — do not rely on it for readiness.** On the ABAP Cloud system the
|
|
440
454
|
> parameter changes nothing on an object read. Reading a message class straight
|
|
441
455
|
> after creating it returned `404` in ~650ms **with** the flag — the same
|
|
442
456
|
> latency as without it — and the server did not hold the request. The system's
|
|
@@ -860,7 +874,7 @@ everything else is not.
|
|
|
860
874
|
|
|
861
875
|
### Single Definition Site: the contract packages
|
|
862
876
|
|
|
863
|
-
Since **7.5.0**, every contract type is **defined once**, in the contract packages — today `@mcp-abap-adt/interfaces-adt` (`^
|
|
877
|
+
Since **7.5.0**, every contract type is **defined once**, in the contract packages — today `@mcp-abap-adt/interfaces-adt` (`^18.0.0`) for the ADT contracts and `@mcp-abap-adt/interfaces-adt-connection` (`^3.0.0`) for the connection. This package declares no copies of its own — every `IXxxConfig`, the capability atoms, the option and response types and the cross-cutting shared types all live there.
|
|
864
878
|
|
|
865
879
|
**Import them from the package that owns them:**
|
|
866
880
|
|
|
@@ -891,7 +905,7 @@ What this package exports is what it owns: the clients, the handler classes, the
|
|
|
891
905
|
|
|
892
906
|
### Honest capability types (since 8.0.0)
|
|
893
907
|
|
|
894
|
-
`@mcp-abap-adt/interfaces-adt` has **capability atoms and nothing above them** — `IAdtCreatable`, `IAdtReadable`, `IAdtMetadataReadable`, `IAdtUpdatable`, `IAdtMetadataUpdatable`, `IAdtDeletable`, `IAdtValidatable`, `IAdtCheckable`, `IAdtActivatable`, `IAdtLockable`, `IAdtVersionable`, `IAdtTransportAware` — each covering one operation against one resource. **There is no composite.** `IAdtObject`, `IAdtCrud`, `IAdtModifiable` and `IAdtSourceObject` were removed in interfaces 29.0.0: they forced one result type on members that answer different things, and a create does not answer what a read answers. `IAdtSearchable` went in 30.0.0 — searching is not something an object does to itself, and the question already had a home in `IAdtInformationSystem.search`. A handler declares the atoms it honours, so there is nothing a composite could drift from.
|
|
908
|
+
`@mcp-abap-adt/interfaces-adt` has **capability atoms and nothing above them** — `IAdtCreatable`, `IAdtReadable`, `IAdtMetadataReadable`, `IAdtUpdatable`, `IAdtMetadataUpdatable`, `IAdtDeletable`, `IAdtValidatable`, `IAdtCheckable`, `IAdtActivatable`, `IAdtLockable`, `IAdtVersionable`, `IAdtTransportAware`, `IAdtEnhancementHost`, `IAdtIncludeEnhancementHost` — each covering one operation against one resource. **There is no composite.** `IAdtObject`, `IAdtCrud`, `IAdtModifiable` and `IAdtSourceObject` were removed in interfaces 29.0.0: they forced one result type on members that answer different things, and a create does not answer what a read answers. `IAdtSearchable` went in 30.0.0 — searching is not something an object does to itself, and the question already had a home in `IAdtInformationSystem.search`. A handler declares the atoms it honours, so there is nothing a composite could drift from.
|
|
895
909
|
|
|
896
910
|
Since **8.0.0**, each handler `implements` only the atoms it genuinely supports, and `AdtClient.getXxx()` return types are narrowed to match:
|
|
897
911
|
|
|
@@ -940,7 +954,7 @@ contracts (`IAbapDebugger`, `IAmdpDebugger`, `IMemorySnapshots`, 13.1.0). This
|
|
|
940
954
|
package no longer declares or exports any contract type — every contract name it uses is
|
|
941
955
|
sourced from the contract packages.
|
|
942
956
|
|
|
943
|
-
> **Version pairing.** `adt-clients`
|
|
957
|
+
> **Version pairing.** `adt-clients` 32 pairs with `interfaces-adt` 18 and `interfaces-adt-connection` 3 (the enhancement subtype and host contracts), and `adt-strategies` 0.12.0 declares the same ranges. Because the types are sourced rather than copied, `@mcp-abap-adt/interfaces-adt` and `@mcp-abap-adt/interfaces-adt-connection` are hard peers of this package's public API. A major bump there implies a bump here; keep the two in step rather than letting a resolver pick a mismatched pair.
|
|
944
958
|
|
|
945
959
|
### Naming Conventions
|
|
946
960
|
|
|
@@ -977,6 +991,7 @@ See [Architecture Documentation](docs/architecture/ARCHITECTURE.md#type-system-a
|
|
|
977
991
|
One document per breaking release, each written for a consumer on the contract
|
|
978
992
|
before it:
|
|
979
993
|
|
|
994
|
+
- **[31.x → 32.0.0](docs/usage/MIGRATION-32.md)** — interfaces-adt 18, three enhancement subtypes, subtype-specific create fields, two new result slots for enhancement hosts, and `metadataUpdated` for enhancement document writes.
|
|
980
995
|
- **[30.x → 31.0.0](docs/usage/MIGRATION-31.md)** — `interfaces-adt` 16 and
|
|
981
996
|
`interfaces-adt-connection` 3: the per-request `signal`, `ADT_REQUEST_ERROR`
|
|
982
997
|
and `IAdtError.refusal` are gone; code written for 30.x compiles unchanged.
|
|
@@ -1100,3 +1115,31 @@ users can replace it with their own build.
|
|
|
1100
1115
|
## Author
|
|
1101
1116
|
|
|
1102
1117
|
Oleksii Kyslytsia <oleksij.kyslytsja@gmail.com>
|
|
1118
|
+
|
|
1119
|
+
### Recording batches
|
|
1120
|
+
|
|
1121
|
+
`AdtBatchConnection` records calls from the existing clients. Start the member
|
|
1122
|
+
calls, execute the queue, then await their results. Group creates before locks,
|
|
1123
|
+
then queue writes with the returned lock handles before unlocks;
|
|
1124
|
+
activate all objects with one plain `activateObjectsGroup` call. At a debugger
|
|
1125
|
+
stop, record step + stack + variables on the attached stateful connection.
|
|
1126
|
+
See [domain and debugger examples](docs/usage/BATCH.md).
|
|
1127
|
+
|
|
1128
|
+
`execute()` also sends follow-up envelopes for requests recorded during settlement,
|
|
1129
|
+
including automatic 406/415 negotiation retries (up to 100 envelopes, then all
|
|
1130
|
+
remaining requests reject). Explicit session switches apply to the next recording;
|
|
1131
|
+
LOCK/UNLOCK run in stateful envelopes; other ordinary members run stateless.
|
|
1132
|
+
Consecutive LOCKs, consecutive UNLOCKs, and consecutive stateless requests each
|
|
1133
|
+
form separate envelopes sent in queue order.
|
|
1134
|
+
Execution returns the last outer response. An envelope failure stops sending and
|
|
1135
|
+
rejects unsent requests with a clear library error; inner HTTP failures remain
|
|
1136
|
+
per-part failures. The wrapped session mode is restored after execution.
|
|
1137
|
+
|
|
1138
|
+
```typescript
|
|
1139
|
+
import { AdtBatchConnection, AdtClient } from '@mcp-abap-adt/adt-clients';
|
|
1140
|
+
|
|
1141
|
+
const batch = new AdtBatchConnection(connection, { endpoint: 'communication' });
|
|
1142
|
+
const pending = new AdtClient(batch).getDomain().readMetadata({ domainName: 'Z_DOMAIN' });
|
|
1143
|
+
await batch.execute();
|
|
1144
|
+
const answer = await pending;
|
|
1145
|
+
```
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { IAbapConnection, IAbapRequestOptions, IAdtWireResponse } from '@mcp-abap-adt/interfaces-adt-connection';
|
|
2
|
+
import type { ILogger } from '@mcp-abap-adt/interfaces-utils';
|
|
3
|
+
type Session = 'stateful' | 'stateless';
|
|
4
|
+
/** Records member requests; execute also drains requests queued during settlement. */
|
|
5
|
+
export declare class AdtBatchConnection implements IAbapConnection {
|
|
6
|
+
private readonly connection;
|
|
7
|
+
private readonly options;
|
|
8
|
+
private queue;
|
|
9
|
+
private session;
|
|
10
|
+
private readonly defaultSession;
|
|
11
|
+
private settlementFailure?;
|
|
12
|
+
private executing;
|
|
13
|
+
constructor(connection: IAbapConnection, options: {
|
|
14
|
+
endpoint: 'communication' | 'debugger';
|
|
15
|
+
logger?: ILogger;
|
|
16
|
+
});
|
|
17
|
+
private wrappedSession;
|
|
18
|
+
connect(): Promise<void>;
|
|
19
|
+
getBaseUrl(): Promise<string>;
|
|
20
|
+
getSessionId(): string | null;
|
|
21
|
+
setSessionType(type: Session): void;
|
|
22
|
+
getSessionType(): Session;
|
|
23
|
+
makeAdtRequest<T = unknown, D = unknown>(request: IAbapRequestOptions): Promise<IAdtWireResponse<T, D>>;
|
|
24
|
+
private envelopeKey;
|
|
25
|
+
/** Empty queues return a synthetic 204, data '', without network traffic. */
|
|
26
|
+
execute(): Promise<IAdtWireResponse>;
|
|
27
|
+
}
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=AdtBatchConnection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdtBatchConnection.d.ts","sourceRoot":"","sources":["../../src/batch/AdtBatchConnection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,yCAAyC,CAAC;AACjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAI9D,KAAK,OAAO,GAAG,UAAU,GAAG,WAAW,CAAC;AAQxC,sFAAsF;AACtF,qBAAa,kBAAmB,YAAW,eAAe;IAOtD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,KAAK,CAAiB;IAC9B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,iBAAiB,CAAC,CAAqB;IAC/C,OAAO,CAAC,SAAS,CAAS;gBAEP,UAAU,EAAE,eAAe,EAC3B,OAAO,EAAE;QACxB,QAAQ,EAAE,eAAe,GAAG,UAAU,CAAC;QACvC,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB;IAQH,OAAO,CAAC,cAAc;IAWtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAGxB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAG7B,YAAY,IAAI,MAAM,GAAG,IAAI;IAG7B,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI;IAGnC,cAAc,IAAI,OAAO;IAGzB,cAAc,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,EACrC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAuBlC,OAAO,CAAC,WAAW;IAkBnB,6EAA6E;IACvE,OAAO,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAuF3C"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AdtBatchConnection = void 0;
|
|
4
|
+
const objects_1 = require("../endpoints/objects");
|
|
5
|
+
const wire_1 = require("./wire");
|
|
6
|
+
/** Records member requests; execute also drains requests queued during settlement. */
|
|
7
|
+
class AdtBatchConnection {
|
|
8
|
+
connection;
|
|
9
|
+
options;
|
|
10
|
+
queue = [];
|
|
11
|
+
session;
|
|
12
|
+
defaultSession;
|
|
13
|
+
settlementFailure;
|
|
14
|
+
executing = false;
|
|
15
|
+
constructor(connection, options) {
|
|
16
|
+
this.connection = connection;
|
|
17
|
+
this.options = options;
|
|
18
|
+
// Debugger requests use the attached stateful session; communication
|
|
19
|
+
// members opt into stateful mode only for their own LOCK or UNLOCK.
|
|
20
|
+
this.defaultSession =
|
|
21
|
+
options.endpoint === 'debugger' ? 'stateful' : 'stateless';
|
|
22
|
+
this.session = this.defaultSession;
|
|
23
|
+
}
|
|
24
|
+
wrappedSession() {
|
|
25
|
+
const connection = this.connection;
|
|
26
|
+
return (connection.getSessionType?.() ??
|
|
27
|
+
connection.getSessionMode?.() ??
|
|
28
|
+
'stateless');
|
|
29
|
+
}
|
|
30
|
+
connect() {
|
|
31
|
+
return this.connection.connect();
|
|
32
|
+
}
|
|
33
|
+
getBaseUrl() {
|
|
34
|
+
return this.connection.getBaseUrl();
|
|
35
|
+
}
|
|
36
|
+
getSessionId() {
|
|
37
|
+
return this.connection.getSessionId();
|
|
38
|
+
}
|
|
39
|
+
setSessionType(type) {
|
|
40
|
+
this.session = type;
|
|
41
|
+
}
|
|
42
|
+
getSessionType() {
|
|
43
|
+
return this.session;
|
|
44
|
+
}
|
|
45
|
+
makeAdtRequest(request) {
|
|
46
|
+
if (this.settlementFailure)
|
|
47
|
+
return Promise.reject(this.settlementFailure.error);
|
|
48
|
+
const headers = { ...request.headers };
|
|
49
|
+
const stateful = this.session === 'stateful' ||
|
|
50
|
+
Object.entries(headers).some(([key, value]) => key.toLowerCase() === 'x-sap-adt-sessiontype' && value === 'stateful');
|
|
51
|
+
// Members restore their mode only after the deferred answer. Scope an
|
|
52
|
+
// explicit switch to this recording so neighbouring members cannot inherit it.
|
|
53
|
+
this.session = this.defaultSession;
|
|
54
|
+
if (stateful)
|
|
55
|
+
headers['X-sap-adt-sessiontype'] = 'stateful';
|
|
56
|
+
return new Promise((resolve, reject) => {
|
|
57
|
+
this.queue.push({
|
|
58
|
+
request: { ...request, headers },
|
|
59
|
+
stateful,
|
|
60
|
+
resolve,
|
|
61
|
+
reject,
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
envelopeKey(part) {
|
|
66
|
+
if (!part.stateful)
|
|
67
|
+
return 'stateless';
|
|
68
|
+
if (this.options.endpoint === 'debugger')
|
|
69
|
+
return 'stateful';
|
|
70
|
+
const action = new URL(part.request.url, 'https://batch.invalid').searchParams.get('_action') ??
|
|
71
|
+
new URLSearchParams(part.request.params).get('_action');
|
|
72
|
+
if (action === 'LOCK')
|
|
73
|
+
return 'lock';
|
|
74
|
+
if (action === 'UNLOCK')
|
|
75
|
+
return 'unlock';
|
|
76
|
+
// Communication members currently use stateful mode only for LOCK/UNLOCK.
|
|
77
|
+
// Keep any future other stateful requests in their own consecutive group.
|
|
78
|
+
return 'stateful';
|
|
79
|
+
}
|
|
80
|
+
/** Empty queues return a synthetic 204, data '', without network traffic. */
|
|
81
|
+
async execute() {
|
|
82
|
+
if (this.executing)
|
|
83
|
+
throw new Error('An ADT batch execute is already in progress');
|
|
84
|
+
const pending = this.queue;
|
|
85
|
+
this.queue = [];
|
|
86
|
+
if (!pending.length)
|
|
87
|
+
return { status: 204, statusText: 'Empty batch', headers: {}, data: '' };
|
|
88
|
+
this.executing = true;
|
|
89
|
+
const previous = this.wrappedSession();
|
|
90
|
+
let active = [];
|
|
91
|
+
try {
|
|
92
|
+
let response;
|
|
93
|
+
for (let envelope = 0;; envelope++) {
|
|
94
|
+
if (envelope === 100)
|
|
95
|
+
throw new Error('ADT batch exceeded 100 settlement envelopes');
|
|
96
|
+
const key = this.envelopeKey(pending[0]);
|
|
97
|
+
const nextMode = pending.findIndex((part) => this.envelopeKey(part) !== key);
|
|
98
|
+
active = pending.splice(0, nextMode < 0 ? pending.length : nextMode);
|
|
99
|
+
const payload = (0, wire_1.buildBatchPayload)(active.map((part) => (0, wire_1.innerRequest)(part.request)));
|
|
100
|
+
this.connection.setSessionType(active[0].stateful ? 'stateful' : 'stateless');
|
|
101
|
+
this.options.logger?.debug('Executing ADT batch', {
|
|
102
|
+
endpoint: this.options.endpoint,
|
|
103
|
+
parts: active.length,
|
|
104
|
+
});
|
|
105
|
+
response = await this.connection.makeAdtRequest({
|
|
106
|
+
url: objects_1.BATCH[this.options.endpoint],
|
|
107
|
+
method: 'POST',
|
|
108
|
+
timeout: 0,
|
|
109
|
+
data: payload.body,
|
|
110
|
+
headers: {
|
|
111
|
+
'Content-Type': `multipart/mixed; boundary=${payload.boundary}`,
|
|
112
|
+
Accept: 'multipart/mixed',
|
|
113
|
+
},
|
|
114
|
+
});
|
|
115
|
+
const parts = (0, wire_1.parseBatchResponse)(response);
|
|
116
|
+
for (const [index, part] of active.entries()) {
|
|
117
|
+
const answer = parts[index];
|
|
118
|
+
if (!answer)
|
|
119
|
+
part.reject(new Error(`ADT batch response part count mismatch: expected ${active.length}, received ${parts.length}; missing part ${index + 1}`));
|
|
120
|
+
else if (answer.status >= 200 && answer.status < 300)
|
|
121
|
+
part.resolve(answer);
|
|
122
|
+
else
|
|
123
|
+
part.reject(Object.assign(new Error(`Request failed with status code ${answer.status}`), { response: answer }));
|
|
124
|
+
}
|
|
125
|
+
if (parts.length !== active.length)
|
|
126
|
+
throw new Error(`ADT batch response part count mismatch: expected ${active.length}, received ${parts.length}`);
|
|
127
|
+
active = [];
|
|
128
|
+
// Let negotiation and member continuations record their follow-up calls.
|
|
129
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
130
|
+
pending.push(...this.queue.splice(0));
|
|
131
|
+
if (!pending.length)
|
|
132
|
+
return response;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
const unsentError = new Error('ADT batch request not sent because an earlier batch envelope failed', { cause: error });
|
|
137
|
+
this.settlementFailure = { error: unsentError };
|
|
138
|
+
for (const part of active)
|
|
139
|
+
part.reject(error);
|
|
140
|
+
for (const part of pending)
|
|
141
|
+
part.reject(unsentError);
|
|
142
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
143
|
+
for (const part of this.queue.splice(0))
|
|
144
|
+
part.reject(unsentError);
|
|
145
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
146
|
+
throw error;
|
|
147
|
+
}
|
|
148
|
+
finally {
|
|
149
|
+
this.connection.setSessionType(previous);
|
|
150
|
+
this.executing = false;
|
|
151
|
+
this.settlementFailure = undefined;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
exports.AdtBatchConnection = AdtBatchConnection;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/batch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AdtBatchConnection = void 0;
|
|
4
|
+
var AdtBatchConnection_1 = require("./AdtBatchConnection");
|
|
5
|
+
Object.defineProperty(exports, "AdtBatchConnection", { enumerable: true, get: function () { return AdtBatchConnection_1.AdtBatchConnection; } });
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { IAbapRequestOptions, IAdtWireResponse } from '@mcp-abap-adt/interfaces-adt-connection';
|
|
2
|
+
export declare const createBatchBoundary: () => string;
|
|
3
|
+
export declare const createRequestId: () => string;
|
|
4
|
+
export declare function buildBatchPayload(requests: readonly string[], boundary?: string): {
|
|
5
|
+
boundary: string;
|
|
6
|
+
body: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function innerRequest(request: IAbapRequestOptions): string;
|
|
9
|
+
export declare function parseBatchResponse(response: IAdtWireResponse): IAdtWireResponse[];
|
|
10
|
+
//# sourceMappingURL=wire.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire.d.ts","sourceRoot":"","sources":["../../src/batch/wire.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,mBAAmB,EACnB,gBAAgB,EACjB,MAAM,yCAAyC,CAAC;AAEjD,eAAO,MAAM,mBAAmB,QAAO,MAAiC,CAAC;AACzE,eAAO,MAAM,eAAe,QAAO,MAAwC,CAAC;AAE5E,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,SAAS,MAAM,EAAE,EAC3B,QAAQ,SAAwB,GAC/B;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAWpC;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,mBAAmB,GAAG,MAAM,CAqBjE;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,gBAAgB,GACzB,gBAAgB,EAAE,CAyDpB"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createRequestId = exports.createBatchBoundary = void 0;
|
|
4
|
+
exports.buildBatchPayload = buildBatchPayload;
|
|
5
|
+
exports.innerRequest = innerRequest;
|
|
6
|
+
exports.parseBatchResponse = parseBatchResponse;
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const createBatchBoundary = () => `batch_${(0, node_crypto_1.randomUUID)()}`;
|
|
9
|
+
exports.createBatchBoundary = createBatchBoundary;
|
|
10
|
+
const createRequestId = () => (0, node_crypto_1.randomUUID)().replace(/-/g, '');
|
|
11
|
+
exports.createRequestId = createRequestId;
|
|
12
|
+
function buildBatchPayload(requests, boundary = (0, exports.createBatchBoundary)()) {
|
|
13
|
+
return {
|
|
14
|
+
boundary,
|
|
15
|
+
body: requests
|
|
16
|
+
.map((request) => `--${boundary}\r\nContent-Type: application/http\r\ncontent-transfer-encoding: binary\r\n\r\n${request}`)
|
|
17
|
+
.join('') + `\r\n--${boundary}--\r\n`,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function innerRequest(request) {
|
|
21
|
+
const headers = { ...request.headers };
|
|
22
|
+
// `data: null` is how a member says "no body" (lock, unlock): it must not
|
|
23
|
+
// become the four characters "null". Sent that way, every PUT under those
|
|
24
|
+
// locks was refused 423 "invalid lock handle" (on an on-premise system, 2026-10-16).
|
|
25
|
+
const hasBody = request.data !== undefined && request.data !== null;
|
|
26
|
+
const body = hasBody ? String(request.data) : '';
|
|
27
|
+
if (hasBody) {
|
|
28
|
+
for (const key of Object.keys(headers))
|
|
29
|
+
if (key.toLowerCase() === 'content-length')
|
|
30
|
+
delete headers[key];
|
|
31
|
+
headers['Content-Length'] = String(Buffer.byteLength(body));
|
|
32
|
+
}
|
|
33
|
+
const params = request.params
|
|
34
|
+
? new URLSearchParams(request.params).toString()
|
|
35
|
+
: '';
|
|
36
|
+
const url = request.url +
|
|
37
|
+
(params ? `${request.url.includes('?') ? '&' : '?'}${params}` : '');
|
|
38
|
+
return `${request.method} ${url} HTTP/1.1\r\n${Object.entries(headers)
|
|
39
|
+
.map(([key, value]) => `${key}: ${value}\r\n`)
|
|
40
|
+
.join('')}\r\n${body}\r\n`;
|
|
41
|
+
}
|
|
42
|
+
function parseBatchResponse(response) {
|
|
43
|
+
const contentType = Object.entries(response.headers).find(([key]) => key.toLowerCase() === 'content-type')?.[1];
|
|
44
|
+
const boundary = /boundary=(?:"([^"]+)"|([^;\s]+))/i.exec(String(contentType));
|
|
45
|
+
if (!boundary)
|
|
46
|
+
throw new Error('Invalid ADT batch response: missing multipart boundary');
|
|
47
|
+
const escaped = (boundary[1] ?? boundary[2]).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
48
|
+
// Only complete delimiter lines count; boundary-like body text is payload.
|
|
49
|
+
const delimiter = new RegExp(`(?:^|\\r?\\n)--${escaped}(--)?[ \t]*(?:\\r?\\n|$)`, 'g');
|
|
50
|
+
const body = String(response.data);
|
|
51
|
+
const chunks = [];
|
|
52
|
+
let start;
|
|
53
|
+
for (const match of body.matchAll(delimiter)) {
|
|
54
|
+
if (start !== undefined)
|
|
55
|
+
chunks.push(body.slice(start, match.index));
|
|
56
|
+
if (match[1])
|
|
57
|
+
break;
|
|
58
|
+
start = match.index + match[0].length;
|
|
59
|
+
}
|
|
60
|
+
return chunks.map((part) => {
|
|
61
|
+
const match = /(?:^|\r?\n)HTTP\/1\.\d\s+(\d{3})\s*([^\r\n]*)\r?\n/.exec(part);
|
|
62
|
+
if (!match || match.index === undefined)
|
|
63
|
+
throw new Error('Invalid ADT batch response: missing inner HTTP status');
|
|
64
|
+
const rest = part.slice(match.index + match[0].length);
|
|
65
|
+
// A bodyless answer (an UNLOCK's 200) ends right after its headers: the
|
|
66
|
+
// empty line's last CRLF belongs to the next delimiter (RFC 2046), so the
|
|
67
|
+
// part holds one line break, not two. Headers then run to the end.
|
|
68
|
+
// Immediately after the status line, one blank line means no headers.
|
|
69
|
+
const found = /^(?:\r?\n)|\r?\n\r?\n/.exec(rest);
|
|
70
|
+
const split = found && found.index !== undefined
|
|
71
|
+
? { index: found.index, length: found[0].length }
|
|
72
|
+
: { index: rest.length, length: 0 };
|
|
73
|
+
const headers = {};
|
|
74
|
+
for (const line of rest.slice(0, split.index).split(/\r?\n/)) {
|
|
75
|
+
const colon = line.indexOf(':');
|
|
76
|
+
if (colon > 0)
|
|
77
|
+
headers[line.slice(0, colon).toLowerCase()] = line
|
|
78
|
+
.slice(colon + 1)
|
|
79
|
+
.trim();
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
status: Number(match[1]),
|
|
83
|
+
statusText: match[2].trim(),
|
|
84
|
+
headers,
|
|
85
|
+
data: rest.slice(split.index + split.length),
|
|
86
|
+
};
|
|
87
|
+
});
|
|
88
|
+
}
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* Each factory method returns an IAdtObject instance that can be used
|
|
13
13
|
* to perform operations on a specific object type.
|
|
14
14
|
*/
|
|
15
|
-
import type { IAdtActivatable, IAdtCheckable, IAdtClientOptions, IAdtContentTypes, IAdtCreatable, IAdtDataPreview, IAdtDeletable, IAdtDiscovery, IAdtGroupLifecycle, IAdtInformationSystem, IAdtLockable, IAdtMetadataReadable, IAdtMetadataUpdatable, IAdtObjectAccess, IAdtReadable, IAdtRepositoryStructure, IAdtRequest, IAdtServiceBindingTypes, IAdtServiceGroupReadable, IAdtSystemContext, IAdtTransportAware, IAdtTransportMoveObjects, IAdtTransportObjectActions, IAdtTransportSearchConfigurations, IAdtTransportSortAndCompress, IAdtUpdatable, IAdtValidatable, IAdtVersionable, ICdsTestDoubleCheckable, IFeatureToggleObject, IIncludeConfig, IServiceBindingConfig } from '@mcp-abap-adt/interfaces-adt';
|
|
15
|
+
import type { IAdtActivatable, IAdtCheckable, IAdtClientOptions, IAdtContentTypes, IAdtCreatable, IAdtDataPreview, IAdtDeletable, IAdtDiscovery, IAdtEnhancementHost, IAdtGroupLifecycle, IAdtIncludeEnhancementHost, IAdtInformationSystem, IAdtLockable, IAdtMetadataReadable, IAdtMetadataUpdatable, IAdtObjectAccess, IAdtReadable, IAdtRepositoryStructure, IAdtRequest, IAdtServiceBindingTypes, IAdtServiceGroupReadable, IAdtSystemContext, IAdtTransportAware, IAdtTransportMoveObjects, IAdtTransportObjectActions, IAdtTransportSearchConfigurations, IAdtTransportSortAndCompress, IAdtUpdatable, IAdtValidatable, IAdtVersionable, ICdsTestDoubleCheckable, IFeatureToggleObject, IIncludeConfig, IServiceBindingConfig } from '@mcp-abap-adt/interfaces-adt';
|
|
16
16
|
import type { IAbapConnection } from '@mcp-abap-adt/interfaces-adt-connection';
|
|
17
17
|
import type { ILogger } from '@mcp-abap-adt/interfaces-utils';
|
|
18
18
|
import { accessControlDocuments, type IAccessControlConfig, type IAccessControlResults } from '../core/accessControl';
|
|
@@ -60,9 +60,9 @@ import { type ITransportConfig, type ITransportResults, transportDocuments } fro
|
|
|
60
60
|
* disagreement is no longer expressible. `capabilities/shape.ts` checks these
|
|
61
61
|
* against the manifest.
|
|
62
62
|
*/
|
|
63
|
-
export type IClassContract<R extends IClassResults> = IAdtCreatable<IClassConfig, ReturnType<R['created']>> & IAdtReadable<IClassConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IClassConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IClassConfig>, ReturnType<R['updated']>> & IAdtDeletable<IClassConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IClassConfig, ReturnType<R['validation']>> & IAdtCheckable<IClassConfig, ReturnType<R['check']>> & IAdtActivatable<IClassConfig, ReturnType<R['activation']>> & IAdtLockable<IClassConfig> & IAdtTransportAware<IClassConfig, string> & IAdtVersionable<IClassConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
|
|
64
|
-
export type IProgramContract<R extends IProgramResults> = IAdtCreatable<IProgramConfig, ReturnType<R['created']>> & IAdtReadable<IProgramConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IProgramConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IProgramConfig>, ReturnType<R['updated']>> & IAdtDeletable<IProgramConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IProgramConfig, ReturnType<R['validation']>> & IAdtCheckable<IProgramConfig, ReturnType<R['check']>> & IAdtActivatable<IProgramConfig, ReturnType<R['activation']>> & IAdtLockable<IProgramConfig> & IAdtTransportAware<IProgramConfig, ReturnType<R['transport']>> & IAdtVersionable<IProgramConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
|
|
65
|
-
export type IIncludeContract<R extends IIncludeResults> = IAdtCreatable<IIncludeConfig, ReturnType<R['created']>> & IAdtReadable<IIncludeConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IIncludeConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IIncludeConfig>, ReturnType<R['updated']>> & IAdtDeletable<IIncludeConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IIncludeConfig, ReturnType<R['validation']>> & IAdtActivatable<IIncludeConfig, ReturnType<R['activation']>> & IAdtLockable<IIncludeConfig>;
|
|
63
|
+
export type IClassContract<R extends IClassResults> = IAdtCreatable<IClassConfig, ReturnType<R['created']>> & IAdtReadable<IClassConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IClassConfig, ReturnType<R['metadata']>> & IAdtEnhancementHost<IClassConfig, ReturnType<R['enhancementElements']>, ReturnType<R['enhancementOptions']>> & IAdtUpdatable<Partial<IClassConfig>, ReturnType<R['updated']>> & IAdtDeletable<IClassConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IClassConfig, ReturnType<R['validation']>> & IAdtCheckable<IClassConfig, ReturnType<R['check']>> & IAdtActivatable<IClassConfig, ReturnType<R['activation']>> & IAdtLockable<IClassConfig> & IAdtTransportAware<IClassConfig, string> & IAdtVersionable<IClassConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
|
|
64
|
+
export type IProgramContract<R extends IProgramResults> = IAdtCreatable<IProgramConfig, ReturnType<R['created']>> & IAdtReadable<IProgramConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IProgramConfig, ReturnType<R['metadata']>> & IAdtEnhancementHost<IProgramConfig, ReturnType<R['enhancementElements']>, ReturnType<R['enhancementOptions']>> & IAdtUpdatable<Partial<IProgramConfig>, ReturnType<R['updated']>> & IAdtDeletable<IProgramConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IProgramConfig, ReturnType<R['validation']>> & IAdtCheckable<IProgramConfig, ReturnType<R['check']>> & IAdtActivatable<IProgramConfig, ReturnType<R['activation']>> & IAdtLockable<IProgramConfig> & IAdtTransportAware<IProgramConfig, ReturnType<R['transport']>> & IAdtVersionable<IProgramConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
|
|
65
|
+
export type IIncludeContract<R extends IIncludeResults> = IAdtCreatable<IIncludeConfig, ReturnType<R['created']>> & IAdtReadable<IIncludeConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IIncludeConfig, ReturnType<R['metadata']>> & IAdtIncludeEnhancementHost<IIncludeConfig, ReturnType<R['enhancementElements']>, ReturnType<R['enhancementOptions']>> & IAdtUpdatable<Partial<IIncludeConfig>, ReturnType<R['updated']>> & IAdtDeletable<IIncludeConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IIncludeConfig, ReturnType<R['validation']>> & IAdtActivatable<IIncludeConfig, ReturnType<R['activation']>> & IAdtLockable<IIncludeConfig>;
|
|
66
66
|
export type IInterfaceContract<R extends IInterfaceResults> = IAdtCreatable<IInterfaceConfig, ReturnType<R['created']>> & IAdtReadable<IInterfaceConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IInterfaceConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IInterfaceConfig>, ReturnType<R['updated']>> & IAdtDeletable<IInterfaceConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IInterfaceConfig, ReturnType<R['validation']>> & IAdtCheckable<IInterfaceConfig, ReturnType<R['check']>> & IAdtActivatable<IInterfaceConfig, ReturnType<R['activation']>> & IAdtLockable<IInterfaceConfig> & IAdtTransportAware<IInterfaceConfig, ReturnType<R['transport']>> & IAdtVersionable<IInterfaceConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
|
|
67
67
|
export type IDomainContract<R extends IDomainResults> = IAdtCreatable<IDomainConfig, ReturnType<R['created']>> & IAdtMetadataReadable<IDomainConfig, ReturnType<R['metadata']>> & IAdtMetadataUpdatable<Partial<IDomainConfig>, ReturnType<R['metadataUpdated']>> & IAdtDeletable<IDomainConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IDomainConfig, ReturnType<R['validation']>> & IAdtCheckable<IDomainConfig, ReturnType<R['check']>> & IAdtActivatable<IDomainConfig, ReturnType<R['activation']>> & IAdtLockable<IDomainConfig> & IAdtTransportAware<IDomainConfig, ReturnType<R['transport']>>;
|
|
68
68
|
export type IDataElementContract<R extends IDataElementResults> = IAdtCreatable<IDataElementConfig, ReturnType<R['created']>> & IAdtMetadataReadable<IDataElementConfig, ReturnType<R['metadata']>> & IAdtMetadataUpdatable<Partial<IDataElementConfig>, ReturnType<R['metadataUpdated']>> & IAdtDeletable<IDataElementConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IDataElementConfig, ReturnType<R['validation']>> & IAdtCheckable<IDataElementConfig, ReturnType<R['check']>> & IAdtActivatable<IDataElementConfig, ReturnType<R['activation']>> & IAdtLockable<IDataElementConfig> & IAdtTransportAware<IDataElementConfig, ReturnType<R['transport']>>;
|
|
@@ -71,7 +71,7 @@ export type IStructureContract<R extends IStructureResults> = IAdtCreatable<IStr
|
|
|
71
71
|
export type ITableContract<R extends ITableResults> = IAdtCreatable<ITableConfig, ReturnType<R['created']>> & IAdtReadable<ITableConfig, ReturnType<R['source']>> & IAdtMetadataReadable<ITableConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<ITableConfig>, ReturnType<R['updated']>> & IAdtDeletable<ITableConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<ITableConfig, ReturnType<R['validation']>> & IAdtCheckable<ITableConfig, ReturnType<R['check']>> & IAdtActivatable<ITableConfig, ReturnType<R['activation']>> & IAdtLockable<ITableConfig> & IAdtTransportAware<ITableConfig, ReturnType<R['transport']>> & IAdtVersionable<ITableConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
|
|
72
72
|
export type ITableTypeContract<R extends ITableTypeResults> = IAdtCreatable<ITableTypeConfig, ReturnType<R['created']>> & IAdtMetadataReadable<ITableTypeConfig, ReturnType<R['metadata']>> & IAdtMetadataUpdatable<Partial<ITableTypeConfig>, ReturnType<R['metadataUpdated']>> & IAdtDeletable<ITableTypeConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<ITableTypeConfig, ReturnType<R['validation']>> & IAdtCheckable<ITableTypeConfig, ReturnType<R['check']>> & IAdtActivatable<ITableTypeConfig, ReturnType<R['activation']>> & IAdtLockable<ITableTypeConfig> & IAdtTransportAware<ITableTypeConfig, ReturnType<R['transport']>> & IAdtVersionable<ITableTypeConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
|
|
73
73
|
export type IDdlContract<R extends IDdlResults> = IAdtCreatable<IDdlConfig, ReturnType<R['created']>> & IAdtReadable<IDdlConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IDdlConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IDdlConfig>, ReturnType<R['updated']>> & IAdtDeletable<IDdlConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IDdlConfig, ReturnType<R['validation']>> & IAdtCheckable<IDdlConfig, ReturnType<R['check']>> & IAdtActivatable<IDdlConfig, ReturnType<R['activation']>> & IAdtLockable<IDdlConfig> & IAdtTransportAware<IDdlConfig, ReturnType<R['transport']>> & IAdtVersionable<IDdlConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>> & ICdsTestDoubleCheckable<ReturnType<R['testDoubles']>>;
|
|
74
|
-
export type IFunctionGroupContract<R extends IFunctionGroupResults> = IAdtCreatable<IFunctionGroupConfig, ReturnType<R['created']>> & IAdtMetadataReadable<IFunctionGroupConfig, ReturnType<R['metadata']>> & IAdtMetadataUpdatable<Partial<IFunctionGroupConfig>, ReturnType<R['metadataUpdated']>> & IAdtDeletable<IFunctionGroupConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IFunctionGroupConfig, ReturnType<R['validation']>> & IAdtCheckable<IFunctionGroupConfig, ReturnType<R['check']>> & IAdtActivatable<IFunctionGroupConfig, ReturnType<R['activation']>> & IAdtLockable<IFunctionGroupConfig> & IAdtTransportAware<IFunctionGroupConfig, ReturnType<R['transport']>>;
|
|
74
|
+
export type IFunctionGroupContract<R extends IFunctionGroupResults> = IAdtCreatable<IFunctionGroupConfig, ReturnType<R['created']>> & IAdtMetadataReadable<IFunctionGroupConfig, ReturnType<R['metadata']>> & IAdtEnhancementHost<IFunctionGroupConfig, ReturnType<R['enhancementElements']>, ReturnType<R['enhancementOptions']>> & IAdtMetadataUpdatable<Partial<IFunctionGroupConfig>, ReturnType<R['metadataUpdated']>> & IAdtDeletable<IFunctionGroupConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IFunctionGroupConfig, ReturnType<R['validation']>> & IAdtCheckable<IFunctionGroupConfig, ReturnType<R['check']>> & IAdtActivatable<IFunctionGroupConfig, ReturnType<R['activation']>> & IAdtLockable<IFunctionGroupConfig> & IAdtTransportAware<IFunctionGroupConfig, ReturnType<R['transport']>>;
|
|
75
75
|
export type IFunctionModuleContract<R extends IFunctionModuleResults> = IAdtCreatable<IFunctionModuleConfig, ReturnType<R['created']>> & IAdtReadable<IFunctionModuleConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IFunctionModuleConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IFunctionModuleConfig>, ReturnType<R['updated']>> & IAdtDeletable<IFunctionModuleConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IFunctionModuleConfig, ReturnType<R['validation']>> & IAdtCheckable<IFunctionModuleConfig, ReturnType<R['check']>> & IAdtActivatable<IFunctionModuleConfig, ReturnType<R['activation']>> & IAdtLockable<IFunctionModuleConfig> & IAdtTransportAware<IFunctionModuleConfig, ReturnType<R['transport']>> & IAdtVersionable<IFunctionModuleConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
|
|
76
76
|
export type IFunctionIncludeContract<R extends IFunctionIncludeResults> = IAdtCreatable<IFunctionIncludeConfig, ReturnType<R['created']>> & IAdtReadable<IFunctionIncludeConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IFunctionIncludeConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IFunctionIncludeConfig>, ReturnType<R['updated']>> & IAdtMetadataUpdatable<Partial<IFunctionIncludeConfig>, ReturnType<R['metadataUpdated']>> & IAdtDeletable<IFunctionIncludeConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IFunctionIncludeConfig, ReturnType<R['validation']>> & IAdtCheckable<IFunctionIncludeConfig, ReturnType<R['check']>> & IAdtActivatable<IFunctionIncludeConfig, ReturnType<R['activation']>> & IAdtLockable<IFunctionIncludeConfig> & IAdtVersionable<IFunctionIncludeConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
|
|
77
77
|
export type IPackageContract<R extends IPackageResults> = IAdtCreatable<IPackageConfig, ReturnType<R['created']>> & IAdtMetadataReadable<IPackageConfig, ReturnType<R['metadata']>> & IAdtMetadataUpdatable<Partial<IPackageConfig>, ReturnType<R['metadataUpdated']>> & IAdtDeletable<IPackageConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IPackageConfig, ReturnType<R['validation']>> & IAdtCheckable<IPackageConfig, ReturnType<R['check']>> & IAdtLockable<IPackageConfig> & IAdtTransportAware<IPackageConfig, ReturnType<R['transport']>>;
|
|
@@ -109,7 +109,7 @@ export type IAppendStructureContract<R extends IAppendStructureResults> = IAdtCr
|
|
|
109
109
|
export type IBehaviorDefinitionContract<R extends IBehaviorDefinitionResults> = IAdtCreatable<IBehaviorDefinitionConfig, ReturnType<R['created']>> & IAdtReadable<IBehaviorDefinitionConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IBehaviorDefinitionConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IBehaviorDefinitionConfig>, ReturnType<R['updated']>> & IAdtDeletable<IBehaviorDefinitionConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IBehaviorDefinitionConfig, ReturnType<R['validation']>> & IAdtCheckable<IBehaviorDefinitionConfig, ReturnType<R['check']>> & IAdtActivatable<IBehaviorDefinitionConfig, ReturnType<R['activation']>> & IAdtLockable<IBehaviorDefinitionConfig> & IAdtTransportAware<IBehaviorDefinitionConfig, ReturnType<R['transport']>> & IAdtVersionable<IBehaviorDefinitionConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
|
|
110
110
|
export type IBehaviorImplementationContract<R extends IClassResults> = IAdtCreatable<IBehaviorImplementationConfig, ReturnType<R['created']>> & IAdtReadable<IBehaviorImplementationConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IBehaviorImplementationConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IBehaviorImplementationConfig>, ReturnType<R['updated']>> & IAdtDeletable<IBehaviorImplementationConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IBehaviorImplementationConfig, ReturnType<R['validation']>> & IAdtCheckable<IBehaviorImplementationConfig, ReturnType<R['check']>> & IAdtActivatable<IBehaviorImplementationConfig, ReturnType<R['activation']>> & IAdtLockable<IBehaviorImplementationConfig> & IAdtTransportAware<IBehaviorImplementationConfig, string> & IAdtVersionable<IBehaviorImplementationConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
|
|
111
111
|
export type IMetadataExtensionContract<R extends IMetadataExtensionResults> = IAdtCreatable<IMetadataExtensionConfig, ReturnType<R['created']>> & IAdtReadable<IMetadataExtensionConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IMetadataExtensionConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IMetadataExtensionConfig>, ReturnType<R['updated']>> & IAdtDeletable<IMetadataExtensionConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IMetadataExtensionConfig, ReturnType<R['validation']>> & IAdtCheckable<IMetadataExtensionConfig, ReturnType<R['check']>> & IAdtActivatable<IMetadataExtensionConfig, ReturnType<R['activation']>> & IAdtLockable<IMetadataExtensionConfig> & IAdtTransportAware<IMetadataExtensionConfig, ReturnType<R['transport']>> & IAdtVersionable<IMetadataExtensionConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
|
|
112
|
-
export type IEnhancementContract<R extends IEnhancementResults> = IAdtCreatable<IEnhancementConfig, ReturnType<R['created']>> & IAdtReadable<IEnhancementConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IEnhancementConfig, ReturnType<R['metadata']>> & IAdtUpdatable<Partial<IEnhancementConfig>, ReturnType<R['updated']>> & IAdtDeletable<IEnhancementConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IEnhancementConfig, ReturnType<R['validation']>> & IAdtCheckable<IEnhancementConfig, ReturnType<R['check']>> & IAdtActivatable<IEnhancementConfig, ReturnType<R['activation']>> & IAdtLockable<IEnhancementConfig> & IAdtTransportAware<IEnhancementConfig, ReturnType<R['transport']>> & IAdtVersionable<IEnhancementConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
|
|
112
|
+
export type IEnhancementContract<R extends IEnhancementResults> = IAdtCreatable<IEnhancementConfig, ReturnType<R['created']>> & IAdtReadable<IEnhancementConfig, ReturnType<R['source']>> & IAdtMetadataReadable<IEnhancementConfig, ReturnType<R['metadata']>> & IAdtMetadataUpdatable<IEnhancementConfig, ReturnType<R['metadataUpdated']>> & IAdtUpdatable<Partial<IEnhancementConfig>, ReturnType<R['updated']>> & IAdtDeletable<IEnhancementConfig, ReturnType<R['deletion']>, ReturnType<R['deletionCheck']>> & IAdtValidatable<IEnhancementConfig, ReturnType<R['validation']>> & IAdtCheckable<IEnhancementConfig, ReturnType<R['check']>> & IAdtActivatable<IEnhancementConfig, ReturnType<R['activation']>> & IAdtLockable<IEnhancementConfig> & IAdtTransportAware<IEnhancementConfig, ReturnType<R['transport']>> & IAdtVersionable<IEnhancementConfig, ReturnType<R['versions']>, ReturnType<R['versionSource']>>;
|
|
113
113
|
/**
|
|
114
114
|
* `IAdtTransportObjectActions`, `IAbapObjectEntry` and
|
|
115
115
|
* `IAdtTransportSearchConfigurations` are imported, not declared.
|