@abapify/adt-client 0.3.6 → 0.4.1

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.
@@ -0,0 +1,467 @@
1
+ import { exception } from "@abapify/adt-schemas";
2
+ import { AdtClientType, AdtContract, ClassResponse, CrudContract, CrudContractBase, CrudQueryParams, DataElementResponse, DomainResponse, FunctionGroupResponse, FunctionModuleResponse, HttpAdapter, HttpAdapter as HttpAdapter$1, IncludeResponse, IncludesContractSkeleton, InterfaceResponse, LockOptions, ObjectStructureOptions, Package as PackageResponse, ProgramResponse, RestContract, RestEndpointDescriptor, Serializable, SourceOperations, SourcesContract, StructureResponse, TableResponse, TableTypeResponse, TransportResponse as TransportGetResponse, UnlockOptions, adtContract } from "@abapify/adt-contracts";
3
+ import { Logger, Logger as Logger$1 } from "@abapify/logger";
4
+
5
+ //#region src/errors.d.ts
6
+ /**
7
+ * Parsed ADT exception structure - derived from ExceptionSchema
8
+ */
9
+ interface AdtExceptionData {
10
+ /** Exception namespace ID (e.g., "com.sap.adt.oo") */
11
+ namespace?: string;
12
+ /** Exception type ID (e.g., "OBJECT_NOT_FOUND") */
13
+ type?: string;
14
+ /** Human-readable error message */
15
+ message?: string;
16
+ /** Localized error message */
17
+ localizedMessage?: string;
18
+ /** Additional properties as key-value pairs */
19
+ properties?: Record<string, string>;
20
+ }
21
+ /**
22
+ * Custom error class for ADT exceptions
23
+ *
24
+ * Provides structured access to SAP ADT error details.
25
+ */
26
+ declare class AdtError extends Error {
27
+ /** HTTP status code */
28
+ readonly status: number;
29
+ /** HTTP status text */
30
+ readonly statusText: string;
31
+ /** Parsed ADT exception data (if available) */
32
+ readonly exception?: AdtExceptionData;
33
+ /** Raw response body */
34
+ readonly rawBody: string;
35
+ /** Request URL */
36
+ readonly url: string;
37
+ /** HTTP method */
38
+ readonly method: string;
39
+ constructor(options: {
40
+ status: number;
41
+ statusText: string;
42
+ url: string;
43
+ method: string;
44
+ rawBody: string;
45
+ exception?: AdtExceptionData;
46
+ });
47
+ /**
48
+ * Get the most relevant error message
49
+ */
50
+ get detailMessage(): string;
51
+ /**
52
+ * Check if this is a specific error type
53
+ */
54
+ isType(type: string): boolean;
55
+ /**
56
+ * Check if this is from a specific namespace
57
+ */
58
+ isNamespace(namespace: string): boolean;
59
+ /**
60
+ * Get a property value from the exception
61
+ */
62
+ getProperty(key: string): string | undefined;
63
+ }
64
+ //#endregion
65
+ //#region src/types.d.ts
66
+ interface AdtConnectionConfig {
67
+ baseUrl: string;
68
+ username?: string;
69
+ password?: string;
70
+ cookieHeader?: string;
71
+ authorizationHeader?: string;
72
+ client?: string;
73
+ language?: string;
74
+ logger?: Logger$1;
75
+ }
76
+ interface LockHandle {
77
+ lockHandle: string;
78
+ objectUri: string;
79
+ }
80
+ interface OperationResult {
81
+ success: boolean;
82
+ message?: string;
83
+ }
84
+ //#endregion
85
+ //#region src/plugins/types.d.ts
86
+ /**
87
+ * Plugin Types - Core interfaces for the response plugin system
88
+ */
89
+ /**
90
+ * Response context passed to plugins
91
+ */
92
+ interface ResponseContext {
93
+ /** Raw response text (XML) */
94
+ rawText: string;
95
+ /** Parsed response object (if schema available) */
96
+ parsedData?: unknown;
97
+ /** Request URL */
98
+ url: string;
99
+ /** Request method */
100
+ method: string;
101
+ /** Response content type */
102
+ contentType: string;
103
+ }
104
+ /**
105
+ * Response plugin interface
106
+ */
107
+ interface ResponsePlugin {
108
+ /**
109
+ * Plugin name for identification
110
+ */
111
+ name: string;
112
+ /**
113
+ * Process response before returning to caller
114
+ * Can store files, transform data, log, etc.
115
+ *
116
+ * @param context - Response context with raw and parsed data
117
+ * @returns Modified data or original data
118
+ */
119
+ process(context: ResponseContext): Promise<unknown> | unknown;
120
+ }
121
+ //#endregion
122
+ //#region src/adapter.d.ts
123
+ /**
124
+ * Extended ADT connection config with plugins
125
+ */
126
+ interface AdtAdapterConfig extends AdtConnectionConfig {
127
+ /** Response plugins for intercepting and transforming responses */
128
+ plugins?: ResponsePlugin[];
129
+ /**
130
+ * Callback when session expires (SAML redirect detected)
131
+ * Return new cookie header to retry the request, or throw to abort
132
+ */
133
+ onSessionExpired?: () => Promise<string>;
134
+ }
135
+ /**
136
+ * Create ADT HTTP adapter with Basic or SAML Authentication and plugin support
137
+ */
138
+ /** Extended adapter with ETag management */
139
+ interface AdtHttpAdapter extends HttpAdapter$1 {
140
+ /** Clear cached ETag for a specific URL, or all ETags if no URL given */
141
+ clearETag(url?: string): void;
142
+ }
143
+ declare function createAdtAdapter(config: AdtAdapterConfig): AdtHttpAdapter;
144
+ //#endregion
145
+ //#region src/services/transports.d.ts
146
+ /**
147
+ * Transport data structure (simplified for service consumers)
148
+ */
149
+ interface Transport {
150
+ number: string;
151
+ desc?: string;
152
+ owner?: string;
153
+ status?: string;
154
+ type?: string;
155
+ target?: string;
156
+ tasks?: TransportTask[];
157
+ }
158
+ interface TransportTask {
159
+ number: string;
160
+ owner?: string;
161
+ status?: string;
162
+ }
163
+ /**
164
+ * Options for creating a transport
165
+ */
166
+ interface CreateTransportOptions {
167
+ description: string;
168
+ type?: 'K' | 'W';
169
+ target?: string;
170
+ project?: string;
171
+ owner?: string;
172
+ }
173
+ /**
174
+ * Options for listing transports
175
+ */
176
+ interface ListTransportsOptions {
177
+ targets?: string;
178
+ configUri?: string;
179
+ }
180
+ /**
181
+ * Transport Service - orchestrates CTS operations
182
+ */
183
+ declare class TransportService {
184
+ private readonly adt;
185
+ constructor(adt: AdtClientType);
186
+ /**
187
+ * List transport requests
188
+ */
189
+ list(options?: ListTransportsOptions): Promise<Transport[]>;
190
+ /**
191
+ * Get a single transport by number
192
+ */
193
+ get(trkorr: string): Promise<Transport>;
194
+ /**
195
+ * Create a new transport request
196
+ *
197
+ * Note: Full create implementation requires XML body building.
198
+ * For now, this is a placeholder that throws a helpful error.
199
+ * Use ADK's AdkTransportRequest.create() for full functionality.
200
+ */
201
+ create(_options: CreateTransportOptions): Promise<Transport>;
202
+ /**
203
+ * Delete a transport request
204
+ */
205
+ delete(trkorr: string): Promise<void>;
206
+ /**
207
+ * Release a transport request
208
+ *
209
+ * Note: Release requires POST with specific action parameter.
210
+ * This is a placeholder for the full implementation.
211
+ */
212
+ release(_trkorr: string): Promise<void>;
213
+ /**
214
+ * Extract requests array from various response formats
215
+ */
216
+ private extractRequests;
217
+ /**
218
+ * Map raw request data to Transport interface
219
+ */
220
+ private mapToTransport;
221
+ /**
222
+ * Extract tasks from transport data
223
+ */
224
+ private extractTasks;
225
+ }
226
+ /**
227
+ * Create transport service instance
228
+ */
229
+ declare function createTransportService(adt: AdtClientType): TransportService;
230
+ //#endregion
231
+ //#region src/services/users.d.ts
232
+ /** Normalized user info from Atom feed entries */
233
+ interface UserInfo {
234
+ username: string;
235
+ fullName?: string;
236
+ uri?: string;
237
+ }
238
+ /** Current authenticated user info from systeminformation */
239
+ interface CurrentUserInfo {
240
+ userName: string;
241
+ userFullName?: string;
242
+ systemID: string;
243
+ client: string;
244
+ }
245
+ /**
246
+ * User Service - orchestrates user lookup operations
247
+ */
248
+ declare class UserService {
249
+ private readonly adt;
250
+ constructor(adt: AdtClientType);
251
+ /** Get the currently authenticated user via systeminformation */
252
+ getCurrentUser(): Promise<CurrentUserInfo>;
253
+ /** Look up a specific user by exact username */
254
+ getUserByName(username: string): Promise<UserInfo[]>;
255
+ /** Search users by wildcard query */
256
+ searchUsers(query: string, maxcount?: number): Promise<UserInfo[]>;
257
+ }
258
+ declare function createUserService(adt: AdtClientType): UserService;
259
+ //#endregion
260
+ //#region src/client.d.ts
261
+ /**
262
+ * Fetch options for generic HTTP requests
263
+ */
264
+ interface FetchOptions {
265
+ method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
266
+ headers?: Record<string, string>;
267
+ body?: string;
268
+ }
269
+ /**
270
+ * Services layer - business logic orchestration
271
+ */
272
+ interface AdtServices {
273
+ transports: TransportService;
274
+ }
275
+ interface AdtClientReturn {
276
+ adt: AdtClientType;
277
+ services: AdtServices;
278
+ fetch: (url: string, options?: FetchOptions) => Promise<unknown>;
279
+ /** Clear cached ETag for a specific URL, or all ETags if no URL given */
280
+ clearETag: (url?: string) => void;
281
+ }
282
+ declare function createAdtClient(config: AdtAdapterConfig): AdtClientReturn;
283
+ type AdtClient = ReturnType<typeof createAdtClient>;
284
+ //#endregion
285
+ //#region src/plugins/logging.d.ts
286
+ type LogFunction = (message: string, data?: any) => void;
287
+ /**
288
+ * Logging plugin - logs requests and responses
289
+ */
290
+ declare class LoggingPlugin implements ResponsePlugin {
291
+ private readonly logger;
292
+ name: string;
293
+ constructor(logger?: LogFunction);
294
+ process(context: ResponseContext): unknown;
295
+ }
296
+ //#endregion
297
+ //#region src/plugins/file-logging.d.ts
298
+ interface FileLoggingConfig {
299
+ outputDir: string;
300
+ writeMetadata?: boolean;
301
+ logger?: Logger$1;
302
+ }
303
+ /**
304
+ * Plugin that logs HTTP responses to files
305
+ * Similar to v1's FileLogger functionality
306
+ */
307
+ declare class FileLoggingPlugin implements ResponsePlugin {
308
+ private readonly config;
309
+ name: string;
310
+ constructor(config: FileLoggingConfig);
311
+ process(context: ResponseContext): unknown;
312
+ /**
313
+ * Generate file path for HTTP response
314
+ * Converts URL to fixture-style path structure
315
+ */
316
+ private generateFilePath;
317
+ /**
318
+ * Get metadata file path for a response file
319
+ */
320
+ private getMetadataPath;
321
+ }
322
+ //#endregion
323
+ //#region src/utils/session.d.ts
324
+ /**
325
+ * Cookie Store - Manages HTTP cookies for stateful sessions
326
+ */
327
+ declare class CookieStore {
328
+ private readonly cookies;
329
+ /**
330
+ * Parse Set-Cookie header and store cookies
331
+ * Handles complex cookie strings with expires dates
332
+ */
333
+ parseCookies(setCookieHeader: string): void;
334
+ /**
335
+ * Split Set-Cookie header by commas, avoiding splitting on expires dates
336
+ */
337
+ private splitCookieHeader;
338
+ /**
339
+ * Get Cookie header value for requests
340
+ */
341
+ getCookieHeader(): string | undefined;
342
+ /**
343
+ * Check if we have any cookies
344
+ */
345
+ hasCookies(): boolean;
346
+ /**
347
+ * Clear all cookies
348
+ */
349
+ clear(): void;
350
+ /**
351
+ * Get all cookies as a map (for testing/debugging)
352
+ */
353
+ getAll(): Map<string, string>;
354
+ /**
355
+ * Inject pre-existing cookies (e.g., from SAML authentication)
356
+ * @param cookieString Cookie string in "name=value; name2=value2" format
357
+ */
358
+ injectCookie(cookieString: string): void;
359
+ }
360
+ /**
361
+ * CSRF Token Manager - Handles CSRF token caching and initialization
362
+ */
363
+ declare class CsrfTokenManager {
364
+ private cachedToken?;
365
+ /**
366
+ * Extract CSRF token from cookies (SAP stores it there)
367
+ */
368
+ extractFromCookies(cookies: Map<string, string>): string | undefined;
369
+ /**
370
+ * Extract CSRF token from response header
371
+ */
372
+ extractFromHeader(headerValue: string | null): string | undefined;
373
+ /**
374
+ * Cache a CSRF token
375
+ */
376
+ cache(token: string): void;
377
+ /**
378
+ * Get cached CSRF token
379
+ */
380
+ getCached(): string | undefined;
381
+ /**
382
+ * Clear cached CSRF token (e.g., on 403 errors)
383
+ */
384
+ clear(): void;
385
+ /**
386
+ * Check if we have a cached token
387
+ */
388
+ hasCached(): boolean;
389
+ /**
390
+ * Alias for hasCached() - for consistency with SessionManager API
391
+ */
392
+ hasToken(): boolean;
393
+ }
394
+ /**
395
+ * Session Manager - Orchestrates cookies and CSRF tokens
396
+ */
397
+ declare class SessionManager {
398
+ private readonly logger?;
399
+ private readonly cookieStore;
400
+ private readonly csrfManager;
401
+ private readonly etagManager;
402
+ private securitySessionActive;
403
+ constructor(logger?: Logger$1 | undefined);
404
+ /**
405
+ * Process response to update session state
406
+ * Extracts cookies, CSRF tokens, and ETags
407
+ * @param response The HTTP response
408
+ * @param url Optional URL for ETag caching (required for ETag tracking)
409
+ */
410
+ processResponse(response: Response, url?: string): void;
411
+ /**
412
+ * Get headers for next request
413
+ * @param method HTTP method
414
+ * @param url Optional URL for ETag lookup (for PUT/PATCH with optimistic locking)
415
+ */
416
+ getRequestHeaders(method: string, url?: string): Record<string, string>;
417
+ /**
418
+ * Get cached ETag for a URL
419
+ */
420
+ getETag(url: string): string | undefined;
421
+ /**
422
+ * Clear cached ETag for a URL
423
+ */
424
+ clearETag(url?: string): void;
425
+ /**
426
+ * Initialize CSRF token using the Eclipse ADT security session flow:
427
+ *
428
+ * 1. GET /sessions + x-sap-security-session: create → create security session
429
+ * 2. GET /sessions + x-sap-security-session: use + x-csrf-token: Fetch → get CSRF token
430
+ * 3. DELETE /sessions/<id> + x-sap-security-session: use + x-csrf-token → destroy session
431
+ *
432
+ * The CSRF token survives the session deletion and remains valid for
433
+ * all subsequent lock/unlock operations. Deleting the session frees
434
+ * the slot — SAP allows only one security session per user.
435
+ *
436
+ * @param baseUrl - SAP system base URL
437
+ * @param authHeader - Authorization header (Basic/Bearer), or undefined for cookie auth
438
+ * @param client - SAP client number
439
+ * @param language - SAP language
440
+ */
441
+ initializeCsrf(baseUrl: string, authHeader?: string, client?: string, language?: string): Promise<boolean>;
442
+ /**
443
+ * Clear all session state (cookies and CSRF)
444
+ */
445
+ clear(): void;
446
+ /**
447
+ * Check if we have a cached CSRF token
448
+ */
449
+ hasCsrfToken(): boolean;
450
+ /**
451
+ * Get Cookie header value for requests
452
+ */
453
+ getCookieHeader(): string | undefined;
454
+ /**
455
+ * Get session type header value
456
+ * SAP ADT requires 'stateful' for operations that need session persistence
457
+ */
458
+ getSessionTypeHeader(): string;
459
+ /**
460
+ * Inject a pre-existing cookie (e.g., from SAML authentication)
461
+ * @param cookieString Cookie string in "name=value" format
462
+ */
463
+ injectCookie(cookieString: string): void;
464
+ }
465
+ //#endregion
466
+ export { type AdtAdapterConfig, type AdtClient, type AdtConnectionConfig, type AdtContract, type AdtError, type ClassResponse, CookieStore, type CreateTransportOptions, type CrudContract, type CrudContractBase, type CrudQueryParams, CsrfTokenManager, type CurrentUserInfo, type DataElementResponse, type DomainResponse, type FileLoggingConfig, FileLoggingPlugin, type FunctionGroupResponse, type FunctionModuleResponse, type HttpAdapter, type IncludeResponse, type IncludesContractSkeleton, type InterfaceResponse, type ListTransportsOptions, type LockHandle, type LockOptions, type LogFunction, type Logger, LoggingPlugin, type ObjectStructureOptions, type OperationResult, type PackageResponse, type ProgramResponse, type ResponseContext, type ResponsePlugin, type RestContract, type RestEndpointDescriptor, type Serializable, SessionManager, type SourceOperations, type SourcesContract, type StructureResponse, type TableResponse, type TableTypeResponse, type Transport, type TransportGetResponse, TransportService, type TransportTask, type UnlockOptions, type UserInfo, UserService, adtContract, createAdtAdapter, createAdtClient, createTransportService, createUserService };
467
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/errors.ts","../src/types.ts","../src/plugins/types.ts","../src/adapter.ts","../src/services/transports.ts","../src/services/users.ts","../src/client.ts","../src/plugins/logging.ts","../src/plugins/file-logging.ts","../src/utils/session.ts"],"mappings":"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"}