@abapify/adk 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.
- package/dist/factory-DtyrTGlN.mjs +394 -0
- package/dist/factory-DtyrTGlN.mjs.map +1 -0
- package/dist/index.d.mts +2899 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +4300 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +4 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["createLockService","PackageKind","ClassKind","InterfaceKind","ProgramKind","IncludeKind","FunctionGroupKind","FunctionModuleKind","DomainKind","DataElementKind","TableKind","StructureKind","TableTypeKind","asArray","TransportRequestKind"],"sources":["../src/base/fetch-utils.ts","../src/base/model.ts","../src/base/object-set.ts","../src/base/adt.ts","../src/base/global-context.ts","../src/objects/repository/devc/devc.model.ts","../src/decorators/lockable.ts","../src/decorators/datetime.ts","../src/decorators/lazy.ts","../src/objects/repository/clas/clas.model.ts","../src/objects/repository/intf/intf.model.ts","../src/objects/repository/prog/prog.model.ts","../src/objects/repository/incl/incl.model.ts","../src/objects/repository/fugr/fugr.model.ts","../src/objects/repository/fugr/func/func.model.ts","../src/objects/ddic/doma/doma.model.ts","../src/objects/ddic/dtel/dtel.model.ts","../src/objects/ddic/tabl/tabl.model.ts","../src/objects/ddic/ttyp/ttyp.model.ts","../src/objects/cds/ddl.model.ts","../src/objects/cds/dcl.model.ts","../src/objects/repository/bdef/bdef.model.ts","../src/objects/repository/badi/badi.model.ts","../src/objects/repository/srvd/srvd.model.ts","../src/objects/repository/srvb/srvb.model.ts","../src/objects/cts/transport/transport-object.ts","../src/objects/cts/transport/transport.ts","../src/objects/cts/transport-import.ts"],"sourcesContent":["/**\n * Utility for handling v2 client fetch responses.\n *\n * The v2 ADT client's `fetch()` returns parsed data directly (a string for\n * text/plain content), not a standard `Response` object. This helper\n * normalises both cases so ADK objects work with both client versions.\n */\n\n/**\n * Convert a fetch result to a text string.\n *\n * - If the result is already a string (v2 client), return it as-is.\n * - If the result is a Response-like object (v1 / standard fetch), call `.text()`.\n */\nexport async function toText(result: unknown): Promise<string> {\n if (typeof result === 'string') return result;\n if (\n result &&\n typeof result === 'object' &&\n 'text' in result &&\n typeof (result as any).text === 'function'\n ) {\n return (result as Response).text();\n }\n if (result === null || result === undefined) return '';\n if (typeof result === 'object') {\n try {\n return JSON.stringify(result);\n } catch {\n // JSON.stringify throws on circular refs / BigInt — fall back to the\n // default string coercion rather than propagating an unrelated error.\n return String(result);\n }\n }\n return String(result);\n}\n","/**\n * ADK v2 - Base Object\n *\n * Abstract base class for all ADK objects.\n * Supports two construction patterns:\n * 1. Full data: new AdkObject(ctx, data)\n * 2. Deferred load: new AdkObject(ctx, 'OBJECT_NAME').load()\n *\n * Provides lazy loading, caching, and automatic lock/unlock.\n *\n * Hierarchy (mirrors XSD):\n * - AdkObject (AdtObject) - base with name, type, links, description, version, etc.\n * - AdkMainObject (AdtMainObject) - adds packageRef, responsible, masterLanguage\n */\n\nimport type { AdkContext } from './context';\nimport type { AdtClient } from './adt';\nimport type { AdkKind } from './kinds';\nimport type { LockHandle } from '@abapify/adt-locks';\nimport { toText } from './fetch-utils';\n\nexport type { LockHandle } from '@abapify/adt-locks';\n\n/**\n * Save mode for create/update operations\n * - 'update': PUT to existing object (default, fails if doesn't exist)\n * - 'create': POST to create new object (skips POST if already exists, then updates)\n * - 'upsert': Try PUT first, fall back to POST if 404\n */\nexport type SaveMode = 'update' | 'create' | 'upsert';\n\n/**\n * Options for save operations\n */\nexport interface SaveOptions {\n /** Transport request for the change */\n transport?: string;\n /** Save as inactive (default: false) */\n inactive?: boolean;\n /** Save mode: 'update' (default), 'create', or 'upsert' */\n mode?: SaveMode;\n}\n\n/**\n * Result of bulk activation\n */\nexport interface ActivationResult {\n /** Number of successfully activated objects */\n success: number;\n /** Number of objects that failed activation */\n failed: number;\n /** Activation messages (errors, warnings) */\n messages: string[];\n /** Raw response from SAP (for debugging) */\n response?: string;\n}\n\n/**\n * Atom link (from atom:link element)\n * Used for HATEOAS-style navigation in ADT responses\n */\nexport interface AtomLink {\n href: string;\n rel?: string;\n type?: string;\n title?: string;\n etag?: string;\n}\n\n/**\n * ADT object reference (adtcore:objectReference)\n */\nexport interface AdtObjectReference {\n uri?: string;\n name?: string;\n type?: string;\n description?: string;\n packageName?: string;\n}\n\n/**\n * Base data contract for all ADK objects\n * Matches XSD AdtObject type attributes and elements\n */\nexport interface AdkObjectData {\n // Required attributes\n name: string;\n type: string;\n // Optional AdtObject attributes\n description?: string;\n changedBy?: string;\n changedAt?: string | Date;\n createdBy?: string;\n createdAt?: string | Date;\n version?: string;\n language?: string;\n descriptionTextLimit?: number;\n // Optional AdtObject elements\n links?: AtomLink[];\n containerRef?: AdtObjectReference;\n}\n\n/**\n * Main object data contract (extends AdtObject)\n * Matches XSD AdtMainObject type\n */\nexport interface AdkMainObjectData extends AdkObjectData {\n packageRef?: AdtObjectReference;\n masterSystem?: string;\n masterLanguage?: string;\n responsible?: string;\n abapLanguageVersion?: string;\n}\n\n/**\n * Base class for all ADK objects\n *\n * All ADK objects (AdkPackage, AdkTransportRequest, etc.) extend this.\n * Supports deferred loading - create with just a name, then call load().\n *\n * Note: Uses loose type constraint for D to allow schema-inferred types\n * from contracts which may have different shapes. The getters safely\n * handle missing properties with defaults.\n *\n * @typeParam K - The object kind (from AdkKind)\n * @typeParam D - The internal data type (typically schema-inferred from contract)\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport abstract class AdkObject<K extends AdkKind = AdkKind, D = any> {\n /** Object kind identifier */\n abstract readonly kind: K;\n\n /**\n * ADT object URI - base path for all operations.\n * Example: `/sap/bc/adt/oo/classes/zcl_my_class`\n */\n abstract get objectUri(): string;\n\n /**\n * ADT collection URI - base path for creating new objects.\n * Example: `/sap/bc/adt/oo/classes`\n * Default: derived from objectUri by removing the object name\n */\n get collectionUri(): string {\n // Default: strip the last path segment from objectUri\n const uri = this.objectUri;\n const lastSlash = uri.lastIndexOf('/');\n return lastSlash > 0 ? uri.substring(0, lastSlash) : uri;\n }\n\n protected ctx: AdkContext;\n\n /** Public access to the ADT client for plugins and external code */\n get client(): AdtClient {\n return this.ctx.client;\n }\n\n protected _data?: D;\n protected _name: string;\n protected cache = new Map<string, unknown>();\n protected dirty = new Set<string>();\n protected _lockHandle?: LockHandle;\n\n /** Set by save() when all pending changes are identical to SAP state */\n _unchanged = false;\n\n /**\n * Create ADK object\n * @param ctx - ADK context\n * @param dataOrName - Full data object OR just the object name for deferred loading\n */\n constructor(ctx: AdkContext, dataOrName: D | string) {\n this.ctx = ctx;\n if (typeof dataOrName === 'string') {\n // Deferred load - just store the name\n this._name = dataOrName;\n } else {\n // Full data provided\n this._data = dataOrName;\n // Cast to access name property which may exist on schema-inferred types\n this._name = (dataOrName as AdkObjectData).name;\n }\n }\n\n // ============================================\n // Context Management\n // ============================================\n\n /**\n * Adopt a richer context (merge services into existing context).\n *\n * Used by AdkObjectSet to propagate lockService / lockStore\n * to objects created by plugins that only have { client }.\n * Keeps the original client reference intact.\n */\n adoptContext(ctx: AdkContext): void {\n this.ctx = { ...this.ctx, ...ctx };\n }\n\n // ============================================\n // Deferred Loading Support\n // ============================================\n\n /**\n * Load object data from SAP\n *\n * Default implementation uses crudContract.get() and unwraps with wrapperKey.\n * Objects without crudContract must override this.\n *\n * @returns this (for chaining)\n */\n async load(): Promise<this> {\n const contract = this.crudContract;\n const wrapperKey = this.wrapperKey;\n\n if (!contract || !wrapperKey) {\n throw new Error(\n `Load not implemented for ${this.kind}. Override load() or provide crudContract/wrapperKey.`,\n );\n }\n\n const response = await contract.get(this.name);\n\n if (!response || !(wrapperKey in response)) {\n throw new Error(\n `${this.kind} '${this.name}' not found or returned empty response`,\n );\n }\n\n this.setData((response as Record<string, unknown>)[wrapperKey] as D);\n return this;\n }\n\n /** Whether data has been loaded */\n get isLoaded(): boolean {\n return !!this._data;\n }\n\n /**\n * Get data - auto-loads if not already loaded\n * @returns Promise that resolves to the data\n */\n async data(): Promise<D> {\n if (!this._data) {\n await this.load();\n }\n // After load(), _data is guaranteed to be set\n return this._data as D;\n }\n\n /**\n * Get data synchronously - throws if not loaded\n * Use when you know data is already loaded\n */\n get dataSync(): D {\n if (!this._data) {\n throw new Error(\n `${this.kind} '${this._name}' not loaded. Call load() or use data() instead.`,\n );\n }\n return this._data;\n }\n\n /** Set data (for subclasses to use after loading) */\n protected setData(data: D): void {\n this._data = data;\n // Cast to access name property which may exist on schema-inferred types\n this._name = (data as AdkObjectData).name;\n }\n\n /** Helper to access data with AdkObjectData properties */\n private get coreData(): AdkObjectData {\n return this.dataSync as unknown as AdkObjectData;\n }\n\n // ============================================\n // Core Properties (adtcore:* attributes)\n // ============================================\n\n /** ADT object name (adtcore:name) - available even before load() */\n get name(): string {\n return this._name;\n }\n\n /** ADT object type (adtcore:type, e.g. 'RQRQ', 'DEVC/K') - requires load() */\n get type(): string {\n return this.coreData.type;\n }\n\n /** Description text (adtcore:description) */\n get description(): string {\n return this.coreData.description ?? '';\n }\n\n /** Version state (adtcore:version) - active, inactive, etc. */\n get version(): string {\n return this.coreData.version ?? '';\n }\n\n /** Current language (adtcore:language) */\n get language(): string {\n return this.coreData.language ?? '';\n }\n\n /** User who last modified (adtcore:changedBy) */\n get changedBy(): string {\n return this.coreData.changedBy ?? '';\n }\n\n /** Last modification timestamp (adtcore:changedAt) */\n get changedAt(): Date {\n const val = this.coreData.changedAt;\n return val instanceof Date ? val : val ? new Date(val) : new Date(0);\n }\n\n /** User who created (adtcore:createdBy) */\n get createdBy(): string {\n return this.coreData.createdBy ?? '';\n }\n\n /** Creation timestamp (adtcore:createdAt) */\n get createdAt(): Date {\n const val = this.coreData.createdAt;\n return val instanceof Date ? val : val ? new Date(val) : new Date(0);\n }\n\n // ============================================\n // Links (atom:link elements)\n // ============================================\n\n /** All atom:link elements */\n get links(): AtomLink[] {\n return this.coreData.links ?? [];\n }\n\n /** Find link by rel attribute */\n getLink(rel: string): AtomLink | undefined {\n return this.links.find((l) => l.rel === rel);\n }\n\n /** Get link href by rel, or undefined */\n getLinkHref(rel: string): string | undefined {\n return this.getLink(rel)?.href;\n }\n\n /** Container reference (adtcore:containerRef) */\n get containerRef(): AdtObjectReference | undefined {\n return this.coreData.containerRef;\n }\n\n // ============================================\n // Lock State\n // ============================================\n\n /** Check if object is currently locked */\n get isLocked(): boolean {\n return !!this._lockHandle;\n }\n\n /** Get current lock handle */\n get lockHandle(): LockHandle | undefined {\n return this._lockHandle;\n }\n\n /**\n * Lock the object for modification\n *\n * Delegates to the lock service (single lock mechanism).\n *\n * The lock response contains:\n * - LOCK_HANDLE: Required for subsequent PUT/unlock operations\n * - CORRNR: Transport request assigned to this object (use for PUT if no explicit transport)\n * - CORRUSER: User who owns the transport\n *\n * @param transport - Optional transport request to use for locking.\n * Required when object is already in a transport.\n */\n async lock(transport?: string): Promise<LockHandle> {\n if (this._lockHandle) return this._lockHandle;\n\n const lockService = this.ctx.lockService;\n if (!lockService) {\n throw new Error(\n `Lock not available: no lockService in context. Did you call initializeAdk()?`,\n );\n }\n\n this._lockHandle = await lockService.lock(this.objectUri, {\n transport,\n objectName: this.name,\n objectType: this.kind,\n });\n\n return this._lockHandle;\n }\n\n /**\n * Unlock the object\n *\n * Delegates to the lock service (single lock mechanism).\n */\n async unlock(): Promise<void> {\n if (!this._lockHandle) return;\n\n const lockService = this.ctx.lockService;\n if (!lockService) {\n throw new Error(\n `Unlock not available: no lockService in context. Did you call initializeAdk()?`,\n );\n }\n\n await lockService.unlock(this.objectUri, {\n lockHandle: this._lockHandle.handle,\n });\n this._lockHandle = undefined;\n }\n\n /**\n * Set lock handle (for subclasses that need custom lock logic)\n */\n protected setLockHandle(handle: LockHandle | undefined): void {\n this._lockHandle = handle;\n }\n\n // ============================================\n // Save Operations\n // ============================================\n\n /**\n * Save the object to SAP\n *\n * Generic implementation that handles:\n * - Lock/unlock lifecycle\n * - Mode switching (create/update/upsert)\n * - Error handling\n *\n * Subclasses implement `saveViaContract()` to provide the typed contract call.\n *\n * Modes:\n * - 'update' (default): PUT to existing object\n * - 'create': POST skeleton, then lock → PUT/source → unlock (Eclipse ADT pattern)\n * - 'upsert': Check existence, create if needed, then update\n *\n * @param options - Save options\n * @returns this (for chaining)\n */\n async save(options: SaveOptions = {}): Promise<this> {\n const { transport, mode = 'update' } = options;\n\n // Reset per-save-attempt state\n this._unchanged = false;\n\n // Create mode: POST skeleton, then continue with update flow.\n // This follows the Eclipse ADT pattern:\n // 1. POST minimal object (name, description, package)\n // 2. Lock → PUT full metadata / PUT source → Unlock → Activate\n //\n // Before POSTing, check if the object already exists on SAP.\n // This prevents \"already exists\" / \"already locked\" errors when\n // re-running a deploy against objects that were partially created\n // (e.g. stale CTS locks on BTP that survive object deletion).\n if (mode === 'create') {\n const alreadyExists = await this.checkObjectExists();\n if (!alreadyExists) {\n await this.saveViaContract('create', { transport });\n }\n // Object now exists — update with full data + sources\n return this.save({ ...options, mode: 'update' });\n }\n\n // Check if object has pending sources (from abapGit deserialization)\n const hasPendingSources = this.hasPendingSources();\n\n // For updates with pending sources, compare with SAP before locking.\n // This avoids acquiring a lock only to discover nothing changed.\n if (hasPendingSources) {\n await this.checkPendingSourcesUnchanged();\n if (this._unchanged) {\n return this;\n }\n }\n\n // For metadata-only objects (no pending sources), fetch SAP state and\n // compare using recursive subset match. Only fields present in local data\n // are checked; SAP's extra metadata (timestamps, links, etc.) is ignored.\n // Empty-like values (null, \"\", false, [], {}) are treated as equivalent\n // to handle SAP's default normalization. Works for DDIC types.\n if (!hasPendingSources) {\n await this.checkMetadataUnchanged();\n if (this._unchanged) {\n return this;\n }\n }\n\n // For upsert mode, check existence before locking.\n // On BTP, locking a non-existent DDIC object creates a draft that\n // persists even after unlock, blocking subsequent POST (create) attempts.\n // A lightweight GET avoids this problem entirely.\n let confirmedExists = false;\n if (mode === 'upsert') {\n confirmedExists = await this.checkObjectExists();\n if (!confirmedExists) {\n return this.fallbackToCreate(options);\n }\n }\n\n // Lock if not already locked (create mode already returned above)\n const wasLocked = this.isLocked;\n if (!wasLocked) {\n try {\n await this.lock(transport);\n } catch (e) {\n // For upsert, fallback to create if object doesn't exist (404)\n // or endpoint doesn't support the operation (405 - common for DDIC types).\n // But ONLY if checkObjectExists hasn't already confirmed the object exists.\n // If the object exists and LOCK fails (e.g., 403 S_ABPLNGVS), it's a real\n // auth error — falling back to create would just produce a confusing\n // \"already exists\" error.\n if (\n mode === 'upsert' &&\n !confirmedExists &&\n this.shouldFallbackToCreate(e)\n ) {\n return this.fallbackToCreate(options);\n }\n throw e;\n }\n }\n\n try {\n // Use transport from lock response if not explicitly provided\n // The lock response contains CORRNR which is the transport assigned to this object\n const effectiveTransport =\n transport ?? this._lockHandle?.correlationNumber;\n\n // Refresh cached ETags after locking.\n // SAP changes the object's internal version when a lock is acquired,\n // which invalidates all cached ETags (metadata AND source).\n // Without this, the subsequent PUT sends a stale If-Match header → HTTP 412.\n if (!wasLocked) {\n await this.refreshETagsAfterLock();\n }\n\n if (hasPendingSources) {\n // Save sources only - skip metadata PUT which SAP often rejects\n await this.savePendingSources({\n lockHandle: this._lockHandle?.handle,\n transport: effectiveTransport,\n });\n } else {\n // Delegate to subclass for typed contract call\n // Note: 'upsert' is handled by the retry logic, so we pass the effective mode\n const effectiveMode = mode === 'upsert' ? 'update' : mode;\n await this.saveViaContract(effectiveMode, {\n transport: effectiveTransport,\n lockHandle: this._lockHandle?.handle,\n });\n }\n\n // Clear dirty flags\n this.dirty.clear();\n\n return this;\n } catch (e: unknown) {\n // For upsert with PUT failure (404/405/S_ABPLNGVS), try POST (create)\n if (mode === 'upsert' && this.shouldFallbackToCreate(e)) {\n // Unlock before falling back to create — the lock from the upsert\n // attempt blocks the POST (create) request on BTP systems.\n if (!wasLocked) {\n try {\n await this.unlock();\n } catch {\n // ignore unlock errors during fallback\n }\n }\n return this.fallbackToCreate(options);\n }\n // If PUT returns 422 \"already exists\" directly in upsert mode\n if (mode === 'upsert' && this.isAlreadyExistsError(e)) {\n this._unchanged = true;\n return this;\n }\n throw e;\n } finally {\n // Unlock if we locked it\n if (!wasLocked) {\n await this.unlock();\n }\n }\n }\n\n /**\n * Wrapper key for the data in contract requests/responses\n *\n * Contracts wrap data like { abapClass: ... } or { abapInterface: ... }.\n * Subclasses that support save override this.\n */\n protected get wrapperKey(): string | undefined {\n return undefined;\n }\n\n /**\n * CRUD contract for this object type\n *\n * Subclasses that support save override this to return their contract.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n protected get crudContract(): any {\n return undefined;\n }\n\n /**\n * Execute the typed contract call for save\n *\n * Generic implementation using wrapperKey and crudContract.\n * Objects that don't support save leave wrapperKey/crudContract undefined.\n *\n * For 'create' mode: POSTs skeleton data (minimal fields).\n * For 'update' mode: PUTs full data (all fields except abapLanguageVersion).\n *\n * @param mode - 'create' (POST skeleton) or 'update' (PUT full)\n * @param options - Contract options (transport, lockHandle)\n */\n protected async saveViaContract(\n mode: 'create' | 'update',\n options: { transport?: string; lockHandle?: string },\n ): Promise<void> {\n const wrapperKey = this.wrapperKey;\n const contract = this.crudContract;\n\n if (!wrapperKey || !contract) {\n throw new Error(`Save not supported for ${this.kind}.`);\n }\n\n if (mode === 'create') {\n // POST skeleton — minimal fields only (Eclipse ADT pattern)\n const skeleton = await this.getSkeletonData();\n const data = { [wrapperKey]: skeleton };\n await contract.post({ corrNr: options.transport }, data);\n } else {\n const rawData = await this.data();\n\n // Strip abapLanguageVersion from the payload.\n // Eclipse ADT never sends this attribute — SAP infers it from the package.\n // Including it triggers S_ABPLNGVS authorization checks that fail on BTP.\n const { abapLanguageVersion: _, ...rest } = rawData as Record<\n string,\n unknown\n >;\n const saveData = rest;\n const data = { [wrapperKey]: saveData };\n\n // Ensure fresh ETag before PUT.\n // The lock POST and other intermediate requests may cache an ETag\n // under the same URL that differs from the object's current ETag.\n // A fresh GET right before PUT guarantees the If-Match header is correct.\n if (contract.get) {\n try {\n await contract.get(this.name);\n } catch {\n this.ctx.client.clearETag();\n }\n }\n\n await contract.put(\n this.name,\n { corrNr: options.transport, lockHandle: options.lockHandle },\n data,\n );\n }\n }\n\n /**\n * Get skeleton data for object creation (POST).\n *\n * Returns only the minimal fields needed to create the object on SAP.\n * SAP creates the object structure (includes, etc.) from these fields.\n * Full metadata and source code are sent via PUT in the update step.\n *\n * Override in subclasses that need different skeleton fields.\n */\n protected async getSkeletonData(): Promise<Record<string, unknown>> {\n const rawData = await this.data();\n const d = rawData as Record<string, unknown>;\n return {\n name: d.name,\n type: d.type,\n description: d.description ?? '',\n language: d.language ?? 'EN',\n masterLanguage: d.masterLanguage ?? 'EN',\n packageRef: d.packageRef,\n };\n }\n\n /**\n * Check if the object exists on the SAP system.\n *\n * Used by upsert mode to decide between update and create paths upfront.\n * On BTP, locking a non-existent DDIC object creates a draft that persists\n * even after unlock, blocking subsequent POST (create) attempts. Checking\n * existence first with GET avoids this problem entirely.\n */\n protected async checkObjectExists(): Promise<boolean> {\n const contract = this.crudContract;\n if (!contract?.get) return true; // assume exists if no contract\n try {\n await contract.get(this.name);\n return true;\n } catch (e) {\n if (this.shouldFallbackToCreate(e)) return false;\n // Unexpected error — rethrow; the caller will handle it.\n throw e;\n }\n }\n\n /**\n * Check if error is a 404 Not Found\n */\n protected isNotFoundError(e: unknown): boolean {\n if (e instanceof Error) {\n return e.message.includes('404') || e.message.includes('Not Found');\n }\n return false;\n }\n\n /**\n * Upsert fallback: try POST (create), treat 422 \"already exists\" as unchanged.\n * Extracted to avoid duplication in lock-catch and saveViaContract-catch paths.\n */\n private async fallbackToCreate(options: SaveOptions): Promise<this> {\n try {\n return await this.save({ ...options, mode: 'create' });\n } catch (createErr) {\n if (this.isAlreadyExistsError(createErr)) {\n this._unchanged = true;\n return this;\n }\n throw createErr;\n }\n }\n\n /**\n * Check if error suggests the object doesn't exist or the operation\n * is not supported for the current state.\n *\n * Some SAP DDIC endpoints (TABL, TTYP) return 405 Method Not Allowed\n * instead of 404 when attempting to lock or PUT a non-existent object.\n * In upsert mode, both should trigger a fallback to POST (create).\n */\n protected shouldFallbackToCreate(e: unknown): boolean {\n if (this.isNotFoundError(e)) return true;\n if (e instanceof Error) {\n const msg = e.message;\n if (msg.includes('405') || msg.includes('Method Not Allowed'))\n return true;\n // S_ABPLNGVS 403 on PUT: BTP creates a draft when locking a new DDIC\n // object, so the lock succeeds even though the object doesn't exist.\n // The subsequent PUT fails with S_ABPLNGVS. Fall back to POST (create)\n // which handles language version authorization correctly.\n if (msg.includes('403') && msg.includes('S_ABPLNGVS')) return true;\n }\n return false;\n }\n\n /**\n * Check if error is a 422 \"already exists\" from a POST create attempt\n */\n protected isAlreadyExistsError(e: unknown): boolean {\n const msg = e instanceof Error ? e.message.toLowerCase() : '';\n return (\n (msg.includes('422') || msg.includes('unprocessable')) &&\n msg.includes('already exists')\n );\n }\n\n /**\n * Check if object has pending sources to save\n * Subclasses with source code (classes, interfaces) override this\n */\n protected hasPendingSources(): boolean {\n const self = this as unknown as {\n _pendingSources?: Record<string, string>;\n _pendingSource?: string;\n };\n return !!(self._pendingSources || self._pendingSource);\n }\n\n /**\n * Normalize source code for comparison.\n * Trims trailing whitespace/newlines so minor formatting differences\n * don't trigger unnecessary saves.\n */\n protected normalizeSource(source: string): string {\n return source\n .split('\\n')\n .map((line) => line.trimEnd())\n .join('\\n')\n .trimEnd();\n }\n\n /**\n * Check if pending sources are unchanged vs SAP (pre-lock comparison).\n * Sets _unchanged = true if nothing needs saving.\n *\n * Default handles single-source objects (_pendingSource) by fetching\n * GET {objectUri}/source/main and comparing.\n * AdkClass overrides this for multi-include logic.\n */\n protected async checkPendingSourcesUnchanged(): Promise<void> {\n const self = this as unknown as { _pendingSource?: string };\n if (!self._pendingSource) return;\n\n try {\n const response = await this.ctx.client.fetch(\n `${this.objectUri}/source/main`,\n { method: 'GET', headers: { Accept: 'text/plain' } },\n );\n const currentSource = await toText(response);\n if (\n this.normalizeSource(currentSource) ===\n this.normalizeSource(self._pendingSource)\n ) {\n this._unchanged = true;\n delete self._pendingSource;\n }\n } catch {\n // Source doesn't exist on SAP (404) — needs saving\n }\n }\n\n /**\n * Check if metadata-only objects are unchanged on SAP.\n *\n * For objects without source code (DDIC types like DOMA, DTEL, TABL, TTYP),\n * fetches the current SAP state and compares only the fields present in\n * the local data. SAP returns extra volatile fields (timestamps, links,\n * version, etc.) that are ignored — only semantic fields matter.\n */\n protected async checkMetadataUnchanged(): Promise<void> {\n const contract = this.crudContract;\n const wrapperKey = this.wrapperKey;\n if (!contract?.get || !wrapperKey) return;\n\n try {\n const sapResponse = await contract.get(this.name);\n const sapData = sapResponse?.[wrapperKey];\n if (!sapData) return;\n\n const localData = await this.data();\n\n // Recursive subset match: checks that every field in `local`\n // has the same value in `sap`. Extra fields in `sap` are ignored.\n // \"Empty-like\" values (null, undefined, \"\", [], {}) are treated\n // as equivalent, since SAP normalizes defaults differently than\n // abapGit serialization (e.g., style \"\" → \"00\", missing → undefined).\n // Note: `false` is NOT empty-like — an explicit `false` must be\n // compared against SAP's value to detect boolean flag toggles.\n const isEmpty = (v: unknown): boolean =>\n v == null ||\n v === '' ||\n (Array.isArray(v) && v.length === 0) ||\n (typeof v === 'object' && v !== null && Object.keys(v).length === 0);\n\n const isSubsetMatch = (local: unknown, sap: unknown): boolean => {\n if (local === sap) return true;\n\n // Both empty-like → match (handles null/undefined/\"\"/false/[]/{}\n // combinations between local and SAP representations)\n if (isEmpty(local) && isEmpty(sap)) return true;\n\n // Local is empty-like but SAP has a value → \"use default\" match\n // (SAP may store a different representation of the default)\n if (isEmpty(local) && sap != null) return true;\n\n if (local == null || sap == null) return false;\n if (typeof local !== typeof sap) return false;\n\n if (Array.isArray(local)) {\n if (!Array.isArray(sap)) return false;\n if (local.length !== sap.length) return false;\n return local.every((item, i) => isSubsetMatch(item, sap[i]));\n }\n\n if (typeof local === 'object') {\n const localObj = local as Record<string, unknown>;\n const sapObj = sap as Record<string, unknown>;\n return Object.keys(localObj).every((key) => {\n if (key === 'abapLanguageVersion') return true;\n return isSubsetMatch(localObj[key], sapObj[key]);\n });\n }\n\n return local === sap;\n };\n\n if (isSubsetMatch(localData, sapData)) {\n this._unchanged = true;\n }\n } catch {\n // Object doesn't exist on SAP (404) or comparison failed — needs saving\n }\n }\n\n /**\n * Refresh cached ETags after acquiring a lock.\n *\n * SAP changes the object's internal version when a lock is acquired,\n * which invalidates any cached ETags. Without refreshing, the next\n * PUT sends a stale If-Match header and SAP returns HTTP 412.\n *\n * For objects with pending sources: re-GET {objectUri}/source/main\n * For metadata-only objects: re-GET via crudContract.get()\n *\n * Subclasses with multiple source endpoints (e.g., AdkClass with includes)\n * should override this to refresh all relevant endpoints.\n */\n protected async refreshETagsAfterLock(): Promise<void> {\n if (this.hasPendingSources()) {\n // Re-fetch source to refresh cached ETag for the source URL\n const sourceUrl = `${this.objectUri}/source/main`;\n try {\n await this.ctx.client.fetch(sourceUrl, {\n method: 'GET',\n headers: { Accept: 'text/plain' },\n });\n } catch {\n // Source endpoint may not exist yet (new object) — clear any stale\n // ETag so the subsequent PUT won't send a stale If-Match header\n this.ctx.client.clearETag(sourceUrl);\n }\n } else {\n // Re-fetch metadata to refresh cached ETag for the metadata URL\n const contract = this.crudContract;\n if (contract?.get) {\n try {\n await contract.get(this.name);\n } catch {\n // Clear all ETags — we can't easily reconstruct the metadata URL\n // since the contract may use a different path than objectUri\n this.ctx.client.clearETag();\n }\n }\n }\n }\n\n /**\n * Save pending sources to SAP.\n *\n * Default handles single-source objects (_pendingSource) by PUTting\n * to {objectUri}/source/main.\n * AdkClass overrides this for multi-include logic.\n */\n protected async savePendingSources(options?: {\n lockHandle?: string;\n transport?: string;\n }): Promise<void> {\n const self = this as unknown as { _pendingSource?: string };\n if (!self._pendingSource) return;\n\n const sourceUrl = `${this.objectUri}/source/main`;\n\n // Ensure fresh ETag for the source URL before PUT.\n // Intermediate requests (lock POST, etc.) may leave a stale ETag cached.\n try {\n await this.ctx.client.fetch(sourceUrl, {\n method: 'GET',\n headers: { Accept: 'text/plain' },\n });\n } catch {\n this.ctx.client.clearETag(sourceUrl);\n }\n\n const params = new URLSearchParams();\n if (options?.lockHandle) params.set('lockHandle', options.lockHandle);\n if (options?.transport) params.set('corrNr', options.transport);\n\n const qs = params.toString();\n await this.ctx.client.fetch(`${sourceUrl}${qs ? '?' + qs : ''}`, {\n method: 'PUT',\n headers: { 'Content-Type': 'text/plain' },\n body: self._pendingSource,\n });\n\n delete self._pendingSource;\n }\n\n /**\n * Set source content for a source-based object\n *\n * Generic implementation for objects with source code (classes, includes, etc.)\n * Subclasses should override if they need custom source handling.\n *\n * @param sourcePath - Relative path to source (e.g., '/source/main')\n * @param content - Source code content\n * @param options - Save options\n */\n async setSource(\n sourcePath: string,\n content: string,\n options: SaveOptions = {},\n ): Promise<void> {\n const { transport } = options;\n\n // Lock if not already locked\n const wasLocked = this.isLocked;\n if (!wasLocked) {\n await this.lock();\n }\n\n try {\n // Build URL\n const params = new URLSearchParams();\n if (transport) {\n params.set('corrNr', transport);\n }\n if (this._lockHandle) {\n params.set('lockHandle', this._lockHandle.handle);\n }\n\n const fullPath = `${this.objectUri}${sourcePath}`;\n const url = params.toString()\n ? `${fullPath}?${params.toString()}`\n : fullPath;\n\n // PUT source content\n await this.ctx.client.fetch(url, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'text/plain; charset=utf-8',\n },\n body: content,\n });\n } finally {\n // Unlock if we locked it\n if (!wasLocked) {\n await this.unlock();\n }\n }\n }\n\n /**\n * Activate this object\n *\n * Activates a single object. For bulk activation of multiple objects,\n * use `AdkObjectSet.activateAll()`.\n *\n * @returns this (for chaining)\n */\n async activate(): Promise<this> {\n // Build activation request XML for single object\n const activationXml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<adtcore:objectReferences xmlns:adtcore=\"http://www.sap.com/adt/core\">\n <adtcore:objectReference adtcore:uri=\"${this.objectUri}\" adtcore:type=\"${this.type}\" adtcore:name=\"${this.name}\"/>\n</adtcore:objectReferences>`;\n\n await this.ctx.client.fetch(\n '/sap/bc/adt/activation?method=activate&preauditRequested=true',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/xml',\n Accept: 'application/xml',\n },\n body: activationXml,\n },\n );\n\n return this;\n }\n\n // ============================================\n // Caching Infrastructure\n // ============================================\n\n /** Lazy load a segment (async) - fetches only once, then cached */\n protected async lazy<T>(key: string, loader: () => Promise<T>): Promise<T> {\n if (!this.cache.has(key)) {\n this.cache.set(key, await loader());\n }\n return this.cache.get(key) as T;\n }\n\n /** Lazy compute a segment (sync) - computes only once, then cached */\n protected cached<T>(key: string, compute: () => T): T {\n if (!this.cache.has(key)) {\n this.cache.set(key, compute());\n }\n return this.cache.get(key) as T;\n }\n\n /** Set a cached value directly (for local/generated data) */\n protected set<T>(key: string, value: T): void {\n this.cache.set(key, value);\n }\n\n /** Mark a segment as dirty (modified locally) */\n protected markDirty(key: string): void {\n this.dirty.add(key);\n }\n\n /** Check if any segment (or specific segment) is dirty */\n isDirty(segment?: string): boolean {\n return segment ? this.dirty.has(segment) : this.dirty.size > 0;\n }\n\n /** Clear cache for a segment (force reload on next access) */\n protected invalidate(key: string): void {\n this.cache.delete(key);\n this.dirty.delete(key);\n }\n\n // ============================================\n // Public Fetch Utilities\n // ============================================\n\n /**\n * Fetch a text resource from an ADT endpoint.\n * Delegates to the underlying ADT client's fetch.\n *\n * @param url - ADT endpoint path (e.g., '/sap/bc/adt/ddic/dataelements/spras')\n * @param headers - Optional HTTP headers (defaults to no Accept header, letting server choose)\n * @returns Response content as text, or undefined if 404\n */\n async fetchText(\n url: string,\n headers?: Record<string, string>,\n ): Promise<string | undefined> {\n try {\n const response = await this.ctx.client.fetch(url, {\n method: 'GET',\n headers: headers ?? {},\n });\n return toText(response);\n } catch {\n return undefined;\n }\n }\n}\n\n/**\n * Base class for main development objects (AdtMainObject)\n *\n * Extends AdkObject with package reference, responsible user, and master language.\n * Used for repository objects like classes, interfaces, packages, etc.\n *\n * Note: Uses type assertions internally because schema-inferred types from\n * contracts may have different shapes than AdkMainObjectData. The getters\n * safely handle missing properties with defaults.\n *\n * @typeParam K - The object kind (from AdkKind)\n * @typeParam D - The internal data type (typically schema-inferred from contract)\n */\nexport abstract class AdkMainObject<\n K extends AdkKind = AdkKind,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n D = any,\n> extends AdkObject<K, D> {\n // Helper to access data with main object properties\n private get mainData(): AdkMainObjectData {\n return this.dataSync as unknown as AdkMainObjectData;\n }\n\n // ============================================\n // Main Object Properties (AdtMainObject additions)\n // ============================================\n\n /** Package reference (adtcore:packageRef) */\n get packageRef(): AdtObjectReference | undefined {\n return this.mainData.packageRef;\n }\n\n /** Package name (convenience getter) */\n get package(): string {\n return this.mainData.packageRef?.name ?? '';\n }\n\n /** Master system (adtcore:masterSystem) */\n get masterSystem(): string {\n return this.mainData.masterSystem ?? '';\n }\n\n /** Master language (adtcore:masterLanguage) */\n get masterLanguage(): string {\n return this.mainData.masterLanguage ?? '';\n }\n\n /** Responsible user (adtcore:responsible) */\n get responsible(): string {\n return this.mainData.responsible ?? '';\n }\n\n /** ABAP language version (adtcore:abapLanguageVersion) */\n get abapLanguageVersion(): string {\n return this.mainData.abapLanguageVersion ?? '';\n }\n\n /**\n * Save main source code to SAP.\n * Requires the object to be locked before calling.\n * Subclasses may override to add additional behavior (e.g. cache invalidation).\n */\n async saveMainSource(\n source: string,\n options?: { lockHandle?: string; transport?: string },\n ): Promise<void> {\n const params = new URLSearchParams();\n if (options?.lockHandle) params.set('lockHandle', options.lockHandle);\n if (options?.transport) params.set('corrNr', options.transport);\n const qs = params.toString();\n await this.ctx.client.fetch(\n `${this.objectUri}/source/main${qs ? '?' + qs : ''}`,\n {\n method: 'PUT',\n headers: { 'Content-Type': 'text/plain' },\n body: source,\n },\n );\n }\n}\n","/**\n * ADK Object Set - Bulk Operations Service\n *\n * Provides a semantic layer for working with collections of ADK objects.\n * Supports bulk save, activate, and other batch operations.\n *\n * @example\n * ```typescript\n * const set = new AdkObjectSet(ctx);\n *\n * // Add objects from various sources\n * set.add(classObj);\n * set.addAll(interfaceObjects);\n *\n * // Bulk operations\n * await set.saveAll({ transport: 'DEVK900001', inactive: true });\n * await set.activateAll();\n * ```\n */\n\nimport type { AdkContext } from './context';\nimport type { SaveOptions, ActivationResult, LockHandle } from './model';\nimport { AdkObject } from './model';\n\n/**\n * Result of bulk save operation\n */\nexport interface BulkSaveResult {\n /** Number of successfully saved objects */\n success: number;\n /** Number of objects that failed to save */\n failed: number;\n /** Number of unchanged objects (skipped) */\n unchanged: number;\n /** Details per object */\n results: Array<{\n object: AdkObject;\n success: boolean;\n /** True if object was skipped because source is identical to SAP */\n unchanged?: boolean;\n error?: string;\n }>;\n}\n\n/**\n * Options for bulk save operation\n */\nexport interface BulkSaveOptions extends SaveOptions {\n /** Continue saving remaining objects if one fails (default: true) */\n continueOnError?: boolean;\n /** Callback for progress reporting */\n onProgress?: (processed: number, total: number, current: AdkObject) => void;\n}\n\n/**\n * Options for bulk activation\n */\nexport interface BulkActivateOptions {\n /** Callback for progress reporting */\n onProgress?: (message: string) => void;\n}\n\n/**\n * ADK Object Set - Collection of objects with bulk operations\n *\n * A semantic layer for managing collections of ADK objects and\n * performing bulk operations like save and activate.\n */\nexport class AdkObjectSet {\n private readonly ctx: AdkContext;\n private readonly objects: AdkObject[] = [];\n\n constructor(ctx: AdkContext) {\n this.ctx = ctx;\n }\n\n // ============================================\n // Collection Management\n // ============================================\n\n /**\n * Add a single object to the set\n *\n * Propagates the set's context (lockService, lockStore) to the object\n * so that objects created by plugins with a bare { client } context\n * inherit the services configured on the set.\n */\n add(object: AdkObject): this {\n if (!this.objects.includes(object)) {\n object.adoptContext(this.ctx);\n this.objects.push(object);\n }\n return this;\n }\n\n /**\n * Add multiple objects to the set\n */\n addAll(objects: AdkObject[]): this {\n for (const obj of objects) {\n this.add(obj);\n }\n return this;\n }\n\n /**\n * Remove an object from the set\n */\n remove(object: AdkObject): this {\n const index = this.objects.indexOf(object);\n if (index !== -1) {\n this.objects.splice(index, 1);\n }\n return this;\n }\n\n /**\n * Clear all objects from the set\n */\n clear(): this {\n this.objects.length = 0;\n return this;\n }\n\n /**\n * Get all objects in the set\n */\n getAll(): AdkObject[] {\n return [...this.objects];\n }\n\n /**\n * Get number of objects in the set\n */\n get size(): number {\n return this.objects.length;\n }\n\n /**\n * Check if set is empty\n */\n get isEmpty(): boolean {\n return this.objects.length === 0;\n }\n\n /**\n * Filter objects by type\n */\n filterByType(type: string): AdkObject[] {\n return this.objects.filter((obj) => obj.type === type);\n }\n\n /**\n * Filter objects by kind\n */\n filterByKind(kind: string): AdkObject[] {\n return this.objects.filter((obj) => obj.kind === kind);\n }\n\n /**\n * Iterate over objects\n */\n [Symbol.iterator](): Iterator<AdkObject> {\n return this.objects[Symbol.iterator]();\n }\n\n // ============================================\n // Bulk Operations\n // ============================================\n\n /**\n * Save all objects in the set\n *\n * Saves each object individually, handling lock/unlock per object.\n * By default continues on error to save as many objects as possible.\n *\n * @param options - Save options (transport, inactive, continueOnError)\n * @returns Result with success/failure counts and details\n */\n async saveAll(options: BulkSaveOptions = {}): Promise<BulkSaveResult> {\n const { continueOnError = true, onProgress, ...saveOptions } = options;\n\n const result: BulkSaveResult = {\n success: 0,\n failed: 0,\n unchanged: 0,\n results: [],\n };\n\n const total = this.objects.length;\n let _saved = 0;\n let processed = 0;\n\n for (const obj of this.objects) {\n try {\n await obj.save(saveOptions);\n\n // Check if save() detected the object is unchanged\n if (obj._unchanged) {\n result.unchanged++;\n result.results.push({ object: obj, success: true, unchanged: true });\n } else {\n _saved++;\n result.success++;\n result.results.push({ object: obj, success: true });\n }\n } catch (error) {\n result.failed++;\n result.results.push({\n object: obj,\n success: false,\n error: error instanceof Error ? error.message : String(error),\n });\n\n if (!continueOnError) {\n processed++;\n onProgress?.(processed, total, obj);\n break;\n }\n }\n processed++;\n onProgress?.(processed, total, obj);\n }\n\n return result;\n }\n\n /**\n * Activate all objects in the set (bulk activation)\n *\n * Uses SAP's bulk activation endpoint for efficiency.\n * All objects are activated in a single request.\n *\n * @param options - Activation options\n * @returns Activation result with success/failure counts\n */\n async activateAll(\n options: BulkActivateOptions = {},\n ): Promise<ActivationResult> {\n const { onProgress } = options;\n\n if (this.objects.length === 0) {\n return { success: 0, failed: 0, messages: [] };\n }\n\n onProgress?.(`Activating ${this.objects.length} objects...`);\n\n // Build activation request XML\n const objectRefs = this.objects\n .map(\n (obj) =>\n `<adtcore:objectReference adtcore:uri=\"${obj.objectUri}\" adtcore:type=\"${obj.type}\" adtcore:name=\"${obj.name}\"/>`,\n )\n .join('\\n ');\n\n const activationXml = `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<adtcore:objectReferences xmlns:adtcore=\"http://www.sap.com/adt/core\">\n ${objectRefs}\n</adtcore:objectReferences>`;\n\n try {\n const response = await this.ctx.client.fetch(\n '/sap/bc/adt/activation?method=activate&preauditRequested=true',\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/xml',\n Accept: 'application/xml',\n },\n body: activationXml,\n },\n );\n\n // NOTE: Could parse actual response XML for detailed messages\n return {\n success: this.objects.length,\n failed: 0,\n messages: [],\n response: String(response),\n };\n } catch (error) {\n return {\n success: 0,\n failed: this.objects.length,\n messages: [error instanceof Error ? error.message : String(error)],\n };\n }\n }\n\n /**\n * Save all objects as inactive, then bulk activate, then unlock\n *\n * This is the recommended pattern for deploying multiple objects:\n * 1. Save all objects as inactive (handles dependencies)\n * 2. Bulk activate all saved objects\n * 3. Unlock all objects\n *\n * @param options - Save options (transport required)\n * @returns Combined result of save and activation\n */\n async deploy(options: BulkSaveOptions & { activate?: boolean }): Promise<{\n save: BulkSaveResult;\n activation?: ActivationResult;\n }> {\n const { activate = true, ...saveOptions } = options;\n\n try {\n // Step 1: Save all as inactive\n const saveResult = await this.saveAll({\n ...saveOptions,\n inactive: true,\n });\n\n // Step 2: Bulk activate (only successfully saved objects)\n let activationResult: ActivationResult | undefined;\n\n if (activate && saveResult.success > 0) {\n // Create a temporary set with only saved objects for activation\n const savedSet = new AdkObjectSet(this.ctx);\n for (const r of saveResult.results) {\n if (r.success) {\n savedSet.add(r.object);\n }\n }\n\n activationResult = await savedSet.activateAll();\n\n // Step 2b: Retry deferred sources after activation\n // Some includes (e.g., testclasses) may not exist until activation creates them\n for (const r of saveResult.results) {\n if (!r.success) continue;\n const obj = r.object as any;\n const deferred = obj._deferredSources as\n | [string, string][]\n | undefined;\n if (deferred && deferred.length > 0) {\n try {\n // Re-lock for deferred source saves\n const lock = await r.object.lock();\n for (const [key, source] of deferred) {\n await obj.saveIncludeSource(key, source, {\n lockHandle: lock.handle,\n transport: saveOptions.transport,\n });\n }\n delete obj._deferredSources;\n // Re-activate after saving deferred sources\n const deferredSet = new AdkObjectSet(this.ctx);\n deferredSet.add(r.object);\n await deferredSet.activateAll();\n } catch {\n // Deferred source retry failed — not critical, continue\n } finally {\n try {\n await r.object.unlock();\n } catch {\n // Ignore unlock failures\n }\n }\n }\n }\n }\n\n return {\n save: saveResult,\n activation: activationResult,\n };\n } finally {\n // Step 3: Always unlock all objects\n await this.unlockAll();\n }\n }\n\n /**\n * Lock all objects in the set\n *\n * @returns Array of lock handles\n */\n async lockAll(): Promise<LockHandle[]> {\n const handles: LockHandle[] = [];\n\n for (const obj of this.objects) {\n const handle = await obj.lock();\n handles.push(handle);\n }\n\n return handles;\n }\n\n /**\n * Unlock all objects in the set\n */\n async unlockAll(): Promise<void> {\n for (const obj of this.objects) {\n try {\n await obj.unlock();\n } catch {\n // Ignore unlock failures - object may not have been locked\n }\n }\n }\n\n /**\n * Load all objects (fetch data from SAP)\n *\n * @param options - Load options\n * @returns This set (for chaining)\n */\n async loadAll(options: { parallel?: boolean } = {}): Promise<this> {\n const { parallel = false } = options;\n\n if (parallel) {\n await Promise.all(this.objects.map((obj) => obj.load()));\n } else {\n for (const obj of this.objects) {\n await obj.load();\n }\n }\n\n return this;\n }\n\n // ============================================\n // Static Factory Methods\n // ============================================\n\n /**\n * Create an object set from an array of objects\n */\n static from(objects: AdkObject[], ctx: AdkContext): AdkObjectSet {\n const set = new AdkObjectSet(ctx);\n set.addAll(objects);\n return set;\n }\n\n /**\n * Create an object set by collecting from an async generator\n *\n * Collects all objects yielded by the generator into the set.\n * Useful for collecting objects from format plugin export generators.\n *\n * @param generator - Async generator yielding AdkObject instances\n * @param ctx - ADK context for the set\n * @param options - Collection options\n * @returns Promise resolving to populated AdkObjectSet\n */\n static async fromGenerator(\n generator: AsyncGenerator<AdkObject>,\n ctx: AdkContext,\n options: {\n /** Filter function to include/exclude objects */\n filter?: (obj: AdkObject) => boolean;\n /** Callback for each object collected */\n onObject?: (obj: AdkObject) => void;\n } = {},\n ): Promise<AdkObjectSet> {\n const { filter, onObject } = options;\n const set = new AdkObjectSet(ctx);\n\n for await (const obj of generator) {\n // Apply filter if provided\n if (filter && !filter(obj)) {\n continue;\n }\n\n set.add(obj);\n onObject?.(obj);\n }\n\n return set;\n }\n}\n","/**\n * ADK v2 - ADT Integration Layer\n *\n * Single integration point for adt-client.\n * All ADK objects import types from here, not directly from adt-client.\n *\n * This provides:\n * 1. Single dependency point - only this file imports from adt-client\n * 2. Re-exported types - objects import from '../base/adt'\n * 3. Proxy contract - ADK-specific contract interface\n *\n * Architecture:\n * ```\n * adt-client (external)\n * ↓\n * base/adt.ts (integration layer)\n * ↓\n * objects/* (ADK objects import from here)\n * ```\n */\n\n// ============================================\n// Re-export types from adt-client\n// Objects import these instead of from adt-client directly\n// ============================================\n\n// Client type (return type of createAdtClient)\nexport type { AdtClient } from '@abapify/adt-client';\n\n// Response types (inferred from contracts/schemas)\n// Note: Some response types are unions (e.g., ClassResponse = { abapClass } | { abapClassInclude })\n// We re-export the full union and provide extracted types for ADK objects\nexport type {\n ClassResponse as ClassResponseUnion,\n InterfaceResponse as InterfaceResponseUnion,\n PackageResponse as PackageResponseUnion,\n TransportGetResponse,\n ProgramResponse as ProgramResponseUnion,\n IncludeResponse as IncludeResponseUnion,\n FunctionGroupResponse as FunctionGroupResponseUnion,\n FunctionModuleResponse as FunctionModuleResponseUnion,\n DomainResponse,\n DataElementResponse,\n TableResponse,\n StructureResponse,\n TableTypeResponse,\n} from '@abapify/adt-client';\n\n// CRUD contract types for typed ADK base model\nexport type {\n CrudContract,\n CrudContractBase,\n CrudQueryParams,\n LockOptions,\n UnlockOptions,\n ObjectStructureOptions,\n SourceOperations,\n SourcesContract,\n IncludesContractSkeleton,\n} from '@abapify/adt-client';\n\nimport type {\n ClassResponse as _ClassResponse,\n InterfaceResponse as _InterfaceResponse,\n PackageResponse as _PackageResponse,\n ProgramResponse as _ProgramResponse,\n IncludeResponse as _IncludeResponse,\n FunctionGroupResponse as _FunctionGroupResponse,\n FunctionModuleResponse as _FunctionModuleResponse,\n} from '@abapify/adt-client';\n\n/**\n * Extract the abapClass variant from ClassResponse union\n * ClassResponse = { abapClass: ... } | { abapClassInclude: ... }\n * ADK Class objects only use the abapClass variant\n */\nexport type ClassResponse = Extract<_ClassResponse, { abapClass: unknown }>;\n\n/**\n * Extract the abapInterface variant from InterfaceResponse union\n */\nexport type InterfaceResponse = Extract<\n _InterfaceResponse,\n { abapInterface: unknown }\n>;\n\n/**\n * Extract the package variant from PackageResponse union\n * PackageResponse = { package: ... } | { packageTree: ... }\n * ADK Package objects only use the package variant\n */\nexport type PackageResponse = Extract<_PackageResponse, { package: unknown }>;\n\n/**\n * Program response type - single root element (no union needed)\n */\nexport type ProgramResponse = _ProgramResponse;\n\n/**\n * Include response type - single root element (no union needed)\n */\nexport type IncludeResponse = _IncludeResponse;\n\n/**\n * Function group response type - single root element (no union needed)\n */\nexport type FunctionGroupResponse = _FunctionGroupResponse;\n\n/**\n * Function module response type - single root element (no union needed)\n */\nexport type FunctionModuleResponse = _FunctionModuleResponse;\n\n// ============================================\n// ADK Contract Proxy\n// Wraps adt-client contract with ADK-specific interface\n// ============================================\n\nimport type { AdtClient } from '@abapify/adt-client';\n\n/**\n * ADT REST contracts accessible via client.adt.*\n *\n * This is the typed contract layer from adt-client.\n * Example: client.adt.oo.classes.get('ZCL_MY_CLASS')\n */\nexport type AdtContracts = AdtClient['adt'];\n\n/**\n * ADK Contract interface\n *\n * Proxy to adt-client contracts.\n * Provides typed access to ADT REST endpoints.\n */\nexport interface AdkContract {\n /** OO contracts (classes, interfaces) */\n readonly oo: AdtContracts['oo'];\n /** Packages contract */\n readonly packages: AdtContracts['packages'];\n /** CTS contracts (transports) */\n readonly cts: AdtContracts['cts'];\n /** Core contracts (discovery, sessions) */\n readonly core: AdtContracts['core'];\n /** Repository contracts (search) */\n readonly repository: AdtContracts['repository'];\n /** Programs contracts */\n readonly programs: AdtContracts['programs'];\n /** Functions contracts (function groups) */\n readonly functions: AdtContracts['functions'];\n /** DDIC contracts (domains, data elements, structures, tables, table types) */\n readonly ddic: AdtContracts['ddic'];\n /** BO contracts (behavior definitions) */\n readonly bo: AdtContracts['bo'];\n}\n\n/**\n * Create ADK contract from ADT client\n *\n * @param client - ADT client instance from createAdtClient()\n * @returns ADK contract proxy\n */\nexport function createAdkContract(client: AdtClient): AdkContract {\n return {\n oo: client.adt.oo,\n packages: client.adt.packages,\n cts: client.adt.cts,\n core: client.adt.core,\n repository: client.adt.repository,\n programs: client.adt.programs,\n functions: client.adt.functions,\n ddic: client.adt.ddic,\n bo: client.adt.bo,\n };\n}\n","/**\n * ADK v2 - Global Context Provider\n *\n * Provides a global ADK context that can be set once and used by all ADK objects.\n * This eliminates the need to pass context to every ADK operation.\n *\n * Usage:\n * // Initialize once (e.g., in CLI bootstrap)\n * import { initializeAdk } from '@abapify/adk';\n * initializeAdk(client);\n *\n * // Then use ADK objects without passing context\n * const transport = await AdkTransportRequest.get('S0DK900001');\n *\n * For testing or multi-connection scenarios, you can still pass explicit context:\n * const transport = await AdkTransportRequest.get('S0DK900001', customCtx);\n */\n\nimport type { AdkContext } from './context';\nimport type { AdtClient } from './adt';\nimport type { LockStore, LockService } from '@abapify/adt-locks';\nimport { createLockService } from '@abapify/adt-locks';\n\n// =============================================================================\n// Global State\n// =============================================================================\n\nlet globalContext: AdkContext | null = null;\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Initialize the global ADK context from an ADT client.\n *\n * Call this once during application bootstrap (e.g., in CLI initialization).\n * After initialization, ADK objects can be used without passing context.\n *\n * @param client - ADT client v2 instance\n * @throws Error if client is not provided\n *\n * @example\n * ```ts\n * import { initializeAdk } from '@abapify/adk';\n * import { createAdtClient } from '@abapify/adt-client';\n *\n * const client = createAdtClient({ ... });\n * initializeAdk(client);\n *\n * // Now ADK objects work without context\n * const transport = await AdkTransportRequest.get('S0DK900001');\n * ```\n */\nexport function initializeAdk(\n client: AdtClient,\n options?: { lockStore?: LockStore; lockService?: LockService },\n): void {\n if (!client) {\n throw new Error('ADK initialization failed: client is required');\n }\n\n const lockStore = options?.lockStore;\n // Create lock service from client + store (caller can also provide their own)\n const lockService =\n options?.lockService ?? createLockService(client, { store: lockStore });\n\n globalContext = { client, lockStore, lockService };\n}\n\n/**\n * Get the global ADK context.\n *\n * Used internally by ADK objects when no explicit context is provided.\n *\n * @returns The global ADK context\n * @throws Error if ADK has not been initialized\n *\n * @example\n * ```ts\n * // Internal usage in ADK objects:\n * static async get(number: string, ctx?: AdkContext): Promise<AdkTransportRequest> {\n * const context = ctx ?? getGlobalContext();\n * // ...\n * }\n * ```\n */\nexport function getGlobalContext(): AdkContext {\n if (!globalContext) {\n throw new Error(\n 'ADK not initialized. Call initializeAdk(client) before using ADK objects.\\n' +\n 'Example:\\n' +\n \" import { initializeAdk } from '@abapify/adk';\\n\" +\n ' initializeAdk(client);',\n );\n }\n return globalContext;\n}\n\n/**\n * Check if ADK has been initialized.\n *\n * Useful for conditional logic or error handling.\n *\n * @returns true if initializeAdk() has been called\n */\nexport function isAdkInitialized(): boolean {\n return globalContext !== null;\n}\n\n/**\n * Reset the global ADK context.\n *\n * Primarily for testing purposes. Clears the global context.\n */\nexport function resetAdk(): void {\n globalContext = null;\n}\n\n/**\n * Get the global context or return undefined if not initialized.\n *\n * Unlike getGlobalContext(), this doesn't throw - useful when you want\n * to check if context exists before using it.\n *\n * @returns The global context or undefined\n */\nexport function tryGetGlobalContext(): AdkContext | undefined {\n return globalContext ?? undefined;\n}\n","/**\n * DEVC - ABAP Package\n *\n * ADK object for ABAP packages (DEVC).\n */\n\nimport { AdkMainObject } from '../../../base/model';\nimport type { PackageResponse } from '../../../base/adt';\nimport { Package as PackageKind } from '../../../base/kinds';\nimport { getGlobalContext } from '../../../base/global-context';\nimport type { AdkContext } from '../../../base/context';\nimport type { AbapObject } from '../../../base/types';\nimport type {\n AbapPackage,\n PackageAttributes,\n ObjectReference,\n ApplicationComponent,\n TransportConfig,\n} from './devc.types';\n\n/**\n * Package data type - inferred from packagesContract response\n *\n * The schema wraps everything in a 'package' element, so we unwrap it here\n * to provide a flat structure for ADK consumers.\n */\nexport type PackageXml = NonNullable<PackageResponse['package']>;\n\n/**\n * ADK Package object\n *\n * Inherits from AdkMainObject which provides:\n * - AdkObject: name, type, description, version, language, changedBy/At, createdBy/At, links\n * - AdkMainObject: packageRef, responsible, masterLanguage, masterSystem, abapLanguageVersion\n *\n * Note: For packages, the parent package is stored in `superPackage` not `packageRef`.\n * The `package` getter is overridden to return the super package name.\n */\nexport class AdkPackage\n extends AdkMainObject<typeof PackageKind, PackageXml>\n implements AbapPackage\n{\n static readonly kind = PackageKind;\n readonly kind = AdkPackage.kind;\n\n // ADT object URI\n get objectUri(): string {\n return `/sap/bc/adt/packages/${encodeURIComponent(this.name)}`;\n }\n\n // Override package getter to use superPackage (packages use superPackage, not packageRef)\n override get package(): string {\n return (\n (this.dataSync as unknown as { superPackage?: { name?: string } })\n .superPackage?.name ?? ''\n );\n }\n\n // pak:* elements\n get attributes(): PackageAttributes {\n const attrs = this.dataSync.attributes;\n return {\n packageType: (attrs?.packageType ??\n 'development') as PackageAttributes['packageType'],\n isEncapsulated: attrs?.isEncapsulated ?? false,\n isAddingObjectsAllowed: attrs?.isAddingObjectsAllowed ?? true,\n recordChanges: attrs?.recordChanges ?? false,\n languageVersion: attrs?.languageVersion ?? '',\n };\n }\n\n get superPackage(): ObjectReference | undefined {\n const sp = this.dataSync.superPackage;\n if (!sp?.name) return undefined;\n return {\n uri: sp.uri ?? '',\n type: sp.type ?? 'DEVC/K',\n name: sp.name,\n description: sp.description,\n };\n }\n\n get applicationComponent(): ApplicationComponent | undefined {\n const ac = this.dataSync.applicationComponent;\n if (!ac?.name) return undefined;\n return {\n name: ac.name,\n description: ac.description ?? '',\n };\n }\n\n get transport(): TransportConfig | undefined {\n const t = this.dataSync.transport;\n if (!t) return undefined;\n return {\n softwareComponent: t.softwareComponent?.name\n ? {\n name: t.softwareComponent.name,\n description: t.softwareComponent.description ?? '',\n }\n : undefined,\n transportLayer: t.transportLayer?.name\n ? {\n name: t.transportLayer.name,\n description: t.transportLayer.description ?? '',\n }\n : undefined,\n };\n }\n\n // Lazy segments\n\n async getSubpackages(): Promise<AbapPackage[]> {\n return this.lazy('subpackages', async () => {\n // Search for subpackages using repository search\n // NOTE: SAP quickSearch with packageName is hierarchical — it returns\n // ALL descendant DEVC packages, not just direct children. We load each\n // package and then filter by superPackage to keep only direct children.\n const response =\n await this.ctx.client.adt.repository.informationsystem.search.quickSearch(\n {\n query: '*',\n packageName: this.name,\n objectType: 'DEVC',\n maxResults: 1000,\n },\n );\n\n // Parse object references - filter for DEVC type and exclude self.\n // adtcore response is a union; narrow to the objectReferences variant.\n const refs =\n 'objectReferences' in response\n ? (response.objectReferences?.objectReference ?? [])\n : [];\n const subpkgRefs = (Array.isArray(refs) ? refs : [refs]).filter(\n (ref): ref is typeof ref & { name: string } =>\n !!ref.name && ref.type === 'DEVC/K' && ref.name !== this.name,\n );\n\n // Load all candidate packages and filter to direct children only\n const loaded = await Promise.all(\n subpkgRefs.map(async (ref) => {\n const pkg = new AdkPackage(this.ctx, ref.name);\n await pkg.load();\n return pkg;\n }),\n );\n\n return loaded.filter(\n (pkg) =>\n pkg.superPackage?.name?.toUpperCase() === this.name.toUpperCase(),\n );\n });\n }\n\n async getObjects(): Promise<AbapObject[]> {\n return this.lazy('objects', async () => {\n // Search for objects in this package (exact match, not subpackages)\n const response =\n await this.ctx.client.adt.repository.informationsystem.search.quickSearch(\n {\n query: '*',\n packageName: this.name,\n maxResults: 1000,\n },\n );\n\n // Parse object references - filter out packages (DEVC) and objects from other packages.\n // adtcore response is a union; narrow to the objectReferences variant.\n const refs =\n 'objectReferences' in response\n ? (response.objectReferences?.objectReference ?? [])\n : [];\n const objRefs = (Array.isArray(refs) ? refs : [refs]).filter(\n (ref): ref is typeof ref & { name: string } =>\n !!ref.name &&\n ref.type !== 'DEVC/K' &&\n ref.packageName?.toUpperCase() === this.name.toUpperCase(),\n );\n\n // Return as AbapObject array\n return objRefs.map((ref) => ({\n kind: ref.type ?? '',\n type: ref.type ?? '',\n name: ref.name,\n description: ref.description ?? '',\n package: ref.packageName ?? '',\n }));\n });\n }\n\n async getAllObjects(): Promise<AbapObject[]> {\n return this.lazy('allObjects', async () => {\n const direct = await this.getObjects();\n const subpackages = await this.getSubpackages();\n\n const nested = await Promise.all(\n subpackages.map((pkg) => pkg.getAllObjects()),\n );\n\n // Deduplicate by type+name — SAP quickSearch may return\n // the same object at multiple package hierarchy levels\n const seen = new Set<string>();\n return [...direct, ...nested.flat()].filter((obj) => {\n const key = `${obj.type}:${obj.name}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n });\n }\n\n // ============================================\n // Deferred Loading (implements abstract from AdkObject)\n // ============================================\n\n override async load(): Promise<this> {\n const response = await this.ctx.client.adt.packages.get(this.name);\n // Type guard: response is a union of { package } | { packageTree }\n // ADK Package objects only use the package variant\n if (!response || !('package' in response) || !response.package) {\n throw new Error(\n `Package '${this.name}' not found or returned empty response`,\n );\n }\n // Unwrap the package element from the response\n this.setData(response.package);\n return this;\n }\n\n protected override get wrapperKey() {\n return 'package' as const;\n }\n protected override get crudContract(): any {\n return this.ctx.client.adt.packages;\n }\n\n /**\n * Get skeleton data for package creation (POST).\n *\n * SAP requires ALL elements in the Package xs:sequence, even if empty.\n * The sequence order is: attributes, superPackage, extensionAlias, switch,\n * applicationComponent, transport, translation, useAccesses,\n * packageInterfaces, subPackages.\n * Missing elements cause \"System expected the element ...\" 400 errors.\n */\n protected override async getSkeletonData(): Promise<Record<string, unknown>> {\n const rawData = await this.data();\n const d = rawData as Record<string, unknown>;\n return {\n name: d.name,\n type: d.type ?? 'DEVC/K',\n description: d.description ?? '',\n language: d.language ?? 'EN',\n masterLanguage: d.masterLanguage ?? 'EN',\n responsible: d.responsible ?? '',\n // All xs:sequence elements required by SAP (even if empty)\n attributes: d.attributes ?? { packageType: 'development' },\n superPackage: d.superPackage ?? {},\n extensionAlias: d.extensionAlias ?? {},\n switch: d.switch ?? {},\n applicationComponent: d.applicationComponent ?? {},\n transport: d.transport ?? {},\n translation: d.translation ?? {},\n useAccesses: d.useAccesses ?? {},\n packageInterfaces: d.packageInterfaces ?? {},\n subPackages: d.subPackages ?? {},\n };\n }\n\n // Lock/unlock inherited from AdkObject using generic lock service\n\n // ============================================\n // Static Factory Methods\n // ============================================\n\n /**\n * Get a package by name\n *\n * @param name - Package name (e.g., '$TMP', 'ZPACKAGE')\n * @param ctx - Optional ADK context (uses global context if not provided)\n */\n static async get(name: string, ctx?: AdkContext): Promise<AdkPackage> {\n const context = ctx ?? getGlobalContext();\n const pkg = new AdkPackage(context, name);\n await pkg.load();\n return pkg;\n }\n\n /**\n * Check if a package exists on SAP\n *\n * @param name - Package name\n * @param ctx - Optional ADK context (uses global context if not provided)\n * @returns true if package exists, false otherwise\n */\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n const context = ctx ?? getGlobalContext();\n const pkg = new AdkPackage(context, name);\n await pkg.load();\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new package on SAP\n *\n * Builds an AdkPackage with the given data and saves it in 'create' mode.\n *\n * @param name - Package name (e.g., 'ZABAPGIT_EXAMPLES_CLAS')\n * @param data - Package data (superPackage, attributes, transport, etc.)\n * @param options - Save options (transport request)\n * @param ctx - Optional ADK context (uses global context if not provided)\n */\n static async create(\n name: string,\n data: Partial<PackageXml>,\n options?: { transport?: string },\n ctx?: AdkContext,\n ): Promise<AdkPackage> {\n const context = ctx ?? getGlobalContext();\n const pkg = new AdkPackage(context, name);\n // SAP requires ALL elements in the Package sequence, even if empty.\n // The sequence is: attributes, superPackage, extensionAlias, switch,\n // applicationComponent, transport, translation, useAccesses,\n // packageInterfaces, subPackages.\n // Missing elements cause \"System expected the element ...\" errors.\n pkg.setData({\n name,\n type: 'DEVC/K',\n description: data.description ?? name,\n responsible: data.responsible ?? '',\n attributes: {\n packageType: 'development',\n ...data.attributes,\n },\n superPackage: data.superPackage ?? {},\n extensionAlias: data.extensionAlias ?? {},\n switch: data.switch ?? {},\n applicationComponent: data.applicationComponent ?? {},\n transport: data.transport ?? {},\n translation: data.translation ?? {},\n useAccesses: data.useAccesses ?? {},\n packageInterfaces: data.packageInterfaces ?? {},\n subPackages: data.subPackages ?? {},\n ...data,\n } as PackageXml);\n await pkg.save({ transport: options?.transport, mode: 'create' });\n return pkg;\n }\n\n /**\n * Delete an ABAP package from SAP\n *\n * @param name - Package name\n * @param options - Delete options (transport, lockHandle)\n * @param ctx - Optional ADK context (uses global context if not provided)\n */\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n const pkg = new AdkPackage(context, name.toUpperCase());\n await pkg.crudContract.delete(name.toUpperCase(), {\n ...(options?.transport && { corrNr: options.transport }),\n ...(options?.lockHandle && { lockHandle: options.lockHandle }),\n });\n }\n}\n\n// Self-register with ADK registry\nimport { registerObjectType } from '../../../base/registry';\nregisterObjectType('DEVC', PackageKind, AdkPackage, {\n endpoint: 'packages',\n nameTransform: 'preserve',\n});\n","/**\n * ADK Lockable Decorators\n *\n * Provides declarative lock management for ADK objects.\n *\n * Usage:\n * class AdkTransportRequest extends AdkObject implements Lockable {\n *\n * @requiresLock()\n * async update(changes: UpdateOptions): Promise<void> {\n * // Lock acquired automatically, released after\n * }\n *\n * @requiresLock({ keep: true })\n * async startBatch(): Promise<void> {\n * // Lock is acquired and KEPT for subsequent operations\n * }\n * }\n */\n\nimport type { LockHandle } from '../base/model';\n\n/**\n * Interface for lockable objects\n */\nexport interface Lockable {\n readonly isLocked: boolean;\n lock(): Promise<LockHandle>;\n unlock(): Promise<void>;\n}\n\n/**\n * Options for @requiresLock decorator\n */\nexport interface RequiresLockOptions {\n /** Keep lock after method completes (for batch operations) */\n keep?: boolean;\n}\n\n/**\n * @requiresLock - Method decorator\n *\n * Automatically acquires lock before method execution\n * and releases it after (unless keep: true).\n *\n * @param options - Lock options\n * @param options.keep - If true, keep lock after method completes\n *\n * @example\n * ```typescript\n * @requiresLock()\n * async update(data: UpdateData): Promise<void> {\n * // Lock is acquired before this runs\n * // Lock is released after this completes\n * }\n *\n * @requiresLock({ keep: true })\n * async startTransaction(): Promise<void> {\n * // Lock is acquired and KEPT for subsequent operations\n * }\n * ```\n */\nexport function requiresLock(options?: RequiresLockOptions) {\n return function <T extends Lockable>(\n _target: T,\n _propertyKey: string,\n descriptor: PropertyDescriptor,\n ) {\n const originalMethod = descriptor.value;\n\n descriptor.value = async function (this: Lockable, ...args: unknown[]) {\n const wasLocked = this.isLocked;\n\n try {\n if (!wasLocked) {\n await this.lock();\n }\n\n return await originalMethod.apply(this, args);\n } finally {\n // Release lock if we acquired it and keep is not set\n if (!wasLocked && this.isLocked && !options?.keep) {\n await this.unlock();\n }\n }\n };\n\n return descriptor;\n };\n}\n\n/**\n * @readonly - Method decorator (marker)\n *\n * Marks a method as read-only (no lock required).\n * This is purely for documentation/clarity.\n *\n * @example\n * ```typescript\n * @readonly\n * async get(): Promise<Data> {\n * // No lock needed for read operations\n * }\n * ```\n */\nexport function readonly(\n _target: any,\n _propertyKey: string,\n descriptor: PropertyDescriptor,\n) {\n // No-op decorator, just for documentation\n return descriptor;\n}\n","/**\n * @datetime - SAP Timestamp Property Decorator\n *\n * Parses SAP timestamp formats into JavaScript Date objects.\n *\n * SAP Timestamp Formats:\n * - YYYYMMDDHHMMSS (14 chars) - e.g., \"20231215143052\"\n * - YYYYMMDD (8 chars) - date only\n *\n * Usage:\n * class MyObject {\n * @datetime() lastChangedAt?: Date;\n * @datetime('lastchanged_timestamp') modifiedAt?: Date;\n * }\n */\n\n/**\n * Parse SAP timestamp string to Date\n * Supports: YYYYMMDDHHMMSS (14 chars) or YYYYMMDD (8 chars)\n */\nexport function parseSapTimestamp(ts: unknown): Date | undefined {\n if (!ts || typeof ts !== 'string') return undefined;\n\n const s = ts.trim();\n if (s.length < 8) return undefined;\n\n const year = s.slice(0, 4);\n const month = s.slice(4, 6);\n const day = s.slice(6, 8);\n const hour = s.length >= 10 ? s.slice(8, 10) : '00';\n const min = s.length >= 12 ? s.slice(10, 12) : '00';\n const sec = s.length >= 14 ? s.slice(12, 14) : '00';\n\n return new Date(`${year}-${month}-${day}T${hour}:${min}:${sec}Z`);\n}\n\n/**\n * @datetime - SAP timestamp property decorator\n *\n * @param from - Source field name (defaults to property name)\n *\n * @example\n * ```typescript\n * // Maps from same-named field\n * @datetime() lastChangedAt?: Date;\n *\n * // Maps from different field\n * @datetime('lastchanged_timestamp') modifiedAt?: Date;\n * ```\n */\nexport function datetime(from?: string): PropertyDecorator {\n return function (target: object, propertyKey: string | symbol): void {\n const key = String(propertyKey);\n const sourceKey = from || key;\n\n Object.defineProperty(target, key, {\n get(this: { _propSource?: Record<string, unknown> }) {\n const value = this._propSource?.[sourceKey];\n return parseSapTimestamp(value);\n },\n enumerable: true,\n configurable: true,\n });\n } as PropertyDecorator;\n}\n\n/**\n * @date - SAP date-only property decorator (alias for datetime)\n */\nexport const date = datetime;\n","/**\n * @lazy - Lazy Initialization Decorator\n *\n * Computes a value once on first access, then caches it.\n *\n * Usage:\n * class MyObject {\n * @lazy(self => `${self.a}/${self.b}`)\n * key!: string;\n * }\n *\n * Note: Due to class field shadowing, use `declare` keyword:\n * @lazy(self => compute())\n * declare myProp: Type;\n */\n\nconst LAZY_CACHE = Symbol('lazy:cache');\n\nexport type LazyFactory<T, R> = (self: T) => R;\n\n/**\n * @lazy - Lazy computed property decorator\n *\n * @param factory - Function that computes the value (receives `this`)\n *\n * @example\n * ```typescript\n * class MyClass {\n * firstName = 'John';\n * lastName = 'Doe';\n *\n * @lazy(self => `${self.firstName} ${self.lastName}`)\n * declare fullName: string;\n * }\n * ```\n */\nexport function lazy<T extends object, R>(\n factory: LazyFactory<T, R>,\n): PropertyDecorator {\n return function (target: object, propertyKey: string | symbol): void {\n const key = String(propertyKey);\n\n Object.defineProperty(target, key, {\n get(this: T & { [LAZY_CACHE]?: Map<string, unknown> }) {\n // Initialize cache if needed\n let cache = this[LAZY_CACHE];\n if (!cache) {\n cache = new Map();\n (this as { [LAZY_CACHE]: Map<string, unknown> })[LAZY_CACHE] = cache;\n }\n\n // Return cached value or compute\n if (!cache.has(key)) {\n cache.set(key, factory(this));\n }\n return cache.get(key) as R;\n },\n enumerable: true,\n configurable: true,\n });\n } as PropertyDecorator;\n}\n\n/**\n * Invalidate a specific lazy property (force recomputation on next access)\n */\nexport function invalidateLazy<T extends object>(\n obj: T,\n propertyKey: string,\n): void {\n const cache = (obj as { [LAZY_CACHE]?: Map<string, unknown> })[LAZY_CACHE];\n cache?.delete(propertyKey);\n}\n\n/**\n * Invalidate all lazy properties on an object\n */\nexport function invalidateAllLazy<T extends object>(obj: T): void {\n const cache = (obj as { [LAZY_CACHE]?: Map<string, unknown> })[LAZY_CACHE];\n cache?.clear();\n}\n","/**\n * CLAS - ABAP Class\n *\n * ADK object for ABAP classes (CLAS).\n */\n\nimport { AdkMainObject } from '../../../base/model';\nimport { Class as ClassKind } from '../../../base/kinds';\nimport { getGlobalContext } from '../../../base/global-context';\nimport { invalidateLazy } from '../../../decorators';\nimport type { AdkContext } from '../../../base/context';\nimport type { ClassIncludeType } from './clas.types';\n\n// Import response type from ADT integration layer\nimport type { ClassResponse } from '../../../base/adt';\n\n/**\n * Class data type - imported from contract\n *\n * The schema wraps everything in an 'abapClass' element, so we unwrap it here\n * to provide a flat structure for ADK consumers.\n */\nexport type ClassXml = ClassResponse['abapClass'];\n\n/**\n * ADK Class object\n *\n * Inherits from AdkMainObject which provides:\n * - AdkObject: name, type, description, version, language, changedBy/At, createdBy/At, links\n * - AdkMainObject: package, packageRef, responsible, masterLanguage, masterSystem, abapLanguageVersion\n *\n * Access class-specific properties via `data`:\n * - data.category, data.final, data.abstract, data.visibility\n * - data.sharedMemoryEnabled, data.modeled, data.fixPointArithmetic\n * - data.superClassRef, data.messageClassRef, data.include\n */\nexport class AdkClass extends AdkMainObject<typeof ClassKind, ClassXml> {\n static readonly kind = ClassKind;\n readonly kind = AdkClass.kind;\n\n // ADT object URI (computed - not in data)\n get objectUri(): string {\n return `/sap/bc/adt/oo/classes/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n // Lazy segments - source code\n\n async getMainSource(): Promise<string> {\n return this.lazy('source:main', async () => {\n return this.crudContract.source.main.get(this.name);\n });\n }\n\n async getIncludeSource(includeType: ClassIncludeType): Promise<string> {\n return this.lazy(`source:${includeType}`, async () => {\n if (includeType === 'main') {\n return this.crudContract.source.main.get(this.name);\n }\n // Use contract's generic includes.get() - works for all include types\n return this.crudContract.includes.get(this.name, includeType);\n });\n }\n\n async getDefinitions(): Promise<string> {\n return this.getIncludeSource('definitions');\n }\n\n async getImplementations(): Promise<string> {\n return this.getIncludeSource('implementations');\n }\n\n async getTestClasses(): Promise<string> {\n return this.getIncludeSource('testclasses');\n }\n\n // ============================================\n // Source Code Save Methods\n // ============================================\n\n /**\n * Save main source code\n * Requires object to be locked first\n */\n override async saveMainSource(\n source: string,\n options?: { lockHandle?: string; transport?: string },\n ): Promise<void> {\n await this.crudContract.source.main.put(\n this.name,\n {\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n ...(options?.transport ? { corrNr: options.transport } : {}),\n },\n source,\n );\n\n // Invalidate cached source\n invalidateLazy(this, 'source:main');\n }\n\n /**\n * Save include source code\n * Requires object to be locked first\n */\n async saveIncludeSource(\n includeType: ClassIncludeType,\n source: string,\n options?: { lockHandle?: string; transport?: string },\n ): Promise<void> {\n const putOptions = {\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n ...(options?.transport ? { corrNr: options.transport } : {}),\n };\n\n if (includeType === 'main') {\n await this.crudContract.source.main.put(this.name, putOptions, source);\n } else {\n await this.crudContract.includes.put(\n this.name,\n includeType,\n putOptions,\n source,\n );\n }\n\n // Invalidate cached source\n invalidateLazy(this, `source:${includeType}`);\n }\n\n // normalizeSource() inherited from base class\n\n /**\n * Save all pending sources (set via _pendingSources)\n * Used by export workflow after deserialization from abapGit\n * Overrides base class method\n *\n * Note: unchanged detection is handled by checkPendingSourcesUnchanged()\n * which runs BEFORE lock acquisition. By the time we reach here,\n * at least one source differs — save them all.\n */\n protected override async savePendingSources(options?: {\n lockHandle?: string;\n transport?: string;\n }): Promise<void> {\n const pendingSources = (\n this as unknown as { _pendingSources?: Record<string, string> }\n )._pendingSources;\n if (!pendingSources) return;\n\n const errors: Error[] = [];\n const deferred: [string, string][] = [];\n\n for (const [key, source] of Object.entries(pendingSources)) {\n try {\n if (key === 'main') {\n await this.saveMainSource(source, options);\n } else {\n await this.saveIncludeSource(\n key as ClassIncludeType,\n source,\n options,\n );\n }\n } catch (e) {\n const errorMsg = e instanceof Error ? e.message : String(e);\n // 409 Conflict means the include is already locked in the transport\n if (errorMsg.includes('409') || errorMsg.includes('Conflict')) {\n continue;\n }\n // Include doesn't have an inactive version — defer for retry after activation\n // This happens on BTP when testclasses/localtypes includes don't exist yet\n if (\n errorMsg.includes('does not have any inactive version') ||\n errorMsg.includes('ResourceNotFound')\n ) {\n deferred.push([key, source]);\n continue;\n }\n errors.push(e instanceof Error ? e : new Error(String(e)));\n }\n }\n\n // Store deferred sources for retry after activation\n if (deferred.length > 0) {\n (\n this as unknown as { _deferredSources: [string, string][] }\n )._deferredSources = deferred;\n }\n\n // Clear pending sources after save\n delete (this as unknown as { _pendingSources?: Record<string, string> })\n ._pendingSources;\n delete (this as unknown as { _pendingSource?: string })._pendingSource;\n\n // If there were non-recoverable errors, throw the first one\n if (errors.length > 0) {\n throw errors[0];\n }\n }\n\n /**\n * Pre-lock comparison: check if all pending sources match SAP\n * If identical, sets _unchanged = true so save() skips locking and PUT\n */\n protected override async checkPendingSourcesUnchanged(): Promise<void> {\n const pendingSources = (\n this as unknown as { _pendingSources?: Record<string, string> }\n )._pendingSources;\n if (!pendingSources) return;\n\n for (const [key, pendingSource] of Object.entries(pendingSources)) {\n try {\n const currentSource = await this.getIncludeSource(\n key as ClassIncludeType,\n );\n if (\n this.normalizeSource(currentSource) !==\n this.normalizeSource(pendingSource)\n ) {\n return; // At least one source changed — needs saving\n }\n } catch {\n return; // Source doesn't exist on SAP (404) — needs saving\n }\n }\n\n // All sources identical\n this._unchanged = true;\n // Clear pending sources\n delete (this as unknown as { _pendingSources?: Record<string, string> })\n ._pendingSources;\n delete (this as unknown as { _pendingSource?: string })._pendingSource;\n }\n\n /**\n * Check if object has pending sources to save\n * Overrides base class method\n */\n protected override hasPendingSources(): boolean {\n return !!(this as unknown as { _pendingSources?: Record<string, string> })\n ._pendingSources;\n }\n\n /**\n * Refresh cached ETags for all pending source endpoints after locking.\n * Classes have multiple source URLs (main + includes) that all need fresh ETags.\n */\n protected override async refreshETagsAfterLock(): Promise<void> {\n const pendingSources = (\n this as unknown as { _pendingSources?: Record<string, string> }\n )._pendingSources;\n if (!pendingSources) {\n return super.refreshETagsAfterLock();\n }\n\n const basePath = `/sap/bc/adt/oo/classes/${this.name.toLowerCase()}`;\n for (const key of Object.keys(pendingSources)) {\n const endpoint =\n key === 'main'\n ? `${basePath}/source/main`\n : `${basePath}/includes/${key}`;\n try {\n // Re-GET via the typed contract so the adapter refreshes its\n // cached ETag for this URL (needed because a preceding lock\n // invalidates the previously-cached source ETag).\n if (key === 'main') {\n await this.crudContract.source.main.get(this.name);\n } else {\n await this.crudContract.includes.get(this.name, key);\n }\n } catch {\n // Include may not exist yet — clear stale ETag to avoid 412\n this.ctx.client.clearETag(endpoint);\n }\n }\n }\n\n // ============================================\n // CRUD contract config - enables save()\n // ============================================\n\n protected override get wrapperKey() {\n return 'abapClass';\n }\n protected override get crudContract(): any {\n return this.ctx.client.adt.oo.classes;\n }\n\n // ============================================\n // Static Factory Methods\n // ============================================\n\n static async get(name: string, ctx?: AdkContext): Promise<AdkClass> {\n const context = ctx ?? getGlobalContext();\n return new AdkClass(context, name).load();\n }\n\n /**\n * Check if a class exists on SAP\n */\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n await AdkClass.get(name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new ABAP class on SAP\n *\n * @param name - Class name (e.g., 'ZCL_MY_CLASS')\n * @param description - Short description\n * @param packageName - Package to assign the class to\n * @param options - Save options (transport)\n * @param ctx - Optional ADK context\n */\n static async create(\n name: string,\n description: string,\n packageName: string,\n options?: { transport?: string },\n ctx?: AdkContext,\n ): Promise<AdkClass> {\n const context = ctx ?? getGlobalContext();\n const cls = new AdkClass(context, name.toUpperCase());\n cls.setData({\n name: name.toUpperCase(),\n type: 'CLAS/OC',\n description,\n language: 'EN',\n masterLanguage: 'EN',\n packageRef: {\n name: packageName.toUpperCase(),\n uri: `/sap/bc/adt/packages/${encodeURIComponent(packageName.toUpperCase())}`,\n type: 'DEVC/K',\n },\n } as unknown as ClassXml);\n await cls.save({ transport: options?.transport, mode: 'create' });\n return cls;\n }\n\n /**\n * Delete an ABAP class from SAP\n *\n * @param name - Class name\n * @param options - Delete options (transport)\n * @param ctx - Optional ADK context\n */\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n const cls = new AdkClass(context, name.toUpperCase());\n const contract = cls.crudContract;\n await contract.delete(name.toUpperCase(), {\n corrNr: options?.transport,\n lockHandle: options?.lockHandle,\n });\n }\n}\n\n// Self-register with ADK registry\nimport { registerObjectType } from '../../../base/registry';\nregisterObjectType('CLAS', ClassKind, AdkClass, { endpoint: 'oo/classes' });\n","/**\n * INTF - ABAP Interface\n *\n * ADK object for ABAP interfaces (INTF).\n */\n\nimport { AdkMainObject } from '../../../base/model';\nimport { Interface as InterfaceKind } from '../../../base/kinds';\nimport { getGlobalContext } from '../../../base/global-context';\nimport type { AdkContext } from '../../../base/context';\n\n// Import response type from ADT integration layer\nimport type { InterfaceResponse } from '../../../base/adt';\n\n/**\n * Interface data type - imported from contract\n *\n * The schema wraps everything in an 'abapInterface' element, so we unwrap it here\n * to provide a flat structure for ADK consumers.\n */\nexport type InterfaceXml = InterfaceResponse['abapInterface'];\n\n/**\n * ADK Interface object\n *\n * Inherits from AdkMainObject which provides:\n * - AdkObject: name, type, description, version, language, changedBy/At, createdBy/At, links\n * - AdkMainObject: package, packageRef, responsible, masterLanguage, masterSystem, abapLanguageVersion\n *\n * Access interface-specific properties via `data`:\n * - data.modeled, data.sourceUri, data.fixPointArithmetic, data.activeUnicodeCheck\n */\nexport class AdkInterface extends AdkMainObject<\n typeof InterfaceKind,\n InterfaceXml\n> {\n static readonly kind = InterfaceKind;\n readonly kind = AdkInterface.kind;\n\n // ADT object URI (computed - not in data)\n get objectUri(): string {\n return `/sap/bc/adt/oo/interfaces/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n // Lazy segments - source code\n\n async getSource(): Promise<string> {\n return this.lazy('source', async () => {\n return this.ctx.client.adt.oo.interfaces.source.main.get(this.name);\n });\n }\n\n // savePendingSources, checkPendingSourcesUnchanged, hasPendingSources,\n // and saveMainSource are all handled by the base class via objectUri + /source/main\n\n // ============================================\n // CRUD contract config - enables save()\n // ============================================\n\n protected override get wrapperKey() {\n return 'abapInterface';\n }\n protected override get crudContract(): any {\n return this.ctx.client.adt.oo.interfaces;\n }\n\n // ============================================\n // Static Factory Methods\n // ============================================\n\n static async get(name: string, ctx?: AdkContext): Promise<AdkInterface> {\n const context = ctx ?? getGlobalContext();\n return new AdkInterface(context, name).load();\n }\n\n /**\n * Check if an interface exists on SAP\n */\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n await AdkInterface.get(name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new ABAP interface on SAP\n *\n * @param name - Interface name (e.g., 'ZIF_MY_INTERFACE')\n * @param description - Short description\n * @param packageName - Package to assign the interface to\n * @param options - Save options (transport)\n * @param ctx - Optional ADK context\n */\n static async create(\n name: string,\n description: string,\n packageName: string,\n options?: { transport?: string },\n ctx?: AdkContext,\n ): Promise<AdkInterface> {\n const context = ctx ?? getGlobalContext();\n const intf = new AdkInterface(context, name.toUpperCase());\n intf.setData({\n name: name.toUpperCase(),\n type: 'INTF/OI',\n description,\n language: 'EN',\n masterLanguage: 'EN',\n packageRef: {\n name: packageName.toUpperCase(),\n uri: `/sap/bc/adt/packages/${encodeURIComponent(packageName.toUpperCase())}`,\n type: 'DEVC/K',\n },\n } as unknown as InterfaceXml);\n await intf.save({ transport: options?.transport, mode: 'create' });\n return intf;\n }\n\n /**\n * Delete an ABAP interface from SAP\n *\n * @param name - Interface name\n * @param options - Delete options (transport)\n * @param ctx - Optional ADK context\n */\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n const intf = new AdkInterface(context, name.toUpperCase());\n const contract = intf.crudContract;\n await contract.delete(name.toUpperCase(), {\n corrNr: options?.transport,\n lockHandle: options?.lockHandle,\n });\n }\n}\n\n// Self-register with ADK registry\nimport { registerObjectType } from '../../../base/registry';\nregisterObjectType('INTF', InterfaceKind, AdkInterface, {\n endpoint: 'oo/interfaces',\n});\n","/**\n * PROG - ABAP Program\n *\n * ADK object for ABAP programs (PROG).\n */\n\nimport { AdkMainObject } from '../../../base/model';\nimport { Program as ProgramKind } from '../../../base/kinds';\nimport { getGlobalContext } from '../../../base/global-context';\nimport type { AdkContext } from '../../../base/context';\n\n// Import response type from ADT integration layer\nimport type { ProgramResponse } from '../../../base/adt';\n\n/**\n * Program data type - unwrap from root element\n *\n * The schema wraps everything in an 'abapProgram' element, so we unwrap it here\n * to provide a flat structure for ADK consumers.\n */\nexport type ProgramXml = ProgramResponse['abapProgram'];\n\n/**\n * ADK Program object\n *\n * Inherits from AdkMainObject which provides:\n * - AdkObject: name, type, description, version, language, changedBy/At, createdBy/At, links\n * - AdkMainObject: package, packageRef, responsible, masterLanguage, masterSystem, abapLanguageVersion\n *\n * Access program-specific properties via `data`:\n * - data.programType, data.sourceUri, data.fixPointArithmetic, data.activeUnicodeCheck\n */\nexport class AdkProgram extends AdkMainObject<typeof ProgramKind, ProgramXml> {\n static readonly kind = ProgramKind;\n readonly kind = AdkProgram.kind;\n\n // ADT object URI (computed - not in data)\n get objectUri(): string {\n return `/sap/bc/adt/programs/programs/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n // Lazy segments - source code\n\n async getSource(): Promise<string> {\n return this.lazy('source', async () => {\n return this.ctx.client.adt.programs.programs.source.main.get(this.name);\n });\n }\n\n // savePendingSources, checkPendingSourcesUnchanged, hasPendingSources,\n // and saveMainSource are all handled by the base class via objectUri + /source/main\n\n // ============================================\n // CRUD contract config - enables save()\n // ============================================\n\n protected override get wrapperKey() {\n return 'abapProgram';\n }\n // Note: `any` return type is intentional here — this is an established pattern\n // in the ADK codebase (see intf.model.ts). The base class defines\n // crudContract as `any` to support different contract structures per object type.\n protected override get crudContract(): any {\n return this.ctx.client.adt.programs.programs;\n }\n\n // ============================================\n // Static Factory Methods\n // ============================================\n\n static async get(name: string, ctx?: AdkContext): Promise<AdkProgram> {\n const context = ctx ?? getGlobalContext();\n return new AdkProgram(context, name).load();\n }\n\n /**\n * Check if a program exists on SAP\n */\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n await AdkProgram.get(name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new ABAP program on SAP\n *\n * @param name - Program name (e.g., 'ZMYPROGRAM')\n * @param description - Short description\n * @param packageName - Package to assign the program to\n * @param options - Save options (transport)\n * @param ctx - Optional ADK context\n */\n static async create(\n name: string,\n description: string,\n packageName: string,\n options?: { transport?: string },\n ctx?: AdkContext,\n ): Promise<AdkProgram> {\n const context = ctx ?? getGlobalContext();\n const prog = new AdkProgram(context, name.toUpperCase());\n prog.setData({\n name: name.toUpperCase(),\n type: 'PROG/P',\n description,\n language: 'EN',\n masterLanguage: 'EN',\n packageRef: {\n name: packageName.toUpperCase(),\n uri: `/sap/bc/adt/packages/${encodeURIComponent(packageName.toUpperCase())}`,\n type: 'DEVC/K',\n },\n } as unknown as ProgramXml);\n await prog.save({ transport: options?.transport, mode: 'create' });\n return prog;\n }\n\n /**\n * Delete an ABAP program from SAP\n *\n * @param name - Program name\n * @param options - Delete options (transport)\n * @param ctx - Optional ADK context\n */\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n const prog = new AdkProgram(context, name.toUpperCase());\n const contract = prog.crudContract;\n await contract.delete(name.toUpperCase(), {\n corrNr: options?.transport,\n lockHandle: options?.lockHandle,\n });\n }\n}\n\n// Self-register with ADK registry\nimport { registerObjectType } from '../../../base/registry';\nregisterObjectType('PROG', ProgramKind, AdkProgram, {\n endpoint: 'programs/programs',\n});\n","/**\n * INCL - ABAP Program Include\n *\n * ADK object for ABAP program includes (PROG/I). Mirrors the PROG model\n * but targets the `/sap/bc/adt/programs/includes` endpoint.\n */\n\nimport { AdkMainObject } from '../../../base/model';\nimport { Include as IncludeKind } from '../../../base/kinds';\nimport { getGlobalContext } from '../../../base/global-context';\nimport type { AdkContext } from '../../../base/context';\n\n// Import response type from ADT integration layer\nimport type { IncludeResponse } from '../../../base/adt';\n\n/**\n * Include data type - unwrap from root element.\n *\n * The schema wraps everything in an 'abapInclude' element, so we unwrap\n * it here to provide a flat structure for ADK consumers.\n */\nexport type IncludeXml = IncludeResponse['abapInclude'];\n\n/**\n * ADK Include object\n *\n * Inherits from AdkMainObject which provides:\n * - AdkObject: name, type, description, version, language, changedBy/At,\n * createdBy/At, links\n * - AdkMainObject: package, packageRef, responsible, masterLanguage,\n * masterSystem, abapLanguageVersion\n *\n * Access include-specific properties via `data`:\n * - data.sourceUri, data.fixPointArithmetic, data.activeUnicodeCheck,\n * data.contextRef (pointer to the main program)\n */\nexport class AdkInclude extends AdkMainObject<typeof IncludeKind, IncludeXml> {\n static readonly kind = IncludeKind;\n readonly kind = AdkInclude.kind;\n\n // ADT object URI (computed - not in data)\n get objectUri(): string {\n return `/sap/bc/adt/programs/includes/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n // Lazy segments - source code\n async getSource(): Promise<string> {\n return this.lazy('source', async () => {\n return this.ctx.client.adt.programs.includes.source.main.get(this.name);\n });\n }\n\n // savePendingSources, checkPendingSourcesUnchanged, hasPendingSources,\n // and saveMainSource are all handled by the base class via objectUri + /source/main\n\n // ============================================\n // CRUD contract config - enables save()\n // ============================================\n\n protected override get wrapperKey() {\n return 'abapInclude';\n }\n // Note: `any` return type mirrors intf.model.ts / prog.model.ts — the base\n // class types crudContract as `any` to support slightly different contract\n // shapes per object type.\n protected override get crudContract(): any {\n return this.ctx.client.adt.programs.includes;\n }\n\n /**\n * Skeleton POST data for includes.\n *\n * Extends the base skeleton (name/type/description/packageRef) with\n * `contextRef`, which sapcli's `sap.adt.Include(..., master=...)` serializes\n * at creation time. Without this the include would be created detached\n * from its main program.\n */\n protected override async getSkeletonData(): Promise<Record<string, unknown>> {\n const base = await super.getSkeletonData();\n const d = (await this.data()) as Record<string, unknown>;\n if (d.contextRef) {\n base.contextRef = d.contextRef;\n }\n return base;\n }\n\n // ============================================\n // Static Factory Methods\n // ============================================\n\n static async get(name: string, ctx?: AdkContext): Promise<AdkInclude> {\n const context = ctx ?? getGlobalContext();\n return new AdkInclude(context, name).load();\n }\n\n /**\n * Check if an include exists on SAP\n */\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n await AdkInclude.get(name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new ABAP include on SAP\n *\n * @param name - Include name (e.g., 'ZMY_INCLUDE')\n * @param description - Short description\n * @param packageName - Package to assign the include to\n * @param options - Save options (transport, master program)\n * @param ctx - Optional ADK context\n */\n static async create(\n name: string,\n description: string,\n packageName: string,\n options?: { transport?: string; master?: string },\n ctx?: AdkContext,\n ): Promise<AdkInclude> {\n const context = ctx ?? getGlobalContext();\n const incl = new AdkInclude(context, name.toUpperCase());\n const data: Record<string, unknown> = {\n name: name.toUpperCase(),\n type: 'PROG/I',\n description,\n language: 'EN',\n masterLanguage: 'EN',\n packageRef: {\n name: packageName.toUpperCase(),\n uri: `/sap/bc/adt/packages/${encodeURIComponent(packageName.toUpperCase())}`,\n type: 'DEVC/K',\n },\n };\n if (options?.master) {\n const master = options.master.toUpperCase();\n data.contextRef = {\n name: master,\n uri: `/sap/bc/adt/programs/programs/${encodeURIComponent(master.toLowerCase())}`,\n type: 'PROG/P',\n };\n }\n incl.setData(data as unknown as IncludeXml);\n await incl.save({ transport: options?.transport, mode: 'create' });\n return incl;\n }\n\n /**\n * Delete an ABAP include from SAP\n *\n * @param name - Include name\n * @param options - Delete options (transport, lockHandle)\n * @param ctx - Optional ADK context\n */\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n const incl = new AdkInclude(context, name.toUpperCase());\n const contract = incl.crudContract;\n await contract.delete(name.toUpperCase(), {\n corrNr: options?.transport,\n lockHandle: options?.lockHandle,\n });\n }\n}\n\n// Self-register with ADK registry\nimport { registerObjectType } from '../../../base/registry';\nregisterObjectType('INCL', IncludeKind, AdkInclude, {\n endpoint: 'programs/includes',\n});\n","/**\n * FUGR - ABAP Function Group\n *\n * ADK object for ABAP function groups (FUGR).\n */\n\nimport { AdkMainObject } from '../../../base/model';\nimport { FunctionGroup as FunctionGroupKind } from '../../../base/kinds';\nimport { getGlobalContext } from '../../../base/global-context';\nimport type { AdkContext } from '../../../base/context';\n\n// Import response type from ADT integration layer\nimport type { FunctionGroupResponse } from '../../../base/adt';\n\n/**\n * Function group data type - unwrap from root element\n *\n * The schema wraps everything in an 'abapFunctionGroup' element, so we unwrap it here\n * to provide a flat structure for ADK consumers.\n */\nexport type FunctionGroupXml = FunctionGroupResponse['abapFunctionGroup'];\n\n/**\n * ADK Function Group object\n *\n * Inherits from AdkMainObject which provides:\n * - AdkObject: name, type, description, version, language, changedBy/At, createdBy/At, links\n * - AdkMainObject: package, packageRef, responsible, masterLanguage, masterSystem, abapLanguageVersion\n *\n * Access function group-specific properties via `data`:\n * - data.sourceUri, data.fixPointArithmetic, data.activeUnicodeCheck\n */\nexport class AdkFunctionGroup extends AdkMainObject<\n typeof FunctionGroupKind,\n FunctionGroupXml\n> {\n static readonly kind = FunctionGroupKind;\n readonly kind = AdkFunctionGroup.kind;\n\n // ADT object URI (computed - not in data)\n get objectUri(): string {\n return `/sap/bc/adt/functions/groups/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n // Lazy segments - source code\n\n async getSource(): Promise<string> {\n return this.lazy('source', async () => {\n return this.ctx.client.adt.functions.groups.source.main.get(this.name);\n });\n }\n\n // savePendingSources, checkPendingSourcesUnchanged, hasPendingSources,\n // and saveMainSource are all handled by the base class via objectUri + /source/main\n\n // ============================================\n // CRUD contract config - enables save()\n // ============================================\n\n protected override get wrapperKey() {\n return 'abapFunctionGroup';\n }\n // Note: `any` return type is intentional here — this is an established pattern\n // in the ADK codebase (see intf.model.ts). The base class defines\n // crudContract as `any` to support different contract structures per object type.\n protected override get crudContract(): any {\n return this.ctx.client.adt.functions.groups;\n }\n\n // ============================================\n // Static Factory Methods\n // ============================================\n\n static async get(name: string, ctx?: AdkContext): Promise<AdkFunctionGroup> {\n const context = ctx ?? getGlobalContext();\n return new AdkFunctionGroup(context, name).load();\n }\n\n /**\n * Check if a function group exists on SAP\n */\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n await AdkFunctionGroup.get(name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new ABAP function group on SAP\n */\n static async create(\n name: string,\n description: string,\n packageName: string,\n options?: { transport?: string },\n ctx?: AdkContext,\n ): Promise<AdkFunctionGroup> {\n const context = ctx ?? getGlobalContext();\n const fugr = new AdkFunctionGroup(context, name.toUpperCase());\n fugr.setData({\n name: name.toUpperCase(),\n type: 'FUGR/F',\n description,\n language: 'EN',\n masterLanguage: 'EN',\n packageRef: {\n name: packageName.toUpperCase(),\n uri: `/sap/bc/adt/packages/${encodeURIComponent(packageName.toUpperCase())}`,\n type: 'DEVC/K',\n },\n } as unknown as FunctionGroupXml);\n await fugr.save({ transport: options?.transport, mode: 'create' });\n return fugr;\n }\n\n /**\n * Delete an ABAP function group from SAP\n */\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n const fugr = new AdkFunctionGroup(context, name.toUpperCase());\n const contract = fugr.crudContract;\n await contract.delete(name.toUpperCase(), {\n corrNr: options?.transport,\n lockHandle: options?.lockHandle,\n });\n }\n}\n\n// Self-register with ADK registry\nimport { registerObjectType } from '../../../base/registry';\nregisterObjectType('FUGR', FunctionGroupKind, AdkFunctionGroup, {\n endpoint: 'functions/groups',\n // SAPL{name} is the main program of function group {name} — strip the prefix\n normalizeName: (name) =>\n name.toUpperCase().startsWith('SAPL') ? name.slice(4) : name,\n});\n","/**\n * FUGR/FF - ABAP Function Module\n *\n * ADK object for ABAP function modules (FUGR/FF).\n * Function modules are child objects of function groups - they are accessed\n * via the parent group's URL path and require the group name for all operations.\n */\n\nimport { AdkObject } from '../../../../base/model';\nimport { FunctionModule as FunctionModuleKind } from '../../../../base/kinds';\nimport { getGlobalContext } from '../../../../base/global-context';\nimport type { AdkContext } from '../../../../base/context';\n\n// Import response type from ADT integration layer\nimport type { FunctionModuleResponse } from '../../../../base/adt';\n\n/**\n * Function module data type - unwrap from root element\n *\n * The schema wraps everything in an 'abapFunctionModule' element, so we unwrap it here\n * to provide a flat structure for ADK consumers.\n */\nexport type FunctionModuleXml = FunctionModuleResponse['abapFunctionModule'];\n\n/**\n * ADK Function Module object\n *\n * Function modules are child objects of function groups. Unlike main objects\n * (classes, interfaces, etc.), they don't have their own package reference.\n * All API operations require the parent group name in the URL path.\n *\n * Key differences from AdkMainObject:\n * - Requires `groupName` for URI construction and all CRUD operations\n * - Overrides lock/unlock/load/save to pass groupName to contract calls\n * - No packageRef (lives within parent function group's package)\n */\nexport class AdkFunctionModule extends AdkObject<\n typeof FunctionModuleKind,\n FunctionModuleXml\n> {\n static readonly kind = FunctionModuleKind;\n readonly kind = AdkFunctionModule.kind;\n\n /** Parent function group name */\n groupName: string;\n\n /**\n * Constructor supports two calling patterns:\n *\n * 1. Direct (3-arg): `new AdkFunctionModule(ctx, groupName, nameOrData)`\n * Used by static factory method and when group name is known upfront.\n *\n * 2. Factory (2-arg): `new AdkFunctionModule(ctx, data)`\n * Used by ADK factory's `getWithData()`. The groupName is extracted from\n * `data._groupName` or `data.containerRef.name`.\n */\n constructor(\n ctx: AdkContext,\n groupNameOrData: string | FunctionModuleXml,\n dataOrName?: FunctionModuleXml | string,\n ) {\n if (dataOrName !== undefined) {\n // 3-arg form: (ctx, groupName, dataOrName)\n super(ctx, dataOrName);\n this.groupName = groupNameOrData as string;\n } else if (typeof groupNameOrData === 'string') {\n // 2-arg form with string: (ctx, name) — groupName must be set later\n super(ctx, groupNameOrData);\n this.groupName = '';\n } else {\n // 2-arg form with data object: (ctx, data) — extract groupName from data\n const data = groupNameOrData as Record<string, unknown>;\n super(ctx, groupNameOrData);\n this.groupName =\n (data._groupName as string) ??\n ((data.containerRef as Record<string, unknown> | undefined)\n ?.name as string) ??\n '';\n }\n }\n\n // ADT object URI (computed - includes parent group)\n get objectUri(): string {\n return `/sap/bc/adt/functions/groups/${encodeURIComponent(this.groupName.toLowerCase())}/fmodules/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n override get collectionUri(): string {\n return `/sap/bc/adt/functions/groups/${encodeURIComponent(this.groupName.toLowerCase())}/fmodules`;\n }\n\n // ============================================\n // CRUD contract config\n // ============================================\n\n protected override get wrapperKey() {\n return 'abapFunctionModule';\n }\n\n // Note: `any` return type is intentional — the base class defines\n // crudContract as `any` to support different contract structures per object type.\n protected override get crudContract(): any {\n return this.ctx.client.adt.functions.groups.fmodules;\n }\n\n // ============================================\n // Override base methods to pass groupName\n // ============================================\n\n /**\n * Load function module data from SAP\n *\n * Overrides base to pass groupName as first arg to contract.get()\n */\n override async load(): Promise<this> {\n const contract = this.crudContract;\n const wrapperKey = this.wrapperKey;\n\n if (!contract || !wrapperKey) {\n throw new Error(\n `Load not implemented for ${this.kind}. Override load() or provide crudContract/wrapperKey.`,\n );\n }\n\n const response = await contract.get(this.groupName, this.name);\n\n if (!response || !(wrapperKey in response)) {\n throw new Error(\n `${this.kind} '${this.name}' in group '${this.groupName}' not found or returned empty response`,\n );\n }\n\n this.setData(\n (response as Record<string, unknown>)[wrapperKey] as FunctionModuleXml,\n );\n return this;\n }\n\n // lock() and unlock() are inherited from base AdkObject — they delegate to\n // ctx.lockService using this.objectUri which already includes the group path.\n\n /**\n * Get skeleton data for FM creation (POST).\n *\n * FMs only need name, type, description, and processing attributes.\n * No packageRef — FMs inherit the package from their parent FUGR.\n */\n protected override async getSkeletonData(): Promise<Record<string, unknown>> {\n const rawData = await this.data();\n const d = rawData as Record<string, unknown>;\n return {\n name: d.name,\n type: d.type,\n description: d.description ?? '',\n processingType: d.processingType,\n basXMLEnabled: d.basXMLEnabled,\n };\n }\n\n /**\n * Execute the typed contract call for save\n *\n * Overrides base to pass groupName to contract.put()/post()\n */\n protected override async saveViaContract(\n mode: 'create' | 'update',\n options: { transport?: string; lockHandle?: string },\n ): Promise<void> {\n const wrapperKey = this.wrapperKey;\n const contract = this.crudContract;\n\n if (!wrapperKey || !contract) {\n throw new Error(`Save not supported for ${this.kind}.`);\n }\n\n if (mode === 'create') {\n // POST skeleton — minimal fields only\n const skeleton = await this.getSkeletonData();\n const data = { [wrapperKey]: skeleton };\n await contract.post(this.groupName, { corrNr: options.transport }, data);\n } else {\n const rawData = await this.data();\n\n // Strip abapLanguageVersion from the payload (same as base class)\n const { abapLanguageVersion: _, ...rest } = rawData as Record<\n string,\n unknown\n >;\n const saveData = rest;\n const data = { [wrapperKey]: saveData };\n\n await contract.put(\n this.groupName,\n this.name,\n {\n corrNr: options.transport,\n lockHandle: options.lockHandle,\n },\n data,\n );\n }\n }\n\n /**\n * Check if the function module exists on the SAP system.\n *\n * Overrides base to pass groupName to contract.get()\n */\n protected override async checkObjectExists(): Promise<boolean> {\n const contract = this.crudContract;\n if (!contract?.get) return true;\n try {\n await contract.get(this.groupName, this.name);\n return true;\n } catch (e) {\n if (this.shouldFallbackToCreate(e)) return false;\n throw e;\n }\n }\n\n /**\n * Refresh cached ETags after acquiring a lock.\n *\n * FM's savePendingSources() does a metadata PUT first (to apply processingType),\n * then a source PUT. Both need fresh ETags after locking.\n * The contract uses groupName + name (potentially UPPERCASE), so we must\n * refresh via the contract to match the same cache key.\n */\n protected override async refreshETagsAfterLock(): Promise<void> {\n // Refresh metadata ETag (needed by saveViaContract in savePendingSources)\n try {\n await this.crudContract.get(this.groupName, this.name);\n } catch {\n // Object may be newly created — clear stale ETags to avoid 412\n this.ctx.client.clearETag();\n }\n // Refresh source ETag (needed by source PUT in savePendingSources)\n try {\n await this.crudContract.source.main.get(this.groupName, this.name);\n } catch {\n // Source may not exist yet — clear stale ETag to avoid 412\n this.ctx.client.clearETag(`${this.objectUri}/source/main`);\n }\n }\n\n // ============================================\n // Source code handling\n // ============================================\n\n /**\n * Strip the parameter comment block from FM source code.\n *\n * abapGit serializes FM source with a \"Local Interface\" comment block\n * that describes IMPORTING/EXPORTING/CHANGING/TABLES/EXCEPTIONS.\n * SAP ADT rejects this block when saving source — it manages the\n * interface metadata separately. Strip it before sending.\n *\n * Pattern:\n * ```\n * *\"----------------------------------------------------------------------\n * *\"*\"Local Interface:\n * *\" IMPORTING ...\n * *\"----------------------------------------------------------------------\n * ```\n */\n private stripParameterCommentBlock(source: string): string {\n const lines = source.split('\\n');\n const result: string[] = [];\n let inBlock = false;\n\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i].trimEnd();\n\n if (!inBlock && trimmed.startsWith('*\"') && trimmed.includes('---')) {\n // Start of comment block — check if next line is Local Interface\n if (i + 1 < lines.length && lines[i + 1].trimEnd().startsWith('*\"')) {\n inBlock = true;\n continue;\n }\n }\n\n if (inBlock) {\n if (trimmed.startsWith('*\"') && trimmed.includes('---')) {\n // End of comment block\n inBlock = false;\n continue;\n }\n if (trimmed.startsWith('*\"')) {\n // Inside the comment block — skip\n continue;\n }\n // Not a *\" line — block ended without closing dashes (shouldn't happen)\n inBlock = false;\n }\n\n result.push(lines[i]);\n }\n\n return result.join('\\n');\n }\n\n /**\n * Save pending source for function module.\n *\n * Overrides base to:\n * 1. PUT metadata first (SAP ignores processingType and other attributes during POST)\n * 2. Refresh source ETag (metadata PUT changes the object version)\n * 3. Strip the parameter comment block that abapGit includes\n * 4. Use the FM-specific source endpoint via groupName\n */\n protected override async savePendingSources(options?: {\n lockHandle?: string;\n transport?: string;\n }): Promise<void> {\n const self = this as unknown as { _pendingSource?: string };\n if (!self._pendingSource) return;\n\n // PUT metadata to ensure processingType and other attributes are applied.\n // SAP ignores some attributes (like processingType) during POST creation,\n // so we must PUT them separately after the object exists.\n await this.saveViaContract('update', {\n lockHandle: options?.lockHandle,\n transport: options?.transport,\n });\n\n // The metadata PUT changes the object's ETag, so we must refresh the\n // cached source ETag before the source PUT (otherwise If-Match fails).\n await this.crudContract.source.main.get(this.groupName, this.name);\n\n // Strip the parameter comment block before sending\n const cleanSource = this.stripParameterCommentBlock(self._pendingSource);\n\n await this.crudContract.source.main.put(\n this.groupName,\n this.name,\n {\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n ...(options?.transport ? { corrNr: options.transport } : {}),\n },\n cleanSource,\n );\n\n delete self._pendingSource;\n }\n\n /**\n * Extract the body of a FUNCTION...ENDFUNCTION block.\n *\n * SAP reconstructs the FUNCTION header when returning source code:\n * Local: `FUNCTION zage_fm.` (lowercase, period inline)\n * SAP: `FUNCTION ZAGE_FM\\n \" template comment\"\\n.` (uppercase, period on own line)\n *\n * The body between the header and ENDFUNCTION is identical, so we compare\n * only that part. The header ends at the first period that terminates the\n * FUNCTION statement (either inline `FUNCTION name.` or on a separate line `.`).\n */\n private extractFunctionBody(source: string): string {\n const lines = source.split('\\n');\n let bodyStart = 0;\n let bodyEnd = lines.length;\n\n // Find the end of the FUNCTION header — the first line whose trimmed\n // content is just \".\" or that ends with \".\" on the FUNCTION line itself.\n for (let i = 0; i < lines.length; i++) {\n const trimmed = lines[i].trimEnd();\n if (i === 0 && /^FUNCTION\\s+\\S+\\.\\s*$/i.test(trimmed)) {\n // Period on the same line as FUNCTION\n bodyStart = i + 1;\n break;\n }\n if (i > 0 && trimmed === '.') {\n // Period on its own line (SAP style)\n bodyStart = i + 1;\n break;\n }\n }\n\n // Find ENDFUNCTION\n for (let i = lines.length - 1; i >= bodyStart; i--) {\n if (/^\\s*ENDFUNCTION\\.\\s*$/i.test(lines[i].trimEnd())) {\n bodyEnd = i;\n break;\n }\n }\n\n return lines.slice(bodyStart, bodyEnd).join('\\n');\n }\n\n /**\n * Pre-lock comparison for FM source.\n *\n * Overrides base to:\n * 1. Strip parameter comment block from local source\n * 2. Extract only the function body (between FUNCTION header and ENDFUNCTION)\n * from both local and SAP source, because SAP reconstructs the FUNCTION\n * header with uppercase name and template comments.\n */\n protected override async checkPendingSourcesUnchanged(): Promise<void> {\n const self = this as unknown as { _pendingSource?: string };\n if (!self._pendingSource) return;\n\n try {\n const currentSource = await this.crudContract.source.main.get(\n this.groupName,\n this.name,\n );\n const cleanPending = this.stripParameterCommentBlock(self._pendingSource);\n const localBody = this.extractFunctionBody(cleanPending);\n const sapBody = this.extractFunctionBody(currentSource);\n if (this.normalizeSource(localBody) === this.normalizeSource(sapBody)) {\n this._unchanged = true;\n delete self._pendingSource;\n }\n } catch {\n // Source doesn't exist on SAP (404) — needs saving\n }\n }\n\n // ============================================\n // Lazy segments - source code\n // ============================================\n\n async getSource(): Promise<string> {\n return this.lazy('source', async () => {\n return this.ctx.client.adt.functions.groups.fmodules.source.main.get(\n this.groupName,\n this.name,\n );\n });\n }\n\n // ============================================\n // Static Factory Method\n // ============================================\n\n /**\n * Get a function module by name\n *\n * @param groupName - Parent function group name\n * @param name - Function module name\n * @param ctx - Optional ADK context (uses global if not provided)\n */\n static async get(\n groupName: string,\n name: string,\n ctx?: AdkContext,\n ): Promise<AdkFunctionModule> {\n const context = ctx ?? getGlobalContext();\n return new AdkFunctionModule(context, groupName, name).load();\n }\n\n /**\n * Check if a function module exists on SAP\n */\n static async exists(\n groupName: string,\n name: string,\n ctx?: AdkContext,\n ): Promise<boolean> {\n try {\n await AdkFunctionModule.get(groupName, name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new ABAP function module on SAP\n */\n static async create(\n groupName: string,\n name: string,\n description: string,\n options?: { transport?: string; processingType?: string },\n ctx?: AdkContext,\n ): Promise<AdkFunctionModule> {\n const context = ctx ?? getGlobalContext();\n const fm = new AdkFunctionModule(\n context,\n groupName.toUpperCase(),\n name.toUpperCase(),\n );\n fm.setData({\n name: name.toUpperCase(),\n type: 'FUGR/FF',\n description,\n processingType: options?.processingType ?? 'normal',\n } as unknown as FunctionModuleXml);\n await fm.save({ transport: options?.transport, mode: 'create' });\n return fm;\n }\n\n /**\n * Delete a function module from SAP\n */\n static async delete(\n groupName: string,\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n const fm = new AdkFunctionModule(\n context,\n groupName.toUpperCase(),\n name.toUpperCase(),\n );\n const contract = fm.crudContract;\n await contract.delete(groupName.toUpperCase(), name.toUpperCase(), {\n corrNr: options?.transport,\n lockHandle: options?.lockHandle,\n });\n }\n}\n\n// Self-register with ADK registry\n// Note: Uses 'FUGR/FF' (the SAP subtype) rather than 'FUNC'\n// because in SAP, function modules have ADT type FUGR/FF\nimport { registerObjectType } from '../../../../base/registry';\nregisterObjectType('FUGR/FF', FunctionModuleKind, AdkFunctionModule as any, {\n endpoint: 'functions/groups',\n});\n","/**\n * DOMA - Domain\n *\n * ADK object for ABAP Domains (DOMA).\n * DDIC objects are metadata-only (no source code).\n */\n\nimport { AdkMainObject } from '../../../base/model';\nimport { Domain as DomainKind } from '../../../base/kinds';\nimport { getGlobalContext } from '../../../base/global-context';\nimport type { AdkContext } from '../../../base/context';\n\nimport type { DomainResponse } from '../../../base/adt';\n\n/**\n * Domain data type - unwrap from schema root element\n */\nexport type DomainXml = DomainResponse['domain'];\n\n/**\n * ADK Domain object\n *\n * Inherits from AdkMainObject which provides:\n * - name, type, description, version, language, changedBy/At, createdBy/At, links\n * - package, packageRef, responsible, masterLanguage, masterSystem, abapLanguageVersion\n *\n * Domain-specific properties via `data`:\n * - data.typeInformation (dataType, length, decimals, outputLength)\n * - data.outputInformation (conversionExit, signPresentation, lowerCase)\n * - data.fixedValues\n */\nexport class AdkDomain extends AdkMainObject<typeof DomainKind, DomainXml> {\n static readonly kind = DomainKind;\n readonly kind = AdkDomain.kind;\n\n get objectUri(): string {\n return `/sap/bc/adt/ddic/domains/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n protected override get wrapperKey() {\n return 'domain';\n }\n protected override get crudContract(): any {\n return this.ctx.client.adt.ddic.domains;\n }\n\n static async get(name: string, ctx?: AdkContext): Promise<AdkDomain> {\n const context = ctx ?? getGlobalContext();\n return new AdkDomain(context, name).load();\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n await AdkDomain.get(name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new ABAP domain on SAP.\n *\n * Note: Domains are metadata-only objects (no source code). After creation,\n * use the `adt get domain <name>` command or abapGit-based deploy to fill in\n * the domain properties (data type, field length, etc.).\n */\n static async create(\n name: string,\n description: string,\n packageName: string,\n options?: { transport?: string },\n ctx?: AdkContext,\n ): Promise<AdkDomain> {\n const context = ctx ?? getGlobalContext();\n const domain = new AdkDomain(context, name.toUpperCase());\n domain.setData({\n name: name.toUpperCase(),\n type: 'DOMA',\n description,\n language: 'EN',\n masterLanguage: 'EN',\n packageRef: {\n name: packageName.toUpperCase(),\n uri: `/sap/bc/adt/packages/${encodeURIComponent(packageName.toUpperCase())}`,\n type: 'DEVC/K',\n },\n } as unknown as DomainXml);\n await domain.save({ transport: options?.transport, mode: 'create' });\n return domain;\n }\n\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n const domain = new AdkDomain(context, name.toUpperCase());\n await domain.crudContract.delete(name.toUpperCase(), {\n ...(options?.transport && { corrNr: options.transport }),\n ...(options?.lockHandle && { lockHandle: options.lockHandle }),\n });\n }\n}\n\n// Self-register with ADK registry\nimport { registerObjectType } from '../../../base/registry';\nregisterObjectType('DOMA', DomainKind, AdkDomain, { endpoint: 'ddic/domains' });\n","/**\n * DTEL - Data Element\n *\n * ADK object for ABAP Data Elements (DTEL).\n * DDIC objects are metadata-only (no source code).\n */\n\nimport { AdkMainObject } from '../../../base/model';\nimport { DataElement as DataElementKind } from '../../../base/kinds';\nimport { getGlobalContext } from '../../../base/global-context';\nimport type { AdkContext } from '../../../base/context';\n\nimport type { DataElementResponse } from '../../../base/adt';\n\n/**\n * Data Element data type - unwrap from wrapper root element\n * SAP wraps DTEL content in a blue:wbobj element extending AdtMainObject\n */\nexport type DataElementXml = DataElementResponse['wbobj'];\n\n/**\n * ADK Data Element object\n *\n * Inherits from AdkMainObject which provides:\n * - name, type, description, version, language, changedBy/At, createdBy/At, links\n * - package, packageRef, responsible, masterLanguage, masterSystem, abapLanguageVersion\n *\n * Data element-specific properties via `data`:\n * - data.typeKind, data.typeName, data.dataType\n * - data.shortDescription, data.mediumDescription, data.longDescription, data.headingDescription\n * - data.searchHelp\n */\nexport class AdkDataElement extends AdkMainObject<\n typeof DataElementKind,\n DataElementXml\n> {\n static readonly kind = DataElementKind;\n readonly kind = AdkDataElement.kind;\n\n get objectUri(): string {\n return `/sap/bc/adt/ddic/dataelements/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n protected override get wrapperKey() {\n return 'wbobj';\n }\n protected override get crudContract(): any {\n return this.ctx.client.adt.ddic.dataelements;\n }\n\n static async get(name: string, ctx?: AdkContext): Promise<AdkDataElement> {\n const context = ctx ?? getGlobalContext();\n return new AdkDataElement(context, name).load();\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n await AdkDataElement.get(name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new ABAP data element on SAP.\n */\n static async create(\n name: string,\n description: string,\n packageName: string,\n options?: { transport?: string },\n ctx?: AdkContext,\n ): Promise<AdkDataElement> {\n const context = ctx ?? getGlobalContext();\n const dtel = new AdkDataElement(context, name.toUpperCase());\n dtel.setData({\n name: name.toUpperCase(),\n type: 'DTEL',\n description,\n language: 'EN',\n masterLanguage: 'EN',\n packageRef: {\n name: packageName.toUpperCase(),\n uri: `/sap/bc/adt/packages/${encodeURIComponent(packageName.toUpperCase())}`,\n type: 'DEVC/K',\n },\n } as unknown as DataElementXml);\n await dtel.save({ transport: options?.transport, mode: 'create' });\n return dtel;\n }\n\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n const dtel = new AdkDataElement(context, name.toUpperCase());\n await dtel.crudContract.delete(name.toUpperCase(), {\n ...(options?.transport && { corrNr: options.transport }),\n ...(options?.lockHandle && { lockHandle: options.lockHandle }),\n });\n }\n}\n\n// Self-register with ADK registry\nimport { registerObjectType } from '../../../base/registry';\nregisterObjectType('DTEL', DataElementKind, AdkDataElement, {\n endpoint: 'ddic/dataelements',\n});\n","/**\n * TABL - Database Table / Structure\n *\n * ADK object for ABAP Database Tables (TABL/DT) and Structures (TABL/DS).\n * Tables and structures are source-based DDIC objects whose definition\n * lives in ABAP source code (retrieved via sourceUri).\n *\n * Note: Tables and structures share the same ADT main type (TABL)\n * but use different endpoints and subtypes.\n * - Tables: /sap/bc/adt/ddic/tables (TABL/DT)\n * - Structures: /sap/bc/adt/ddic/structures (TABL/DS)\n *\n * SAP wraps both in a blue:blueSource root element\n * (namespace http://www.sap.com/wbobj/blue) extending AbapSourceMainObject.\n */\n\nimport { AdkMainObject } from '../../../base/model';\nimport {\n Table as TableKind,\n Structure as StructureKind,\n} from '../../../base/kinds';\nimport { getGlobalContext } from '../../../base/global-context';\nimport type { AdkContext } from '../../../base/context';\n\nimport type { TableResponse } from '../../../base/adt';\n\n/**\n * Table/Structure data type - unwrap from blueSource wrapper root element\n */\nexport type TableXml = TableResponse['blueSource'];\n\n/**\n * ADK Table object (database table - TABL/DT)\n */\nexport class AdkTable extends AdkMainObject<typeof TableKind, TableXml> {\n static readonly kind = TableKind;\n readonly kind = AdkTable.kind;\n\n get objectUri(): string {\n return `/sap/bc/adt/ddic/tables/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n /**\n * Get CDS-style table source code from SAP\n * Returns the ABAP source definition (annotations + field definitions)\n */\n async getSource(): Promise<string> {\n return this.lazy('source', async () => {\n return this.ctx.client.adt.ddic.tables.source.main.get(this.name);\n });\n }\n\n /**\n * Get table technical settings (DD09L data)\n * Returns XML from /sap/bc/adt/ddic/db/settings/{name}\n */\n async getSettings(): Promise<string> {\n return this.lazy('settings', async () => {\n return this.ctx.client.adt.ddic.tablesettings.get(this.name);\n });\n }\n\n protected override get wrapperKey() {\n return 'blueSource';\n }\n protected override get crudContract(): any {\n return this.ctx.client.adt.ddic.tables;\n }\n\n static async get(name: string, ctx?: AdkContext): Promise<AdkTable> {\n const context = ctx ?? getGlobalContext();\n return new AdkTable(context, name).load();\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n await AdkTable.get(name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new ABAP database table on SAP.\n */\n static async create(\n name: string,\n description: string,\n packageName: string,\n options?: { transport?: string },\n ctx?: AdkContext,\n ): Promise<AdkTable> {\n const context = ctx ?? getGlobalContext();\n const table = new AdkTable(context, name.toUpperCase());\n table.setData({\n name: name.toUpperCase(),\n type: 'TABL/DT',\n description,\n language: 'EN',\n masterLanguage: 'EN',\n packageRef: {\n name: packageName.toUpperCase(),\n uri: `/sap/bc/adt/packages/${encodeURIComponent(packageName.toUpperCase())}`,\n type: 'DEVC/K',\n },\n } as unknown as TableXml);\n await table.save({ transport: options?.transport, mode: 'create' });\n return table;\n }\n\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n const table = new AdkTable(context, name.toUpperCase());\n await table.crudContract.delete(name.toUpperCase(), {\n ...(options?.transport && { corrNr: options.transport }),\n ...(options?.lockHandle && { lockHandle: options.lockHandle }),\n });\n }\n}\n\n/**\n * ADK Structure object (TABL/DS)\n */\nexport class AdkStructure extends AdkMainObject<\n typeof StructureKind,\n TableXml\n> {\n static readonly kind = StructureKind;\n readonly kind = AdkStructure.kind;\n\n get objectUri(): string {\n return `/sap/bc/adt/ddic/structures/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n /**\n * Get CDS-style structure source code from SAP\n * Returns the ABAP source definition (annotations + field definitions)\n */\n async getSource(): Promise<string> {\n return this.lazy('source', async () => {\n return this.ctx.client.adt.ddic.structures.source.main.get(this.name);\n });\n }\n\n protected override get wrapperKey() {\n return 'blueSource';\n }\n protected override get crudContract(): any {\n return this.ctx.client.adt.ddic.structures;\n }\n\n static async get(name: string, ctx?: AdkContext): Promise<AdkStructure> {\n const context = ctx ?? getGlobalContext();\n return new AdkStructure(context, name).load();\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n await AdkStructure.get(name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new ABAP structure on SAP.\n */\n static async create(\n name: string,\n description: string,\n packageName: string,\n options?: { transport?: string },\n ctx?: AdkContext,\n ): Promise<AdkStructure> {\n const context = ctx ?? getGlobalContext();\n const struct = new AdkStructure(context, name.toUpperCase());\n struct.setData({\n name: name.toUpperCase(),\n type: 'TABL/DS',\n description,\n language: 'EN',\n masterLanguage: 'EN',\n packageRef: {\n name: packageName.toUpperCase(),\n uri: `/sap/bc/adt/packages/${encodeURIComponent(packageName.toUpperCase())}`,\n type: 'DEVC/K',\n },\n } as unknown as TableXml);\n await struct.save({ transport: options?.transport, mode: 'create' });\n return struct;\n }\n\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n const struct = new AdkStructure(context, name.toUpperCase());\n await struct.crudContract.delete(name.toUpperCase(), {\n ...(options?.transport && { corrNr: options.transport }),\n ...(options?.lockHandle && { lockHandle: options.lockHandle }),\n });\n }\n}\n\n// Self-register with ADK registry\nimport { registerObjectType } from '../../../base/registry';\nregisterObjectType('TABL', TableKind, AdkTable, { endpoint: 'ddic/tables' });\nregisterObjectType('TABL/DS', StructureKind, AdkStructure, {\n endpoint: 'ddic/structures',\n});\n","/**\n * TTYP - Table Type\n *\n * ADK object for ABAP Table Types (TTYP).\n * DDIC objects are metadata-only (no source code).\n */\n\nimport { AdkMainObject } from '../../../base/model';\nimport { TableType as TableTypeKind } from '../../../base/kinds';\nimport { getGlobalContext } from '../../../base/global-context';\nimport type { AdkContext } from '../../../base/context';\n\nimport type { TableTypeResponse } from '../../../base/adt';\n\n/**\n * Table Type data type - unwrap from schema root element\n */\nexport type TableTypeXml = TableTypeResponse['tableType'];\n\n/**\n * ADK Table Type object\n *\n * Inherits from AdkMainObject which provides:\n * - name, type, description, version, language, changedBy/At, createdBy/At, links\n * - package, packageRef, responsible, masterLanguage, masterSystem, abapLanguageVersion\n *\n * Table type-specific properties via `data`:\n * - data.rowType (typeName, typeCategory, tableTypeSchemaReference)\n * - data.primaryKey\n * - data.secondaryKeys\n */\nexport class AdkTableType extends AdkMainObject<\n typeof TableTypeKind,\n TableTypeXml\n> {\n static readonly kind = TableTypeKind;\n readonly kind = AdkTableType.kind;\n\n get objectUri(): string {\n return `/sap/bc/adt/ddic/tabletypes/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n protected override get wrapperKey() {\n return 'tableType';\n }\n protected override get crudContract(): any {\n return this.ctx.client.adt.ddic.tabletypes;\n }\n\n static async get(name: string, ctx?: AdkContext): Promise<AdkTableType> {\n const context = ctx ?? getGlobalContext();\n return new AdkTableType(context, name).load();\n }\n}\n\n// Self-register with ADK registry\nimport { registerObjectType } from '../../../base/registry';\nregisterObjectType('TTYP', TableTypeKind, AdkTableType, {\n endpoint: 'ddic/tabletypes',\n});\n","/**\n * DDL - CDS Data Definition Language Source (DDLS)\n *\n * ADK object for ABAP CDS Data Definition sources.\n * These are source-based objects stored at:\n * GET/PUT /sap/bc/adt/ddic/ddl/sources/<name>/source/main\n *\n * The metadata document is at:\n * GET /sap/bc/adt/ddic/ddl/sources/<name>\n *\n * Lock/activate/create follow the same patterns as other source objects.\n */\n\nimport { getGlobalContext } from '../../base/global-context';\nimport type { AdkContext } from '../../base/context';\nimport { toText } from '../../base/fetch-utils';\n\nexport class AdkDdlSource {\n readonly name: string;\n protected readonly ctx: AdkContext;\n\n constructor(ctx: AdkContext, name: string) {\n this.ctx = ctx;\n this.name = name.toUpperCase();\n }\n\n get objectUri(): string {\n return `/sap/bc/adt/ddic/ddl/sources/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n /** Placeholder description — full metadata requires additional SAP fetch */\n get description(): string {\n return this.name;\n }\n\n private get contract(): any {\n return this.ctx.client.adt.ddic.ddl.sources;\n }\n\n // ─── Source ────────────────────────────────────────────────────────────────\n\n async getSource(): Promise<string> {\n const result = await this.contract.source.main.get(this.name);\n return toText(result);\n }\n\n async saveMainSource(\n source: string,\n options?: { lockHandle?: string; transport?: string },\n ): Promise<void> {\n await this.contract.source.main.put(\n this.name,\n {\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n ...(options?.transport ? { corrNr: options.transport } : {}),\n },\n source,\n );\n }\n\n // ─── Lock / Unlock ─────────────────────────────────────────────────────────\n\n async lock(transport?: string): Promise<{ handle: string }> {\n const lockService = this.ctx.lockService;\n if (!lockService) {\n throw new Error(\n 'Lock not available: no lockService in context. Did you call initializeAdk()?',\n );\n }\n return lockService.lock(this.objectUri, {\n transport,\n objectName: this.name,\n objectType: 'DDLS',\n });\n }\n\n async unlock(lockHandle: string): Promise<void> {\n const lockService = this.ctx.lockService;\n if (!lockService) {\n throw new Error(\n 'Unlock not available: no lockService in context. Did you call initializeAdk()?',\n );\n }\n await lockService.unlock(this.objectUri, { lockHandle });\n }\n\n // ─── Activate ──────────────────────────────────────────────────────────────\n\n async activate(): Promise<this> {\n await this.ctx.client.adt.activation.activate.post({}, {\n objectReferences: {\n objectReference: [{ uri: this.objectUri, name: this.name }],\n },\n } as any);\n return this;\n }\n\n // ─── Static Factory Methods ─────────────────────────────────────────────────\n\n /**\n * Get a DDL source (does not fetch metadata, just returns handle)\n */\n static async get(name: string, ctx?: AdkContext): Promise<AdkDdlSource> {\n const context = ctx ?? getGlobalContext();\n const obj = new AdkDdlSource(context, name);\n // Validate it exists by fetching source\n await obj.getSource();\n return obj;\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n await AdkDdlSource.get(name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new CDS DDL source on SAP\n *\n * POST /sap/bc/adt/ddic/ddl/sources?corrNr=...\n * Body matches the `ddl:source` schema (extends abapsource:AbapSourceMainObject).\n */\n static async create(\n name: string,\n description: string,\n packageName: string,\n options?: { transport?: string },\n ctx?: AdkContext,\n ): Promise<AdkDdlSource> {\n const context = ctx ?? getGlobalContext();\n const nameU = name.toUpperCase();\n const pkgU = packageName.toUpperCase();\n\n await context.client.adt.ddic.ddl.sources.post(\n options?.transport ? { corrNr: options.transport } : {},\n {\n source: {\n name: nameU,\n description,\n language: 'EN',\n masterLanguage: 'EN',\n responsible: '$TMP',\n packageRef: {\n name: pkgU,\n type: 'DEVC/K',\n uri: `/sap/bc/adt/packages/${pkgU.toLowerCase()}`,\n },\n },\n } as any,\n );\n\n return new AdkDdlSource(context, nameU);\n }\n\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n await context.client.adt.ddic.ddl.sources.delete(name.toUpperCase(), {\n ...(options?.transport ? { corrNr: options.transport } : {}),\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n });\n }\n}\n","/**\n * DCL - CDS Access Control Definition Language Source (DCLS)\n *\n * ADK object for ABAP CDS Access Control (DCL) sources.\n * These are source-based objects stored at:\n * GET/PUT /sap/bc/adt/acm/dcl/sources/<name>/source/main\n *\n * The metadata document is at:\n * GET /sap/bc/adt/acm/dcl/sources/<name>\n *\n * Lock/activate/create follow the same patterns as DDL sources.\n */\n\nimport { getGlobalContext } from '../../base/global-context';\nimport type { AdkContext } from '../../base/context';\nimport { toText } from '../../base/fetch-utils';\n\nexport class AdkDclSource {\n readonly name: string;\n protected readonly ctx: AdkContext;\n\n constructor(ctx: AdkContext, name: string) {\n this.ctx = ctx;\n this.name = name.toUpperCase();\n }\n\n get objectUri(): string {\n return `/sap/bc/adt/acm/dcl/sources/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n /** Placeholder description — full metadata requires additional SAP fetch */\n get description(): string {\n return this.name;\n }\n\n private get contract(): any {\n return this.ctx.client.adt.ddic.dcl.sources;\n }\n\n // ─── Source ────────────────────────────────────────────────────────────────\n\n async getSource(): Promise<string> {\n const result = await this.contract.source.main.get(this.name);\n return toText(result);\n }\n\n async saveMainSource(\n source: string,\n options?: { lockHandle?: string; transport?: string },\n ): Promise<void> {\n await this.contract.source.main.put(\n this.name,\n {\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n ...(options?.transport ? { corrNr: options.transport } : {}),\n },\n source,\n );\n }\n\n // ─── Lock / Unlock ─────────────────────────────────────────────────────────\n\n async lock(transport?: string): Promise<{ handle: string }> {\n const lockService = this.ctx.lockService;\n if (!lockService) {\n throw new Error(\n 'Lock not available: no lockService in context. Did you call initializeAdk()?',\n );\n }\n return lockService.lock(this.objectUri, {\n transport,\n objectName: this.name,\n objectType: 'DCLS',\n });\n }\n\n async unlock(lockHandle: string): Promise<void> {\n const lockService = this.ctx.lockService;\n if (!lockService) {\n throw new Error(\n 'Unlock not available: no lockService in context. Did you call initializeAdk()?',\n );\n }\n await lockService.unlock(this.objectUri, { lockHandle });\n }\n\n // ─── Activate ──────────────────────────────────────────────────────────────\n\n async activate(): Promise<this> {\n await this.ctx.client.adt.activation.activate.post({}, {\n objectReferences: {\n objectReference: [{ uri: this.objectUri, name: this.name }],\n },\n } as any);\n return this;\n }\n\n // ─── Static Factory Methods ─────────────────────────────────────────────────\n\n static async get(name: string, ctx?: AdkContext): Promise<AdkDclSource> {\n const context = ctx ?? getGlobalContext();\n const obj = new AdkDclSource(context, name);\n await obj.getSource();\n return obj;\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n await AdkDclSource.get(name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new CDS DCL source on SAP\n */\n static async create(\n name: string,\n description: string,\n packageName: string,\n options?: { transport?: string },\n ctx?: AdkContext,\n ): Promise<AdkDclSource> {\n const context = ctx ?? getGlobalContext();\n const nameU = name.toUpperCase();\n const pkgU = packageName.toUpperCase();\n\n await context.client.adt.ddic.dcl.sources.post(\n options?.transport ? { corrNr: options.transport } : {},\n {\n source: {\n name: nameU,\n description,\n language: 'EN',\n masterLanguage: 'EN',\n responsible: '$TMP',\n packageRef: {\n name: pkgU,\n type: 'DEVC/K',\n uri: `/sap/bc/adt/packages/${pkgU.toLowerCase()}`,\n },\n },\n } as any,\n );\n\n return new AdkDclSource(context, nameU);\n }\n\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n await context.client.adt.ddic.dcl.sources.delete(name.toUpperCase(), {\n ...(options?.transport ? { corrNr: options.transport } : {}),\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n });\n }\n}\n","/**\n * BDEF - Behavior Definition (RAP)\n *\n * ADK object for ABAP RAP Behavior Definitions (BDEF).\n * These are source-based objects (`.abdl`) stored at:\n * GET /sap/bc/adt/bo/behaviordefinitions/<name>\n * GET/PUT /sap/bc/adt/bo/behaviordefinitions/<name>/source/main\n *\n * Lock/activate/create follow the same patterns as other source objects\n * (DDL, DCL). The metadata document uses the shared `blue:blueSource`\n * wrapper — same envelope as TABL/STRUCT.\n *\n * This class intentionally mirrors `AdkDdlSource` (lightweight ADK object,\n * not a full AdkMainObject subclass) because BDEF metadata is source-driven\n * and the typical lifecycle is: create skeleton → PUT source → activate.\n */\n\nimport { getGlobalContext } from '../../../base/global-context';\nimport type { AdkContext } from '../../../base/context';\nimport { toText } from '../../../base/fetch-utils';\n\nexport class AdkBehaviorDefinition {\n /** Static ADK kind marker — used by abapGit handler registry if needed. */\n static readonly kind = 'BehaviorDefinition' as const;\n readonly kind = AdkBehaviorDefinition.kind;\n\n readonly name: string;\n protected readonly ctx: AdkContext;\n\n constructor(ctx: AdkContext, name: string) {\n this.ctx = ctx;\n this.name = name.toUpperCase();\n }\n\n get objectUri(): string {\n return `/sap/bc/adt/bo/behaviordefinitions/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n /** Placeholder description — full metadata requires additional SAP fetch */\n get description(): string {\n return this.name;\n }\n\n private get contract(): any {\n return this.ctx.client.adt.bo.behaviordefinitions;\n }\n\n // ─── Source ────────────────────────────────────────────────────────────────\n\n async getSource(): Promise<string> {\n const result = await this.contract.source.main.get(this.name);\n return toText(result);\n }\n\n async saveMainSource(\n source: string,\n options?: { lockHandle?: string; transport?: string },\n ): Promise<void> {\n await this.contract.source.main.put(\n this.name,\n {\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n ...(options?.transport ? { corrNr: options.transport } : {}),\n },\n source,\n );\n }\n\n // ─── Lock / Unlock ─────────────────────────────────────────────────────────\n\n async lock(transport?: string): Promise<{ handle: string }> {\n const lockService = this.ctx.lockService;\n if (!lockService) {\n throw new Error(\n 'Lock not available: no lockService in context. Did you call initializeAdk()?',\n );\n }\n return lockService.lock(this.objectUri, {\n transport,\n objectName: this.name,\n objectType: 'BDEF',\n });\n }\n\n async unlock(lockHandle: string): Promise<void> {\n const lockService = this.ctx.lockService;\n if (!lockService) {\n throw new Error(\n 'Unlock not available: no lockService in context. Did you call initializeAdk()?',\n );\n }\n await lockService.unlock(this.objectUri, { lockHandle });\n }\n\n // ─── Activate ──────────────────────────────────────────────────────────────\n\n async activate(): Promise<this> {\n await this.ctx.client.adt.activation.activate.post({}, {\n objectReferences: {\n objectReference: [{ uri: this.objectUri, name: this.name }],\n },\n } as any);\n return this;\n }\n\n // ─── Static Factory Methods ─────────────────────────────────────────────────\n\n /**\n * Get a BDEF (validates it exists by fetching source).\n */\n static async get(\n name: string,\n ctx?: AdkContext,\n ): Promise<AdkBehaviorDefinition> {\n const context = ctx ?? getGlobalContext();\n const obj = new AdkBehaviorDefinition(context, name);\n // Validate it exists by fetching source\n await obj.getSource();\n return obj;\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n await AdkBehaviorDefinition.get(name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new BDEF on SAP.\n *\n * POST /sap/bc/adt/bo/behaviordefinitions?corrNr=...\n * Body matches the `blue:blueSource` envelope (extends\n * abapsource:AbapSourceMainObject).\n */\n static async create(\n name: string,\n description: string,\n packageName: string,\n options?: { transport?: string },\n ctx?: AdkContext,\n ): Promise<AdkBehaviorDefinition> {\n const context = ctx ?? getGlobalContext();\n const nameU = name.toUpperCase();\n const pkgU = packageName.toUpperCase();\n\n await context.client.adt.bo.behaviordefinitions.post(\n options?.transport ? { corrNr: options.transport } : {},\n {\n blueSource: {\n name: nameU,\n type: 'BDEF/BDO',\n description,\n language: 'EN',\n masterLanguage: 'EN',\n responsible: pkgU,\n packageRef: {\n name: pkgU,\n type: 'DEVC/K',\n uri: `/sap/bc/adt/packages/${pkgU.toLowerCase()}`,\n },\n },\n } as any,\n );\n\n return new AdkBehaviorDefinition(context, nameU);\n }\n\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n await context.client.adt.bo.behaviordefinitions.delete(name.toUpperCase(), {\n ...(options?.transport ? { corrNr: options.transport } : {}),\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n });\n }\n}\n","/**\n * BAdI — Enhancement Implementation (ENHO/XHH) — RAP-era BAdI container.\n *\n * ADK object for ABAP Enhancement Implementations that host BAdI\n * implementations. These live at:\n *\n * GET /sap/bc/adt/enhancements/enhoxhh/<name>\n * PUT /sap/bc/adt/enhancements/enhoxhh/<name>\n * DELETE /sap/bc/adt/enhancements/enhoxhh/<name>\n * GET/PUT /sap/bc/adt/enhancements/enhoxhh/<name>/source/main\n *\n * Mirrors the source-driven pattern used by `AdkBehaviorDefinition`\n * (BDEF): create skeleton → PUT source → activate.\n *\n * sapcli reference: `sap/cli/badi.py` (`_get_enhancement_implementation`).\n */\n\nimport { getGlobalContext } from '../../../base/global-context';\nimport type { AdkContext } from '../../../base/context';\nimport { toText } from '../../../base/fetch-utils';\n\nexport class AdkBadi {\n /** Static ADK kind marker. */\n static readonly kind = 'Badi' as const;\n readonly kind = AdkBadi.kind;\n\n readonly name: string;\n protected readonly ctx: AdkContext;\n\n constructor(ctx: AdkContext, name: string) {\n this.ctx = ctx;\n this.name = name.toUpperCase();\n }\n\n /** ADT URI (lowercase path segment — SAP convention). */\n get objectUri(): string {\n return `/sap/bc/adt/enhancements/enhoxhh/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n /** Placeholder description — real metadata arrives via GET/objectstructure. */\n get description(): string {\n return this.name;\n }\n\n private get contract(): any {\n return this.ctx.client.adt.enhancements.enhoxhh;\n }\n\n // ─── Metadata ──────────────────────────────────────────────────────────────\n\n async getMetadata(): Promise<unknown> {\n return await this.contract.get(this.name);\n }\n\n // ─── Source ────────────────────────────────────────────────────────────────\n\n async getSource(): Promise<string> {\n const result = await this.contract.source.main.get(this.name);\n return toText(result);\n }\n\n async saveMainSource(\n source: string,\n options?: { lockHandle?: string; transport?: string },\n ): Promise<void> {\n await this.contract.source.main.put(\n this.name,\n {\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n ...(options?.transport ? { corrNr: options.transport } : {}),\n },\n source,\n );\n }\n\n // ─── Lock / Unlock ─────────────────────────────────────────────────────────\n\n async lock(transport?: string): Promise<{ handle: string }> {\n const lockService = this.ctx.lockService;\n if (!lockService) {\n throw new Error(\n 'Lock not available: no lockService in context. Did you call initializeAdk()?',\n );\n }\n return lockService.lock(this.objectUri, {\n transport,\n objectName: this.name,\n objectType: 'ENHO',\n });\n }\n\n async unlock(lockHandle: string): Promise<void> {\n const lockService = this.ctx.lockService;\n if (!lockService) {\n throw new Error(\n 'Unlock not available: no lockService in context. Did you call initializeAdk()?',\n );\n }\n await lockService.unlock(this.objectUri, { lockHandle });\n }\n\n // ─── Activate ──────────────────────────────────────────────────────────────\n\n async activate(): Promise<this> {\n await this.ctx.client.adt.activation.activate.post({}, {\n objectReferences: {\n objectReference: [{ uri: this.objectUri, name: this.name }],\n },\n } as any);\n return this;\n }\n\n // ─── Static Factory Methods ────────────────────────────────────────────────\n\n /** Fetch a BAdI / ENHO, validating existence via a metadata GET. */\n static async get(name: string, ctx?: AdkContext): Promise<AdkBadi> {\n const context = ctx ?? getGlobalContext();\n const obj = new AdkBadi(context, name);\n await obj.getMetadata();\n return obj;\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n await AdkBadi.get(name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new Enhancement Implementation (BAdI container).\n *\n * Trial systems typically reject this with HTTP 403 — this is an\n * area that requires elevated authorisation on most SAP installs.\n */\n static async create(\n name: string,\n description: string,\n packageName: string,\n options?: { transport?: string },\n ctx?: AdkContext,\n ): Promise<AdkBadi> {\n const context = ctx ?? getGlobalContext();\n const nameU = name.toUpperCase();\n const pkgU = packageName.toUpperCase();\n\n await context.client.adt.enhancements.enhoxhh.post(\n options?.transport ? { corrNr: options.transport } : {},\n {\n enhancementImplementation: {\n name: nameU,\n type: 'ENHO/XHH',\n description,\n language: 'EN',\n masterLanguage: 'EN',\n responsible: pkgU,\n packageRef: {\n name: pkgU,\n type: 'DEVC/K',\n uri: `/sap/bc/adt/packages/${pkgU.toLowerCase()}`,\n },\n },\n } as any,\n );\n\n return new AdkBadi(context, nameU);\n }\n\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n await context.client.adt.enhancements.enhoxhh.delete(name.toUpperCase(), {\n ...(options?.transport ? { corrNr: options.transport } : {}),\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n });\n }\n}\n","/**\n * SRVD - Service Definition (RAP)\n *\n * ADK object for ABAP RAP Service Definitions (SRVD).\n * Source-based objects (`.asrvd`) stored at:\n * GET /sap/bc/adt/ddic/srvd/sources/<name>\n * GET/PUT /sap/bc/adt/ddic/srvd/sources/<name>/source/main\n *\n * Lock/activate/create follow the same patterns as other source objects\n * (DDL, DCL, BDEF). Metadata envelope is the dedicated `srvd:source`\n * wrapper extending abapsource:AbapSourceMainObject (mirrors DDL).\n */\n\nimport { getGlobalContext } from '../../../base/global-context';\nimport type { AdkContext } from '../../../base/context';\nimport { toText } from '../../../base/fetch-utils';\n\nexport class AdkServiceDefinition {\n /** Static ADK kind marker — used by abapGit handler registry if needed. */\n static readonly kind = 'ServiceDefinition' as const;\n readonly kind = AdkServiceDefinition.kind;\n\n readonly name: string;\n protected readonly ctx: AdkContext;\n\n constructor(ctx: AdkContext, name: string) {\n this.ctx = ctx;\n this.name = name.toUpperCase();\n }\n\n get objectUri(): string {\n return `/sap/bc/adt/ddic/srvd/sources/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n /** Placeholder description — full metadata requires additional SAP fetch */\n get description(): string {\n return this.name;\n }\n\n private get contract(): any {\n return this.ctx.client.adt.ddic.srvd.sources;\n }\n\n // ─── Source ────────────────────────────────────────────────────────────────\n\n async getSource(): Promise<string> {\n const result = await this.contract.source.main.get(this.name);\n return toText(result);\n }\n\n async saveMainSource(\n source: string,\n options?: { lockHandle?: string; transport?: string },\n ): Promise<void> {\n await this.contract.source.main.put(\n this.name,\n {\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n ...(options?.transport ? { corrNr: options.transport } : {}),\n },\n source,\n );\n }\n\n // ─── Lock / Unlock ─────────────────────────────────────────────────────────\n\n async lock(transport?: string): Promise<{ handle: string }> {\n const lockService = this.ctx.lockService;\n if (!lockService) {\n throw new Error(\n 'Lock not available: no lockService in context. Did you call initializeAdk()?',\n );\n }\n return lockService.lock(this.objectUri, {\n transport,\n objectName: this.name,\n objectType: 'SRVD',\n });\n }\n\n async unlock(lockHandle: string): Promise<void> {\n const lockService = this.ctx.lockService;\n if (!lockService) {\n throw new Error(\n 'Unlock not available: no lockService in context. Did you call initializeAdk()?',\n );\n }\n await lockService.unlock(this.objectUri, { lockHandle });\n }\n\n // ─── Activate ──────────────────────────────────────────────────────────────\n\n async activate(): Promise<this> {\n await this.ctx.client.adt.activation.activate.post({}, {\n objectReferences: {\n objectReference: [{ uri: this.objectUri, name: this.name }],\n },\n } as any);\n return this;\n }\n\n // ─── Static Factory Methods ─────────────────────────────────────────────────\n\n /**\n * Get a SRVD (validates it exists by fetching source).\n */\n static async get(\n name: string,\n ctx?: AdkContext,\n ): Promise<AdkServiceDefinition> {\n const context = ctx ?? getGlobalContext();\n const obj = new AdkServiceDefinition(context, name);\n // Validate it exists by fetching source\n await obj.getSource();\n return obj;\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n await AdkServiceDefinition.get(name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new SRVD on SAP.\n *\n * POST /sap/bc/adt/ddic/srvd/sources?corrNr=...\n * Body matches the `srvd:source` envelope (extends\n * abapsource:AbapSourceMainObject).\n */\n static async create(\n name: string,\n description: string,\n packageName: string,\n options?: { transport?: string },\n ctx?: AdkContext,\n ): Promise<AdkServiceDefinition> {\n const context = ctx ?? getGlobalContext();\n const nameU = name.toUpperCase();\n const pkgU = packageName.toUpperCase();\n\n await context.client.adt.ddic.srvd.sources.post(\n options?.transport ? { corrNr: options.transport } : {},\n {\n source: {\n name: nameU,\n type: 'SRVD/SRV',\n description,\n language: 'EN',\n masterLanguage: 'EN',\n responsible: pkgU,\n packageRef: {\n name: pkgU,\n type: 'DEVC/K',\n uri: `/sap/bc/adt/packages/${pkgU.toLowerCase()}`,\n },\n },\n } as any,\n );\n\n return new AdkServiceDefinition(context, nameU);\n }\n\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n await context.client.adt.ddic.srvd.sources.delete(name.toUpperCase(), {\n ...(options?.transport ? { corrNr: options.transport } : {}),\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n });\n }\n}\n","/**\n * SRVB - Service Binding (RAP)\n *\n * ADK object for ABAP RAP Service Bindings (SRVB). Unlike BDEF/SRVD,\n * SRVB is **metadata-only** — there is no source text. The binding\n * XML carries the service + protocol references.\n *\n * GET /sap/bc/adt/businessservices/bindings/<name>\n * POST /sap/bc/adt/businessservices/bindings\n * PUT /sap/bc/adt/businessservices/bindings/<name>\n * DELETE /sap/bc/adt/businessservices/bindings/<name>\n * POST /sap/bc/adt/businessservices/bindings/<name>/publishedstates (publish)\n * DELETE /sap/bc/adt/businessservices/bindings/<name>/publishedstates (unpublish)\n *\n * Lifecycle follows lock/activate patterns from sibling RAP objects.\n */\n\nimport { getGlobalContext } from '../../../base/global-context';\nimport type { AdkContext } from '../../../base/context';\n\nexport class AdkServiceBinding {\n /** Static ADK kind marker — used by abapGit handler registry if needed. */\n static readonly kind = 'ServiceBinding' as const;\n readonly kind = AdkServiceBinding.kind;\n\n readonly name: string;\n protected readonly ctx: AdkContext;\n\n constructor(ctx: AdkContext, name: string) {\n this.ctx = ctx;\n this.name = name.toUpperCase();\n }\n\n get objectUri(): string {\n return `/sap/bc/adt/businessservices/bindings/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n /** Placeholder description — full metadata requires additional SAP fetch */\n get description(): string {\n return this.name;\n }\n\n private get contract(): any {\n return this.ctx.client.adt.businessservices.bindings;\n }\n\n // ─── Metadata (no source) ──────────────────────────────────────────────────\n\n /**\n * Fetch the binding metadata document. SRVB has no source text;\n * `getSource()` returns an empty string for uniform CLI parity.\n */\n async getMetadata(): Promise<unknown> {\n return this.contract.get(this.name);\n }\n\n async getSource(): Promise<string> {\n // Metadata-only object — no source code.\n return '';\n }\n\n // ─── Lock / Unlock ─────────────────────────────────────────────────────────\n\n async lock(transport?: string): Promise<{ handle: string }> {\n const lockService = this.ctx.lockService;\n if (!lockService) {\n throw new Error(\n 'Lock not available: no lockService in context. Did you call initializeAdk()?',\n );\n }\n return lockService.lock(this.objectUri, {\n transport,\n objectName: this.name,\n objectType: 'SRVB',\n });\n }\n\n async unlock(lockHandle: string): Promise<void> {\n const lockService = this.ctx.lockService;\n if (!lockService) {\n throw new Error(\n 'Unlock not available: no lockService in context. Did you call initializeAdk()?',\n );\n }\n await lockService.unlock(this.objectUri, { lockHandle });\n }\n\n // ─── Activate ──────────────────────────────────────────────────────────────\n\n async activate(): Promise<this> {\n await this.ctx.client.adt.activation.activate.post({}, {\n objectReferences: {\n objectReference: [{ uri: this.objectUri, name: this.name }],\n },\n } as any);\n return this;\n }\n\n // ─── Publish / Unpublish ───────────────────────────────────────────────────\n\n /**\n * Publish (activate) the binding in the SAP Gateway.\n * POST {basePath}/{name}/publishedstates\n */\n async publish(): Promise<void> {\n await this.contract.publish(this.name);\n }\n\n /**\n * Unpublish (deactivate) the binding.\n * DELETE {basePath}/{name}/publishedstates\n */\n async unpublish(): Promise<void> {\n await this.contract.unpublish(this.name);\n }\n\n // ─── Static Factory Methods ─────────────────────────────────────────────────\n\n /**\n * Get a SRVB (validates it exists by fetching metadata).\n */\n static async get(name: string, ctx?: AdkContext): Promise<AdkServiceBinding> {\n const context = ctx ?? getGlobalContext();\n const obj = new AdkServiceBinding(context, name);\n await obj.getMetadata();\n return obj;\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n try {\n await AdkServiceBinding.get(name, ctx);\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Create a new SRVB on SAP.\n *\n * POST /sap/bc/adt/businessservices/bindings?corrNr=...\n * Body matches the `srvb:serviceBinding` envelope.\n */\n static async create(\n name: string,\n description: string,\n packageName: string,\n options?: { transport?: string },\n ctx?: AdkContext,\n ): Promise<AdkServiceBinding> {\n const context = ctx ?? getGlobalContext();\n const nameU = name.toUpperCase();\n const pkgU = packageName.toUpperCase();\n\n await context.client.adt.businessservices.bindings.post(\n options?.transport ? { corrNr: options.transport } : {},\n {\n serviceBinding: {\n name: nameU,\n type: 'SRVB/SVB',\n description,\n language: 'EN',\n masterLanguage: 'EN',\n responsible: pkgU,\n packageRef: {\n name: pkgU,\n type: 'DEVC/K',\n uri: `/sap/bc/adt/packages/${pkgU.toLowerCase()}`,\n },\n },\n } as any,\n );\n\n return new AdkServiceBinding(context, nameU);\n }\n\n static async delete(\n name: string,\n options?: { transport?: string; lockHandle?: string },\n ctx?: AdkContext,\n ): Promise<void> {\n const context = ctx ?? getGlobalContext();\n await context.client.adt.businessservices.bindings.delete(\n name.toUpperCase(),\n {\n ...(options?.transport ? { corrNr: options.transport } : {}),\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n },\n );\n }\n\n static async publish(name: string, ctx?: AdkContext): Promise<void> {\n const context = ctx ?? getGlobalContext();\n const obj = new AdkServiceBinding(context, name);\n await obj.publish();\n }\n\n static async unpublish(name: string, ctx?: AdkContext): Promise<void> {\n const context = ctx ?? getGlobalContext();\n const obj = new AdkServiceBinding(context, name);\n await obj.unpublish();\n }\n}\n","/**\n * AdkTransportObject - Transport Object wrapper\n *\n * Lightweight wrapper around schema object data.\n * Objects don't have operations (no release, lock, etc.)\n */\n\nimport type { TransportObjectData } from './transport.types';\n\n/**\n * Transport Object - wrapper for ABAP objects in a transport\n */\nexport class AdkTransportObject {\n constructor(private readonly data: TransportObjectData) {}\n\n get pgmid(): string {\n return this.data.pgmid || '';\n }\n get type(): string {\n return this.data.type || '';\n }\n get name(): string {\n return this.data.name || '';\n }\n get wbtype(): string | undefined {\n return this.data.wbtype;\n }\n get objectInfo(): string | undefined {\n return this.data.obj_info;\n }\n get objectDescription(): string | undefined {\n return this.data.obj_desc;\n }\n get lockStatus(): string | undefined {\n return this.data.lock_status;\n }\n get uri(): string | undefined {\n return this.data.uri;\n }\n\n /** Full object key (PGMID/TYPE/NAME) */\n get key(): string {\n return `${this.pgmid}/${this.type}/${this.name}`;\n }\n\n /** Raw schema data */\n get raw(): TransportObjectData {\n return this.data;\n }\n}\n","/**\n * AdkTransportRequest & AdkTransportTask\n *\n * Simplified 2-layer structure:\n * - AdkTransportRequest: full transport request with tasks, CRUD, etc.\n * - AdkTransportTask: extends request with task-specific overrides\n *\n * Both share the same API response structure, just different data sources.\n * Kept in one file to avoid circular dependency issues.\n *\n * Architecture:\n * - Uses ADT contracts directly via ctx.client.adt.cts.*\n * - No intermediate \"service\" layer - ADK objects ARE the service layer\n * - Raw fetch for operations not covered by contracts (create, release, lock)\n */\n\nimport type { AdkContext } from '../../../base/context';\nimport { getGlobalContext } from '../../../base/global-context';\nimport { AdkObject } from '../../../base/model';\nimport { TransportRequest as TransportRequestKind } from '../../../base/kinds';\nimport { requiresLock, parseSapTimestamp } from '../../../decorators';\nimport type {\n TransportData,\n TransportRequestData,\n TransportTaskData,\n TransportObjectData,\n TransportCreateOptions,\n TransportUpdateOptions,\n ReleaseResult,\n} from './transport.types';\nimport { AdkTransportObject } from './transport-object';\n\n// =============================================================================\n// Helpers\n// =============================================================================\n\nconst STATUS_TEXT: Record<string, string> = {\n D: 'Modifiable',\n R: 'Released',\n N: 'Not released',\n};\n\nfunction asArray<T>(val: T | T[] | undefined): T[] {\n if (!val) return [];\n return Array.isArray(val) ? val : [val];\n}\n\n// =============================================================================\n// Config Cache (module-level for efficiency)\n// =============================================================================\n\nlet cachedConfigUri: string | undefined;\n\nasync function getConfigUri(ctx: AdkContext): Promise<string> {\n if (cachedConfigUri) return cachedConfigUri;\n\n const response =\n await ctx.client.adt.cts.transportrequests.searchconfiguration.configurations.get();\n const configs = response?.configurations;\n if (!configs) throw new Error('No search configuration found');\n\n const configArray = Array.isArray(configs) ? configs : [configs];\n if (configArray.length === 0)\n throw new Error('No search configuration found');\n\n const uri = configArray[0]?.link?.href;\n if (!uri) throw new Error('No search configuration URI found');\n\n cachedConfigUri = uri;\n return uri;\n}\n\n/** Clear config cache (for testing) */\nexport function clearConfigCache(): void {\n cachedConfigUri = undefined;\n}\n\n// =============================================================================\n// Response Normalization Helpers\n// =============================================================================\n\ninterface RawRequest {\n number?: string;\n owner?: string;\n desc?: string;\n status?: string;\n uri?: string;\n task?: unknown;\n abap_object?: unknown;\n}\n\n/**\n * Collect all requests from the transport response structure\n * The schema has requests in multiple places:\n * - workbench.modifiable.request[]\n * - workbench.relstarted.request[]\n * - workbench.released.request[]\n * - workbench.target[].modifiable.request[]\n * - customizing.* (same structure)\n */\nfunction collectAllRequests(result: unknown): RawRequest[] {\n const requests: RawRequest[] = [];\n\n if (!result || typeof result !== 'object') return requests;\n\n const data = result as Record<string, unknown>;\n\n // Helper to extract requests from a container (modifiable, relstarted, released)\n const extractFromContainer = (container: unknown) => {\n if (!container || typeof container !== 'object') return;\n const c = container as Record<string, unknown>;\n const reqs = c.request;\n if (reqs) {\n const reqArray = Array.isArray(reqs) ? reqs : [reqs];\n requests.push(...(reqArray as RawRequest[]));\n }\n };\n\n // Helper to process workbench or customizing section\n const processSection = (section: unknown) => {\n if (!section || typeof section !== 'object') return;\n const s = section as Record<string, unknown>;\n\n // Direct containers\n extractFromContainer(s.modifiable);\n extractFromContainer(s.relstarted);\n extractFromContainer(s.released);\n\n // Target-specific containers\n const targets = s.target;\n if (targets) {\n const targetArray = Array.isArray(targets) ? targets : [targets];\n for (const target of targetArray) {\n if (target && typeof target === 'object') {\n const t = target as Record<string, unknown>;\n extractFromContainer(t.modifiable);\n extractFromContainer(t.relstarted);\n extractFromContainer(t.released);\n }\n }\n }\n };\n\n processSection(data.workbench);\n processSection(data.customizing);\n\n return requests;\n}\n\n// =============================================================================\n// Internal Data Type\n// =============================================================================\n\ninterface TransportObjectDataInternal {\n name: string;\n type: string;\n response: TransportData;\n}\n\n// =============================================================================\n// AdkTransportRequest\n// =============================================================================\n\n/**\n * Transport Request - main transport object\n *\n * Handles both requests (K) and can be extended for tasks (T).\n * Uses ADT contracts directly - no intermediate service layer.\n */\nexport class AdkTransportRequest extends AdkObject<\n typeof TransportRequestKind,\n TransportObjectDataInternal\n> {\n readonly kind = TransportRequestKind;\n protected _tasks?: AdkTransportTask[];\n protected _objects?: AdkTransportObject[];\n\n constructor(ctx: AdkContext, dataOrNumber: TransportData | string) {\n if (typeof dataOrNumber === 'string') {\n super(ctx, dataOrNumber);\n } else {\n super(ctx, {\n name: dataOrNumber.name || dataOrNumber.request?.number || '',\n type: dataOrNumber.object_type === 'T' ? 'RQTQ' : 'RQRQ',\n response: dataOrNumber,\n });\n }\n }\n\n // ===========================================================================\n // Response Access\n // ===========================================================================\n\n protected get response(): TransportData {\n return this.dataSync.response;\n }\n\n /** The item's data - override in subclass for different source */\n protected get itemData(): TransportRequestData {\n return this.response.request || ({} as TransportRequestData);\n }\n\n get objectUri(): string {\n return `/sap/bc/adt/cts/transportrequests/${this.name}`;\n }\n\n override async load(): Promise<this> {\n const rawResponse = await this.ctx.client.adt.cts.transportrequests.get(\n this.name,\n );\n // Unwrap the root element from the response\n const response = rawResponse.root;\n this.setData({\n name: this.name,\n type: response.object_type === 'T' ? 'RQTQ' : 'RQRQ',\n response,\n });\n return this;\n }\n\n // Note: save() not supported - no crudContract defined\n // Transport requests are managed via CTS APIs (release, import, etc.)\n\n // ===========================================================================\n // Properties (shared by request and task)\n // ===========================================================================\n\n get itemType(): 'request' | 'task' {\n return this.response.object_type === 'T' ? 'task' : 'request';\n }\n\n get number(): string {\n return this.name;\n }\n get owner(): string {\n return this.itemData.owner || '';\n }\n override get description(): string {\n return this.itemData.desc || '';\n }\n get status(): string {\n return this.itemData.status || 'D';\n }\n get statusText(): string {\n return this.itemData.status_text || STATUS_TEXT[this.status] || this.status;\n }\n get target(): string {\n return this.itemData.target || '';\n }\n get targetDescription(): string {\n return this.itemData.target_desc || '';\n }\n get uri(): string {\n return this.itemData.uri || this.objectUri;\n }\n get parent(): string {\n return this.itemData.parent || '';\n }\n\n get lastChangedAt(): Date | undefined {\n return parseSapTimestamp(this.itemData.lastchanged_timestamp);\n }\n\n // ===========================================================================\n // Composition: Tasks (request only)\n // ===========================================================================\n\n /** Tasks belonging to this transport request */\n get tasks(): AdkTransportTask[] {\n if (!this._tasks) {\n const taskData = this.itemData.task;\n this._tasks = asArray(taskData).map((t) => {\n // Build response for task\n const { request, task: _existingTasks, ...rootProps } = this.response;\n const { task: _nestedTasks, ...requestWithoutTasks } = request || {};\n\n const taskResponse: TransportData = {\n ...rootProps,\n object_type: 'T',\n name: t.number || '',\n request: request\n ? (requestWithoutTasks as typeof request)\n : undefined,\n task: [t],\n };\n return new AdkTransportTask(this.ctx, taskResponse, this);\n });\n }\n return this._tasks;\n }\n\n // ===========================================================================\n // Composition: Objects\n // ===========================================================================\n\n /**\n * All objects in this request (aggregated from tasks)\n * Override in AdkTransportTask for direct objects\n */\n get objects(): AdkTransportObject[] {\n if (!this._objects) {\n // Direct objects in request\n const directObjects = asArray(this.itemData.abap_object).map(\n (o) => new AdkTransportObject(o),\n );\n // Objects from tasks\n const taskObjects = this.tasks.flatMap((t) => t.objects);\n this._objects = [...directObjects, ...taskObjects];\n }\n return this._objects;\n }\n\n // ===========================================================================\n // Actions\n // ===========================================================================\n\n async release(): Promise<ReleaseResult> {\n try {\n await this.ctx.client.adt.cts.transportrequests.useraction.release(\n this.number,\n { root: { useraction: 'release' } },\n );\n\n (this.itemData as { status?: string; status_text?: string }).status = 'R';\n (this.itemData as { status?: string; status_text?: string }).status_text =\n 'Released';\n return { success: true };\n } catch (error) {\n return {\n success: false,\n message: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n async releaseAll(): Promise<ReleaseResult> {\n for (const task of this.tasks) {\n if (task.status !== 'R') {\n const result = await task.release();\n if (!result.success) {\n return {\n success: false,\n message: `Failed to release task ${task.number}: ${result.message}`,\n };\n }\n }\n }\n return this.release();\n }\n\n // ===========================================================================\n // CRUD Operations (request only)\n // ===========================================================================\n\n @requiresLock()\n async update(changes: TransportUpdateOptions): Promise<void> {\n await this.ctx.client.adt.cts.transportrequests.put(this.number, {\n desc: changes.description ?? this.description,\n target: changes.target ?? this.target,\n } as Parameters<typeof this.ctx.client.adt.cts.transportrequests.put>[1]);\n\n if (changes.description !== undefined) {\n (this.itemData as { desc?: string }).desc = changes.description;\n }\n if (changes.target !== undefined) {\n (this.itemData as { target?: string }).target = changes.target;\n }\n }\n\n async delete(): Promise<void> {\n await this.ctx.client.adt.cts.transportrequests.delete(this.number);\n }\n\n /**\n * Reassign ownership of this transport (and optionally all tasks) to a new user.\n *\n * @param newOwner - SAP username to become the new owner\n * @param recursive - When true, also reassign all modifiable tasks\n */\n async reassign(newOwner: string, recursive = false): Promise<void> {\n await this.ctx.client.adt.cts.transportrequests.useraction.reassign(\n this.number,\n { targetUser: newOwner, recursive },\n {\n root: {\n useraction: 'changeowner',\n targetuser: newOwner,\n },\n },\n );\n\n (this.itemData as { owner?: string }).owner = newOwner;\n\n if (recursive) {\n for (const task of this.tasks) {\n if (task.status !== 'R') {\n await task.reassign(newOwner);\n }\n }\n }\n }\n\n // ===========================================================================\n // Static Factory\n // ===========================================================================\n\n /**\n * Create a new transport request\n *\n * @param options - Transport creation options\n * @param ctx - Optional ADK context (uses global context if not provided)\n */\n static async create(\n options: TransportCreateOptions,\n ctx?: AdkContext,\n ): Promise<AdkTransportRequest> {\n const context = ctx ?? getGlobalContext();\n\n // Get owner - use provided or auto-detect from system\n let owner = options.owner;\n if (!owner) {\n owner = await AdkTransportRequest.getCurrentUser(context);\n }\n\n const response =\n await context.client.adt.cts.transportrequests.useraction.create(\n {\n description: options.description,\n type: options.type,\n target: options.target,\n project: options.project,\n owner,\n },\n {\n root: {\n useraction: 'newrequest',\n request: {\n desc: options.description,\n type: options.type || 'K',\n target: options.target || 'LOCAL',\n cts_project: options.project || '',\n task: [{ owner }],\n },\n },\n },\n );\n\n // Parse response - extract transport number.\n // SAP returns the new transport in root.request.number (preferred) or root.name.\n const number =\n response?.root?.request?.number ?? response?.root?.name ?? undefined;\n if (!number)\n throw new Error('Failed to create transport - no number returned');\n\n return AdkTransportRequest.get(number, context);\n }\n\n /**\n * Get a transport request by number\n *\n * @param number - Transport number (e.g., 'S0DK900001')\n * @param ctx - Optional ADK context (uses global context if not provided)\n */\n static async get(\n number: string,\n ctx?: AdkContext,\n ): Promise<AdkTransportRequest> {\n const context = ctx ?? getGlobalContext();\n const rawResponse =\n await context.client.adt.cts.transportrequests.get(number);\n // Unwrap the root element from the response\n const response = rawResponse.root;\n // Return task or request based on object_type\n if (response.object_type === 'T') {\n return new AdkTransportTask(context, response);\n }\n return new AdkTransportRequest(context, response);\n }\n\n /**\n * List all transports for the current user\n *\n * @param ctx - Optional ADK context (uses global context if not provided)\n */\n static async list(ctx?: AdkContext): Promise<AdkTransportRequest[]> {\n const context = ctx ?? getGlobalContext();\n const configUri = await getConfigUri(context);\n\n const response = await context.client.adt.cts.transportrequests.list({\n targets: 'true',\n configUri: configUri,\n });\n\n const requests = collectAllRequests(response);\n // Wrap raw request data in TransportData structure expected by constructor\n return requests.map(\n (r) =>\n new AdkTransportRequest(context, {\n name: r.number || '',\n object_type: 'K',\n request: {\n number: r.number,\n owner: r.owner,\n desc: r.desc,\n status: r.status,\n uri: r.uri,\n task: r.task as TransportTaskData | TransportTaskData[] | undefined,\n abap_object: r.abap_object as\n | TransportObjectData\n | TransportObjectData[]\n | undefined,\n },\n } as TransportData),\n );\n }\n\n /**\n * Get current user from the system metadata\n *\n * @param ctx - Optional ADK context (uses global context if not provided)\n */\n static async getCurrentUser(ctx?: AdkContext): Promise<string> {\n const context = ctx ?? getGlobalContext();\n\n const response =\n await context.client.adt.cts.transportrequests.searchconfiguration.metadata.get();\n\n const properties = response?.configuration?.properties?.property ?? [];\n const userProp = properties.find((p: { key?: string }) => p.key === 'User');\n const user = userProp?.$value?.trim();\n if (user) {\n return user;\n }\n\n throw new Error('Could not detect current user from metadata response');\n }\n\n // ===========================================================================\n // Lock Operations — inherited from base class via ctx.lockService.\n // Transport objectUri is /sap/bc/adt/cts/transportrequests/{number}\n // which the lock service uses directly.\n // ===========================================================================\n}\n\n// =============================================================================\n// AdkTransportTask\n// =============================================================================\n\n/**\n * Transport Task - child of a transport request\n *\n * Minimal overrides:\n * - itemData: from response.task instead of response.request\n * - objects: direct from task, not aggregated\n * - request: parent reference\n * - No tasks, no CRUD\n */\nexport class AdkTransportTask extends AdkTransportRequest {\n private _parentRequest?: AdkTransportRequest;\n private readonly parentRef?: AdkTransportRequest;\n\n constructor(\n ctx: AdkContext,\n dataOrNumber: TransportData | string,\n parentRef?: AdkTransportRequest,\n ) {\n super(ctx, dataOrNumber);\n this.parentRef = parentRef;\n }\n\n // ===========================================================================\n // Override: itemData from task element\n // ===========================================================================\n\n protected override get itemData(): TransportRequestData {\n const rootTask = this.response.task;\n if (rootTask) {\n const taskArr = Array.isArray(rootTask) ? rootTask : [rootTask];\n const found = taskArr.find((t) => t.number === this.name) || taskArr[0];\n if (found) return found as unknown as TransportRequestData;\n }\n return this.response.request || ({} as TransportRequestData);\n }\n\n // ===========================================================================\n // Override: No tasks\n // ===========================================================================\n\n override get tasks(): AdkTransportTask[] {\n return []; // Tasks don't have sub-tasks\n }\n\n // ===========================================================================\n // Override: Direct objects (not aggregated)\n // ===========================================================================\n\n override get objects(): AdkTransportObject[] {\n if (!this._objects) {\n const taskData = this.itemData as unknown as TransportTaskData;\n this._objects = asArray(taskData?.abap_object).map(\n (o) => new AdkTransportObject(o),\n );\n }\n return this._objects;\n }\n\n // ===========================================================================\n // Task-specific: Parent reference\n // ===========================================================================\n\n /** Parent transport request */\n get request(): AdkTransportRequest {\n if (this.parentRef) return this.parentRef;\n\n if (!this._parentRequest) {\n // Parent request number comes from response.request.number or task's parent attribute\n const parentNumber = this.response.request?.number || this.parent;\n this._parentRequest = new AdkTransportRequest(this.ctx, {\n ...this.response,\n name: parentNumber,\n object_type: 'K',\n });\n }\n return this._parentRequest;\n }\n\n // ===========================================================================\n // Static Factory\n // ===========================================================================\n\n /**\n * Get a transport task by number\n *\n * @param number - Task number (e.g., 'S0DK900001')\n * @param ctx - Optional ADK context (uses global context if not provided)\n */\n static override async get(\n number: string,\n ctx?: AdkContext,\n ): Promise<AdkTransportTask> {\n const context = ctx ?? getGlobalContext();\n const rawResponse =\n await context.client.adt.cts.transportrequests.get(number);\n // Unwrap the root element from the response\n return new AdkTransportTask(context, rawResponse.root);\n }\n}\n","/**\n * AdkTransport - Simplified transport for import operations\n *\n * Focused on the import use case:\n * - Get transport by number\n * - Iterate objects\n * - Load each object as proper ADK type\n *\n * Architecture:\n * - Uses ADT contracts via ctx.client.adt.cts.transportrequests.get()\n * - No business logic beyond object iteration\n * - Object loading delegated to ADK registry\n */\n\nimport type { AdkContext } from '../../base/context';\nimport { getGlobalContext } from '../../base/global-context';\nimport type { TransportGetResponse } from '../../base/adt';\nimport type { TransportData } from './transport/transport.types';\n\n// Types from the transport schema\n// These match the structure in transportmanagment-single.types.ts\ninterface TransportObjectData {\n pgmid?: string;\n type?: string;\n name?: string;\n wbtype?: string;\n uri?: string;\n obj_desc?: string;\n obj_info?: string;\n lock_status?: string;\n /** Object function code (e.g. 'D' = deletion, 'K' = key, '' = modification) */\n obj_func?: string;\n}\n\n/**\n * Selector for filtering transport objects.\n *\n * All specified dimensions are ANDed together.\n * Use '*' for a wildcard that matches any non-empty value.\n */\nexport interface TransportObjectSelector {\n /**\n * Filter by object function code.\n * 'D' = deletion only, 'K' = key only, '*' = any non-empty value, '' = empty (normal)\n */\n objFunc?: string | string[];\n /**\n * Filter by program ID.\n * 'R3TR' = repository objects, 'LIMU' = sub-objects, '*' = any\n */\n pgmid?: string | string[];\n /**\n * Filter by object type (e.g. 'CLAS', 'TABL', '*' = any)\n */\n type?: string | string[];\n}\n\ninterface TransportTaskData {\n number?: string;\n owner?: string;\n desc?: string;\n status?: string;\n status_text?: string;\n abap_object?: TransportObjectData | TransportObjectData[];\n}\n\n// Re-export the response type for consumers\nexport type { TransportGetResponse as TransportResponse };\n\n/**\n * Helper to normalize array/single value to array\n */\nfunction asArray<T>(val: T | T[] | undefined): T[] {\n if (!val) return [];\n return Array.isArray(val) ? val : [val];\n}\n\n/**\n * Check if a value matches a selector dimension.\n *\n * - If `expected` is undefined → no filter (always matches).\n * - If `expected` is '*' → matches any truthy value.\n * - If `expected` is an array → value must be in the array.\n * - Otherwise exact match (case-insensitive).\n */\nfunction matchesDimension(\n value: string,\n expected: string | string[] | undefined,\n): boolean {\n if (expected === undefined) return true;\n if (Array.isArray(expected)) {\n return expected.some((e) =>\n e === '*' ? !!value : e.toUpperCase() === value.toUpperCase(),\n );\n }\n if (expected === '*') return !!value;\n return expected.toUpperCase() === value.toUpperCase();\n}\n\n/**\n * Check if an object ref matches all dimensions of a {@link TransportObjectSelector}.\n *\n * Exported so that consumers (e.g. import service) can reuse the same logic\n * without duplicating it.\n */\nexport function matchesSelector(\n obj: AdkTransportObjectRef,\n selector: TransportObjectSelector,\n): boolean {\n return (\n matchesDimension(obj.objFunc, selector.objFunc) &&\n matchesDimension(obj.pgmid, selector.pgmid) &&\n matchesDimension(obj.type, selector.type)\n );\n}\n\n/**\n * Transport object reference - lightweight wrapper\n *\n * Contains metadata about an object in the transport.\n * Call load() to get the full ADK object.\n */\nexport class AdkTransportObjectRef {\n constructor(\n private readonly ctx: AdkContext,\n private readonly data: TransportObjectData,\n ) {}\n\n /** Program ID (R3TR, LIMU, etc.) */\n get pgmid(): string {\n return this.data.pgmid ?? '';\n }\n\n /** Object type (CLAS, INTF, DOMA, etc.) */\n get type(): string {\n return this.data.type ?? '';\n }\n\n /** Object name */\n get name(): string {\n return this.data.name ?? '';\n }\n\n /** Workbench type (more specific type) */\n get wbtype(): string | undefined {\n return this.data.wbtype;\n }\n\n /** Object URI for direct access */\n get uri(): string | undefined {\n return this.data.uri;\n }\n\n /** Object description */\n get description(): string | undefined {\n return this.data.obj_desc;\n }\n\n /**\n * Object function code (SAP OBJFUNC).\n * 'D' = marked for deletion, 'K' = key entry, '' = regular modification.\n */\n get objFunc(): string {\n return this.data.obj_func ?? '';\n }\n\n /** Whether this object is marked for deletion (obj_func === 'D') */\n get isDeleted(): boolean {\n return this.data.obj_func === 'D';\n }\n\n /** Full object key (PGMID/TYPE/NAME) */\n get key(): string {\n return `${this.pgmid}/${this.type}/${this.name}`;\n }\n\n /**\n * Load the full ADK object\n *\n * Uses the ADK factory to create the appropriate object type\n * (AdkClass, AdkInterface, AdkPackage, etc.)\n *\n * @returns The loaded ADK object, or undefined if type not supported\n */\n async load(): Promise<unknown> {\n // Import dynamically to avoid circular dependency\n const { createAdk } = await import('../../factory');\n const adk = createAdk(this.ctx.client);\n\n // Use the factory to get the object\n // The factory handles type resolution and loading\n try {\n const obj = adk.get(this.name, this.type);\n // Check if object has load method (AdkGenericObject doesn't)\n if ('load' in obj && typeof obj.load === 'function') {\n await obj.load();\n }\n return obj;\n } catch {\n // Type not supported or object not found\n return undefined;\n }\n }\n\n /** Raw data from API */\n get raw(): TransportObjectData {\n return this.data;\n }\n}\n\n/**\n * Transport task reference\n */\nexport class AdkTransportTaskRef {\n constructor(\n private readonly ctx: AdkContext,\n private readonly data: TransportTaskData,\n ) {}\n\n get number(): string {\n return this.data.number ?? '';\n }\n get owner(): string {\n return this.data.owner ?? '';\n }\n get description(): string {\n return this.data.desc ?? '';\n }\n get status(): string {\n return this.data.status ?? '';\n }\n get statusText(): string {\n return this.data.status_text ?? '';\n }\n\n /** Objects in this task */\n get objects(): AdkTransportObjectRef[] {\n return asArray(this.data.abap_object).map(\n (obj) => new AdkTransportObjectRef(this.ctx, obj),\n );\n }\n}\n\n/**\n * AdkTransport - Transport request for import operations\n *\n * Simple, focused API for importing transport objects:\n *\n * @example\n * ```typescript\n * const transport = await AdkTransport.get('DEVK900001');\n *\n * for (const objRef of transport.objects) {\n * console.log(`${objRef.type} ${objRef.name}`);\n * const adkObject = await objRef.load();\n * if (adkObject) {\n * // Serialize with plugin\n * await plugin.serialize(adkObject);\n * }\n * }\n * ```\n */\nexport class AdkTransport {\n private _objects?: AdkTransportObjectRef[];\n private _tasks?: AdkTransportTaskRef[];\n\n private constructor(\n private readonly ctx: AdkContext,\n private readonly data: TransportData,\n ) {}\n\n // ===========================================================================\n // Properties\n // ===========================================================================\n\n /** Transport number */\n get number(): string {\n return this.data.name ?? this.data.request?.number ?? '';\n }\n\n /** Transport description */\n get description(): string {\n return this.data.request?.desc ?? '';\n }\n\n /** Transport owner */\n get owner(): string {\n return this.data.request?.owner ?? '';\n }\n\n /** Transport status (D=Modifiable, R=Released) */\n get status(): string {\n return this.data.request?.status ?? '';\n }\n\n /** Transport status text */\n get statusText(): string {\n return this.data.request?.status_text ?? '';\n }\n\n /** Transport target system */\n get target(): string {\n return this.data.request?.target ?? '';\n }\n\n /** Object type (K=Request, T=Task) */\n get objectType(): string {\n return this.data.object_type ?? 'K';\n }\n\n // ===========================================================================\n // Tasks\n // ===========================================================================\n\n /** Tasks belonging to this transport */\n get tasks(): AdkTransportTaskRef[] {\n if (!this._tasks) {\n const requestTasks = asArray(this.data.request?.task);\n const rootTasks = asArray(this.data.task);\n const allTasks = [...requestTasks, ...rootTasks];\n this._tasks = allTasks.map((t) => new AdkTransportTaskRef(this.ctx, t));\n }\n return this._tasks;\n }\n\n // ===========================================================================\n // Objects - Aggregated from all sources\n // ===========================================================================\n\n /**\n * All objects in this transport\n *\n * Collects objects from:\n * - Direct objects on request\n * - Objects from all tasks\n * - all_objects container (if present)\n */\n get objects(): AdkTransportObjectRef[] {\n if (!this._objects) {\n this._objects = this.collectObjects();\n }\n return this._objects;\n }\n\n private collectObjects(): AdkTransportObjectRef[] {\n const objects: AdkTransportObjectRef[] = [];\n const seen = new Set<string>();\n\n const addObject = (obj: TransportObjectData) => {\n const key = `${obj.pgmid}/${obj.type}/${obj.name}`;\n if (!seen.has(key)) {\n seen.add(key);\n objects.push(new AdkTransportObjectRef(this.ctx, obj));\n }\n };\n\n // Direct objects on request\n for (const obj of asArray(this.data.request?.abap_object)) {\n addObject(obj);\n }\n\n // Objects from all_objects container\n for (const obj of asArray(this.data.request?.all_objects?.abap_object)) {\n addObject(obj);\n }\n\n // Objects from tasks (both request.task and root task)\n for (const task of this.tasks) {\n for (const objRef of task.objects) {\n addObject(objRef.raw);\n }\n }\n\n return objects;\n }\n\n // ===========================================================================\n // Filtering helpers\n // ===========================================================================\n\n /**\n * Get objects filtered by type\n *\n * @param types - Object types to include (e.g., ['CLAS', 'INTF'])\n */\n getObjectsByType(...types: string[]): AdkTransportObjectRef[] {\n const typeSet = new Set(types.map((t) => t.toUpperCase()));\n return this.objects.filter((obj) => typeSet.has(obj.type.toUpperCase()));\n }\n\n /**\n * Get objects filtered by a {@link TransportObjectSelector}.\n *\n * All dimensions specified in the selector are ANDed together.\n *\n * @example\n * ```typescript\n * // Get only deletion objects with pgmid=R3TR\n * const deleted = transport.getObjectsBySelector({ objFunc: 'D', pgmid: 'R3TR' });\n * ```\n */\n getObjectsBySelector(\n selector: TransportObjectSelector,\n ): AdkTransportObjectRef[] {\n return this.objects.filter((obj) => matchesSelector(obj, selector));\n }\n\n /**\n * Convenience accessor for objects marked for deletion (obj_func === 'D').\n *\n * Equivalent to `getObjectsBySelector({ objFunc: 'D' })`.\n */\n get deletionObjects(): AdkTransportObjectRef[] {\n return this.getObjectsBySelector({ objFunc: 'D' });\n }\n\n /**\n * Get unique object types in this transport\n */\n getObjectTypes(): string[] {\n const types = new Set(this.objects.map((obj) => obj.type));\n return Array.from(types).sort();\n }\n\n /**\n * Get object count by type\n */\n getObjectCountByType(): Record<string, number> {\n const counts: Record<string, number> = {};\n for (const obj of this.objects) {\n counts[obj.type] = (counts[obj.type] || 0) + 1;\n }\n return counts;\n }\n\n // ===========================================================================\n // Raw data access\n // ===========================================================================\n\n /** Raw API response (unwrapped) */\n get raw(): TransportData {\n return this.data;\n }\n\n // ===========================================================================\n // Static Factory\n // ===========================================================================\n\n /**\n * Get a transport by number\n *\n * @param number - Transport number (e.g., 'DEVK900001')\n * @param ctx - Optional ADK context (uses global context if not provided)\n *\n * @example\n * ```typescript\n * const transport = await AdkTransport.get('DEVK900001');\n * console.log(`${transport.description} - ${transport.objects.length} objects`);\n * ```\n */\n static async get(number: string, ctx?: AdkContext): Promise<AdkTransport> {\n const context = ctx ?? getGlobalContext();\n const response = await context.client.adt.cts.transportrequests.get(number);\n // Unwrap the root element from the response\n return new AdkTransport(context, response.root);\n }\n\n /**\n * Load multiple transports and merge their objects into a single view.\n *\n * De-duplication key is `pgmid/type/name`. When the same key appears in\n * multiple transports the **first** occurrence wins (first transport in the\n * `numbers` array). The source transport number is available via\n * `AdkTransportObjectRef.sourceTransport`.\n *\n * @param numbers - Transport numbers to load and merge\n * @param ctx - Optional ADK context\n *\n * @example\n * ```typescript\n * const merged = await AdkTransport.merge(['DEVK900001', 'DEVK900002']);\n * const deletions = merged.getObjectsBySelector({ objFunc: 'D' });\n * ```\n */\n static async merge(\n numbers: string[],\n ctx?: AdkContext,\n ): Promise<MergedTransportView> {\n const transports = await Promise.all(\n numbers.map((n) => AdkTransport.get(n, ctx)),\n );\n return new MergedTransportView(transports);\n }\n}\n\n/**\n * Result of resolving transport objects (single or multi-TR).\n *\n * Returned by {@link resolveTransportObjects}.\n */\nexport interface ResolvedTransportObjects {\n /** Deduplicated list of transport objects (first-win across TRs). */\n objects: AdkTransportObjectRef[];\n /** Maps each object key to the TR number it was sourced from. */\n sourceTransportMap: Map<string, string>;\n}\n\nfunction getFilteredObjects(\n transport: AdkTransport,\n selector: TransportObjectSelector,\n): AdkTransportObjectRef[] {\n return Object.keys(selector).length > 0\n ? transport.getObjectsBySelector(selector)\n : transport.objects;\n}\n\nfunction addResolvedObject(\n object: AdkTransportObjectRef,\n sourceTransport: string,\n objects: AdkTransportObjectRef[],\n sourceTransportMap: Map<string, string>,\n seenKeys?: Set<string>,\n): void {\n if (seenKeys && seenKeys.has(object.key)) return;\n if (seenKeys) seenKeys.add(object.key);\n objects.push(object);\n sourceTransportMap.set(object.key, sourceTransport);\n}\n\n/**\n * Load and resolve objects from one or more transport numbers, with optional\n * selector-based filtering and deduplication across TRs.\n *\n * This is the shared logic used by both the CLI `cts tr objects` command and\n * the MCP `cts_transport_objects` tool — extracted here to avoid duplication.\n *\n * @param transportNumbers - Ordered list of TR numbers (first-win deduplication).\n * @param selector - Optional dimension filter (objFunc, pgmid, type).\n * @param ctx - Optional ADK context (uses global context if omitted).\n */\nexport async function resolveTransportObjects(\n transportNumbers: string[],\n selector: TransportObjectSelector,\n ctx?: AdkContext,\n): Promise<ResolvedTransportObjects> {\n const objects: AdkTransportObjectRef[] = [];\n const sourceTransportMap = new Map<string, string>();\n\n if (transportNumbers.length === 1) {\n const primaryNumber = transportNumbers[0] ?? '';\n const tr = await AdkTransport.get(primaryNumber, ctx);\n for (const object of getFilteredObjects(tr, selector)) {\n addResolvedObject(object, primaryNumber, objects, sourceTransportMap);\n }\n } else {\n const transports = await Promise.all(\n transportNumbers.map((n) => AdkTransport.get(n, ctx)),\n );\n const seen = new Set<string>();\n for (const tr of transports) {\n for (const object of getFilteredObjects(tr, selector)) {\n addResolvedObject(object, tr.number, objects, sourceTransportMap, seen);\n }\n }\n }\n\n return { objects, sourceTransportMap };\n}\n\n/**\n * Merged view of objects from multiple transports.\n *\n * De-duplicates by `pgmid/type/name`; first occurrence wins.\n */\nexport class MergedTransportView {\n private readonly _objects: AdkTransportObjectRef[];\n readonly transports: AdkTransport[];\n\n constructor(transports: AdkTransport[]) {\n this.transports = transports;\n const seen = new Set<string>();\n const all: AdkTransportObjectRef[] = [];\n for (const tr of transports) {\n for (const obj of tr.objects) {\n if (!seen.has(obj.key)) {\n seen.add(obj.key);\n all.push(obj);\n }\n }\n }\n this._objects = all;\n }\n\n /** All objects across transports (deduplicated) */\n get objects(): AdkTransportObjectRef[] {\n return this._objects;\n }\n\n /** Objects matching a selector across all transports */\n getObjectsBySelector(\n selector: TransportObjectSelector,\n ): AdkTransportObjectRef[] {\n return this._objects.filter((obj) => matchesSelector(obj, selector));\n }\n\n /** Convenience: objects marked for deletion (obj_func === 'D') */\n get deletionObjects(): AdkTransportObjectRef[] {\n return this.getObjectsBySelector({ objFunc: 'D' });\n }\n\n /**\n * Load multiple transports and return a merged view.\n *\n * @param numbers - Transport numbers to load and merge\n * @param ctx - Optional ADK context\n */\n static async create(\n numbers: string[],\n ctx?: AdkContext,\n ): Promise<MergedTransportView> {\n const transports = await Promise.all(\n numbers.map((n) => AdkTransport.get(n, ctx)),\n );\n return new MergedTransportView(transports);\n }\n}\n"],"mappings":"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"}
|