@abapify/adk 0.4.17 → 0.4.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +0 -104
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +49 -98
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["createLockService","kinds.Package","kinds.Class","kinds.Interface","kinds.FunctionGroup","kinds.FunctionModule","kinds.Program","kinds.Include","kinds.Table","kinds.DataElement","kinds.Domain","kinds.TableType","kinds.MessageClass","kinds.EnhancementSpot","PackageKind","ClassKind","InterfaceKind","ProgramKind","IncludeKind","FunctionGroupKind","FunctionModuleKind","DomainKind","DataElementKind","TableKind","StructureKind","TableTypeKind","asArray","c","TransportRequestKind","asArray"],"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/base/kinds.ts","../src/base/registry.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/crud-source-object.ts","../src/objects/cds/ddl.model.ts","../src/objects/cds/dcl.model.ts","../src/objects/cds/ddlx.model.ts","../src/objects/cds/source-object.ts","../src/objects/cds/dsfd.model.ts","../src/objects/cds/dsfi.model.ts","../src/objects/cds/dteb.model.ts","../src/objects/cds/source-only-object.ts","../src/objects/cds/dras.model.ts","../src/objects/cds/drty.model.ts","../src/objects/cds/dtdc.model.ts","../src/objects/cds/dtix.model.ts","../src/objects/cds/dtsc.model.ts","../src/objects/cds/desd.model.ts","../src/objects/repository/bdef/bdef.model.ts","../src/objects/repository/badi/badi.model.ts","../src/objects/repository/classic-badi/classic-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","../src/factory.ts","../src/transport-source-manifest.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 { resolveLockCorrelation, 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 * Retry only the immediate post-create LOCK when a backend keeps its\n * generated CTS/editor lock briefly after accepting the skeleton POST.\n */\n postCreateLockRetry?: {\n /** Total LOCK attempts, including the first one. */\n attempts: number;\n /** Delay between conflicting LOCK attempts in milliseconds. */\n delayMs: number;\n };\n}\n\ntype InternalSaveOptions = SaveOptions & { postCreate?: boolean };\n\n/**\n * SAP accepted the skeleton POST, but rejected the immediate follow-up lock.\n *\n * The object therefore exists in SAP, while the source or metadata supplied\n * to the original save call has not yet been persisted. Callers must retry\n * the same object with `mode: 'update'` after the CTS/editor lock is cleared;\n * repeating `mode: 'create'` risks an \"already exists\" response.\n */\nexport class AdkPostCreateLockError extends Error {\n readonly code = 'ADT_POST_CREATE_LOCKED' as const;\n override readonly name = 'AdkPostCreateLockError';\n\n constructor(\n readonly objectUri: string,\n readonly transport: string | undefined,\n cause: unknown,\n ) {\n super(\n `SAP created ${objectUri}, but its post-create CTS lock is still active. ` +\n \"Retry the pending change with mode: 'update' after the lock clears; do not create the object again.\",\n { cause },\n );\n }\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(\n ctx: AdkContext,\n dataOrName: D | string | Record<string, unknown>,\n ) {\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 as D;\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 // SAP ADT lifecycle orchestration is branch-heavy; targeted for follow-up refactor.\n // prettier-ignore\n async save(options: InternalSaveOptions = {}): Promise<this> { //NOSONAR\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 try {\n // Object now exists — update with full data + sources.\n return await this.save({\n ...options,\n mode: 'update',\n postCreate: true,\n });\n } catch (error) {\n if (this.isPostCreateLockConflict(error)) {\n throw new AdkPostCreateLockError(this.objectUri, transport, error);\n }\n throw error;\n }\n }\n // The object existed before this call — normal update errors are not\n // post-create recovery cases unless the caller explicitly supplied the\n // bounded post-create retry policy to resume a prior skeleton POST.\n return this.save({\n ...options,\n mode: 'update',\n postCreate: options.postCreateLockRetry !== undefined,\n });\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 if (options.postCreate) {\n await this.lockAfterCreate(transport, options.postCreateLockRetry);\n } else {\n await this.lock(transport);\n }\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 // SAP can resolve a development task to its parent request during LOCK.\n // Subsequent PUTs must use that authoritative CORRNR rather than the\n // caller's task number (TRL rejects the task even with a valid handle).\n const effectiveTransport = resolveLockCorrelation(\n this._lockHandle ?? {},\n transport,\n );\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 * Some CTS backends can retain the lock created by a successful object POST\n * long enough for the immediate follow-up LOCK to fail. This is distinct\n * from an arbitrary edit conflict because this save invocation already\n * created the skeleton successfully.\n */\n private isPostCreateLockConflict(e: unknown): boolean {\n let message = '';\n if (typeof e === 'string') {\n message = e;\n } else if (e instanceof Error) {\n message = e.message;\n } else if (\n typeof e === 'object' &&\n e !== null &&\n typeof (e as { message?: unknown }).message === 'string'\n ) {\n message = (e as { message: string }).message;\n }\n const normalized = message.toLowerCase();\n return (\n normalized.includes('already locked in request') ||\n normalized.includes('currently editing') ||\n normalized.includes('is being edited')\n );\n }\n\n /**\n * Some backends retain the lock implicitly created by a successful POST for\n * a short time. Retry only this known follow-up LOCK; no arbitrary update or\n * source write is repeated, and each successful lock still uses the normal\n * handle-backed save/unlock lifecycle.\n */\n private async lockAfterCreate(\n transport: string | undefined,\n retry: SaveOptions['postCreateLockRetry'],\n ): Promise<LockHandle> {\n const attempts = retry?.attempts ?? 1;\n const delayMs = retry?.delayMs ?? 0;\n if (!Number.isInteger(attempts) || attempts < 1) {\n throw new RangeError(\n 'postCreateLockRetry.attempts must be a positive integer.',\n );\n }\n if (!Number.isFinite(delayMs) || delayMs < 0) {\n throw new RangeError(\n 'postCreateLockRetry.delayMs must be a non-negative number.',\n );\n }\n\n let lastConflict: unknown;\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\n try {\n return await this.lock(transport);\n } catch (error) {\n if (!this.isPostCreateLockConflict(error) || attempt === attempts) {\n throw error;\n }\n lastConflict = error;\n if (delayMs > 0) {\n await new Promise<void>((resolve) => setTimeout(resolve, delayMs));\n }\n }\n }\n throw lastConflict;\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' && 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(transport);\n }\n\n try {\n // Build URL\n const params = new URLSearchParams();\n const effectiveTransport = resolveLockCorrelation(\n this._lockHandle ?? {},\n transport,\n );\n if (effectiveTransport) {\n params.set('corrNr', effectiveTransport);\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';\nimport { resolveLockCorrelation } from '@abapify/adt-locks';\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][] | undefined;\n if (deferred && deferred.length > 0) {\n try {\n // Re-lock for deferred source saves\n const lock = await r.object.lock(saveOptions.transport);\n const effectiveTransport = resolveLockCorrelation(\n lock,\n saveOptions.transport,\n );\n for (const [key, source] of deferred) {\n await obj.saveIncludeSource(key, source, {\n lockHandle: lock.handle,\n transport: effectiveTransport,\n });\n }\n // Re-activate after saving deferred sources\n const deferredSet = new AdkObjectSet(this.ctx);\n deferredSet.add(r.object);\n const deferredActivation = await deferredSet.activateAll();\n if (deferredActivation.failed > 0) {\n throw new Error(\n `Deferred activation failed: ${\n deferredActivation.messages.join('; ') || 'unknown error'\n }`,\n );\n }\n delete obj._deferredSources;\n } catch (error) {\n r.success = false;\n r.error = `Deferred source deployment failed: ${\n error instanceof Error ? error.message : String(error)\n }`;\n saveResult.success--;\n saveResult.failed++;\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('TRLK900001');\n *\n * For testing or multi-connection scenarios, you can still pass explicit context:\n * const transport = await AdkTransportRequest.get('TRLK900001', 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('TRLK900001');\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 * ADK Object Kinds\n *\n * Central registry of all ADK object types.\n * Import specific kinds for type-safe usage:\n *\n * @example\n * import { TransportRequest } from '../base/kinds';\n * class AdkTransportRequest extends AdkObject<typeof TransportRequest> { ... }\n */\n\n// CTS\nexport const TransportRequest = 'TransportRequest' as const;\nexport const TransportTask = 'TransportTask' as const;\n\n// Repository Objects\nexport const Package = 'Package' as const;\nexport const Class = 'Class' as const;\nexport const Interface = 'Interface' as const;\nexport const FunctionGroup = 'FunctionGroup' as const;\nexport const FunctionModule = 'FunctionModule' as const;\nexport const Program = 'Program' as const;\nexport const Include = 'Include' as const;\n\n// Data Dictionary\nexport const Table = 'Table' as const;\nexport const Structure = 'Structure' as const;\nexport const DataElement = 'DataElement' as const;\nexport const Domain = 'Domain' as const;\nexport const TableType = 'TableType' as const;\n\n// CDS and RAP source objects\nexport const DdlSource = 'DdlSource' as const;\nexport const DclSource = 'DclSource' as const;\nexport const DdlExtension = 'DdlExtension' as const;\nexport const CdsAspect = 'CdsAspect' as const;\nexport const CdsType = 'CdsType' as const;\nexport const ScalarFunctionDefinition = 'ScalarFunctionDefinition' as const;\nexport const ScalarFunctionImplementation =\n 'ScalarFunctionImplementation' as const;\nexport const EntityBuffer = 'EntityBuffer' as const;\nexport const DynamicCache = 'DynamicCache' as const;\nexport const TuningIndex = 'TuningIndex' as const;\nexport const StaticCache = 'StaticCache' as const;\nexport const ExternalSchema = 'ExternalSchema' as const;\nexport const BehaviorDefinition = 'BehaviorDefinition' as const;\nexport const ServiceDefinition = 'ServiceDefinition' as const;\nexport const ServiceBinding = 'ServiceBinding' as const;\n\n// Other\nexport const MessageClass = 'MessageClass' as const;\nexport const EnhancementSpot = 'EnhancementSpot' as const;\n\n/** Union type of all ADK kinds */\nexport type AdkKind =\n | typeof TransportRequest\n | typeof TransportTask\n | typeof Package\n | typeof Class\n | typeof Interface\n | typeof FunctionGroup\n | typeof FunctionModule\n | typeof Program\n | typeof Include\n | typeof Table\n | typeof Structure\n | typeof DataElement\n | typeof Domain\n | typeof TableType\n | typeof DdlSource\n | typeof DclSource\n | typeof DdlExtension\n | typeof CdsAspect\n | typeof CdsType\n | typeof ScalarFunctionDefinition\n | typeof ScalarFunctionImplementation\n | typeof EntityBuffer\n | typeof DynamicCache\n | typeof TuningIndex\n | typeof StaticCache\n | typeof ExternalSchema\n | typeof BehaviorDefinition\n | typeof ServiceDefinition\n | typeof ServiceBinding\n | typeof MessageClass\n | typeof EnhancementSpot;\n\n// ============================================\n// Type-safe Kind → Object mapping\n// ============================================\n\n// Import concrete types for mapping (type-only to avoid circular deps)\nimport type { AdkClass } from '../objects/repository/clas/clas.model';\nimport type { AdkInterface } from '../objects/repository/intf/intf.model';\nimport type { AdkPackage } from '../objects/repository/devc/devc.model';\nimport type { AdkProgram } from '../objects/repository/prog/prog.model';\nimport type { AdkInclude } from '../objects/repository/incl/incl.model';\nimport type { AdkFunctionGroup } from '../objects/repository/fugr/fugr.model';\nimport type { AdkFunctionModule } from '../objects/repository/fugr/func/func.model';\nimport type {\n AdkTransportRequest,\n AdkTransportTask,\n} from '../objects/cts/transport/transport';\nimport type { AdkObject } from './model';\nimport type { AdkDomain } from '../objects/ddic/doma/doma.model';\nimport type { AdkDataElement } from '../objects/ddic/dtel/dtel.model';\nimport type { AdkTable, AdkStructure } from '../objects/ddic/tabl/tabl.model';\nimport type { AdkTableType } from '../objects/ddic/ttyp/ttyp.model';\nimport type { AdkDdlSource } from '../objects/cds/ddl.model';\nimport type { AdkDclSource } from '../objects/cds/dcl.model';\nimport type { AdkDdlExtension } from '../objects/cds/ddlx.model';\nimport type { AdkCdsAspect } from '../objects/cds/dras.model';\nimport type { AdkCdsType } from '../objects/cds/drty.model';\nimport type { AdkScalarFunctionDefinition } from '../objects/cds/dsfd.model';\nimport type { AdkScalarFunctionImplementation } from '../objects/cds/dsfi.model';\nimport type { AdkEntityBuffer } from '../objects/cds/dteb.model';\nimport type { AdkDynamicCache } from '../objects/cds/dtdc.model';\nimport type { AdkTuningIndex } from '../objects/cds/dtix.model';\nimport type { AdkStaticCache } from '../objects/cds/dtsc.model';\nimport type { AdkExternalSchema } from '../objects/cds/desd.model';\nimport type { AdkBehaviorDefinition } from '../objects/repository/bdef/bdef.model';\nimport type { AdkServiceDefinition } from '../objects/repository/srvd/srvd.model';\nimport type { AdkServiceBinding } from '../objects/repository/srvb/srvb.model';\n\n/**\n * Maps ADK kind to concrete object type\n *\n * Enables type-safe factory methods:\n * ```ts\n * const cls = factory.byKind(Class, 'ZCL_TEST'); // → AdkClass\n * const intf = factory.byKind(Interface, 'ZIF'); // → AdkInterface\n * ```\n */\nexport type AdkObjectForKind<K extends AdkKind> = K extends typeof Class\n ? AdkClass\n : K extends typeof Interface\n ? AdkInterface\n : K extends typeof Package\n ? AdkPackage\n : K extends typeof Program\n ? AdkProgram\n : K extends typeof Include\n ? AdkInclude\n : K extends typeof FunctionGroup\n ? AdkFunctionGroup\n : K extends typeof FunctionModule\n ? AdkFunctionModule\n : K extends typeof TransportRequest\n ? AdkTransportRequest\n : K extends typeof TransportTask\n ? AdkTransportTask\n : K extends typeof Domain\n ? AdkDomain\n : K extends typeof DataElement\n ? AdkDataElement\n : K extends typeof Table\n ? AdkTable\n : K extends typeof Structure\n ? AdkStructure\n : K extends typeof TableType\n ? AdkTableType\n : K extends typeof DdlSource\n ? AdkDdlSource\n : K extends typeof DclSource\n ? AdkDclSource\n : K extends typeof DdlExtension\n ? AdkDdlExtension\n : K extends typeof CdsAspect\n ? AdkCdsAspect\n : K extends typeof CdsType\n ? AdkCdsType\n : K extends typeof ScalarFunctionDefinition\n ? AdkScalarFunctionDefinition\n : K extends typeof ScalarFunctionImplementation\n ? AdkScalarFunctionImplementation\n : K extends typeof EntityBuffer\n ? AdkEntityBuffer\n : K extends typeof DynamicCache\n ? AdkDynamicCache\n : K extends typeof TuningIndex\n ? AdkTuningIndex\n : K extends typeof StaticCache\n ? AdkStaticCache\n : K extends typeof ExternalSchema\n ? AdkExternalSchema\n : K extends typeof BehaviorDefinition\n ? AdkBehaviorDefinition\n : K extends typeof ServiceDefinition\n ? AdkServiceDefinition\n : K extends typeof ServiceBinding\n ? AdkServiceBinding\n : AdkObject; // fallback\n","/**\n * ADK Object Registry\n *\n * Maps ADT types to ADK object constructors.\n * Supports both full types (DEVC/K) and main types (DEVC).\n *\n * Architecture:\n * - ADT type (external): \"DEVC/K\", \"CLAS/OC\" - from SAP\n * - ADK kind (internal): Package, Class - our abstraction\n * - Constructor: AdkPackage, AdkClass - implementation\n */\n\nimport type { AdkContext } from './context';\nimport type { AdkKind } from './kinds';\nimport * as kinds from './kinds';\n\n// ============================================\n// Types\n// ============================================\n\n/**\n * Minimal contract for any object that can be registered.\n *\n * Both `AdkObject` subclasses and lightweight source-only CDS/RAP objects\n * (which do not extend `AdkObject`) satisfy this interface, allowing the\n * registry to store constructors for both without `as any` casts.\n */\nexport interface AdkRegistrable {\n readonly name: string;\n readonly kind: AdkKind;\n}\n\n/** Constructor signature for ADK objects */\n\nexport type AdkObjectConstructor<T extends AdkRegistrable = AdkRegistrable> =\n new (ctx: AdkContext, nameOrData: string | Record<string, unknown>) => T;\n\n/** How to transform object name for the URI path segment */\nexport type NameTransform = 'lowercase' | 'preserve';\n\n/** Registry entry with constructor and kind */\nexport interface RegistryEntry {\n readonly kind: AdkKind;\n readonly constructor: AdkObjectConstructor;\n /** ADT REST endpoint path segment (e.g., 'oo/classes', 'ddic/tabletypes') */\n readonly endpoint?: string;\n /** How to transform the object name in URIs (default: lowercase) */\n readonly nameTransform?: NameTransform;\n /** Optional name normalizer — e.g., strip SAPL prefix for FUGR */\n readonly normalizeName?: (name: string) => string;\n}\n\n// ============================================\n// ADT Type Utilities\n// ============================================\n\n/**\n * Parse ADT type into components\n *\n * @example\n * parseAdtType(\"DEVC/K\") // { full: \"DEVC/K\", main: \"DEVC\", sub: \"K\" }\n * parseAdtType(\"DEVC\") // { full: \"DEVC\", main: \"DEVC\", sub: undefined }\n */\nexport function parseAdtType(adtType: string): {\n full: string;\n main: string;\n sub?: string;\n} {\n const [main, sub] = adtType.split('/');\n return {\n full: adtType,\n main: main.toUpperCase(),\n sub: sub?.toUpperCase(),\n };\n}\n\n/**\n * Get main type from ADT type\n *\n * @example\n * getMainType(\"DEVC/K\") // \"DEVC\"\n * getMainType(\"CLAS\") // \"CLAS\"\n */\nexport function getMainType(adtType: string): string {\n return parseAdtType(adtType).main;\n}\n\n// ============================================\n// Registry\n// ============================================\n\n/** Internal registry storage */\nconst registry = new Map<string, RegistryEntry>();\n\n/** ADT main type to ADK kind mapping */\nconst adtToKind = new Map<string, AdkKind>();\n\n/** ADK kind to ADT main type mapping (reverse) */\nconst kindToAdt = new Map<AdkKind, string>();\n\n/**\n * Test-only: clear all registry state.\n *\n * The registry is module-level singleton state populated by side-effectful\n * `registerObjectType()` calls in `src/objects/repository/**`. Tests that\n * exercise registration need a clean slate, but production code must never\n * call this — it would break every ADK object type resolution.\n *\n * Name intentionally uses the `__` prefix to signal \"not part of the public\n * API\". Do not import this from runtime code.\n */\nexport function __resetRegistryForTests(): void {\n registry.clear();\n adtToKind.clear();\n kindToAdt.clear();\n}\n\n/** Options for registerObjectType */\nexport interface RegisterObjectTypeOptions {\n /** ADT REST endpoint path segment (e.g., 'oo/classes', 'ddic/tabletypes') */\n endpoint?: string;\n /** How to transform the object name in URIs (default: 'lowercase') */\n nameTransform?: NameTransform;\n /** Optional name normalizer — e.g., strip SAPL prefix for FUGR */\n normalizeName?: (name: string) => string;\n}\n\n/**\n * Register an ADK object type\n *\n * @param adtType - ADT type, either main (e.g., \"CLAS\") or full (e.g., \"TABL/DS\")\n * @param kind - ADK kind constant\n * @param constructor - Object constructor\n * @param options - Optional endpoint and name transform settings\n */\nexport function registerObjectType(\n adtType: string,\n kind: AdkKind,\n constructor: AdkObjectConstructor,\n options?: RegisterObjectTypeOptions,\n): void {\n const normalizedType = adtType.toUpperCase();\n\n registry.set(normalizedType, {\n kind,\n constructor,\n endpoint: options?.endpoint,\n nameTransform: options?.nameTransform,\n normalizeName: options?.normalizeName,\n });\n adtToKind.set(normalizedType, kind);\n kindToAdt.set(kind, normalizedType);\n}\n\n/**\n * Resolve ADT type to registry entry\n *\n * Tries full type first (e.g., \"TABL/DS\"), then falls back to main type (e.g., \"TABL\").\n * This allows registering subtypes with different constructors/endpoints.\n *\n * @param adtType - Full or main ADT type (e.g., \"DEVC/K\" or \"DEVC\")\n * @returns Registry entry or undefined if not found\n */\nexport function resolveType(adtType: string): RegistryEntry | undefined {\n const normalized = adtType.toUpperCase();\n // Try full type first (e.g., \"TABL/DS\")\n const fullMatch = registry.get(normalized);\n if (fullMatch) return fullMatch;\n // Fall back to main type (e.g., \"TABL\")\n const mainType = getMainType(adtType);\n return registry.get(mainType);\n}\n\n/**\n * Resolve ADK kind to registry entry\n *\n * @param kind - ADK kind constant\n * @returns Registry entry or undefined if not found\n */\nexport function resolveKind(kind: AdkKind): RegistryEntry | undefined {\n const adtType = kindToAdt.get(kind);\n if (!adtType) return undefined;\n return registry.get(adtType);\n}\n\n/**\n * Get ADK kind for ADT type\n */\nexport function getKindForType(adtType: string): AdkKind | undefined {\n return adtToKind.get(getMainType(adtType));\n}\n\n/**\n * Get ADT main type for ADK kind\n */\nexport function getTypeForKind(kind: AdkKind): string | undefined {\n return kindToAdt.get(kind);\n}\n\n/**\n * Check if ADT type is registered\n */\nexport function isTypeRegistered(adtType: string): boolean {\n return registry.has(getMainType(adtType));\n}\n\n/**\n * Get all registered ADT types\n */\nexport function getRegisteredTypes(): string[] {\n return Array.from(registry.keys());\n}\n\n/**\n * Get all registered ADK kinds\n */\nexport function getRegisteredKinds(): AdkKind[] {\n return Array.from(kindToAdt.keys());\n}\n\n/**\n * Get ADT REST endpoint for a type (e.g., 'oo/classes', 'ddic/tabletypes')\n * Checks exact type first (e.g., 'TABL/DS') before falling back to main type.\n */\nexport function getEndpointForType(adtType: string): string | undefined {\n return resolveType(adtType)?.endpoint;\n}\n\n/**\n * Build the full ADT object URI for a given type and name.\n *\n * @example\n * getObjectUri('CLAS', 'ZCL_MY_CLASS') // '/sap/bc/adt/oo/classes/zcl_my_class'\n * getObjectUri('DEVC', 'ZPACKAGE') // '/sap/bc/adt/packages/ZPACKAGE'\n * getObjectUri('TTYP', 'ZAGE_TTYP_STRTAB') // '/sap/bc/adt/ddic/tabletypes/zage_ttyp_strtab'\n */\nexport function getObjectUri(\n adtType: string,\n name: string,\n): string | undefined {\n const entry = resolveType(adtType);\n if (!entry?.endpoint) return undefined;\n\n const normalized = entry.normalizeName ? entry.normalizeName(name) : name;\n const transformedName =\n entry.nameTransform === 'preserve'\n ? encodeURIComponent(normalized)\n : encodeURIComponent(normalized.toLowerCase());\n\n return `/sap/bc/adt/${entry.endpoint}/${transformedName}`;\n}\n\n/**\n * Normalize an object name using type-specific rules.\n *\n * If `adtType` is provided, applies that type's normalizer only.\n * Otherwise, collects all possible normalized forms from every registered type.\n *\n * @returns Array of candidate names (always includes the original).\n *\n * @example\n * normalizeObjectName('SAPLZAGE_FUGR') // ['SAPLZAGE_FUGR', 'ZAGE_FUGR']\n * normalizeObjectName('SAPLZAGE_FUGR', 'FUGR') // ['ZAGE_FUGR']\n * normalizeObjectName('ZCLAS_TEST') // ['ZCLAS_TEST'] (no normalizer matches)\n */\nexport function normalizeObjectName(name: string, adtType?: string): string[] {\n if (adtType) {\n const entry = resolveType(adtType);\n const normalized = entry?.normalizeName?.(name) ?? name;\n return [normalized];\n }\n\n // No type hint — collect all distinct candidates from every registered normalizer\n const candidates = new Set<string>([name]);\n for (const entry of registry.values()) {\n if (entry.normalizeName) {\n candidates.add(entry.normalizeName(name));\n }\n }\n return Array.from(candidates);\n}\n\n/**\n * Extract the root object URI from a full (possibly sub-resource) URI.\n *\n * SAP locks must target the object root, not sub-resources like `/source/main`.\n * This function matches against registered endpoint prefixes and strips\n * everything after the object name segment.\n *\n * @returns The root object URI, or the original URI unchanged if no endpoint matches.\n *\n * @example\n * getObjectRootUri('/sap/bc/adt/functions/groups/zage_fugr/source/main')\n * // → '/sap/bc/adt/functions/groups/zage_fugr'\n * getObjectRootUri('/sap/bc/adt/oo/classes/zcl_test/includes/testclasses')\n * // → '/sap/bc/adt/oo/classes/zcl_test'\n * getObjectRootUri('/sap/bc/adt/oo/classes/zcl_test')\n * // → '/sap/bc/adt/oo/classes/zcl_test' (already root)\n */\nexport function getObjectRootUri(uri: string): string {\n const ADT_PREFIX = '/sap/bc/adt/';\n\n // Collect all registered endpoints, sorted longest-first to avoid partial matches\n const endpoints: string[] = [];\n for (const entry of registry.values()) {\n if (entry.endpoint) endpoints.push(entry.endpoint);\n }\n endpoints.sort((a, b) => b.length - a.length);\n\n for (const endpoint of endpoints) {\n const prefix = `${ADT_PREFIX}${endpoint}/`;\n if (uri.startsWith(prefix)) {\n // Next segment after the endpoint prefix is the object name\n const rest = uri.slice(prefix.length);\n const objectName = rest.split('/')[0];\n return `${prefix}${objectName}`;\n }\n }\n\n return uri;\n}\n\n// ============================================\n// Built-in Registrations\n// ============================================\n\n// These will be populated by object modules when they're imported\n// Each object module calls registerObjectType() in its module scope\n\n// Example (done in clas.model.ts):\n// registerObjectType('CLAS', kinds.Class, AdkClass);\n\n// For now, we export the registration function and let objects self-register\n// This avoids circular dependencies\n\n// ============================================\n// Type Mappings (for reference/documentation)\n// ============================================\n\n/**\n * Known ADT type to ADK kind mappings\n *\n * Repository Objects:\n * - DEVC → Package\n * - CLAS → Class\n * - INTF → Interface\n * - FUGR → FunctionGroup\n * - FUNC → FunctionModule\n * - PROG → Program\n * - INCL → Include\n *\n * Data Dictionary:\n * - TABL → Table\n * - STRU → Structure (actually TABL with different category)\n * - DTEL → DataElement\n * - DOMA → Domain\n * - TTYP → TableType\n *\n * Other:\n * - MSAG → MessageClass\n * - ENHS → EnhancementSpot\n *\n * CTS:\n * - (Transport requests/tasks use different identification)\n */\nexport const ADT_TYPE_MAPPINGS = {\n // Repository\n DEVC: kinds.Package,\n CLAS: kinds.Class,\n INTF: kinds.Interface,\n FUGR: kinds.FunctionGroup,\n FUNC: kinds.FunctionModule,\n PROG: kinds.Program,\n INCL: kinds.Include,\n\n // Data Dictionary\n TABL: kinds.Table,\n DTEL: kinds.DataElement,\n DOMA: kinds.Domain,\n TTYP: kinds.TableType,\n\n // Other\n MSAG: kinds.MessageClass,\n ENHS: kinds.EnhancementSpot,\n} as const;\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","import { getGlobalContext } from '../../base/global-context';\nimport type { AdkContext } from '../../base/context';\nimport { toText } from '../../base/fetch-utils';\nimport type { AdkCrudSourceContract } from './source-object';\n\n/**\n * Shared implementation for standalone CDS/RAP source objects that support\n * full CRUD (get, source.main.get/put, post, delete) plus lock/unlock/activate.\n *\n * DDL, DCL, BDEF, and SRVD all follow the same lifecycle pattern:\n * create skeleton → PUT source → activate\n * This base eliminates the duplicated load/saveMainSource/lock/unlock/activate\n * boilerplate across those models.\n */\nexport abstract class AdkCrudSourceObject<TMetadata = Record<string, unknown>> {\n abstract readonly kind: string;\n readonly name: string;\n protected readonly ctx: AdkContext;\n protected metadata?: TMetadata;\n\n protected abstract readonly objectType: string;\n protected abstract readonly endpoint: string;\n\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).toUpperCase();\n }\n\n get objectUri(): string {\n return `/sap/bc/adt/${this.endpoint}/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n protected abstract get contract(): AdkCrudSourceContract;\n\n protected abstract getMetadataKey(): keyof TMetadata & string;\n\n get description(): string {\n const key = this.getMetadataKey();\n return (\n (this.metadata?.[key] as { description?: string })?.description ??\n this.name\n );\n }\n\n get originalLanguage(): string | undefined {\n const key = this.getMetadataKey();\n return (this.metadata?.[key] as { masterLanguage?: string })\n ?.masterLanguage;\n }\n\n get abapLanguageVersion(): string | undefined {\n const key = this.getMetadataKey();\n return (this.metadata?.[key] as { abapLanguageVersion?: string })\n ?.abapLanguageVersion;\n }\n\n get package(): string | undefined {\n const key = this.getMetadataKey();\n return (this.metadata?.[key] as { packageRef?: { name?: string } })\n ?.packageRef?.name;\n }\n\n // ─── Source ────────────────────────────────────────────────────────────────\n\n async getSource(): Promise<string> {\n return toText(await this.contract.source.main.get(this.name));\n }\n\n async load(): Promise<this> {\n const [metadata] = await Promise.all([\n this.contract.get(this.name),\n this.getSource(),\n ]);\n this.metadata = metadata as TMetadata;\n return this;\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: this.objectType,\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 never);\n return this;\n }\n\n // ─── Static helpers ────────────────────────────────────────────────────────\n\n protected static resolveContext(ctx?: AdkContext): AdkContext {\n return ctx ?? getGlobalContext();\n }\n\n /**\n * Get a source object (validates it exists by fetching source).\n * Generic helper used by static `get()` on subclasses.\n */\n protected static async getSourceObject<T extends AdkCrudSourceObject<any>>(\n ctor: new (ctx: AdkContext, name: string) => T,\n name: string,\n ctx?: AdkContext,\n ): Promise<T> {\n const context = AdkCrudSourceObject.resolveContext(ctx);\n const obj = new ctor(context, name);\n await obj.getSource();\n return obj;\n }\n\n /**\n * Check if a source object exists.\n * Generic helper used by static `exists()` on subclasses.\n */\n protected static async sourceObjectExists<T extends AdkCrudSourceObject<any>>(\n ctor: new (ctx: AdkContext, name: string) => T,\n name: string,\n ctx?: AdkContext,\n ): Promise<boolean> {\n try {\n const context = AdkCrudSourceObject.resolveContext(ctx);\n const obj = new ctor(context, name);\n await obj.getSource();\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Shared skeleton-creation helper. Subclasses pass their contract's `post`\n * function and the root element name + type that their AFF schema expects.\n */\n protected static async createSourceSkeleton<\n T extends AdkCrudSourceObject<any>,\n >(\n ctor: new (ctx: AdkContext, name: string) => T,\n params: {\n name: string;\n description: string;\n packageName: string;\n transport?: string;\n ctx?: AdkContext;\n rootKey: string;\n objectTypeCode: string;\n responsible?: string;\n },\n post: (...args: any[]) => Promise<unknown>,\n ): Promise<T> {\n const context = AdkCrudSourceObject.resolveContext(params.ctx);\n const nameU = params.name.toUpperCase();\n const pkgU = params.packageName.toUpperCase();\n\n await post(params.transport ? { corrNr: params.transport } : {}, {\n [params.rootKey]: {\n name: nameU,\n ...(params.objectTypeCode ? { type: params.objectTypeCode } : {}),\n description: params.description,\n language: 'EN',\n masterLanguage: 'EN',\n responsible: params.responsible ?? '$TMP',\n packageRef: {\n name: pkgU,\n type: 'DEVC/K',\n uri: `/sap/bc/adt/packages/${pkgU.toLowerCase()}`,\n },\n },\n } as never);\n\n return new ctor(context, nameU);\n }\n\n /**\n * Shared delete helper. Subclasses pass their contract's `delete` function.\n */\n protected static async deleteSource(\n name: string,\n options: { transport?: string; lockHandle?: string } | undefined,\n deleteFn: (\n name: string,\n options: Record<string, string>,\n ) => Promise<unknown>,\n ): Promise<void> {\n await deleteFn(name.toUpperCase(), {\n ...(options?.transport ? { corrNr: options.transport } : {}),\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n });\n }\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 { DdlSource } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport type { AdkCrudSourceContract } from './source-object';\nimport { AdkCrudSourceObject } from './crud-source-object';\n\ninterface DdlMetadata {\n ddlSource?: {\n description?: string;\n masterLanguage?: string;\n abapLanguageVersion?: string;\n packageRef?: { name?: string };\n source_origin?: string;\n source_type?: string;\n };\n}\n\nexport class AdkDdlSource extends AdkCrudSourceObject<DdlMetadata> {\n static readonly kind = DdlSource;\n readonly kind = AdkDdlSource.kind;\n\n protected readonly objectType = 'DDLS';\n protected readonly endpoint = 'ddic/ddl/sources';\n\n protected get contract(): AdkCrudSourceContract {\n return this.ctx.client.adt.ddic.ddl.sources as AdkCrudSourceContract;\n }\n\n protected getMetadataKey(): 'ddlSource' {\n return 'ddlSource';\n }\n\n get sourceOrigin(): string | undefined {\n return this.metadata?.ddlSource?.source_origin;\n }\n get sourceType(): string | undefined {\n return this.metadata?.ddlSource?.source_type;\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 return this.getSourceObject(this, name, ctx);\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n return this.sourceObjectExists(this, name, ctx);\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 return this.createSourceSkeleton(\n this,\n {\n name,\n description,\n packageName,\n transport: options?.transport,\n ctx,\n rootKey: 'source',\n objectTypeCode: '',\n },\n context.client.adt.ddic.ddl.sources.post.bind(\n context.client.adt.ddic.ddl.sources,\n ),\n );\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 return AdkCrudSourceObject.deleteSource(\n name,\n options,\n context.client.adt.ddic.ddl.sources.delete.bind(\n context.client.adt.ddic.ddl.sources,\n ),\n );\n }\n}\n\nregisterObjectType('DDLS', DdlSource, AdkDdlSource, {\n endpoint: 'ddic/ddl/sources',\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 { DclSource } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport type { AdkCrudSourceContract } from './source-object';\nimport { AdkCrudSourceObject } from './crud-source-object';\n\ninterface DclMetadata {\n dclSource?: {\n description?: string;\n masterLanguage?: string;\n packageRef?: { name?: string };\n };\n}\n\nexport class AdkDclSource extends AdkCrudSourceObject<DclMetadata> {\n static readonly kind = DclSource;\n readonly kind = AdkDclSource.kind;\n\n protected readonly objectType = 'DCLS';\n protected readonly endpoint = 'acm/dcl/sources';\n\n protected get contract(): AdkCrudSourceContract {\n return this.ctx.client.adt.ddic.dcl.sources as AdkCrudSourceContract;\n }\n\n protected getMetadataKey(): 'dclSource' {\n return 'dclSource';\n }\n\n // ─── Static Factory Methods ─────────────────────────────────────────────────\n\n static async get(name: string, ctx?: AdkContext): Promise<AdkDclSource> {\n return this.getSourceObject(this, name, ctx);\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n return this.sourceObjectExists(this, name, ctx);\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 return this.createSourceSkeleton(\n this,\n {\n name,\n description,\n packageName,\n transport: options?.transport,\n ctx,\n rootKey: 'source',\n objectTypeCode: '',\n },\n context.client.adt.ddic.dcl.sources.post.bind(\n context.client.adt.ddic.dcl.sources,\n ),\n );\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 return AdkCrudSourceObject.deleteSource(\n name,\n options,\n context.client.adt.ddic.dcl.sources.delete.bind(\n context.client.adt.ddic.dcl.sources,\n ),\n );\n }\n}\n\nregisterObjectType('DCLS', DclSource, AdkDclSource, {\n endpoint: 'acm/dcl/sources',\n});\n","import type { AdkContext } from '../../base/context';\nimport { toText } from '../../base/fetch-utils';\nimport { DdlExtension } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport type { AdkCdsSourceContract } from './source-object';\n\nexport class AdkDdlExtension {\n static readonly kind = DdlExtension;\n readonly kind = AdkDdlExtension.kind;\n readonly name: string;\n protected readonly ctx: AdkContext;\n private metadata?: {\n ddlxSource?: {\n description?: string;\n masterLanguage?: string;\n abapLanguageVersion?: string;\n packageRef?: { name?: string };\n };\n };\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).toUpperCase();\n }\n get objectUri() {\n return `/sap/bc/adt/ddic/ddlx/sources/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n get description() {\n return this.metadata?.ddlxSource?.description ?? this.name;\n }\n get originalLanguage() {\n return this.metadata?.ddlxSource?.masterLanguage;\n }\n get abapLanguageVersion() {\n return this.metadata?.ddlxSource?.abapLanguageVersion;\n }\n get package() {\n return this.metadata?.ddlxSource?.packageRef?.name;\n }\n private get contract(): AdkCdsSourceContract {\n return this.ctx.client.adt.ddic.ddlx.sources as AdkCdsSourceContract;\n }\n async getSource() {\n return toText(await this.contract.source.main.get(this.name));\n }\n async load(): Promise<this> {\n const [metadata] = await Promise.all([\n this.contract.get(this.name),\n this.getSource(),\n ]);\n this.metadata = metadata as {\n ddlxSource?: {\n description?: string;\n masterLanguage?: string;\n abapLanguageVersion?: string;\n packageRef?: { name?: string };\n };\n };\n return this;\n }\n}\nregisterObjectType('DDLX', DdlExtension, AdkDdlExtension, {\n endpoint: 'ddic/ddlx/sources',\n});\n","import type { AdkContext } from '../../base/context';\nimport { toText } from '../../base/fetch-utils';\n\n/**\n * Structural type for the ADT source contract used by CDS source objects.\n * Captures the `get` and `source.main.get` members used by {@link getSource}\n * and {@link load}, so incompatible contract shapes are rejected at compile\n * time instead of failing at runtime.\n */\nexport interface AdkCdsSourceContract {\n get(name: string): Promise<unknown>;\n source: {\n main: {\n get(name: string): Promise<unknown>;\n put(\n name: string,\n options: Record<string, unknown>,\n body: string,\n ): Promise<unknown>;\n };\n };\n}\n\n/**\n * Broader CRUD contract for standalone source objects that also support\n * create (POST) and delete. Used by DDL, DCL, BDEF, SRVD, etc.\n */\nexport interface AdkCrudSourceContract extends AdkCdsSourceContract {\n post(options: Record<string, unknown>, body: unknown): Promise<unknown>;\n delete(name: string, options: Record<string, unknown>): Promise<unknown>;\n}\n\n/** Minimal shared implementation for CDS source objects used by import. */\nexport abstract class AdkCdsSourceObject {\n readonly name: string;\n protected readonly ctx: AdkContext;\n protected abstract readonly endpoint: string;\n private metadata?: {\n blueSource?: {\n description?: string;\n masterLanguage?: string;\n abapLanguageVersion?: string;\n packageRef?: { name?: string };\n };\n };\n\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).toUpperCase();\n }\n\n get objectUri(): string {\n return `/sap/bc/adt/${this.endpoint}/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n get description(): string {\n return this.metadata?.blueSource?.description ?? this.name;\n }\n\n get originalLanguage(): string | undefined {\n return this.metadata?.blueSource?.masterLanguage;\n }\n\n get abapLanguageVersion(): string | undefined {\n return this.metadata?.blueSource?.abapLanguageVersion;\n }\n\n get package(): string | undefined {\n return this.metadata?.blueSource?.packageRef?.name;\n }\n\n protected abstract get contract(): AdkCdsSourceContract;\n\n async getSource(): Promise<string> {\n return toText(await this.contract.source.main.get(this.name));\n }\n\n async load(): Promise<this> {\n const [metadata] = await Promise.all([\n this.contract.get(this.name),\n this.getSource(),\n ]);\n this.metadata = metadata as {\n blueSource?: {\n description?: string;\n masterLanguage?: string;\n abapLanguageVersion?: string;\n packageRef?: { name?: string };\n };\n };\n return this;\n }\n}\n","import { ScalarFunctionDefinition } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport { AdkCdsSourceObject, type AdkCdsSourceContract } from './source-object';\n\nexport class AdkScalarFunctionDefinition extends AdkCdsSourceObject {\n static readonly kind = ScalarFunctionDefinition;\n readonly kind = AdkScalarFunctionDefinition.kind;\n protected readonly endpoint = 'ddic/dsfd/sources';\n protected get contract(): AdkCdsSourceContract {\n return this.ctx.client.adt.ddic.dsfd.sources as AdkCdsSourceContract;\n }\n}\n\nregisterObjectType(\n 'DSFD',\n ScalarFunctionDefinition,\n AdkScalarFunctionDefinition,\n {\n endpoint: 'ddic/dsfd/sources',\n },\n);\n","import type { AdkContext } from '../../base/context';\nimport { ScalarFunctionImplementation } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport type { AdkCdsSourceContract } from './source-object';\n\nexport class AdkScalarFunctionImplementation {\n static readonly kind = ScalarFunctionImplementation;\n readonly kind = AdkScalarFunctionImplementation.kind;\n readonly name: string;\n protected readonly ctx: AdkContext;\n private definition?: unknown;\n\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).toUpperCase();\n }\n\n get objectUri(): string {\n return `/sap/bc/adt/ddic/dsfi/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n private get contract(): AdkCdsSourceContract {\n return this.ctx.client.adt.ddic.dsfi as unknown as AdkCdsSourceContract;\n }\n\n async getSource(): Promise<unknown> {\n return this.definition ?? this.contract.source.main.get(this.name);\n }\n\n async load(): Promise<this> {\n const [, definition] = await Promise.all([\n this.contract.get(this.name),\n this.contract.source.main.get(this.name),\n ]);\n this.definition = definition;\n return this;\n }\n}\n\nregisterObjectType(\n 'DSFI',\n ScalarFunctionImplementation,\n AdkScalarFunctionImplementation,\n {\n endpoint: 'ddic/dsfi',\n },\n);\n","import { EntityBuffer } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport { AdkCdsSourceObject, type AdkCdsSourceContract } from './source-object';\n\nexport class AdkEntityBuffer extends AdkCdsSourceObject {\n static readonly kind = EntityBuffer;\n readonly kind = AdkEntityBuffer.kind;\n protected readonly endpoint = 'ddic/dteb/sources';\n protected get contract(): AdkCdsSourceContract {\n return this.ctx.client.adt.ddic.dteb.sources as AdkCdsSourceContract;\n }\n}\n\nregisterObjectType('DTEB', EntityBuffer, AdkEntityBuffer, {\n endpoint: 'ddic/dteb/sources',\n});\n","import type { AdkContext } from '../../base/context';\n\n/**\n * CDS source object without a metadata schema in the connected ABAP release.\n *\n * DRAS and DRTY are absent from the reference system's repository search, so their source\n * endpoint is represented by the ADT DDIC naming convention and exercised\n * with official ABAP File Formats fixtures. The object is intentionally\n * source-first: import only needs the immutable source and a safe header.\n */\nexport abstract class AdkSourceOnlyCdsObject {\n readonly name: string;\n protected readonly ctx: AdkContext;\n protected abstract readonly endpoint: string;\n private source?: string;\n\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).toUpperCase();\n }\n\n get objectUri(): string {\n return `/sap/bc/adt/${this.endpoint}/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n get description(): string {\n return this.name;\n }\n get originalLanguage(): string {\n return 'EN';\n }\n\n async getSource(): Promise<string> {\n this.source ??= await this.ctx.client.readTextBounded(\n `${this.objectUri}/source/main`,\n 5 * 1024 * 1024,\n { headers: { Accept: 'text/plain' } },\n );\n return this.source;\n }\n\n async load(): Promise<this> {\n await this.getSource();\n return this;\n }\n}\n","import { CdsAspect } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport { AdkSourceOnlyCdsObject } from './source-only-object';\n\nexport class AdkCdsAspect extends AdkSourceOnlyCdsObject {\n static readonly kind = CdsAspect;\n readonly kind = AdkCdsAspect.kind;\n protected readonly endpoint = 'ddic/dras/sources';\n}\n\nregisterObjectType('DRAS', CdsAspect, AdkCdsAspect, {\n endpoint: 'ddic/dras/sources',\n});\n","import { CdsType } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport { AdkSourceOnlyCdsObject } from './source-only-object';\n\nexport class AdkCdsType extends AdkSourceOnlyCdsObject {\n static readonly kind = CdsType;\n readonly kind = AdkCdsType.kind;\n protected readonly endpoint = 'ddic/drty/sources';\n}\n\nregisterObjectType('DRTY', CdsType, AdkCdsType, {\n endpoint: 'ddic/drty/sources',\n});\n","import { DynamicCache } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport { AdkSourceOnlyCdsObject } from './source-only-object';\n\nexport class AdkDynamicCache extends AdkSourceOnlyCdsObject {\n static readonly kind = DynamicCache;\n readonly kind = AdkDynamicCache.kind;\n protected readonly endpoint = 'ddic/dtdc/sources';\n}\nregisterObjectType('DTDC', DynamicCache, AdkDynamicCache, {\n endpoint: 'ddic/dtdc/sources',\n});\n","import { TuningIndex } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport { AdkSourceOnlyCdsObject } from './source-only-object';\n\nexport class AdkTuningIndex extends AdkSourceOnlyCdsObject {\n static readonly kind = TuningIndex;\n readonly kind = AdkTuningIndex.kind;\n protected readonly endpoint = 'ddic/dtix/sources';\n}\nregisterObjectType('DTIX', TuningIndex, AdkTuningIndex, {\n endpoint: 'ddic/dtix/sources',\n});\n","import { StaticCache } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport { AdkSourceOnlyCdsObject } from './source-only-object';\n\nexport class AdkStaticCache extends AdkSourceOnlyCdsObject {\n static readonly kind = StaticCache;\n readonly kind = AdkStaticCache.kind;\n protected readonly endpoint = 'ddic/dtsc/sources';\n}\nregisterObjectType('DTSC', StaticCache, AdkStaticCache, {\n endpoint: 'ddic/dtsc/sources',\n});\n","import type { AdkContext } from '../../base/context';\nimport { ExternalSchema } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\n\nexport class AdkExternalSchema {\n static readonly kind = ExternalSchema;\n readonly kind = AdkExternalSchema.kind;\n readonly name: string;\n protected readonly ctx: AdkContext;\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).toUpperCase();\n }\n get objectUri(): string {\n return `/sap/bc/adt/ddic/desd/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n get description(): string {\n return this.name;\n }\n get originalLanguage(): string {\n return 'EN';\n }\n async load(): Promise<this> {\n await this.ctx.client.readTextBounded(this.objectUri, 5 * 1024 * 1024, {\n headers: { Accept: 'application/xml' },\n });\n return this;\n }\n}\nregisterObjectType('DESD', ExternalSchema, AdkExternalSchema, {\n endpoint: 'ddic/desd',\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 { BehaviorDefinition } from '../../../base/kinds';\nimport { registerObjectType } from '../../../base/registry';\nimport type { AdkCrudSourceContract } from '../../cds/source-object';\nimport { AdkCrudSourceObject } from '../../cds/crud-source-object';\n\ninterface BdefMetadata {\n blueSource?: {\n description?: string;\n masterLanguage?: string;\n abapLanguageVersion?: string;\n packageRef?: { name?: string };\n };\n}\n\nexport class AdkBehaviorDefinition extends AdkCrudSourceObject<BdefMetadata> {\n /** Static ADK kind marker — used by abapGit handler registry if needed. */\n static readonly kind = BehaviorDefinition;\n readonly kind = AdkBehaviorDefinition.kind;\n\n protected readonly objectType = 'BDEF';\n protected readonly endpoint = 'bo/behaviordefinitions';\n\n protected get contract(): AdkCrudSourceContract {\n return this.ctx.client.adt.bo\n .behaviordefinitions as unknown as AdkCrudSourceContract;\n }\n\n protected getMetadataKey(): 'blueSource' {\n return 'blueSource';\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 return this.getSourceObject(this, name, ctx);\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n return this.sourceObjectExists(this, name, ctx);\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 return this.createSourceSkeleton(\n this,\n {\n name,\n description,\n packageName,\n transport: options?.transport,\n ctx,\n rootKey: 'blueSource',\n objectTypeCode: 'BDEF/BDO',\n responsible: packageName.toUpperCase(),\n },\n context.client.adt.bo.behaviordefinitions.post.bind(\n context.client.adt.bo.behaviordefinitions,\n ),\n );\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 return AdkCrudSourceObject.deleteSource(\n name,\n options,\n context.client.adt.bo.behaviordefinitions.delete.bind(\n context.client.adt.bo.behaviordefinitions,\n ),\n );\n }\n}\n\nregisterObjectType('BDEF', BehaviorDefinition, AdkBehaviorDefinition, {\n endpoint: 'bo/behaviordefinitions',\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 private _description?: string;\n private _package?: string;\n\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).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 /** Description from the ENHO metadata, falling back to the object name. */\n get description(): string {\n return this._description || this.name;\n }\n\n /** Package name from the ENHO metadata. */\n get package(): string {\n return this._package || '';\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 const data = (await this.contract.get(this.name)) as any;\n const impl = data?.enhancementImplementation ?? data;\n this._description = impl?.description ?? '';\n this._package = impl?.packageRef?.name ?? '';\n return data;\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 * Classic BAdI — read-only ADK models for SXSD/XD and SXCI/XI metadata.\n *\n * Served via vit/wb Basic Object Properties:\n * GET /sap/bc/adt/vit/wb/object_type/sxsdxd/object_name/{name}\n * GET /sap/bc/adt/vit/wb/object_type/sxcixi/object_name/{name}\n */\n\nimport { getGlobalContext } from '../../../base/global-context';\nimport type { AdkContext } from '../../../base/context';\nimport type { BasicObjectPropertiesResponse } from '@abapify/adt-contracts';\n\ninterface ClassicBadiInput {\n name: string;\n ctx?: AdkContext;\n}\n\nfunction isNotFound(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n (error as { status?: unknown }).status === 404\n );\n}\n\nabstract class AdkClassicBadiBase {\n readonly name: string;\n protected readonly ctx: AdkContext;\n\n constructor(input: { ctx: AdkContext; name: string }) {\n this.ctx = input.ctx;\n this.name = input.name.toUpperCase();\n }\n\n abstract get kind(): string;\n abstract get objectUri(): string;\n abstract getMetadata(): Promise<BasicObjectPropertiesResponse>;\n\n static async get<T extends AdkClassicBadiBase>(\n this: { new (input: { ctx: AdkContext; name: string }): T },\n input: ClassicBadiInput,\n ): Promise<T> {\n const context = input.ctx ?? getGlobalContext();\n const obj = new this({ ctx: context, name: input.name });\n await obj.getMetadata();\n return obj;\n }\n\n static async exists<T extends AdkClassicBadiBase>(\n this: { new (input: { ctx: AdkContext; name: string }): T },\n input: ClassicBadiInput,\n ): Promise<boolean> {\n try {\n const ctor = this as unknown as {\n get(input: ClassicBadiInput): Promise<T>;\n };\n await ctor.get(input);\n return true;\n } catch (error) {\n if (!isNotFound(error)) throw error;\n return false;\n }\n }\n}\n\nexport class AdkClassicBadiDefinition extends AdkClassicBadiBase {\n readonly kind = 'ClassicBadiDefinition' as const;\n\n get objectUri(): string {\n return `/sap/bc/adt/vit/wb/object_type/sxsdxd/object_name/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n async getMetadata(): Promise<BasicObjectPropertiesResponse> {\n return await this.ctx.client.adt.vit.wb.objectProperties.getDefinition(\n this.name,\n );\n }\n}\n\nexport class AdkClassicBadiImplementation extends AdkClassicBadiBase {\n readonly kind = 'ClassicBadiImplementation' as const;\n\n get objectUri(): string {\n return `/sap/bc/adt/vit/wb/object_type/sxcixi/object_name/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n async getMetadata(): Promise<BasicObjectPropertiesResponse> {\n return await this.ctx.client.adt.vit.wb.objectProperties.getImplementation(\n this.name,\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 { ServiceDefinition } from '../../../base/kinds';\nimport { registerObjectType } from '../../../base/registry';\nimport type { AdkCrudSourceContract } from '../../cds/source-object';\nimport { AdkCrudSourceObject } from '../../cds/crud-source-object';\n\ninterface SrvdMetadata {\n srvdSource?: {\n description?: string;\n masterLanguage?: string;\n abapLanguageVersion?: string;\n packageRef?: { name?: string };\n sourceOrigin?: string;\n srvdSourceType?: string;\n };\n}\n\nexport class AdkServiceDefinition extends AdkCrudSourceObject<SrvdMetadata> {\n /** Static ADK kind marker — used by abapGit handler registry if needed. */\n static readonly kind = ServiceDefinition;\n readonly kind = AdkServiceDefinition.kind;\n\n protected readonly objectType = 'SRVD';\n protected readonly endpoint = 'ddic/srvd/sources';\n\n protected get contract(): AdkCrudSourceContract {\n return this.ctx.client.adt.ddic.srvd\n .sources as unknown as AdkCrudSourceContract;\n }\n\n protected getMetadataKey(): 'srvdSource' {\n return 'srvdSource';\n }\n\n get sourceOrigin(): string | undefined {\n return this.metadata?.srvdSource?.sourceOrigin;\n }\n\n get sourceType(): string | undefined {\n return this.metadata?.srvdSource?.srvdSourceType;\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 return this.getSourceObject(this, name, ctx);\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n return this.sourceObjectExists(this, name, ctx);\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 return this.createSourceSkeleton(\n this,\n {\n name,\n description,\n packageName,\n transport: options?.transport,\n ctx,\n rootKey: 'srvdSource',\n objectTypeCode: 'SRVD/SRV',\n responsible: packageName.toUpperCase(),\n },\n context.client.adt.ddic.srvd.sources.post.bind(\n context.client.adt.ddic.srvd.sources,\n ),\n );\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 return AdkCrudSourceObject.deleteSource(\n name,\n options,\n context.client.adt.ddic.srvd.sources.delete.bind(\n context.client.adt.ddic.srvd.sources,\n ),\n );\n }\n}\n\nregisterObjectType('SRVD', ServiceDefinition, AdkServiceDefinition, {\n endpoint: 'ddic/srvd/sources',\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';\nimport { ServiceBinding } from '../../../base/kinds';\nimport { registerObjectType } from '../../../base/registry';\n\nexport class AdkServiceBinding {\n /** Static ADK kind marker — used by abapGit handler registry if needed. */\n static readonly kind = ServiceBinding;\n readonly kind = AdkServiceBinding.kind;\n\n readonly name: string;\n protected readonly ctx: AdkContext;\n\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).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 async load(): Promise<this> {\n await this.getMetadata();\n return this;\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\nregisterObjectType('SRVB', ServiceBinding, AdkServiceBinding, {\n endpoint: 'businessservices/bindings',\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\nfunction transportResponseName(response: TransportData): string {\n if (response.object_type === 'T') {\n const taskNumber = asArray(response.task)[0]?.number;\n if (taskNumber) return taskNumber;\n }\n if (response.name) return response.name;\n return response.request?.number || '';\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: transportResponseName(dataOrNumber),\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 // useraction=\"release\" against the base transportrequests URI is a\n // silent no-op (HTTP 200, empty body, no state change). SAP's own GET\n // response advertises the real release action as the newreleasejobs\n // sub-resource link (rel=\"http://www.sap.com/cts/relations/newreleasejobs\")\n // - that is the endpoint that actually transitions status D -> R.\n await this.ctx.client.fetch(`${this.objectUri}/newreleasejobs`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/vnd.sap.adt.transportorganizer.v1+xml',\n Accept: 'application/vnd.sap.adt.transportorganizer.v1+xml',\n },\n body: '',\n });\n\n // Re-fetch from SAP rather than assume success - a 200 response from\n // the useraction endpoint above was never proof of a state change.\n // If the reload itself fails, report that the release POST succeeded\n // but verification could not be completed — do not conflate it with a\n // release failure, since SAP may have actually released the transport.\n try {\n await this.load();\n } catch (reloadError) {\n return {\n success: false,\n message: `Released ${this.number} but failed to verify: ${reloadError instanceof Error ? reloadError.message : String(reloadError)}`,\n };\n }\n if (this.status !== 'R') {\n return {\n success: false,\n message: `SAP did not release ${this.number} (status: ${this.statusText})`,\n };\n }\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 },\n {\n root: {\n number: this.number,\n useraction: 'changeowner',\n targetuser: newOwner,\n },\n },\n );\n\n const verified = await AdkTransportRequest.get(this.number, this.ctx);\n if (verified.owner.toUpperCase() !== newOwner.toUpperCase()) {\n throw new Error(\n `Transport ${this.number} owner verification failed: expected ${newOwner}, found ${verified.owner || '<empty>'}`,\n );\n }\n\n (this.itemData as { owner?: string }).owner = verified.owner;\n\n if (recursive) {\n for (const task of this.tasks) {\n if (task.status === 'D') {\n await task.reassign(newOwner);\n }\n }\n }\n }\n\n /** Create and verify a modifiable task under this request. */\n async addTask(owner: string): Promise<AdkTransportTask> {\n if (this.itemType !== 'request') {\n throw new Error(`Transport ${this.number} is a task, not a request`);\n }\n if (this.status !== 'D') {\n throw new Error(\n `Transport ${this.number} is not modifiable: expected status D, found ${this.status}`,\n );\n }\n\n const existingTasks = new Set(this.tasks.map((task) => task.number));\n const response =\n await this.ctx.client.adt.cts.transportrequests.useraction.addTask(\n this.number,\n { owner },\n { root: { targetuser: owner } },\n );\n\n const returnedNumber = response.root.number;\n if (!returnedNumber) {\n throw new Error(\n `Task creation verification failed for ${this.number}: SAP response did not contain a task number`,\n );\n }\n const verified = await AdkTransportRequest.get(this.number, this.ctx);\n const created = verified.tasks.find(\n (task) =>\n task.number === returnedNumber &&\n !existingTasks.has(task.number) &&\n task.owner.toUpperCase() === owner.toUpperCase(),\n );\n if (!created) {\n throw new Error(\n `Task creation verification failed for ${this.number}: no new task owned by ${owner}`,\n );\n }\n if (created.status !== 'D') {\n throw new Error(\n `Task creation verification failed for ${created.number}: expected status D, found ${created.status}`,\n );\n }\n this._tasks = verified.tasks;\n this._objects = undefined;\n return created;\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., 'TRLK900001')\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 | TransportObjectData[] | 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., 'TRLK900001')\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 target?: 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 private readonly requestedNumber: string,\n ) {}\n\n // ===========================================================================\n // Properties\n // ===========================================================================\n\n /** Transport number */\n get number(): string {\n if (this.data.object_type === 'T') {\n const task = asArray(this.data.task).find(\n (candidate) => candidate.number?.toUpperCase() === this.requestedNumber,\n );\n return task?.number ?? this.requestedNumber;\n }\n return this.data.request?.number ?? this.data.name ?? this.requestedNumber;\n }\n\n private get itemData(): TransportTaskData {\n if (this.data.object_type === 'T') {\n const directTasks = asArray(this.data.task);\n return (\n directTasks.find(\n (task) => task.number?.toUpperCase() === this.requestedNumber,\n ) ??\n directTasks[0] ??\n this.data.request ??\n {}\n );\n }\n return this.data.request ?? {};\n }\n\n /** Transport description */\n get description(): string {\n return this.itemData.desc ?? '';\n }\n\n /** Transport owner */\n get owner(): string {\n return this.itemData.owner ?? '';\n }\n\n /** Transport status (D=Modifiable, R=Released) */\n get status(): string {\n return this.itemData.status ?? '';\n }\n\n /** Transport status text */\n get statusText(): string {\n return this.itemData.status_text ?? '';\n }\n\n /** Transport target system */\n get target(): string {\n return this.itemData.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 requestedNumber = number.trim().toUpperCase();\n const response =\n await context.client.adt.cts.transportrequests.get(requestedNumber);\n // Unwrap the root element from the response\n return new AdkTransport(context, response.root, requestedNumber);\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 concrete request or task that supplied it. */\n sourceTransportMap: Map<string, string>;\n /** Requested roots/tasks plus observed child tasks, in stable order. */\n scopeTransportNumbers: 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\nfunction getTransportObjectKey(object: TransportObjectData): string {\n return `${object.pgmid ?? ''}/${object.type ?? ''}/${object.name ?? ''}`;\n}\n\nfunction getConcreteSourceTransportMap(\n transport: AdkTransport,\n requestedNumber: string,\n): Map<string, string> {\n const sourceTransportMap = new Map<string, string>();\n const data = transport.raw;\n const requestNumber =\n data.request?.number || transport.number || requestedNumber;\n\n const addSource = (\n object: TransportObjectData,\n sourceTransport: string,\n ): void => {\n const key = getTransportObjectKey(object);\n if (!sourceTransportMap.has(key)) {\n sourceTransportMap.set(key, sourceTransport);\n }\n };\n\n // Direct request objects have concrete request provenance.\n for (const object of asArray(data.request?.abap_object)) {\n addSource(object, requestNumber);\n }\n\n // Prefer concrete task provenance over the aggregate all_objects view.\n const tasks = [...asArray(data.request?.task), ...asArray(data.task)];\n for (const task of tasks) {\n const taskNumber = task.number || transport.number || requestedNumber;\n for (const object of asArray(task.abap_object)) {\n addSource(object, taskNumber);\n }\n }\n\n // all_objects is an aggregate without task attribution, so use it only as\n // a fallback for keys not exposed by the concrete request/task containers.\n for (const object of asArray(data.request?.all_objects?.abap_object)) {\n addSource(object, requestNumber);\n }\n\n return sourceTransportMap;\n}\n\nfunction addScopeTransportNumber(\n number: string,\n scopeTransportNumbers: string[],\n seenScopeTransportNumbers: Set<string>,\n): void {\n if (!number || seenScopeTransportNumbers.has(number)) return;\n seenScopeTransportNumbers.add(number);\n scopeTransportNumbers.push(number);\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 const scopeTransportNumbers: string[] = [];\n const seenScopeTransportNumbers = new Set<string>();\n\n const transports = await Promise.all(\n transportNumbers.map((number) => AdkTransport.get(number, ctx)),\n );\n const seenObjectKeys = new Set<string>();\n\n for (const [index, transport] of transports.entries()) {\n const requestedNumber = transportNumbers[index] ?? '';\n const transportNumber = transport.number || requestedNumber;\n addScopeTransportNumber(\n transportNumber,\n scopeTransportNumbers,\n seenScopeTransportNumbers,\n );\n addScopeTransportNumber(\n transport.raw.request?.number ?? '',\n scopeTransportNumbers,\n seenScopeTransportNumbers,\n );\n for (const task of transport.tasks) {\n addScopeTransportNumber(\n task.number,\n scopeTransportNumbers,\n seenScopeTransportNumbers,\n );\n }\n\n const concreteSources = getConcreteSourceTransportMap(\n transport,\n requestedNumber,\n );\n for (const object of getFilteredObjects(transport, selector)) {\n const sourceTransport =\n concreteSources.get(object.key) ?? transportNumber;\n addResolvedObject(\n object,\n sourceTransport,\n objects,\n sourceTransportMap,\n seenObjectKeys,\n );\n }\n }\n\n return { objects, sourceTransportMap, scopeTransportNumbers };\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","/**\n * ADK v2 - Generic Factory\n *\n * Single entry point for creating ADK objects.\n * Resolves ADT types to correct ADK object implementations.\n *\n * Resolution methods:\n * - get(name, adtType) - By name and ADT type (unique identifier)\n * - byKind(kind, name) - By ADK kind (type-safe)\n * - fromXml(xml) - Parse from XML response\n * - create(adtType) - Create new object (deferred)\n */\n\nimport type { AdkContext } from './base/context';\nimport type { AdkObject } from './base/model';\nimport type { AdkKind, AdkObjectForKind } from './base/kinds';\nimport {\n resolveType,\n resolveKind,\n parseAdtType,\n type AdkRegistrable,\n} from './base/registry';\n\n// ============================================\n// XML Parsing Utilities\n// ============================================\n\n/** Pattern to extract adtcore:type from XML */\nconst TYPE_PATTERN = /adtcore:type=\"([^\"]+)\"/;\n\n/** Pattern to extract adtcore:name from XML */\nconst NAME_PATTERN = /adtcore:name=\"([^\"]+)\"/;\n\n/**\n * Extract ADT type and name from XML\n *\n * Relies on adtcore:type and adtcore:name attributes which are\n * the standard identifiers in ADT XML responses.\n *\n * @param xml - XML string from ADT response\n * @returns Extracted type and name, or undefined if not found\n */\nexport function parseXmlIdentity(\n xml: string,\n): { type: string; name: string } | undefined {\n const typeMatch = xml.match(TYPE_PATTERN);\n const nameMatch = xml.match(NAME_PATTERN);\n\n if (typeMatch && nameMatch) {\n return {\n type: typeMatch[1],\n name: nameMatch[1],\n };\n }\n\n return undefined;\n}\n\n// ============================================\n// Generic Object (Fallback)\n// ============================================\n\n/**\n * Generic ADK object for unregistered types\n *\n * Provides core functionality (adtcore attributes, links)\n * without type-specific features.\n */\nexport class AdkGenericObject {\n readonly adtType: string;\n readonly adtMainType: string;\n readonly adtSubType?: string;\n\n protected readonly ctx: AdkContext;\n protected _name: string;\n protected _data?: unknown;\n\n constructor(ctx: AdkContext, name: string, adtType: string) {\n this.ctx = ctx;\n this._name = name;\n\n const parsed = parseAdtType(adtType);\n this.adtType = parsed.full;\n this.adtMainType = parsed.main;\n this.adtSubType = parsed.sub;\n }\n\n get name(): string {\n return this._name;\n }\n get type(): string {\n return this.adtType;\n }\n\n /** Check if data is loaded */\n get isLoaded(): boolean {\n return this._data !== undefined;\n }\n\n /** Get raw data (if loaded) */\n get data(): unknown {\n return this._data;\n }\n\n /** Set data (for manual population) */\n setData(data: unknown): void {\n this._data = data;\n }\n}\n\n// ============================================\n// Factory Interface\n// ============================================\n\n/**\n * ADK Factory - Generic object creation\n */\nexport interface AdkFactory {\n /** Context used by this factory */\n readonly ctx: AdkContext;\n\n /**\n * Get object by name and ADT type\n *\n * Supports both full types (DEVC/K) and main types (DEVC).\n * Returns deferred object - call load() to fetch data.\n *\n * @example\n * const pkg = factory.get('ZPACKAGE', 'DEVC/K');\n * await pkg.load();\n *\n * const cls = factory.get('ZCL_TEST', 'CLAS');\n * await cls.load();\n */\n get(\n name: string,\n adtType: string,\n ): AdkObject | AdkGenericObject | AdkRegistrable;\n\n /**\n * Get object with initial data (for deserialization)\n *\n * Creates object pre-populated with data - no load() needed.\n * Used when deserializing from files rather than loading from SAP.\n *\n * @example\n * const cls = factory.getWithData({ name: 'ZCL_TEST', description: 'Test' }, 'CLAS');\n * // cls.isLoaded is true, no need to call load()\n */\n getWithData(\n data: Record<string, unknown>,\n adtType: string,\n ): AdkObject | AdkGenericObject | AdkRegistrable;\n\n /**\n * Get object by ADK kind (type-safe)\n *\n * Returns correctly typed object based on kind.\n * TypeScript infers the concrete return type from the kind parameter.\n *\n * @example\n * import { Class, Interface } from '@abapify/adk';\n * const cls = factory.byKind(Class, 'ZCL_TEST'); // → AdkClass\n * const intf = factory.byKind(Interface, 'ZIF_TEST'); // → AdkInterface\n */\n byKind<K extends AdkKind>(kind: K, name: string): AdkObjectForKind<K>;\n\n /**\n * Create object from XML response\n *\n * Parses XML to extract type and name, then constructs\n * the correct object type.\n *\n * @example\n * const xml = await client.fetch('/sap/bc/adt/oo/classes/ZCL_TEST');\n * const cls = factory.fromXml(xml);\n */\n fromXml(\n xml: string,\n ): AdkObject | AdkGenericObject | AdkRegistrable | undefined;\n\n /**\n * Create new object (for creation workflows)\n *\n * Returns deferred object without name - used when\n * creating new objects in SAP.\n */\n create(adtType: string): AdkObject | AdkGenericObject | AdkRegistrable;\n}\n\n// ============================================\n// Factory Implementation\n// ============================================\n\n/**\n * Create ADK factory\n *\n * @param ctx - ADK context with services\n * @returns Factory instance\n */\nexport function createAdkFactory(ctx: AdkContext): AdkFactory {\n return {\n ctx,\n\n get(\n name: string,\n adtType: string,\n ): AdkObject | AdkGenericObject | AdkRegistrable {\n const entry = resolveType(adtType);\n\n if (entry) {\n return new entry.constructor(ctx, name);\n }\n\n // Fallback to generic object\n return new AdkGenericObject(ctx, name, adtType);\n },\n\n getWithData(\n data: Record<string, unknown>,\n adtType: string,\n ): AdkObject | AdkGenericObject | AdkRegistrable {\n const entry = resolveType(adtType);\n\n if (entry) {\n // Pass data directly to constructor - it will extract name from data.name\n return new entry.constructor(ctx, data);\n }\n\n // Fallback to generic object with name from data\n const obj = new AdkGenericObject(\n ctx,\n (data as { name?: string }).name ?? '',\n adtType,\n );\n obj.setData(data);\n return obj;\n },\n\n byKind<K extends AdkKind>(kind: K, name: string): AdkObjectForKind<K> {\n const entry = resolveKind(kind);\n\n if (!entry) {\n throw new Error(`No constructor registered for kind: ${kind}`);\n }\n\n // Type assertion: registry guarantees correct constructor for kind\n return new entry.constructor(ctx, name) as AdkObjectForKind<K>;\n },\n\n fromXml(\n xml: string,\n ): AdkObject | AdkGenericObject | AdkRegistrable | undefined {\n const identity = parseXmlIdentity(xml);\n\n if (!identity) {\n return undefined;\n }\n\n return this.get(identity.name, identity.type);\n },\n\n create(adtType: string): AdkObject | AdkGenericObject | AdkRegistrable {\n // Create with empty name - will be set during creation workflow\n return this.get('', adtType);\n },\n };\n}\n\n// ============================================\n// Convenience: Create factory from ADT client\n// ============================================\n\n// Factory is the boundary - imports AdtClient directly from adt-client\nimport type { AdtClient } from '@abapify/adt-client';\n\n/**\n * Create ADK factory from ADT client\n *\n * Builds context from client and returns factory.\n * This is the main entry point for most users.\n *\n * @example\n * import { createAdtClient } from '@abapify/adt-client';\n * import { createAdk } from '@abapify/adk';\n *\n * const client = createAdtClient({ ... });\n * const adk = createAdk(client);\n *\n * const cls = adk.get('ZCL_TEST', 'CLAS');\n * await cls.load();\n */\nexport function createAdk(client: AdtClient): AdkFactory {\n // Build context with client reference\n // Objects access client via ctx.client\n const ctx: AdkContext = {\n client,\n };\n\n return createAdkFactory(ctx);\n}\n","import { assertAdtUri, type SourceVersionRef } from '@abapify/adt-client';\nimport type { AdkContext } from './base/context';\nimport { getGlobalContext } from './base/global-context';\nimport { getEndpointForType, normalizeObjectName } from './base/registry';\nimport { createAdkFactory } from './factory';\nimport { AdkFunctionModule } from './objects/repository/fugr';\nimport {\n resolveTransportObjects,\n type ResolvedTransportObjects,\n type TransportObjectSelector,\n} from './objects/cts';\n\nexport type TransportSourceChangeKind =\n 'added' | 'modified' | 'deleted' | 'ambiguous' | 'unsupported' | 'failed';\n\nexport type SourceHistoryDiagnosticCode =\n | 'DELETED_SOURCE_BASE_UNAVAILABLE'\n | 'OBJECT_METADATA_LOAD_FAILED'\n | 'OBJECT_METADATA_UNAVAILABLE'\n | 'OBJECT_TYPE_UNSUPPORTED'\n | 'SOURCE_COMPONENT_NOT_FOUND'\n | 'SOURCE_COMPONENTS_UNAVAILABLE'\n | 'SOURCE_COMPONENT_URI_UNSAFE'\n | 'SOURCE_COMPONENT_VERSIONS_UNAVAILABLE'\n | 'SOURCE_HISTORY_INTERVENING_VERSION'\n | 'SOURCE_HISTORY_ORDER_INVALID'\n | 'SOURCE_HISTORY_PROVENANCE_MISSING'\n | 'SOURCE_HISTORY_RETRIEVAL_FAILED'\n | 'SOURCE_HISTORY_SCOPE_VERSION_MISSING';\n\nexport interface SourceHistoryDiagnostic {\n code: SourceHistoryDiagnosticCode;\n message: string;\n}\n\nexport type TransportSourceDiagnostic = SourceHistoryDiagnostic;\n\nexport interface ObjectSourceHistoryIdentity {\n name: string;\n type: string;\n packageName?: string;\n}\n\nexport interface ListObjectSourceVersionsOptions {\n component?: string;\n}\n\nexport type ObjectSourceVersionsComponent =\n | (TransportSourceManifestComponent & {\n versions: SourceVersionRef[];\n diagnostic?: never;\n })\n | (TransportSourceManifestComponent & {\n versions?: never;\n diagnostic: SourceHistoryDiagnostic;\n });\n\nexport interface ObjectSourceVersionsResult {\n object: ObjectSourceHistoryIdentity;\n components: ObjectSourceVersionsComponent[];\n}\n\nexport type ObjectSourceHistoryErrorCode =\n | 'OBJECT_METADATA_LOAD_FAILED'\n | 'OBJECT_METADATA_UNAVAILABLE'\n | 'OBJECT_TYPE_UNSUPPORTED'\n | 'SOURCE_COMPONENT_NOT_FOUND'\n | 'SOURCE_COMPONENTS_UNAVAILABLE';\n\n/** Stable public failure for errors that occur before a component result exists. */\nexport class ObjectSourceHistoryError extends Error {\n override readonly name = 'ObjectSourceHistoryError';\n\n constructor(\n readonly code: ObjectSourceHistoryErrorCode,\n message: string,\n readonly object: ObjectSourceHistoryIdentity,\n ) {\n super(message);\n }\n}\n\nexport interface TransportSourceVersionSelection {\n changeKind: TransportSourceChangeKind;\n exact: boolean;\n base?: SourceVersionRef;\n head?: SourceVersionRef;\n diagnostic?: TransportSourceDiagnostic;\n}\n\nexport interface TransportSourceManifestObject {\n pgmid: string;\n type: string;\n name: string;\n packageName?: string;\n}\n\nexport interface TransportSourceManifestComponent {\n id: string;\n sourceUri?: string;\n versionsUri?: string;\n}\n\nexport interface TransportSourceManifestEntry extends TransportSourceVersionSelection {\n object: TransportSourceManifestObject;\n repositoryObject?: TransportSourceManifestObject;\n component: TransportSourceManifestComponent;\n sourceTransport: string;\n}\n\nexport interface TransportObjectInventoryEntry {\n pgmid: string;\n type: string;\n name: string;\n wbtype?: string;\n uri?: string;\n objFunc: string;\n sourceTransport: string;\n}\n\nexport interface TransportSourceManifest {\n requestedTransports: string[];\n scopeTransports: string[];\n inventory: TransportObjectInventoryEntry[];\n entries: TransportSourceManifestEntry[];\n}\n\nexport interface BuildTransportSourceManifestOptions {\n selector?: TransportObjectSelector;\n concurrency?: number;\n}\n\ninterface RuntimeLink {\n href?: unknown;\n rel?: unknown;\n}\n\ninterface DiscoveredComponent extends TransportSourceManifestComponent {\n diagnostic?: TransportSourceDiagnostic;\n}\n\nconst VERSIONS_RELATION = 'http://www.sap.com/adt/relations/versions';\nconst DEFAULT_CONCURRENCY = 4;\nconst MAX_CONCURRENCY = 32;\nconst RELATIVE_URI_TRAVERSAL = /(?:^|\\/)(?:\\.{1,2}|%2e(?:%2e)?)(?:\\/|$)/i;\nconst NON_SOURCE_CTS_OBJECT_KEYS = new Set(['R3TR/SUSK']);\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object'\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction asArray(value: unknown): unknown[] {\n if (value === undefined || value === null) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction uniqueStable(values: readonly string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const value of values) {\n const normalized = value.trim().toUpperCase();\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n result.push(normalized);\n }\n return result;\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n\n/**\n * Some CTS entries represent SAP-maintained configuration rather than\n * repository source. They have neither an ADK source model nor an abapGit\n * representation, so they must not participate in a source-boundary manifest.\n */\nfunction isNonSourceCtsObject(reference: {\n pgmid: string;\n type: string;\n}): boolean {\n return NON_SOURCE_CTS_OBJECT_KEYS.has(\n `${reference.pgmid.trim().toUpperCase()}/${reference.type.trim().toUpperCase()}`,\n );\n}\n\nfunction isUnsafeRelativeHref(href: string): boolean {\n return (\n href.startsWith('//') ||\n href.includes('\\\\') ||\n href.includes(':') ||\n RELATIVE_URI_TRAVERSAL.test(href)\n );\n}\n\nfunction resolveAdtRelativeUri(\n href: string,\n objectUri: string,\n): string | undefined {\n try {\n const safeObjectUri = assertAdtUri(objectUri);\n if (href.startsWith('/')) return assertAdtUri(href);\n if (isUnsafeRelativeHref(href)) return undefined;\n\n const directoryBase = safeObjectUri.endsWith('/')\n ? safeObjectUri\n : `${safeObjectUri}/`;\n const resolved = new URL(href, `https://adt.invalid${directoryBase}`);\n return assertAdtUri(\n `${resolved.pathname}${resolved.search}${resolved.hash}`,\n );\n } catch {\n return undefined;\n }\n}\n\nfunction runtimeLinks(value: Record<string, unknown>): RuntimeLink[] {\n return [...asArray(value['link']), ...asArray(value['links'])]\n .map(asRecord)\n .filter((link): link is Record<string, unknown> => Boolean(link));\n}\n\nfunction discoverComponent(\n value: Record<string, unknown>,\n id: string,\n objectUri: string,\n): DiscoveredComponent | undefined {\n const sourceHref = nonEmptyString(value['sourceUri']);\n if (!sourceHref) return undefined;\n\n const sourceUri = resolveAdtRelativeUri(sourceHref, objectUri);\n const versionsHref = runtimeLinks(value)\n .filter((link) => link.rel === VERSIONS_RELATION)\n .map((link) => nonEmptyString(link.href))\n .find((href): href is string => Boolean(href));\n const versionsUri = versionsHref\n ? resolveAdtRelativeUri(versionsHref, objectUri)\n : undefined;\n\n if (!sourceUri) {\n return {\n id,\n diagnostic: {\n code: 'SOURCE_COMPONENT_URI_UNSAFE',\n message: 'The source component exposes an unsafe ADT URI.',\n },\n };\n }\n if (versionsHref && !versionsUri) {\n return {\n id,\n diagnostic: {\n code: 'SOURCE_COMPONENT_URI_UNSAFE',\n message: 'The source component exposes an unsafe ADT URI.',\n },\n };\n }\n\n return {\n id,\n sourceUri,\n ...(versionsUri ? { versionsUri } : {}),\n };\n}\n\nfunction discoverSourceComponents(\n metadata: Record<string, unknown>,\n objectUri: string,\n): DiscoveredComponent[] {\n const candidates: DiscoveredComponent[] = [];\n const root = discoverComponent(metadata, 'main', objectUri);\n if (root) candidates.push(root);\n\n for (const [index, rawInclude] of asArray(metadata['include']).entries()) {\n const include = asRecord(rawInclude);\n if (!include) continue;\n const id =\n nonEmptyString(include['includeType']) ??\n nonEmptyString(include['name']) ??\n `include-${index + 1}`;\n const component = discoverComponent(include, id, objectUri);\n if (component) candidates.push(component);\n }\n\n candidates.sort(\n (left, right) =>\n compareText(left.id, right.id) ||\n compareText(left.sourceUri ?? '', right.sourceUri ?? '') ||\n compareText(left.versionsUri ?? '', right.versionsUri ?? ''),\n );\n\n const seen = new Set<string>();\n return candidates.filter((candidate) => {\n const key = `${candidate.sourceUri ?? ''}\\u0000${candidate.versionsUri ?? ''}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nfunction loadedMetadata(loaded: unknown): Record<string, unknown> | undefined {\n const object = asRecord(loaded);\n if (!object) return undefined;\n const dataSync = asRecord(object['dataSync']);\n if (dataSync) return dataSync;\n return asRecord(object['data']);\n}\n\nfunction packageNameFrom(\n metadata: Record<string, unknown>,\n): string | undefined {\n const packageRef = asRecord(metadata['packageRef']);\n return (\n nonEmptyString(packageRef?.['name']) ??\n nonEmptyString(metadata['packageName'])\n );\n}\n\nfunction normalizeSourceHistoryIdentity(\n objectName: string,\n objectType: string,\n): ObjectSourceHistoryIdentity {\n const type = objectType.trim().toUpperCase();\n const requestedName = objectName.trim().toUpperCase();\n const name = normalizeObjectName(requestedName, type)[0] ?? requestedName;\n return { name, type };\n}\n\ninterface ObjectSourceDiscovery {\n object: ObjectSourceHistoryIdentity;\n components: DiscoveredComponent[];\n}\n\nfunction ensureObjectLoadable(\n modelRecord: Record<string, unknown> | undefined,\n object: ObjectSourceHistoryIdentity,\n): () => unknown {\n const load = modelRecord?.['load'];\n if (typeof load !== 'function') {\n throw new ObjectSourceHistoryError(\n 'OBJECT_TYPE_UNSUPPORTED',\n 'The repository object type has no loadable ADK model.',\n object,\n );\n }\n return load as () => unknown;\n}\n\nasync function loadObjectModel(\n model: unknown,\n load: () => unknown,\n object: ObjectSourceHistoryIdentity,\n): Promise<void> {\n try {\n await load.call(model);\n } catch {\n throw new ObjectSourceHistoryError(\n 'OBJECT_METADATA_LOAD_FAILED',\n 'SAP ADT rejected repository object metadata retrieval.',\n object,\n );\n }\n}\n\nfunction ensureObjectMetadata(\n model: unknown,\n object: ObjectSourceHistoryIdentity,\n): { metadata: Record<string, unknown>; objectUri: string } {\n const modelRecord = asRecord(model);\n const metadata = loadedMetadata(model);\n if (!metadata) {\n throw new ObjectSourceHistoryError(\n 'OBJECT_METADATA_UNAVAILABLE',\n 'The loaded object has no usable ADT metadata identity.',\n object,\n );\n }\n const objectUri = nonEmptyString(modelRecord?.['objectUri']);\n if (!objectUri) {\n throw new ObjectSourceHistoryError(\n 'OBJECT_METADATA_UNAVAILABLE',\n 'The loaded object has no usable ADT metadata identity.',\n object,\n );\n }\n if (!resolveAdtRelativeUri('', objectUri)) {\n throw new ObjectSourceHistoryError(\n 'OBJECT_METADATA_UNAVAILABLE',\n 'The loaded object has no usable ADT metadata identity.',\n object,\n );\n }\n return { metadata, objectUri };\n}\n\nasync function discoverObjectSourceHistory(\n objectName: string,\n objectType: string,\n ctx: AdkContext,\n normalizeIdentity = true,\n functionGroupName?: string,\n): Promise<ObjectSourceDiscovery> {\n const object = normalizeIdentity\n ? normalizeSourceHistoryIdentity(objectName, objectType)\n : { name: objectName, type: objectType };\n let model: unknown;\n if (object.type === 'FUGR/FF' && functionGroupName) {\n try {\n model = await AdkFunctionModule.get(functionGroupName, object.name, ctx);\n } catch {\n throw new ObjectSourceHistoryError(\n 'OBJECT_METADATA_LOAD_FAILED',\n 'SAP ADT rejected repository object metadata retrieval.',\n object,\n );\n }\n } else {\n model = createAdkFactory(ctx).get(object.name, object.type);\n const load = ensureObjectLoadable(asRecord(model), object);\n await loadObjectModel(model, load, object);\n }\n\n const { metadata, objectUri } = ensureObjectMetadata(model, object);\n\n let packageName = packageNameFrom(metadata);\n // Function-module metadata has no top-level packageRef; inherit the\n // owning function group's package so the manifest entry stays scoped.\n if (!packageName && functionGroupName) {\n const fugrModel = createAdkFactory(ctx).get(functionGroupName, 'FUGR');\n const fugrLoad = ensureObjectLoadable(asRecord(fugrModel), {\n name: functionGroupName,\n type: 'FUGR',\n });\n await loadObjectModel(fugrModel, fugrLoad, {\n name: functionGroupName,\n type: 'FUGR',\n });\n const fugrMetadata = loadedMetadata(fugrModel);\n if (fugrMetadata) {\n packageName = packageNameFrom(fugrMetadata);\n }\n }\n const normalizedObject = {\n ...object,\n ...(packageName ? { packageName } : {}),\n };\n const components = discoverSourceComponents(metadata, objectUri);\n if (components.length === 0) {\n throw new ObjectSourceHistoryError(\n 'SOURCE_COMPONENTS_UNAVAILABLE',\n 'The object metadata exposes no source component.',\n normalizedObject,\n );\n }\n\n return { object: normalizedObject, components };\n}\n\nfunction normalizeConcurrency(value: number | undefined): number {\n if (value === undefined) return DEFAULT_CONCURRENCY;\n if (!Number.isFinite(value)) return DEFAULT_CONCURRENCY;\n return Math.max(1, Math.min(MAX_CONCURRENCY, Math.floor(value)));\n}\n\nasync function mapOrdered<T, R>(\n values: readonly T[],\n concurrency: number,\n worker: (value: T) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(values.length);\n let nextIndex = 0;\n const workers = Array.from(\n { length: Math.min(concurrency, values.length) },\n async () => {\n while (nextIndex < values.length) {\n const index = nextIndex;\n nextIndex += 1;\n const value = values[index];\n if (value !== undefined) results[index] = await worker(value);\n }\n },\n );\n await Promise.all(workers);\n return results;\n}\n\nfunction unavailableEntry(\n object: TransportSourceManifestObject,\n component: TransportSourceManifestComponent,\n sourceTransport: string,\n changeKind: 'unsupported' | 'failed',\n diagnostic: TransportSourceDiagnostic,\n): TransportSourceManifestEntry {\n return {\n object,\n component,\n sourceTransport,\n changeKind,\n exact: false,\n diagnostic,\n };\n}\n\nfunction selectedRangeDiagnostic(\n ordered: readonly SourceVersionRef[],\n newestIndex: number,\n oldestIndex: number,\n scope: ReadonlySet<string>,\n): TransportSourceDiagnostic | undefined {\n for (const candidate of ordered.slice(newestIndex, oldestIndex + 1)) {\n if (\n candidate.transports.some((transport) =>\n scope.has(transport.toUpperCase()),\n )\n ) {\n continue;\n }\n\n return candidate.transports.length === 0\n ? {\n code: 'SOURCE_HISTORY_PROVENANCE_MISSING',\n message:\n 'A source version in the selected history range has no transport provenance.',\n }\n : {\n code: 'SOURCE_HISTORY_INTERVENING_VERSION',\n message:\n 'An unrelated source version occurs between in-scope versions.',\n };\n }\n\n return undefined;\n}\n\n/**\n * Select immutable before/after references using SAP's observed feed ordinal.\n */\nexport function selectTransportSourceVersions( // NOSONAR - SAP feed-order selection is inherently branch-heavy; will be refactored in follow-up\n versions: readonly SourceVersionRef[],\n scopeTransportNumbers: readonly string[],\n deleted = false,\n): TransportSourceVersionSelection {\n const scope = new Set(\n scopeTransportNumbers.map((transport) => transport.toUpperCase()),\n );\n const ordinals = versions.map((version) => version.ordinal);\n if (\n ordinals.some((ordinal) => !Number.isSafeInteger(ordinal) || ordinal < 0) ||\n new Set(ordinals).size !== ordinals.length\n ) {\n return {\n changeKind: 'ambiguous',\n exact: false,\n diagnostic: {\n code: 'SOURCE_HISTORY_ORDER_INVALID',\n message: 'Source version ordinals do not define a unique feed order.',\n },\n };\n }\n\n const ordered = [...versions].sort(\n (left, right) => left.ordinal - right.ordinal,\n );\n const inScope = ordered\n .map((candidate, index) => ({ candidate, index }))\n .filter(({ candidate }) =>\n candidate.transports.some((transport) =>\n scope.has(transport.toUpperCase()),\n ),\n );\n\n if (deleted) {\n if (ordered.length === 0) {\n return {\n changeKind: 'unsupported',\n exact: false,\n diagnostic: {\n code: 'DELETED_SOURCE_BASE_UNAVAILABLE',\n message:\n 'The deleted component has no recoverable historical source.',\n },\n };\n }\n const oldestInScope = inScope.at(-1);\n if (!oldestInScope) {\n return {\n changeKind: 'ambiguous',\n exact: false,\n diagnostic: {\n code: 'SOURCE_HISTORY_SCOPE_VERSION_MISSING',\n message:\n 'No source version is attributed to the requested transport scope.',\n },\n };\n }\n const base = ordered[oldestInScope.index + 1];\n const rangeDiagnostic = selectedRangeDiagnostic(\n ordered,\n inScope[0]!.index,\n oldestInScope.index,\n scope,\n );\n if (rangeDiagnostic) {\n return {\n changeKind: 'ambiguous',\n exact: false,\n ...(base ? { base } : {}),\n diagnostic: rangeDiagnostic,\n };\n }\n return base\n ? { changeKind: 'deleted', exact: true, base }\n : {\n changeKind: 'unsupported',\n exact: false,\n diagnostic: {\n code: 'DELETED_SOURCE_BASE_UNAVAILABLE',\n message:\n 'The deleted component has no recoverable historical source.',\n },\n };\n }\n\n if (inScope.length === 0) {\n return {\n changeKind: 'ambiguous',\n exact: false,\n diagnostic: {\n code: 'SOURCE_HISTORY_SCOPE_VERSION_MISSING',\n message:\n 'No source version is attributed to the requested transport scope.',\n },\n };\n }\n\n const newest = inScope[0];\n const oldest = inScope.at(-1);\n if (!newest || !oldest) {\n throw new Error('Unreachable source-history selection state.');\n }\n\n const head = newest.candidate;\n const base = ordered[oldest.index + 1];\n const rangeDiagnostic = selectedRangeDiagnostic(\n ordered,\n newest.index,\n oldest.index,\n scope,\n );\n if (rangeDiagnostic) {\n return {\n changeKind: 'ambiguous',\n exact: false,\n ...(base ? { base } : {}),\n head,\n diagnostic: rangeDiagnostic,\n };\n }\n\n return base\n ? { changeKind: 'modified', exact: true, base, head }\n : { changeKind: 'added', exact: true, head };\n}\n\ntype TransportObjectReference = ResolvedTransportObjects['objects'][number];\n\ninterface RepositoryObjectReference {\n pgmid: string;\n type: string;\n name: string;\n isDeleted: boolean;\n functionGroupName?: string;\n}\n\nfunction repositoryNameFromUri(\n uri: string | undefined,\n type: string,\n): string | undefined {\n if (!uri) return undefined;\n const endpoint = getEndpointForType(type);\n if (!endpoint) return undefined;\n const prefix = `/sap/bc/adt/${endpoint}/`;\n if (!uri.startsWith(prefix)) return undefined;\n const encodedName = uri.slice(prefix.length).split('/')[0];\n if (!encodedName) return undefined;\n try {\n const name = decodeURIComponent(encodedName).trim().toUpperCase();\n return name || undefined;\n } catch {\n return undefined;\n }\n}\n\n// Some SAP releases expose a function-module change as R3TR/FUNC rather\n// than LIMU/FUNC. Function-module source history belongs to its function\n// group, whose identity is supplied by the ADT URI.\nfunction resolveFuncGroupReference(\n reference: TransportObjectReference,\n rawType: string,\n): RepositoryObjectReference | undefined {\n if (rawType !== 'FUNC') return undefined;\n const ownerName = repositoryNameFromUri(reference.uri, 'FUGR');\n if (!ownerName) return undefined;\n return {\n pgmid: 'R3TR',\n type: 'FUGR',\n name: ownerName,\n isDeleted: false,\n };\n}\n\nasync function resolveFuncGroupBySearch(\n reference: TransportObjectReference,\n context: AdkContext,\n): Promise<RepositoryObjectReference | undefined> {\n if (\n reference.pgmid.trim().toUpperCase() !== 'LIMU' ||\n reference.type.trim().toUpperCase() !== 'FUNC' ||\n reference.wbtype?.trim().toUpperCase().split('/')[0] !== 'FUGR'\n )\n return undefined;\n try {\n const result =\n (await context.client.adt.repository.informationsystem.search.quickSearch(\n { query: reference.name, maxResults: 10 },\n )) as Record<string, unknown>;\n // The quick-search response may nest references under\n // `objectReferences` or `mainObject`, or expose a top-level\n // `objectReference`. Accept all three shapes.\n const container =\n asRecord(result['objectReferences']) ?? asRecord(result['mainObject']);\n const raw = container?.['objectReference'] ?? result['objectReference'];\n const matches = (Array.isArray(raw) ? raw : [raw])\n .map(asRecord)\n .filter((item): item is Record<string, unknown> => Boolean(item));\n // Match by exact function-module name, then pick the first result\n // whose URI resolves to a FUGR owner. This avoids a same-named\n // non-FUGR object (e.g. FUGR/F) masking the valid function-group\n // result when it appears earlier in the response.\n const ownerName = matches\n .filter(\n (item) =>\n nonEmptyString(item['name'])?.toUpperCase() ===\n reference.name.trim().toUpperCase(),\n )\n .map((item) => repositoryNameFromUri(nonEmptyString(item['uri']), 'FUGR'))\n .find((name): name is string => Boolean(name));\n return ownerName\n ? {\n pgmid: 'R3TR',\n type: 'FUGR/FF',\n name: reference.name.trim().toUpperCase(),\n functionGroupName: ownerName,\n isDeleted: reference.isDeleted,\n }\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction resolveLimuReference(\n reference: TransportObjectReference,\n pgmid: string,\n rawType: string,\n): RepositoryObjectReference | undefined {\n if (pgmid !== 'LIMU') return undefined;\n const ownerType = reference.wbtype?.trim().toUpperCase();\n const ownerName = ownerType\n ? repositoryNameFromUri(reference.uri, ownerType)\n : undefined;\n if (ownerType && ownerName) {\n return {\n pgmid: 'R3TR',\n type: ownerType,\n name: ownerName,\n // A deleted leaf changes its owner. Only REPS preserves the legacy\n // whole-program deletion behavior when no R3TR parent is present.\n isDeleted: rawType === 'REPS' && reference.isDeleted,\n };\n }\n if (rawType === 'REPS') {\n return {\n pgmid: 'R3TR',\n type: 'PROG',\n name: reference.name.trim().toUpperCase(),\n isDeleted: reference.isDeleted,\n };\n }\n return undefined;\n}\n\nfunction fallbackReference(\n reference: TransportObjectReference,\n pgmid: string,\n rawTypeFull: string,\n): RepositoryObjectReference {\n return {\n pgmid,\n type: rawTypeFull,\n name: reference.name.trim().toUpperCase(),\n isDeleted: reference.isDeleted,\n };\n}\n\n/** Resolve a CTS object to the repository object that owns its source. */\nasync function repositoryObjectReference(\n reference: TransportObjectReference,\n context: AdkContext,\n): Promise<RepositoryObjectReference> {\n const pgmid = reference.pgmid.trim().toUpperCase();\n const rawTypeFull = reference.type.trim().toUpperCase();\n const rawType = rawTypeFull.split('/')[0] ?? '';\n return (\n resolveFuncGroupReference(reference, rawType) ??\n (await resolveFuncGroupBySearch(reference, context)) ??\n resolveLimuReference(reference, pgmid, rawType) ??\n fallbackReference(reference, pgmid, rawTypeFull)\n );\n}\n\nfunction selectorValues(value: string | string[] | undefined): string[] {\n if (value === undefined) return [];\n return (Array.isArray(value) ? value : [value]).map((item) =>\n item.trim().toUpperCase(),\n );\n}\n\nfunction selectorDimensionMatches(\n candidates: readonly string[],\n expected: string | string[] | undefined,\n): boolean {\n const values = selectorValues(expected);\n if (values.length === 0) return true;\n return values.some((value) => value === '*' || candidates.includes(value));\n}\n\nfunction manifestSelectorMatches(\n original: TransportObjectReference,\n repository: RepositoryObjectReference,\n selector: TransportObjectSelector | undefined,\n): boolean {\n if (!selector) return true;\n const repositoryType = repository.type.trim().toUpperCase();\n const repositoryMainType = repositoryType.split('/')[0] ?? '';\n return (\n selectorDimensionMatches(\n [original.objFunc.trim().toUpperCase()],\n selector.objFunc,\n ) &&\n selectorDimensionMatches(\n [original.pgmid.trim().toUpperCase(), repository.pgmid],\n selector.pgmid,\n ) &&\n selectorDimensionMatches(\n [\n original.type.trim().toUpperCase(),\n repositoryType,\n ...(repositoryMainType && repositoryMainType !== repositoryType\n ? [repositoryMainType]\n : []),\n ],\n selector.type,\n )\n );\n}\n\nfunction inventoryEntry(\n reference: TransportObjectReference,\n sourceTransport: string,\n): TransportObjectInventoryEntry {\n const wbtype = reference.wbtype?.trim().toUpperCase();\n const uri = reference.uri?.trim();\n return {\n pgmid: reference.pgmid.trim().toUpperCase(),\n type: reference.type.trim().toUpperCase(),\n name: reference.name.trim().toUpperCase(),\n ...(wbtype ? { wbtype } : {}),\n ...(uri ? { uri } : {}),\n objFunc: reference.objFunc.trim().toUpperCase(),\n sourceTransport,\n };\n}\n\n/**\n * CTS exposes a program's main source as the LIMU/REPS sub-object, while ADT\n * exposes the same source history through the repository PROG resource. Keep\n * the CTS key in the public manifest, but use the ADT model identity for\n * metadata and immutable-version discovery.\n */\nfunction sourceHistoryDiscoveryType(\n reference: RepositoryObjectReference,\n): string {\n const pgmid = reference.pgmid.trim().toUpperCase();\n const type = reference.type.trim().toUpperCase().split('/')[0];\n return pgmid === 'LIMU' && type === 'REPS' ? 'PROG' : reference.type;\n}\n\nasync function buildObjectEntries( // NOSONAR - SAP object manifest construction is branch-heavy; will be refactored in follow-up\n original: TransportObjectReference,\n repository: RepositoryObjectReference,\n sourceTransport: string,\n scopeTransportNumbers: readonly string[],\n ctx: AdkContext,\n): Promise<TransportSourceManifestEntry[]> {\n const baseIdentity: TransportSourceManifestObject = {\n pgmid: original.pgmid,\n type: original.type,\n name: original.name,\n };\n const hasRepositoryOwner =\n repository.pgmid !== baseIdentity.pgmid ||\n repository.type !== baseIdentity.type ||\n repository.name !== baseIdentity.name;\n const withRepositoryOwner = (\n entry: TransportSourceManifestEntry,\n packageName?: string,\n ): TransportSourceManifestEntry =>\n hasRepositoryOwner\n ? {\n ...entry,\n repositoryObject: {\n pgmid: repository.pgmid,\n type: repository.functionGroupName ? 'FUGR' : repository.type,\n name: repository.functionGroupName ?? repository.name,\n ...(packageName ? { packageName } : {}),\n },\n }\n : entry;\n let discovery: ObjectSourceDiscovery;\n try {\n discovery = await discoverObjectSourceHistory(\n repository.name,\n sourceHistoryDiscoveryType(repository),\n ctx,\n false,\n repository.functionGroupName,\n );\n } catch (error) {\n if (!(error instanceof ObjectSourceHistoryError)) throw error;\n const failureIdentity: TransportSourceManifestObject = {\n ...baseIdentity,\n ...(error.object.packageName\n ? { packageName: error.object.packageName }\n : {}),\n };\n return [\n withRepositoryOwner(\n unavailableEntry(\n failureIdentity,\n { id: 'object' },\n sourceTransport,\n 'unsupported',\n {\n code: error.code,\n message: error.message,\n },\n ),\n ),\n ];\n }\n\n const identity: TransportSourceManifestObject = {\n ...baseIdentity,\n ...(discovery.object.packageName\n ? { packageName: discovery.object.packageName }\n : {}),\n };\n\n // A function module is a child of its function group. The generic\n // root-source id is only unique within one object, so use the FM name\n // as the source-map key. This rename is scoped to the transport\n // manifest (the flow source map) so the public\n // listObjectSourceVersions API keeps returning the real root id.\n const manifestComponents =\n repository.type === 'FUGR/FF'\n ? discovery.components.map((component) =>\n component.id === 'main'\n ? { ...component, id: repository.name.toLowerCase() }\n : component,\n )\n : discovery.components;\n\n const entries: TransportSourceManifestEntry[] = [];\n for (const component of manifestComponents) {\n const publicComponent: TransportSourceManifestComponent = {\n id: component.id,\n ...(component.sourceUri ? { sourceUri: component.sourceUri } : {}),\n ...(component.versionsUri ? { versionsUri: component.versionsUri } : {}),\n };\n\n if (component.diagnostic) {\n entries.push(\n withRepositoryOwner(\n unavailableEntry(\n identity,\n publicComponent,\n sourceTransport,\n 'unsupported',\n component.diagnostic,\n ),\n discovery.object.packageName,\n ),\n );\n continue;\n }\n\n if (!component.versionsUri) {\n entries.push(\n withRepositoryOwner(\n unavailableEntry(\n identity,\n publicComponent,\n sourceTransport,\n 'unsupported',\n {\n code: 'SOURCE_COMPONENT_VERSIONS_UNAVAILABLE',\n message: 'The source component has no exact versions relation.',\n },\n ),\n discovery.object.packageName,\n ),\n );\n continue;\n }\n\n let versions: SourceVersionRef[];\n try {\n versions = await ctx.client.services.sourceHistory.listVersions(\n component.versionsUri,\n );\n } catch {\n entries.push(\n withRepositoryOwner(\n unavailableEntry(\n identity,\n publicComponent,\n sourceTransport,\n 'failed',\n {\n code: 'SOURCE_HISTORY_RETRIEVAL_FAILED',\n message: 'SAP ADT rejected source-history metadata retrieval.',\n },\n ),\n discovery.object.packageName,\n ),\n );\n continue;\n }\n\n const selection = selectTransportSourceVersions(\n versions,\n scopeTransportNumbers,\n repository.isDeleted,\n );\n entries.push(\n withRepositoryOwner(\n {\n object: identity,\n component: publicComponent,\n sourceTransport,\n ...selection,\n },\n discovery.object.packageName,\n ),\n );\n }\n\n return entries;\n}\n\n/**\n * List immutable source-version metadata for every discovered object component.\n * Source bodies remain lazy and are never read by this operation.\n */\nexport async function listObjectSourceVersions(\n objectName: string,\n objectType: string,\n options: ListObjectSourceVersionsOptions = {},\n ctx?: AdkContext,\n): Promise<ObjectSourceVersionsResult> {\n const context = ctx ?? getGlobalContext();\n const discovery = await discoverObjectSourceHistory(\n objectName,\n objectType,\n context,\n );\n const requestedComponent = options.component?.trim().toUpperCase();\n const components =\n options.component !== undefined\n ? discovery.components.filter(\n (component) => component.id.toUpperCase() === requestedComponent,\n )\n : discovery.components;\n if (components.length === 0) {\n throw new ObjectSourceHistoryError(\n 'SOURCE_COMPONENT_NOT_FOUND',\n 'The requested source component was not exposed by object metadata.',\n discovery.object,\n );\n }\n\n const results: ObjectSourceVersionsComponent[] = [];\n for (const component of components) {\n const publicComponent: TransportSourceManifestComponent = {\n id: component.id,\n ...(component.sourceUri ? { sourceUri: component.sourceUri } : {}),\n ...(component.versionsUri ? { versionsUri: component.versionsUri } : {}),\n };\n if (component.diagnostic) {\n results.push({ ...publicComponent, diagnostic: component.diagnostic });\n continue;\n }\n if (!component.versionsUri) {\n results.push({\n ...publicComponent,\n diagnostic: {\n code: 'SOURCE_COMPONENT_VERSIONS_UNAVAILABLE',\n message: 'The source component has no exact versions relation.',\n },\n });\n continue;\n }\n try {\n const versions = await context.client.services.sourceHistory.listVersions(\n component.versionsUri,\n );\n results.push({ ...publicComponent, versions });\n } catch {\n results.push({\n ...publicComponent,\n diagnostic: {\n code: 'SOURCE_HISTORY_RETRIEVAL_FAILED',\n message: 'SAP ADT rejected source-history metadata retrieval.',\n },\n });\n }\n }\n\n return { object: discovery.object, components: results };\n}\n\n/**\n * Resolve transport objects and produce immutable source-history references.\n * Source bodies remain lazy and are never read while building the manifest.\n */\nexport async function buildTransportSourceManifest(\n requestedTransports: string[],\n options: BuildTransportSourceManifestOptions = {},\n ctx?: AdkContext,\n): Promise<TransportSourceManifest> {\n const context = ctx ?? getGlobalContext();\n const requested = uniqueStable(requestedTransports);\n const resolved = await resolveTransportObjects(requested, {}, context);\n const scopeTransports = uniqueStable([\n ...requested,\n ...resolved.scopeTransportNumbers,\n ]);\n const inventory = resolved.objects\n .map((reference) =>\n inventoryEntry(\n reference,\n resolved.sourceTransportMap.get(reference.key) ?? requested[0] ?? '',\n ),\n )\n .sort(\n (left, right) =>\n compareText(left.sourceTransport, right.sourceTransport) ||\n compareText(left.pgmid, right.pgmid) ||\n compareText(left.type, right.type) ||\n compareText(left.name, right.name),\n );\n const seenRepositoryObjects = new Set<string>();\n const objects = (\n await mapOrdered(\n resolved.objects.filter((reference) => !isNonSourceCtsObject(reference)),\n normalizeConcurrency(options.concurrency),\n async (original) => ({\n original,\n repository: await repositoryObjectReference(original, context),\n sourceTransport:\n resolved.sourceTransportMap.get(original.key) ?? requested[0] ?? '',\n }),\n )\n )\n .filter(({ original, repository }) =>\n manifestSelectorMatches(original, repository, options.selector),\n )\n .filter(({ repository }) => {\n const key = `${repository.pgmid}/${repository.type}/${repository.name}`;\n if (seenRepositoryObjects.has(key)) return false;\n seenRepositoryObjects.add(key);\n return true;\n })\n .sort(\n (left, right) =>\n compareText(left.repository.pgmid, right.repository.pgmid) ||\n compareText(left.repository.type, right.repository.type) ||\n compareText(left.repository.name, right.repository.name),\n );\n\n const perObjectEntries = await mapOrdered(\n objects,\n normalizeConcurrency(options.concurrency),\n ({ original, repository, sourceTransport }) =>\n buildObjectEntries(\n original,\n repository,\n sourceTransport,\n scopeTransports,\n context,\n ),\n );\n\n return {\n requestedTransports: requested,\n scopeTransports,\n inventory,\n entries: perObjectEntries.flat(),\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["createLockService","kinds.Package","kinds.Class","kinds.Interface","kinds.FunctionGroup","kinds.FunctionModule","kinds.Program","kinds.Include","kinds.Table","kinds.DataElement","kinds.Domain","kinds.TableType","kinds.MessageClass","kinds.EnhancementSpot","PackageKind","ClassKind","InterfaceKind","ProgramKind","IncludeKind","FunctionGroupKind","FunctionModuleKind","DomainKind","DataElementKind","TableKind","StructureKind","TableTypeKind","asArray","c","TransportRequestKind","asArray"],"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/base/kinds.ts","../src/base/registry.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/crud-source-object.ts","../src/objects/cds/ddl.model.ts","../src/objects/cds/dcl.model.ts","../src/objects/cds/ddlx.model.ts","../src/objects/cds/source-object.ts","../src/objects/cds/dsfd.model.ts","../src/objects/cds/dsfi.model.ts","../src/objects/cds/dteb.model.ts","../src/objects/cds/source-only-object.ts","../src/objects/cds/dras.model.ts","../src/objects/cds/drty.model.ts","../src/objects/cds/dtdc.model.ts","../src/objects/cds/dtix.model.ts","../src/objects/cds/dtsc.model.ts","../src/objects/cds/desd.model.ts","../src/objects/repository/bdef/bdef.model.ts","../src/objects/repository/badi/badi.model.ts","../src/objects/repository/classic-badi/classic-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","../src/factory.ts","../src/transport-source-manifest.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 { resolveLockCorrelation, 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 * Retry only the immediate post-create LOCK when a backend keeps its\n * generated CTS/editor lock briefly after accepting the skeleton POST.\n */\n postCreateLockRetry?: {\n /** Total LOCK attempts, including the first one. */\n attempts: number;\n /** Delay between conflicting LOCK attempts in milliseconds. */\n delayMs: number;\n };\n}\n\ntype InternalSaveOptions = SaveOptions & { postCreate?: boolean };\n\n/**\n * SAP accepted the skeleton POST, but rejected the immediate follow-up lock.\n *\n * The object therefore exists in SAP, while the source or metadata supplied\n * to the original save call has not yet been persisted. Callers must retry\n * the same object with `mode: 'update'` after the CTS/editor lock is cleared;\n * repeating `mode: 'create'` risks an \"already exists\" response.\n */\nexport class AdkPostCreateLockError extends Error {\n readonly code = 'ADT_POST_CREATE_LOCKED' as const;\n override readonly name = 'AdkPostCreateLockError';\n\n constructor(\n readonly objectUri: string,\n readonly transport: string | undefined,\n cause: unknown,\n ) {\n super(\n `SAP created ${objectUri}, but its post-create CTS lock is still active. ` +\n \"Retry the pending change with mode: 'update' after the lock clears; do not create the object again.\",\n { cause },\n );\n }\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(\n ctx: AdkContext,\n dataOrName: D | string | Record<string, unknown>,\n ) {\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 as D;\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 // SAP ADT lifecycle orchestration is branch-heavy; targeted for follow-up refactor.\n // prettier-ignore\n async save(options: InternalSaveOptions = {}): Promise<this> { //NOSONAR\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 try {\n // Object now exists — update with full data + sources.\n return await this.save({\n ...options,\n mode: 'update',\n postCreate: true,\n });\n } catch (error) {\n if (this.isPostCreateLockConflict(error)) {\n throw new AdkPostCreateLockError(this.objectUri, transport, error);\n }\n throw error;\n }\n }\n // The object existed before this call — normal update errors are not\n // post-create recovery cases unless the caller explicitly supplied the\n // bounded post-create retry policy to resume a prior skeleton POST.\n return this.save({\n ...options,\n mode: 'update',\n postCreate: options.postCreateLockRetry !== undefined,\n });\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 if (options.postCreate) {\n await this.lockAfterCreate(transport, options.postCreateLockRetry);\n } else {\n await this.lock(transport);\n }\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 // SAP can resolve a development task to its parent request during LOCK.\n // Subsequent PUTs must use that authoritative CORRNR rather than the\n // caller's task number (TRL rejects the task even with a valid handle).\n const effectiveTransport = resolveLockCorrelation(\n this._lockHandle ?? {},\n transport,\n );\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 * Some CTS backends can retain the lock created by a successful object POST\n * long enough for the immediate follow-up LOCK to fail. This is distinct\n * from an arbitrary edit conflict because this save invocation already\n * created the skeleton successfully.\n */\n private isPostCreateLockConflict(e: unknown): boolean {\n let message = '';\n if (typeof e === 'string') {\n message = e;\n } else if (e instanceof Error) {\n message = e.message;\n } else if (\n typeof e === 'object' &&\n e !== null &&\n typeof (e as { message?: unknown }).message === 'string'\n ) {\n message = (e as { message: string }).message;\n }\n const normalized = message.toLowerCase();\n return (\n normalized.includes('already locked in request') ||\n normalized.includes('currently editing') ||\n normalized.includes('is being edited')\n );\n }\n\n /**\n * Some backends retain the lock implicitly created by a successful POST for\n * a short time. Retry only this known follow-up LOCK; no arbitrary update or\n * source write is repeated, and each successful lock still uses the normal\n * handle-backed save/unlock lifecycle.\n */\n private async lockAfterCreate(\n transport: string | undefined,\n retry: SaveOptions['postCreateLockRetry'],\n ): Promise<LockHandle> {\n const attempts = retry?.attempts ?? 1;\n const delayMs = retry?.delayMs ?? 0;\n if (!Number.isInteger(attempts) || attempts < 1) {\n throw new RangeError(\n 'postCreateLockRetry.attempts must be a positive integer.',\n );\n }\n if (!Number.isFinite(delayMs) || delayMs < 0) {\n throw new RangeError(\n 'postCreateLockRetry.delayMs must be a non-negative number.',\n );\n }\n\n let lastConflict: unknown;\n for (let attempt = 1; attempt <= attempts; attempt += 1) {\n try {\n return await this.lock(transport);\n } catch (error) {\n if (!this.isPostCreateLockConflict(error) || attempt === attempts) {\n throw error;\n }\n lastConflict = error;\n if (delayMs > 0) {\n await new Promise<void>((resolve) => setTimeout(resolve, delayMs));\n }\n }\n }\n throw lastConflict;\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' && 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(transport);\n }\n\n try {\n // Build URL\n const params = new URLSearchParams();\n const effectiveTransport = resolveLockCorrelation(\n this._lockHandle ?? {},\n transport,\n );\n if (effectiveTransport) {\n params.set('corrNr', effectiveTransport);\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';\nimport { resolveLockCorrelation } from '@abapify/adt-locks';\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][] | undefined;\n if (deferred && deferred.length > 0) {\n try {\n // Re-lock for deferred source saves\n const lock = await r.object.lock(saveOptions.transport);\n const effectiveTransport = resolveLockCorrelation(\n lock,\n saveOptions.transport,\n );\n for (const [key, source] of deferred) {\n await obj.saveIncludeSource(key, source, {\n lockHandle: lock.handle,\n transport: effectiveTransport,\n });\n }\n // Re-activate after saving deferred sources\n const deferredSet = new AdkObjectSet(this.ctx);\n deferredSet.add(r.object);\n const deferredActivation = await deferredSet.activateAll();\n if (deferredActivation.failed > 0) {\n throw new Error(\n `Deferred activation failed: ${\n deferredActivation.messages.join('; ') || 'unknown error'\n }`,\n );\n }\n delete obj._deferredSources;\n } catch (error) {\n r.success = false;\n r.error = `Deferred source deployment failed: ${\n error instanceof Error ? error.message : String(error)\n }`;\n saveResult.success--;\n saveResult.failed++;\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('TRLK900001');\n *\n * For testing or multi-connection scenarios, you can still pass explicit context:\n * const transport = await AdkTransportRequest.get('TRLK900001', 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('TRLK900001');\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 * ADK Object Kinds\n *\n * Central registry of all ADK object types.\n * Import specific kinds for type-safe usage:\n *\n * @example\n * import { TransportRequest } from '../base/kinds';\n * class AdkTransportRequest extends AdkObject<typeof TransportRequest> { ... }\n */\n\n// CTS\nexport const TransportRequest = 'TransportRequest' as const;\nexport const TransportTask = 'TransportTask' as const;\n\n// Repository Objects\nexport const Package = 'Package' as const;\nexport const Class = 'Class' as const;\nexport const Interface = 'Interface' as const;\nexport const FunctionGroup = 'FunctionGroup' as const;\nexport const FunctionModule = 'FunctionModule' as const;\nexport const Program = 'Program' as const;\nexport const Include = 'Include' as const;\n\n// Data Dictionary\nexport const Table = 'Table' as const;\nexport const Structure = 'Structure' as const;\nexport const DataElement = 'DataElement' as const;\nexport const Domain = 'Domain' as const;\nexport const TableType = 'TableType' as const;\n\n// CDS and RAP source objects\nexport const DdlSource = 'DdlSource' as const;\nexport const DclSource = 'DclSource' as const;\nexport const DdlExtension = 'DdlExtension' as const;\nexport const CdsAspect = 'CdsAspect' as const;\nexport const CdsType = 'CdsType' as const;\nexport const ScalarFunctionDefinition = 'ScalarFunctionDefinition' as const;\nexport const ScalarFunctionImplementation =\n 'ScalarFunctionImplementation' as const;\nexport const EntityBuffer = 'EntityBuffer' as const;\nexport const DynamicCache = 'DynamicCache' as const;\nexport const TuningIndex = 'TuningIndex' as const;\nexport const StaticCache = 'StaticCache' as const;\nexport const ExternalSchema = 'ExternalSchema' as const;\nexport const BehaviorDefinition = 'BehaviorDefinition' as const;\nexport const ServiceDefinition = 'ServiceDefinition' as const;\nexport const ServiceBinding = 'ServiceBinding' as const;\n\n// Other\nexport const MessageClass = 'MessageClass' as const;\nexport const EnhancementSpot = 'EnhancementSpot' as const;\n\n/** Union type of all ADK kinds */\nexport type AdkKind =\n | typeof TransportRequest\n | typeof TransportTask\n | typeof Package\n | typeof Class\n | typeof Interface\n | typeof FunctionGroup\n | typeof FunctionModule\n | typeof Program\n | typeof Include\n | typeof Table\n | typeof Structure\n | typeof DataElement\n | typeof Domain\n | typeof TableType\n | typeof DdlSource\n | typeof DclSource\n | typeof DdlExtension\n | typeof CdsAspect\n | typeof CdsType\n | typeof ScalarFunctionDefinition\n | typeof ScalarFunctionImplementation\n | typeof EntityBuffer\n | typeof DynamicCache\n | typeof TuningIndex\n | typeof StaticCache\n | typeof ExternalSchema\n | typeof BehaviorDefinition\n | typeof ServiceDefinition\n | typeof ServiceBinding\n | typeof MessageClass\n | typeof EnhancementSpot;\n\n// ============================================\n// Type-safe Kind → Object mapping\n// ============================================\n\n// Import concrete types for mapping (type-only to avoid circular deps)\nimport type { AdkClass } from '../objects/repository/clas/clas.model';\nimport type { AdkInterface } from '../objects/repository/intf/intf.model';\nimport type { AdkPackage } from '../objects/repository/devc/devc.model';\nimport type { AdkProgram } from '../objects/repository/prog/prog.model';\nimport type { AdkInclude } from '../objects/repository/incl/incl.model';\nimport type { AdkFunctionGroup } from '../objects/repository/fugr/fugr.model';\nimport type { AdkFunctionModule } from '../objects/repository/fugr/func/func.model';\nimport type {\n AdkTransportRequest,\n AdkTransportTask,\n} from '../objects/cts/transport/transport';\nimport type { AdkObject } from './model';\nimport type { AdkDomain } from '../objects/ddic/doma/doma.model';\nimport type { AdkDataElement } from '../objects/ddic/dtel/dtel.model';\nimport type { AdkTable, AdkStructure } from '../objects/ddic/tabl/tabl.model';\nimport type { AdkTableType } from '../objects/ddic/ttyp/ttyp.model';\nimport type { AdkDdlSource } from '../objects/cds/ddl.model';\nimport type { AdkDclSource } from '../objects/cds/dcl.model';\nimport type { AdkDdlExtension } from '../objects/cds/ddlx.model';\nimport type { AdkCdsAspect } from '../objects/cds/dras.model';\nimport type { AdkCdsType } from '../objects/cds/drty.model';\nimport type { AdkScalarFunctionDefinition } from '../objects/cds/dsfd.model';\nimport type { AdkScalarFunctionImplementation } from '../objects/cds/dsfi.model';\nimport type { AdkEntityBuffer } from '../objects/cds/dteb.model';\nimport type { AdkDynamicCache } from '../objects/cds/dtdc.model';\nimport type { AdkTuningIndex } from '../objects/cds/dtix.model';\nimport type { AdkStaticCache } from '../objects/cds/dtsc.model';\nimport type { AdkExternalSchema } from '../objects/cds/desd.model';\nimport type { AdkBehaviorDefinition } from '../objects/repository/bdef/bdef.model';\nimport type { AdkServiceDefinition } from '../objects/repository/srvd/srvd.model';\nimport type { AdkServiceBinding } from '../objects/repository/srvb/srvb.model';\n\n/**\n * Maps ADK kind to concrete object type\n *\n * Enables type-safe factory methods:\n * ```ts\n * const cls = factory.byKind(Class, 'ZCL_TEST'); // → AdkClass\n * const intf = factory.byKind(Interface, 'ZIF'); // → AdkInterface\n * ```\n */\nexport type AdkObjectForKind<K extends AdkKind> = K extends typeof Class\n ? AdkClass\n : K extends typeof Interface\n ? AdkInterface\n : K extends typeof Package\n ? AdkPackage\n : K extends typeof Program\n ? AdkProgram\n : K extends typeof Include\n ? AdkInclude\n : K extends typeof FunctionGroup\n ? AdkFunctionGroup\n : K extends typeof FunctionModule\n ? AdkFunctionModule\n : K extends typeof TransportRequest\n ? AdkTransportRequest\n : K extends typeof TransportTask\n ? AdkTransportTask\n : K extends typeof Domain\n ? AdkDomain\n : K extends typeof DataElement\n ? AdkDataElement\n : K extends typeof Table\n ? AdkTable\n : K extends typeof Structure\n ? AdkStructure\n : K extends typeof TableType\n ? AdkTableType\n : K extends typeof DdlSource\n ? AdkDdlSource\n : K extends typeof DclSource\n ? AdkDclSource\n : K extends typeof DdlExtension\n ? AdkDdlExtension\n : K extends typeof CdsAspect\n ? AdkCdsAspect\n : K extends typeof CdsType\n ? AdkCdsType\n : K extends typeof ScalarFunctionDefinition\n ? AdkScalarFunctionDefinition\n : K extends typeof ScalarFunctionImplementation\n ? AdkScalarFunctionImplementation\n : K extends typeof EntityBuffer\n ? AdkEntityBuffer\n : K extends typeof DynamicCache\n ? AdkDynamicCache\n : K extends typeof TuningIndex\n ? AdkTuningIndex\n : K extends typeof StaticCache\n ? AdkStaticCache\n : K extends typeof ExternalSchema\n ? AdkExternalSchema\n : K extends typeof BehaviorDefinition\n ? AdkBehaviorDefinition\n : K extends typeof ServiceDefinition\n ? AdkServiceDefinition\n : K extends typeof ServiceBinding\n ? AdkServiceBinding\n : AdkObject; // fallback\n","/**\n * ADK Object Registry\n *\n * Maps ADT types to ADK object constructors.\n * Supports both full types (DEVC/K) and main types (DEVC).\n *\n * Architecture:\n * - ADT type (external): \"DEVC/K\", \"CLAS/OC\" - from SAP\n * - ADK kind (internal): Package, Class - our abstraction\n * - Constructor: AdkPackage, AdkClass - implementation\n */\n\nimport type { AdkContext } from './context';\nimport type { AdkKind } from './kinds';\nimport * as kinds from './kinds';\n\n// ============================================\n// Types\n// ============================================\n\n/**\n * Minimal contract for any object that can be registered.\n *\n * Both `AdkObject` subclasses and lightweight source-only CDS/RAP objects\n * (which do not extend `AdkObject`) satisfy this interface, allowing the\n * registry to store constructors for both without `as any` casts.\n */\nexport interface AdkRegistrable {\n readonly name: string;\n readonly kind: AdkKind;\n}\n\n/** Constructor signature for ADK objects */\n\nexport type AdkObjectConstructor<T extends AdkRegistrable = AdkRegistrable> =\n new (ctx: AdkContext, nameOrData: string | Record<string, unknown>) => T;\n\n/** How to transform object name for the URI path segment */\nexport type NameTransform = 'lowercase' | 'preserve';\n\n/** Registry entry with constructor and kind */\nexport interface RegistryEntry {\n readonly kind: AdkKind;\n readonly constructor: AdkObjectConstructor;\n /** ADT REST endpoint path segment (e.g., 'oo/classes', 'ddic/tabletypes') */\n readonly endpoint?: string;\n /** How to transform the object name in URIs (default: lowercase) */\n readonly nameTransform?: NameTransform;\n /** Optional name normalizer — e.g., strip SAPL prefix for FUGR */\n readonly normalizeName?: (name: string) => string;\n}\n\n// ============================================\n// ADT Type Utilities\n// ============================================\n\n/**\n * Parse ADT type into components\n *\n * @example\n * parseAdtType(\"DEVC/K\") // { full: \"DEVC/K\", main: \"DEVC\", sub: \"K\" }\n * parseAdtType(\"DEVC\") // { full: \"DEVC\", main: \"DEVC\", sub: undefined }\n */\nexport function parseAdtType(adtType: string): {\n full: string;\n main: string;\n sub?: string;\n} {\n const [main, sub] = adtType.split('/');\n return {\n full: adtType,\n main: main.toUpperCase(),\n sub: sub?.toUpperCase(),\n };\n}\n\n/**\n * Get main type from ADT type\n *\n * @example\n * getMainType(\"DEVC/K\") // \"DEVC\"\n * getMainType(\"CLAS\") // \"CLAS\"\n */\nexport function getMainType(adtType: string): string {\n return parseAdtType(adtType).main;\n}\n\n// ============================================\n// Registry\n// ============================================\n\n/** Internal registry storage */\nconst registry = new Map<string, RegistryEntry>();\n\n/** ADT main type to ADK kind mapping */\nconst adtToKind = new Map<string, AdkKind>();\n\n/** ADK kind to ADT main type mapping (reverse) */\nconst kindToAdt = new Map<AdkKind, string>();\n\n/**\n * Test-only: clear all registry state.\n *\n * The registry is module-level singleton state populated by side-effectful\n * `registerObjectType()` calls in `src/objects/repository/**`. Tests that\n * exercise registration need a clean slate, but production code must never\n * call this — it would break every ADK object type resolution.\n *\n * Name intentionally uses the `__` prefix to signal \"not part of the public\n * API\". Do not import this from runtime code.\n */\nexport function __resetRegistryForTests(): void {\n registry.clear();\n adtToKind.clear();\n kindToAdt.clear();\n}\n\n/** Options for registerObjectType */\nexport interface RegisterObjectTypeOptions {\n /** ADT REST endpoint path segment (e.g., 'oo/classes', 'ddic/tabletypes') */\n endpoint?: string;\n /** How to transform the object name in URIs (default: 'lowercase') */\n nameTransform?: NameTransform;\n /** Optional name normalizer — e.g., strip SAPL prefix for FUGR */\n normalizeName?: (name: string) => string;\n}\n\n/**\n * Register an ADK object type\n *\n * @param adtType - ADT type, either main (e.g., \"CLAS\") or full (e.g., \"TABL/DS\")\n * @param kind - ADK kind constant\n * @param constructor - Object constructor\n * @param options - Optional endpoint and name transform settings\n */\nexport function registerObjectType(\n adtType: string,\n kind: AdkKind,\n constructor: AdkObjectConstructor,\n options?: RegisterObjectTypeOptions,\n): void {\n const normalizedType = adtType.toUpperCase();\n\n registry.set(normalizedType, {\n kind,\n constructor,\n endpoint: options?.endpoint,\n nameTransform: options?.nameTransform,\n normalizeName: options?.normalizeName,\n });\n adtToKind.set(normalizedType, kind);\n kindToAdt.set(kind, normalizedType);\n}\n\n/**\n * Resolve ADT type to registry entry\n *\n * Tries full type first (e.g., \"TABL/DS\"), then falls back to main type (e.g., \"TABL\").\n * This allows registering subtypes with different constructors/endpoints.\n *\n * @param adtType - Full or main ADT type (e.g., \"DEVC/K\" or \"DEVC\")\n * @returns Registry entry or undefined if not found\n */\nexport function resolveType(adtType: string): RegistryEntry | undefined {\n const normalized = adtType.toUpperCase();\n // Try full type first (e.g., \"TABL/DS\")\n const fullMatch = registry.get(normalized);\n if (fullMatch) return fullMatch;\n // Fall back to main type (e.g., \"TABL\")\n const mainType = getMainType(adtType);\n return registry.get(mainType);\n}\n\n/**\n * Resolve ADK kind to registry entry\n *\n * @param kind - ADK kind constant\n * @returns Registry entry or undefined if not found\n */\nexport function resolveKind(kind: AdkKind): RegistryEntry | undefined {\n const adtType = kindToAdt.get(kind);\n if (!adtType) return undefined;\n return registry.get(adtType);\n}\n\n/**\n * Get ADK kind for ADT type\n */\nexport function getKindForType(adtType: string): AdkKind | undefined {\n return adtToKind.get(getMainType(adtType));\n}\n\n/**\n * Get ADT main type for ADK kind\n */\nexport function getTypeForKind(kind: AdkKind): string | undefined {\n return kindToAdt.get(kind);\n}\n\n/**\n * Check if ADT type is registered\n */\nexport function isTypeRegistered(adtType: string): boolean {\n return registry.has(getMainType(adtType));\n}\n\n/**\n * Get all registered ADT types\n */\nexport function getRegisteredTypes(): string[] {\n return Array.from(registry.keys());\n}\n\n/**\n * Get all registered ADK kinds\n */\nexport function getRegisteredKinds(): AdkKind[] {\n return Array.from(kindToAdt.keys());\n}\n\n/**\n * Get ADT REST endpoint for a type (e.g., 'oo/classes', 'ddic/tabletypes')\n * Checks exact type first (e.g., 'TABL/DS') before falling back to main type.\n */\nexport function getEndpointForType(adtType: string): string | undefined {\n return resolveType(adtType)?.endpoint;\n}\n\n/**\n * Build the full ADT object URI for a given type and name.\n *\n * @example\n * getObjectUri('CLAS', 'ZCL_MY_CLASS') // '/sap/bc/adt/oo/classes/zcl_my_class'\n * getObjectUri('DEVC', 'ZPACKAGE') // '/sap/bc/adt/packages/ZPACKAGE'\n * getObjectUri('TTYP', 'ZAGE_TTYP_STRTAB') // '/sap/bc/adt/ddic/tabletypes/zage_ttyp_strtab'\n */\nexport function getObjectUri(\n adtType: string,\n name: string,\n): string | undefined {\n const entry = resolveType(adtType);\n if (!entry?.endpoint) return undefined;\n\n const normalized = entry.normalizeName ? entry.normalizeName(name) : name;\n const transformedName =\n entry.nameTransform === 'preserve'\n ? encodeURIComponent(normalized)\n : encodeURIComponent(normalized.toLowerCase());\n\n return `/sap/bc/adt/${entry.endpoint}/${transformedName}`;\n}\n\n/**\n * Normalize an object name using type-specific rules.\n *\n * If `adtType` is provided, applies that type's normalizer only.\n * Otherwise, collects all possible normalized forms from every registered type.\n *\n * @returns Array of candidate names (always includes the original).\n *\n * @example\n * normalizeObjectName('SAPLZAGE_FUGR') // ['SAPLZAGE_FUGR', 'ZAGE_FUGR']\n * normalizeObjectName('SAPLZAGE_FUGR', 'FUGR') // ['ZAGE_FUGR']\n * normalizeObjectName('ZCLAS_TEST') // ['ZCLAS_TEST'] (no normalizer matches)\n */\nexport function normalizeObjectName(name: string, adtType?: string): string[] {\n if (adtType) {\n const entry = resolveType(adtType);\n const normalized = entry?.normalizeName?.(name) ?? name;\n return [normalized];\n }\n\n // No type hint — collect all distinct candidates from every registered normalizer\n const candidates = new Set<string>([name]);\n for (const entry of registry.values()) {\n if (entry.normalizeName) {\n candidates.add(entry.normalizeName(name));\n }\n }\n return Array.from(candidates);\n}\n\n/**\n * Extract the root object URI from a full (possibly sub-resource) URI.\n *\n * SAP locks must target the object root, not sub-resources like `/source/main`.\n * This function matches against registered endpoint prefixes and strips\n * everything after the object name segment.\n *\n * @returns The root object URI, or the original URI unchanged if no endpoint matches.\n *\n * @example\n * getObjectRootUri('/sap/bc/adt/functions/groups/zage_fugr/source/main')\n * // → '/sap/bc/adt/functions/groups/zage_fugr'\n * getObjectRootUri('/sap/bc/adt/oo/classes/zcl_test/includes/testclasses')\n * // → '/sap/bc/adt/oo/classes/zcl_test'\n * getObjectRootUri('/sap/bc/adt/oo/classes/zcl_test')\n * // → '/sap/bc/adt/oo/classes/zcl_test' (already root)\n */\nexport function getObjectRootUri(uri: string): string {\n const ADT_PREFIX = '/sap/bc/adt/';\n\n // Collect all registered endpoints, sorted longest-first to avoid partial matches\n const endpoints: string[] = [];\n for (const entry of registry.values()) {\n if (entry.endpoint) endpoints.push(entry.endpoint);\n }\n endpoints.sort((a, b) => b.length - a.length);\n\n for (const endpoint of endpoints) {\n const prefix = `${ADT_PREFIX}${endpoint}/`;\n if (uri.startsWith(prefix)) {\n // Next segment after the endpoint prefix is the object name\n const rest = uri.slice(prefix.length);\n const objectName = rest.split('/')[0];\n return `${prefix}${objectName}`;\n }\n }\n\n return uri;\n}\n\n// ============================================\n// Built-in Registrations\n// ============================================\n\n// These will be populated by object modules when they're imported\n// Each object module calls registerObjectType() in its module scope\n\n// Example (done in clas.model.ts):\n// registerObjectType('CLAS', kinds.Class, AdkClass);\n\n// For now, we export the registration function and let objects self-register\n// This avoids circular dependencies\n\n// ============================================\n// Type Mappings (for reference/documentation)\n// ============================================\n\n/**\n * Known ADT type to ADK kind mappings\n *\n * Repository Objects:\n * - DEVC → Package\n * - CLAS → Class\n * - INTF → Interface\n * - FUGR → FunctionGroup\n * - FUNC → FunctionModule\n * - PROG → Program\n * - INCL → Include\n *\n * Data Dictionary:\n * - TABL → Table\n * - STRU → Structure (actually TABL with different category)\n * - DTEL → DataElement\n * - DOMA → Domain\n * - TTYP → TableType\n *\n * Other:\n * - MSAG → MessageClass\n * - ENHS → EnhancementSpot\n *\n * CTS:\n * - (Transport requests/tasks use different identification)\n */\nexport const ADT_TYPE_MAPPINGS = {\n // Repository\n DEVC: kinds.Package,\n CLAS: kinds.Class,\n INTF: kinds.Interface,\n FUGR: kinds.FunctionGroup,\n FUNC: kinds.FunctionModule,\n PROG: kinds.Program,\n INCL: kinds.Include,\n\n // Data Dictionary\n TABL: kinds.Table,\n DTEL: kinds.DataElement,\n DOMA: kinds.Domain,\n TTYP: kinds.TableType,\n\n // Other\n MSAG: kinds.MessageClass,\n ENHS: kinds.EnhancementSpot,\n} as const;\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","import { getGlobalContext } from '../../base/global-context';\nimport type { AdkContext } from '../../base/context';\nimport { toText } from '../../base/fetch-utils';\nimport type { AdkCrudSourceContract } from './source-object';\n\n/**\n * Shared implementation for standalone CDS/RAP source objects that support\n * full CRUD (get, source.main.get/put, post, delete) plus lock/unlock/activate.\n *\n * DDL, DCL, BDEF, and SRVD all follow the same lifecycle pattern:\n * create skeleton → PUT source → activate\n * This base eliminates the duplicated load/saveMainSource/lock/unlock/activate\n * boilerplate across those models.\n */\nexport abstract class AdkCrudSourceObject<TMetadata = Record<string, unknown>> {\n abstract readonly kind: string;\n readonly name: string;\n protected readonly ctx: AdkContext;\n protected metadata?: TMetadata;\n\n protected abstract readonly objectType: string;\n protected abstract readonly endpoint: string;\n\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).toUpperCase();\n }\n\n get objectUri(): string {\n return `/sap/bc/adt/${this.endpoint}/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n protected abstract get contract(): AdkCrudSourceContract;\n\n protected abstract getMetadataKey(): keyof TMetadata & string;\n\n get description(): string {\n const key = this.getMetadataKey();\n return (\n (this.metadata?.[key] as { description?: string })?.description ??\n this.name\n );\n }\n\n get originalLanguage(): string | undefined {\n const key = this.getMetadataKey();\n return (this.metadata?.[key] as { masterLanguage?: string })\n ?.masterLanguage;\n }\n\n get abapLanguageVersion(): string | undefined {\n const key = this.getMetadataKey();\n return (this.metadata?.[key] as { abapLanguageVersion?: string })\n ?.abapLanguageVersion;\n }\n\n get package(): string | undefined {\n const key = this.getMetadataKey();\n return (this.metadata?.[key] as { packageRef?: { name?: string } })\n ?.packageRef?.name;\n }\n\n // ─── Source ────────────────────────────────────────────────────────────────\n\n async getSource(): Promise<string> {\n return toText(await this.contract.source.main.get(this.name));\n }\n\n async load(): Promise<this> {\n const [metadata] = await Promise.all([\n this.contract.get(this.name),\n this.getSource(),\n ]);\n this.metadata = metadata as TMetadata;\n return this;\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: this.objectType,\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 never);\n return this;\n }\n\n // ─── Static helpers ────────────────────────────────────────────────────────\n\n protected static resolveContext(ctx?: AdkContext): AdkContext {\n return ctx ?? getGlobalContext();\n }\n\n /**\n * Get a source object (validates it exists by fetching source).\n * Generic helper used by static `get()` on subclasses.\n */\n protected static async getSourceObject<T extends AdkCrudSourceObject<any>>(\n ctor: new (ctx: AdkContext, name: string) => T,\n name: string,\n ctx?: AdkContext,\n ): Promise<T> {\n const context = AdkCrudSourceObject.resolveContext(ctx);\n const obj = new ctor(context, name);\n await obj.getSource();\n return obj;\n }\n\n /**\n * Check if a source object exists.\n * Generic helper used by static `exists()` on subclasses.\n */\n protected static async sourceObjectExists<T extends AdkCrudSourceObject<any>>(\n ctor: new (ctx: AdkContext, name: string) => T,\n name: string,\n ctx?: AdkContext,\n ): Promise<boolean> {\n try {\n const context = AdkCrudSourceObject.resolveContext(ctx);\n const obj = new ctor(context, name);\n await obj.getSource();\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Shared skeleton-creation helper. Subclasses pass their contract's `post`\n * function and the root element name + type that their AFF schema expects.\n */\n protected static async createSourceSkeleton<\n T extends AdkCrudSourceObject<any>,\n >(\n ctor: new (ctx: AdkContext, name: string) => T,\n params: {\n name: string;\n description: string;\n packageName: string;\n transport?: string;\n ctx?: AdkContext;\n rootKey: string;\n objectTypeCode: string;\n responsible?: string;\n },\n post: (...args: any[]) => Promise<unknown>,\n ): Promise<T> {\n const context = AdkCrudSourceObject.resolveContext(params.ctx);\n const nameU = params.name.toUpperCase();\n const pkgU = params.packageName.toUpperCase();\n\n await post(params.transport ? { corrNr: params.transport } : {}, {\n [params.rootKey]: {\n name: nameU,\n ...(params.objectTypeCode ? { type: params.objectTypeCode } : {}),\n description: params.description,\n language: 'EN',\n masterLanguage: 'EN',\n responsible: params.responsible ?? '$TMP',\n packageRef: {\n name: pkgU,\n type: 'DEVC/K',\n uri: `/sap/bc/adt/packages/${pkgU.toLowerCase()}`,\n },\n },\n } as never);\n\n return new ctor(context, nameU);\n }\n\n /**\n * Shared delete helper. Subclasses pass their contract's `delete` function.\n */\n protected static async deleteSource(\n name: string,\n options: { transport?: string; lockHandle?: string } | undefined,\n deleteFn: (\n name: string,\n options: Record<string, string>,\n ) => Promise<unknown>,\n ): Promise<void> {\n await deleteFn(name.toUpperCase(), {\n ...(options?.transport ? { corrNr: options.transport } : {}),\n ...(options?.lockHandle ? { lockHandle: options.lockHandle } : {}),\n });\n }\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 { DdlSource } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport type { AdkCrudSourceContract } from './source-object';\nimport { AdkCrudSourceObject } from './crud-source-object';\n\ninterface DdlMetadata {\n ddlSource?: {\n description?: string;\n masterLanguage?: string;\n abapLanguageVersion?: string;\n packageRef?: { name?: string };\n source_origin?: string;\n source_type?: string;\n };\n}\n\nexport class AdkDdlSource extends AdkCrudSourceObject<DdlMetadata> {\n static readonly kind = DdlSource;\n readonly kind = AdkDdlSource.kind;\n\n protected readonly objectType = 'DDLS';\n protected readonly endpoint = 'ddic/ddl/sources';\n\n protected get contract(): AdkCrudSourceContract {\n return this.ctx.client.adt.ddic.ddl.sources as AdkCrudSourceContract;\n }\n\n protected getMetadataKey(): 'ddlSource' {\n return 'ddlSource';\n }\n\n get sourceOrigin(): string | undefined {\n return this.metadata?.ddlSource?.source_origin;\n }\n get sourceType(): string | undefined {\n return this.metadata?.ddlSource?.source_type;\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 return this.getSourceObject(this, name, ctx);\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n return this.sourceObjectExists(this, name, ctx);\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 return this.createSourceSkeleton(\n this,\n {\n name,\n description,\n packageName,\n transport: options?.transport,\n ctx,\n rootKey: 'source',\n objectTypeCode: '',\n },\n context.client.adt.ddic.ddl.sources.post.bind(\n context.client.adt.ddic.ddl.sources,\n ),\n );\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 return AdkCrudSourceObject.deleteSource(\n name,\n options,\n context.client.adt.ddic.ddl.sources.delete.bind(\n context.client.adt.ddic.ddl.sources,\n ),\n );\n }\n}\n\nregisterObjectType('DDLS', DdlSource, AdkDdlSource, {\n endpoint: 'ddic/ddl/sources',\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 { DclSource } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport type { AdkCrudSourceContract } from './source-object';\nimport { AdkCrudSourceObject } from './crud-source-object';\n\ninterface DclMetadata {\n dclSource?: {\n description?: string;\n masterLanguage?: string;\n packageRef?: { name?: string };\n };\n}\n\nexport class AdkDclSource extends AdkCrudSourceObject<DclMetadata> {\n static readonly kind = DclSource;\n readonly kind = AdkDclSource.kind;\n\n protected readonly objectType = 'DCLS';\n protected readonly endpoint = 'acm/dcl/sources';\n\n protected get contract(): AdkCrudSourceContract {\n return this.ctx.client.adt.ddic.dcl.sources as AdkCrudSourceContract;\n }\n\n protected getMetadataKey(): 'dclSource' {\n return 'dclSource';\n }\n\n // ─── Static Factory Methods ─────────────────────────────────────────────────\n\n static async get(name: string, ctx?: AdkContext): Promise<AdkDclSource> {\n return this.getSourceObject(this, name, ctx);\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n return this.sourceObjectExists(this, name, ctx);\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 return this.createSourceSkeleton(\n this,\n {\n name,\n description,\n packageName,\n transport: options?.transport,\n ctx,\n rootKey: 'source',\n objectTypeCode: '',\n },\n context.client.adt.ddic.dcl.sources.post.bind(\n context.client.adt.ddic.dcl.sources,\n ),\n );\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 return AdkCrudSourceObject.deleteSource(\n name,\n options,\n context.client.adt.ddic.dcl.sources.delete.bind(\n context.client.adt.ddic.dcl.sources,\n ),\n );\n }\n}\n\nregisterObjectType('DCLS', DclSource, AdkDclSource, {\n endpoint: 'acm/dcl/sources',\n});\n","import type { AdkContext } from '../../base/context';\nimport { toText } from '../../base/fetch-utils';\nimport { DdlExtension } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport type { AdkCdsSourceContract } from './source-object';\n\nexport class AdkDdlExtension {\n static readonly kind = DdlExtension;\n readonly kind = AdkDdlExtension.kind;\n readonly name: string;\n protected readonly ctx: AdkContext;\n private metadata?: {\n ddlxSource?: {\n description?: string;\n masterLanguage?: string;\n abapLanguageVersion?: string;\n packageRef?: { name?: string };\n };\n };\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).toUpperCase();\n }\n get objectUri() {\n return `/sap/bc/adt/ddic/ddlx/sources/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n get description() {\n return this.metadata?.ddlxSource?.description ?? this.name;\n }\n get originalLanguage() {\n return this.metadata?.ddlxSource?.masterLanguage;\n }\n get abapLanguageVersion() {\n return this.metadata?.ddlxSource?.abapLanguageVersion;\n }\n get package() {\n return this.metadata?.ddlxSource?.packageRef?.name;\n }\n private get contract(): AdkCdsSourceContract {\n return this.ctx.client.adt.ddic.ddlx.sources as AdkCdsSourceContract;\n }\n async getSource() {\n return toText(await this.contract.source.main.get(this.name));\n }\n async load(): Promise<this> {\n const [metadata] = await Promise.all([\n this.contract.get(this.name),\n this.getSource(),\n ]);\n this.metadata = metadata as {\n ddlxSource?: {\n description?: string;\n masterLanguage?: string;\n abapLanguageVersion?: string;\n packageRef?: { name?: string };\n };\n };\n return this;\n }\n}\nregisterObjectType('DDLX', DdlExtension, AdkDdlExtension, {\n endpoint: 'ddic/ddlx/sources',\n});\n","import type { AdkContext } from '../../base/context';\nimport { toText } from '../../base/fetch-utils';\n\n/**\n * Structural type for the ADT source contract used by CDS source objects.\n * Captures the `get` and `source.main.get` members used by {@link getSource}\n * and {@link load}, so incompatible contract shapes are rejected at compile\n * time instead of failing at runtime.\n */\nexport interface AdkCdsSourceContract {\n get(name: string): Promise<unknown>;\n source: {\n main: {\n get(name: string): Promise<unknown>;\n put(\n name: string,\n options: Record<string, unknown>,\n body: string,\n ): Promise<unknown>;\n };\n };\n}\n\n/**\n * Broader CRUD contract for standalone source objects that also support\n * create (POST) and delete. Used by DDL, DCL, BDEF, SRVD, etc.\n */\nexport interface AdkCrudSourceContract extends AdkCdsSourceContract {\n post(options: Record<string, unknown>, body: unknown): Promise<unknown>;\n delete(name: string, options: Record<string, unknown>): Promise<unknown>;\n}\n\n/** Minimal shared implementation for CDS source objects used by import. */\nexport abstract class AdkCdsSourceObject {\n readonly name: string;\n protected readonly ctx: AdkContext;\n protected abstract readonly endpoint: string;\n private metadata?: {\n blueSource?: {\n description?: string;\n masterLanguage?: string;\n abapLanguageVersion?: string;\n packageRef?: { name?: string };\n };\n };\n\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).toUpperCase();\n }\n\n get objectUri(): string {\n return `/sap/bc/adt/${this.endpoint}/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n get description(): string {\n return this.metadata?.blueSource?.description ?? this.name;\n }\n\n get originalLanguage(): string | undefined {\n return this.metadata?.blueSource?.masterLanguage;\n }\n\n get abapLanguageVersion(): string | undefined {\n return this.metadata?.blueSource?.abapLanguageVersion;\n }\n\n get package(): string | undefined {\n return this.metadata?.blueSource?.packageRef?.name;\n }\n\n protected abstract get contract(): AdkCdsSourceContract;\n\n async getSource(): Promise<string> {\n return toText(await this.contract.source.main.get(this.name));\n }\n\n async load(): Promise<this> {\n const [metadata] = await Promise.all([\n this.contract.get(this.name),\n this.getSource(),\n ]);\n this.metadata = metadata as {\n blueSource?: {\n description?: string;\n masterLanguage?: string;\n abapLanguageVersion?: string;\n packageRef?: { name?: string };\n };\n };\n return this;\n }\n}\n","import { ScalarFunctionDefinition } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport { AdkCdsSourceObject, type AdkCdsSourceContract } from './source-object';\n\nexport class AdkScalarFunctionDefinition extends AdkCdsSourceObject {\n static readonly kind = ScalarFunctionDefinition;\n readonly kind = AdkScalarFunctionDefinition.kind;\n protected readonly endpoint = 'ddic/dsfd/sources';\n protected get contract(): AdkCdsSourceContract {\n return this.ctx.client.adt.ddic.dsfd.sources as AdkCdsSourceContract;\n }\n}\n\nregisterObjectType(\n 'DSFD',\n ScalarFunctionDefinition,\n AdkScalarFunctionDefinition,\n {\n endpoint: 'ddic/dsfd/sources',\n },\n);\n","import type { AdkContext } from '../../base/context';\nimport { ScalarFunctionImplementation } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport type { AdkCdsSourceContract } from './source-object';\n\nexport class AdkScalarFunctionImplementation {\n static readonly kind = ScalarFunctionImplementation;\n readonly kind = AdkScalarFunctionImplementation.kind;\n readonly name: string;\n protected readonly ctx: AdkContext;\n private definition?: unknown;\n\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).toUpperCase();\n }\n\n get objectUri(): string {\n return `/sap/bc/adt/ddic/dsfi/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n private get contract(): AdkCdsSourceContract {\n return this.ctx.client.adt.ddic.dsfi as unknown as AdkCdsSourceContract;\n }\n\n async getSource(): Promise<unknown> {\n return this.definition ?? this.contract.source.main.get(this.name);\n }\n\n async load(): Promise<this> {\n const [, definition] = await Promise.all([\n this.contract.get(this.name),\n this.contract.source.main.get(this.name),\n ]);\n this.definition = definition;\n return this;\n }\n}\n\nregisterObjectType(\n 'DSFI',\n ScalarFunctionImplementation,\n AdkScalarFunctionImplementation,\n {\n endpoint: 'ddic/dsfi',\n },\n);\n","import { EntityBuffer } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport { AdkCdsSourceObject, type AdkCdsSourceContract } from './source-object';\n\nexport class AdkEntityBuffer extends AdkCdsSourceObject {\n static readonly kind = EntityBuffer;\n readonly kind = AdkEntityBuffer.kind;\n protected readonly endpoint = 'ddic/dteb/sources';\n protected get contract(): AdkCdsSourceContract {\n return this.ctx.client.adt.ddic.dteb.sources as AdkCdsSourceContract;\n }\n}\n\nregisterObjectType('DTEB', EntityBuffer, AdkEntityBuffer, {\n endpoint: 'ddic/dteb/sources',\n});\n","import type { AdkContext } from '../../base/context';\n\n/**\n * CDS source object without a metadata schema in the connected ABAP release.\n *\n * DRAS and DRTY are absent from the reference system's repository search, so their source\n * endpoint is represented by the ADT DDIC naming convention and exercised\n * with official ABAP File Formats fixtures. The object is intentionally\n * source-first: import only needs the immutable source and a safe header.\n */\nexport abstract class AdkSourceOnlyCdsObject {\n readonly name: string;\n protected readonly ctx: AdkContext;\n protected abstract readonly endpoint: string;\n private source?: string;\n\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).toUpperCase();\n }\n\n get objectUri(): string {\n return `/sap/bc/adt/${this.endpoint}/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n get description(): string {\n return this.name;\n }\n get originalLanguage(): string {\n return 'EN';\n }\n\n async getSource(): Promise<string> {\n this.source ??= await this.ctx.client.readTextBounded(\n `${this.objectUri}/source/main`,\n 5 * 1024 * 1024,\n { headers: { Accept: 'text/plain' } },\n );\n return this.source;\n }\n\n async load(): Promise<this> {\n await this.getSource();\n return this;\n }\n}\n","import { CdsAspect } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport { AdkSourceOnlyCdsObject } from './source-only-object';\n\nexport class AdkCdsAspect extends AdkSourceOnlyCdsObject {\n static readonly kind = CdsAspect;\n readonly kind = AdkCdsAspect.kind;\n protected readonly endpoint = 'ddic/dras/sources';\n}\n\nregisterObjectType('DRAS', CdsAspect, AdkCdsAspect, {\n endpoint: 'ddic/dras/sources',\n});\n","import { CdsType } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport { AdkSourceOnlyCdsObject } from './source-only-object';\n\nexport class AdkCdsType extends AdkSourceOnlyCdsObject {\n static readonly kind = CdsType;\n readonly kind = AdkCdsType.kind;\n protected readonly endpoint = 'ddic/drty/sources';\n}\n\nregisterObjectType('DRTY', CdsType, AdkCdsType, {\n endpoint: 'ddic/drty/sources',\n});\n","import { DynamicCache } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport { AdkSourceOnlyCdsObject } from './source-only-object';\n\nexport class AdkDynamicCache extends AdkSourceOnlyCdsObject {\n static readonly kind = DynamicCache;\n readonly kind = AdkDynamicCache.kind;\n protected readonly endpoint = 'ddic/dtdc/sources';\n}\nregisterObjectType('DTDC', DynamicCache, AdkDynamicCache, {\n endpoint: 'ddic/dtdc/sources',\n});\n","import { TuningIndex } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport { AdkSourceOnlyCdsObject } from './source-only-object';\n\nexport class AdkTuningIndex extends AdkSourceOnlyCdsObject {\n static readonly kind = TuningIndex;\n readonly kind = AdkTuningIndex.kind;\n protected readonly endpoint = 'ddic/dtix/sources';\n}\nregisterObjectType('DTIX', TuningIndex, AdkTuningIndex, {\n endpoint: 'ddic/dtix/sources',\n});\n","import { StaticCache } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\nimport { AdkSourceOnlyCdsObject } from './source-only-object';\n\nexport class AdkStaticCache extends AdkSourceOnlyCdsObject {\n static readonly kind = StaticCache;\n readonly kind = AdkStaticCache.kind;\n protected readonly endpoint = 'ddic/dtsc/sources';\n}\nregisterObjectType('DTSC', StaticCache, AdkStaticCache, {\n endpoint: 'ddic/dtsc/sources',\n});\n","import type { AdkContext } from '../../base/context';\nimport { ExternalSchema } from '../../base/kinds';\nimport { registerObjectType } from '../../base/registry';\n\nexport class AdkExternalSchema {\n static readonly kind = ExternalSchema;\n readonly kind = AdkExternalSchema.kind;\n readonly name: string;\n protected readonly ctx: AdkContext;\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).toUpperCase();\n }\n get objectUri(): string {\n return `/sap/bc/adt/ddic/desd/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n get description(): string {\n return this.name;\n }\n get originalLanguage(): string {\n return 'EN';\n }\n async load(): Promise<this> {\n await this.ctx.client.readTextBounded(this.objectUri, 5 * 1024 * 1024, {\n headers: { Accept: 'application/xml' },\n });\n return this;\n }\n}\nregisterObjectType('DESD', ExternalSchema, AdkExternalSchema, {\n endpoint: 'ddic/desd',\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 { BehaviorDefinition } from '../../../base/kinds';\nimport { registerObjectType } from '../../../base/registry';\nimport type { AdkCrudSourceContract } from '../../cds/source-object';\nimport { AdkCrudSourceObject } from '../../cds/crud-source-object';\n\ninterface BdefMetadata {\n blueSource?: {\n description?: string;\n masterLanguage?: string;\n abapLanguageVersion?: string;\n packageRef?: { name?: string };\n };\n}\n\nexport class AdkBehaviorDefinition extends AdkCrudSourceObject<BdefMetadata> {\n /** Static ADK kind marker — used by abapGit handler registry if needed. */\n static readonly kind = BehaviorDefinition;\n readonly kind = AdkBehaviorDefinition.kind;\n\n protected readonly objectType = 'BDEF';\n protected readonly endpoint = 'bo/behaviordefinitions';\n\n protected get contract(): AdkCrudSourceContract {\n return this.ctx.client.adt.bo\n .behaviordefinitions as unknown as AdkCrudSourceContract;\n }\n\n protected getMetadataKey(): 'blueSource' {\n return 'blueSource';\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 return this.getSourceObject(this, name, ctx);\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n return this.sourceObjectExists(this, name, ctx);\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 return this.createSourceSkeleton(\n this,\n {\n name,\n description,\n packageName,\n transport: options?.transport,\n ctx,\n rootKey: 'blueSource',\n objectTypeCode: 'BDEF/BDO',\n responsible: packageName.toUpperCase(),\n },\n context.client.adt.bo.behaviordefinitions.post.bind(\n context.client.adt.bo.behaviordefinitions,\n ),\n );\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 return AdkCrudSourceObject.deleteSource(\n name,\n options,\n context.client.adt.bo.behaviordefinitions.delete.bind(\n context.client.adt.bo.behaviordefinitions,\n ),\n );\n }\n}\n\nregisterObjectType('BDEF', BehaviorDefinition, AdkBehaviorDefinition, {\n endpoint: 'bo/behaviordefinitions',\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 private _description?: string;\n private _package?: string;\n\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).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 /** Description from the ENHO metadata, falling back to the object name. */\n get description(): string {\n return this._description || this.name;\n }\n\n /** Package name from the ENHO metadata. */\n get package(): string {\n return this._package || '';\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 const data = (await this.contract.get(this.name)) as any;\n const impl = data?.enhancementImplementation ?? data;\n this._description = impl?.description ?? '';\n this._package = impl?.packageRef?.name ?? '';\n return data;\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 * Classic BAdI — read-only ADK models for SXSD/XD and SXCI/XI metadata.\n *\n * Served via vit/wb Basic Object Properties:\n * GET /sap/bc/adt/vit/wb/object_type/sxsdxd/object_name/{name}\n * GET /sap/bc/adt/vit/wb/object_type/sxcixi/object_name/{name}\n */\n\nimport { getGlobalContext } from '../../../base/global-context';\nimport type { AdkContext } from '../../../base/context';\nimport type { BasicObjectPropertiesResponse } from '@abapify/adt-contracts';\n\ninterface ClassicBadiInput {\n name: string;\n ctx?: AdkContext;\n}\n\nfunction isNotFound(error: unknown): boolean {\n return (\n typeof error === 'object' &&\n error !== null &&\n (error as { status?: unknown }).status === 404\n );\n}\n\nabstract class AdkClassicBadiBase {\n readonly name: string;\n protected readonly ctx: AdkContext;\n\n constructor(input: { ctx: AdkContext; name: string }) {\n this.ctx = input.ctx;\n this.name = input.name.toUpperCase();\n }\n\n abstract get kind(): string;\n abstract get objectUri(): string;\n abstract getMetadata(): Promise<BasicObjectPropertiesResponse>;\n\n static async get<T extends AdkClassicBadiBase>(\n this: { new (input: { ctx: AdkContext; name: string }): T },\n input: ClassicBadiInput,\n ): Promise<T> {\n const context = input.ctx ?? getGlobalContext();\n const obj = new this({ ctx: context, name: input.name });\n await obj.getMetadata();\n return obj;\n }\n\n static async exists<T extends AdkClassicBadiBase>(\n this: { new (input: { ctx: AdkContext; name: string }): T },\n input: ClassicBadiInput,\n ): Promise<boolean> {\n try {\n const ctor = this as unknown as {\n get(input: ClassicBadiInput): Promise<T>;\n };\n await ctor.get(input);\n return true;\n } catch (error) {\n if (!isNotFound(error)) throw error;\n return false;\n }\n }\n}\n\nexport class AdkClassicBadiDefinition extends AdkClassicBadiBase {\n readonly kind = 'ClassicBadiDefinition' as const;\n\n get objectUri(): string {\n return `/sap/bc/adt/vit/wb/object_type/sxsdxd/object_name/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n async getMetadata(): Promise<BasicObjectPropertiesResponse> {\n return await this.ctx.client.adt.vit.wb.objectProperties.getDefinition(\n this.name,\n );\n }\n}\n\nexport class AdkClassicBadiImplementation extends AdkClassicBadiBase {\n readonly kind = 'ClassicBadiImplementation' as const;\n\n get objectUri(): string {\n return `/sap/bc/adt/vit/wb/object_type/sxcixi/object_name/${encodeURIComponent(this.name.toLowerCase())}`;\n }\n\n async getMetadata(): Promise<BasicObjectPropertiesResponse> {\n return await this.ctx.client.adt.vit.wb.objectProperties.getImplementation(\n this.name,\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 { ServiceDefinition } from '../../../base/kinds';\nimport { registerObjectType } from '../../../base/registry';\nimport type { AdkCrudSourceContract } from '../../cds/source-object';\nimport { AdkCrudSourceObject } from '../../cds/crud-source-object';\n\ninterface SrvdMetadata {\n srvdSource?: {\n description?: string;\n masterLanguage?: string;\n abapLanguageVersion?: string;\n packageRef?: { name?: string };\n sourceOrigin?: string;\n srvdSourceType?: string;\n };\n}\n\nexport class AdkServiceDefinition extends AdkCrudSourceObject<SrvdMetadata> {\n /** Static ADK kind marker — used by abapGit handler registry if needed. */\n static readonly kind = ServiceDefinition;\n readonly kind = AdkServiceDefinition.kind;\n\n protected readonly objectType = 'SRVD';\n protected readonly endpoint = 'ddic/srvd/sources';\n\n protected get contract(): AdkCrudSourceContract {\n return this.ctx.client.adt.ddic.srvd\n .sources as unknown as AdkCrudSourceContract;\n }\n\n protected getMetadataKey(): 'srvdSource' {\n return 'srvdSource';\n }\n\n get sourceOrigin(): string | undefined {\n return this.metadata?.srvdSource?.sourceOrigin;\n }\n\n get sourceType(): string | undefined {\n return this.metadata?.srvdSource?.srvdSourceType;\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 return this.getSourceObject(this, name, ctx);\n }\n\n static async exists(name: string, ctx?: AdkContext): Promise<boolean> {\n return this.sourceObjectExists(this, name, ctx);\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 return this.createSourceSkeleton(\n this,\n {\n name,\n description,\n packageName,\n transport: options?.transport,\n ctx,\n rootKey: 'srvdSource',\n objectTypeCode: 'SRVD/SRV',\n responsible: packageName.toUpperCase(),\n },\n context.client.adt.ddic.srvd.sources.post.bind(\n context.client.adt.ddic.srvd.sources,\n ),\n );\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 return AdkCrudSourceObject.deleteSource(\n name,\n options,\n context.client.adt.ddic.srvd.sources.delete.bind(\n context.client.adt.ddic.srvd.sources,\n ),\n );\n }\n}\n\nregisterObjectType('SRVD', ServiceDefinition, AdkServiceDefinition, {\n endpoint: 'ddic/srvd/sources',\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';\nimport { ServiceBinding } from '../../../base/kinds';\nimport { registerObjectType } from '../../../base/registry';\n\nexport class AdkServiceBinding {\n /** Static ADK kind marker — used by abapGit handler registry if needed. */\n static readonly kind = ServiceBinding;\n readonly kind = AdkServiceBinding.kind;\n\n readonly name: string;\n protected readonly ctx: AdkContext;\n\n constructor(ctx: AdkContext, nameOrData: string | Record<string, unknown>) {\n this.ctx = ctx;\n this.name = (\n typeof nameOrData === 'string'\n ? nameOrData\n : String(nameOrData.name ?? '')\n ).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 async load(): Promise<this> {\n await this.getMetadata();\n return this;\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\nregisterObjectType('SRVB', ServiceBinding, AdkServiceBinding, {\n endpoint: 'businessservices/bindings',\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\nfunction transportResponseName(response: TransportData): string {\n if (response.object_type === 'T') {\n const taskNumber = asArray(response.task)[0]?.number;\n if (taskNumber) return taskNumber;\n }\n if (response.name) return response.name;\n return response.request?.number || '';\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: transportResponseName(dataOrNumber),\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 // useraction=\"release\" against the base transportrequests URI is a\n // silent no-op (HTTP 200, empty body, no state change). SAP's own GET\n // response advertises the real release action as the newreleasejobs\n // sub-resource link (rel=\"http://www.sap.com/cts/relations/newreleasejobs\")\n // - that is the endpoint that actually transitions status D -> R.\n await this.ctx.client.fetch(`${this.objectUri}/newreleasejobs`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/vnd.sap.adt.transportorganizer.v1+xml',\n Accept: 'application/vnd.sap.adt.transportorganizer.v1+xml',\n },\n body: '',\n });\n\n // Re-fetch from SAP rather than assume success - a 200 response from\n // the useraction endpoint above was never proof of a state change.\n // If the reload itself fails, report that the release POST succeeded\n // but verification could not be completed — do not conflate it with a\n // release failure, since SAP may have actually released the transport.\n try {\n await this.load();\n } catch (reloadError) {\n return {\n success: false,\n message: `Released ${this.number} but failed to verify: ${reloadError instanceof Error ? reloadError.message : String(reloadError)}`,\n };\n }\n if (this.status !== 'R') {\n return {\n success: false,\n message: `SAP did not release ${this.number} (status: ${this.statusText})`,\n };\n }\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 },\n {\n root: {\n number: this.number,\n useraction: 'changeowner',\n targetuser: newOwner,\n },\n },\n );\n\n const verified = await AdkTransportRequest.get(this.number, this.ctx);\n if (verified.owner.toUpperCase() !== newOwner.toUpperCase()) {\n throw new Error(\n `Transport ${this.number} owner verification failed: expected ${newOwner}, found ${verified.owner || '<empty>'}`,\n );\n }\n\n (this.itemData as { owner?: string }).owner = verified.owner;\n\n if (recursive) {\n for (const task of this.tasks) {\n if (task.status === 'D') {\n await task.reassign(newOwner);\n }\n }\n }\n }\n\n /** Create and verify a modifiable task under this request. */\n async addTask(owner: string): Promise<AdkTransportTask> {\n if (this.itemType !== 'request') {\n throw new Error(`Transport ${this.number} is a task, not a request`);\n }\n if (this.status !== 'D') {\n throw new Error(\n `Transport ${this.number} is not modifiable: expected status D, found ${this.status}`,\n );\n }\n\n const existingTasks = new Set(this.tasks.map((task) => task.number));\n const response =\n await this.ctx.client.adt.cts.transportrequests.useraction.addTask(\n this.number,\n { owner },\n { root: { targetuser: owner } },\n );\n\n const returnedNumber = response.root.number;\n if (!returnedNumber) {\n throw new Error(\n `Task creation verification failed for ${this.number}: SAP response did not contain a task number`,\n );\n }\n const verified = await AdkTransportRequest.get(this.number, this.ctx);\n const created = verified.tasks.find(\n (task) =>\n task.number === returnedNumber &&\n !existingTasks.has(task.number) &&\n task.owner.toUpperCase() === owner.toUpperCase(),\n );\n if (!created) {\n throw new Error(\n `Task creation verification failed for ${this.number}: no new task owned by ${owner}`,\n );\n }\n if (created.status !== 'D') {\n throw new Error(\n `Task creation verification failed for ${created.number}: expected status D, found ${created.status}`,\n );\n }\n this._tasks = verified.tasks;\n this._objects = undefined;\n return created;\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., 'TRLK900001')\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 | TransportObjectData[] | 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., 'TRLK900001')\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 target?: 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 private readonly requestedNumber: string,\n ) {}\n\n // ===========================================================================\n // Properties\n // ===========================================================================\n\n /** Transport number */\n get number(): string {\n if (this.data.object_type === 'T') {\n const task = asArray(this.data.task).find(\n (candidate) => candidate.number?.toUpperCase() === this.requestedNumber,\n );\n return task?.number ?? this.requestedNumber;\n }\n return this.data.request?.number ?? this.data.name ?? this.requestedNumber;\n }\n\n private get itemData(): TransportTaskData {\n if (this.data.object_type === 'T') {\n const directTasks = asArray(this.data.task);\n return (\n directTasks.find(\n (task) => task.number?.toUpperCase() === this.requestedNumber,\n ) ??\n directTasks[0] ??\n this.data.request ??\n {}\n );\n }\n return this.data.request ?? {};\n }\n\n /** Transport description */\n get description(): string {\n return this.itemData.desc ?? '';\n }\n\n /** Transport owner */\n get owner(): string {\n return this.itemData.owner ?? '';\n }\n\n /** Transport status (D=Modifiable, R=Released) */\n get status(): string {\n return this.itemData.status ?? '';\n }\n\n /** Transport status text */\n get statusText(): string {\n return this.itemData.status_text ?? '';\n }\n\n /** Transport target system */\n get target(): string {\n return this.itemData.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 requestedNumber = number.trim().toUpperCase();\n const response =\n await context.client.adt.cts.transportrequests.get(requestedNumber);\n // Unwrap the root element from the response\n return new AdkTransport(context, response.root, requestedNumber);\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 concrete request or task that supplied it. */\n sourceTransportMap: Map<string, string>;\n /** Requested roots/tasks plus observed child tasks, in stable order. */\n scopeTransportNumbers: 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\nfunction getTransportObjectKey(object: TransportObjectData): string {\n return `${object.pgmid ?? ''}/${object.type ?? ''}/${object.name ?? ''}`;\n}\n\nfunction getConcreteSourceTransportMap(\n transport: AdkTransport,\n requestedNumber: string,\n): Map<string, string> {\n const sourceTransportMap = new Map<string, string>();\n const data = transport.raw;\n const requestNumber =\n data.request?.number || transport.number || requestedNumber;\n\n const addSource = (\n object: TransportObjectData,\n sourceTransport: string,\n ): void => {\n const key = getTransportObjectKey(object);\n if (!sourceTransportMap.has(key)) {\n sourceTransportMap.set(key, sourceTransport);\n }\n };\n\n // Direct request objects have concrete request provenance.\n for (const object of asArray(data.request?.abap_object)) {\n addSource(object, requestNumber);\n }\n\n // Prefer concrete task provenance over the aggregate all_objects view.\n const tasks = [...asArray(data.request?.task), ...asArray(data.task)];\n for (const task of tasks) {\n const taskNumber = task.number || transport.number || requestedNumber;\n for (const object of asArray(task.abap_object)) {\n addSource(object, taskNumber);\n }\n }\n\n // all_objects is an aggregate without task attribution, so use it only as\n // a fallback for keys not exposed by the concrete request/task containers.\n for (const object of asArray(data.request?.all_objects?.abap_object)) {\n addSource(object, requestNumber);\n }\n\n return sourceTransportMap;\n}\n\nfunction addScopeTransportNumber(\n number: string,\n scopeTransportNumbers: string[],\n seenScopeTransportNumbers: Set<string>,\n): void {\n if (!number || seenScopeTransportNumbers.has(number)) return;\n seenScopeTransportNumbers.add(number);\n scopeTransportNumbers.push(number);\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 const scopeTransportNumbers: string[] = [];\n const seenScopeTransportNumbers = new Set<string>();\n\n const transports = await Promise.all(\n transportNumbers.map((number) => AdkTransport.get(number, ctx)),\n );\n const seenObjectKeys = new Set<string>();\n\n for (const [index, transport] of transports.entries()) {\n const requestedNumber = transportNumbers[index] ?? '';\n const transportNumber = transport.number || requestedNumber;\n addScopeTransportNumber(\n transportNumber,\n scopeTransportNumbers,\n seenScopeTransportNumbers,\n );\n addScopeTransportNumber(\n transport.raw.request?.number ?? '',\n scopeTransportNumbers,\n seenScopeTransportNumbers,\n );\n for (const task of transport.tasks) {\n addScopeTransportNumber(\n task.number,\n scopeTransportNumbers,\n seenScopeTransportNumbers,\n );\n }\n\n const concreteSources = getConcreteSourceTransportMap(\n transport,\n requestedNumber,\n );\n for (const object of getFilteredObjects(transport, selector)) {\n const sourceTransport =\n concreteSources.get(object.key) ?? transportNumber;\n addResolvedObject(\n object,\n sourceTransport,\n objects,\n sourceTransportMap,\n seenObjectKeys,\n );\n }\n }\n\n return { objects, sourceTransportMap, scopeTransportNumbers };\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","/**\n * ADK v2 - Generic Factory\n *\n * Single entry point for creating ADK objects.\n * Resolves ADT types to correct ADK object implementations.\n *\n * Resolution methods:\n * - get(name, adtType) - By name and ADT type (unique identifier)\n * - byKind(kind, name) - By ADK kind (type-safe)\n * - fromXml(xml) - Parse from XML response\n * - create(adtType) - Create new object (deferred)\n */\n\nimport type { AdkContext } from './base/context';\nimport type { AdkObject } from './base/model';\nimport type { AdkKind, AdkObjectForKind } from './base/kinds';\nimport {\n resolveType,\n resolveKind,\n parseAdtType,\n type AdkRegistrable,\n} from './base/registry';\n\n// ============================================\n// XML Parsing Utilities\n// ============================================\n\n/** Pattern to extract adtcore:type from XML */\nconst TYPE_PATTERN = /adtcore:type=\"([^\"]+)\"/;\n\n/** Pattern to extract adtcore:name from XML */\nconst NAME_PATTERN = /adtcore:name=\"([^\"]+)\"/;\n\n/**\n * Extract ADT type and name from XML\n *\n * Relies on adtcore:type and adtcore:name attributes which are\n * the standard identifiers in ADT XML responses.\n *\n * @param xml - XML string from ADT response\n * @returns Extracted type and name, or undefined if not found\n */\nexport function parseXmlIdentity(\n xml: string,\n): { type: string; name: string } | undefined {\n const typeMatch = xml.match(TYPE_PATTERN);\n const nameMatch = xml.match(NAME_PATTERN);\n\n if (typeMatch && nameMatch) {\n return {\n type: typeMatch[1],\n name: nameMatch[1],\n };\n }\n\n return undefined;\n}\n\n// ============================================\n// Generic Object (Fallback)\n// ============================================\n\n/**\n * Generic ADK object for unregistered types\n *\n * Provides core functionality (adtcore attributes, links)\n * without type-specific features.\n */\nexport class AdkGenericObject {\n readonly adtType: string;\n readonly adtMainType: string;\n readonly adtSubType?: string;\n\n protected readonly ctx: AdkContext;\n protected _name: string;\n protected _data?: unknown;\n\n constructor(ctx: AdkContext, name: string, adtType: string) {\n this.ctx = ctx;\n this._name = name;\n\n const parsed = parseAdtType(adtType);\n this.adtType = parsed.full;\n this.adtMainType = parsed.main;\n this.adtSubType = parsed.sub;\n }\n\n get name(): string {\n return this._name;\n }\n get type(): string {\n return this.adtType;\n }\n\n /** Check if data is loaded */\n get isLoaded(): boolean {\n return this._data !== undefined;\n }\n\n /** Get raw data (if loaded) */\n get data(): unknown {\n return this._data;\n }\n\n /** Set data (for manual population) */\n setData(data: unknown): void {\n this._data = data;\n }\n}\n\n// ============================================\n// Factory Interface\n// ============================================\n\n/**\n * ADK Factory - Generic object creation\n */\nexport interface AdkFactory {\n /** Context used by this factory */\n readonly ctx: AdkContext;\n\n /**\n * Get object by name and ADT type\n *\n * Supports both full types (DEVC/K) and main types (DEVC).\n * Returns deferred object - call load() to fetch data.\n *\n * @example\n * const pkg = factory.get('ZPACKAGE', 'DEVC/K');\n * await pkg.load();\n *\n * const cls = factory.get('ZCL_TEST', 'CLAS');\n * await cls.load();\n */\n get(\n name: string,\n adtType: string,\n ): AdkObject | AdkGenericObject | AdkRegistrable;\n\n /**\n * Get object with initial data (for deserialization)\n *\n * Creates object pre-populated with data - no load() needed.\n * Used when deserializing from files rather than loading from SAP.\n *\n * @example\n * const cls = factory.getWithData({ name: 'ZCL_TEST', description: 'Test' }, 'CLAS');\n * // cls.isLoaded is true, no need to call load()\n */\n getWithData(\n data: Record<string, unknown>,\n adtType: string,\n ): AdkObject | AdkGenericObject | AdkRegistrable;\n\n /**\n * Get object by ADK kind (type-safe)\n *\n * Returns correctly typed object based on kind.\n * TypeScript infers the concrete return type from the kind parameter.\n *\n * @example\n * import { Class, Interface } from '@abapify/adk';\n * const cls = factory.byKind(Class, 'ZCL_TEST'); // → AdkClass\n * const intf = factory.byKind(Interface, 'ZIF_TEST'); // → AdkInterface\n */\n byKind<K extends AdkKind>(kind: K, name: string): AdkObjectForKind<K>;\n\n /**\n * Create object from XML response\n *\n * Parses XML to extract type and name, then constructs\n * the correct object type.\n *\n * @example\n * const xml = await client.fetch('/sap/bc/adt/oo/classes/ZCL_TEST');\n * const cls = factory.fromXml(xml);\n */\n fromXml(\n xml: string,\n ): AdkObject | AdkGenericObject | AdkRegistrable | undefined;\n\n /**\n * Create new object (for creation workflows)\n *\n * Returns deferred object without name - used when\n * creating new objects in SAP.\n */\n create(adtType: string): AdkObject | AdkGenericObject | AdkRegistrable;\n}\n\n// ============================================\n// Factory Implementation\n// ============================================\n\n/**\n * Create ADK factory\n *\n * @param ctx - ADK context with services\n * @returns Factory instance\n */\nexport function createAdkFactory(ctx: AdkContext): AdkFactory {\n return {\n ctx,\n\n get(\n name: string,\n adtType: string,\n ): AdkObject | AdkGenericObject | AdkRegistrable {\n const entry = resolveType(adtType);\n\n if (entry) {\n return new entry.constructor(ctx, name);\n }\n\n // Fallback to generic object\n return new AdkGenericObject(ctx, name, adtType);\n },\n\n getWithData(\n data: Record<string, unknown>,\n adtType: string,\n ): AdkObject | AdkGenericObject | AdkRegistrable {\n const entry = resolveType(adtType);\n\n if (entry) {\n // Pass data directly to constructor - it will extract name from data.name\n return new entry.constructor(ctx, data);\n }\n\n // Fallback to generic object with name from data\n const obj = new AdkGenericObject(\n ctx,\n (data as { name?: string }).name ?? '',\n adtType,\n );\n obj.setData(data);\n return obj;\n },\n\n byKind<K extends AdkKind>(kind: K, name: string): AdkObjectForKind<K> {\n const entry = resolveKind(kind);\n\n if (!entry) {\n throw new Error(`No constructor registered for kind: ${kind}`);\n }\n\n // Type assertion: registry guarantees correct constructor for kind\n return new entry.constructor(ctx, name) as AdkObjectForKind<K>;\n },\n\n fromXml(\n xml: string,\n ): AdkObject | AdkGenericObject | AdkRegistrable | undefined {\n const identity = parseXmlIdentity(xml);\n\n if (!identity) {\n return undefined;\n }\n\n return this.get(identity.name, identity.type);\n },\n\n create(adtType: string): AdkObject | AdkGenericObject | AdkRegistrable {\n // Create with empty name - will be set during creation workflow\n return this.get('', adtType);\n },\n };\n}\n\n// ============================================\n// Convenience: Create factory from ADT client\n// ============================================\n\n// Factory is the boundary - imports AdtClient directly from adt-client\nimport type { AdtClient } from '@abapify/adt-client';\n\n/**\n * Create ADK factory from ADT client\n *\n * Builds context from client and returns factory.\n * This is the main entry point for most users.\n *\n * @example\n * import { createAdtClient } from '@abapify/adt-client';\n * import { createAdk } from '@abapify/adk';\n *\n * const client = createAdtClient({ ... });\n * const adk = createAdk(client);\n *\n * const cls = adk.get('ZCL_TEST', 'CLAS');\n * await cls.load();\n */\nexport function createAdk(client: AdtClient): AdkFactory {\n // Build context with client reference\n // Objects access client via ctx.client\n const ctx: AdkContext = {\n client,\n };\n\n return createAdkFactory(ctx);\n}\n","import { assertAdtUri, type SourceVersionRef } from '@abapify/adt-client';\nimport type { AdkContext } from './base/context';\nimport { getGlobalContext } from './base/global-context';\nimport { getEndpointForType, normalizeObjectName } from './base/registry';\nimport { createAdkFactory } from './factory';\nimport { AdkFunctionModule } from './objects/repository/fugr';\nimport {\n resolveTransportObjects,\n type ResolvedTransportObjects,\n type TransportObjectSelector,\n} from './objects/cts';\n\nexport type TransportSourceChangeKind =\n 'added' | 'modified' | 'deleted' | 'ambiguous' | 'unsupported' | 'failed';\n\nexport type SourceHistoryDiagnosticCode =\n | 'DELETED_SOURCE_BASE_UNAVAILABLE'\n | 'OBJECT_METADATA_LOAD_FAILED'\n | 'OBJECT_METADATA_UNAVAILABLE'\n | 'OBJECT_TYPE_UNSUPPORTED'\n | 'SOURCE_COMPONENT_NOT_FOUND'\n | 'SOURCE_COMPONENTS_UNAVAILABLE'\n | 'SOURCE_COMPONENT_URI_UNSAFE'\n | 'SOURCE_COMPONENT_VERSIONS_UNAVAILABLE'\n | 'SOURCE_HISTORY_INTERVENING_VERSION'\n | 'SOURCE_HISTORY_ORDER_INVALID'\n | 'SOURCE_HISTORY_PROVENANCE_MISSING'\n | 'SOURCE_HISTORY_RETRIEVAL_FAILED'\n | 'SOURCE_HISTORY_SCOPE_VERSION_MISSING';\n\nexport interface SourceHistoryDiagnostic {\n code: SourceHistoryDiagnosticCode;\n message: string;\n}\n\nexport type TransportSourceDiagnostic = SourceHistoryDiagnostic;\n\nexport interface ObjectSourceHistoryIdentity {\n name: string;\n type: string;\n packageName?: string;\n}\n\nexport interface ListObjectSourceVersionsOptions {\n component?: string;\n}\n\nexport type ObjectSourceVersionsComponent =\n | (TransportSourceManifestComponent & {\n versions: SourceVersionRef[];\n diagnostic?: never;\n })\n | (TransportSourceManifestComponent & {\n versions?: never;\n diagnostic: SourceHistoryDiagnostic;\n });\n\nexport interface ObjectSourceVersionsResult {\n object: ObjectSourceHistoryIdentity;\n components: ObjectSourceVersionsComponent[];\n}\n\nexport type ObjectSourceHistoryErrorCode =\n | 'OBJECT_METADATA_LOAD_FAILED'\n | 'OBJECT_METADATA_UNAVAILABLE'\n | 'OBJECT_TYPE_UNSUPPORTED'\n | 'SOURCE_COMPONENT_NOT_FOUND'\n | 'SOURCE_COMPONENTS_UNAVAILABLE';\n\n/** Stable public failure for errors that occur before a component result exists. */\nexport class ObjectSourceHistoryError extends Error {\n override readonly name = 'ObjectSourceHistoryError';\n\n constructor(\n readonly code: ObjectSourceHistoryErrorCode,\n message: string,\n readonly object: ObjectSourceHistoryIdentity,\n ) {\n super(message);\n }\n}\n\nexport interface TransportSourceVersionSelection {\n changeKind: TransportSourceChangeKind;\n exact: boolean;\n base?: SourceVersionRef;\n head?: SourceVersionRef;\n diagnostic?: TransportSourceDiagnostic;\n}\n\nexport interface TransportSourceManifestObject {\n pgmid: string;\n type: string;\n name: string;\n packageName?: string;\n}\n\nexport interface TransportSourceManifestComponent {\n id: string;\n sourceUri?: string;\n versionsUri?: string;\n}\n\nexport interface TransportSourceManifestEntry extends TransportSourceVersionSelection {\n object: TransportSourceManifestObject;\n repositoryObject?: TransportSourceManifestObject;\n component: TransportSourceManifestComponent;\n sourceTransport: string;\n}\n\nexport interface TransportObjectInventoryEntry {\n pgmid: string;\n type: string;\n name: string;\n wbtype?: string;\n uri?: string;\n objFunc: string;\n sourceTransport: string;\n}\n\nexport interface TransportSourceManifest {\n requestedTransports: string[];\n scopeTransports: string[];\n inventory: TransportObjectInventoryEntry[];\n entries: TransportSourceManifestEntry[];\n}\n\nexport interface BuildTransportSourceManifestOptions {\n selector?: TransportObjectSelector;\n concurrency?: number;\n}\n\ninterface RuntimeLink {\n href?: unknown;\n rel?: unknown;\n}\n\ninterface DiscoveredComponent extends TransportSourceManifestComponent {\n diagnostic?: TransportSourceDiagnostic;\n}\n\nconst VERSIONS_RELATION = 'http://www.sap.com/adt/relations/versions';\nconst DEFAULT_CONCURRENCY = 4;\nconst MAX_CONCURRENCY = 32;\nconst RELATIVE_URI_TRAVERSAL = /(?:^|\\/)(?:\\.{1,2}|%2e(?:%2e)?)(?:\\/|$)/i;\nconst NON_SOURCE_CTS_OBJECT_KEYS = new Set(['R3TR/SUSK']);\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object'\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\nfunction asArray(value: unknown): unknown[] {\n if (value === undefined || value === null) return [];\n return Array.isArray(value) ? value : [value];\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction uniqueStable(values: readonly string[]): string[] {\n const seen = new Set<string>();\n const result: string[] = [];\n for (const value of values) {\n const normalized = value.trim().toUpperCase();\n if (!normalized || seen.has(normalized)) continue;\n seen.add(normalized);\n result.push(normalized);\n }\n return result;\n}\n\nfunction compareText(left: string, right: string): number {\n if (left < right) return -1;\n if (left > right) return 1;\n return 0;\n}\n\n/**\n * Some CTS entries represent SAP-maintained configuration rather than\n * repository source. They have neither an ADK source model nor an abapGit\n * representation, so they must not participate in a source-boundary manifest.\n */\nfunction isNonSourceCtsObject(reference: {\n pgmid: string;\n type: string;\n}): boolean {\n return NON_SOURCE_CTS_OBJECT_KEYS.has(\n `${reference.pgmid.trim().toUpperCase()}/${reference.type.trim().toUpperCase()}`,\n );\n}\n\nfunction isUnsafeRelativeHref(href: string): boolean {\n return (\n href.startsWith('//') ||\n href.includes('\\\\') ||\n href.includes(':') ||\n RELATIVE_URI_TRAVERSAL.test(href)\n );\n}\n\nfunction resolveAdtRelativeUri(\n href: string,\n objectUri: string,\n): string | undefined {\n try {\n const safeObjectUri = assertAdtUri(objectUri);\n if (href.startsWith('/')) return assertAdtUri(href);\n if (isUnsafeRelativeHref(href)) return undefined;\n\n const directoryBase = safeObjectUri.endsWith('/')\n ? safeObjectUri\n : `${safeObjectUri}/`;\n const resolved = new URL(href, `https://adt.invalid${directoryBase}`);\n return assertAdtUri(\n `${resolved.pathname}${resolved.search}${resolved.hash}`,\n );\n } catch {\n return undefined;\n }\n}\n\nfunction runtimeLinks(value: Record<string, unknown>): RuntimeLink[] {\n return [...asArray(value['link']), ...asArray(value['links'])]\n .map(asRecord)\n .filter((link): link is Record<string, unknown> => Boolean(link));\n}\n\nfunction discoverComponent(\n value: Record<string, unknown>,\n id: string,\n objectUri: string,\n): DiscoveredComponent | undefined {\n const sourceHref = nonEmptyString(value['sourceUri']);\n if (!sourceHref) return undefined;\n\n const sourceUri = resolveAdtRelativeUri(sourceHref, objectUri);\n const versionsHref = runtimeLinks(value)\n .filter((link) => link.rel === VERSIONS_RELATION)\n .map((link) => nonEmptyString(link.href))\n .find((href): href is string => Boolean(href));\n const versionsUri = versionsHref\n ? resolveAdtRelativeUri(versionsHref, objectUri)\n : undefined;\n\n if (!sourceUri) {\n return {\n id,\n diagnostic: {\n code: 'SOURCE_COMPONENT_URI_UNSAFE',\n message: 'The source component exposes an unsafe ADT URI.',\n },\n };\n }\n if (versionsHref && !versionsUri) {\n return {\n id,\n diagnostic: {\n code: 'SOURCE_COMPONENT_URI_UNSAFE',\n message: 'The source component exposes an unsafe ADT URI.',\n },\n };\n }\n\n return {\n id,\n sourceUri,\n ...(versionsUri ? { versionsUri } : {}),\n };\n}\n\nfunction discoverSourceComponents(\n metadata: Record<string, unknown>,\n objectUri: string,\n): DiscoveredComponent[] {\n const candidates: DiscoveredComponent[] = [];\n const root = discoverComponent(metadata, 'main', objectUri);\n if (root) candidates.push(root);\n\n for (const [index, rawInclude] of asArray(metadata['include']).entries()) {\n const include = asRecord(rawInclude);\n if (!include) continue;\n const id =\n nonEmptyString(include['includeType']) ??\n nonEmptyString(include['name']) ??\n `include-${index + 1}`;\n const component = discoverComponent(include, id, objectUri);\n if (component) candidates.push(component);\n }\n\n candidates.sort(\n (left, right) =>\n compareText(left.id, right.id) ||\n compareText(left.sourceUri ?? '', right.sourceUri ?? '') ||\n compareText(left.versionsUri ?? '', right.versionsUri ?? ''),\n );\n\n const seen = new Set<string>();\n return candidates.filter((candidate) => {\n const key = `${candidate.sourceUri ?? ''}\\u0000${candidate.versionsUri ?? ''}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\nfunction loadedMetadata(loaded: unknown): Record<string, unknown> | undefined {\n const object = asRecord(loaded);\n if (!object) return undefined;\n const dataSync = asRecord(object['dataSync']);\n if (dataSync) return dataSync;\n return asRecord(object['data']);\n}\n\nfunction packageNameFrom(\n metadata: Record<string, unknown>,\n): string | undefined {\n const packageRef = asRecord(metadata['packageRef']);\n return (\n nonEmptyString(packageRef?.['name']) ??\n nonEmptyString(metadata['packageName'])\n );\n}\n\nfunction normalizeSourceHistoryIdentity(\n objectName: string,\n objectType: string,\n): ObjectSourceHistoryIdentity {\n const type = objectType.trim().toUpperCase();\n const requestedName = objectName.trim().toUpperCase();\n const name = normalizeObjectName(requestedName, type)[0] ?? requestedName;\n return { name, type };\n}\n\ninterface ObjectSourceDiscovery {\n object: ObjectSourceHistoryIdentity;\n components: DiscoveredComponent[];\n}\n\nfunction ensureObjectLoadable(\n modelRecord: Record<string, unknown> | undefined,\n object: ObjectSourceHistoryIdentity,\n): () => unknown {\n const load = modelRecord?.['load'];\n if (typeof load !== 'function') {\n throw new ObjectSourceHistoryError(\n 'OBJECT_TYPE_UNSUPPORTED',\n 'The repository object type has no loadable ADK model.',\n object,\n );\n }\n return load as () => unknown;\n}\n\nasync function loadObjectModel(\n model: unknown,\n load: () => unknown,\n object: ObjectSourceHistoryIdentity,\n): Promise<void> {\n try {\n await load.call(model);\n } catch {\n throw new ObjectSourceHistoryError(\n 'OBJECT_METADATA_LOAD_FAILED',\n 'SAP ADT rejected repository object metadata retrieval.',\n object,\n );\n }\n}\n\nfunction ensureObjectMetadata(\n model: unknown,\n object: ObjectSourceHistoryIdentity,\n): { metadata: Record<string, unknown>; objectUri: string } {\n const modelRecord = asRecord(model);\n const metadata = loadedMetadata(model);\n if (!metadata) {\n throw new ObjectSourceHistoryError(\n 'OBJECT_METADATA_UNAVAILABLE',\n 'The loaded object has no usable ADT metadata identity.',\n object,\n );\n }\n const objectUri = nonEmptyString(modelRecord?.['objectUri']);\n if (!objectUri) {\n throw new ObjectSourceHistoryError(\n 'OBJECT_METADATA_UNAVAILABLE',\n 'The loaded object has no usable ADT metadata identity.',\n object,\n );\n }\n if (!resolveAdtRelativeUri('', objectUri)) {\n throw new ObjectSourceHistoryError(\n 'OBJECT_METADATA_UNAVAILABLE',\n 'The loaded object has no usable ADT metadata identity.',\n object,\n );\n }\n return { metadata, objectUri };\n}\n\nasync function discoverObjectSourceHistory(\n objectName: string,\n objectType: string,\n ctx: AdkContext,\n normalizeIdentity = true,\n functionGroupName?: string,\n): Promise<ObjectSourceDiscovery> {\n const object = normalizeIdentity\n ? normalizeSourceHistoryIdentity(objectName, objectType)\n : { name: objectName, type: objectType };\n let model: unknown;\n if (object.type === 'FUGR/FF' && functionGroupName) {\n try {\n model = await AdkFunctionModule.get(functionGroupName, object.name, ctx);\n } catch {\n throw new ObjectSourceHistoryError(\n 'OBJECT_METADATA_LOAD_FAILED',\n 'SAP ADT rejected repository object metadata retrieval.',\n object,\n );\n }\n } else {\n model = createAdkFactory(ctx).get(object.name, object.type);\n const load = ensureObjectLoadable(asRecord(model), object);\n await loadObjectModel(model, load, object);\n }\n\n const { metadata, objectUri } = ensureObjectMetadata(model, object);\n\n let packageName = packageNameFrom(metadata);\n // Function-module metadata has no top-level packageRef; inherit the\n // owning function group's package so the manifest entry stays scoped.\n if (!packageName && functionGroupName) {\n const fugrModel = createAdkFactory(ctx).get(functionGroupName, 'FUGR');\n const fugrLoad = ensureObjectLoadable(asRecord(fugrModel), {\n name: functionGroupName,\n type: 'FUGR',\n });\n await loadObjectModel(fugrModel, fugrLoad, {\n name: functionGroupName,\n type: 'FUGR',\n });\n const fugrMetadata = loadedMetadata(fugrModel);\n if (fugrMetadata) {\n packageName = packageNameFrom(fugrMetadata);\n }\n }\n const normalizedObject = {\n ...object,\n ...(packageName ? { packageName } : {}),\n };\n const components = discoverSourceComponents(metadata, objectUri);\n if (components.length === 0) {\n throw new ObjectSourceHistoryError(\n 'SOURCE_COMPONENTS_UNAVAILABLE',\n 'The object metadata exposes no source component.',\n normalizedObject,\n );\n }\n\n return { object: normalizedObject, components };\n}\n\nfunction normalizeConcurrency(value: number | undefined): number {\n if (value === undefined) return DEFAULT_CONCURRENCY;\n if (!Number.isFinite(value)) return DEFAULT_CONCURRENCY;\n return Math.max(1, Math.min(MAX_CONCURRENCY, Math.floor(value)));\n}\n\nasync function mapOrdered<T, R>(\n values: readonly T[],\n concurrency: number,\n worker: (value: T) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(values.length);\n let nextIndex = 0;\n const workers = Array.from(\n { length: Math.min(concurrency, values.length) },\n async () => {\n while (nextIndex < values.length) {\n const index = nextIndex;\n nextIndex += 1;\n const value = values[index];\n if (value !== undefined) results[index] = await worker(value);\n }\n },\n );\n await Promise.all(workers);\n return results;\n}\n\nfunction unavailableEntry(\n object: TransportSourceManifestObject,\n component: TransportSourceManifestComponent,\n sourceTransport: string,\n changeKind: 'unsupported' | 'failed',\n diagnostic: TransportSourceDiagnostic,\n): TransportSourceManifestEntry {\n return {\n object,\n component,\n sourceTransport,\n changeKind,\n exact: false,\n diagnostic,\n };\n}\n\nfunction selectedRangeDiagnostic(\n ordered: readonly SourceVersionRef[],\n newestIndex: number,\n oldestIndex: number,\n scope: ReadonlySet<string>,\n): TransportSourceDiagnostic | undefined {\n for (const candidate of ordered.slice(newestIndex, oldestIndex + 1)) {\n if (\n candidate.transports.some((transport) =>\n scope.has(transport.toUpperCase()),\n )\n ) {\n continue;\n }\n\n return candidate.transports.length === 0\n ? {\n code: 'SOURCE_HISTORY_PROVENANCE_MISSING',\n message:\n 'A source version in the selected history range has no transport provenance.',\n }\n : {\n code: 'SOURCE_HISTORY_INTERVENING_VERSION',\n message:\n 'An unrelated source version occurs between in-scope versions.',\n };\n }\n\n return undefined;\n}\n\n/**\n * Select immutable before/after references using SAP's observed feed ordinal.\n */\nexport function selectTransportSourceVersions( // NOSONAR - SAP feed-order selection is inherently branch-heavy; will be refactored in follow-up\n versions: readonly SourceVersionRef[],\n scopeTransportNumbers: readonly string[],\n deleted = false,\n): TransportSourceVersionSelection {\n const scope = new Set(\n scopeTransportNumbers.map((transport) => transport.toUpperCase()),\n );\n const ordinals = versions.map((version) => version.ordinal);\n if (\n ordinals.some((ordinal) => !Number.isSafeInteger(ordinal) || ordinal < 0) ||\n new Set(ordinals).size !== ordinals.length\n ) {\n return {\n changeKind: 'ambiguous',\n exact: false,\n diagnostic: {\n code: 'SOURCE_HISTORY_ORDER_INVALID',\n message: 'Source version ordinals do not define a unique feed order.',\n },\n };\n }\n\n const ordered = [...versions].sort(\n (left, right) => left.ordinal - right.ordinal,\n );\n const inScope = ordered\n .map((candidate, index) => ({ candidate, index }))\n .filter(({ candidate }) =>\n candidate.transports.some((transport) =>\n scope.has(transport.toUpperCase()),\n ),\n );\n\n if (deleted) {\n if (ordered.length === 0) {\n return {\n changeKind: 'unsupported',\n exact: false,\n diagnostic: {\n code: 'DELETED_SOURCE_BASE_UNAVAILABLE',\n message:\n 'The deleted component has no recoverable historical source.',\n },\n };\n }\n const oldestInScope = inScope.at(-1);\n if (!oldestInScope) {\n return {\n changeKind: 'ambiguous',\n exact: false,\n diagnostic: {\n code: 'SOURCE_HISTORY_SCOPE_VERSION_MISSING',\n message:\n 'No source version is attributed to the requested transport scope.',\n },\n };\n }\n const base = ordered[oldestInScope.index + 1];\n const rangeDiagnostic = selectedRangeDiagnostic(\n ordered,\n inScope[0]!.index,\n oldestInScope.index,\n scope,\n );\n if (rangeDiagnostic) {\n return {\n changeKind: 'ambiguous',\n exact: false,\n ...(base ? { base } : {}),\n diagnostic: rangeDiagnostic,\n };\n }\n return base\n ? { changeKind: 'deleted', exact: true, base }\n : {\n changeKind: 'unsupported',\n exact: false,\n diagnostic: {\n code: 'DELETED_SOURCE_BASE_UNAVAILABLE',\n message:\n 'The deleted component has no recoverable historical source.',\n },\n };\n }\n\n if (inScope.length === 0) {\n return {\n changeKind: 'ambiguous',\n exact: false,\n diagnostic: {\n code: 'SOURCE_HISTORY_SCOPE_VERSION_MISSING',\n message:\n 'No source version is attributed to the requested transport scope.',\n },\n };\n }\n\n const newest = inScope[0];\n const oldest = inScope.at(-1);\n if (!newest || !oldest) {\n throw new Error('Unreachable source-history selection state.');\n }\n\n const head = newest.candidate;\n const base = ordered[oldest.index + 1];\n const rangeDiagnostic = selectedRangeDiagnostic(\n ordered,\n newest.index,\n oldest.index,\n scope,\n );\n if (rangeDiagnostic) {\n return {\n changeKind: 'ambiguous',\n exact: false,\n ...(base ? { base } : {}),\n head,\n diagnostic: rangeDiagnostic,\n };\n }\n\n return base\n ? { changeKind: 'modified', exact: true, base, head }\n : { changeKind: 'added', exact: true, head };\n}\n\ntype TransportObjectReference = ResolvedTransportObjects['objects'][number];\n\ninterface RepositoryObjectReference {\n pgmid: string;\n type: string;\n name: string;\n isDeleted: boolean;\n functionGroupName?: string;\n}\n\nfunction repositoryNameFromUri(\n uri: string | undefined,\n type: string,\n): string | undefined {\n if (!uri) return undefined;\n const endpoint = getEndpointForType(type);\n if (!endpoint) return undefined;\n const prefix = `/sap/bc/adt/${endpoint}/`;\n if (!uri.startsWith(prefix)) return undefined;\n const encodedName = uri.slice(prefix.length).split('/')[0];\n if (!encodedName) return undefined;\n try {\n const name = decodeURIComponent(encodedName).trim().toUpperCase();\n return name || undefined;\n } catch {\n return undefined;\n }\n}\n\n// Some SAP releases expose a function-module change as R3TR/FUNC rather\n// than LIMU/FUNC. Function-module source history belongs to its function\n// group, whose identity is supplied by the ADT URI.\nfunction resolveFuncGroupReference(\n reference: TransportObjectReference,\n rawType: string,\n): RepositoryObjectReference | undefined {\n if (rawType !== 'FUNC') return undefined;\n const ownerName = repositoryNameFromUri(reference.uri, 'FUGR');\n if (!ownerName) return undefined;\n return {\n pgmid: 'R3TR',\n type: 'FUGR',\n name: ownerName,\n isDeleted: false,\n };\n}\n\nasync function resolveFuncGroupBySearch(\n reference: TransportObjectReference,\n context: AdkContext,\n): Promise<RepositoryObjectReference | undefined> {\n if (\n reference.pgmid.trim().toUpperCase() !== 'LIMU' ||\n reference.type.trim().toUpperCase() !== 'FUNC' ||\n reference.wbtype?.trim().toUpperCase().split('/')[0] !== 'FUGR'\n )\n return undefined;\n try {\n const result =\n (await context.client.adt.repository.informationsystem.search.quickSearch(\n { query: reference.name, maxResults: 10 },\n )) as Record<string, unknown>;\n // The quick-search response may nest references under\n // `objectReferences` or `mainObject`, or expose a top-level\n // `objectReference`. Accept all three shapes.\n const container =\n asRecord(result['objectReferences']) ?? asRecord(result['mainObject']);\n const raw = container?.['objectReference'] ?? result['objectReference'];\n const matches = (Array.isArray(raw) ? raw : [raw])\n .map(asRecord)\n .filter((item): item is Record<string, unknown> => Boolean(item));\n // Match by exact function-module name, then pick the first result\n // whose URI resolves to a FUGR owner. This avoids a same-named\n // non-FUGR object (e.g. FUGR/F) masking the valid function-group\n // result when it appears earlier in the response.\n const ownerName = matches\n .filter(\n (item) =>\n nonEmptyString(item['name'])?.toUpperCase() ===\n reference.name.trim().toUpperCase(),\n )\n .map((item) => repositoryNameFromUri(nonEmptyString(item['uri']), 'FUGR'))\n .find((name): name is string => Boolean(name));\n return ownerName\n ? {\n pgmid: 'R3TR',\n type: 'FUGR/FF',\n name: reference.name.trim().toUpperCase(),\n functionGroupName: ownerName,\n isDeleted: reference.isDeleted,\n }\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction resolveLimuReference(\n reference: TransportObjectReference,\n pgmid: string,\n rawType: string,\n): RepositoryObjectReference | undefined {\n if (pgmid !== 'LIMU') return undefined;\n const ownerType = reference.wbtype?.trim().toUpperCase();\n const ownerName = ownerType\n ? repositoryNameFromUri(reference.uri, ownerType)\n : undefined;\n if (ownerType && ownerName) {\n return {\n pgmid: 'R3TR',\n type: ownerType,\n name: ownerName,\n // A deleted leaf changes its owner. Only REPS preserves the legacy\n // whole-program deletion behavior when no R3TR parent is present.\n isDeleted: rawType === 'REPS' && reference.isDeleted,\n };\n }\n if (rawType === 'REPS') {\n return {\n pgmid: 'R3TR',\n type: 'PROG',\n name: reference.name.trim().toUpperCase(),\n isDeleted: reference.isDeleted,\n };\n }\n return undefined;\n}\n\nfunction fallbackReference(\n reference: TransportObjectReference,\n pgmid: string,\n rawTypeFull: string,\n): RepositoryObjectReference {\n return {\n pgmid,\n type: rawTypeFull,\n name: reference.name.trim().toUpperCase(),\n isDeleted: reference.isDeleted,\n };\n}\n\n/** Resolve a CTS object to the repository object that owns its source. */\nasync function repositoryObjectReference(\n reference: TransportObjectReference,\n context: AdkContext,\n): Promise<RepositoryObjectReference> {\n const pgmid = reference.pgmid.trim().toUpperCase();\n const rawTypeFull = reference.type.trim().toUpperCase();\n const rawType = rawTypeFull.split('/')[0] ?? '';\n return (\n resolveFuncGroupReference(reference, rawType) ??\n (await resolveFuncGroupBySearch(reference, context)) ??\n resolveLimuReference(reference, pgmid, rawType) ??\n fallbackReference(reference, pgmid, rawTypeFull)\n );\n}\n\nfunction selectorValues(value: string | string[] | undefined): string[] {\n if (value === undefined) return [];\n return (Array.isArray(value) ? value : [value]).map((item) =>\n item.trim().toUpperCase(),\n );\n}\n\nfunction selectorDimensionMatches(\n candidates: readonly string[],\n expected: string | string[] | undefined,\n): boolean {\n const values = selectorValues(expected);\n if (values.length === 0) return true;\n return values.some((value) => value === '*' || candidates.includes(value));\n}\n\nfunction manifestSelectorMatches(\n original: TransportObjectReference,\n repository: RepositoryObjectReference,\n selector: TransportObjectSelector | undefined,\n): boolean {\n if (!selector) return true;\n const repositoryType = repository.type.trim().toUpperCase();\n const repositoryMainType = repositoryType.split('/')[0] ?? '';\n return (\n selectorDimensionMatches(\n [original.objFunc.trim().toUpperCase()],\n selector.objFunc,\n ) &&\n selectorDimensionMatches(\n [original.pgmid.trim().toUpperCase(), repository.pgmid],\n selector.pgmid,\n ) &&\n selectorDimensionMatches(\n [\n original.type.trim().toUpperCase(),\n repositoryType,\n ...(repositoryMainType && repositoryMainType !== repositoryType\n ? [repositoryMainType]\n : []),\n ],\n selector.type,\n )\n );\n}\n\nfunction inventoryEntry(\n reference: TransportObjectReference,\n sourceTransport: string,\n): TransportObjectInventoryEntry {\n const wbtype = reference.wbtype?.trim().toUpperCase();\n const uri = reference.uri?.trim();\n return {\n pgmid: reference.pgmid.trim().toUpperCase(),\n type: reference.type.trim().toUpperCase(),\n name: reference.name.trim().toUpperCase(),\n ...(wbtype ? { wbtype } : {}),\n ...(uri ? { uri } : {}),\n objFunc: reference.objFunc.trim().toUpperCase(),\n sourceTransport,\n };\n}\n\n/**\n * CTS exposes a program's main source as the LIMU/REPS sub-object, while ADT\n * exposes the same source history through the repository PROG resource. Keep\n * the CTS key in the public manifest, but use the ADT model identity for\n * metadata and immutable-version discovery.\n */\nfunction sourceHistoryDiscoveryType(\n reference: RepositoryObjectReference,\n): string {\n const pgmid = reference.pgmid.trim().toUpperCase();\n const type = reference.type.trim().toUpperCase().split('/')[0];\n return pgmid === 'LIMU' && type === 'REPS' ? 'PROG' : reference.type;\n}\n\nasync function buildObjectEntries( // NOSONAR - SAP object manifest construction is branch-heavy; will be refactored in follow-up\n original: TransportObjectReference,\n repository: RepositoryObjectReference,\n sourceTransport: string,\n scopeTransportNumbers: readonly string[],\n ctx: AdkContext,\n): Promise<TransportSourceManifestEntry[]> {\n const baseIdentity: TransportSourceManifestObject = {\n pgmid: original.pgmid,\n type: original.type,\n name: original.name,\n };\n const hasRepositoryOwner =\n repository.pgmid !== baseIdentity.pgmid ||\n repository.type !== baseIdentity.type ||\n repository.name !== baseIdentity.name;\n const withRepositoryOwner = (\n entry: TransportSourceManifestEntry,\n packageName?: string,\n ): TransportSourceManifestEntry =>\n hasRepositoryOwner\n ? {\n ...entry,\n repositoryObject: {\n pgmid: repository.pgmid,\n type: repository.functionGroupName ? 'FUGR' : repository.type,\n name: repository.functionGroupName ?? repository.name,\n ...(packageName ? { packageName } : {}),\n },\n }\n : entry;\n let discovery: ObjectSourceDiscovery;\n try {\n discovery = await discoverObjectSourceHistory(\n repository.name,\n sourceHistoryDiscoveryType(repository),\n ctx,\n false,\n repository.functionGroupName,\n );\n } catch (error) {\n if (!(error instanceof ObjectSourceHistoryError)) throw error;\n const failureIdentity: TransportSourceManifestObject = {\n ...baseIdentity,\n ...(error.object.packageName\n ? { packageName: error.object.packageName }\n : {}),\n };\n return [\n withRepositoryOwner(\n unavailableEntry(\n failureIdentity,\n { id: 'object' },\n sourceTransport,\n 'unsupported',\n {\n code: error.code,\n message: error.message,\n },\n ),\n ),\n ];\n }\n\n const identity: TransportSourceManifestObject = {\n ...baseIdentity,\n ...(discovery.object.packageName\n ? { packageName: discovery.object.packageName }\n : {}),\n };\n\n // A function module is a child of its function group. The generic\n // root-source id is only unique within one object, so use the FM name\n // as the source-map key. This rename is scoped to the transport\n // manifest (the flow source map) so the public\n // listObjectSourceVersions API keeps returning the real root id.\n const manifestComponents =\n repository.type === 'FUGR/FF'\n ? discovery.components.map((component) =>\n component.id === 'main'\n ? { ...component, id: repository.name.toLowerCase() }\n : component,\n )\n : discovery.components;\n\n const entries: TransportSourceManifestEntry[] = [];\n for (const component of manifestComponents) {\n const publicComponent: TransportSourceManifestComponent = {\n id: component.id,\n ...(component.sourceUri ? { sourceUri: component.sourceUri } : {}),\n ...(component.versionsUri ? { versionsUri: component.versionsUri } : {}),\n };\n\n if (component.diagnostic) {\n entries.push(\n withRepositoryOwner(\n unavailableEntry(\n identity,\n publicComponent,\n sourceTransport,\n 'unsupported',\n component.diagnostic,\n ),\n discovery.object.packageName,\n ),\n );\n continue;\n }\n\n if (!component.versionsUri) {\n entries.push(\n withRepositoryOwner(\n unavailableEntry(\n identity,\n publicComponent,\n sourceTransport,\n 'unsupported',\n {\n code: 'SOURCE_COMPONENT_VERSIONS_UNAVAILABLE',\n message: 'The source component has no exact versions relation.',\n },\n ),\n discovery.object.packageName,\n ),\n );\n continue;\n }\n\n let versions: SourceVersionRef[];\n try {\n versions = await ctx.client.services.sourceHistory.listVersions(\n component.versionsUri,\n );\n } catch {\n entries.push(\n withRepositoryOwner(\n unavailableEntry(\n identity,\n publicComponent,\n sourceTransport,\n 'failed',\n {\n code: 'SOURCE_HISTORY_RETRIEVAL_FAILED',\n message: 'SAP ADT rejected source-history metadata retrieval.',\n },\n ),\n discovery.object.packageName,\n ),\n );\n continue;\n }\n\n const selection = selectTransportSourceVersions(\n versions,\n scopeTransportNumbers,\n repository.isDeleted,\n );\n entries.push(\n withRepositoryOwner(\n {\n object: identity,\n component: publicComponent,\n sourceTransport,\n ...selection,\n },\n discovery.object.packageName,\n ),\n );\n }\n\n return entries;\n}\n\n/**\n * List immutable source-version metadata for every discovered object component.\n * Source bodies remain lazy and are never read by this operation.\n */\nexport async function listObjectSourceVersions(\n objectName: string,\n objectType: string,\n options: ListObjectSourceVersionsOptions = {},\n ctx?: AdkContext,\n): Promise<ObjectSourceVersionsResult> {\n const context = ctx ?? getGlobalContext();\n const discovery = await discoverObjectSourceHistory(\n objectName,\n objectType,\n context,\n );\n const requestedComponent = options.component?.trim().toUpperCase();\n const components =\n options.component !== undefined\n ? discovery.components.filter(\n (component) => component.id.toUpperCase() === requestedComponent,\n )\n : discovery.components;\n if (components.length === 0) {\n throw new ObjectSourceHistoryError(\n 'SOURCE_COMPONENT_NOT_FOUND',\n 'The requested source component was not exposed by object metadata.',\n discovery.object,\n );\n }\n\n const results: ObjectSourceVersionsComponent[] = [];\n for (const component of components) {\n const publicComponent: TransportSourceManifestComponent = {\n id: component.id,\n ...(component.sourceUri ? { sourceUri: component.sourceUri } : {}),\n ...(component.versionsUri ? { versionsUri: component.versionsUri } : {}),\n };\n if (component.diagnostic) {\n results.push({ ...publicComponent, diagnostic: component.diagnostic });\n continue;\n }\n if (!component.versionsUri) {\n results.push({\n ...publicComponent,\n diagnostic: {\n code: 'SOURCE_COMPONENT_VERSIONS_UNAVAILABLE',\n message: 'The source component has no exact versions relation.',\n },\n });\n continue;\n }\n try {\n const versions = await context.client.services.sourceHistory.listVersions(\n component.versionsUri,\n );\n results.push({ ...publicComponent, versions });\n } catch {\n results.push({\n ...publicComponent,\n diagnostic: {\n code: 'SOURCE_HISTORY_RETRIEVAL_FAILED',\n message: 'SAP ADT rejected source-history metadata retrieval.',\n },\n });\n }\n }\n\n return { object: discovery.object, components: results };\n}\n\n/**\n * Resolve transport objects and produce immutable source-history references.\n * Source bodies remain lazy and are never read while building the manifest.\n */\nexport async function buildTransportSourceManifest(\n requestedTransports: string[],\n options: BuildTransportSourceManifestOptions = {},\n ctx?: AdkContext,\n): Promise<TransportSourceManifest> {\n const context = ctx ?? getGlobalContext();\n const requested = uniqueStable(requestedTransports);\n const resolved = await resolveTransportObjects(requested, {}, context);\n const scopeTransports = uniqueStable([\n ...requested,\n ...resolved.scopeTransportNumbers,\n ]);\n const inventory = resolved.objects\n .map((reference) =>\n inventoryEntry(\n reference,\n resolved.sourceTransportMap.get(reference.key) ?? requested[0] ?? '',\n ),\n )\n .sort(\n (left, right) =>\n compareText(left.sourceTransport, right.sourceTransport) ||\n compareText(left.pgmid, right.pgmid) ||\n compareText(left.type, right.type) ||\n compareText(left.name, right.name),\n );\n const seenRepositoryObjects = new Set<string>();\n const objects = (\n await mapOrdered(\n resolved.objects.filter((reference) => !isNonSourceCtsObject(reference)),\n normalizeConcurrency(options.concurrency),\n async (original) => ({\n original,\n repository: await repositoryObjectReference(original, context),\n sourceTransport:\n resolved.sourceTransportMap.get(original.key) ?? requested[0] ?? '',\n }),\n )\n )\n .filter(({ original, repository }) =>\n manifestSelectorMatches(original, repository, options.selector),\n )\n .filter(({ repository }) => {\n const key = `${repository.pgmid}/${repository.type}/${repository.name}`;\n if (seenRepositoryObjects.has(key)) return false;\n seenRepositoryObjects.add(key);\n return true;\n })\n .sort(\n (left, right) =>\n compareText(left.repository.pgmid, right.repository.pgmid) ||\n compareText(left.repository.type, right.repository.type) ||\n compareText(left.repository.name, right.repository.name),\n );\n\n const perObjectEntries = await mapOrdered(\n objects,\n normalizeConcurrency(options.concurrency),\n ({ original, repository, sourceTransport }) =>\n buildObjectEntries(\n original,\n repository,\n sourceTransport,\n scopeTransports,\n context,\n ),\n );\n\n return {\n requestedTransports: requested,\n scopeTransports,\n inventory,\n entries: perObjectEntries.flat(),\n };\n}\n"],"mappings":"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"}
|