@abapify/adt-plugin-abapgit 0.4.0 → 0.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/dist/index.d.mts +224 -0
- package/dist/index.d.mts.map +1 -0
- package/dist/index.mjs +7235 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +7 -7
- package/xsd/dcls.xsd +11 -0
- package/xsd/ddls.xsd +8 -0
- package/xsd/ddlx.xsd +32 -0
- package/xsd/enqu.xsd +38 -0
- package/xsd/msag.xsd +37 -0
- package/xsd/shlp.xsd +41 -0
- package/xsd/tran.xsd +38 -0
- package/xsd/type.xsd +34 -0
- package/xsd/types/dd25v.xsd +18 -0
- package/xsd/types/dd26v.xsd +22 -0
- package/xsd/types/dd27p.xsd +30 -0
- package/xsd/types/dd28v.xsd +23 -0
- package/xsd/types/dd30v.xsd +20 -0
- package/xsd/types/dd31v.xsd +15 -0
- package/xsd/types/dd32p.xsd +28 -0
- package/xsd/types/dd33v.xsd +22 -0
- package/xsd/types/t100.xsd +20 -0
- package/xsd/types/t100a.xsd +13 -0
- package/xsd/types/tstc.xsd +15 -0
- package/xsd/types/tstcc.xsd +15 -0
- package/xsd/types/tstct.xsd +19 -0
- package/xsd/types/typepool.xsd +12 -0
- package/xsd/types/xslt.xsd +12 -0
- package/xsd/view.xsd +41 -0
- package/xsd/xslt.xsd +34 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["_clas","_devc","_doma","_dtel","_intf","_prog","_fugr","_tabl","_ttyp","_bdef","_srvd","_srvb","_dcls","_ddls","_ddlx","_msag","_view","_enqu","_shlp","_tran","_type","_xslt","normalizeItems","normalizeItems","normalizeItems","typeSchema","getAbapGitHandler","unlinkError"],"sources":["../src/lib/handlers/xml-format.ts","../src/lib/handlers/base.ts","../src/lib/handlers/abapgit-schema.ts","../src/schemas/generated/schemas/clas.ts","../src/schemas/generated/schemas/devc.ts","../src/schemas/generated/schemas/doma.ts","../src/schemas/generated/schemas/dtel.ts","../src/schemas/generated/schemas/intf.ts","../src/schemas/generated/schemas/prog.ts","../src/schemas/generated/schemas/fugr.ts","../src/schemas/generated/schemas/tabl.ts","../src/schemas/generated/schemas/ttyp.ts","../src/schemas/generated/schemas/bdef.ts","../src/schemas/generated/schemas/srvd.ts","../src/schemas/generated/schemas/srvb.ts","../src/schemas/generated/schemas/dcls.ts","../src/schemas/generated/schemas/ddls.ts","../src/schemas/generated/schemas/ddlx.ts","../src/schemas/generated/schemas/msag.ts","../src/schemas/generated/schemas/view.ts","../src/schemas/generated/schemas/enqu.ts","../src/schemas/generated/schemas/shlp.ts","../src/schemas/generated/schemas/tran.ts","../src/schemas/generated/schemas/type.ts","../src/schemas/generated/schemas/xslt.ts","../src/schemas/generated/index.ts","../src/lib/handlers/lang.ts","../src/lib/handlers/objects/clas.ts","../src/lib/handlers/objects/intf.ts","../src/lib/handlers/objects/devc.ts","../src/lib/handlers/objects/prog.ts","../src/lib/handlers/source-inclusion.ts","../src/lib/handlers/objects/fugr.ts","../src/lib/handlers/objects/doma.ts","../src/lib/handlers/objects/dtel.ts","../src/lib/handlers/cds-to-abapgit.ts","../src/lib/handlers/objects/tabl-serialize.ts","../src/lib/handlers/objects/tabl.ts","../src/lib/handlers/objects/ttyp.ts","../src/lib/handlers/source-resolver.ts","../src/lib/handlers/objects/bdef.ts","../src/lib/handlers/objects/srvd.ts","../src/lib/handlers/objects/srvb.ts","../src/lib/handlers/objects/cds-aff-source.ts","../src/lib/handlers/objects/dcls.ts","../src/lib/handlers/objects/ddls.ts","../src/lib/handlers/objects/ddlx.ts","../src/lib/handlers/objects/msag.ts","../src/lib/handlers/objects/view.ts","../src/lib/handlers/objects/enqu.ts","../src/lib/handlers/objects/shlp.ts","../src/lib/handlers/objects/tran.ts","../src/lib/handlers/objects/type.ts","../src/lib/handlers/objects/xslt.ts","../src/lib/handlers/objects/dras.ts","../src/lib/handlers/objects/drty.ts","../src/lib/handlers/objects/dsfd.ts","../src/lib/handlers/objects/dsfi.ts","../src/lib/handlers/objects/dteb.ts","../src/lib/handlers/objects/dtdc.ts","../src/lib/handlers/objects/dtix.ts","../src/lib/handlers/objects/dtsc.ts","../src/lib/handlers/objects/desd.ts","../src/lib/handlers/aff-handler.ts","../src/lib/handlers/objects/aplo.ts","../src/lib/handlers/objects/bgqc.ts","../src/lib/handlers/objects/cdbo.ts","../src/lib/handlers/objects/chkc.ts","../src/lib/handlers/objects/chko.ts","../src/lib/handlers/objects/chkv.ts","../src/lib/handlers/objects/cota.ts","../src/lib/handlers/objects/evtb.ts","../src/lib/handlers/objects/gsmp.ts","../src/lib/handlers/objects/nont.ts","../src/lib/handlers/objects/ront.ts","../src/lib/handlers/objects/sajc.ts","../src/lib/handlers/objects/sajt.ts","../src/lib/handlers/objects/smbc.ts","../src/lib/handlers/objects/uiad.ts","../src/lib/handlers/objects/uipg.ts","../src/lib/handlers/objects/uist.ts","../src/lib/folder-logic.ts","../src/lib/filename-parser.ts","../src/lib/deserializer.ts","../src/lib/format-plugin.ts","../src/lib/serializer.ts","../src/lib/abapgit.ts","../src/index.ts"],"sourcesContent":["/**\n * XML formatting utilities for abapGit serialization.\n *\n * Centralizes XML post-processing that was previously duplicated\n * across base.ts, fugr.ts, tabl.ts, and roundtrip.ts.\n *\n * Uses indexOf-based parsing instead of regex to avoid\n * super-linear backtracking (SonarQube S5852).\n */\n\n/**\n * Extract `name=\"value\"` attribute pairs from an XML attribute string\n * using indexOf-based scanning (no regex).\n */\nfunction extractAttributes(content: string): string[] {\n const attrs: string[] = [];\n let i = 0;\n while (i < content.length) {\n // Skip whitespace\n while (\n i < content.length &&\n (content[i] === ' ' || content[i] === '\\n' || content[i] === '\\t')\n )\n i++;\n if (i >= content.length) break;\n\n // Find '=' for attribute name boundary\n const eqIdx = content.indexOf('=', i);\n if (eqIdx === -1) break;\n\n // Find opening quote\n const openQuote = content.indexOf('\"', eqIdx + 1);\n if (openQuote === -1) break;\n\n // Find closing quote\n const closeQuote = content.indexOf('\"', openQuote + 1);\n if (closeQuote === -1) break;\n\n attrs.push(content.slice(i, closeQuote + 1));\n i = closeQuote + 1;\n }\n return attrs;\n}\n\n/**\n * Format XML attributes on separate lines for better diff readability.\n *\n * Turns `<tag a=\"1\" b=\"2\">` into:\n * ```\n * <tag\n * a=\"1\"\n * b=\"2\"\n * >\n * ```\n *\n * Uses indexOf-based scanning to avoid regex backtracking (S5852).\n */\nexport function formatXmlAttributes(xml: string): string {\n let result = '';\n let pos = 0;\n\n while (pos < xml.length) {\n const openBracket = xml.indexOf('<', pos);\n if (openBracket === -1) {\n result += xml.slice(pos);\n break;\n }\n\n // Copy everything before '<'\n result += xml.slice(pos, openBracket);\n\n const closeBracket = xml.indexOf('>', openBracket);\n if (closeBracket === -1) {\n result += xml.slice(openBracket);\n break;\n }\n\n const tagContent = xml.slice(openBracket + 1, closeBracket);\n const spaceIdx = tagContent.indexOf(' ');\n\n // No attributes, or special tags (</, <!, <?)\n if (\n spaceIdx === -1 ||\n tagContent[0] === '/' ||\n tagContent[0] === '!' ||\n tagContent[0] === '?'\n ) {\n result += xml.slice(openBracket, closeBracket + 1);\n pos = closeBracket + 1;\n continue;\n }\n\n const tag = tagContent.slice(0, spaceIdx);\n const attrPart = tagContent.slice(spaceIdx + 1);\n const isSelfClosing = attrPart.trimEnd().endsWith('/');\n const attrContent = isSelfClosing\n ? attrPart.slice(0, attrPart.lastIndexOf('/'))\n : attrPart;\n\n const attrs = extractAttributes(attrContent);\n if (attrs.length === 0) {\n result += xml.slice(openBracket, closeBracket + 1);\n } else {\n const attrsJoined = attrs.map((a) => `\\n ${a}`).join('');\n const selfCloseMarker = isSelfClosing ? '/' : '';\n result += `<${tag}${attrsJoined}\\n${selfCloseMarker}>`;\n }\n pos = closeBracket + 1;\n }\n\n return result;\n}\n\n/**\n * Move `xmlns:asx` declaration from root `<abapGit>` to nested `<asx:abap>`.\n *\n * Uses indexOf-based approach instead of regex to avoid backtracking on\n * the `[\\s\\S]*?` pattern that SonarQube flags.\n */\nexport function moveNamespaceToAbap(xml: string): string {\n const nsDecl = ' xmlns:asx=\"http://www.sap.com/abapxml\"';\n const nsIdx = xml.indexOf(nsDecl);\n if (nsIdx === -1) return xml;\n\n // Verify the namespace is on the <abapGit root element\n const tagStart = xml.lastIndexOf('<abapGit', nsIdx);\n if (tagStart === -1) return xml;\n\n // Remove from root\n const stripped = xml.slice(0, nsIdx) + xml.slice(nsIdx + nsDecl.length);\n\n // Insert on <asx:abap element\n const asxTag = '<asx:abap';\n const asxIdx = stripped.indexOf(asxTag);\n if (asxIdx === -1) return stripped;\n\n return (\n stripped.slice(0, asxIdx + asxTag.length) +\n '\\n ' +\n nsDecl.trim() +\n stripped.slice(asxIdx + asxTag.length)\n );\n}\n\n/**\n * Apply standard abapGit XML formatting:\n * 1. Format attributes on separate lines\n * 2. Move xmlns:asx to asx:abap element\n */\nexport function formatAbapGitXml(xml: string): string {\n return moveNamespaceToAbap(formatXmlAttributes(xml));\n}\n","/**\n * Handler Factory for abapGit object serialization\n *\n * Provides `createHandler` factory for creating object handlers.\n * Handlers auto-register when created.\n */\n\nimport type { AdkObject, AdkKind } from '@abapify/adk';\nimport { getTypeForKind, getMainType } from '@abapify/adk';\nimport {\n FormatMaterializationError,\n type FormatSerializeOptions,\n} from '@abapify/adt-plugin';\nimport type {\n AbapGitSchema,\n InferAbapGitType,\n InferValuesType,\n} from './abapgit-schema';\nimport { formatAbapGitXml } from './xml-format';\n\n/**\n * Extract the data type (D) from an AdkObject<K, D>\n * This allows us to infer the payload type from the ADK class itself\n */\nexport type InferAdkData<T> =\n T extends AdkObject<infer _K, infer D> ? D : never;\n\n/**\n * ADK object class type\n * Used to pass ADK classes to createHandler\n *\n * We use `any[]` for constructor args since we only need the static `kind` property,\n * not to actually instantiate the class.\n */\n\nexport type AdkObjectClass<T extends AdkObject = AdkObject> = {\n new (...args: any[]): T;\n readonly kind: AdkKind;\n};\n\n// ============================================\n// Handler Types\n// ============================================\n\n/**\n * ABAP object type code (e.g., 'CLAS', 'INTF', 'DOMA')\n */\nexport type AbapObjectType = string;\n\n/**\n * Result of serializing a single file\n */\nexport interface SerializedFile {\n /** Relative path from object directory */\n path: string;\n /** File content */\n content: string;\n /** Optional encoding (default: utf-8) */\n encoding?: BufferEncoding;\n}\n\n/**\n * Handler interface for object serialization/deserialization\n *\n * @typeParam T - ADK object type\n * @typeParam TSchema - AbapGit schema type (provides type-safe values)\n */\nexport interface ObjectHandler<\n T extends AdkObject = AdkObject,\n TSchema extends AbapGitSchema<unknown, unknown> = AbapGitSchema<\n unknown,\n unknown\n >,\n> {\n /** ABAP object type (e.g., 'CLAS', 'INTF') */\n readonly type: AbapObjectType;\n /** File extension for this type (e.g., 'clas', 'intf') */\n readonly fileExtension: string;\n /** Schema for parsing/building XML */\n readonly schema: TSchema;\n /** Map abapGit file suffix to source key */\n readonly suffixToSourceKey?: Record<string, string>;\n /** Whether this handler treats an explicit `sources` map as authoritative. */\n readonly supportsExplicitSources?: boolean;\n /** Serialize object to files (SAP → Git) */\n serialize(\n object: T,\n options?: FormatSerializeOptions,\n ): Promise<SerializedFile[]>;\n /**\n * Map abapGit values to ADK data (Git → SAP)\n * Return type includes name (required) plus any ADK data fields\n */\n fromAbapGit?(\n values: InferValuesType<TSchema>,\n ): Partial<InferAdkData<T>> & { name: string };\n\n /**\n * Map AFF JSON metadata to ADK data (Git → SAP)\n * Used when the metadata file is `.json` (ABAP File Format) instead of legacy `.xml`.\n * Receives the parsed JSON object and returns the full payload including name.\n */\n fromAffJson?(json: Record<string, unknown>): Partial<InferAdkData<T>> & {\n name: string;\n };\n\n /**\n * Set source files on ADK object during deserialization (Git → SAP)\n * Symmetric counterpart to getSources\n */\n setSources?(object: T, sources: Record<string, string>): void;\n}\n\n/**\n * Re-export AbapGitSchema types for handler definitions\n */\nexport type {\n AbapGitSchema,\n InferAbapGitType,\n InferValuesType,\n} from './abapgit-schema';\n\n// ============================================\n// Global Handler Registry\n// ============================================\n\nconst handlerRegistry = new Map<AbapObjectType, ObjectHandler>();\n\n/**\n * Get handler for object type\n *\n * Tries the full type first (e.g., 'TABL/DS'), then falls back to the\n * main type (e.g., 'CLAS/OC' → 'CLAS'). This matches ADK's resolveType()\n * behaviour and handles quickSearch results that return subtypes.\n */\nexport function getHandler(type: AbapObjectType): ObjectHandler | undefined {\n return handlerRegistry.get(type) ?? handlerRegistry.get(getMainType(type));\n}\n\n/**\n * Check if object type is supported\n *\n * Tries the full type first, then falls back to the main type.\n */\nexport function isSupported(type: AbapObjectType): boolean {\n return handlerRegistry.has(type) || handlerRegistry.has(getMainType(type));\n}\n\n/**\n * Get all supported object types\n */\nexport function getSupportedTypes(): AbapObjectType[] {\n return [...handlerRegistry.keys()];\n}\n\n// ============================================\n// Deserialization Context\n// ============================================\n\n/**\n * Payload for creating ADK objects from abapGit\n * Contains all data needed to construct an object (name, metadata, sources)\n */\nexport interface ObjectPayload {\n /** Object name */\n name: string;\n /** Object description */\n description?: string;\n /** Source files keyed by include type (e.g., { main: '...', testclasses: '...' }) */\n sources?: Record<string, string>;\n /** Additional type-specific data */\n [key: string]: unknown;\n}\n\n// ============================================\n// Handler Factory\n// ============================================\n\n/**\n * Handler definition passed to createHandler\n *\n * @typeParam T - ADK object type\n * @typeParam TSchema - The AbapGit schema (provides both full type and values type)\n */\nexport interface HandlerDefinition<\n T extends AdkObject,\n TSchema extends AbapGitSchema<unknown, unknown> = AbapGitSchema<\n unknown,\n unknown\n >,\n> {\n /** AbapGit typed schema for XML generation */\n schema: TSchema;\n\n /** abapGit format version */\n version: string;\n\n /** Serializer class name (e.g., 'LCL_OBJECT_DEVC') */\n serializer: string;\n\n /** Serializer version */\n serializer_version: string;\n\n /**\n * Map ADK object to abapGit values (inner content only)\n * The base class wraps this in the full AbapGitType structure\n */\n toAbapGit(object: T): InferValuesType<TSchema>;\n\n /**\n * Map abapGit values to ADK data (optional)\n * Symmetric counterpart to toAbapGit - used for export (Git → SAP)\n *\n * @param values - Parsed abapGit values (same type as toAbapGit returns)\n * @returns Partial ADK data with name for deserialization\n */\n fromAbapGit?(\n values: InferValuesType<TSchema>,\n ): Partial<InferAdkData<T>> & { name: string };\n\n /**\n * Map AFF JSON metadata to ADK data (Git → SAP)\n * Used when the metadata file is `.json` (ABAP File Format) instead of legacy `.xml`.\n * Receives the parsed JSON object and returns the full payload including name.\n */\n fromAffJson?(json: Record<string, unknown>): Partial<InferAdkData<T>> & {\n name: string;\n };\n\n /**\n * Map abapGit file suffix to source key (for objects with multiple sources)\n * Used during deserialization to map file suffixes to source keys\n *\n * @example For CLAS: { 'locals_def': 'definitions', 'testclasses': 'testclasses' }\n */\n suffixToSourceKey?: Record<string, string>;\n\n /**\n * Whether this handler treats an explicit `sources` map as authoritative.\n * If omitted, the factory infers it from `getSource`/`getSources` or from\n * the custom `serialize` arity.\n */\n supportsExplicitSources?: boolean;\n\n /**\n * Custom filename for XML file (optional)\n * Default: `${objectName}.${type}.xml`\n *\n * @example 'package.devc.xml' for DEVC which doesn't use object name\n */\n xmlFileName?:\n | string\n | ((\n object: T,\n ctx: HandlerContext<T, InferAbapGitType<TSchema>>,\n ) => string);\n\n /**\n * Get source code from object (optional)\n * If provided, default serialize will create both .abap and .xml files\n *\n * @example getSource: (obj) => obj.getSource()\n */\n getSource?(object: T): Promise<string>;\n\n /**\n * Get multiple source files from object (optional)\n * For objects with multiple source files (e.g., CLAS with includes)\n * Returns array of { suffix?, content } or promises - resolved automatically\n *\n * @example getSources: (cls) => cls.includes.map((inc) => ({\n * suffix: SUFFIX_MAP[inc.includeType],\n * content: cls.getIncludeSource(inc.includeType),\n * }))\n */\n getSources?(\n object: T,\n ): Array<{ suffix?: string; content: string | Promise<string> }>;\n\n /**\n * Set source files on ADK object during deserialization (Git → SAP)\n * Symmetric counterpart to getSources\n *\n * @param object - ADK object to set sources on\n * @param sources - Source files keyed by source key (e.g., { main: '...', testclasses: '...' })\n *\n * @example setSources: (cls, sources) => {\n * if (sources.main) cls.setSource(sources.main);\n * if (sources.testclasses) cls.setIncludeSource('testclasses', sources.testclasses);\n * }\n */\n setSources?(object: T, sources: Record<string, string>): void;\n\n /**\n * Serialize object to files (optional)\n * Default behavior:\n * - If getSources provided: creates multiple .abap + .xml files\n * - If getSource provided: creates single .abap + .xml files\n * - Otherwise: creates only .xml file\n *\n * Override only for very custom serialization logic\n */\n serialize?(\n object: T,\n ctx: HandlerContext<T, InferAbapGitType<TSchema>>,\n options?: FormatSerializeOptions,\n ): Promise<SerializedFile[]>;\n}\n\n/**\n * Context passed to serialize function with helper utilities\n */\nexport interface HandlerContext<T extends AdkObject, _TData = unknown> {\n /** ABAP object type */\n readonly type: AbapObjectType;\n /** File extension (lowercase type) */\n readonly fileExtension: string;\n\n /** Get object name in lowercase */\n getObjectName(object: T): string;\n /** Get object data synchronously */\n getData(object: T): Record<string, unknown>;\n /** Resolve lazy content */\n resolveContent(content: unknown): Promise<string>;\n\n /** Convert to abapGit XML using schema */\n toAbapGitXml(object: T): string;\n\n /** Create a file entry */\n createFile(\n path: string,\n content: string,\n encoding?: BufferEncoding,\n ): SerializedFile;\n /** Create XML metadata file */\n createXmlFile(objectName: string, xmlContent: string): SerializedFile;\n /** Create ABAP source file */\n createAbapFile(\n objectName: string,\n content: string,\n suffix?: string,\n ): SerializedFile;\n}\n\n/**\n * Create an object handler from ADK class\n */\nexport function createHandler<\n T extends AdkObject,\n TSchema extends AbapGitSchema<unknown, unknown> = AbapGitSchema<\n unknown,\n unknown\n >,\n>(\n adkClass: AdkObjectClass<T>,\n definition: HandlerDefinition<T, TSchema>,\n): ObjectHandler<T>;\n\n/**\n * Create an object handler from ABAP type string\n * Use this for object types without ADK class (e.g., DTEL, DOMA)\n */\nexport function createHandler<\n T extends AdkObject = AdkObject,\n TSchema extends AbapGitSchema<unknown, unknown> = AbapGitSchema<\n unknown,\n unknown\n >,\n>(\n type: AbapObjectType,\n definition: HandlerDefinition<T, TSchema>,\n): ObjectHandler<T>;\n\n/**\n * Create an object handler\n *\n * @param adkClassOrType - ADK object class or ABAP type string\n * @param definition - Handler definition with schema, toAbapGit, serialize\n * @returns ObjectHandler that is auto-registered\n *\n * @example\n * ```typescript\n * // With ADK class (preferred)\n * import { AdkPackage } from '@abapify/adk';\n * export const packageHandler = createHandler(AdkPackage, { ... });\n *\n * // With ABAP type string (for objects without ADK class)\n * export const dataElementHandler = createHandler('DTEL', { ... });\n * ```\n */\nexport function createHandler<\n T extends AdkObject,\n TSchema extends AbapGitSchema<unknown, unknown> = AbapGitSchema<\n unknown,\n unknown\n >,\n>(\n adkClassOrType: AdkObjectClass<T> | AbapObjectType,\n definition: HandlerDefinition<T, TSchema>,\n): ObjectHandler<T> {\n // Determine ABAP type\n let type: AbapObjectType;\n\n if (typeof adkClassOrType === 'string') {\n // Direct ABAP type string\n type = adkClassOrType;\n } else {\n // ADK class - derive from static kind\n const kind = adkClassOrType.kind;\n const derivedType = getTypeForKind(kind);\n if (!derivedType) {\n throw new Error(\n `Unknown ADK kind: ${kind}. Make sure the ADK class has a static 'kind' property.`,\n );\n }\n type = derivedType;\n }\n\n const fileExtension = getMainType(type).toLowerCase();\n\n // Create handler context with utilities\n const ctx: HandlerContext<T, InferAbapGitType<TSchema>> = {\n type,\n fileExtension,\n\n getObjectName(object: T): string {\n return object.name.toLowerCase();\n },\n\n getData(object: T): Record<string, unknown> {\n return object.dataSync as Record<string, unknown>;\n },\n\n async resolveContent(content: unknown): Promise<string> {\n if (!content) return '';\n if (typeof content === 'string') return content;\n if (typeof content === 'function') return await content();\n return '';\n },\n\n toAbapGitXml(object: T): string {\n // Get values from handler\n const values = definition.toAbapGit(object);\n\n // Construct full AbapGitType payload\n const fullPayload = {\n abap: {\n version: '1.0', // Explicit version attribute for asx:abap\n values,\n },\n version: definition.version,\n serializer: definition.serializer,\n serializer_version: definition.serializer_version,\n } as InferAbapGitType<TSchema>;\n\n // Build XML with pretty formatting for readability\n const xml = definition.schema.build(fullPayload, { pretty: true });\n\n return formatAbapGitXml(xml);\n },\n\n createFile(\n path: string,\n content: string,\n encoding?: BufferEncoding,\n ): SerializedFile {\n return { path, content, encoding };\n },\n\n createXmlFile(objectName: string, xmlContent: string): SerializedFile {\n return {\n path: `${objectName}.${fileExtension}.xml`,\n content: xmlContent,\n };\n },\n\n createAbapFile(\n objectName: string,\n content: string,\n suffix?: string,\n ): SerializedFile {\n const fileName = suffix\n ? `${objectName}.${fileExtension}.${suffix}.abap`\n : `${objectName}.${fileExtension}.abap`;\n return { path: fileName, content };\n },\n };\n\n function resolveXmlFileName(object: T): string {\n if (definition.xmlFileName) {\n return typeof definition.xmlFileName === 'function'\n ? definition.xmlFileName(object, ctx)\n : definition.xmlFileName;\n }\n return `${ctx.getObjectName(object)}.${fileExtension}.xml`;\n }\n\n function createExplicitSourceFile(\n sourceKey: string,\n content: string | undefined,\n suffixBySourceKey: Map<string, string | undefined>,\n objectName: string,\n ): SerializedFile | undefined {\n if (content === undefined) return undefined;\n if (!suffixBySourceKey.has(sourceKey)) {\n throw new FormatMaterializationError(\n 'FORMAT_SOURCE_COMPONENT_UNSUPPORTED',\n `The ${type} format handler cannot map source component \"${sourceKey}\".`,\n );\n }\n return ctx.createAbapFile(\n objectName,\n content,\n suffixBySourceKey.get(sourceKey),\n );\n }\n\n function buildExplicitSourceFiles(\n object: T,\n sources: Record<string, string | undefined>,\n ): SerializedFile[] {\n const sourceKeys = Object.keys(sources);\n if (sourceKeys.length === 0) return [];\n if (!definition.getSource && !definition.getSources) {\n throw new FormatMaterializationError(\n 'FORMAT_SOURCE_COMPONENT_UNSUPPORTED',\n `The ${type} format handler does not serialize source components.`,\n );\n }\n const suffixBySourceKey = new Map<string, string | undefined>([\n ['main', undefined],\n ...Object.entries(definition.suffixToSourceKey ?? {}).map(\n ([suffix, sourceKey]) => [sourceKey, suffix] as const,\n ),\n ]);\n const objectName = ctx.getObjectName(object);\n const files: SerializedFile[] = [];\n for (const sourceKey of sourceKeys.sort((left, right) =>\n left.localeCompare(right, 'en-US'),\n )) {\n const file = createExplicitSourceFile(\n sourceKey,\n sources[sourceKey],\n suffixBySourceKey,\n objectName,\n );\n if (file) files.push(file);\n }\n return files;\n }\n\n async function buildMutableSourceFiles(object: T): Promise<SerializedFile[]> {\n const objectName = ctx.getObjectName(object);\n if (definition.getSources) {\n const rawSources = definition.getSources(object);\n const sources = await Promise.all(\n rawSources.map(async ({ suffix, content }) => ({\n suffix,\n content: await content,\n })),\n );\n return sources\n .filter(({ content }) => content)\n .map(({ suffix, content }) =>\n ctx.createAbapFile(objectName, content!, suffix),\n );\n }\n if (definition.getSource) {\n const source = await definition.getSource(object);\n return source ? [ctx.createAbapFile(objectName, source)] : [];\n }\n return [];\n }\n\n // Default serialize\n const defaultSerialize = async (\n object: T,\n options?: FormatSerializeOptions,\n ): Promise<SerializedFile[]> => {\n const sourceFiles =\n options?.sources !== undefined\n ? buildExplicitSourceFiles(object, options.sources)\n : await buildMutableSourceFiles(object);\n const xmlFileName = resolveXmlFileName(object);\n const xmlContent = ctx.toAbapGitXml(object);\n return [...sourceFiles, ctx.createFile(xmlFileName, xmlContent)];\n };\n\n // Default fromAbapGit using definition.fromAbapGit if provided\n const defaultFromAbapGit = definition.fromAbapGit\n ? (\n values: InferValuesType<TSchema>,\n ): Partial<InferAdkData<T>> & { name: string } => {\n return definition.fromAbapGit!(values);\n }\n : undefined;\n\n // Determine whether this handler can honor an explicit source map.\n // Handlers may declare it explicitly; otherwise we fall back to arity.\n const explicitSupports = definition.supportsExplicitSources;\n const serializeAcceptsOptions =\n explicitSupports ??\n (definition.serialize !== undefined && definition.serialize.length >= 3);\n const supportsExplicitSources =\n explicitSupports ??\n (definition.getSource !== undefined ||\n definition.getSources !== undefined ||\n serializeAcceptsOptions);\n\n // Create handler object with full type information\n const handler: ObjectHandler<T, TSchema> = {\n type,\n fileExtension,\n schema: definition.schema,\n suffixToSourceKey: definition.suffixToSourceKey,\n supportsExplicitSources,\n serialize: definition.serialize\n ? async (object: T, options?: FormatSerializeOptions) => {\n if (serializeAcceptsOptions) {\n return await definition.serialize!(object, ctx, options);\n }\n return await (\n definition.serialize as (\n object: T,\n ctx: HandlerContext<T, InferAbapGitType<TSchema>>,\n ) => Promise<SerializedFile[]>\n )(object, ctx);\n }\n : defaultSerialize,\n fromAbapGit: defaultFromAbapGit,\n fromAffJson: definition.fromAffJson,\n setSources: definition.setSources,\n };\n\n // Auto-register (cast to base type for registry storage)\n handlerRegistry.set(type, handler as ObjectHandler);\n\n return handler;\n}\n","/**\n * AbapGit Schema - extends TypedSchema with values type\n *\n * Provides both:\n * - _type: Full AbapGitType (for XML build/parse)\n * - _values: Inner values type (for handler mapping)\n */\n\nimport {\n typedSchema,\n type TypedSchema,\n type SchemaLike,\n} from '@abapify/ts-xsd';\n\n/**\n * AbapGit schema instance with both full type and values type\n *\n * @typeParam TFull - Full AbapGitType (root XML structure)\n * @typeParam TValues - Inner values type (e.g., DevcType)\n * @typeParam S - Raw schema literal type\n */\nexport interface AbapGitSchema<\n TFull,\n TValues,\n S extends SchemaLike = SchemaLike,\n> extends TypedSchema<TFull, S> {\n /** The inner values type - use with typeof for type extraction */\n readonly _values: TValues;\n}\n\n/**\n * Create an AbapGit typed schema wrapper from raw schema\n *\n * @param rawSchema - Raw schema literal (with `as const`)\n * @returns AbapGitSchema with both _type and _values\n *\n * @example\n * ```typescript\n * import _devc from './schemas/devc';\n *\n * const devc = abapGitSchema<DevcAbapGitType, DevcType>(_devc);\n *\n * // Access types:\n * type Full = typeof devc._type; // DevcAbapGitType\n * type Values = typeof devc._values; // DevcType\n * ```\n */\nexport function abapGitSchema<\n TFull,\n TValues,\n S extends SchemaLike = SchemaLike,\n>(rawSchema: S): AbapGitSchema<TFull, TValues, S> {\n const base = typedSchema<TFull, S>(rawSchema);\n return {\n _type: base._type as TFull,\n _values: null as unknown as TValues,\n schema: base.schema,\n parse: base.parse as (xml: string) => TFull,\n build: base.build as (\n data: TFull,\n options?: Parameters<typeof base.build>[1],\n ) => string,\n };\n}\n\n/** Extract the full AbapGit type from an AbapGitSchema */\nexport type InferAbapGitType<S> =\n S extends AbapGitSchema<infer T, unknown> ? T : unknown;\n\n/** Extract the values type from an AbapGitSchema */\nexport type InferValuesType<S> =\n S extends AbapGitSchema<unknown, infer V> ? V : unknown;\n","/**\n * Auto-generated schema from XSD\n * \n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/clas.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n targetNamespace: \"http://www.sap.com/abapxml\",\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n ref: \"asx:abap\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n {\n name: \"values\",\n type: \"asx:AbapValuesType\",\n },\n {\n name: \"abap\",\n type: \"asx:AbapType\",\n },\n ],\n complexType: [\n {\n name: \"AbapValuesType\",\n all: {\n element: [\n {\n name: \"VSEOCLASS\",\n type: \"asx:VseoClassType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"VseoClassType\",\n all: {\n element: [\n {\n name: \"CLSNAME\",\n type: \"xs:string\",\n },\n {\n name: \"LANGU\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DESCRIPT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"STATE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"CATEGORY\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"EXPOSURE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"CLSFINAL\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"CLSABSTRCT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"CLSCCINCL\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"FIXPT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"UNICODE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"WITH_UNIT_TESTS\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DURATION\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"RISK\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"MSG_ID\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"REFCLSNAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"SHRM_ENABLED\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"ABAP_LANGUAGE_VERSION\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n * \n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/devc.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n targetNamespace: \"http://www.sap.com/abapxml\",\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n ref: \"asx:abap\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n {\n name: \"values\",\n type: \"asx:AbapValuesType\",\n },\n {\n name: \"abap\",\n type: \"asx:AbapType\",\n },\n ],\n complexType: [\n {\n name: \"AbapValuesType\",\n all: {\n element: [\n {\n name: \"DEVC\",\n type: \"asx:DevcType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"DevcType\",\n all: {\n element: [\n {\n name: \"CTEXT\",\n type: \"xs:string\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n * \n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/doma.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n targetNamespace: \"http://www.sap.com/abapxml\",\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n ref: \"asx:abap\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n {\n name: \"values\",\n type: \"asx:AbapValuesType\",\n },\n {\n name: \"abap\",\n type: \"asx:AbapType\",\n },\n ],\n complexType: [\n {\n name: \"AbapValuesType\",\n all: {\n element: [\n {\n name: \"DD01V\",\n type: \"asx:Dd01vType\",\n minOccurs: \"0\",\n },\n {\n name: \"DD07V_TAB\",\n type: \"asx:Dd07vTabType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"Dd01vType\",\n all: {\n element: [\n {\n name: \"DOMNAME\",\n type: \"xs:string\",\n },\n {\n name: \"DDLANGUAGE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DATATYPE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"LENG\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"OUTPUTLEN\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DECIMALS\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"LOWERCASE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"SIGNFLAG\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"VALEXI\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"ENTITYTAB\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"CONVEXIT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DDTEXT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DOMMASTER\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"Dd07vType\",\n all: {\n element: [\n {\n name: \"DOMNAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"VALPOS\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DDLANGUAGE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DOMVALUE_L\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DOMVALUE_H\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DDTEXT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"Dd07vTabType\",\n sequence: {\n element: [\n {\n name: \"DD07V\",\n type: \"Dd07vType\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n * \n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/dtel.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n targetNamespace: \"http://www.sap.com/abapxml\",\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n ref: \"asx:abap\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n {\n name: \"values\",\n type: \"asx:AbapValuesType\",\n },\n {\n name: \"abap\",\n type: \"asx:AbapType\",\n },\n ],\n complexType: [\n {\n name: \"AbapValuesType\",\n all: {\n element: [\n {\n name: \"DD04V\",\n type: \"asx:Dd04vType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"Dd04vType\",\n sequence: {\n element: [\n {\n name: \"ROLLNAME\",\n type: \"xs:string\",\n },\n {\n name: \"DDLANGUAGE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DOMNAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"HEADLEN\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"SCRLEN1\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"SCRLEN2\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"SCRLEN3\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DDTEXT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"REPTEXT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"SCRTEXT_S\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"SCRTEXT_M\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"SCRTEXT_L\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DTELMASTER\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DATATYPE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"LENG\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DECIMALS\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"OUTPUTLEN\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"REFKIND\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"REFTYPE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"ABAP_LANGUAGE_VERSION\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n * \n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/intf.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n targetNamespace: \"http://www.sap.com/abapxml\",\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n ref: \"asx:abap\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n {\n name: \"values\",\n type: \"asx:AbapValuesType\",\n },\n {\n name: \"abap\",\n type: \"asx:AbapType\",\n },\n ],\n complexType: [\n {\n name: \"AbapValuesType\",\n all: {\n element: [\n {\n name: \"VSEOINTERF\",\n type: \"asx:VseoInterfType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"VseoInterfType\",\n all: {\n element: [\n {\n name: \"CLSNAME\",\n type: \"xs:string\",\n },\n {\n name: \"LANGU\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DESCRIPT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"EXPOSURE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"STATE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"UNICODE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"ABAP_LANGUAGE_VERSION\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n * \n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/prog.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n name: \"abap\",\n type: \"ProgAbapType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n ],\n complexType: [\n {\n name: \"ProgValuesType\",\n all: {\n element: [\n {\n name: \"PROGDIR\",\n type: \"ProgdirType\",\n minOccurs: \"0\",\n },\n {\n name: \"TPOOL\",\n type: \"TpoolType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"ProgAbapType\",\n sequence: {\n element: [\n {\n name: \"values\",\n type: \"ProgValuesType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n {\n name: \"AbapValuesType\",\n sequence: {\n element: [\n {\n ref: \"asx:Schema\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n {\n name: \"ProgdirType\",\n all: {\n element: [\n {\n name: \"NAME\",\n type: \"xs:string\",\n },\n {\n name: \"STATE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"SUBC\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"FIXPT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"UNICODE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DTEFUNC\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"RLOAD\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"UCCHECK\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"ABAP_LANGUAGE_VERSION\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"TpoolItemType\",\n all: {\n element: [\n {\n name: \"ID\",\n type: \"xs:string\",\n },\n {\n name: \"ENTRY\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"LENGTH\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"TpoolType\",\n sequence: {\n element: [\n {\n name: \"item\",\n type: \"TpoolItemType\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n * \n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/fugr.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n name: \"abap\",\n type: \"FugrAbapType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n ],\n complexType: [\n {\n name: \"FugrValuesType\",\n all: {\n element: [\n {\n name: \"AREAT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"INCLUDES\",\n type: \"FugrIncludesType\",\n minOccurs: \"0\",\n },\n {\n name: \"FUNCTIONS\",\n type: \"FugrFunctionsType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"FugrAbapType\",\n sequence: {\n element: [\n {\n name: \"values\",\n type: \"FugrValuesType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n {\n name: \"AbapValuesType\",\n sequence: {\n element: [\n {\n ref: \"asx:Schema\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n {\n name: \"FugrParamType\",\n all: {\n element: [\n {\n name: \"PARAMETER\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"TYP\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DBFIELD\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DEFAULT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"OPTIONAL\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"REFERENCE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"FugrTableParamType\",\n all: {\n element: [\n {\n name: \"PARAMETER\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DBSTRUCT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"TYP\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"OPTIONAL\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"FugrExceptionType\",\n all: {\n element: [\n {\n name: \"EXCEPTION\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"FugrDocParamType\",\n all: {\n element: [\n {\n name: \"PARAMETER\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"KIND\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"STEXT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"FugrImportType\",\n sequence: {\n element: [\n {\n name: \"RSIMP\",\n type: \"FugrParamType\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"FugrExportType\",\n sequence: {\n element: [\n {\n name: \"RSEXP\",\n type: \"FugrParamType\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"FugrChangingType\",\n sequence: {\n element: [\n {\n name: \"RSCHA\",\n type: \"FugrParamType\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"FugrTablesType\",\n sequence: {\n element: [\n {\n name: \"RSTBL\",\n type: \"FugrTableParamType\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"FugrExceptionsType\",\n sequence: {\n element: [\n {\n name: \"RSEXC\",\n type: \"FugrExceptionType\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"FugrDocumentationType\",\n sequence: {\n element: [\n {\n name: \"RSFDO\",\n type: \"FugrDocParamType\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"FugrFunctionItemType\",\n all: {\n element: [\n {\n name: \"FUNCNAME\",\n type: \"xs:string\",\n },\n {\n name: \"GLOBAL_FLAG\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"REMOTE_CALL\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"UPDATE_TASK\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"SHORT_TEXT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"REMOTE_BASXML\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"EXCEPTION_CLASSES\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"IMPORT\",\n type: \"FugrImportType\",\n minOccurs: \"0\",\n },\n {\n name: \"CHANGING\",\n type: \"FugrChangingType\",\n minOccurs: \"0\",\n },\n {\n name: \"EXPORT\",\n type: \"FugrExportType\",\n minOccurs: \"0\",\n },\n {\n name: \"TABLES\",\n type: \"FugrTablesType\",\n minOccurs: \"0\",\n },\n {\n name: \"EXCEPTION\",\n type: \"FugrExceptionsType\",\n minOccurs: \"0\",\n },\n {\n name: \"DOCUMENTATION\",\n type: \"FugrDocumentationType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"FugrFunctionsType\",\n sequence: {\n element: [\n {\n name: \"item\",\n type: \"FugrFunctionItemType\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"FugrIncludesType\",\n sequence: {\n element: [\n {\n name: \"SOBJ_NAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n * \n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/tabl.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n targetNamespace: \"http://www.sap.com/abapxml\",\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n ref: \"asx:abap\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n {\n name: \"values\",\n type: \"asx:AbapValuesType\",\n },\n {\n name: \"abap\",\n type: \"asx:AbapType\",\n },\n ],\n complexType: [\n {\n name: \"AbapValuesType\",\n all: {\n element: [\n {\n name: \"DD02V\",\n type: \"asx:Dd02vType\",\n minOccurs: \"0\",\n },\n {\n name: \"DD09L\",\n type: \"asx:Dd09lType\",\n minOccurs: \"0\",\n },\n {\n name: \"DD03P_TABLE\",\n type: \"asx:Dd03pTableType\",\n minOccurs: \"0\",\n },\n {\n name: \"TABL_EXTRAS\",\n type: \"asx:TablExtrasType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"Dd02vType\",\n sequence: {\n element: [\n {\n name: \"TABNAME\",\n type: \"xs:string\",\n },\n {\n name: \"DDLANGUAGE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"TABCLASS\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"LANGDEP\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"CLIDEP\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"SQLTAB\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DATCLASS\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DDTEXT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"MASTERLANG\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"BUFFERED\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"MATEFLAG\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"CONTFLAG\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"SHLPEXI\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"EXCLASS\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"AUTHCLASS\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"Dd09lType\",\n sequence: {\n element: [\n {\n name: \"TABNAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"AS4LOCAL\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"TABKAT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"TABART\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"BUFALLOW\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"PUFFERUNG\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"SCHFELDANZ\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"PROTOKOLL\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"SPEESSION\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"UESSION\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"ROESSION\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"Dd03pType\",\n sequence: {\n element: [\n {\n name: \"FIELDNAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"POSITION\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"KEYFLAG\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"ROLLNAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"ADMINFIELD\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"INTTYPE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"INTLEN\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"REFTABLE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"REFFIELD\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"PRECFIELD\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"NOTNULL\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DATATYPE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"LENG\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DECIMALS\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DOMNAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"MASK\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"SHLPORIGIN\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DDTEXT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"COMPTYPE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"TABNAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DDLANGUAGE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"CONRFLAG\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"Dd03pTableType\",\n sequence: {\n element: [\n {\n name: \"DD03P\",\n type: \"Dd03pType\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"TddatType\",\n sequence: {\n element: [\n {\n name: \"TABNAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"CCLASS\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"VIEWGRANT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"TVDIR\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"GENERICRANGE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"TablExtrasType\",\n sequence: {\n element: [\n {\n name: \"TDDAT\",\n type: \"TddatType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n * \n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/ttyp.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n targetNamespace: \"http://www.sap.com/abapxml\",\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n ref: \"asx:abap\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n {\n name: \"values\",\n type: \"asx:AbapValuesType\",\n },\n {\n name: \"abap\",\n type: \"asx:AbapType\",\n },\n ],\n complexType: [\n {\n name: \"AbapValuesType\",\n all: {\n element: [\n {\n name: \"DD40V\",\n type: \"asx:Dd40vType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"Dd40vType\",\n all: {\n element: [\n {\n name: \"TYPENAME\",\n type: \"xs:string\",\n },\n {\n name: \"DDLANGUAGE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"ROWTYPE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"ROWKIND\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DATATYPE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"ACCESSMODE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"KEYDEF\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"KEYKIND\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"GENERIC\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"LENG\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DECIMALS\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DDTEXT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"TYPELEN\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"DEFFDNAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"ABAP_LANGUAGE_VERSION\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n * \n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/bdef.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n name: \"abap\",\n type: \"BdefAbapType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n ],\n complexType: [\n {\n name: \"SkeyType\",\n all: {\n element: [\n {\n name: \"TYPE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"NAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"BdefValuesType\",\n all: {\n element: [\n {\n name: \"SKEY\",\n type: \"SkeyType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"BdefAbapType\",\n sequence: {\n element: [\n {\n name: \"values\",\n type: \"BdefValuesType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n {\n name: \"AbapValuesType\",\n sequence: {\n element: [\n {\n ref: \"asx:Schema\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n * \n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/srvd.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n name: \"abap\",\n type: \"SrvdAbapType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n ],\n complexType: [\n {\n name: \"SkeyType\",\n all: {\n element: [\n {\n name: \"TYPE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"NAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"SrvdValuesType\",\n all: {\n element: [\n {\n name: \"SKEY\",\n type: \"SkeyType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"SrvdAbapType\",\n sequence: {\n element: [\n {\n name: \"values\",\n type: \"SrvdValuesType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n {\n name: \"AbapValuesType\",\n sequence: {\n element: [\n {\n ref: \"asx:Schema\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n * \n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/srvb.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n name: \"abap\",\n type: \"SrvbAbapType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n ],\n complexType: [\n {\n name: \"SkeyType\",\n all: {\n element: [\n {\n name: \"TYPE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"NAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"BindingType\",\n all: {\n element: [\n {\n name: \"TYPE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"VERSION\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"CATEGORY\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"SrvbValuesType\",\n all: {\n element: [\n {\n name: \"SKEY\",\n type: \"SkeyType\",\n minOccurs: \"0\",\n },\n {\n name: \"BINDING\",\n type: \"BindingType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"SrvbAbapType\",\n sequence: {\n element: [\n {\n name: \"values\",\n type: \"SrvbValuesType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n {\n name: \"AbapValuesType\",\n sequence: {\n element: [\n {\n ref: \"asx:Schema\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n *\n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/dcls.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n name: \"abap\",\n type: \"DclsAbapType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n ],\n complexType: [\n {\n name: \"SkeyType\",\n all: {\n element: [\n {\n name: \"TYPE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"NAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"DclsValuesType\",\n all: {\n element: [\n {\n name: \"SKEY\",\n type: \"SkeyType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"DclsAbapType\",\n sequence: {\n element: [\n {\n name: \"values\",\n type: \"DclsValuesType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n {\n name: \"AbapValuesType\",\n sequence: {\n element: [\n {\n ref: \"asx:Schema\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n *\n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/ddls.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n name: \"abap\",\n type: \"DdlsAbapType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n ],\n complexType: [\n {\n name: \"SkeyType\",\n all: {\n element: [\n {\n name: \"TYPE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"NAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"DdlsValuesType\",\n all: {\n element: [\n {\n name: \"SKEY\",\n type: \"SkeyType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"DdlsAbapType\",\n sequence: {\n element: [\n {\n name: \"values\",\n type: \"DdlsValuesType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n {\n name: \"AbapValuesType\",\n sequence: {\n element: [\n {\n ref: \"asx:Schema\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n *\n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/ddlx.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n name: \"abap\",\n type: \"DdlxAbapType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n ],\n complexType: [\n {\n name: \"SkeyType\",\n all: {\n element: [\n {\n name: \"TYPE\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"NAME\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"DdlxValuesType\",\n all: {\n element: [\n {\n name: \"SKEY\",\n type: \"SkeyType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"DdlxAbapType\",\n sequence: {\n element: [\n {\n name: \"values\",\n type: \"DdlxValuesType\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n {\n name: \"AbapValuesType\",\n sequence: {\n element: [\n {\n ref: \"asx:Schema\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n *\n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/msag.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n targetNamespace: \"http://www.sap.com/abapxml\",\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: {\n element: [\n {\n ref: \"asx:abap\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer\",\n type: \"xs:string\",\n use: \"required\",\n },\n {\n name: \"serializer_version\",\n type: \"xs:string\",\n use: \"required\",\n },\n ],\n },\n },\n {\n name: \"Schema\",\n abstract: true,\n },\n {\n name: \"values\",\n type: \"asx:AbapValuesType\",\n },\n {\n name: \"abap\",\n type: \"asx:AbapType\",\n },\n ],\n complexType: [\n {\n name: \"AbapValuesType\",\n all: {\n element: [\n {\n name: \"T100A\",\n type: \"asx:T100aType\",\n minOccurs: \"0\",\n },\n {\n name: \"T100\",\n type: \"asx:T100TabType\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"T100aType\",\n all: {\n element: [\n {\n name: \"ARBGB\",\n type: \"xs:string\",\n },\n {\n name: \"MASTERLANG\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"STEXT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"T100Type\",\n sequence: {\n element: [\n {\n name: \"SPRSL\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"ARBGB\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"MSGNR\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n {\n name: \"TEXT\",\n type: \"xs:string\",\n minOccurs: \"0\",\n },\n ],\n },\n },\n {\n name: \"T100TabType\",\n sequence: {\n element: [\n {\n name: \"item\",\n type: \"T100Type\",\n minOccurs: \"0\",\n maxOccurs: \"unbounded\",\n },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: {\n element: [\n {\n ref: \"asx:values\",\n },\n ],\n },\n attribute: [\n {\n name: \"version\",\n type: \"xs:string\",\n \"default\": \"1.0\",\n },\n ],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n *\n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/view.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n targetNamespace: \"http://www.sap.com/abapxml\",\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: { element: [{ ref: \"asx:abap\" }] },\n attribute: [\n { name: \"version\", type: \"xs:string\", use: \"required\" },\n { name: \"serializer\", type: \"xs:string\", use: \"required\" },\n { name: \"serializer_version\", type: \"xs:string\", use: \"required\" },\n ],\n },\n },\n { name: \"Schema\", abstract: true },\n { name: \"values\", type: \"asx:AbapValuesType\" },\n { name: \"abap\", type: \"asx:AbapType\" },\n ],\n complexType: [\n {\n name: \"AbapValuesType\",\n all: {\n element: [\n { name: \"DD25V\", type: \"asx:Dd25vType\", minOccurs: \"0\" },\n { name: \"DD26V_TABLE\", type: \"asx:Dd26vTabType\", minOccurs: \"0\" },\n { name: \"DD27P_TABLE\", type: \"asx:Dd27pTabType\", minOccurs: \"0\" },\n { name: \"DD28V_TABLE\", type: \"asx:Dd28vTabType\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"Dd25vType\",\n all: {\n element: [\n { name: \"VIEWNAME\", type: \"xs:string\" },\n { name: \"DDLANGUAGE\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"DDTEXT\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"VIEWCLASS\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"ROOTTAB\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"ROOTFIELD\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"ACTFLAG\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"MULTITAB\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"Dd26vType\",\n sequence: {\n element: [\n { name: \"VIEWNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"TABNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"TABPOS\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"FVIEWNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"FFIELDNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"READONLY\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"Dd26vTabType\",\n sequence: {\n element: [\n { name: \"item\", type: \"Dd26vType\", minOccurs: \"0\", maxOccurs: \"unbounded\" },\n ],\n },\n },\n {\n name: \"Dd27pType\",\n sequence: {\n element: [\n { name: \"VIEWNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"VIEWFIELD\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"TABNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"FIELDNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"KEYFLAG\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"READONLY\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"ROLLNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"CHECKTABLE\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"LOGFLAG\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"REFTABLE\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"REFFIELD\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"OUTPUTLEN\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"CONVEXIT\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"DDTEXT\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"Dd27pTabType\",\n sequence: {\n element: [\n { name: \"item\", type: \"Dd27pType\", minOccurs: \"0\", maxOccurs: \"unbounded\" },\n ],\n },\n },\n {\n name: \"Dd28vType\",\n sequence: {\n element: [\n { name: \"VIEWNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"ANDOR\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"LEFTBRACKET\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"FIELDNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"OPERATOR\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"CONST_VALUE\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"RIGHTBRACKET\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"Dd28vTabType\",\n sequence: {\n element: [\n { name: \"item\", type: \"Dd28vType\", minOccurs: \"0\", maxOccurs: \"unbounded\" },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: { element: [{ ref: \"asx:values\" }] },\n attribute: [{ name: \"version\", type: \"xs:string\", \"default\": \"1.0\" }],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n *\n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/enqu.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n targetNamespace: \"http://www.sap.com/abapxml\",\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: { element: [{ ref: \"asx:abap\" }] },\n attribute: [\n { name: \"version\", type: \"xs:string\", use: \"required\" },\n { name: \"serializer\", type: \"xs:string\", use: \"required\" },\n { name: \"serializer_version\", type: \"xs:string\", use: \"required\" },\n ],\n },\n },\n { name: \"Schema\", abstract: true },\n { name: \"values\", type: \"asx:AbapValuesType\" },\n { name: \"abap\", type: \"asx:AbapType\" },\n ],\n complexType: [\n {\n name: \"AbapValuesType\",\n all: {\n element: [\n { name: \"DD25V\", type: \"asx:Dd25vType\", minOccurs: \"0\" },\n { name: \"DD26V_TABLE\", type: \"asx:Dd26vTabType\", minOccurs: \"0\" },\n { name: \"DD27P_TABLE\", type: \"asx:Dd27pTabType\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"Dd25vType\",\n all: {\n element: [\n { name: \"VIEWNAME\", type: \"xs:string\" },\n { name: \"DDLANGUAGE\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"DDTEXT\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"VIEWCLASS\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"ROOTTAB\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"ROOTFIELD\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"ACTFLAG\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"MULTITAB\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"Dd26vType\",\n sequence: {\n element: [\n { name: \"VIEWNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"TABNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"TABPOS\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"FVIEWNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"FFIELDNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"READONLY\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"Dd26vTabType\",\n sequence: {\n element: [\n { name: \"item\", type: \"Dd26vType\", minOccurs: \"0\", maxOccurs: \"unbounded\" },\n ],\n },\n },\n {\n name: \"Dd27pType\",\n sequence: {\n element: [\n { name: \"VIEWNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"VIEWFIELD\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"TABNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"FIELDNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"KEYFLAG\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"READONLY\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"ROLLNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"CHECKTABLE\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"LOGFLAG\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"REFTABLE\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"REFFIELD\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"OUTPUTLEN\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"CONVEXIT\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"DDTEXT\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"Dd27pTabType\",\n sequence: {\n element: [\n { name: \"item\", type: \"Dd27pType\", minOccurs: \"0\", maxOccurs: \"unbounded\" },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: { element: [{ ref: \"asx:values\" }] },\n attribute: [{ name: \"version\", type: \"xs:string\", \"default\": \"1.0\" }],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n *\n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/shlp.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n targetNamespace: \"http://www.sap.com/abapxml\",\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: { element: [{ ref: \"asx:abap\" }] },\n attribute: [\n { name: \"version\", type: \"xs:string\", use: \"required\" },\n { name: \"serializer\", type: \"xs:string\", use: \"required\" },\n { name: \"serializer_version\", type: \"xs:string\", use: \"required\" },\n ],\n },\n },\n { name: \"Schema\", abstract: true },\n { name: \"values\", type: \"asx:AbapValuesType\" },\n { name: \"abap\", type: \"asx:AbapType\" },\n ],\n complexType: [\n {\n name: \"AbapValuesType\",\n all: {\n element: [\n { name: \"DD30V\", type: \"asx:Dd30vType\", minOccurs: \"0\" },\n { name: \"DD31V\", type: \"asx:Dd31vType\", minOccurs: \"0\" },\n { name: \"DD32P_TABLE\", type: \"asx:Dd32pTabType\", minOccurs: \"0\" },\n { name: \"DD33V_TABLE\", type: \"asx:Dd33vTabType\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"Dd30vType\",\n all: {\n element: [\n { name: \"SHLPNAME\", type: \"xs:string\" },\n { name: \"DDLANGUAGE\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"DDTEXT\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"SHLPTYPE\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"SHLPINPUT\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"DEFLOOKUP\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"DIALOGTYPE\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"SELEXT\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"ACTMETHOD\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"HOTKEY\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"Dd31vType\",\n all: {\n element: [\n { name: \"SHLPNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"TABNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"FIELDNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"FLDLOCATION\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"ROLLNAME\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"Dd32pType\",\n sequence: {\n element: [\n { name: \"SHLPNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"FIELDNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"SHLPINPUT\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"SHLPOUTPUT\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"SHLPSELPOS\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"SHLPLISPOS\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"DEFAULTVAL\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"ROLLNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"DATATYPE\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"LENG\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"DECIMALS\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"DDTEXT\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"Dd32pTabType\",\n sequence: {\n element: [\n { name: \"item\", type: \"Dd32pType\", minOccurs: \"0\", maxOccurs: \"unbounded\" },\n ],\n },\n },\n {\n name: \"Dd33vType\",\n sequence: {\n element: [\n { name: \"SHLPNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"SHLPFIELD\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"TABNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"FIELDNAME\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"SHLPINPUT\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"SHLPOUTPUT\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"Dd33vTabType\",\n sequence: {\n element: [\n { name: \"item\", type: \"Dd33vType\", minOccurs: \"0\", maxOccurs: \"unbounded\" },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: { element: [{ ref: \"asx:values\" }] },\n attribute: [{ name: \"version\", type: \"xs:string\", \"default\": \"1.0\" }],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n *\n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/tran.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n targetNamespace: \"http://www.sap.com/abapxml\",\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: { element: [{ ref: \"asx:abap\" }] },\n attribute: [\n { name: \"version\", type: \"xs:string\", use: \"required\" },\n { name: \"serializer\", type: \"xs:string\", use: \"required\" },\n { name: \"serializer_version\", type: \"xs:string\", use: \"required\" },\n ],\n },\n },\n { name: \"Schema\", abstract: true },\n { name: \"values\", type: \"asx:AbapValuesType\" },\n { name: \"abap\", type: \"asx:AbapType\" },\n ],\n complexType: [\n {\n name: \"AbapValuesType\",\n all: {\n element: [\n { name: \"TSTC\", type: \"asx:TstcType\", minOccurs: \"0\" },\n { name: \"TSTCC\", type: \"asx:TstccType\", minOccurs: \"0\" },\n { name: \"TSTCT\", type: \"asx:TstctTabType\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"TstcType\",\n all: {\n element: [\n { name: \"TCODE\", type: \"xs:string\" },\n { name: \"PGMNA\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"DYPNO\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"TYPE\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"CINFO\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"TstccType\",\n all: {\n element: [\n { name: \"TCODE\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"S_WEBGUI\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"S_PLATIN\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"S_WIN32\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"S_MAC\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"TstctType\",\n sequence: {\n element: [\n { name: \"SPRSL\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"TCODE\", type: \"xs:string\", minOccurs: \"0\" },\n { name: \"TTEXT\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"TstctTabType\",\n sequence: {\n element: [\n { name: \"item\", type: \"TstctType\", minOccurs: \"0\", maxOccurs: \"unbounded\" },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: { element: [{ ref: \"asx:values\" }] },\n attribute: [{ name: \"version\", type: \"xs:string\", \"default\": \"1.0\" }],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n *\n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/type.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n targetNamespace: \"http://www.sap.com/abapxml\",\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: { element: [{ ref: \"asx:abap\" }] },\n attribute: [\n { name: \"version\", type: \"xs:string\", use: \"required\" },\n { name: \"serializer\", type: \"xs:string\", use: \"required\" },\n { name: \"serializer_version\", type: \"xs:string\", use: \"required\" },\n ],\n },\n },\n { name: \"Schema\", abstract: true },\n { name: \"values\", type: \"asx:AbapValuesType\" },\n { name: \"abap\", type: \"asx:AbapType\" },\n ],\n complexType: [\n {\n name: \"AbapValuesType\",\n all: {\n element: [\n { name: \"TYPE\", type: \"asx:TypeGroupType\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"TypeGroupType\",\n all: {\n element: [\n { name: \"TYPEGROUP\", type: \"xs:string\" },\n { name: \"DESCRIPT\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: { element: [{ ref: \"asx:values\" }] },\n attribute: [{ name: \"version\", type: \"xs:string\", \"default\": \"1.0\" }],\n },\n ],\n} as const;\n","/**\n * Auto-generated schema from XSD\n *\n * DO NOT EDIT - Generated by ts-xsd codegen\n * Source: abapgit/xslt.xsd\n */\n\nexport default {\n $xmlns: {\n xs: \"http://www.w3.org/2001/XMLSchema\",\n asx: \"http://www.sap.com/abapxml\",\n },\n targetNamespace: \"http://www.sap.com/abapxml\",\n elementFormDefault: \"unqualified\",\n element: [\n {\n name: \"abapGit\",\n complexType: {\n sequence: { element: [{ ref: \"asx:abap\" }] },\n attribute: [\n { name: \"version\", type: \"xs:string\", use: \"required\" },\n { name: \"serializer\", type: \"xs:string\", use: \"required\" },\n { name: \"serializer_version\", type: \"xs:string\", use: \"required\" },\n ],\n },\n },\n { name: \"Schema\", abstract: true },\n { name: \"values\", type: \"asx:AbapValuesType\" },\n { name: \"abap\", type: \"asx:AbapType\" },\n ],\n complexType: [\n {\n name: \"AbapValuesType\",\n all: {\n element: [\n { name: \"XSLT\", type: \"asx:XsltType\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"XsltType\",\n all: {\n element: [\n { name: \"PROGNAME\", type: \"xs:string\" },\n { name: \"DESCRIPT\", type: \"xs:string\", minOccurs: \"0\" },\n ],\n },\n },\n {\n name: \"AbapType\",\n sequence: { element: [{ ref: \"asx:values\" }] },\n attribute: [{ name: \"version\", type: \"xs:string\", \"default\": \"1.0\" }],\n },\n ],\n} as const;\n","/**\n * AbapGit Typed Schemas\n * \n * Auto-generated by ts-xsd codegen - DO NOT EDIT\n * \n * Each schema provides:\n * - _type: Full AbapGitType (for XML build/parse)\n * - _values: Inner values type (for handler mapping)\n * - parse(xml) → fully typed object\n * - build(data) → XML string\n * - schema → raw schema literal\n */\n\nimport { abapGitSchema } from '../../lib/handlers/abapgit-schema';\n\n// Raw schemas\nimport _clas from './schemas/clas';\nimport _devc from './schemas/devc';\nimport _doma from './schemas/doma';\nimport _dtel from './schemas/dtel';\nimport _intf from './schemas/intf';\nimport _prog from './schemas/prog';\nimport _fugr from './schemas/fugr';\nimport _tabl from './schemas/tabl';\nimport _ttyp from './schemas/ttyp';\nimport _bdef from './schemas/bdef';\nimport _srvd from './schemas/srvd';\nimport _srvb from './schemas/srvb';\nimport _dcls from './schemas/dcls';\nimport _ddls from './schemas/ddls';\nimport _ddlx from './schemas/ddlx';\nimport _msag from './schemas/msag';\nimport _view from './schemas/view';\nimport _enqu from './schemas/enqu';\nimport _shlp from './schemas/shlp';\nimport _tran from './schemas/tran';\nimport _type from './schemas/type';\nimport _xslt from './schemas/xslt';\n\n// Full AbapGit types - using flattened root types\n// Note: Generated types may be unions, we import the raw schema type\nimport type { ClasSchema as _ClasSchema } from './types/clas';\nimport type { DevcSchema as _DevcSchema } from './types/devc';\nimport type { DomaSchema as _DomaSchema } from './types/doma';\nimport type { DtelSchema as _DtelSchema } from './types/dtel';\nimport type { IntfSchema as _IntfSchema } from './types/intf';\nimport type { ProgSchema as _ProgSchema } from './types/prog';\nimport type { FugrSchema as _FugrSchema } from './types/fugr';\nimport type { TablSchema as _TablSchema } from './types/tabl';\nimport type { TtypSchema as _TtypSchema } from './types/ttyp';\nimport type { BdefSchema as _BdefSchema } from './types/bdef';\nimport type { SrvdSchema as _SrvdSchema } from './types/srvd';\nimport type { SrvbSchema as _SrvbSchema } from './types/srvb';\nimport type { DclsSchema as _DclsSchema } from './types/dcls';\nimport type { DdlsSchema as _DdlsSchema } from './types/ddls';\nimport type { DdlxSchema as _DdlxSchema } from './types/ddlx';\nimport type { MsagSchema as _MsagSchema } from './types/msag';\nimport type { ViewSchema as _ViewSchema } from './types/view';\nimport type { EnquSchema as _EnquSchema } from './types/enqu';\nimport type { ShlpSchema as _ShlpSchema } from './types/shlp';\nimport type { TranSchema as _TranSchema } from './types/tran';\nimport type { TypeSchema as _TypeSchema } from './types/type';\nimport type { XsltSchema as _XsltSchema } from './types/xslt';\n\n// Extract the abapGit variant from union types (generated types may be unions)\ntype ClasAbapGitType = Extract<_ClasSchema, { abapGit: unknown }>;\ntype DevcAbapGitType = Extract<_DevcSchema, { abapGit: unknown }>;\ntype DomaAbapGitType = Extract<_DomaSchema, { abapGit: unknown }>;\ntype DtelAbapGitType = Extract<_DtelSchema, { abapGit: unknown }>;\ntype IntfAbapGitType = Extract<_IntfSchema, { abapGit: unknown }>;\ntype ProgAbapGitType = Extract<_ProgSchema, { abapGit: unknown }>;\ntype FugrAbapGitType = Extract<_FugrSchema, { abapGit: unknown }>;\ntype TablAbapGitType = Extract<_TablSchema, { abapGit: unknown }>;\ntype TtypAbapGitType = Extract<_TtypSchema, { abapGit: unknown }>;\ntype BdefAbapGitType = Extract<_BdefSchema, { abapGit: unknown }>;\ntype SrvdAbapGitType = Extract<_SrvdSchema, { abapGit: unknown }>;\ntype SrvbAbapGitType = Extract<_SrvbSchema, { abapGit: unknown }>;\ntype DclsAbapGitType = Extract<_DclsSchema, { abapGit: unknown }>;\ntype DdlsAbapGitType = Extract<_DdlsSchema, { abapGit: unknown }>;\ntype DdlxAbapGitType = Extract<_DdlxSchema, { abapGit: unknown }>;\ntype MsagAbapGitType = Extract<_MsagSchema, { abapGit: unknown }>;\ntype ViewAbapGitType = Extract<_ViewSchema, { abapGit: unknown }>;\ntype EnquAbapGitType = Extract<_EnquSchema, { abapGit: unknown }>;\ntype ShlpAbapGitType = Extract<_ShlpSchema, { abapGit: unknown }>;\ntype TranAbapGitType = Extract<_TranSchema, { abapGit: unknown }>;\ntype TypeAbapGitType = Extract<_TypeSchema, { abapGit: unknown }>;\ntype XsltAbapGitType = Extract<_XsltSchema, { abapGit: unknown }>;\n\n// AbapGit schema instances - using flattened types with values extracted from abapGit.abap.values\nexport const clas = abapGitSchema<ClasAbapGitType, ClasAbapGitType['abapGit']['abap']['values']>(_clas);\nexport const devc = abapGitSchema<DevcAbapGitType, DevcAbapGitType['abapGit']['abap']['values']>(_devc);\nexport const doma = abapGitSchema<DomaAbapGitType, DomaAbapGitType['abapGit']['abap']['values']>(_doma);\nexport const dtel = abapGitSchema<DtelAbapGitType, DtelAbapGitType['abapGit']['abap']['values']>(_dtel);\nexport const intf = abapGitSchema<IntfAbapGitType, IntfAbapGitType['abapGit']['abap']['values']>(_intf);\nexport const prog = abapGitSchema<ProgAbapGitType, ProgAbapGitType['abapGit']['abap']['values']>(_prog);\nexport const fugr = abapGitSchema<FugrAbapGitType, FugrAbapGitType['abapGit']['abap']['values']>(_fugr);\nexport const tabl = abapGitSchema<TablAbapGitType, TablAbapGitType['abapGit']['abap']['values']>(_tabl);\nexport const ttyp = abapGitSchema<TtypAbapGitType, TtypAbapGitType['abapGit']['abap']['values']>(_ttyp);\nexport const bdef = abapGitSchema<BdefAbapGitType, BdefAbapGitType['abapGit']['abap']['values']>(_bdef);\nexport const srvd = abapGitSchema<SrvdAbapGitType, SrvdAbapGitType['abapGit']['abap']['values']>(_srvd);\nexport const srvb = abapGitSchema<SrvbAbapGitType, SrvbAbapGitType['abapGit']['abap']['values']>(_srvb);\nexport const dcls = abapGitSchema<DclsAbapGitType, DclsAbapGitType['abapGit']['abap']['values']>(_dcls);\nexport const ddls = abapGitSchema<DdlsAbapGitType, DdlsAbapGitType['abapGit']['abap']['values']>(_ddls);\nexport const ddlx = abapGitSchema<DdlxAbapGitType, DdlxAbapGitType['abapGit']['abap']['values']>(_ddlx);\nexport const msag = abapGitSchema<MsagAbapGitType, MsagAbapGitType['abapGit']['abap']['values']>(_msag);\nexport const view = abapGitSchema<ViewAbapGitType, ViewAbapGitType['abapGit']['abap']['values']>(_view);\nexport const enqu = abapGitSchema<EnquAbapGitType, EnquAbapGitType['abapGit']['abap']['values']>(_enqu);\nexport const shlp = abapGitSchema<ShlpAbapGitType, ShlpAbapGitType['abapGit']['abap']['values']>(_shlp);\nexport const tran = abapGitSchema<TranAbapGitType, TranAbapGitType['abapGit']['abap']['values']>(_tran);\nexport const type = abapGitSchema<TypeAbapGitType, TypeAbapGitType['abapGit']['abap']['values']>(_type);\nexport const xslt = abapGitSchema<XsltAbapGitType, XsltAbapGitType['abapGit']['abap']['values']>(_xslt);\n\n// Re-export types and utilities\nexport { abapGitSchema, type AbapGitSchema, type InferAbapGitType, type InferValuesType } from '../../lib/handlers/abapgit-schema';\n","/**\n * SAP 1-character language code ↔ ISO 639-1 mapping\n *\n * abapGit stores SAP internal 1-char codes (e.g. \"E\" for English).\n * SAP ADT REST API expects ISO 639-1 codes (e.g. \"EN\").\n */\n\nconst SAP_TO_ISO: Record<string, string> = {\n E: 'EN', // English\n D: 'DE', // German\n F: 'FR', // French\n I: 'IT', // Italian\n S: 'ES', // Spanish\n P: 'PT', // Portuguese\n J: 'JA', // Japanese\n K: 'KO', // Korean\n '1': 'ZH', // Chinese\n W: 'RU', // Russian\n T: 'TR', // Turkish\n N: 'NL', // Dutch\n H: 'HU', // Hungarian\n L: 'PL', // Polish\n Q: 'CS', // Czech\n R: 'SK', // Slovak\n U: 'SV', // Swedish\n V: 'DA', // Danish\n Y: 'FI', // Finnish\n X: 'NO', // Norwegian\n G: 'EL', // Greek\n B: 'HE', // Hebrew\n A: 'AR', // Arabic\n '3': 'TH', // Thai\n M: 'UK', // Ukrainian\n '6': 'HR', // Croatian\n O: 'SL', // Slovenian\n '7': 'BG', // Bulgarian\n '8': 'SR', // Serbian\n C: 'RO', // Romanian\n};\n\nconst ISO_TO_SAP: Record<string, string> = Object.fromEntries(\n Object.entries(SAP_TO_ISO).map(([k, v]) => [v, k]),\n);\n\n/**\n * Convert SAP 1-char language code to ISO 639-1.\n * Returns the input uppercased if no mapping exists (may already be ISO).\n */\nexport function sapLangToIso(sapLang: string | undefined): string {\n if (!sapLang) return 'EN';\n const upper = sapLang.toUpperCase();\n // If it's already 2 chars, assume ISO\n if (upper.length >= 2) return upper;\n return SAP_TO_ISO[upper] ?? upper;\n}\n\n/**\n * Convert ISO 639-1 language code to SAP 1-char code.\n * Returns \"E\" (English) if no mapping exists.\n */\nexport function isoToSapLang(isoLang: string | undefined): string {\n if (!isoLang) return 'E';\n const upper = isoLang.toUpperCase();\n // If it's already 1 char, assume SAP code\n if (upper.length === 1) return upper;\n return ISO_TO_SAP[upper] ?? 'E';\n}\n\n// ============================================\n// ABAP Language Version mapping\n// ============================================\n\n/**\n * abapGit numeric code → ADT API string value\n *\n * abapGit serializes ABAP_LANGUAGE_VERSION as a numeric string (e.g. \"5\").\n * SAP ADT REST API expects descriptive strings (e.g. \"cloudDevelopment\").\n */\nconst ABAP_LANG_VER_TO_ADT: Record<string, string> = {\n '2': 'keyUser',\n '5': 'cloudDevelopment',\n};\nconst ABAP_LANG_VER_FROM_ADT: Record<string, string> = Object.fromEntries(\n Object.entries(ABAP_LANG_VER_TO_ADT).map(([k, v]) => [v, k]),\n);\n\n/**\n * Convert abapGit ABAP_LANGUAGE_VERSION code to ADT API value.\n * Returns undefined if not set or standard ABAP.\n * Passes through values that are already in ADT format (e.g. \"cloudDevelopment\").\n */\nexport function abapLangVerToAdt(\n abapGitCode: string | undefined,\n): string | undefined {\n if (!abapGitCode) return undefined;\n return ABAP_LANG_VER_TO_ADT[abapGitCode] ?? abapGitCode;\n}\n\n/**\n * Convert ADT API abapLanguageVersion to abapGit ABAP_LANGUAGE_VERSION code.\n * Returns undefined if not set or standard ABAP (default — should not be emitted).\n */\nexport function abapLangVerFromAdt(\n adtValue: string | undefined,\n): string | undefined {\n if (!adtValue) return undefined;\n // Standard ABAP is the default — omit from abapGit XML\n if (adtValue === 'standard' || adtValue === 'X') return undefined;\n return ABAP_LANG_VER_FROM_ADT[adtValue] ?? adtValue;\n}\n","/**\n * Class (CLAS) object handler for abapGit format\n */\n\nimport { AdkClass, type ClassIncludeType } from '../adk';\nimport { clas } from '../../../schemas/generated';\nimport { createHandler } from '../base';\nimport {\n sapLangToIso,\n isoToSapLang,\n abapLangVerToAdt,\n abapLangVerFromAdt,\n} from '../lang';\n\n/**\n * Map ADK ClassIncludeType to abapGit file suffix convention\n * Used for serialization (SAP → Git)\n */\nexport const ABAPGIT_SUFFIX: Record<ClassIncludeType, string | undefined> = {\n main: undefined, // main has no suffix\n definitions: 'locals_def',\n implementations: 'locals_imp',\n localtypes: 'locals_types',\n macros: 'macros',\n testclasses: 'testclasses',\n};\n\n/**\n * Reverse mapping: abapGit file suffix to ADK source key\n * Derived from ABAPGIT_SUFFIX to avoid duplication\n */\nconst SUFFIX_TO_SOURCE_KEY = Object.fromEntries(\n Object.entries(ABAPGIT_SUFFIX)\n .filter(([, suffix]) => suffix !== undefined)\n .map(([key, suffix]) => [suffix, key]),\n) as Record<string, ClassIncludeType>;\n\n/**\n * Map ADT category enum → abapGit numeric code\n * SAP ADT returns string names, abapGit uses numeric codes from SEOCLASSDF-CATEGORY\n */\nconst CATEGORY_FROM_ADT: Record<string, string> = {\n generalObjectType: '00',\n exitClass: '01',\n testClass: '02',\n areaClass: '03',\n factoryClass: '04',\n persistentClass: '30',\n exceptionClass: '40',\n bspClass: '60',\n staticTypedLcpClass: '70',\n behaviorPool: '80',\n rfcProxyClass: '90',\n entityEventHandler: '100',\n communicationConnectionClass: '110',\n};\n\n/**\n * Map visibility to EXPOSURE code (ADK → abapGit)\n */\nconst VISIBILITY_TO_EXPOSURE: Record<string, string> = {\n private: '0',\n protected: '1',\n public: '2',\n};\n\n/**\n * Reverse mapping: EXPOSURE code to visibility (abapGit → ADK)\n */\nconst EXPOSURE_TO_VISIBILITY = Object.fromEntries(\n Object.entries(VISIBILITY_TO_EXPOSURE).map(([k, v]) => [v, k]),\n) as Record<string, 'private' | 'protected' | 'public'>;\n\nexport const classHandler = createHandler(AdkClass, {\n schema: clas,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_CLAS',\n serializer_version: 'v1.0.0',\n\n // Reverse mapping for deserialization (Git → SAP)\n suffixToSourceKey: SUFFIX_TO_SOURCE_KEY,\n\n toAbapGit: (cls) => {\n const data = cls.dataSync;\n const includes = data.include ?? [];\n const hasTestClasses =\n includes.some((inc) => String(inc.includeType) === 'testclasses') ||\n (data as any).hasTests === true ||\n (data as any).withUnitTests === true;\n\n // Map ADT category enum to abapGit numeric code, omit default (00)\n const categoryCode =\n CATEGORY_FROM_ADT[data.category ?? ''] ?? data.category ?? '00';\n\n // Map visibility to EXPOSURE code, omit default (2 = public)\n const exposureCode =\n VISIBILITY_TO_EXPOSURE[data.visibility ?? 'public'] ?? '2';\n\n return {\n VSEOCLASS: {\n // Required\n CLSNAME: cls.name ?? '',\n\n // Basic metadata\n LANGU: isoToSapLang(data.language),\n DESCRIPT: data.description ?? '',\n STATE: '1', // Active\n\n // Class attributes — omit defaults (abapGit convention)\n CATEGORY: categoryCode !== '00' ? categoryCode : undefined,\n EXPOSURE: exposureCode !== '2' ? exposureCode : undefined,\n CLSFINAL: data.final ? 'X' : undefined,\n CLSABSTRCT: data.abstract ? 'X' : undefined,\n SHRM_ENABLED: data.sharedMemoryEnabled ? 'X' : undefined,\n\n // Source attributes\n CLSCCINCL: 'X', // Class constructor include\n FIXPT: data.fixPointArithmetic ? 'X' : undefined,\n UNICODE: 'X', // Always true on modern SAP systems\n\n // References\n REFCLSNAME: data.superClassRef?.name,\n MSG_ID: data.messageClassRef?.name,\n\n // ABAP language version\n ABAP_LANGUAGE_VERSION: abapLangVerFromAdt(data.abapLanguageVersion),\n\n // Test classes flag\n ...(hasTestClasses ? { WITH_UNIT_TESTS: 'X' } : {}),\n },\n };\n },\n\n getSources: (cls) => {\n const includes = cls.dataSync.include ?? [];\n return includes.map((inc) => ({\n suffix:\n ABAPGIT_SUFFIX[String(inc.includeType ?? 'main') as ClassIncludeType],\n content: cls.getIncludeSource(\n String(inc.includeType ?? 'main') as ClassIncludeType,\n ),\n }));\n },\n\n // Git → SAP: Map abapGit values to ADK data (type inferred from AdkClass)\n fromAbapGit: ({ VSEOCLASS }) => ({\n // Required - uppercase for SAP\n name: (VSEOCLASS?.CLSNAME ?? '').toUpperCase(),\n type: 'CLAS/OC', // ADT object type\n\n // Basic metadata\n description: VSEOCLASS?.DESCRIPT,\n language: sapLangToIso(VSEOCLASS?.LANGU),\n masterLanguage: sapLangToIso(VSEOCLASS?.LANGU),\n\n // Class attributes\n category: VSEOCLASS?.CATEGORY,\n final: VSEOCLASS?.CLSFINAL === 'X',\n abstract: VSEOCLASS?.CLSABSTRCT === 'X',\n visibility: EXPOSURE_TO_VISIBILITY[VSEOCLASS?.EXPOSURE ?? '2'] ?? 'public',\n sharedMemoryEnabled: VSEOCLASS?.SHRM_ENABLED === 'X',\n\n // Source attributes\n fixPointArithmetic: VSEOCLASS?.FIXPT === 'X',\n activeUnicodeCheck: VSEOCLASS?.UNICODE === 'X',\n\n // Test classes flag (preserved for roundtrip when includes are not available)\n withUnitTests: VSEOCLASS?.WITH_UNIT_TESTS === 'X',\n\n // References (name only - URI resolved by ADK)\n superClassRef: VSEOCLASS?.REFCLSNAME\n ? { name: VSEOCLASS.REFCLSNAME }\n : undefined,\n messageClassRef: VSEOCLASS?.MSG_ID ? { name: VSEOCLASS.MSG_ID } : undefined,\n\n // ABAP language version\n abapLanguageVersion: abapLangVerToAdt(VSEOCLASS?.ABAP_LANGUAGE_VERSION),\n }),\n\n // Git → SAP: Set source files on ADK object (symmetric with getSources)\n // Stores sources as pending for later deploy via ADT\n setSources: (cls, sources) => {\n // Store all sources as pending (will be saved during deploy)\n (\n cls as unknown as { _pendingSources: Record<string, string> }\n )._pendingSources = sources;\n // Also set main source shortcut for simple access\n if (sources.main) {\n (cls as unknown as { _pendingSource: string })._pendingSource =\n sources.main;\n }\n },\n});\n","/**\n * Interface (INTF) object handler for abapGit format\n */\n\nimport { AdkInterface } from '../adk';\nimport { intf } from '../../../schemas/generated';\nimport { createHandler } from '../base';\nimport { sapLangToIso, isoToSapLang, abapLangVerToAdt } from '../lang';\n\nexport const interfaceHandler = createHandler(AdkInterface, {\n schema: intf,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_INTF',\n serializer_version: 'v1.0.0',\n\n toAbapGit: (obj) => ({\n VSEOINTERF: {\n CLSNAME: obj.name ?? '',\n LANGU: isoToSapLang(obj.dataSync?.language),\n DESCRIPT: obj.description ?? '',\n EXPOSURE: '2', // 2 = Public\n STATE: '1', // 1 = Active\n UNICODE: 'X',\n },\n }),\n\n getSource: (obj) => obj.getSource(),\n\n // Git → SAP: Map abapGit values to ADK data (type inferred from AdkInterface)\n fromAbapGit: ({ VSEOINTERF }) => ({\n name: (VSEOINTERF?.CLSNAME ?? '').toUpperCase(),\n type: 'INTF/OI', // ADT object type\n description: VSEOINTERF?.DESCRIPT,\n language: sapLangToIso(VSEOINTERF?.LANGU),\n masterLanguage: sapLangToIso(VSEOINTERF?.LANGU),\n abapLanguageVersion: abapLangVerToAdt(VSEOINTERF?.ABAP_LANGUAGE_VERSION),\n }),\n\n // Git → SAP: Set source files on ADK object (symmetric with getSource)\n // Stores sources as pending for later deploy via ADT\n setSources: (intf, sources) => {\n if (sources.main) {\n (intf as unknown as { _pendingSource: string })._pendingSource =\n sources.main;\n }\n },\n});\n","/**\n * Package (DEVC) object handler for abapGit format\n */\n\nimport { AdkPackage } from '../adk';\nimport { devc } from '../../../schemas/generated';\nimport { createHandler } from '../base';\n\n/**\n * Package handler for abapGit serialization\n *\n * Note: Packages in abapGit use \"package.devc.xml\" as filename,\n * not \"$packagename.devc.xml\"\n */\nexport const packageHandler = createHandler(AdkPackage, {\n schema: devc,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_DEVC',\n serializer_version: 'v1.0.0',\n\n // Packages use fixed filename, not object name\n xmlFileName: 'package.devc.xml',\n\n // Only return the values - base class wraps in full AbapGitType\n toAbapGit: (pkg) => ({\n DEVC: {\n // Note: DEVCLASS is not included in abapGit package.devc.xml files (only CTEXT)\n CTEXT: pkg.description ?? '',\n },\n }),\n\n // Git → SAP: Map abapGit values to ADK data (type inferred from AdkPackage)\n // Note: DEVC doesn't have DEVCLASS in abapGit XML, name comes from filename\n fromAbapGit: ({ DEVC }) => ({\n name: '', // Package name must be set by deserializer from filename\n description: DEVC?.CTEXT,\n }),\n // Note: DEVC has no source files, so no setSources needed\n});\n","/**\n * Program (PROG) object handler for abapGit format\n */\n\nimport { AdkProgram } from '../adk';\nimport { prog } from '../../../schemas/generated';\nimport { createHandler } from '../base';\n\nexport const programHandler = createHandler(AdkProgram, {\n schema: prog,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_PROG',\n serializer_version: 'v1.0.0',\n\n // SAP → Git: Map ADK object to abapGit values\n toAbapGit: (obj) => ({\n PROGDIR: {\n NAME: obj.name ?? '',\n STATE: 'A',\n SUBC: '1',\n FIXPT: 'X',\n UNICODE: 'X',\n },\n }),\n\n // Single source file\n getSource: (obj) => obj.getSource(),\n\n // Git → SAP: Map abapGit values to ADK data\n // Returns data matching AbapProgramSchema structure\n fromAbapGit: ({ PROGDIR, TPOOL }) => {\n // Extract description from TPOOL (text pool) if available\n // TPOOL.item can be a single object or an array depending on XML parser\n const rawItems = TPOOL?.item ?? [];\n const items = Array.isArray(rawItems) ? rawItems : [rawItems];\n const descriptionEntry = items.find((t: any) => t.ID === 'R');\n\n // SUBC can be parsed as number or string depending on XML parser\n const subc = String(PROGDIR?.SUBC ?? '');\n\n return {\n name: (PROGDIR?.NAME ?? '').toUpperCase(),\n type: 'PROG/P',\n description: descriptionEntry?.ENTRY ?? 'Program',\n fixPointArithmetic: PROGDIR?.FIXPT === 'X',\n activeUnicodeCheck: PROGDIR?.UNICODE === 'X',\n programType: subc === '1' ? 'executableProgram' : 'subroutinePool',\n };\n },\n\n // Git → SAP: Set source files on ADK object\n // Note: `_pendingSource` is not declared on the public ADK interface —\n // it is an implementation detail for deferred source saving.\n // The `as unknown as` double cast is the established pattern in this codebase.\n setSources: (obj, sources) => {\n if (sources.main) {\n (obj as unknown as { _pendingSource: string })._pendingSource =\n sources.main;\n }\n },\n});\n","/**\n * Shared source-inclusion rule for abapGit object handlers.\n *\n * A source is included when it is defined and either supplied by the caller\n * or non-empty on the object.\n */\nexport function shouldIncludeSource(\n source: string | undefined,\n suppliedSource: string | undefined,\n): boolean {\n if (source === undefined) return false;\n return suppliedSource !== undefined || source !== '';\n}\n","/**\n * Function Group (FUGR) object handler for abapGit format\n *\n * FUGR is a compound object — abapGit serializes it as multiple files:\n * {name}.fugr.xml — Main metadata (AREAT + INCLUDES + FUNCTIONS)\n * {name}.fugr.l{name}top.abap — TOP-include source (editable)\n * {name}.fugr.l{name}top.xml — TOP-include PROGDIR metadata\n * {name}.fugr.sapl{name}.abap — Main program source (system-generated)\n * {name}.fugr.sapl{name}.xml — Main program PROGDIR metadata\n * {name}.fugr.{funcname}.abap — Function module source (per FM)\n *\n * Note: FM metadata is stored INSIDE the main XML under <FUNCTIONS>,\n * NOT in separate per-FM XML files (that's how abapGit works).\n */\n\nimport { AdkFunctionGroup } from '../adk';\nimport { fugr } from '../../../schemas/generated';\nimport {\n createHandler,\n type HandlerContext,\n type SerializedFile,\n} from '../base';\nimport { shouldIncludeSource } from '../source-inclusion';\nimport { formatAbapGitXml } from '../xml-format';\n\ntype FugrObject = InstanceType<typeof AdkFunctionGroup>;\ntype FugrContext = HandlerContext<FugrObject>;\ntype SourceMap = Readonly<Record<string, string>> | undefined;\n\nfunction buildMainXmlFile(\n obj: FugrObject,\n objectName: string,\n nameUpper: string,\n functions: Record<string, unknown>[],\n ctx: FugrContext,\n): SerializedFile {\n const values: Record<string, unknown> = {\n AREAT: obj.description ?? '',\n INCLUDES: {\n SOBJ_NAME: [`L${nameUpper}TOP`, `SAPL${nameUpper}`],\n },\n };\n if (functions.length > 0) {\n values.FUNCTIONS = { item: functions };\n }\n const fullPayload = {\n abapGit: {\n abap: { version: '1.0', values },\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_FUGR',\n serializer_version: 'v1.0.0',\n },\n };\n const xmlContent = formatAbapGitXml(\n fugr.build(fullPayload, { pretty: true }),\n );\n return ctx.createFile(`${objectName}.fugr.xml`, xmlContent);\n}\n\ntype FmList = {\n fmItems: FmDescriptor[];\n functions: Record<string, unknown>[];\n};\n\nfunction deriveFmList(suppliedSources: SourceMap, objectName: string): FmList {\n if (!suppliedSources) return { fmItems: [], functions: [] };\n const topKey = `l${objectName}top`;\n const lowerTopKey = topKey;\n const lowerSap = `sapl${objectName}`;\n const fmItems = Object.keys(suppliedSources)\n .filter((key) => {\n const lower = key.toLowerCase();\n return lower !== 'main' && lower !== lowerTopKey && lower !== lowerSap;\n })\n .map((key) => ({ key, name: key.toLowerCase() }));\n const functions = fmItems.map((fm) => ({\n FUNCNAME: fm.key.toUpperCase(),\n }));\n return { fmItems, functions };\n}\n\nasync function buildTopSourceFile(\n obj: FugrObject,\n objectName: string,\n suppliedSources: SourceMap,\n ctx: FugrContext,\n): Promise<SerializedFile | undefined> {\n const hasExplicitSources = suppliedSources !== undefined;\n const topKey = `l${objectName}top`;\n const suppliedTopSource = suppliedSources\n ? (suppliedSources.main ?? suppliedSources[topKey])\n : undefined;\n try {\n const topSource =\n suppliedTopSource !== undefined || !hasExplicitSources\n ? (suppliedTopSource ?? (await obj.getSource()))\n : undefined;\n if (shouldIncludeSource(topSource, suppliedTopSource)) {\n return ctx.createFile(\n `${objectName}.fugr.l${objectName}top.abap`,\n topSource,\n );\n }\n } catch {\n // Source not available — skip\n }\n return undefined;\n}\n\nfunction buildProgramFiles(\n objectName: string,\n nameUpper: string,\n fixpt: string,\n ctx: FugrContext,\n): SerializedFile[] {\n return [\n ctx.createFile(\n `${objectName}.fugr.l${objectName}top.xml`,\n buildProgdirXml(`L${nameUpper}TOP`, 'I', fixpt),\n ),\n ctx.createFile(\n `${objectName}.fugr.sapl${objectName}.abap`,\n buildMainProgramSource(nameUpper),\n ),\n ctx.createFile(\n `${objectName}.fugr.sapl${objectName}.xml`,\n buildProgdirXml(`SAPL${nameUpper}`, 'F', fixpt),\n ),\n ];\n}\n\nasync function buildFunctionModuleFiles(\n obj: FugrObject,\n fmItems: FmDescriptor[],\n suppliedSources: SourceMap,\n ctx: FugrContext,\n): Promise<SerializedFile[]> {\n const objectName = ctx.getObjectName(obj);\n const files: SerializedFile[] = [];\n const hasExplicitSources = suppliedSources !== undefined;\n for (const fm of fmItems) {\n const sourceKey = fm.key ?? fm.name;\n const funcName = fm.name.toLowerCase();\n const suppliedFmSource = suppliedSources?.[sourceKey];\n if (hasExplicitSources && suppliedFmSource === undefined) {\n continue;\n }\n try {\n const source =\n suppliedFmSource !== undefined\n ? suppliedFmSource\n : await obj.client.adt.functions.groups.fmodules.source.main.get(\n obj.name,\n fm.name,\n );\n if (shouldIncludeSource(source, suppliedFmSource)) {\n files.push(\n ctx.createFile(`${objectName}.fugr.${funcName}.abap`, source),\n );\n }\n } catch {\n // Source not available — skip\n }\n }\n return files;\n}\n\n/**\n * Map ADT processingType to abapGit REMOTE_CALL flag\n */\nfunction processingTypeToRemoteCall(\n processingType?: string,\n): string | undefined {\n switch (processingType) {\n case 'rfc':\n return 'R';\n case 'update':\n return undefined; // UPDATE_TASK handles this\n default:\n return undefined;\n }\n}\n\n/**\n * Map abapGit REMOTE_CALL flag to ADT processingType\n */\nfunction remoteCallToProcessingType(\n remoteCall?: string,\n updateTask?: string,\n): string {\n if (remoteCall === 'R') return 'rfc';\n if (updateTask && updateTask !== '' && updateTask !== ' ') return 'update';\n return 'normal';\n}\n\nexport const functionGroupHandler = createHandler(AdkFunctionGroup, {\n schema: fugr,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_FUGR',\n serializer_version: 'v1.0.0',\n\n // SAP → Git: Map ADK object to abapGit values\n // Note: FUNCTIONS are added dynamically in the custom serialize method\n toAbapGit: (obj) => {\n const name = obj.name.toUpperCase();\n return {\n AREAT: obj.description ?? '',\n INCLUDES: {\n SOBJ_NAME: [`L${name}TOP`, `SAPL${name}`],\n },\n };\n },\n\n // Custom serialize: generate the full multi-file structure including FMs.\n serialize: async (obj, ctx, options) => {\n const objectName = ctx.getObjectName(obj); // lowercase\n const nameUpper = obj.name.toUpperCase();\n const suppliedSources: SourceMap = options?.sources;\n const hasExplicitSources = suppliedSources !== undefined;\n\n let fmItems: FmDescriptor[];\n let functions: Record<string, unknown>[];\n if (hasExplicitSources) {\n ({ fmItems, functions } = deriveFmList(suppliedSources, objectName));\n } else {\n fmItems = await discoverFunctionModules(obj);\n functions = await serializeFunctions(obj, fmItems);\n }\n\n const data = ctx.getData(obj);\n const fixpt = data.fixPointArithmetic ? 'X' : '';\n\n const topFile = await buildTopSourceFile(\n obj,\n objectName,\n suppliedSources,\n ctx,\n );\n return [\n buildMainXmlFile(obj, objectName, nameUpper, functions, ctx),\n ...(topFile ? [topFile] : []),\n ...buildProgramFiles(objectName, nameUpper, fixpt, ctx),\n ...(await buildFunctionModuleFiles(obj, fmItems, suppliedSources, ctx)),\n ];\n },\n\n // Git → SAP: Map abapGit values to ADK data\n fromAbapGit: ({ AREAT, FUNCTIONS }) => ({\n name: '', // Resolved from filename by deserializer\n type: 'FUGR/F',\n description: AREAT,\n language: 'EN',\n masterLanguage: 'EN',\n // Store FUNCTIONS metadata for the deserializer to extract child FMs\n _functions: FUNCTIONS,\n }),\n\n // Git → SAP: Set source files on ADK object\n // FUGR sources arrive with dynamic suffixes like l{name}top and sapl{name}.\n // The TOP-include (l{name}top) is the main editable source.\n // FM sources arrive with the FM name as suffix key.\n setSources: (obj, sources) => {\n const name = obj.name.toLowerCase();\n // Find the TOP-include source — this is the editable source for the function group\n const topKey = `l${name}top`;\n const mainSource = sources.main ?? sources[topKey];\n if (mainSource) {\n (obj as unknown as { _pendingSource: string })._pendingSource =\n mainSource;\n }\n\n // Collect FM sources — these are sources where the suffix is NOT an include name\n const fmSources: Record<string, string> = {};\n const mainProgramKey = `sapl${name}`;\n for (const [suffix, content] of Object.entries(sources)) {\n if (suffix === 'main' || suffix === topKey || suffix === mainProgramKey) {\n continue; // Skip FUGR includes\n }\n // This is an FM source — key is the function name (lowercase)\n fmSources[suffix] = content;\n }\n\n // Store FM sources on the object for the deserializer to extract later\n if (Object.keys(fmSources).length > 0) {\n (\n obj as unknown as { _pendingFmSources: Record<string, string> }\n )._pendingFmSources = fmSources;\n }\n // Note: sapl{name} (main program) is system-generated and not deployed via ADT\n },\n});\n\n// ============================================\n// Serialization helpers\n// ============================================\n\n/**\n * Minimal FM descriptor discovered from object structure\n */\ninterface FmDescriptor {\n name: string;\n type?: string;\n /** Original source-map key when the list was derived from explicit sources. */\n key?: string;\n}\n\n/**\n * Discover child function modules via object structure endpoint.\n * Falls back to empty list if the endpoint is unavailable.\n */\nasync function discoverFunctionModules(\n obj: InstanceType<typeof AdkFunctionGroup>,\n): Promise<FmDescriptor[]> {\n try {\n const response = await obj.client.adt.functions.groups.objectstructure(\n obj.name,\n );\n\n // Parse object structure XML to extract FM entries\n // The response contains <objectStructureElement> items with type=\"FUGR/FF\"\n const responseStr = String(response);\n const fmNames: FmDescriptor[] = [];\n const regex = /type=\"FUGR\\/FF\"[^>]*adtcore:name=\"([^\"]+)\"/g;\n let match;\n while ((match = regex.exec(responseStr)) !== null) {\n fmNames.push({ name: match[1] });\n }\n\n // Also try alternate attribute order\n const regex2 = /adtcore:name=\"([^\"]+)\"[^>]*type=\"FUGR\\/FF\"/g;\n while ((match = regex2.exec(responseStr)) !== null) {\n if (match?.[1] && !fmNames.some((f) => f.name === match[1])) {\n fmNames.push({ name: match[1] });\n }\n }\n\n return fmNames;\n } catch {\n return [];\n }\n}\n\n/**\n * Serialize function module metadata into abapGit FUNCTIONS format.\n * Fetches each FM's metadata via the ADT fmodules contract.\n */\nasync function serializeFunctions(\n obj: InstanceType<typeof AdkFunctionGroup>,\n fmItems: FmDescriptor[],\n): Promise<Record<string, unknown>[]> {\n const functions: Record<string, unknown>[] = [];\n\n for (const fm of fmItems) {\n try {\n const response = await obj.client.adt.functions.groups.fmodules.get(\n obj.name,\n fm.name,\n );\n const fmData = (response as Record<string, unknown>)\n ?.abapFunctionModule as Record<string, unknown> | undefined;\n if (!fmData) continue;\n\n // Map ADT metadata to abapGit FUNCTIONS format\n const item: Record<string, unknown> = {\n FUNCNAME: fm.name.toUpperCase(),\n SHORT_TEXT: fmData.description ?? '',\n };\n\n // Map processing type flags\n const remoteCall = processingTypeToRemoteCall(\n fmData.processingType as string | undefined,\n );\n if (remoteCall) item.REMOTE_CALL = remoteCall;\n if (fmData.basXMLEnabled) item.REMOTE_BASXML = 'X';\n\n functions.push(item);\n } catch {\n // FM metadata not available — add minimal entry\n functions.push({ FUNCNAME: fm.name.toUpperCase() });\n }\n }\n\n return functions;\n}\n\n// ============================================\n// Exported helpers (used by deserializer)\n// ============================================\n\n/**\n * Extract function module descriptors from parsed abapGit FUNCTIONS data.\n * Used by the deserializer to create child AdkFunctionModule objects.\n */\nexport interface FugrFunctionDescriptor {\n funcName: string;\n shortText?: string;\n processingType: string;\n basXMLEnabled: boolean;\n}\n\nexport function extractFunctionDescriptors(\n functions: unknown,\n): FugrFunctionDescriptor[] {\n if (!functions) return [];\n\n // Handle both { item: [...] } and direct array forms\n const items = Array.isArray(functions)\n ? functions\n : Array.isArray((functions as Record<string, unknown>)?.item)\n ? ((functions as Record<string, unknown>).item as Record<\n string,\n unknown\n >[])\n : (functions as Record<string, unknown>)?.item\n ? [\n (functions as Record<string, unknown>).item as Record<\n string,\n unknown\n >,\n ]\n : [];\n\n return (items as Array<Record<string, unknown>>).map((fm) => ({\n funcName: String((fm.FUNCNAME as string | undefined) ?? ''),\n shortText: fm.SHORT_TEXT\n ? String(fm.SHORT_TEXT as string | number | boolean)\n : undefined,\n processingType: remoteCallToProcessingType(\n fm.REMOTE_CALL as string | undefined,\n fm.UPDATE_TASK as string | undefined,\n ),\n basXMLEnabled: fm.REMOTE_BASXML === 'X',\n }));\n}\n\n// ============================================\n// XML building helpers\n// ============================================\n\n/**\n * Build PROGDIR XML for an include program (best-effort defaults).\n * PROGDIR is SAP-internal metadata that abapGit stores but ADT doesn't expose.\n */\nfunction buildProgdirXml(\n programName: string,\n subc: 'I' | 'F',\n fixpt: string,\n): string {\n // SUBC: I = Include, F = Function pool\n // RLOAD: E = only for function pool (main program)\n const rload = subc === 'F' ? '\\n <RLOAD>E</RLOAD>' : '';\n return `<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<abapGit version=\"v1.0.0\">\n <asx:abap xmlns:asx=\"http://www.sap.com/abapxml\" version=\"1.0\">\n <asx:values>\n <PROGDIR>\n <NAME>${programName}</NAME>\n <SUBC>${subc}</SUBC>${rload}\n <FIXPT>${fixpt}</FIXPT>\n <UCCHECK>X</UCCHECK>\n </PROGDIR>\n </asx:values>\n </asx:abap>\n</abapGit>\n`;\n}\n\n/**\n * Build the standard main program source (SAPL{NAME}).\n * This is system-generated and contains INCLUDE declarations.\n */\nfunction buildMainProgramSource(nameUpper: string): string {\n return `*******************************************************************\n* System-defined Include-files. *\n*******************************************************************\n INCLUDE L${nameUpper}TOP. \" Global Declarations\n INCLUDE L${nameUpper}UXX. \" Function Modules\n\n*******************************************************************\n* User-defined Include-files (if necessary). *\n*******************************************************************\n* INCLUDE L${nameUpper}F... \" Subroutines\n* INCLUDE L${nameUpper}O... \" PBO-Modules\n* INCLUDE L${nameUpper}I... \" PAI-Modules\n* INCLUDE L${nameUpper}E... \" Events\n* INCLUDE L${nameUpper}P... \" Local class implement.\n* INCLUDE L${nameUpper}T99. \" ABAP Unit tests\n`;\n}\n","/**\n * Domain (DOMA) object handler for abapGit format\n */\n\nimport { AdkDomain } from '../adk';\nimport { doma } from '../../../schemas/generated';\nimport { createHandler } from '../base';\nimport { isoToSapLang, sapLangToIso } from '../lang';\n\nexport const domainHandler = createHandler(AdkDomain, {\n schema: doma,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_DOMA',\n serializer_version: 'v1.0.0',\n\n toAbapGit: (obj) => {\n const data = obj.dataSync;\n const typeInfo = data?.content?.typeInformation;\n const outInfo = data?.content?.outputInformation;\n const valueInfo = data?.content?.valueInformation;\n\n // Serialize fixed values if present\n const fixValues = valueInfo?.fixValues?.fixValue;\n const DD07V_TAB =\n fixValues && fixValues.length > 0\n ? {\n DD07V: fixValues.map((fv) => {\n const entry: Record<string, string> = {\n DOMNAME: obj.name ?? '',\n VALPOS: String(fv.position ?? '').padStart(4, '0'),\n DDLANGUAGE: isoToSapLang(data?.language),\n DOMVALUE_L: fv.low ?? '',\n DDTEXT: fv.text ?? '',\n };\n // Only include DOMVALUE_H if it has a value (for ranges)\n if (fv.high) {\n entry.DOMVALUE_H = fv.high;\n }\n return entry;\n }),\n }\n : undefined;\n\n return {\n DD01V: {\n DOMNAME: obj.name ?? '',\n DDLANGUAGE: isoToSapLang(data?.language),\n DATATYPE: typeInfo?.datatype ?? '',\n LENG: String(typeInfo?.length ?? '').padStart(6, '0'),\n DECIMALS: typeInfo?.decimals\n ? String(typeInfo.decimals).padStart(6, '0')\n : undefined,\n OUTPUTLEN: String(outInfo?.length ?? '').padStart(6, '0'),\n LOWERCASE: outInfo?.lowercase ? 'X' : undefined,\n SIGNFLAG: outInfo?.signExists ? 'X' : undefined,\n CONVEXIT: outInfo?.conversionExit || undefined,\n ENTITYTAB: valueInfo?.valueTableRef?.name || undefined,\n VALEXI: fixValues && fixValues.length > 0 ? 'X' : undefined,\n DDTEXT: obj.description ?? '',\n DOMMASTER: isoToSapLang(obj.masterLanguage),\n },\n DD07V_TAB,\n };\n },\n\n fromAbapGit: ({ DD01V, DD07V_TAB }) => {\n const fixValues =\n DD07V_TAB?.DD07V?.map((fv, idx) => ({\n position: Number(fv.VALPOS ?? idx + 1),\n low: fv.DOMVALUE_L ?? '',\n high: fv.DOMVALUE_H ?? '',\n text: fv.DDTEXT ?? '',\n })) ?? [];\n\n return {\n name: (DD01V?.DOMNAME ?? '').toUpperCase(),\n type: 'DOMA/DD',\n description: DD01V?.DDTEXT,\n language: sapLangToIso(DD01V?.DDLANGUAGE),\n masterLanguage: sapLangToIso(DD01V?.DDLANGUAGE),\n content: {\n typeInformation: {\n datatype: DD01V?.DATATYPE ?? '',\n length: Number(DD01V?.LENG ?? 0),\n decimals: Number(DD01V?.DECIMALS ?? 0),\n },\n outputInformation: {\n length: Number(DD01V?.OUTPUTLEN ?? 0),\n style: '',\n conversionExit: DD01V?.CONVEXIT || undefined,\n signExists: DD01V?.SIGNFLAG === 'X',\n lowercase: DD01V?.LOWERCASE === 'X',\n },\n valueInformation: {\n valueTableRef: {\n name: DD01V?.ENTITYTAB || undefined,\n },\n fixValues: {\n fixValue: fixValues.length > 0 ? fixValues : undefined,\n },\n },\n },\n } as { name: string } & Record<string, unknown>;\n },\n});\n","/**\n * Data Element (DTEL) object handler for abapGit format\n */\n\nimport { AdkDataElement } from '../adk';\nimport { dtel } from '../../../schemas/generated';\nimport { createHandler } from '../base';\nimport {\n isoToSapLang,\n sapLangToIso,\n abapLangVerToAdt,\n abapLangVerFromAdt,\n} from '../lang';\n\n/**\n * Map ADT typeKind → abapGit REFKIND\n */\nconst TYPEKIND_TO_REFKIND: Record<string, string> = {\n domain: 'D',\n predefinedAbapType: '',\n refToPredefinedAbapType: 'R',\n refToDictionaryType: 'R',\n refToClifType: 'R',\n};\n\n/**\n * Map ADT typeKind → abapGit REFTYPE (only for reference types)\n */\nconst TYPEKIND_TO_REFTYPE: Record<string, string | undefined> = {\n refToClifType: 'C',\n refToDictionaryType: 'E',\n refToPredefinedAbapType: 'E',\n};\n\n/**\n * Derive OUTPUTLEN from ABAP data type + length + decimals.\n *\n * The ADT REST API for data elements does not return OUTPUTLEN — SAP derives\n * it internally from the type definition. This function replicates SAP's\n * output length calculation for standard ABAP dictionary types.\n */\nfunction deriveOutputLength(\n dataType: string | undefined,\n length: number | undefined,\n decimals: number | undefined,\n): string | undefined {\n if (!dataType || !length) return undefined;\n\n const type = dataType.toUpperCase();\n const len = length;\n const dec = decimals ?? 0;\n\n switch (type) {\n // Simple types: output length = internal length\n case 'CHAR':\n case 'NUMC':\n case 'UNIT':\n case 'CUKY':\n case 'LCHR':\n case 'SSTRING':\n return String(len).padStart(6, '0');\n\n // Fixed-length types with known output length\n case 'CLNT':\n return '000003';\n case 'LANG':\n return '000001';\n case 'DATS':\n return '000010';\n case 'TIMS':\n return '000008';\n\n // Integer types\n case 'INT1':\n return '000003';\n case 'INT2':\n return '000005';\n case 'INT4':\n return '000010';\n case 'INT8':\n return '000019';\n\n // Floating point\n case 'FLTP':\n return '000022';\n\n // Numeric types with formatting: len + sign + group separators\n case 'DEC':\n case 'CURR':\n case 'QUAN': {\n const intDigits = len - dec;\n const separators = intDigits > 1 ? Math.floor((intDigits - 1) / 3) : 0;\n const outputLen = len + 1 + separators;\n return String(outputLen).padStart(6, '0');\n }\n\n // Raw/hex types: 2 hex chars per byte\n case 'RAW':\n case 'LRAW':\n return String(len * 2).padStart(6, '0');\n\n // Variable-length types have no meaningful output length\n case 'STRING':\n case 'RAWSTRING':\n case 'GEOM_EWKB':\n return undefined;\n\n default:\n return undefined;\n }\n}\n\nexport const dataElementHandler = createHandler(AdkDataElement, {\n schema: dtel,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_DTEL',\n serializer_version: 'v1.0.0',\n\n toAbapGit: (obj) => {\n const data = obj.dataSync;\n const de = data?.dataElement;\n const typeKind = de?.typeKind ?? '';\n\n // Domain-based DTELs: DATATYPE/LENG/DECIMALS/OUTPUTLEN are inherited\n // from the domain, not stored on the DTEL itself. abapGit omits them.\n const isDomain = typeKind === 'domain';\n\n // Reference types: abapGit emits DATATYPE=REF but ADT doesn't return it.\n const isRef = typeKind.startsWith('refTo');\n const dataType = isRef ? 'REF' : de?.dataType || undefined;\n\n // Suppress domain-inherited type info\n const effectiveDataType = isDomain ? undefined : dataType;\n const effectiveLeng =\n isDomain || !de?.dataTypeLength\n ? undefined\n : String(de.dataTypeLength).padStart(6, '0');\n const effectiveDecimals =\n isDomain || !de?.dataTypeDecimals\n ? undefined\n : String(de.dataTypeDecimals).padStart(6, '0');\n const effectiveOutputLen = isDomain\n ? undefined\n : deriveOutputLength(\n de?.dataType,\n de?.dataTypeLength,\n de?.dataTypeDecimals,\n );\n\n // Properties ordered to match canonical DD04V table column order.\n // The XSD xs:sequence enforces this order in the XML output.\n return {\n DD04V: {\n ROLLNAME: obj.name ?? '',\n DDLANGUAGE: isoToSapLang(obj.language || undefined),\n DOMNAME: de?.typeName || undefined,\n HEADLEN: de?.headingFieldLength\n ? String(de.headingFieldLength)\n : undefined,\n SCRLEN1: de?.shortFieldLength ? String(de.shortFieldLength) : undefined,\n SCRLEN2: de?.mediumFieldLength\n ? String(de.mediumFieldLength)\n : undefined,\n SCRLEN3: de?.longFieldLength ? String(de.longFieldLength) : undefined,\n DDTEXT: obj.description ?? '',\n REPTEXT: de?.headingFieldLabel || undefined,\n SCRTEXT_S: de?.shortFieldLabel || undefined,\n SCRTEXT_M: de?.mediumFieldLabel || undefined,\n SCRTEXT_L: de?.longFieldLabel || undefined,\n DTELMASTER: isoToSapLang(obj.masterLanguage || undefined),\n DATATYPE: effectiveDataType,\n LENG: effectiveLeng,\n DECIMALS: effectiveDecimals,\n OUTPUTLEN: effectiveOutputLen,\n REFKIND: TYPEKIND_TO_REFKIND[typeKind] || undefined,\n REFTYPE: TYPEKIND_TO_REFTYPE[typeKind],\n ABAP_LANGUAGE_VERSION: abapLangVerFromAdt(data?.abapLanguageVersion),\n },\n };\n },\n\n fromAbapGit: ({ DD04V }) => {\n // Map REFKIND + REFTYPE to ADT typeKind enum\n const refKind = DD04V?.REFKIND ?? '';\n const refType = DD04V?.REFTYPE ?? '';\n let typeKind: string;\n if (refKind === 'D') {\n typeKind = 'domain';\n } else if (refKind === 'R') {\n typeKind = refType === 'C' ? 'refToClifType' : 'refToDictionaryType';\n } else {\n typeKind = DD04V?.DATATYPE ? 'predefinedAbapType' : 'domain';\n }\n\n return {\n name: (DD04V?.ROLLNAME ?? '').toUpperCase(),\n type: 'DTEL/DE',\n description: DD04V?.DDTEXT,\n language: sapLangToIso(DD04V?.DDLANGUAGE),\n masterLanguage: sapLangToIso(DD04V?.DDLANGUAGE),\n abapLanguageVersion: abapLangVerToAdt(DD04V?.ABAP_LANGUAGE_VERSION),\n dataElement: {\n // SAP's strict xs:sequence parser requires ALL elements to be present.\n // Every field in the dataelements.xsd sequence must have an explicit value.\n typeKind,\n typeName: DD04V?.DOMNAME || '',\n dataType: DD04V?.DATATYPE || '',\n dataTypeLength: DD04V?.LENG ? Number(DD04V.LENG) : 0,\n dataTypeLengthEnabled: false,\n dataTypeDecimals: DD04V?.DECIMALS ? Number(DD04V.DECIMALS) : 0,\n dataTypeDecimalsEnabled: false,\n shortFieldLabel: DD04V?.SCRTEXT_S || '',\n shortFieldLength: DD04V?.SCRLEN1 ? Number(DD04V.SCRLEN1) : 0,\n shortFieldMaxLength: DD04V?.SCRLEN1 ? Number(DD04V.SCRLEN1) : 0,\n mediumFieldLabel: DD04V?.SCRTEXT_M || '',\n mediumFieldLength: DD04V?.SCRLEN2 ? Number(DD04V.SCRLEN2) : 0,\n mediumFieldMaxLength: DD04V?.SCRLEN2 ? Number(DD04V.SCRLEN2) : 0,\n longFieldLabel: DD04V?.SCRTEXT_L || '',\n longFieldLength: DD04V?.SCRLEN3 ? Number(DD04V.SCRLEN3) : 0,\n longFieldMaxLength: DD04V?.SCRLEN3 ? Number(DD04V.SCRLEN3) : 0,\n headingFieldLabel: DD04V?.REPTEXT || '',\n headingFieldLength: DD04V?.HEADLEN ? Number(DD04V.HEADLEN) : 0,\n headingFieldMaxLength: DD04V?.HEADLEN ? Number(DD04V.HEADLEN) : 0,\n searchHelp: '',\n searchHelpParameter: '',\n setGetParameter: '',\n defaultComponentName: '',\n deactivateInputHistory: false,\n changeDocument: false,\n leftToRightDirection: false,\n deactivateBIDIFiltering: false,\n documentationStatus: '',\n },\n } as { name: string } & Record<string, unknown>;\n },\n});\n","/**\n * CDS AST → abapGit DD02V/DD03P Mapping\n *\n * Transforms @abapify/acds AST nodes into DD02V (header) and DD03P (field)\n * data structures for abapGit XML serialization.\n *\n * When a TypeResolver is provided, named type references are resolved via\n * ADT to determine whether they are data elements or structures, and to\n * extract metadata (search help origin, description) that is not available\n * from the CDS source alone.\n */\n\nimport type {\n TableDefinition,\n StructureDefinition,\n Annotation,\n AnnotationValue,\n FieldDefinition,\n IncludeDirective,\n BuiltinTypeRef,\n TableMember,\n} from '@abapify/acds';\n\n// ============================================\n// DD02V / DD03P data types\n// ============================================\n\nexport interface DD02VData {\n TABNAME?: string;\n DDLANGUAGE?: string;\n TABCLASS?: string;\n LANGDEP?: string;\n DDTEXT?: string;\n MASTERLANG?: string;\n CONTFLAG?: string;\n EXCLASS?: string;\n AUTHCLASS?: string;\n CLIDEP?: string;\n BUFFERED?: string;\n MATEFLAG?: string;\n}\n\nexport interface DD03PData {\n FIELDNAME?: string;\n POSITION?: string;\n KEYFLAG?: string;\n ROLLNAME?: string;\n ADMINFIELD?: string;\n INTTYPE?: string;\n INTLEN?: string;\n NOTNULL?: string;\n DATATYPE?: string;\n LENG?: string;\n DECIMALS?: string;\n SHLPORIGIN?: string;\n MASK?: string;\n COMPTYPE?: string;\n REFTABLE?: string;\n REFFIELD?: string;\n PRECFIELD?: string;\n DDTEXT?: string;\n}\n\n// ============================================\n// Type Resolver — resolves named types via ADT\n// ============================================\n\n/** Result of resolving a named type reference */\nexport interface ResolvedType {\n /** 'E' = data element, 'S' = structure */\n comptype: 'E' | 'S';\n /** Search help origin (e.g. 'D' for domain search help) */\n shlporigin?: string;\n /** Description text (used for include DDTEXT) */\n description?: string;\n}\n\n/**\n * Resolves named type references by querying ADT endpoints.\n * Caches results to avoid duplicate HTTP requests.\n */\nexport interface TypeResolver {\n resolve(name: string): Promise<ResolvedType>;\n}\n\n// ============================================\n// Annotation helpers\n// ============================================\n\n/** Extract the string value from an annotation value node */\nfunction annotationStringValue(val: AnnotationValue): string {\n switch (val.kind) {\n case 'string':\n return val.value;\n case 'enum':\n return val.value;\n case 'boolean':\n return val.value ? 'X' : '';\n case 'number':\n return String(val.value);\n default:\n return '';\n }\n}\n\n/** Find annotation by key and return its string value */\nfunction getAnnotation(\n annotations: Annotation[],\n key: string,\n): string | undefined {\n const ann = annotations.find((a) => a.key === key);\n return ann ? annotationStringValue(ann.value) : undefined;\n}\n\n// ============================================\n// Annotation → DD02V Mapping\n// ============================================\n\nconst TABLE_CATEGORY_MAP: Record<string, string> = {\n TRANSPARENT: 'TRANSP',\n CLUSTER: 'CLUSTER',\n POOL: 'POOL',\n APPEND: 'APPEND',\n};\n\nconst ENHANCEMENT_CATEGORY_MAP: Record<string, string> = {\n NOT_EXTENSIBLE: '1',\n EXTENSIBLE_CHARACTER_NUMERIC: '2',\n EXTENSIBLE_CHARACTER: '3',\n EXTENSIBLE_ANY: '4',\n NOT_CLASSIFIED: '0',\n};\n\nconst DATA_MAINTENANCE_MAP: Record<string, string> = {\n RESTRICTED: 'X',\n NOT_ALLOWED: 'N',\n ALLOWED: '',\n};\n\n/**\n * Build DD02V data from a parsed CDS table/structure definition\n */\nexport function buildDD02V(\n def: TableDefinition | StructureDefinition,\n language: string,\n description: string,\n): DD02VData {\n // Compute all values first, then assemble in abapGit field order\n let tabclass = def.kind === 'structure' ? 'INTTAB' : 'TRANSP';\n\n const tableCategory = getAnnotation(\n def.annotations,\n 'AbapCatalog.tableCategory',\n );\n if (tableCategory) {\n tabclass = TABLE_CATEGORY_MAP[tableCategory] || tabclass;\n }\n\n const deliveryClass = getAnnotation(\n def.annotations,\n 'AbapCatalog.deliveryClass',\n );\n\n const enhancementCategory = getAnnotation(\n def.annotations,\n 'AbapCatalog.enhancement.category',\n );\n\n const dataMaintenance = getAnnotation(\n def.annotations,\n 'AbapCatalog.dataMaintenance',\n );\n\n // Detect language-dependent structure/table:\n // LANGDEP=X when any field references data element SPRAS or builtin type abap.lang\n const hasLanguageField = def.members.some((m) => {\n if ('kind' in m && m.kind === 'include') return false;\n const f = m as FieldDefinition;\n if (f.type.kind === 'named') return f.type.name.toUpperCase() === 'SPRAS';\n if (f.type.kind === 'builtin')\n return (f.type as BuiltinTypeRef).name === 'lang';\n return false;\n });\n\n // Detect client-dependent table:\n // CLIDEP=X when any key field references data element MANDT or builtin type abap.clnt\n const hasClientKeyField = def.members.some((m) => {\n if ('kind' in m && m.kind === 'include') return false;\n const f = m as FieldDefinition;\n if (!f.isKey) return false;\n if (f.type.kind === 'named') return f.type.name.toUpperCase() === 'MANDT';\n if (f.type.kind === 'builtin')\n return (f.type as BuiltinTypeRef).name === 'clnt';\n return false;\n });\n\n // Build result in standard abapGit DD02V field order:\n // TABNAME, DDLANGUAGE, TABCLASS, LANGDEP, CLIDEP, DDTEXT, MASTERLANG, CONTFLAG, EXCLASS, MATEFLAG\n const result: DD02VData = {};\n result.TABNAME = def.name.toUpperCase();\n result.DDLANGUAGE = language;\n result.TABCLASS = tabclass;\n if (hasLanguageField) result.LANGDEP = 'X';\n if (hasClientKeyField) result.CLIDEP = 'X';\n result.DDTEXT = description;\n result.MASTERLANG = language;\n if (deliveryClass) result.CONTFLAG = deliveryClass;\n if (enhancementCategory)\n result.EXCLASS = ENHANCEMENT_CATEGORY_MAP[enhancementCategory];\n if (dataMaintenance)\n result.MATEFLAG = DATA_MAINTENANCE_MAP[dataMaintenance] ?? '';\n\n return result;\n}\n\n// ============================================\n// Field → DD03P Mapping\n// ============================================\n\ninterface BuiltinType {\n datatype: string;\n inttype: string;\n /** Fixed DDIC length (for types without user-specified length) */\n length?: number;\n /** Fixed DDIC decimals (e.g. FLTP always has 16) */\n decimals?: number;\n /** Fixed internal byte length (overrides computed INTLEN) */\n fixedIntlen?: number;\n /** Whether this type has no LENG in the DDIC (variable-length types) */\n noLeng?: boolean;\n /** SHLPORIGIN value for search help (T = table-driven) */\n shlporigin?: string;\n}\n\n// DDIC INTTYPE/INTLEN mapping based on SAP abapGit serialization:\n// - INT1/INT2/INT4 use INTTYPE=X with raw byte-size INTLEN\n// - DATS/TIMS/DATN/TIMN use Unicode-doubled INTLEN\n// - String/rawstring have fixedIntlen=8 and no LENG\nconst BUILTIN_TYPES: Record<string, BuiltinType> = {\n char: { datatype: 'CHAR', inttype: 'C' },\n clnt: { datatype: 'CLNT', inttype: 'C', length: 3 },\n numc: { datatype: 'NUMC', inttype: 'N' },\n dats: {\n datatype: 'DATS',\n inttype: 'D',\n length: 8,\n fixedIntlen: 16,\n shlporigin: 'T',\n },\n datn: {\n datatype: 'DATN',\n inttype: 'D',\n length: 8,\n fixedIntlen: 16,\n shlporigin: 'T',\n },\n tims: {\n datatype: 'TIMS',\n inttype: 'T',\n length: 6,\n fixedIntlen: 12,\n shlporigin: 'T',\n },\n timn: {\n datatype: 'TIMN',\n inttype: 'T',\n length: 6,\n fixedIntlen: 12,\n shlporigin: 'T',\n },\n string: { datatype: 'STRG', inttype: 'g', fixedIntlen: 8, noLeng: true },\n xstring: { datatype: 'RSTR', inttype: 'y', fixedIntlen: 8, noLeng: true },\n int1: { datatype: 'INT1', inttype: 'X', length: 3, fixedIntlen: 1 },\n int2: { datatype: 'INT2', inttype: 'X', length: 5, fixedIntlen: 2 },\n int4: { datatype: 'INT4', inttype: 'X', length: 10, fixedIntlen: 4 },\n int8: { datatype: 'INT8', inttype: '8', length: 19, fixedIntlen: 8 },\n fltp: {\n datatype: 'FLTP',\n inttype: 'F',\n length: 16,\n decimals: 16,\n fixedIntlen: 8,\n },\n dec: { datatype: 'DEC', inttype: 'P' },\n curr: { datatype: 'CURR', inttype: 'P' },\n quan: { datatype: 'QUAN', inttype: 'P' },\n raw: { datatype: 'RAW', inttype: 'X' },\n rawstring: { datatype: 'RSTR', inttype: 'y', fixedIntlen: 8, noLeng: true },\n lang: { datatype: 'LANG', inttype: 'C', length: 1 },\n unit: { datatype: 'UNIT', inttype: 'C', length: 3 },\n cuky: { datatype: 'CUKY', inttype: 'C', length: 5 },\n d16n: { datatype: 'D16N', inttype: 'a', fixedIntlen: 8 },\n d34n: { datatype: 'D34N', inttype: 'e', fixedIntlen: 16 },\n utclong: { datatype: 'UTCL', inttype: 'p', length: 27, fixedIntlen: 8 },\n};\n\n/** Zero-pad number to given width */\nfunction zeroPad(n: number, width: number): string {\n return String(n).padStart(width, '0');\n}\n\n/** Compute internal length from type info */\nfunction computeIntlen(builtin: BuiltinType, length?: number): number {\n if (builtin.fixedIntlen !== undefined) return builtin.fixedIntlen;\n\n // Packed decimal types: ceil((length + 1) / 2)\n if (builtin.inttype === 'P' && length !== undefined) {\n return Math.ceil((length + 1) / 2);\n }\n\n // Raw bytes: length directly\n if (builtin.inttype === 'X' && length !== undefined) {\n return length;\n }\n\n // Character types: length * 2 (Unicode)\n if (length !== undefined) {\n return length * 2;\n }\n\n // Fixed-length types with known length\n if (builtin.length !== undefined) {\n return builtin.length * 2;\n }\n\n return 0;\n}\n\n/** Build a DD03P entry from a single field definition */\nasync function buildFieldDD03P(\n field: FieldDefinition,\n tableName: string,\n resolver?: TypeResolver,\n): Promise<DD03PData> {\n // Compute all values first\n const isKey = field.isKey;\n const notNull = field.notNull;\n let rollname: string | undefined;\n let comptype: string | undefined;\n let inttype: string | undefined;\n let intlen: string | undefined;\n let datatype: string | undefined;\n let leng: string | undefined;\n let decimals: string | undefined;\n let mask: string | undefined;\n let shlporigin: string | undefined;\n let reftable: string | undefined;\n let reffield: string | undefined;\n\n if (field.type.kind === 'builtin') {\n const bt = field.type as BuiltinTypeRef;\n const typeInfo = BUILTIN_TYPES[bt.name];\n if (typeInfo) {\n // Use explicit CDS length, or fall back to fixed DDIC length\n const length = bt.length ?? typeInfo.length;\n inttype = typeInfo.inttype;\n intlen = zeroPad(computeIntlen(typeInfo, length), 6);\n datatype = typeInfo.datatype;\n\n // LENG: skip for variable-length types (string, xstring, rawstring)\n if (!typeInfo.noLeng && length !== undefined) {\n leng = zeroPad(length, 6);\n }\n\n // DECIMALS: use explicit CDS decimals, or fixed DDIC decimals\n const dec = bt.decimals ?? typeInfo.decimals;\n if (dec !== undefined) decimals = zeroPad(dec, 6);\n\n // MASK: all builtin types get \" DATATYPE\"\n mask = ` ${typeInfo.datatype}`;\n\n // SHLPORIGIN (date/time types)\n if (typeInfo.shlporigin) shlporigin = typeInfo.shlporigin;\n\n // REFTABLE/REFFIELD for currency and quantity fields\n // These come from CDS annotations on the field\n // Annotation value is 'tablename.fieldname' — we only need the field part\n if (bt.name === 'curr' || bt.name === 'quan') {\n const refAnnotation = getAnnotation(\n field.annotations,\n bt.name === 'curr'\n ? 'Semantics.amount.currencyCode'\n : 'Semantics.quantity.unitOfMeasure',\n );\n if (refAnnotation) {\n reftable = tableName;\n // Strip table prefix if present (e.g. 'ztest.currency_code' → 'CURRENCY_CODE')\n const parts = refAnnotation.split('.');\n reffield = parts[parts.length - 1].toUpperCase();\n }\n }\n }\n } else {\n // Named type reference — resolve via ADT if available\n rollname = field.type.name.toUpperCase();\n comptype = 'E'; // Default: data element\n if (resolver) {\n const resolved = await resolver.resolve(field.type.name);\n comptype = resolved.comptype;\n if (resolved.shlporigin) shlporigin = resolved.shlporigin;\n if (resolved.comptype === 'S') {\n datatype = 'STRU';\n mask = ' STRUS';\n }\n }\n }\n\n // Build in standard abapGit DD03P field order\n //\n // NOTE: POSITION is a real DD03P database value. abapGit emits it\n // inconsistently (only for some transparent tables). We omit it to\n // avoid roundtrip mismatches — SAP auto-computes it on import.\n const result: DD03PData = {};\n result.FIELDNAME = field.name.toUpperCase();\n if (isKey) result.KEYFLAG = 'X';\n if (rollname) result.ROLLNAME = rollname;\n result.ADMINFIELD = '0';\n if (inttype) result.INTTYPE = inttype;\n if (intlen) result.INTLEN = intlen;\n if (notNull) result.NOTNULL = 'X';\n if (datatype) result.DATATYPE = datatype;\n if (leng) result.LENG = leng;\n if (decimals) result.DECIMALS = decimals;\n if (shlporigin) result.SHLPORIGIN = shlporigin;\n if (reftable) result.REFTABLE = reftable;\n if (reffield) result.REFFIELD = reffield;\n if (mask) result.MASK = mask;\n if (comptype) result.COMPTYPE = comptype;\n\n return result;\n}\n\n/**\n * Build DD03P entries from table/structure members\n */\nexport async function buildDD03P(\n members: TableMember[],\n tableName = '',\n resolver?: TypeResolver,\n): Promise<DD03PData[]> {\n const entries: DD03PData[] = [];\n\n for (const member of members) {\n if ('kind' in member && member.kind === 'include') {\n const inc = member as IncludeDirective;\n const includeName = inc.name.toUpperCase();\n\n // Resolve include description via ADT if available\n let ddtext: string | undefined;\n if (resolver) {\n const resolved = await resolver.resolve(inc.name);\n ddtext = resolved.description;\n }\n\n if (inc.suffix) {\n // Include with suffix → .INCLU-<SUFFIX> entry\n const entry: DD03PData = {\n FIELDNAME: `.INCLU-${inc.suffix.toUpperCase()}`,\n ADMINFIELD: '0',\n PRECFIELD: includeName,\n MASK: ' S',\n COMPTYPE: 'S',\n };\n if (ddtext) entry.DDTEXT = ddtext;\n entries.push(entry);\n } else {\n // Plain include → .INCLUDE entry\n const entry: DD03PData = {\n FIELDNAME: '.INCLUDE',\n ADMINFIELD: '0',\n PRECFIELD: includeName,\n MASK: ' S',\n COMPTYPE: 'S',\n };\n if (ddtext) entry.DDTEXT = ddtext;\n entries.push(entry);\n }\n } else {\n // Regular field definition\n const field = member as FieldDefinition;\n entries.push(await buildFieldDD03P(field, tableName, resolver));\n }\n }\n\n return entries;\n}\n","/**\n * Table/Structure serialization helpers for abapGit format.\n *\n * This file contains the source-to-XML conversion used by the TABL handler.\n * It is intentionally separate from the handler definition file, which keeps\n * the handler surface focused on schema mapping (`toAbapGit`/`fromAbapGit`).\n */\n\nimport {\n parse,\n type TableDefinition,\n type StructureDefinition,\n} from '@abapify/acds';\nimport { tablesettings, type InferTypedSchema } from '@abapify/adt-schemas';\nimport type { FormatSerializeOptions } from '@abapify/adt-plugin';\nimport { AdkTable, AdkStructure } from '../adk';\nimport { tabl } from '../../../schemas/generated';\nimport { SerializedFile } from '../base';\nimport { isoToSapLang, sapLangToIso } from '../lang';\nimport { buildDD02V, buildDD03P } from '../cds-to-abapgit';\nimport type { TypeResolver, ResolvedType } from '../cds-to-abapgit';\nimport { formatAbapGitXml } from '../xml-format';\n\nconst XML_NAMED_ENTITIES: Record<string, string> = {\n amp: '&',\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: \"'\",\n};\n\nfunction decodeNumericCode(decimal?: string, hex?: string): string {\n const base = decimal !== undefined ? 10 : 16;\n const value = decimal !== undefined ? decimal : (hex ?? '');\n return String.fromCharCode(parseInt(value, base));\n}\n\nfunction decodeXmlEntities(text: string): string {\n return text.replace(\n /&(?:#(\\d+)|#x([0-9a-fA-F]+)|([a-zA-Z][a-zA-Z0-9]*));/g,\n (match, decimal, hex, name) =>\n decimal !== undefined || hex !== undefined\n ? decodeNumericCode(decimal, hex)\n : (XML_NAMED_ENTITIES[name] ?? match),\n );\n}\n\n/**\n * Strip undefined/empty-string values from an object\n * to avoid emitting empty XML elements\n */\nfunction stripEmpty<T extends object>(obj: T): Partial<T> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== undefined && value !== '') {\n result[key] = value;\n }\n }\n return result as Partial<T>;\n}\n\ntype TableSettings = Extract<\n InferTypedSchema<typeof tablesettings>,\n { tableSettings: unknown }\n>['tableSettings'];\n\n/**\n * Parse ADT table settings XML into DD09L data for abapGit serialization.\n */\nfunction parseSettingsToDD09L(\n settingsXml: string,\n def: TableDefinition | StructureDefinition,\n): Record<string, string> | undefined {\n let settings: TableSettings;\n try {\n const parsed = tablesettings.parse(settingsXml);\n if (!('tableSettings' in parsed)) return undefined;\n settings = parsed.tableSettings;\n } catch {\n return undefined;\n }\n\n const dd09l: Record<string, string | undefined> = {\n TABNAME: def.name.toUpperCase(),\n AS4LOCAL: 'A',\n TABKAT: settings.sizeCategory,\n TABART: settings.dataClassCategory,\n BUFALLOW: settings.buffering?.allowed,\n PUFFERUNG: settings.buffering?.type as string | undefined,\n SCHFELDANZ:\n settings.buffering?.areaKeyFields &&\n settings.buffering.areaKeyFields !== '0'\n ? settings.buffering.areaKeyFields\n : undefined,\n PROTOKOLL: settings.loggingEnabled ? 'X' : undefined,\n };\n\n return stripEmpty(dd09l) as Record<string, string>;\n}\n\n/**\n * Create a TypeResolver that resolves named types via ADT endpoints.\n */\nfunction resolveReferencedType(xml: string, comptype: 'E' | 'S'): ResolvedType {\n const result: ResolvedType = { comptype };\n if (\n comptype === 'E' &&\n /<dtel:searchHelp>[^<]+<\\/dtel:searchHelp>/.test(xml)\n ) {\n result.shlporigin = 'D';\n }\n const descMatch = xml.match(/adtcore:description=\"([^\"]+)\"/);\n if (descMatch) result.description = decodeXmlEntities(descMatch[1]);\n return result;\n}\n\nfunction createAdtTypeResolver(obj: AdkTable | AdkStructure): TypeResolver {\n const cache = new Map<string, ResolvedType>();\n\n return {\n async resolve(name: string): Promise<ResolvedType> {\n const key = name.toLowerCase();\n const cached = cache.get(key);\n if (cached) return cached;\n\n const dtelXml = await obj.fetchText(\n `/sap/bc/adt/ddic/dataelements/${encodeURIComponent(key)}`,\n );\n if (dtelXml) {\n const result = resolveReferencedType(dtelXml, 'E');\n cache.set(key, result);\n return result;\n }\n\n const structXml = await obj.fetchText(\n `/sap/bc/adt/ddic/structures/${encodeURIComponent(key)}`,\n );\n const result = structXml\n ? resolveReferencedType(structXml, 'S')\n : { comptype: 'E' as const };\n cache.set(key, result);\n return result;\n },\n };\n}\n\nasync function resolveCdsSource<T extends AdkTable | AdkStructure>(\n obj: T,\n sources: Readonly<Record<string, string>> | undefined,\n): Promise<{ source: string } | { fallback: true }> {\n if (sources !== undefined) {\n // An explicit source map is authoritative. If it does not contain the\n // `main` component, we emit metadata only rather than falling back to the\n // current mutable SAP source.\n if (sources.main === undefined) {\n return { fallback: true };\n }\n return { source: sources.main };\n }\n try {\n return { source: await obj.getSource() };\n } catch {\n return { fallback: true };\n }\n}\n\nfunction createFallbackFile<T extends AdkTable | AdkStructure>(\n obj: T,\n ctx: {\n getObjectName: (obj: T) => string;\n toAbapGitXml: (obj: T) => string;\n createFile: (path: string, content: string) => SerializedFile;\n },\n): SerializedFile[] {\n const objectName = ctx.getObjectName(obj);\n return [ctx.createFile(`${objectName}.tabl.xml`, ctx.toAbapGitXml(obj))];\n}\n\nasync function buildTablValues<T extends AdkTable | AdkStructure>(\n obj: T,\n def: TableDefinition | StructureDefinition,\n): Promise<Record<string, unknown>> {\n const lang = isoToSapLang(obj.language || undefined);\n const dd02v = buildDD02V(def, lang, obj.description ?? '');\n const resolver = createAdtTypeResolver(obj);\n const dd03pEntries = await buildDD03P(\n def.members,\n def.name.toUpperCase(),\n resolver,\n );\n\n const values: Record<string, unknown> = { DD02V: stripEmpty(dd02v) };\n\n if ('getSettings' in obj && typeof obj.getSettings === 'function') {\n try {\n const settingsXml = await (obj as AdkTable).getSettings();\n if (settingsXml) {\n const dd09l = parseSettingsToDD09L(settingsXml, def);\n if (dd09l) values.DD09L = stripEmpty(dd09l);\n }\n } catch {\n // Settings not available, skip DD09L\n }\n }\n\n if (dd03pEntries.length > 0) {\n values.DD03P_TABLE = {\n DD03P: dd03pEntries.map((entry) => stripEmpty(entry)),\n };\n }\n\n return values;\n}\n\nfunction buildTablXml<T extends AdkTable | AdkStructure>(\n obj: T,\n ctx: {\n getObjectName: (obj: T) => string;\n },\n values: Record<string, unknown>,\n): string {\n const fullPayload = {\n abap: { version: '1.0', values },\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_TABL',\n serializer_version: 'v1.0.0',\n };\n\n return formatAbapGitXml(tabl.build(fullPayload as any, { pretty: true }));\n}\n\nexport async function serializeTabl<T extends AdkTable | AdkStructure>(\n obj: T,\n ctx: {\n getObjectName: (obj: T) => string;\n toAbapGitXml: (obj: T) => string;\n createFile: (path: string, content: string) => SerializedFile;\n },\n options?: FormatSerializeOptions,\n): Promise<SerializedFile[]> {\n const objectName = ctx.getObjectName(obj);\n\n const resolved = await resolveCdsSource(\n obj,\n options?.sources as Readonly<Record<string, string>> | undefined,\n );\n if ('fallback' in resolved) return createFallbackFile(obj, ctx);\n\n const { ast, errors } = parse(resolved.source);\n if (errors.length > 0 || ast.definitions.length === 0) {\n return createFallbackFile(obj, ctx);\n }\n\n const def = ast.definitions[0] as TableDefinition | StructureDefinition;\n const values = await buildTablValues(obj, def);\n const xml = buildTablXml(obj, ctx, values);\n return [ctx.createFile(`${objectName}.tabl.xml`, xml)];\n}\n\nexport function fromAbapGitTabl({ DD02V }: any = {}) {\n return {\n name: (DD02V?.TABNAME ?? '').toUpperCase(),\n type: DD02V?.TABCLASS === 'INTTAB' ? 'TABL/DS' : 'TABL/DT',\n description: DD02V?.DDTEXT,\n language: sapLangToIso(DD02V?.DDLANGUAGE),\n masterLanguage: sapLangToIso(DD02V?.DDLANGUAGE),\n } as { name: string } & Record<string, unknown>;\n}\n","/**\n * Table/Structure (TABL) object handlers for abapGit format\n *\n * Serializes SAP tables (TABL/DT) and structures (TABL/DS) to\n * abapGit-compatible XML format by fetching the CDS-style source code\n * from SAP, parsing it with @abapify/acds, and mapping the AST into\n * DD02V/DD03P structures.\n *\n * Tables and structures share the same serialization logic but use\n * different ADT endpoints (ddic/tables vs ddic/structures).\n *\n * Data sources:\n * - blueSource GET: name, type, description, language\n * - source/main GET: CDS source with annotations and field definitions\n * → parsed via @abapify/acds into AST\n * → mapped into DD02V annotations and DD03P field entries\n * - Per named type: /sap/bc/adt/ddic/dataelements/{name} or /structures/{name}\n * → resolves COMPTYPE (E vs S), SHLPORIGIN, description (DDTEXT)\n */\n\nimport { AdkTable, AdkStructure } from '../adk';\nimport { tabl } from '../../../schemas/generated';\nimport { createHandler } from '../base';\nimport { isoToSapLang } from '../lang';\nimport { serializeTabl, fromAbapGitTabl } from './tabl-serialize';\n\nexport const tableHandler = createHandler(AdkTable, {\n schema: tabl,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_TABL',\n serializer_version: 'v1.0.0',\n\n toAbapGit: (obj) => ({\n DD02V: {\n TABNAME: obj.name ?? '',\n DDLANGUAGE: isoToSapLang(obj.language || undefined),\n TABCLASS: 'TRANSP',\n DDTEXT: obj.description ?? '',\n },\n }),\n\n serialize: (obj, ctx, options) => serializeTabl(obj, ctx, options),\n fromAbapGit: fromAbapGitTabl,\n});\n\nexport const structureHandler = createHandler(AdkStructure, {\n schema: tabl,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_TABL',\n serializer_version: 'v1.0.0',\n\n toAbapGit: (obj) => ({\n DD02V: {\n TABNAME: obj.name ?? '',\n DDLANGUAGE: isoToSapLang(obj.language || undefined),\n TABCLASS: 'INTTAB',\n DDTEXT: obj.description ?? '',\n },\n }),\n\n serialize: (obj, ctx, options) => serializeTabl(obj, ctx, options),\n fromAbapGit: fromAbapGitTabl,\n});\n","/**\n * Table Type (TTYP) object handler for abapGit format\n *\n * Maps between abapGit DD40V codes and ADT API enum values.\n */\n\nimport { AdkTableType } from '../adk';\nimport { ttyp } from '../../../schemas/generated';\nimport { createHandler } from '../base';\nimport {\n isoToSapLang,\n sapLangToIso,\n abapLangVerToAdt,\n abapLangVerFromAdt,\n} from '../lang';\n\n// ============================================\n// DD40V ↔ ADT API enum mappings\n// ============================================\n\n/** DD40V ACCESSMODE → ADT accessType */\nconst ACCESS_MODE_TO_ADT: Record<string, string> = {\n T: 'standard',\n S: 'sorted',\n H: 'hashed',\n};\nconst ACCESS_MODE_FROM_ADT: Record<string, string> = Object.fromEntries(\n Object.entries(ACCESS_MODE_TO_ADT).map(([k, v]) => [v, k]),\n);\n\n/** DD40V KEYDEF → ADT primaryKey.definition */\nconst KEY_DEF_TO_ADT: Record<string, string> = {\n D: 'standard',\n K: 'keyComponents',\n T: 'rowType',\n};\nconst KEY_DEF_FROM_ADT: Record<string, string> = Object.fromEntries(\n Object.entries(KEY_DEF_TO_ADT).map(([k, v]) => [v, k]),\n);\n\n/** DD40V KEYKIND → ADT primaryKey.kind */\nconst KEY_KIND_TO_ADT: Record<string, string> = {\n N: 'nonUnique',\n U: 'unique',\n G: 'notSpecified',\n};\nconst KEY_KIND_FROM_ADT: Record<string, string> = Object.fromEntries(\n Object.entries(KEY_KIND_TO_ADT).map(([k, v]) => [v, k]),\n);\n\n/**\n * DD40V ROWKIND → ADT rowType.typeKind\n *\n * ROWKIND='' (empty) + DATATYPE set → predefinedAbapType (built-in like STRING, INT4)\n * ROWKIND='S' → dictionaryType (references a structure/table/data element)\n * ROWKIND='R' → ref type\n */\nconst ROW_KIND_TO_ADT: Record<string, string> = {\n '': 'predefinedAbapType',\n S: 'dictionaryType',\n R: 'refToDictionaryType',\n};\nconst ROW_KIND_FROM_ADT: Record<string, string> = Object.fromEntries(\n Object.entries(ROW_KIND_TO_ADT).map(([k, v]) => [v, k]),\n);\n\n/**\n * DD40V DATATYPE (DDIC code) → ADT builtInType.dataType (ABAP type name)\n *\n * abapGit stores 4-char DDIC internal codes (e.g. STRG, RSTR).\n * SAP ADT REST API uses ABAP type names (e.g. STRING, XSTRING).\n * Most types use the same name in both (CHAR, NUMC, INT4, etc.);\n * only a few differ.\n */\nconst DATATYPE_TO_ADT: Record<string, string> = {\n STRG: 'STRING',\n SSTR: 'SSTRING',\n RSTR: 'XSTRING',\n UTCL: 'UTCLONG',\n};\nconst DATATYPE_FROM_ADT: Record<string, string> = Object.fromEntries(\n Object.entries(DATATYPE_TO_ADT).map(([k, v]) => [v, k]),\n);\n\n/**\n * DD40V TYPELEN — fixed internal byte length for predefined types.\n *\n * Variable-length types (STRING, XSTRING) have a fixed pointer size (8 bytes)\n * that abapGit stores as TYPELEN. This is not the same as LENG (display length).\n * We only need to emit TYPELEN for types that have noLeng=true (no external LENG).\n */\nconst FIXED_TYPELEN: Record<string, number> = {\n STRG: 8,\n RSTR: 8,\n};\n\n// ============================================\n// Handler\n// ============================================\n\nexport const tableTypeHandler = createHandler(AdkTableType, {\n schema: ttyp,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_TTYP',\n serializer_version: 'v1.0.0',\n\n toAbapGit: (obj) => {\n const data = obj.dataSync;\n const accessMode =\n ACCESS_MODE_FROM_ADT[data?.accessType ?? ''] ?? data?.accessType ?? '';\n const keyDef =\n KEY_DEF_FROM_ADT[data?.primaryKey?.definition ?? ''] ??\n data?.primaryKey?.definition ??\n '';\n const keyKind =\n KEY_KIND_FROM_ADT[data?.primaryKey?.kind ?? ''] ??\n data?.primaryKey?.kind ??\n '';\n const rowKind =\n ROW_KIND_FROM_ADT[data?.rowType?.typeKind ?? ''] ??\n data?.rowType?.typeKind ??\n '';\n\n // Map ADT dataType (STRING) → DDIC code (STRG)\n const adtDataType = data?.rowType?.builtInType?.dataType ?? '';\n const ddicDataType = DATATYPE_FROM_ADT[adtDataType] ?? adtDataType;\n\n // TYPELEN: fixed internal byte length for variable-length types (STRING, XSTRING)\n const typeLen = FIXED_TYPELEN[ddicDataType];\n\n return {\n DD40V: {\n TYPENAME: obj.name ?? '',\n DDLANGUAGE: isoToSapLang(data?.language || undefined),\n ROWTYPE: data?.rowType?.typeName || undefined,\n ROWKIND: rowKind || undefined,\n DATATYPE: ddicDataType,\n LENG: data?.rowType?.builtInType?.length\n ? String(data.rowType.builtInType.length).padStart(6, '0')\n : undefined,\n DECIMALS: data?.rowType?.builtInType?.decimals\n ? String(data.rowType.builtInType.decimals).padStart(6, '0')\n : undefined,\n ACCESSMODE: accessMode,\n KEYDEF: keyDef,\n KEYKIND: keyKind,\n DDTEXT: obj.description ?? '',\n TYPELEN: typeLen ? String(typeLen).padStart(6, '0') : undefined,\n ABAP_LANGUAGE_VERSION: abapLangVerFromAdt(data?.abapLanguageVersion),\n },\n };\n },\n\n fromAbapGit: ({ DD40V }) => {\n const accessType =\n ACCESS_MODE_TO_ADT[DD40V?.ACCESSMODE ?? ''] ?? DD40V?.ACCESSMODE;\n const keyDef = KEY_DEF_TO_ADT[DD40V?.KEYDEF ?? ''] ?? DD40V?.KEYDEF;\n const keyKind = KEY_KIND_TO_ADT[DD40V?.KEYKIND ?? ''] ?? DD40V?.KEYKIND;\n const rowKind = ROW_KIND_TO_ADT[DD40V?.ROWKIND ?? ''] ?? DD40V?.ROWKIND;\n\n // Map DDIC code (STRG) → ADT dataType (STRING)\n const ddicCode = DD40V?.DATATYPE ?? '';\n const adtDataType = DATATYPE_TO_ADT[ddicCode] ?? ddicCode;\n\n // For predefinedAbapType (built-in), typeName should be empty\n // For dictionaryType, typeName is the referenced type name\n const isPredefined = rowKind === 'predefinedAbapType';\n\n return {\n name: (DD40V?.TYPENAME ?? '').toUpperCase(),\n type: 'TTYP/DA',\n description: DD40V?.DDTEXT,\n language: sapLangToIso(DD40V?.DDLANGUAGE),\n masterLanguage: sapLangToIso(DD40V?.DDLANGUAGE),\n abapLanguageVersion: abapLangVerToAdt(DD40V?.ABAP_LANGUAGE_VERSION),\n rowType: {\n typeKind: rowKind,\n typeName: isPredefined ? '' : DD40V?.ROWTYPE || '',\n // SAP's strict xs:sequence parser requires builtInType element\n // to be present even when logically empty (e.g. refToDictionaryType).\n // Default all fields to avoid \"expected element builtInType\" errors.\n builtInType: {\n dataType: ddicCode ? adtDataType : '',\n length: DD40V?.LENG ? Number(DD40V.LENG) : 0,\n decimals: DD40V?.DECIMALS ? Number(DD40V.DECIMALS) : 0,\n },\n rangeType: '',\n },\n accessType,\n primaryKey: {\n definition: keyDef,\n kind: keyKind,\n components: { component: [] },\n alias: '',\n },\n secondaryKeys: {\n allowed: 'notSpecified',\n },\n } as { name: string } & Record<string, unknown>;\n },\n});\n","import { FormatMaterializationError } from '@abapify/adt-plugin';\nimport type { SerializedFile } from './base';\n\ntype SourceObject = { getSource?: () => Promise<string> | string };\n\n/**\n * Resolve the `main` source component for an AFF source handler.\n *\n * If `sources` is supplied, only the `main` key is accepted — any other\n * key throws `FORMAT_SOURCE_COMPONENT_UNSUPPORTED`. When `sources` is\n * absent, falls back to `object.getSource()`.\n */\nexport async function resolveMainSource(\n object: SourceObject,\n sources: Readonly<Record<string, string | undefined>> | undefined,\n typeLabel: string,\n): Promise<string | undefined> {\n if (sources !== undefined) {\n const keys = Object.keys(sources);\n if (keys.some((key) => key !== 'main')) {\n throw new FormatMaterializationError(\n 'FORMAT_SOURCE_COMPONENT_UNSUPPORTED',\n `${typeLabel} only supports the 'main' source component; received ${keys.join(', ')}.`,\n );\n }\n return sources.main;\n }\n return typeof object.getSource === 'function' ? await object.getSource() : '';\n}\n\n/**\n * Build an AFF JSON metadata file. `extra` fields are merged at the\n * top level alongside `formatVersion` and `header`.\n */\nexport function buildAffJson(\n description: string,\n originalLanguage: string,\n abapLanguageVersion: string | undefined,\n extra: Record<string, unknown> = {},\n): string {\n return `${JSON.stringify(\n {\n formatVersion: '1',\n header: {\n description,\n originalLanguage: originalLanguage.toLowerCase(),\n ...(abapLanguageVersion ? { abapLanguageVersion } : {}),\n },\n ...extra,\n },\n null,\n 2,\n )}\\n`;\n}\n\n/**\n * Create the source file for an AFF handler if the source should be\n * included. Returns an empty array if the source is absent or empty.\n */\nexport function createAffSourceFile(\n ctx: {\n getObjectName: (obj: unknown) => string;\n fileExtension: string;\n createFile: (path: string, content: string) => SerializedFile;\n },\n params: {\n object: unknown;\n source: string | undefined;\n suppliedSource: string | undefined;\n sourceExt: string;\n },\n): SerializedFile[] {\n if (params.source === undefined) return [];\n if (params.suppliedSource === undefined && params.source === '') return [];\n const name = ctx.getObjectName(params.object);\n return [\n ctx.createFile(\n `${name}.${ctx.fileExtension}.${params.sourceExt}`,\n params.source,\n ),\n ];\n}\n\n/**\n * Full serialize implementation for AFF source handlers.\n *\n * Handles the complete source+metadata file layout in one call:\n * `<name>.<ext>.<sourceExt>` — source text (when included)\n * `<name>.<jsonExt>` — metadata JSON\n *\n * `extra` is merged into the JSON body for handler-specific fields\n * (e.g. SRVD's `generalInformation`, DDLS's `sourceOrigin`).\n */\nexport async function serializeAffSource(\n object: SourceObject & {\n name: string;\n description?: string;\n originalLanguage?: string;\n abapLanguageVersion?: string;\n },\n ctx: {\n getObjectName: (obj: unknown) => string;\n fileExtension: string;\n createFile: (path: string, content: string) => SerializedFile;\n },\n options: Readonly<Record<string, string | undefined>> | undefined,\n config: {\n typeLabel: string;\n sourceExt: string;\n jsonExt: string;\n extra?: Record<string, unknown>;\n },\n): Promise<SerializedFile[]> {\n const source = await resolveMainSource(object, options, config.typeLabel);\n const name = ctx.getObjectName(object);\n return [\n ...createAffSourceFile(ctx, {\n object,\n source,\n suppliedSource: options?.main,\n sourceExt: config.sourceExt,\n }),\n ctx.createFile(\n `${name}.${config.jsonExt}`,\n buildAffJson(\n object.description || String(object.name ?? ''),\n object.originalLanguage ?? 'en',\n object.abapLanguageVersion,\n config.extra,\n ),\n ),\n ];\n}\n\n/**\n * Shared `getSource` handler function for source-driven AFF objects\n * (BDEF, SRVD). Delegates to `obj.getSource()` when available.\n */\nexport function affGetSource(obj: SourceObject): Promise<string> {\n return typeof obj?.getSource === 'function'\n ? Promise.resolve(obj.getSource())\n : Promise.resolve('');\n}\n\n/**\n * Shared `fromAbapGit` handler function for source-driven AFF objects.\n * Extracts the uppercased name from the SKEY envelope.\n */\nexport function affFromAbapGit(SKEY: { NAME?: string } | undefined): {\n name: string;\n} {\n return { name: String(SKEY?.NAME ?? '').toUpperCase() };\n}\n\n/**\n * Shared `setSources` handler function for source-driven AFF objects.\n * Stores the `main` source on a `_pendingSource` property.\n */\nexport function affSetSources(obj: unknown, sources: { main?: string }): void {\n if (sources.main !== undefined) {\n (obj as unknown as { _pendingSource: string })._pendingSource =\n sources.main;\n }\n}\n\n/**\n * Shared `fromAffJson` handler function for source-driven AFF objects.\n * Extracts the object name from the JSON header or falls back to the\n * filename-derived name passed in. The AFF JSON format stores the\n * description in `header.description` and the original language in\n * `header.originalLanguage`. Both are preserved for round-trip fidelity.\n */\nexport function affFromAffJson(\n json: Record<string, unknown>,\n fallbackName: string,\n): {\n name: string;\n description?: string;\n originalLanguage?: string;\n abapLanguageVersion?: string;\n} {\n const header = json.header as\n | {\n description?: string;\n originalLanguage?: string;\n abapLanguageVersion?: string;\n }\n | undefined;\n return {\n name: fallbackName,\n description: header?.description,\n originalLanguage: header?.originalLanguage,\n abapLanguageVersion: header?.abapLanguageVersion,\n };\n}\n\n/**\n * Dual-format serialize for objects that support both AFF JSON and legacy XML.\n *\n * When `options.format === 'legacy'`, produces a legacy abapGit XML metadata\n * file (via `ctx.toAbapGitXml`) plus the source file. Otherwise (default or\n * `format === 'aff'`), delegates to `serializeAffSource` to produce the AFF\n * JSON sidecar plus source.\n */\nexport async function serializeDualFormat(\n object: SourceObject & {\n name: string;\n description?: string;\n originalLanguage?: string;\n abapLanguageVersion?: string;\n },\n ctx: {\n getObjectName: (obj: unknown) => string;\n fileExtension: string;\n createFile: (path: string, content: string) => SerializedFile;\n toAbapGitXml: (obj: unknown) => string;\n },\n options: import('@abapify/adt-plugin').FormatSerializeOptions | undefined,\n config: {\n typeLabel: string;\n sourceExt: string;\n jsonExt: string;\n extra?: Record<string, unknown>;\n },\n): Promise<SerializedFile[]> {\n // Legacy XML format: produce .xml metadata + source file\n if (options?.format === 'legacy') {\n const source = await resolveMainSource(\n object,\n options?.sources,\n config.typeLabel,\n );\n const name = ctx.getObjectName(object);\n const files: SerializedFile[] = [];\n // Source file — preserve explicitly supplied empty source (authoritative\n // sources contract). Only skip when source is genuinely absent.\n if (source !== undefined) {\n files.push(\n ctx.createFile(\n `${name}.${ctx.fileExtension}.${config.sourceExt}`,\n source,\n ),\n );\n }\n // Legacy XML metadata\n files.push(\n ctx.createFile(\n `${name}.${ctx.fileExtension}.xml`,\n ctx.toAbapGitXml(object),\n ),\n );\n return files;\n }\n\n // Default: AFF JSON format\n return serializeAffSource(object, ctx, options?.sources, config);\n}\n","/**\n * BDEF (RAP Behavior Definition) object handler for abapGit format\n *\n * BDEF is source-driven: the semantic content lives in an `.abdl` file.\n * Supports BOTH formats:\n * - AFF (default): `.bdef.abdl` source + `.bdef.json` metadata sidecar\n * - Legacy XML: `.bdef.abdl` source + `.bdef.xml` metadata\n *\n * File layout (AFF):\n * src/zbp_foo.bdef.abdl — behavior source text\n * src/zbp_foo.bdef.json — ABAP File Formats metadata\n *\n * File layout (legacy):\n * src/zbp_foo.bdef.abdl — behavior source text\n * src/zbp_foo.bdef.xml — legacy abapGit XML metadata\n */\n\nimport { bdef } from '../../../schemas/generated';\nimport { createHandler } from '../base';\nimport {\n serializeDualFormat,\n affGetSource,\n affFromAbapGit,\n affSetSources,\n affFromAffJson,\n} from '../source-resolver';\nimport type { FormatSerializeOptions } from '@abapify/adt-plugin';\n\ntype BdefLike = {\n name: string;\n description?: string;\n originalLanguage?: string;\n abapLanguageVersion?: string;\n getSource?: () => Promise<string> | string;\n};\n\nexport const behaviorDefinitionHandler = createHandler<BdefLike, typeof bdef>(\n 'BDEF',\n {\n schema: bdef,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_BDEF',\n serializer_version: 'v1.0.0',\n\n toAbapGit: (obj) => ({\n SKEY: {\n TYPE: 'BDEF',\n NAME: String(obj?.name ?? '').toUpperCase(),\n },\n }),\n\n getSource: affGetSource,\n fromAbapGit: ({ SKEY }) => affFromAbapGit(SKEY),\n fromAffJson: (json) => affFromAffJson(json, ''),\n\n serialize: (object, ctx, options?: FormatSerializeOptions) =>\n serializeDualFormat(object, ctx, options, {\n typeLabel: 'BDEF',\n sourceExt: 'abdl',\n jsonExt: `${ctx.fileExtension}.json`,\n }),\n\n setSources: affSetSources,\n },\n);\n","/**\n * SRVD (RAP Service Definition) object handler for abapGit format\n *\n * SRVD is source-driven: the semantic content lives in an `.acds` file.\n * Supports BOTH formats:\n * - AFF (default): `.srvd.acds` source + `.srvd.json` metadata sidecar\n * - Legacy XML: `.srvd.acds` source + `.srvd.xml` metadata\n *\n * File layout (AFF):\n * src/zui_foo.srvd.acds — service source text\n * src/zui_foo.srvd.json — ABAP File Formats metadata\n *\n * File layout (legacy):\n * src/zui_foo.srvd.acds — service source text\n * src/zui_foo.srvd.xml — legacy abapGit XML metadata\n */\n\nimport { srvd } from '../../../schemas/generated';\nimport { createHandler } from '../base';\nimport {\n serializeDualFormat,\n affGetSource,\n affFromAbapGit,\n affSetSources,\n affFromAffJson,\n} from '../source-resolver';\nimport type { FormatSerializeOptions } from '@abapify/adt-plugin';\n\ntype SrvdLike = {\n name: string;\n description?: string;\n originalLanguage?: string;\n abapLanguageVersion?: string;\n sourceOrigin?: string;\n sourceType?: string;\n getSource?: () => Promise<string> | string;\n};\n\nexport const serviceDefinitionHandler = createHandler<SrvdLike, typeof srvd>(\n 'SRVD',\n {\n schema: srvd,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_SRVD',\n serializer_version: 'v1.0.0',\n\n toAbapGit: (obj) => ({\n SKEY: {\n TYPE: 'SRVD',\n NAME: String(obj?.name ?? '').toUpperCase(),\n },\n }),\n\n getSource: affGetSource,\n fromAbapGit: ({ SKEY }) => affFromAbapGit(SKEY),\n fromAffJson: (json) => ({\n ...affFromAffJson(json, ''),\n // Preserve SRVD-specific metadata for round-trip\n sourceOrigin: (json as { generalInformation?: { sourceOrigin?: string } })\n ?.generalInformation?.sourceOrigin,\n sourceType: (json as { generalInformation?: { sourceType?: string } })\n ?.generalInformation?.sourceType,\n }),\n\n serialize: (object, ctx, options?: FormatSerializeOptions) =>\n serializeDualFormat(object, ctx, options, {\n typeLabel: 'SRVD',\n sourceExt: 'acds',\n jsonExt: `${ctx.fileExtension}.json`,\n extra: {\n generalInformation: {\n sourceOrigin: object.sourceOrigin ?? 'abapDevelopmentTools',\n sourceType: object.sourceType ?? 'definition',\n },\n },\n }),\n\n setSources: affSetSources,\n },\n);\n","/**\n * SRVB (RAP Service Binding) object handler for abapGit format\n *\n * Unlike BDEF/SRVD, SRVB is **metadata-only** — there is no source text.\n * Supports BOTH formats:\n * - Legacy XML (default): `<name>.srvb.xml` with SKEY + BINDING block\n * - AFF JSON: `<name>.srvb.json` with formatVersion + header\n *\n * File layout (legacy):\n * src/zui_foo.srvb.xml — metadata only\n *\n * File layout (AFF):\n * src/zui_foo.srvb.json — metadata only\n *\n * Mirrors the minimal-block approach used by\n * zcl_abapgit_object_srvb (abapGit upstream serialiser).\n */\n\nimport { srvb } from '../../../schemas/generated';\nimport { createHandler, type SerializedFile } from '../base';\nimport { buildAffJson } from '../source-resolver';\nimport type { FormatSerializeOptions } from '@abapify/adt-plugin';\n\n// SRVB is not derived from AdkObject — we cast to the minimal handler shape\n// via the string form of createHandler.\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype SrvbLike = any;\n\nexport const serviceBindingHandler = createHandler<SrvbLike, typeof srvb>(\n 'SRVB',\n {\n schema: srvb,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_SRVB',\n serializer_version: 'v1.0.0',\n\n toAbapGit: (obj) => ({\n SKEY: {\n TYPE: 'SRVB',\n NAME: String(obj?.name ?? '').toUpperCase(),\n },\n BINDING: {\n TYPE: 'odataV4',\n VERSION: '4',\n CATEGORY: 'odata_v4_ui',\n },\n }),\n\n fromAbapGit: ({ SKEY }) => ({\n name: String(SKEY?.NAME ?? '').toUpperCase(),\n }),\n\n fromAffJson: (json) => {\n const header = (\n json as {\n header?: {\n description?: string;\n originalLanguage?: string;\n abapLanguageVersion?: string;\n };\n }\n )?.header;\n const binding = (\n json as {\n binding?: {\n bindingType?: string;\n bindingTypeCategory?: string;\n services?: unknown[];\n };\n }\n )?.binding;\n return {\n // Filename-derived name (injected by deserializer)\n name: '',\n description: header?.description,\n originalLanguage: header?.originalLanguage,\n abapLanguageVersion: header?.abapLanguageVersion,\n // Preserve binding metadata for round-trip\n bindingType: binding?.bindingType,\n bindingTypeCategory: binding?.bindingTypeCategory,\n services: binding?.services,\n };\n },\n\n // Metadata-only: emit either .xml (legacy) or .json (AFF) depending on format option.\n async serialize(\n object,\n ctx,\n options?: FormatSerializeOptions,\n ): Promise<SerializedFile[]> {\n const objectName = ctx.getObjectName(object);\n\n // AFF JSON format\n if (options?.format === 'aff') {\n const bindingType = String(\n object?.bindingType ?? object?.data?.bindingType ?? 'odataV4',\n );\n const bindingTypeCategory = String(\n object?.bindingTypeCategory ??\n object?.data?.bindingTypeCategory ??\n 'odata_v4_ui',\n );\n const services = object?.services ?? object?.data?.services ?? [];\n const jsonContent = buildAffJson(\n String(object?.description ?? object?.name ?? ''),\n String(object?.originalLanguage ?? 'en'),\n object?.abapLanguageVersion,\n {\n binding: {\n bindingType,\n bindingTypeCategory,\n ...(Array.isArray(services) && services.length > 0\n ? { services }\n : {}),\n },\n },\n );\n return [\n ctx.createFile(\n `${objectName}.${ctx.fileExtension}.json`,\n jsonContent,\n ),\n ];\n }\n\n // Default: legacy XML format\n const xmlContent = ctx.toAbapGitXml(object);\n return [\n ctx.createFile(`${objectName}.${ctx.fileExtension}.xml`, xmlContent),\n ];\n },\n },\n);\n","import { bdef } from '../../../schemas/generated';\nimport { createHandler, type AbapGitSchema } from '../base';\nimport {\n serializeDualFormat,\n affGetSource,\n affFromAbapGit,\n affSetSources,\n affFromAffJson,\n} from '../source-resolver';\nimport type { FormatSerializeOptions } from '@abapify/adt-plugin';\n\ntype CdsAffSourceObject = {\n name: string;\n description?: string;\n originalLanguage?: string;\n abapLanguageVersion?: string;\n getSource?: () => Promise<string> | string;\n};\n\ntype CdsAffSourceOptions = {\n /** Override the default bdef schema (for types with their own XSD) */\n schema?: AbapGitSchema;\n /** Extra AFF fields to include in fromAffJson (e.g. sourceOrigin, sourceType) */\n fromAffJsonExtra?: (json: Record<string, unknown>) => Record<string, unknown>;\n /** Extra fields to pass to serializeDualFormat, computed from the object */\n serializeExtra?: (\n object: CdsAffSourceObject & Record<string, unknown>,\n ) => Record<string, unknown>;\n};\n\n/** Create the shared dual-format source-and-metadata layout used by CDS source types.\n * Supports both AFF JSON (default) and legacy abapGit XML metadata. */\nexport function createCdsAffSourceHandler(\n type: string,\n options?: CdsAffSourceOptions,\n) {\n const schema = options?.schema ?? bdef;\n return createHandler<CdsAffSourceObject, typeof schema>(type, {\n schema,\n version: 'v1.0.0',\n serializer: `LCL_OBJECT_${type}`,\n serializer_version: 'v1.0.0',\n toAbapGit: (obj) => ({\n SKEY: { TYPE: type, NAME: String(obj?.name ?? '').toUpperCase() },\n }),\n getSource: affGetSource,\n fromAbapGit: ({ SKEY }) => affFromAbapGit(SKEY),\n fromAffJson: (json) =>\n options?.fromAffJsonExtra\n ? { ...affFromAffJson(json, ''), ...options.fromAffJsonExtra(json) }\n : affFromAffJson(json, ''),\n setSources: affSetSources,\n serialize: (object, ctx, opts?: FormatSerializeOptions) =>\n serializeDualFormat(object, ctx, opts, {\n typeLabel: type,\n sourceExt: 'acds',\n jsonExt: `${ctx.fileExtension}.json`,\n extra: options?.serializeExtra?.(object),\n }),\n });\n}\n","/**\n * DCLS (ABAP Data Control Language Source) object handler for abapGit format\n *\n * DCLS is source-driven: the semantic content lives in an `.acds` file.\n * Supports BOTH formats:\n * - AFF (default): `.dcls.acds` source + `.dcls.json` metadata sidecar\n * - Legacy XML: `.dcls.acds` source + `.dcls.xml` metadata\n */\n\nimport { dcls } from '../../../schemas/generated';\nimport { createCdsAffSourceHandler } from './cds-aff-source';\n\nexport const dclSourceHandler = createCdsAffSourceHandler('DCLS', {\n schema: dcls,\n});\n","/**\n * DDLS (Data Definition Language Source) object handler for abapGit format\n *\n * DDLS is source-driven: the semantic content lives in an `.acds` file.\n * Supports BOTH formats:\n * - AFF (default): `.ddls.acds` source + `.ddls.json` metadata sidecar\n * - Legacy XML: `.ddls.acds` source + `.ddls.xml` metadata\n */\n\nimport { ddls } from '../../../schemas/generated';\nimport { createCdsAffSourceHandler } from './cds-aff-source';\n\nexport const ddlSourceHandler = createCdsAffSourceHandler('DDLS', {\n schema: ddls,\n fromAffJsonExtra: (json) => ({\n sourceOrigin: (json as { sourceOrigin?: string })?.sourceOrigin,\n sourceType: (json as { sourceType?: string })?.sourceType,\n }),\n serializeExtra: (object) => ({\n sourceOrigin: object.sourceOrigin ?? 'abapDevelopmentTools',\n sourceType: object.sourceType ?? 'unknown',\n }),\n});\n","/**\n * DDLX (CDS Metadata Extension) object handler for abapGit format\n *\n * DDLX is source-driven: the semantic content lives in an `.acds` file.\n * Supports BOTH formats:\n * - AFF (default): `.ddlx.acds` source + `.ddlx.json` metadata sidecar\n * - Legacy XML: `.ddlx.acds` source + `.ddlx.xml` metadata\n */\n\nimport { ddlx } from '../../../schemas/generated';\nimport { createCdsAffSourceHandler } from './cds-aff-source';\n\nexport const ddlExtensionHandler = createCdsAffSourceHandler('DDLX', {\n schema: ddlx,\n});\n","/**\n * MSAG (Message Class) object handler for abapGit format\n *\n * Message classes are XML-only (no source code). The abapGit format stores\n * the class header in T100A and the individual message lines in the T100\n * table (wrapped in <item> elements).\n */\n\nimport { msag } from '../../../schemas/generated';\nimport { createHandler } from '../base';\nimport { isoToSapLang, sapLangToIso } from '../lang';\n\ntype MessageClassLike = {\n name: string;\n description?: string;\n language?: string;\n masterLanguage?: string;\n messages?: Array<{\n number?: string;\n text?: string;\n language?: string;\n }>;\n};\n\nexport const messageClassHandler = createHandler<MessageClassLike, typeof msag>(\n 'MSAG',\n {\n schema: msag,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_MSAG',\n serializer_version: 'v1.0.0',\n\n toAbapGit: (obj) => {\n const messages = obj.messages ?? [];\n return {\n T100A: {\n ARBGB: String(obj.name ?? '').toUpperCase(),\n MASTERLANG: isoToSapLang(obj.masterLanguage || obj.language),\n STEXT: obj.description ?? '',\n },\n T100:\n messages.length > 0\n ? {\n item: messages.map((m) => ({\n SPRSL: isoToSapLang(\n m.language || obj.masterLanguage || obj.language,\n ),\n ARBGB: String(obj.name ?? '').toUpperCase(),\n MSGNR: String(m.number ?? '').padStart(3, '0'),\n TEXT: m.text ?? '',\n })),\n }\n : undefined,\n };\n },\n\n fromAbapGit: ({ T100A, T100 }) => {\n const rawItems = T100?.item ?? [];\n const items = Array.isArray(rawItems) ? rawItems : [rawItems];\n return {\n name: (T100A?.ARBGB ?? '').toUpperCase(),\n type: 'MSAG/MS',\n description: T100A?.STEXT,\n language: sapLangToIso(T100A?.MASTERLANG),\n masterLanguage: sapLangToIso(T100A?.MASTERLANG),\n messages: items.map((m) => ({\n number: m.MSGNR ?? '',\n text: m.TEXT ?? '',\n language: sapLangToIso(m.SPRSL),\n })),\n } as { name: string } & Record<string, unknown>;\n },\n },\n);\n","/**\n * VIEW (Database View) object handler for abapGit format\n *\n * Database views are XML-only (no source code). The abapGit format stores\n * the view header in DD25V, table assignments in DD26V_TABLE, view fields\n * in DD27P_TABLE and selection conditions in DD28V_TABLE.\n */\n\nimport { view } from '../../../schemas/generated';\nimport { createHandler } from '../base';\nimport { isoToSapLang, sapLangToIso } from '../lang';\n\ntype ViewLike = {\n name: string;\n description?: string;\n language?: string;\n masterLanguage?: string;\n viewClass?: string;\n baseTable?: string;\n baseTableField?: string;\n tables?: Array<{\n tableName?: string;\n position?: string;\n foreignView?: string;\n foreignField?: string;\n readOnly?: boolean;\n }>;\n fields?: Array<{\n viewField?: string;\n tableName?: string;\n fieldName?: string;\n keyFlag?: boolean;\n readOnly?: boolean;\n rollName?: string;\n checkTable?: string;\n description?: string;\n }>;\n selectionConditions?: Array<{\n andOr?: string;\n leftBracket?: string;\n fieldName?: string;\n operator?: string;\n constantValue?: string;\n rightBracket?: string;\n }>;\n};\n\nexport const viewHandler = createHandler<ViewLike, typeof view>('VIEW', {\n schema: view,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_VIEW',\n serializer_version: 'v1.0.0',\n\n toAbapGit: (obj) => {\n const tables = obj.tables ?? [];\n const fields = obj.fields ?? [];\n const conditions = obj.selectionConditions ?? [];\n return {\n DD25V: {\n VIEWNAME: String(obj.name ?? '').toUpperCase(),\n DDLANGUAGE: isoToSapLang(obj.language),\n DDTEXT: obj.description ?? '',\n VIEWCLASS: obj.viewClass ?? undefined,\n ROOTTAB: obj.baseTable ?? undefined,\n ROOTFIELD: obj.baseTableField ?? undefined,\n },\n DD26V_TABLE:\n tables.length > 0\n ? {\n item: tables.map((t) => ({\n VIEWNAME: String(obj.name ?? '').toUpperCase(),\n TABNAME: t.tableName ?? undefined,\n TABPOS: t.position ?? undefined,\n FVIEWNAME: t.foreignView ?? undefined,\n FFIELDNAME: t.foreignField ?? undefined,\n READONLY: t.readOnly ? 'X' : undefined,\n })),\n }\n : undefined,\n DD27P_TABLE:\n fields.length > 0\n ? {\n item: fields.map((f) => ({\n VIEWNAME: String(obj.name ?? '').toUpperCase(),\n VIEWFIELD: f.viewField ?? undefined,\n TABNAME: f.tableName ?? undefined,\n FIELDNAME: f.fieldName ?? undefined,\n KEYFLAG: f.keyFlag ? 'X' : undefined,\n READONLY: f.readOnly ? 'X' : undefined,\n ROLLNAME: f.rollName ?? undefined,\n CHECKTABLE: f.checkTable ?? undefined,\n DDTEXT: f.description ?? undefined,\n })),\n }\n : undefined,\n DD28V_TABLE:\n conditions.length > 0\n ? {\n item: conditions.map((c) => ({\n VIEWNAME: String(obj.name ?? '').toUpperCase(),\n ANDOR: c.andOr ?? undefined,\n LEFTBRACKET: c.leftBracket ?? undefined,\n FIELDNAME: c.fieldName ?? undefined,\n OPERATOR: c.operator ?? undefined,\n CONST_VALUE: c.constantValue ?? undefined,\n RIGHTBRACKET: c.rightBracket ?? undefined,\n })),\n }\n : undefined,\n };\n },\n\n fromAbapGit: parseViewFromAbapGit,\n});\n\nfunction normalizeItems<T>(raw: T | T[] | undefined): T[] {\n if (!raw) return [];\n return Array.isArray(raw) ? raw : [raw];\n}\n\nfunction parseViewTable(t: {\n TABNAME?: string;\n TABPOS?: string;\n FVIEWNAME?: string;\n FFIELDNAME?: string;\n READONLY?: string;\n}) {\n return {\n tableName: t.TABNAME,\n position: t.TABPOS,\n foreignView: t.FVIEWNAME,\n foreignField: t.FFIELDNAME,\n readOnly: t.READONLY === 'X',\n };\n}\n\nfunction parseViewField(f: {\n VIEWFIELD?: string;\n TABNAME?: string;\n FIELDNAME?: string;\n KEYFLAG?: string;\n READONLY?: string;\n ROLLNAME?: string;\n CHECKTABLE?: string;\n DDTEXT?: string;\n}) {\n return {\n viewField: f.VIEWFIELD,\n tableName: f.TABNAME,\n fieldName: f.FIELDNAME,\n keyFlag: f.KEYFLAG === 'X',\n readOnly: f.READONLY === 'X',\n rollName: f.ROLLNAME,\n checkTable: f.CHECKTABLE,\n description: f.DDTEXT,\n };\n}\n\nfunction parseViewCondition(c: {\n ANDOR?: string;\n LEFTBRACKET?: string;\n FIELDNAME?: string;\n OPERATOR?: string;\n CONST_VALUE?: string;\n RIGHTBRACKET?: string;\n}) {\n return {\n andOr: c.ANDOR,\n leftBracket: c.LEFTBRACKET,\n fieldName: c.FIELDNAME,\n operator: c.OPERATOR,\n constantValue: c.CONST_VALUE,\n rightBracket: c.RIGHTBRACKET,\n };\n}\n\nfunction parseViewFromAbapGit({\n DD25V,\n DD26V_TABLE,\n DD27P_TABLE,\n DD28V_TABLE,\n}: {\n DD25V?: {\n VIEWNAME?: string;\n DDTEXT?: string;\n DDLANGUAGE?: string;\n VIEWCLASS?: string;\n ROOTTAB?: string;\n ROOTFIELD?: string;\n };\n DD26V_TABLE?: { item?: unknown };\n DD27P_TABLE?: { item?: unknown };\n DD28V_TABLE?: { item?: unknown };\n}): { name: string } & Record<string, unknown> {\n const tableItems = normalizeItems(DD26V_TABLE?.item);\n const fieldItems = normalizeItems(DD27P_TABLE?.item);\n const condItems = normalizeItems(DD28V_TABLE?.item);\n return {\n name: (DD25V?.VIEWNAME ?? '').toUpperCase(),\n type: 'VIEW/VD',\n description: DD25V?.DDTEXT,\n language: sapLangToIso(DD25V?.DDLANGUAGE),\n masterLanguage: sapLangToIso(DD25V?.DDLANGUAGE),\n viewClass: DD25V?.VIEWCLASS,\n baseTable: DD25V?.ROOTTAB,\n baseTableField: DD25V?.ROOTFIELD,\n tables: tableItems.map(parseViewTable),\n fields: fieldItems.map(parseViewField),\n selectionConditions: condItems.map(parseViewCondition),\n };\n}\n","/**\n * ENQU (Lock Object) object handler for abapGit format\n *\n * Lock objects are XML-only (no source code). The abapGit format stores\n * the lock object header in DD25V, table assignments in DD26V_TABLE and\n * lock parameters in DD27P_TABLE.\n */\n\nimport { enqu } from '../../../schemas/generated';\nimport { createHandler } from '../base';\nimport { isoToSapLang, sapLangToIso } from '../lang';\n\ntype LockObjectLike = {\n name: string;\n description?: string;\n language?: string;\n masterLanguage?: string;\n baseTable?: string;\n baseTableField?: string;\n tables?: Array<{\n tableName?: string;\n position?: string;\n foreignView?: string;\n foreignField?: string;\n readOnly?: boolean;\n }>;\n parameters?: Array<{\n viewField?: string;\n tableName?: string;\n fieldName?: string;\n keyFlag?: boolean;\n rollName?: string;\n checkTable?: string;\n description?: string;\n }>;\n};\n\nexport const lockObjectHandler = createHandler<LockObjectLike, typeof enqu>(\n 'ENQU',\n {\n schema: enqu,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_ENQU',\n serializer_version: 'v1.0.0',\n\n toAbapGit: (obj) => {\n const tables = obj.tables ?? [];\n const parameters = obj.parameters ?? [];\n return {\n DD25V: {\n VIEWNAME: String(obj.name ?? '').toUpperCase(),\n DDLANGUAGE: isoToSapLang(obj.masterLanguage || obj.language),\n DDTEXT: obj.description ?? '',\n ROOTTAB: obj.baseTable ?? undefined,\n ROOTFIELD: obj.baseTableField ?? undefined,\n },\n DD26V_TABLE:\n tables.length > 0\n ? {\n item: tables.map((t) => ({\n VIEWNAME: String(obj.name ?? '').toUpperCase(),\n TABNAME: t.tableName ?? undefined,\n TABPOS: t.position ?? undefined,\n FVIEWNAME: t.foreignView ?? undefined,\n FFIELDNAME: t.foreignField ?? undefined,\n READONLY: t.readOnly ? 'X' : undefined,\n })),\n }\n : undefined,\n DD27P_TABLE:\n parameters.length > 0\n ? {\n item: parameters.map((p) => ({\n VIEWNAME: String(obj.name ?? '').toUpperCase(),\n VIEWFIELD: p.viewField ?? undefined,\n TABNAME: p.tableName ?? undefined,\n FIELDNAME: p.fieldName ?? undefined,\n KEYFLAG: p.keyFlag ? 'X' : undefined,\n ROLLNAME: p.rollName ?? undefined,\n CHECKTABLE: p.checkTable ?? undefined,\n DDTEXT: p.description ?? undefined,\n })),\n }\n : undefined,\n };\n },\n\n fromAbapGit: parseLockObjectFromAbapGit,\n },\n);\n\nfunction normalizeItems<T>(raw: T | T[] | undefined): T[] {\n if (!raw) return [];\n return Array.isArray(raw) ? raw : [raw];\n}\n\nfunction parseEnquTable(t: {\n TABNAME?: string;\n TABPOS?: string;\n FVIEWNAME?: string;\n FFIELDNAME?: string;\n READONLY?: string;\n}) {\n return {\n tableName: t.TABNAME,\n position: t.TABPOS,\n foreignView: t.FVIEWNAME,\n foreignField: t.FFIELDNAME,\n readOnly: t.READONLY === 'X',\n };\n}\n\nfunction parseEnquParam(p: {\n VIEWFIELD?: string;\n TABNAME?: string;\n FIELDNAME?: string;\n KEYFLAG?: string;\n ROLLNAME?: string;\n CHECKTABLE?: string;\n DDTEXT?: string;\n}) {\n return {\n viewField: p.VIEWFIELD,\n tableName: p.TABNAME,\n fieldName: p.FIELDNAME,\n keyFlag: p.KEYFLAG === 'X',\n rollName: p.ROLLNAME,\n checkTable: p.CHECKTABLE,\n description: p.DDTEXT,\n };\n}\n\nfunction parseLockObjectFromAbapGit({\n DD25V,\n DD26V_TABLE,\n DD27P_TABLE,\n}: {\n DD25V?: {\n VIEWNAME?: string;\n DDTEXT?: string;\n DDLANGUAGE?: string;\n ROOTTAB?: string;\n ROOTFIELD?: string;\n };\n DD26V_TABLE?: { item?: unknown };\n DD27P_TABLE?: { item?: unknown };\n}): { name: string } & Record<string, unknown> {\n const tableItems = normalizeItems(DD26V_TABLE?.item);\n const paramItems = normalizeItems(DD27P_TABLE?.item);\n return {\n name: (DD25V?.VIEWNAME ?? '').toUpperCase(),\n type: 'ENQU/LO',\n description: DD25V?.DDTEXT,\n language: sapLangToIso(DD25V?.DDLANGUAGE),\n masterLanguage: sapLangToIso(DD25V?.DDLANGUAGE),\n baseTable: DD25V?.ROOTTAB,\n baseTableField: DD25V?.ROOTFIELD,\n tables: tableItems.map(parseEnquTable),\n parameters: paramItems.map(parseEnquParam),\n };\n}\n","/**\n * SHLP (Search Help) object handler for abapGit format\n *\n * Search helps are XML-only (no source code). The abapGit format stores\n * the search help header in DD30V, the text table info in DD31V,\n * parameters in DD32P_TABLE and field assignments in DD33V_TABLE.\n */\n\nimport { shlp } from '../../../schemas/generated';\nimport { createHandler } from '../base';\nimport { isoToSapLang, sapLangToIso } from '../lang';\n\ntype SearchHelpLike = {\n name: string;\n description?: string;\n language?: string;\n masterLanguage?: string;\n helpType?: string;\n dialogType?: string;\n textTable?: {\n tableName?: string;\n fieldName?: string;\n fieldLocation?: string;\n rollName?: string;\n };\n parameters?: Array<{\n fieldName?: string;\n input?: boolean;\n output?: boolean;\n selectionPosition?: string;\n listPosition?: string;\n defaultValue?: string;\n rollName?: string;\n description?: string;\n }>;\n fieldAssignments?: Array<{\n helpField?: string;\n tableName?: string;\n fieldName?: string;\n input?: boolean;\n output?: boolean;\n }>;\n};\n\nexport const searchHelpHandler = createHandler<SearchHelpLike, typeof shlp>(\n 'SHLP',\n {\n schema: shlp,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_SHLP',\n serializer_version: 'v1.0.0',\n\n toAbapGit: (obj) => {\n const parameters = obj.parameters ?? [];\n const assignments = obj.fieldAssignments ?? [];\n return {\n DD30V: {\n SHLPNAME: String(obj.name ?? '').toUpperCase(),\n DDLANGUAGE: isoToSapLang(obj.language),\n DDTEXT: obj.description ?? '',\n SHLPTYPE: obj.helpType ?? undefined,\n DIALOGTYPE: obj.dialogType ?? undefined,\n },\n DD31V: obj.textTable\n ? {\n SHLPNAME: String(obj.name ?? '').toUpperCase(),\n TABNAME: obj.textTable.tableName ?? undefined,\n FIELDNAME: obj.textTable.fieldName ?? undefined,\n FLDLOCATION: obj.textTable.fieldLocation ?? undefined,\n ROLLNAME: obj.textTable.rollName ?? undefined,\n }\n : undefined,\n DD32P_TABLE:\n parameters.length > 0\n ? {\n item: parameters.map((p) => ({\n SHLPNAME: String(obj.name ?? '').toUpperCase(),\n FIELDNAME: p.fieldName ?? undefined,\n SHLPINPUT: p.input ? 'X' : undefined,\n SHLPOUTPUT: p.output ? 'X' : undefined,\n SHLPSELPOS: p.selectionPosition ?? undefined,\n SHLPLISPOS: p.listPosition ?? undefined,\n DEFAULTVAL: p.defaultValue ?? undefined,\n ROLLNAME: p.rollName ?? undefined,\n DDTEXT: p.description ?? undefined,\n })),\n }\n : undefined,\n DD33V_TABLE:\n assignments.length > 0\n ? {\n item: assignments.map((a) => ({\n SHLPNAME: String(obj.name ?? '').toUpperCase(),\n SHLPFIELD: a.helpField ?? undefined,\n TABNAME: a.tableName ?? undefined,\n FIELDNAME: a.fieldName ?? undefined,\n SHLPINPUT: a.input ? 'X' : undefined,\n SHLPOUTPUT: a.output ? 'X' : undefined,\n })),\n }\n : undefined,\n };\n },\n\n fromAbapGit: parseSearchHelpFromAbapGit,\n },\n);\n\nfunction normalizeItems<T>(raw: T | T[] | undefined): T[] {\n if (!raw) return [];\n return Array.isArray(raw) ? raw : [raw];\n}\n\nfunction parseShlpParam(p: {\n FIELDNAME?: string;\n SHLPINPUT?: string;\n SHLPOUTPUT?: string;\n SHLPSELPOS?: string;\n SHLPLISPOS?: string;\n DEFAULTVAL?: string;\n ROLLNAME?: string;\n DDTEXT?: string;\n}) {\n return {\n fieldName: p.FIELDNAME,\n input: p.SHLPINPUT === 'X',\n output: p.SHLPOUTPUT === 'X',\n selectionPosition: p.SHLPSELPOS,\n listPosition: p.SHLPLISPOS,\n defaultValue: p.DEFAULTVAL,\n rollName: p.ROLLNAME,\n description: p.DDTEXT,\n };\n}\n\nfunction parseShlpAssign(a: {\n SHLPFIELD?: string;\n TABNAME?: string;\n FIELDNAME?: string;\n SHLPINPUT?: string;\n SHLPOUTPUT?: string;\n}) {\n return {\n helpField: a.SHLPFIELD,\n tableName: a.TABNAME,\n fieldName: a.FIELDNAME,\n input: a.SHLPINPUT === 'X',\n output: a.SHLPOUTPUT === 'X',\n };\n}\n\nfunction parseSearchHelpFromAbapGit({\n DD30V,\n DD31V,\n DD32P_TABLE,\n DD33V_TABLE,\n}: {\n DD30V?: {\n SHLPNAME?: string;\n DDTEXT?: string;\n DDLANGUAGE?: string;\n SHLPTYPE?: string;\n DIALOGTYPE?: string;\n };\n DD31V?: {\n TABNAME?: string;\n FIELDNAME?: string;\n FLDLOCATION?: string;\n ROLLNAME?: string;\n };\n DD32P_TABLE?: { item?: unknown };\n DD33V_TABLE?: { item?: unknown };\n}): { name: string } & Record<string, unknown> {\n const paramItems = normalizeItems(DD32P_TABLE?.item);\n const assignItems = normalizeItems(DD33V_TABLE?.item);\n return {\n name: (DD30V?.SHLPNAME ?? '').toUpperCase(),\n type: 'SHLP/SH',\n description: DD30V?.DDTEXT,\n language: sapLangToIso(DD30V?.DDLANGUAGE),\n masterLanguage: sapLangToIso(DD30V?.DDLANGUAGE),\n helpType: DD30V?.SHLPTYPE,\n dialogType: DD30V?.DIALOGTYPE,\n textTable: DD31V\n ? {\n tableName: DD31V.TABNAME,\n fieldName: DD31V.FIELDNAME,\n fieldLocation: DD31V.FLDLOCATION,\n rollName: DD31V.ROLLNAME,\n }\n : undefined,\n parameters: paramItems.map(parseShlpParam),\n fieldAssignments: assignItems.map(parseShlpAssign),\n };\n}\n","/**\n * TRAN (Transaction) object handler for abapGit format\n *\n * Transactions are XML-only (no source code). The abapGit format stores\n * the transaction code in TSTC, GUI attributes in TSTCC and texts in\n * the TSTCT table (wrapped in <item> elements).\n */\n\nimport { tran } from '../../../schemas/generated';\nimport { createHandler } from '../base';\nimport { isoToSapLang, sapLangToIso } from '../lang';\n\ntype TransactionLike = {\n name: string;\n description?: string;\n language?: string;\n masterLanguage?: string;\n programName?: string;\n dynproNumber?: string;\n transactionType?: string;\n guiAttributes?: {\n webGui?: boolean;\n platinumGui?: boolean;\n win32Gui?: boolean;\n macGui?: boolean;\n };\n texts?: Array<{\n language?: string;\n text?: string;\n }>;\n};\n\nexport const transactionHandler = createHandler<TransactionLike, typeof tran>(\n 'TRAN',\n {\n schema: tran,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_TRAN',\n serializer_version: 'v1.0.0',\n\n toAbapGit: buildTransactionToAbapGit,\n\n fromAbapGit: parseTransactionFromAbapGit,\n },\n);\n\nfunction normalizeItems<T>(raw: T | T[] | undefined): T[] {\n if (!raw) return [];\n return Array.isArray(raw) ? raw : [raw];\n}\n\nfunction parseGuiAttributes(\n TSTCC:\n | { S_WEBGUI?: string; S_PLATIN?: string; S_WIN32?: string; S_MAC?: string }\n | undefined,\n) {\n if (!TSTCC) return undefined;\n return {\n webGui: TSTCC.S_WEBGUI === 'X',\n platinumGui: TSTCC.S_PLATIN === 'X',\n win32Gui: TSTCC.S_WIN32 === 'X',\n macGui: TSTCC.S_MAC === 'X',\n };\n}\n\nfunction parseTransactionFromAbapGit({\n TSTC,\n TSTCC,\n TSTCT,\n}: {\n TSTC?: { TCODE?: string; PGMNA?: string; DYPNO?: string; TYPE?: string };\n TSTCC?: {\n S_WEBGUI?: string;\n S_PLATIN?: string;\n S_WIN32?: string;\n S_MAC?: string;\n };\n TSTCT?: {\n item?:\n | Array<{ SPRSL?: string; TTEXT?: string }>\n | { SPRSL?: string; TTEXT?: string };\n };\n}): { name: string } & Record<string, unknown> {\n const textItems = normalizeItems(TSTCT?.item);\n const firstText = textItems[0];\n return {\n name: (TSTC?.TCODE ?? '').toUpperCase(),\n type: 'TRAN/ST',\n description: firstText?.TTEXT,\n language: sapLangToIso(firstText?.SPRSL),\n masterLanguage: sapLangToIso(firstText?.SPRSL),\n programName: TSTC?.PGMNA,\n dynproNumber: TSTC?.DYPNO,\n transactionType: TSTC?.TYPE,\n guiAttributes: parseGuiAttributes(TSTCC),\n texts: textItems.map((t) => ({\n language: sapLangToIso(t.SPRSL),\n text: t.TTEXT,\n })),\n };\n}\n\nfunction buildTstc(obj: TransactionLike) {\n return {\n TCODE: String(obj.name ?? '').toUpperCase(),\n PGMNA: obj.programName ?? undefined,\n DYPNO: obj.dynproNumber ?? undefined,\n TYPE: obj.transactionType ?? undefined,\n };\n}\n\nfunction buildTstcc(\n gui: NonNullable<TransactionLike['guiAttributes']>,\n tcode: string,\n) {\n return {\n TCODE: tcode,\n S_WEBGUI: gui.webGui ? 'X' : undefined,\n S_PLATIN: gui.platinumGui ? 'X' : undefined,\n S_WIN32: gui.win32Gui ? 'X' : undefined,\n S_MAC: gui.macGui ? 'X' : undefined,\n };\n}\n\nfunction buildTstct(\n texts: NonNullable<TransactionLike['texts']>,\n obj: TransactionLike,\n) {\n if (texts.length === 0) return undefined;\n return {\n item: texts.map((t) => ({\n SPRSL: isoToSapLang(t.language || obj.masterLanguage || obj.language),\n TCODE: String(obj.name ?? '').toUpperCase(),\n TTEXT: t.text ?? '',\n })),\n };\n}\n\nfunction buildTransactionToAbapGit(obj: TransactionLike) {\n const texts = obj.texts ?? [];\n const tcode = String(obj.name ?? '').toUpperCase();\n return {\n TSTC: buildTstc(obj),\n TSTCC: obj.guiAttributes ? buildTstcc(obj.guiAttributes, tcode) : undefined,\n TSTCT: buildTstct(texts, obj),\n };\n}\n","/**\n * TYPE (Type Group / Type Pool) object handler for abapGit format\n *\n * Type groups have both XML metadata (TYPE structure) and ABAP source\n * (<name>.type.abap). The abapGit format stores the header in TYPE.\n */\n\nimport { type as typeSchema } from '../../../schemas/generated';\nimport { createHandler } from '../base';\n\ntype TypeGroupLike = {\n name: string;\n description?: string;\n getSource?: () => Promise<string> | string;\n};\n\nexport const typeGroupHandler = createHandler<TypeGroupLike, typeof typeSchema>(\n 'TYPE',\n {\n schema: typeSchema,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_TYPE',\n serializer_version: 'v1.0.0',\n\n toAbapGit: (obj) => ({\n TYPE: {\n TYPEGROUP: String(obj.name ?? '').toUpperCase(),\n DESCRIPT: obj.description ?? '',\n },\n }),\n\n getSource: (obj) =>\n typeof obj?.getSource === 'function'\n ? Promise.resolve(obj.getSource())\n : Promise.resolve(''),\n\n fromAbapGit: ({ TYPE }) => ({\n name: (TYPE?.TYPEGROUP ?? '').toUpperCase(),\n type: 'TYPE/TY',\n description: TYPE?.DESCRIPT,\n }),\n\n setSources: (obj, sources) => {\n if (sources.main) {\n (obj as unknown as { _pendingSource: string })._pendingSource =\n sources.main;\n }\n },\n },\n);\n","/**\n * XSLT (Transformation) object handler for abapGit format\n *\n * Transformations have both XML metadata (XSLT structure) and ABAP source\n * (<name>.xslt.abap). The abapGit format stores the header in XSLT.\n */\n\nimport { xslt } from '../../../schemas/generated';\nimport { createHandler } from '../base';\n\ntype TransformationLike = {\n name: string;\n description?: string;\n getSource?: () => Promise<string> | string;\n};\n\nexport const transformationHandler = createHandler<\n TransformationLike,\n typeof xslt\n>('XSLT', {\n schema: xslt,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_XSLT',\n serializer_version: 'v1.0.0',\n\n toAbapGit: (obj) => ({\n XSLT: {\n PROGNAME: String(obj.name ?? '').toUpperCase(),\n DESCRIPT: obj.description ?? '',\n },\n }),\n\n getSource: (obj) =>\n typeof obj?.getSource === 'function'\n ? Promise.resolve(obj.getSource())\n : Promise.resolve(''),\n\n fromAbapGit: ({ XSLT }) => ({\n name: (XSLT?.PROGNAME ?? '').toUpperCase(),\n type: 'XSLT/TX',\n description: XSLT?.DESCRIPT,\n }),\n\n setSources: (obj, sources) => {\n if (sources.main) {\n (obj as unknown as { _pendingSource: string })._pendingSource =\n sources.main;\n }\n },\n});\n","import { createCdsAffSourceHandler } from './cds-aff-source';\n\nexport const cdsAspectHandler = createCdsAffSourceHandler('DRAS');\n","import { createCdsAffSourceHandler } from './cds-aff-source';\n\nexport const cdsTypeHandler = createCdsAffSourceHandler('DRTY');\n","import { createCdsAffSourceHandler } from './cds-aff-source';\n\nexport const scalarFunctionDefinitionHandler =\n createCdsAffSourceHandler('DSFD');\n","import { bdef } from '../../../schemas/generated';\nimport { createHandler, type SerializedFile } from '../base';\nimport { FormatMaterializationError } from '@abapify/adt-plugin';\n\ninterface DsfiDefinition {\n formatVersion: '1';\n header: {\n description: string;\n originalLanguage: string;\n abapLanguageVersion?: string;\n };\n scalarFunctionName: string;\n engine: 'analyticalEngine' | 'sqlEngine';\n sqlProperties?: { amdpReference: string; autoExposedInSqlServices?: boolean };\n}\n\ntype DsfiLike = {\n name: string;\n getSource?: () => Promise<unknown>;\n};\n\nconst VALID_ENGINES = new Set(['analyticalEngine', 'sqlEngine']);\n\nfunction isDsfiDefinition(value: unknown): value is DsfiDefinition {\n const candidate = value as Partial<DsfiDefinition> | undefined;\n return (\n !!candidate &&\n candidate.formatVersion === '1' &&\n typeof candidate.scalarFunctionName === 'string' &&\n VALID_ENGINES.has(candidate.engine ?? '') &&\n typeof candidate.header?.description === 'string' &&\n typeof candidate.header?.originalLanguage === 'string'\n );\n}\n\nfunction parseDsfiDefinition(value: unknown): DsfiDefinition {\n let parsed: unknown;\n try {\n parsed = typeof value === 'string' ? JSON.parse(value) : value;\n } catch {\n throw new FormatMaterializationError(\n 'FORMAT_SOURCE_COMPONENT_UNSUPPORTED',\n 'DSFI source/main did not return valid JSON.',\n );\n }\n if (!isDsfiDefinition(parsed)) {\n throw new FormatMaterializationError(\n 'FORMAT_SOURCE_COMPONENT_UNSUPPORTED',\n 'DSFI source/main did not return the required ABAP File Format JSON document.',\n );\n }\n return parsed;\n}\n\nexport const scalarFunctionImplementationHandler = createHandler<\n DsfiLike,\n typeof bdef\n>('DSFI', {\n schema: bdef,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_DSFI',\n serializer_version: 'v1.0.0',\n toAbapGit: (obj) => ({\n SKEY: { TYPE: 'DSFI', NAME: String(obj?.name ?? '').toUpperCase() },\n }),\n fromAffJson: (json) => {\n const def = json as Partial<DsfiDefinition> | undefined;\n return {\n // Use filename-derived name (injected by deserializer); scalarFunctionName\n // is a reference, not the object identity.\n name: '',\n description: def?.header?.description,\n originalLanguage: def?.header?.originalLanguage,\n abapLanguageVersion: def?.header?.abapLanguageVersion,\n };\n },\n async serialize(object, ctx): Promise<SerializedFile[]> {\n const definition = parseDsfiDefinition(\n typeof object.getSource === 'function'\n ? await object.getSource()\n : undefined,\n );\n return [\n ctx.createFile(\n `${ctx.getObjectName(object)}.dsfi.json`,\n `${JSON.stringify(definition, null, 2)}\\n`,\n ),\n ];\n },\n});\n","import { createCdsAffSourceHandler } from './cds-aff-source';\n\nexport const entityBufferHandler = createCdsAffSourceHandler('DTEB');\n","import { createCdsAffSourceHandler } from './cds-aff-source';\n\nexport const dynamicCacheHandler = createCdsAffSourceHandler('DTDC');\n","import { createCdsAffSourceHandler } from './cds-aff-source';\n\nexport const tuningIndexHandler = createCdsAffSourceHandler('DTIX');\n","import { createCdsAffSourceHandler } from './cds-aff-source';\n\nexport const staticCacheHandler = createCdsAffSourceHandler('DTSC');\n","import { bdef } from '../../../schemas/generated';\nimport { createHandler, type SerializedFile } from '../base';\nimport { affFromAffJson } from '../source-resolver';\n\ntype DesdLike = {\n name: string;\n description?: string;\n originalLanguage?: string;\n};\n\nexport const externalSchemaHandler = createHandler<DesdLike, typeof bdef>(\n 'DESD',\n {\n schema: bdef,\n version: 'v1.0.0',\n serializer: 'LCL_OBJECT_DESD',\n serializer_version: 'v1.0.0',\n toAbapGit: (obj) => ({\n SKEY: { TYPE: 'DESD', NAME: String(obj?.name ?? '').toUpperCase() },\n }),\n fromAffJson: (json) => affFromAffJson(json, ''),\n async serialize(object, ctx): Promise<SerializedFile[]> {\n const header = {\n description: object.description || String(object.name ?? ''),\n originalLanguage: (object.originalLanguage ?? 'en').toLowerCase(),\n };\n return [\n ctx.createFile(\n `${ctx.getObjectName(object)}.desd.json`,\n `${JSON.stringify({ formatVersion: '1', header }, null, 2)}\\n`,\n ),\n ];\n },\n },\n);\n","/**\n * Shared factory for AFF-first object handlers.\n *\n * The 17 AFF-first types (APLO, BGQC, CDBO, CHKC, CHKO, CHKV, COTA, EVTB,\n * GSMP, NONT, RONT, SAJC, SAJT, SMBC, UIAD, UIPG, UIST) all share the same\n * serialization logic — only the type code and file extension differ.\n * This factory eliminates the per-handler duplication.\n */\n\nimport { bdef } from '../../schemas/generated';\nimport { createHandler, type SerializedFile } from './base';\nimport { affFromAffJson } from './source-resolver';\n\ntype AffFirstLike = {\n name: string;\n description?: string;\n originalLanguage?: string;\n};\n\n/**\n * Create an AFF-first handler that serializes to JSON metadata only.\n *\n * @param type ABAP object type code (e.g. 'APLO')\n * @param ext Lowercase file extension for the JSON sidecar (e.g. 'aplo')\n */\nexport function createAffFirstHandler(type: string, ext: string) {\n return createHandler<AffFirstLike, typeof bdef>(type, {\n schema: bdef,\n version: 'v1.0.0',\n serializer: `LCL_OBJECT_${type}`,\n serializer_version: 'v1.0.0',\n toAbapGit: (obj) => ({\n SKEY: { TYPE: type, NAME: String(obj?.name ?? '').toUpperCase() },\n }),\n fromAffJson: (json) => affFromAffJson(json, ''),\n async serialize(object, ctx): Promise<SerializedFile[]> {\n const header = {\n description: object.description || String(object.name ?? ''),\n originalLanguage: (object.originalLanguage ?? 'en').toLowerCase(),\n };\n return [\n ctx.createFile(\n `${ctx.getObjectName(object)}.${ext}.json`,\n `${JSON.stringify({ formatVersion: '1', header }, null, 2)}\\n`,\n ),\n ];\n },\n });\n}\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const applicationLogObjectHandler = createAffFirstHandler(\n 'APLO',\n 'aplo',\n);\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const bgqcHandler = createAffFirstHandler('BGQC', 'bgqc');\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const cdboHandler = createAffFirstHandler('CDBO', 'cdbo');\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const checkCategoryHandler = createAffFirstHandler('CHKC', 'chkc');\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const checkObjectHandler = createAffFirstHandler('CHKO', 'chko');\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const checkVariantHandler = createAffFirstHandler('CHKV', 'chkv');\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const communicationTargetHandler = createAffFirstHandler('COTA', 'cota');\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const eventBindingHandler = createAffFirstHandler('EVTB', 'evtb');\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const gsmpHandler = createAffFirstHandler('GSMP', 'gsmp');\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const objectTypeNodeHandler = createAffFirstHandler('NONT', 'nont');\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const objectTypeHandler = createAffFirstHandler('RONT', 'ront');\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const jobCatalogHandler = createAffFirstHandler('SAJC', 'sajc');\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const jobTemplateHandler = createAffFirstHandler('SAJT', 'sajt');\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const bcmHandler = createAffFirstHandler('SMBC', 'smbc');\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const launchpadAppDescriptorHandler = createAffFirstHandler(\n 'UIAD',\n 'uiad',\n);\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const launchpadPageTemplateHandler = createAffFirstHandler(\n 'UIPG',\n 'uipg',\n);\n","import { createAffFirstHandler } from '../aff-handler';\n\nexport const launchpadSpaceTemplateHandler = createAffFirstHandler(\n 'UIST',\n 'uist',\n);\n","/**\n * abapGit Folder Logic\n *\n * Shared functions for resolving SAP package names from directory paths\n * using abapGit's folder logic (PREFIX/FULL).\n *\n * Used by both the serializer (import: SAP → Git) and deserializer (export: Git → SAP).\n */\n\nexport type FolderLogic = 'prefix' | 'full' | 'full-with-root';\n\nexport function stripSlashes(s: string): string {\n let start = 0;\n let end = s.length;\n while (start < end && s[start] === '/') start++;\n while (end > start && s[end - 1] === '/') end--;\n return s.slice(start, end);\n}\n\n/**\n * Parse FOLDER_LOGIC from .abapgit.xml content\n */\nexport function parseFolderLogicFromAbapGitXml(\n xmlContent: string,\n): FolderLogic | undefined {\n const match = /<FOLDER_LOGIC>([^<]+)<\\/FOLDER_LOGIC>/i.exec(xmlContent);\n if (!match) {\n return undefined;\n }\n\n const normalized = match[1]!.trim().toUpperCase();\n if (normalized === 'PREFIX') {\n return 'prefix';\n }\n if (normalized === 'FULL') {\n return 'full';\n }\n\n return undefined;\n}\n\n/**\n * Parse STARTING_FOLDER from .abapgit.xml content\n */\nexport function parseStartingFolderFromAbapGitXml(\n xmlContent: string,\n): string | undefined {\n const match = /<STARTING_FOLDER>([^<]+)<\\/STARTING_FOLDER>/i.exec(xmlContent);\n return match ? match[1]!.trim() : undefined;\n}\n\n/**\n * Parse abapGit repository metadata from .abapgit.xml content\n */\nexport function parseAbapGitMetadata(xmlContent: string): {\n folderLogic: FolderLogic;\n startingFolder: string;\n} {\n return {\n folderLogic: parseFolderLogicFromAbapGitXml(xmlContent) ?? 'prefix',\n startingFolder: parseStartingFolderFromAbapGitXml(xmlContent) ?? '/src/',\n };\n}\n\n/**\n * Reverse of calculatePackageDir — compute SAP package name from directory path\n *\n * Given a directory path relative to the starting folder, the folder logic,\n * and the root package name, compute the SAP package name.\n *\n * PREFIX mode: root 'ZABAPGIT_EXAMPLES' + dir 'clas' → 'ZABAPGIT_EXAMPLES_CLAS'\n * FULL mode: dir 'zabapgit_examples_clas' → 'ZABAPGIT_EXAMPLES_CLAS'\n *\n * @param dirPath - Directory path relative to starting folder\n * @param folderLogic - Folder logic mode (prefix or full)\n * @param rootPackage - Root SAP package name\n * @returns SAP package name\n */\nexport function resolvePackageFromDir(\n dirPath: string,\n folderLogic: FolderLogic,\n rootPackage: string,\n): string {\n if (!dirPath || dirPath === '.' || dirPath === '/') {\n return rootPackage;\n }\n\n const normalized = stripSlashes(dirPath);\n if (!normalized) return rootPackage;\n\n const parts = normalized.split('/').filter(Boolean);\n if (parts.length === 0) return rootPackage;\n\n switch (folderLogic) {\n case 'prefix': {\n let pkg = rootPackage;\n for (const part of parts) {\n pkg = pkg + '_' + part.toUpperCase();\n }\n return pkg;\n }\n\n case 'full':\n case 'full-with-root': {\n return parts.at(-1)!.toUpperCase();\n }\n\n default:\n return rootPackage;\n }\n}\n\n/**\n * Reverse of resolvePackageFromDir — given a SAP package name and the\n * relative directory of an object, back-derive the root package.\n *\n * PREFIX mode: sapPackage 'ZABAPGIT_EXAMPLES_FUGR' + dir 'fugr' → 'ZABAPGIT_EXAMPLES'\n * FULL mode: cannot derive root (returns undefined)\n *\n * @param sapPackage - Actual SAP package name (from GET response)\n * @param relDir - Directory path relative to starting folder\n * @param folderLogic - Folder logic mode\n * @returns Root package name, or undefined if it cannot be derived\n */\nexport function reverseResolveRootPackage(\n sapPackage: string,\n relDir: string,\n folderLogic: FolderLogic,\n): string | undefined {\n if (!relDir || relDir === '.' || relDir === '/') {\n return sapPackage; // Object is at root level — its package IS the root\n }\n\n const normalized = stripSlashes(relDir);\n if (!normalized) return sapPackage;\n\n const parts = normalized.split('/').filter(Boolean);\n if (parts.length === 0) return sapPackage;\n\n switch (folderLogic) {\n case 'prefix': {\n // In PREFIX mode: ROOT + _PART1 + _PART2 = sapPackage\n // So ROOT = sapPackage minus the suffix\n const suffix = '_' + parts.map((p) => p.toUpperCase()).join('_');\n if (sapPackage.toUpperCase().endsWith(suffix)) {\n return sapPackage.slice(0, -suffix.length);\n }\n return undefined;\n }\n\n case 'full':\n case 'full-with-root':\n // In FULL mode, package name IS the last directory segment —\n // cannot reliably derive the root\n return undefined;\n\n default:\n return undefined;\n }\n}\n\n/**\n * Parse folder logic from a string value (CLI option or config)\n */\nexport function parseFolderLogic(value: unknown): FolderLogic | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n\n const normalized = value.trim().toLowerCase();\n if (\n normalized === 'prefix' ||\n normalized === 'full' ||\n normalized === 'full-with-root'\n ) {\n return normalized;\n }\n\n return undefined;\n}\n\n/**\n * Calculate package directory based on folder logic (for import/serialization)\n *\n * @param packagePath - Full package hierarchy from root to current\n * @param folderLogic - Folder logic mode\n * @returns Package directory relative to src/\n */\nexport function calculatePackageDir(\n packagePath: string[],\n folderLogic: FolderLogic,\n): string {\n if (packagePath.length === 0) {\n return '';\n }\n\n switch (folderLogic) {\n case 'prefix': {\n if (packagePath.length === 1) {\n return '';\n }\n\n const parts: string[] = [];\n for (let i = 1; i < packagePath.length; i++) {\n const fullName = packagePath[i];\n const parentName = packagePath[i - 1];\n const prefix = parentName + '_';\n const relativeName = fullName.startsWith(prefix)\n ? fullName.slice(prefix.length)\n : fullName;\n parts.push(relativeName.toLowerCase());\n }\n return parts.join('/');\n }\n\n case 'full': {\n return packagePath.map((p) => p.toLowerCase()).join('/');\n }\n\n case 'full-with-root': {\n return packagePath.map((p) => p.toLowerCase()).join('/');\n }\n\n default:\n return '';\n }\n}\n\n/**\n * Generate .abapgit.xml repository metadata file\n */\nexport function generateAbapGitXml(folderLogic: FolderLogic): string {\n const abapGitFolderLogic = folderLogic === 'prefix' ? 'PREFIX' : 'FULL';\n\n return `<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<asx:abap xmlns:asx=\"http://www.sap.com/abapxml\" version=\"1.0\">\n <asx:values>\n <DATA>\n <MASTER_LANGUAGE>E</MASTER_LANGUAGE>\n <STARTING_FOLDER>/src/</STARTING_FOLDER>\n <FOLDER_LOGIC>${abapGitFolderLogic}</FOLDER_LOGIC>\n </DATA>\n </asx:values>\n</asx:abap>\n`;\n}\n","/**\n * abapGit filename parsing utilities.\n *\n * Extracted into a standalone module so it can be unit-tested without\n * pulling in the full handler/schema dependency chain.\n */\n\n/**\n * abapGit file naming convention:\n * - XML metadata: {name}.{type}.xml (e.g., zcl_myclass.clas.xml)\n * - AFF JSON metadata: {name}.{type}.json (e.g., zfoo.bdef.json)\n * - Source code: {name}.{type}.abap (e.g., zcl_myclass.clas.abap)\n * - Source includes: {name}.{type}.{suffix}.abap (e.g., zcl_myclass.clas.testclasses.abap)\n * - AFF source files: {name}.{type}.abdl, {name}.{type}.acds, {name}.{type}.asrvd\n */\n\n/**\n * Parse abapGit filename to extract object info\n *\n * Supports both legacy XML metadata (.xml) and AFF JSON metadata (.json),\n * plus source file extensions (.abap, .abdl, .acds, .asrvd).\n */\nexport function parseAbapGitFilename(filename: string): {\n name: string;\n type: string;\n suffix?: string;\n extension: string;\n} | null {\n // Match patterns like: name.type.xml, name.type.json, name.type.suffix.abap,\n // name.type.<suffix>.abdl/.acds/.asrvd source files.\n const match = filename.match(\n /^([^.]+)\\.([^.]+)(?:\\.([^.]+))?\\.(xml|json|abap|abdl|acds|asrvd)$/,\n );\n if (!match) return null;\n\n const [, name, type, suffixOrExt, extension] = match;\n\n // If 4 parts, middle is suffix; if 3 parts, no suffix\n return {\n name: name.toUpperCase(),\n type: type.toUpperCase(),\n suffix: suffixOrExt && suffixOrExt !== extension ? suffixOrExt : undefined,\n extension,\n };\n}\n","/**\n * abapGit Deserializer - Export (File → ADK)\n *\n * Reads abapGit format files and yields AdkObject instances.\n * Uses a true generator pattern for memory efficiency.\n *\n * Delegates type-specific deserialization to handlers via fromAbapGit().\n */\n\nimport type { FileTree, ExportOptions } from '@abapify/adt-plugin';\nimport type { AdkObject } from '@abapify/adk';\nimport { createAdk, type AdtClient } from '@abapify/adk';\nimport { getHandler, getSupportedTypes } from './handlers';\nimport {\n parseAbapGitMetadata,\n resolvePackageFromDir,\n stripSlashes,\n} from './folder-logic';\nimport { abapLangVerToAdt } from './handlers/lang';\nimport { extractFunctionDescriptors } from './handlers/objects/fugr';\n\n/**\n * abapGit file naming convention:\n * - XML metadata: {name}.{type}.xml (e.g., zcl_myclass.clas.xml)\n * - AFF JSON metadata: {name}.{type}.json (e.g., zfoo.bdef.json)\n * - Source code: {name}.{type}.abap (e.g., zcl_myclass.clas.abap)\n * - Source includes: {name}.{type}.{suffix}.abap (e.g., zcl_myclass.clas.testclasses.abap)\n * - AFF source files: {name}.{type}.abdl, {name}.{type}.acds, {name}.{type}.asrvd\n */\n\nimport { parseAbapGitFilename } from './filename-parser';\n\n// Re-export for backward compatibility — format-plugin and other modules\n// import parseAbapGitFilename from deserializer.\nexport { parseAbapGitFilename };\n\n/**\n * Group related files by object (name + type)\n */\ninterface ObjectFiles {\n name: string;\n type: string;\n /** Legacy XML metadata file path (if present) */\n xmlFile?: string;\n /** AFF JSON metadata file path (if present) */\n jsonFile?: string;\n sourceFiles: Array<{ path: string; suffix?: string }>;\n}\n\n/**\n * Resolve folder logic and start dir from .abapgit.xml\n */\nasync function resolveFolderConfig(fileTree: FileTree): Promise<{\n folderLogic: import('./folder-logic').FolderLogic;\n startDir: string;\n hasAbapGitXml: boolean;\n}> {\n let folderLogic: import('./folder-logic').FolderLogic = 'prefix';\n let startDir = '';\n const hasAbapGitXml = await fileTree.exists('.abapgit.xml');\n if (hasAbapGitXml) {\n try {\n const xml = await fileTree.read('.abapgit.xml');\n const meta = parseAbapGitMetadata(xml);\n folderLogic = meta.folderLogic;\n startDir = stripSlashes(meta.startingFolder);\n } catch {\n // Fall through to defaults if XML parsing fails\n }\n }\n return { folderLogic, startDir, hasAbapGitXml };\n}\n\n/**\n * Parse a metadata file path into an object key and register it in the map.\n */\nfunction registerMetadataFile(\n path: string,\n supportedTypes: Set<string>,\n objectMap: Map<string, ObjectFiles>,\n field: 'xmlFile' | 'jsonFile',\n): void {\n const filename = path.slice(path.lastIndexOf('/') + 1);\n const parsed = parseAbapGitFilename(filename);\n if (!parsed) return;\n if (!supportedTypes.has(parsed.type.toLowerCase())) return;\n if (parsed.suffix) return;\n\n const key = `${parsed.name}:${parsed.type}`;\n if (!objectMap.has(key)) {\n objectMap.set(key, {\n name: parsed.name,\n type: parsed.type,\n sourceFiles: [],\n });\n }\n objectMap.get(key)![field] = path;\n}\n\n/**\n * Collect all source files and attach them to their objects in the map.\n */\nasync function collectSourceFiles(\n fileTree: FileTree,\n objectMap: Map<string, ObjectFiles>,\n): Promise<void> {\n const [abapFiles, abdlFiles, acdsFiles, asrvdFiles] = await Promise.all([\n fileTree.glob('**/*.abap'),\n fileTree.glob('**/*.abdl'),\n fileTree.glob('**/*.acds'),\n fileTree.glob('**/*.asrvd'),\n ]);\n for (const sourcePath of [\n ...abapFiles,\n ...abdlFiles,\n ...acdsFiles,\n ...asrvdFiles,\n ]) {\n const filename = sourcePath.slice(sourcePath.lastIndexOf('/') + 1);\n const parsed = parseAbapGitFilename(filename);\n if (!parsed) continue;\n const obj = objectMap.get(`${parsed.name}:${parsed.type}`);\n if (obj) obj.sourceFiles.push({ path: sourcePath, suffix: parsed.suffix });\n }\n}\n\n/**\n * Parse metadata (XML or JSON) and return values + isAffJson flag.\n */\nasync function parseMetadata(\n fileTree: FileTree,\n objFiles: ObjectFiles,\n handler: ReturnType<typeof getHandler>,\n): Promise<{ values: Record<string, unknown>; isAffJson: boolean } | null> {\n if (objFiles.jsonFile) {\n const jsonContent = await fileTree.read(objFiles.jsonFile);\n let jsonData: Record<string, unknown>;\n try {\n jsonData = JSON.parse(jsonContent) as Record<string, unknown>;\n } catch (parseError) {\n console.error(\n `Failed to parse AFF JSON ${objFiles.jsonFile}:`,\n parseError,\n );\n return null;\n }\n const values = handler?.fromAffJson\n ? (handler.fromAffJson(jsonData) as Record<string, unknown>)\n : jsonData;\n return { values, isAffJson: true };\n }\n if (objFiles.xmlFile) {\n const xmlContent = await fileTree.read(objFiles.xmlFile);\n const parsed = handler!.schema.parse(xmlContent);\n return {\n values: (parsed as any)?.abapGit?.abap?.values ?? {},\n isAffJson: false,\n };\n }\n return null;\n}\n\n/**\n * Build the payload from handler or filename fallback.\n */\nfunction buildPayload(\n handler: ReturnType<typeof getHandler>,\n values: Record<string, unknown>,\n isAffJson: boolean,\n objFiles: ObjectFiles,\n): { name: string; description?: string; [key: string]: unknown } {\n if (isAffJson && handler?.fromAffJson) {\n return values as { name: string; description?: string };\n }\n if (isAffJson) {\n return { name: objFiles.name };\n }\n if (handler?.fromAbapGit) {\n return handler.fromAbapGit(values);\n }\n return { name: objFiles.name };\n}\n\n/**\n * Set sources on an ADK object using handler or fallback.\n */\nfunction setObjectSources(\n handler: ReturnType<typeof getHandler>,\n adkObject: AdkObject,\n sources: Record<string, string>,\n): void {\n if (Object.keys(sources).length === 0) return;\n if (handler?.setSources) {\n handler.setSources(adkObject, sources);\n return;\n }\n if (sources['main']) (adkObject as any)._pendingSource = sources['main'];\n if (Object.keys(sources).length > 1) {\n (adkObject as any)._pendingSources = sources;\n }\n}\n\n/**\n * Resolve packageRef on an ADK object from folder logic or rootPackage.\n */\nfunction resolvePackageRef(\n adkObject: AdkObject,\n options: ExportOptions | undefined,\n hasAbapGitXml: boolean,\n folderLogic: import('./folder-logic').FolderLogic,\n): void {\n if (!options?.rootPackage) return;\n const data = (adkObject as any)._data;\n if (!data || data.packageRef) return;\n if (hasAbapGitXml) {\n const relDir = (adkObject as any)._relDir ?? '';\n const pkgName = resolvePackageFromDir(\n relDir,\n folderLogic,\n options.rootPackage,\n );\n data.packageRef = { name: pkgName };\n } else {\n data.packageRef = { name: options.rootPackage };\n }\n}\n\n/**\n * Set abapLanguageVersion on an ADK object if provided in options.\n */\nfunction setAbapLanguageVersion(\n adkObject: AdkObject,\n options: ExportOptions | undefined,\n): void {\n if (!options?.abapLanguageVersion) return;\n const data = (adkObject as any)._data;\n if (data && !data.abapLanguageVersion) {\n data.abapLanguageVersion =\n abapLangVerToAdt(options.abapLanguageVersion) ??\n options.abapLanguageVersion;\n }\n}\n\n/**\n * Deserialize abapGit files to ADK objects\n *\n * True generator - yields objects one at a time as they're discovered.\n * Resolves packageRef using abapGit folder logic when rootPackage is provided.\n *\n * @param fileTree - Virtual file system to read from\n * @param client - ADT client for creating ADK objects\n * @param options - Export options (root package, language version, etc.)\n */\nexport async function* deserialize(\n fileTree: FileTree,\n client: AdtClient,\n options?: ExportOptions,\n): AsyncGenerator<AdkObject> {\n const adk = createAdk(client);\n const { folderLogic, startDir, hasAbapGitXml } =\n await resolveFolderConfig(fileTree);\n\n // Find all metadata files (XML = legacy, JSON = AFF)\n const [xmlFiles, jsonFiles] = await Promise.all([\n fileTree.glob('**/*.xml'),\n fileTree.glob('**/*.json'),\n ]);\n\n const objectMap = new Map<string, ObjectFiles>();\n const supportedTypes = new Set(\n getSupportedTypes().map((t) => t.toLowerCase()),\n );\n\n for (const xmlPath of xmlFiles) {\n if (xmlPath.endsWith('.abapgit.xml')) continue;\n if (xmlPath.endsWith('package.devc.xml')) continue;\n registerMetadataFile(xmlPath, supportedTypes, objectMap, 'xmlFile');\n }\n\n for (const jsonPath of jsonFiles) {\n registerMetadataFile(jsonPath, supportedTypes, objectMap, 'jsonFile');\n }\n\n await collectSourceFiles(fileTree, objectMap);\n\n // Process each object and yield\n for (const [, objFiles] of objectMap) {\n if (!objFiles.xmlFile && !objFiles.jsonFile) continue;\n\n const handler = getHandler(objFiles.type);\n if (!handler) continue;\n\n try {\n const meta = await parseMetadata(fileTree, objFiles, handler);\n if (!meta) continue;\n const { values, isAffJson } = meta;\n\n // Read source files\n const sources: Record<string, string> = {};\n for (const { path, suffix } of objFiles.sourceFiles) {\n const content = await fileTree.read(path);\n const sourceKey = suffix\n ? (handler.suffixToSourceKey?.[suffix] ?? suffix)\n : 'main';\n sources[sourceKey] = content;\n }\n\n const payload = buildPayload(handler, values, isAffJson, objFiles);\n const objectName = payload.name || objFiles.name;\n const adkType =\n typeof payload.type === 'string' ? payload.type : objFiles.type;\n const adkObject = adk.getWithData(\n { ...payload, name: objectName },\n adkType,\n ) as AdkObject;\n\n setObjectSources(handler, adkObject, sources);\n\n if (payload.description) {\n (adkObject as any)._pendingDescription = payload.description;\n }\n\n // Compute relative directory for package resolution\n if (hasAbapGitXml) {\n const metadataFile = objFiles.xmlFile ?? objFiles.jsonFile ?? '';\n const sourceDir = metadataFile.split('/').slice(0, -1).join('/');\n const relDir = sourceDir.startsWith(startDir)\n ? sourceDir.slice(startDir.length).replace(/^\\/+/, '')\n : sourceDir;\n (adkObject as any)._relDir = relDir;\n (adkObject as any)._folderLogic = folderLogic;\n }\n\n resolvePackageRef(adkObject, options, hasAbapGitXml, folderLogic);\n setAbapLanguageVersion(adkObject, options);\n\n yield adkObject;\n\n // For compound objects (FUGR), yield child objects (function modules)\n if (objFiles.type === 'FUGR' && payload._functions) {\n yield* yieldFugrChildren(adk, payload, objectName, options, adkObject);\n }\n } catch (error) {\n console.error(\n `Failed to deserialize ${objFiles.type} ${objFiles.name}:`,\n error,\n );\n }\n }\n}\n\n/**\n * Yield FUGR child function modules as separate ADK objects.\n */\nasync function* yieldFugrChildren(\n adk: ReturnType<typeof createAdk>,\n payload: { _functions?: unknown },\n parentName: string,\n options: ExportOptions | undefined,\n parentObject: AdkObject,\n): AsyncGenerator<AdkObject> {\n const fmDescriptors = extractFunctionDescriptors(payload._functions);\n const fmSources = (parentObject as any)._pendingFmSources as\n Record<string, string> | undefined;\n for (const fm of fmDescriptors) {\n try {\n const fmObject = adk.getWithData(\n {\n name: fm.funcName,\n type: 'FUGR/FF',\n _groupName: parentName,\n description: fm.shortText ?? '',\n processingType: fm.processingType,\n basXMLEnabled: fm.basXMLEnabled,\n },\n 'FUGR/FF',\n ) as AdkObject;\n const fmSource = fmSources?.[fm.funcName.toLowerCase()];\n if (fmSource) (fmObject as any)._pendingSource = fmSource;\n setAbapLanguageVersion(fmObject, options);\n yield fmObject;\n } catch (fmError) {\n console.error(\n `Failed to deserialize FM ${fm.funcName} in FUGR ${parentName}:`,\n fmError,\n );\n }\n }\n}\n","/**\n * abapGit as a FormatPlugin.\n *\n * This is the thin adapter that plugs the abapGit handler registry into the\n * generic `FormatPlugin` contract defined by `@abapify/adt-plugin`. External\n * consumers (adt-export, adt-diff, adt-cli) interact with this plugin\n * **through the registry only** — they look it up with\n * `getFormatPlugin('abapgit')` and never import this package directly.\n *\n * Registration happens as a side-effect of importing `@abapify/adt-plugin-abapgit`;\n * the CLI bootstraps the registration once in `adt-cli/src/lib/cli.ts`.\n */\n\nimport {\n FormatMaterializationError,\n type FormatPlugin,\n type FormatHandler,\n type MaterializedFormatFile,\n} from '@abapify/adt-plugin';\nimport { posix } from 'node:path';\nimport {\n getHandler as getAbapGitHandler,\n getSupportedTypes,\n} from './handlers/registry';\nimport { parseAbapGitFilename } from './deserializer';\nimport { calculatePackageDir, parseFolderLogic } from './folder-logic';\n\ntype ParsedFilename = NonNullable<ReturnType<typeof parseAbapGitFilename>>;\n\nfunction classifyFile(\n parsed: ParsedFilename,\n handler: FormatHandler,\n): { role: 'metadata' } | { role: 'source'; sourceComponent: string } {\n if (parsed.extension === 'xml' || parsed.extension === 'json') {\n return { role: 'metadata' };\n }\n\n if (!parsed.suffix) {\n return { role: 'source', sourceComponent: 'main' };\n }\n\n if (\n parsed.type.toLowerCase() === 'fugr' &&\n parsed.suffix.toLowerCase() === `l${parsed.name.toLowerCase()}top`\n ) {\n return { role: 'source', sourceComponent: 'main' };\n }\n\n const sourceComponent =\n handler.suffixToSourceKey?.[parsed.suffix] ?? parsed.suffix;\n return { role: 'source', sourceComponent };\n}\n\nfunction assertSupportsExplicitSources(\n handler: FormatHandler,\n objectType: string,\n sources?: Readonly<Record<string, string>>,\n): void {\n if (!sources) return;\n if (Object.keys(sources).length === 0) return;\n if (handler.supportsExplicitSources) return;\n throw new FormatMaterializationError(\n 'FORMAT_SOURCE_COMPONENT_UNSUPPORTED',\n `abapGit handler for \"${objectType}\" does not support explicit source selection.`,\n );\n}\n\nasync function buildMaterializedFiles(\n handler: FormatHandler,\n object: unknown,\n packageDir: string,\n sources?: Readonly<Record<string, string>>,\n format?: 'aff' | 'legacy',\n): Promise<MaterializedFormatFile[]> {\n const serialized = await handler.serialize(object, {\n ...(sources !== undefined ? { sources } : {}),\n ...(format !== undefined ? { format } : {}),\n });\n return serialized\n .map((file): MaterializedFormatFile => {\n const parsed = parseAbapGitFilename(file.path);\n const classification = parsed\n ? classifyFile(parsed, handler)\n : { role: 'source' as const, sourceComponent: 'main' };\n const path = posix.join('src', packageDir, file.path);\n return {\n ...file,\n path,\n ...classification,\n };\n })\n .sort((left, right) =>\n left.path < right.path ? -1 : left.path > right.path ? 1 : 0,\n );\n}\n\nexport const abapgitFormatPlugin: FormatPlugin = {\n id: 'abapgit',\n description: 'abapGit serialization format',\n\n // `supportedTypes` is backed by the live handler registry so registering\n // additional handlers at import time is reflected here without extra work.\n get supportedTypes(): ReadonlyArray<string> {\n return getSupportedTypes();\n },\n\n getHandler(type: string): FormatHandler | undefined {\n // The concrete abapGit `ObjectHandler` is a structural superset of the\n // generic `FormatHandler`, so this is just a widening cast.\n const handler = getAbapGitHandler(type) as unknown as\n FormatHandler | undefined;\n return handler\n ? {\n ...handler,\n supportsExplicitSources: handler.supportsExplicitSources ?? false,\n }\n : undefined;\n },\n\n async materialize(input) {\n const handler = this.getHandler(input.objectType);\n if (!handler) {\n throw new FormatMaterializationError(\n 'FORMAT_OBJECT_TYPE_UNSUPPORTED',\n `abapGit does not support object type \"${input.objectType}\".`,\n );\n }\n\n assertSupportsExplicitSources(handler, input.objectType, input.sources);\n\n const folderLogic =\n parseFolderLogic(input.formatOptions?.folderLogic) ?? 'prefix';\n const packageDir = calculatePackageDir([...input.packagePath], folderLogic);\n const files = await buildMaterializedFiles(\n handler,\n input.object,\n packageDir,\n input.sources,\n input.formatOptions?.format as 'aff' | 'legacy' | undefined,\n );\n return { files };\n },\n\n parseFilename(filename: string) {\n const parsed = parseAbapGitFilename(filename);\n return parsed ?? undefined;\n },\n};\n\nexport default abapgitFormatPlugin;\n","import { mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, isAbsolute, join, relative, sep } from 'node:path';\nimport type { AdkObject } from '@abapify/adk';\nimport { getTypeForKind } from '@abapify/adk';\nimport { getHandler } from './handlers';\n\n/**\n * Serialize ADK objects to abapGit format\n *\n * This class uses the handler registry to delegate serialization\n * to type-specific handlers.\n */\nexport class AbapGitSerializer {\n /**\n * Serialize a single object (called by plugin API)\n */\n async serializeObjectPublic(\n obj: AdkObject,\n targetPath: string,\n packageDir: string,\n ): Promise<string[]> {\n const fullPackageDir = join(targetPath, 'src', packageDir);\n mkdirSync(fullPackageDir, { recursive: true });\n\n // Get object type from ADK kind mapping\n const objectType = getTypeForKind(obj.kind) ?? obj.type;\n const handler = getHandler(objectType);\n\n if (!handler) {\n throw new Error(\n `No handler available for object type: ${objectType} (kind: ${obj.kind})`,\n );\n }\n\n // Serialize using handler\n const serializedFiles = await handler.serialize(obj);\n\n // Write files to disk\n const writtenFiles: string[] = [];\n for (const file of serializedFiles) {\n const filePath = join(fullPackageDir, file.path);\n const relativePath = relative(fullPackageDir, filePath);\n if (\n !relativePath ||\n isAbsolute(relativePath) ||\n relativePath === '..' ||\n relativePath.startsWith(`..${sep}`)\n ) {\n throw new Error(`Invalid serialized file path: ${file.path}`);\n }\n mkdirSync(dirname(filePath), { recursive: true });\n writeFileSync(filePath, file.content, file.encoding ?? 'utf8');\n writtenFiles.push(filePath);\n }\n\n return writtenFiles;\n }\n}\n","import {\n createPlugin,\n type AdtPlugin,\n type ImportContext,\n type DeleteResult,\n} from '@abapify/adt-plugin';\nimport type { AdtClient } from '@abapify/adk';\nimport { AbapGitSerializer } from './serializer';\nimport { getSupportedTypes, isSupported } from './handlers';\nimport { deserialize } from './deserializer';\nimport {\n existsSync,\n mkdirSync,\n readFileSync,\n writeFileSync,\n unlinkSync,\n readdirSync,\n} from 'node:fs';\nimport { join, relative, basename } from 'node:path';\n\nimport {\n type FolderLogic,\n parseFolderLogic,\n parseFolderLogicFromAbapGitXml,\n calculatePackageDir,\n generateAbapGitXml,\n resolvePackageFromDir,\n parseAbapGitMetadata,\n} from './folder-logic';\n\nconst serializer = new AbapGitSerializer();\n\n// Store folder logic for afterImport hook (set during import, read in afterImport)\nlet currentFolderLogic: FolderLogic = 'prefix';\n\n/**\n * Recursively collect all file paths under a directory.\n */\nfunction walkDir(dir: string, results: string[] = []): string[] {\n if (!existsSync(dir)) return results;\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const full = join(dir, entry.name);\n if (entry.isDirectory()) {\n walkDir(full, results);\n } else {\n results.push(full);\n }\n }\n return results;\n}\n\n/**\n * Lazy per-srcDir file index.\n *\n * Maps srcDir → (prefix → [absolute file paths]), where prefix is\n * `${name}.${type}.` in lower-case. Built at most once per srcDir per\n * process, so the O(repo-size) directory walk is amortised across all\n * `format.delete()` calls in a single import run instead of repeated for\n * every deleted object.\n */\nconst srcDirIndexCache = new Map<string, Map<string, string[]>>();\n\nfunction getOrBuildSrcIndex(srcDir: string): Map<string, string[]> {\n const cached = srcDirIndexCache.get(srcDir);\n if (cached) return cached;\n\n const index = new Map<string, string[]>();\n for (const filePath of walkDir(srcDir)) {\n const fname = basename(filePath).toLowerCase();\n // Extract the \"<name>.<type>.\" prefix (first two dot-segments + trailing dot)\n const first = fname.indexOf('.');\n if (first === -1) continue;\n const second = fname.indexOf('.', first + 1);\n if (second === -1) continue;\n const key = fname.substring(0, second + 1); // e.g. \"zcl_foo.clas.\"\n const bucket = index.get(key);\n if (bucket) {\n bucket.push(filePath);\n } else {\n index.set(key, [filePath]);\n }\n }\n srcDirIndexCache.set(srcDir, index);\n return index;\n}\n\n/**\n * Find all abapGit files for a given object name and type.\n *\n * abapGit naming convention: `{name}.{type}[.suffix].{ext}`\n * e.g. `zcl_foo.clas.xml`, `zcl_foo.clas.locals_def.abap`\n *\n * Matching is done on the filename base: `{name}.{type}.`. SAP ABAP object\n * names and types **never contain a dot**, so the prefix is unambiguous —\n * `ztabl_del.tabl.` cannot accidentally match `ztabl_del_ext.tabl.xml`\n * because the separator after `ztabl_del` in the prefix is `.` while the\n * other file has `_ext.`.\n *\n * Uses a lazy per-srcDir index so the directory tree is walked at most once\n * per deletion batch rather than once per object.\n */\nfunction findObjectFiles(srcDir: string, name: string, type: string): string[] {\n const prefix = `${name.toLowerCase()}.${type.toLowerCase()}.`;\n return getOrBuildSrcIndex(srcDir).get(prefix) ?? [];\n}\n\nfunction readFolderLogicFromExistingRepo(\n targetPath: string,\n): FolderLogic | undefined {\n const abapgitXmlPath = join(targetPath, '.abapgit.xml');\n if (!existsSync(abapgitXmlPath)) {\n return undefined;\n }\n\n try {\n const xmlContent = readFileSync(abapgitXmlPath, 'utf-8');\n return parseFolderLogicFromAbapGitXml(xmlContent);\n } catch {\n return undefined;\n }\n}\n\nfunction resolveFolderLogic(\n context: ImportContext,\n targetPath: string,\n): FolderLogic {\n const cliFolderLogic = parseFolderLogic(context.formatOptions?.folderLogic);\n if (cliFolderLogic) {\n return cliFolderLogic;\n }\n\n const existingRepoFolderLogic = readFolderLogicFromExistingRepo(targetPath);\n if (existingRepoFolderLogic) {\n return existingRepoFolderLogic;\n }\n\n const configuredFolderLogic = parseFolderLogic(\n context.configFormatOptions?.folderLogic,\n );\n if (configuredFolderLogic) {\n return configuredFolderLogic;\n }\n\n return 'prefix';\n}\n\n/**\n * abapGit Plugin\n *\n * Provides import/export of ADK objects to abapGit repository format.\n */\nexport const abapGitPlugin: AdtPlugin = createPlugin({\n name: 'abapGit',\n version: '1.0.0',\n description: 'abapGit format plugin for ADK objects',\n\n // Registry service\n registry: {\n isSupported,\n getSupportedTypes,\n },\n\n // Format service\n format: {\n async import(object, targetPath, context) {\n try {\n // Get the object's package - for DEVC objects, use name; for others, use package property\n // Note: object.type might be 'DEVC/K' not just 'DEVC'\n const isPackage = object.type?.startsWith('DEVC');\n const objPackage = isPackage\n ? object.name\n : (object as any).package || object.name || 'ROOT';\n\n // Resolve full package path from SAP (root → ... → current)\n // This uses ADK to load package hierarchy via super package references\n const packagePath = await context.resolvePackagePath(objPackage);\n\n // Resolve folder logic with precedence:\n // 1) CLI format options\n // 2) Existing .abapgit.xml in target repository\n // 3) adt.config.ts format options\n // 4) Plugin default\n const folderLogic = resolveFolderLogic(context, targetPath);\n\n // Store for afterImport hook\n currentFolderLogic = folderLogic;\n\n // Calculate package directory based on folder logic\n const packageDir = calculatePackageDir(packagePath, folderLogic);\n\n // Delegate to serializer which handles lazy loading\n const files = await serializer.serializeObjectPublic(\n object,\n targetPath,\n packageDir,\n );\n\n return {\n success: true,\n filesCreated: files,\n };\n } catch (error) {\n return {\n success: false,\n filesCreated: [],\n errors: [error instanceof Error ? error.message : String(error)],\n };\n }\n },\n\n /**\n * Export abapGit files to SAP\n *\n * Reads abapGit format files from FileTree and yields AdkObject instances.\n * True generator - streams objects one at a time for memory efficiency.\n *\n * @param fileTree - Virtual file system abstraction\n * @param client - ADT client for creating ADK objects\n */\n export: (fileTree, client, options?) =>\n deserialize(fileTree, client as AdtClient, options),\n\n /**\n * Delete local abapGit files for an object marked for deletion in SAP.\n *\n * Searches the `<targetPath>/src/` directory tree for files matching\n * the abapGit naming pattern `{name}.{type}[.suffix].{ext}` and removes\n * each one.\n *\n * Known limitation: if the object never made it into the repository (e.g.\n * PROG deletions without obj_func=D), no files are present and nothing\n * happens. This is expected behavior.\n */\n async delete(\n objectRef: { pgmid: string; type: string; name: string },\n targetPath: string,\n _context: ImportContext,\n ): Promise<DeleteResult> {\n try {\n const srcDir = join(targetPath, 'src');\n const matchedFiles = findObjectFiles(\n srcDir,\n objectRef.name,\n objectRef.type,\n );\n\n const filesRemoved: string[] = [];\n const errors: string[] = [];\n for (const filePath of matchedFiles) {\n try {\n unlinkSync(filePath);\n filesRemoved.push(relative(targetPath, filePath));\n } catch (error) {\n const unlinkError = error as NodeJS.ErrnoException;\n if (unlinkError.code === 'ENOENT') {\n // File is already gone, treat as success because the desired end state is reached.\n filesRemoved.push(relative(targetPath, filePath));\n continue;\n }\n\n errors.push(\n error instanceof Error\n ? `Failed to delete ${relative(targetPath, filePath)}: ${error.message}`\n : `Failed to delete ${relative(targetPath, filePath)}: ${String(error)}`,\n );\n }\n }\n\n return {\n success: errors.length === 0,\n filesRemoved,\n ...(errors.length > 0 ? { errors } : {}),\n };\n } catch (error) {\n return {\n success: false,\n filesRemoved: [],\n errors: [error instanceof Error ? error.message : String(error)],\n };\n }\n },\n },\n\n // Lifecycle hooks\n hooks: {\n async afterImport(targetPath) {\n // Ensure target directory exists before writing metadata\n mkdirSync(targetPath, { recursive: true });\n // Generate .abapgit.xml metadata file after import completes\n const abapgitXmlPath = join(targetPath, '.abapgit.xml');\n const abapgitXmlContent = generateAbapGitXml(currentFolderLogic);\n writeFileSync(abapgitXmlPath, abapgitXmlContent, 'utf-8');\n },\n },\n});\n\nexport const __testing = {\n calculatePackageDir,\n generateAbapGitXml,\n parseFolderLogic,\n parseFolderLogicFromAbapGitXml,\n readFolderLogicFromExistingRepo,\n resolveFolderLogic,\n resolvePackageFromDir,\n parseAbapGitMetadata,\n};\n\n// Export for named imports\nexport { abapGitPlugin as AbapGitPlugin };\n\n// Export for default import (dynamic loading)\nexport default abapGitPlugin;\n","import { registerFormatPlugin } from '@abapify/adt-plugin';\nimport { abapgitFormatPlugin } from './lib/format-plugin';\n\n// Self-register as a FormatPlugin at module-load time. Idempotent — safe\n// against dual module-graph evaluation.\nregisterFormatPlugin(abapgitFormatPlugin);\n\n// FormatPlugin export (the preferred public entry-point going forward)\nexport { abapgitFormatPlugin } from './lib/format-plugin';\n\n// Plugin instance\nexport { abapGitPlugin, AbapGitPlugin } from './lib/abapgit';\n\n// Finding resolver for ATC integration\nexport { createFindingResolver } from './lib/finding-resolver';\n\n// Handler registry — for consumers that need to work with handlers directly\nexport {\n getHandler,\n isSupported,\n getSupportedTypes,\n} from './lib/handlers/registry';\nexport type { SerializedFile, ObjectHandler } from './lib/handlers/base';\n\n// Filename parser — shared utility for abapGit file naming convention\nexport { parseAbapGitFilename } from './lib/deserializer';\n\n// ADT URI → abapGit on-disk filename (used for coverage / SonarQube reports)\nexport { adtUriToAbapGitPath } from './lib/filename/adt-uri-to-path';\n\n// XML formatting utilities — shared across serializers and roundtrip\nexport {\n formatXmlAttributes,\n moveNamespaceToAbap,\n formatAbapGitXml,\n} from './lib/handlers/xml-format';\n\n// Folder logic — package resolution from directory paths\nexport {\n resolvePackageFromDir,\n reverseResolveRootPackage,\n parseAbapGitMetadata,\n type FolderLogic,\n} from './lib/folder-logic';\n\n// Re-export types from @abapify/adt-plugin for convenience\nexport type {\n AdtPlugin,\n AbapObjectType,\n ImportContext,\n ImportResult,\n ExportContext,\n ExportResult,\n FormatMaterializationInput,\n FormatMaterializationResult,\n MaterializedFormatFile,\n} from '@abapify/adt-plugin';\n\n// Default export for dynamic loading\nexport { abapGitPlugin as default } from './lib/abapgit';\n"],"mappings":"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;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;CACF;AACF;;;;;;;;;;ACjLA,mBAAe;CACb,QAAQ;EACN,IAAI;EACJ,KAAK;CACP;CACA,iBAAiB;CACjB,oBAAoB;CACpB,SAAS;EACP;GACE,MAAM;GACN,aAAa;IACX,UAAU,EACR,SAAS,CACP,EACE,KAAK,WACP,CACF,EACF;IACA,WAAW;KACT;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;KACA;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;KACA;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;IACF;GACF;EACF;EACA;GACE,MAAM;GACN,UAAU;EACZ;EACA;GACE,MAAM;GACN,MAAM;EACR;EACA;GACE,MAAM;GACN,MAAM;EACR;CACF;CACA,aAAa;EACX;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;CACF;AACF;;;;;;;;;;AC5FA,mBAAe;CACb,QAAQ;EACN,IAAI;EACJ,KAAK;CACP;CACA,iBAAiB;CACjB,oBAAoB;CACpB,SAAS;EACP;GACE,MAAM;GACN,aAAa;IACX,UAAU,EACR,SAAS,CACP,EACE,KAAK,WACP,CACF,EACF;IACA,WAAW;KACT;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;KACA;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;KACA;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;IACF;GACF;EACF;EACA;GACE,MAAM;GACN,UAAU;EACZ;EACA;GACE,MAAM;GACN,MAAM;EACR;EACA;GACE,MAAM;GACN,MAAM;EACR;CACF;CACA,aAAa;EACX;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,GACA;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS;IACP;KACE,MAAM;KACN,MAAM;IACR;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS;IACP;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;CACF;AACF;;;;;;;;;;AC/MA,mBAAe;CACb,QAAQ;EACN,IAAI;EACJ,KAAK;CACP;CACA,iBAAiB;CACjB,oBAAoB;CACpB,SAAS;EACP;GACE,MAAM;GACN,aAAa;IACX,UAAU,EACR,SAAS,CACP,EACE,KAAK,WACP,CACF,EACF;IACA,WAAW;KACT;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;KACA;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;KACA;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;IACF;GACF;EACF;EACA;GACE,MAAM;GACN,UAAU;EACZ;EACA;GACE,MAAM;GACN,MAAM;EACR;EACA;GACE,MAAM;GACN,MAAM;EACR;CACF;CACA,aAAa;EACX;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS;IACP;KACE,MAAM;KACN,MAAM;IACR;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;CACF;AACF;;;;;;;;;;AC3LA,mBAAe;CACb,QAAQ;EACN,IAAI;EACJ,KAAK;CACP;CACA,iBAAiB;CACjB,oBAAoB;CACpB,SAAS;EACP;GACE,MAAM;GACN,aAAa;IACX,UAAU,EACR,SAAS,CACP,EACE,KAAK,WACP,CACF,EACF;IACA,WAAW;KACT;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;KACA;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;KACA;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;IACF;GACF;EACF;EACA;GACE,MAAM;GACN,UAAU;EACZ;EACA;GACE,MAAM;GACN,MAAM;EACR;EACA;GACE,MAAM;GACN,MAAM;EACR;CACF;CACA,aAAa;EACX;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS;IACP;KACE,MAAM;KACN,MAAM;IACR;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;CACF;AACF;;;;;;;;;;AC1HA,mBAAe;CACb,QAAQ;EACN,IAAI;EACJ,KAAK;CACP;CACA,oBAAoB;CACpB,SAAS,CACP;EACE,MAAM;EACN,aAAa;GACX,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;GACF;EACF;CACF,GACA;EACE,MAAM;EACN,UAAU;CACZ,CACF;CACA,aAAa;EACX;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,GACA;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,KAAK;IACL,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS;IACP;KACE,MAAM;KACN,MAAM;IACR;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS;IACP;KACE,MAAM;KACN,MAAM;IACR;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;CACF;AACF;;;;;;;;;;ACjMA,mBAAe;CACb,QAAQ;EACN,IAAI;EACJ,KAAK;CACP;CACA,oBAAoB;CACpB,SAAS,CACP;EACE,MAAM;EACN,aAAa;GACX,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;GACF;EACF;CACF,GACA;EACE,MAAM;EACN,UAAU;CACZ,CACF;CACA,aAAa;EACX;GACE,MAAM;GACN,KAAK,EACH,SAAS;IACP;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,KAAK;IACL,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS;IACP;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS;IACP;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS;IACP;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS;IACP;KACE,MAAM;KACN,MAAM;IACR;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;CACF;AACF;;;;;;;;;;AClYA,mBAAe;CACb,QAAQ;EACN,IAAI;EACJ,KAAK;CACP;CACA,iBAAiB;CACjB,oBAAoB;CACpB,SAAS;EACP;GACE,MAAM;GACN,aAAa;IACX,UAAU,EACR,SAAS,CACP,EACE,KAAK,WACP,CACF,EACF;IACA,WAAW;KACT;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;KACA;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;KACA;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;IACF;GACF;EACF;EACA;GACE,MAAM;GACN,UAAU;EACZ;EACA;GACE,MAAM;GACN,MAAM;EACR;EACA;GACE,MAAM;GACN,MAAM;EACR;CACF;CACA,aAAa;EACX;GACE,MAAM;GACN,KAAK,EACH,SAAS;IACP;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS;IACP;KACE,MAAM;KACN,MAAM;IACR;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS;IACP;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS;IACP;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS;IACP;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;CACF;AACF;;;;;;;;;;AC7ZA,mBAAe;CACb,QAAQ;EACN,IAAI;EACJ,KAAK;CACP;CACA,iBAAiB;CACjB,oBAAoB;CACpB,SAAS;EACP;GACE,MAAM;GACN,aAAa;IACX,UAAU,EACR,SAAS,CACP,EACE,KAAK,WACP,CACF,EACF;IACA,WAAW;KACT;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;KACA;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;KACA;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;IACF;GACF;EACF;EACA;GACE,MAAM;GACN,UAAU;EACZ;EACA;GACE,MAAM;GACN,MAAM;EACR;EACA;GACE,MAAM;GACN,MAAM;EACR;CACF;CACA,aAAa;EACX;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS;IACP;KACE,MAAM;KACN,MAAM;IACR;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;CACF;AACF;;;;;;;;;;AClKA,mBAAe;CACb,QAAQ;EACN,IAAI;EACJ,KAAK;CACP;CACA,oBAAoB;CACpB,SAAS,CACP;EACE,MAAM;EACN,aAAa;GACX,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;GACF;EACF;CACF,GACA;EACE,MAAM;EACN,UAAU;CACZ,CACF;CACA,aAAa;EACX;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,GACA;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,KAAK;IACL,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;CACF;AACF;;;;;;;;;;ACxHA,mBAAe;CACb,QAAQ;EACN,IAAI;EACJ,KAAK;CACP;CACA,oBAAoB;CACpB,SAAS,CACP;EACE,MAAM;EACN,aAAa;GACX,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;GACF;EACF;CACF,GACA;EACE,MAAM;EACN,UAAU;CACZ,CACF;CACA,aAAa;EACX;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,GACA;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,KAAK;IACL,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;CACF;AACF;;;;;;;;;;ACxHA,mBAAe;CACb,QAAQ;EACN,IAAI;EACJ,KAAK;CACP;CACA,oBAAoB;CACpB,SAAS,CACP;EACE,MAAM;EACN,aAAa;GACX,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;GACF;EACF;CACF,GACA;EACE,MAAM;EACN,UAAU;CACZ,CACF;CACA,aAAa;EACX;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,GACA;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS;IACP;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,GACA;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,KAAK;IACL,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;CACF;AACF;;;;;;;;;;ACnJA,mBAAe;CACb,QAAQ;EACN,IAAI;EACJ,KAAK;CACP;CACA,oBAAoB;CACpB,SAAS,CACP;EACE,MAAM;EACN,aAAa;GACX,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;GACF;EACF;CACF,GACA;EACE,MAAM;EACN,UAAU;CACZ,CACF;CACA,aAAa;EACX;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,GACA;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,KAAK;IACL,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;CACF;AACF;;;;;;;;;;ACxHA,mBAAe;CACb,QAAQ;EACN,IAAI;EACJ,KAAK;CACP;CACA,oBAAoB;CACpB,SAAS,CACP;EACE,MAAM;EACN,aAAa;GACX,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;GACF;EACF;CACF,GACA;EACE,MAAM;EACN,UAAU;CACZ,CACF;CACA,aAAa;EACX;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,GACA;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,KAAK;IACL,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;CACF;AACF;;;;;;;;;;ACxHA,mBAAe;CACb,QAAQ;EACN,IAAI;EACJ,KAAK;CACP;CACA,oBAAoB;CACpB,SAAS,CACP;EACE,MAAM;EACN,aAAa;GACX,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW;IACT;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;IACA;KACE,MAAM;KACN,MAAM;KACN,KAAK;IACP;GACF;EACF;CACF,GACA;EACE,MAAM;EACN,UAAU;CACZ,CACF;CACA,aAAa;EACX;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,GACA;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;GACR,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,KAAK;IACL,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;CACF;AACF;;;;;;;;;;ACxHA,mBAAe;CACb,QAAQ;EACN,IAAI;EACJ,KAAK;CACP;CACA,iBAAiB;CACjB,oBAAoB;CACpB,SAAS;EACP;GACE,MAAM;GACN,aAAa;IACX,UAAU,EACR,SAAS,CACP,EACE,KAAK,WACP,CACF,EACF;IACA,WAAW;KACT;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;KACA;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;KACA;MACE,MAAM;MACN,MAAM;MACN,KAAK;KACP;IACF;GACF;EACF;EACA;GACE,MAAM;GACN,UAAU;EACZ;EACA;GACE,MAAM;GACN,MAAM;EACR;EACA;GACE,MAAM;GACN,MAAM;EACR;CACF;CACA,aAAa;EACX;GACE,MAAM;GACN,KAAK,EACH,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,GACA;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,KAAK,EACH,SAAS;IACP;KACE,MAAM;KACN,MAAM;IACR;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS;IACP;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;IACA;KACE,MAAM;KACN,MAAM;KACN,WAAW;IACb;GACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP;IACE,MAAM;IACN,MAAM;IACN,WAAW;IACX,WAAW;GACb,CACF,EACF;EACF;EACA;GACE,MAAM;GACN,UAAU,EACR,SAAS,CACP,EACE,KAAK,aACP,CACF,EACF;GACA,WAAW,CACT;IACE,MAAM;IACN,MAAM;IACN,WAAW;GACb,CACF;EACF;CACF;AACF;;;;;;;;;;ACnJA,mBAAe;CACb,QAAQ;EA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"}
|