@abapify/adt-plugin-gcts 0.4.1 → 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/dist/index.d.mts +11 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +693 -110
- package/dist/index.mjs.map +1 -1
- package/package.json +6 -3
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/lib/format/filename.ts","../src/lib/handlers/base.ts","../src/lib/handlers/objects/clas.ts","../src/lib/handlers/objects/intf.ts","../src/lib/handlers/objects/prog.ts","../src/lib/handlers/objects/devc.ts","../src/lib/handlers/objects/doma.ts","../src/lib/handlers/objects/dtel.ts","../src/lib/handlers/objects/tabl.ts","../src/lib/handlers/objects/ttyp.ts","../src/lib/handlers/objects/fugr.ts","../src/lib/format/gcts-format.ts","../src/lib/deserializer.ts","../src/lib/gcts-plugin.ts","../src/index.ts"],"sourcesContent":["/**\n * gCTS / AFF filename conventions.\n *\n * gCTS and AFF both use the pattern `<name>.<type>.<ext>` (same as abapGit),\n * but with JSON for metadata instead of XML and with CDS-specific\n * extensions (`.acds`, `.asddls`, ...) for CDS sources.\n *\n * Packages use a fixed `package.devc.json` filename (mirrors abapGit's\n * `package.devc.xml`).\n *\n * This module is independent of any particular handler — it exists so that\n * consumers (diff, round-trip tests, deserializers) can map filenames to\n * (name, type) pairs without pulling in the object-type registry.\n */\n\nimport type { ParsedFormatFilename } from '@abapify/adt-plugin';\n\n/**\n * Extension used for the source-file part of each object type.\n *\n * Order of precedence: CDS types use AFF's `.asddls` / `.asdcls`; everything\n * else uses `.abap`. Metadata is always `.json`.\n */\nconst TYPE_TO_SOURCE_EXT: Record<string, string> = {\n CLAS: 'abap',\n INTF: 'abap',\n PROG: 'abap',\n FUGR: 'abap',\n DDLS: 'asddls',\n DCLS: 'asdcls',\n};\n\n/** Metadata extension for all AFF/gCTS objects. */\nexport const METADATA_EXTENSION = 'json';\n\n/** Fixed filename for package metadata (AFF / gCTS convention). */\nexport const PACKAGE_FILENAME = 'package.devc.json';\n\n/**\n * Build the AFF/gCTS on-disk filename for an object.\n *\n * @param name Object name (case preserved — AFF normalises to lowercase)\n * @param type ABAP object type code (CLAS, INTF, ...)\n * @param kind `\"metadata\"` (default) or `\"source\"`.\n * @param suffix Optional sub-include suffix (e.g. `locals_def` for CLAS).\n */\nexport function gctsFilename(\n name: string,\n type: string,\n kind: 'metadata' | 'source' = 'metadata',\n suffix?: string,\n): string {\n const base = name.toLowerCase();\n const typeLower = mainType(type).toLowerCase();\n if (kind === 'metadata') {\n return `${base}.${typeLower}.${METADATA_EXTENSION}`;\n }\n const ext = TYPE_TO_SOURCE_EXT[mainType(type).toUpperCase()] ?? 'abap';\n return suffix\n ? `${base}.${typeLower}.${suffix}.${ext}`\n : `${base}.${typeLower}.${ext}`;\n}\n\n/**\n * Parse an AFF/gCTS filename back into its components.\n *\n * Returns `undefined` if the filename does not look like a known AFF/gCTS\n * artefact — callers should skip unknown files (e.g. `README.md`).\n */\nexport function parseGctsFilename(\n filename: string,\n): ParsedFormatFilename | undefined {\n // Fixed package filename.\n if (filename === PACKAGE_FILENAME) {\n return {\n name: '',\n type: 'DEVC',\n extension: METADATA_EXTENSION,\n };\n }\n\n const parts = filename.split('.');\n if (parts.length < 3) {\n return undefined;\n }\n\n const extension = parts.at(-1)!;\n const maybeSuffix = parts.length >= 4 ? parts.at(-2) : undefined;\n const nameParts = maybeSuffix ? parts.slice(0, -3) : parts.slice(0, -2);\n\n if (nameParts.length === 0) {\n return undefined;\n }\n\n // For 3-part filenames (name.type.ext) the \"maybeSuffix\" branch would\n // misclassify a 4-part filename vs a 3-part filename. Use a recognised\n // source extension to decide: if ext is 'json' there can't be a suffix.\n if (extension === METADATA_EXTENSION) {\n return {\n name: nameParts.length === 0 ? '' : parts.slice(0, -2).join('.'),\n type: parts.at(-2)!.toUpperCase(),\n extension,\n };\n }\n\n // Source file — suffix is optional.\n const knownSourceExts = new Set(['abap', 'asddls', 'asdcls']);\n if (!knownSourceExts.has(extension)) {\n return undefined;\n }\n\n // Detect suffix: the part before the extension is a suffix only if the part\n // before THAT is a valid-looking lowercase type code. Use a narrow heuristic:\n // suffix present iff parts.length >= 4.\n if (parts.length >= 4) {\n return {\n name: parts.slice(0, -3).join('.'),\n type: parts.at(-3)!.toUpperCase(),\n suffix: parts.at(-2),\n extension,\n };\n }\n\n return {\n name: parts.slice(0, -2).join('.'),\n type: parts.at(-2)!.toUpperCase(),\n extension,\n };\n}\n\n/**\n * Translate an ADT object URI (e.g. `/sap/bc/adt/oo/classes/zcl_foo`) to\n * the AFF/gCTS on-disk path (e.g. `zcl_foo/zcl_foo.clas.json`).\n *\n * Matches the `adtUriToAbapGitPath` helper in the abapGit plugin.\n */\nexport function adtUriToGctsPath(uri: string): string | undefined {\n const ADT_PREFIX = '/sap/bc/adt/';\n if (!uri.startsWith(ADT_PREFIX)) return undefined;\n const tail = uri.slice(ADT_PREFIX.length);\n if (tail.length === 0) return undefined;\n\n // Common ADT URI → (type, name) table. Mirrors abapGit's mapping.\n const TABLE: Array<[RegExp, string]> = [\n [/^oo\\/classes\\/([^/]+)$/, 'CLAS'],\n [/^oo\\/interfaces\\/([^/]+)$/, 'INTF'],\n [/^programs\\/programs\\/([^/]+)$/, 'PROG'],\n [/^functions\\/groups\\/([^/]+)$/, 'FUGR'],\n [/^packages\\/([^/]+)$/, 'DEVC'],\n [/^ddic\\/domains\\/([^/]+)$/, 'DOMA'],\n [/^ddic\\/dataelements\\/([^/]+)$/, 'DTEL'],\n [/^ddic\\/structures\\/([^/]+)$/, 'TABL'],\n [/^ddic\\/tables\\/([^/]+)$/, 'TABL'],\n [/^ddic\\/tabletypes\\/([^/]+)$/, 'TTYP'],\n [/^ddic\\/ddl\\/sources\\/([^/]+)$/, 'DDLS'],\n [/^acm\\/dcls\\/sources\\/([^/]+)$/, 'DCLS'],\n ];\n\n for (const [pattern, type] of TABLE) {\n const m = pattern.exec(tail);\n if (m) {\n const name = m[1];\n if (type === 'DEVC') return `${name.toLowerCase()}/${PACKAGE_FILENAME}`;\n return `${name.toLowerCase()}/${gctsFilename(name, type)}`;\n }\n }\n\n return undefined;\n}\n\nfunction mainType(type: string): string {\n return type.split('/')[0];\n}\n","/**\n * gCTS / AFF handler factory.\n *\n * Mirrors the abapGit `createHandler` factory but produces **JSON** metadata\n * (AFF / gCTS convention) instead of abapGit's `.xml` files. Handlers are\n * kept intentionally small — business logic lives in `@abapify/adk` and the\n * only job of a gCTS handler is to project ADK data to the on-disk shape.\n *\n * Self-registration: `createHandler` stores the handler in the module-local\n * registry so `getHandler(type)` can resolve it. The `FormatPlugin` wrapper\n * (`format/gcts-format.ts`) exposes the registry through the public\n * `@abapify/adt-plugin` contract.\n */\n\nimport type { AdkObject, AdkKind } from '@abapify/adk';\nimport { getTypeForKind, getMainType } from '@abapify/adk';\nimport type { FormatHandler, SerializedFile } from '@abapify/adt-plugin';\nimport { gctsFilename } from '../format/filename';\nimport type { GctsMetadata } from '../format/types';\n\nexport type AbapObjectType = string;\n\nexport type AdkObjectClass<T extends AdkObject = AdkObject> = {\n new (...args: any[]): T;\n readonly kind: AdkKind;\n};\n\n/**\n * Lazy source entry.\n *\n * `content` may be a string, a promise, or a thunk returning either — the\n * factory awaits whichever form the handler returns.\n */\nexport interface GctsSourceEntry {\n suffix?: string;\n content: string | Promise<string> | (() => string | Promise<string>);\n}\n\n/**\n * Handler definition for a single ABAP object type.\n *\n * The shape intentionally mirrors the abapGit `HandlerDefinition` so that\n * anyone familiar with the sister plugin can move between them with minimal\n * friction. The `toMetadata` function is the only required hook: it maps an\n * ADK object to the JSON metadata shape for the target type.\n */\nexport interface GctsHandlerDefinition<\n T extends AdkObject,\n M extends GctsMetadata = GctsMetadata,\n> {\n /** Map ADK object → JSON metadata payload (including the required `header`). */\n toMetadata(object: T): M;\n\n /** Optional: single primary source file. */\n getSource?(object: T): string | Promise<string>;\n\n /** Optional: multiple source files (e.g. CLAS includes). */\n getSources?(object: T): GctsSourceEntry[];\n\n /** Optional: custom metadata filename (e.g. `package.devc.json` for DEVC). */\n metadataFileName?: string | ((object: T) => string);\n\n /**\n * Optional: inverse mapping used during deserialization.\n *\n * `fromMetadata` receives the parsed JSON payload and returns a partial\n * ADK-data projection. `setSources` mirrors abapGit's behaviour: it stages\n * source content on the ADK object for later deploy.\n */\n fromMetadata?(metadata: M): { name: string } & Record<string, unknown>;\n suffixToSourceKey?: Record<string, string>;\n setSources?(object: T, sources: Record<string, string>): void;\n}\n\n/** Runtime shape of a gCTS handler after `createHandler` processing. */\nexport interface GctsHandler<\n T extends AdkObject = AdkObject,\n> extends FormatHandler {\n readonly type: AbapObjectType;\n readonly fileExtension: string;\n readonly schema: {\n parse(raw: string): unknown;\n build(data: unknown): string;\n };\n serialize(object: T): Promise<SerializedFile[]>;\n fromAbapGit?(values: unknown): { name: string } & Record<string, unknown>;\n setSources?(object: T, sources: Record<string, string>): void;\n}\n\nconst handlerRegistry = new Map<AbapObjectType, GctsHandler>();\n\n/** Look up a handler (full-type first, then main-type fallback). */\nexport function getHandler(type: AbapObjectType): GctsHandler | undefined {\n return handlerRegistry.get(type) ?? handlerRegistry.get(getMainType(type));\n}\n\n/** `true` iff the given object type has a registered handler. */\nexport function isSupported(type: AbapObjectType): boolean {\n return handlerRegistry.has(type) || handlerRegistry.has(getMainType(type));\n}\n\n/** Snapshot of all registered object types. */\nexport function getSupportedTypes(): AbapObjectType[] {\n return [...handlerRegistry.keys()];\n}\n\n/** Internal — test helper. */\nexport function __resetRegistry(): void {\n handlerRegistry.clear();\n}\n\n/**\n * Build a JSON metadata file for the object. JSON is pretty-printed (2-space\n * indent) so the output is diff-friendly and matches AFF's own tooling.\n */\nfunction buildMetadataFile(meta: GctsMetadata): string {\n return JSON.stringify(meta, null, 2) + '\\n';\n}\n\n/**\n * Register a handler for an ADK class (preferred — `type` is derived from\n * the static `kind`) or an explicit type string (for types without an ADK\n * class, e.g. DOMA/DTEL).\n */\nexport function createHandler<\n T extends AdkObject,\n M extends GctsMetadata = GctsMetadata,\n>(\n adkClass: AdkObjectClass<T>,\n definition: GctsHandlerDefinition<T, M>,\n): GctsHandler<T>;\nexport function createHandler<\n T extends AdkObject,\n M extends GctsMetadata = GctsMetadata,\n>(\n type: AbapObjectType,\n definition: GctsHandlerDefinition<T, M>,\n): GctsHandler<T>;\nexport function createHandler<\n T extends AdkObject,\n M extends GctsMetadata = GctsMetadata,\n>(\n adkClassOrType: AdkObjectClass<T> | AbapObjectType,\n definition: GctsHandlerDefinition<T, M>,\n): GctsHandler<T> {\n let type: AbapObjectType;\n if (typeof adkClassOrType === 'string') {\n type = adkClassOrType;\n } else {\n const kind = adkClassOrType.kind;\n const derived = getTypeForKind(kind);\n if (!derived) {\n throw new Error(\n `Unknown ADK kind: ${kind}. Ensure the ADK class has a static 'kind' property.`,\n );\n }\n type = derived;\n }\n\n const fileExtension = getMainType(type).toLowerCase();\n\n async function resolveSource(entry: GctsSourceEntry): Promise<string> {\n const raw =\n typeof entry.content === 'function' ? entry.content() : entry.content;\n return await raw;\n }\n\n const handler: GctsHandler<T> = {\n type,\n fileExtension,\n // Minimal JSON \"schema\" — matches the FormatHandlerSchema contract.\n schema: {\n parse: (raw: string) => JSON.parse(raw) as unknown,\n build: (data: unknown) => JSON.stringify(data, null, 2) + '\\n',\n },\n suffixToSourceKey: definition.suffixToSourceKey,\n async serialize(object: T): Promise<SerializedFile[]> {\n const files: SerializedFile[] = [];\n const objectName = (object.name ?? '').toLowerCase();\n\n // Source files.\n if (definition.getSources) {\n for (const entry of definition.getSources(object)) {\n const content = await resolveSource(entry);\n if (!content) continue;\n files.push({\n path: gctsFilename(objectName, type, 'source', entry.suffix),\n content,\n });\n }\n } else if (definition.getSource) {\n const content = await definition.getSource(object);\n if (content) {\n files.push({\n path: gctsFilename(objectName, type, 'source'),\n content,\n });\n }\n }\n\n // Metadata file.\n const metadata = definition.toMetadata(object);\n const metadataFile =\n typeof definition.metadataFileName === 'function'\n ? definition.metadataFileName(object)\n : (definition.metadataFileName ??\n gctsFilename(objectName, type, 'metadata'));\n files.push({\n path: metadataFile,\n content: buildMetadataFile(metadata),\n });\n\n return files;\n },\n fromAbapGit: definition.fromMetadata\n ? (values: unknown) =>\n definition.fromMetadata!(values as M) as { name: string } & Record<\n string,\n unknown\n >\n : undefined,\n setSources: definition.setSources,\n };\n\n handlerRegistry.set(type, handler as GctsHandler);\n return handler;\n}\n\n/** Convenience re-export — matches abapGit's `package.devc.xml` pattern. */\nexport { PACKAGE_FILENAME } from '../format/filename';\n","/**\n * CLAS handler for gCTS / AFF format.\n *\n * Projects ADK class data to the AFF class-metadata shape:\n *\n * {\n * header: { formatVersion, description, originalLanguage, ... },\n * class: { category, visibility, final, abstract, ... }\n * }\n *\n * Sources are emitted per include (main, definitions, implementations, ...).\n * Abapgit suffix convention is reused for consistency — AFF does not\n * standardise include filenames, but using the same suffixes as abapGit\n * means downstream tooling (diff, round-trip) can treat both formats with\n * the same suffix map.\n */\n\nimport { AdkClass, type ClassIncludeType } from '@abapify/adk';\nimport { createHandler } from '../base';\n\nconst SUFFIX: Record<ClassIncludeType, string | undefined> = {\n main: undefined,\n definitions: 'locals_def',\n implementations: 'locals_imp',\n localtypes: 'locals_types',\n macros: 'macros',\n testclasses: 'testclasses',\n};\n\nconst SUFFIX_TO_SOURCE_KEY = Object.fromEntries(\n Object.entries(SUFFIX)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [v, k]),\n) as Record<string, ClassIncludeType>;\n\nexport const classHandler = createHandler(AdkClass, {\n suffixToSourceKey: SUFFIX_TO_SOURCE_KEY,\n\n toMetadata(cls) {\n const data = cls.dataSync;\n return {\n header: {\n formatVersion: '1.0',\n description: cls.description ?? data.description ?? '',\n originalLanguage: data.language ?? data.masterLanguage,\n abapLanguageVersion: data.abapLanguageVersion,\n },\n class: {\n category: data.category,\n visibility: data.visibility ?? 'public',\n final: data.final === true,\n abstract: data.abstract === true,\n fixedPointArithmetic: data.fixPointArithmetic === true,\n unicodeChecksActive: data.activeUnicodeCheck !== false,\n sharedMemoryEnabled: data.sharedMemoryEnabled === true,\n superClass: data.superClassRef?.name,\n },\n };\n },\n\n getSources: (cls) => {\n const includes = cls.dataSync.include ?? [];\n return includes.map((inc) => ({\n suffix: SUFFIX[String(inc.includeType ?? 'main') as ClassIncludeType],\n content: () =>\n cls.getIncludeSource(\n String(inc.includeType ?? 'main') as ClassIncludeType,\n ),\n }));\n },\n\n fromMetadata: (meta: any) => ({\n name: (meta?.class?.name ?? '').toUpperCase(),\n type: 'CLAS/OC',\n description: meta?.header?.description,\n language: meta?.header?.originalLanguage,\n masterLanguage: meta?.header?.originalLanguage,\n category: meta?.class?.category,\n visibility: meta?.class?.visibility,\n final: meta?.class?.final === true,\n abstract: meta?.class?.abstract === true,\n abapLanguageVersion: meta?.header?.abapLanguageVersion,\n }),\n\n setSources: (cls, sources) => {\n (\n cls as unknown as { _pendingSources: Record<string, string> }\n )._pendingSources = sources;\n if (sources.main) {\n (cls as unknown as { _pendingSource: string })._pendingSource =\n sources.main;\n }\n },\n});\n","/**\n * INTF handler for gCTS / AFF format.\n */\nimport { AdkInterface } from '@abapify/adk';\nimport { createHandler } from '../base';\n\nexport const interfaceHandler = createHandler(AdkInterface, {\n toMetadata(intf) {\n const data = intf.dataSync;\n return {\n header: {\n formatVersion: '1.0',\n description: intf.description ?? data.description ?? '',\n originalLanguage: data.language ?? data.masterLanguage,\n abapLanguageVersion: data.abapLanguageVersion,\n },\n interface: {\n unicodeChecksActive: data.activeUnicodeCheck !== false,\n },\n };\n },\n\n getSource: (obj) => obj.getSource(),\n\n fromMetadata: (meta: any) => ({\n name: (meta?.interface?.name ?? '').toUpperCase(),\n type: 'INTF/OI',\n description: meta?.header?.description,\n language: meta?.header?.originalLanguage,\n masterLanguage: meta?.header?.originalLanguage,\n abapLanguageVersion: meta?.header?.abapLanguageVersion,\n }),\n\n setSources: (intf, sources) => {\n if (sources.main) {\n (intf as unknown as { _pendingSource: string })._pendingSource =\n sources.main;\n }\n },\n});\n","/**\n * PROG handler for gCTS / AFF format.\n */\nimport { AdkProgram } from '@abapify/adk';\nimport { createHandler } from '../base';\n\nexport const programHandler = createHandler(AdkProgram, {\n toMetadata(prog) {\n const data = prog.dataSync;\n return {\n header: {\n formatVersion: '1.0',\n description: prog.description ?? data.description ?? '',\n originalLanguage: data.language ?? data.masterLanguage,\n abapLanguageVersion: data.abapLanguageVersion,\n },\n program: {\n programType: data.programType ?? 'executableProgram',\n fixedPointArithmetic: data.fixPointArithmetic === true,\n unicodeChecksActive: data.activeUnicodeCheck !== false,\n },\n };\n },\n\n getSource: (obj) => obj.getSource(),\n\n fromMetadata: (meta: any) => ({\n name: (meta?.program?.name ?? '').toUpperCase(),\n type: 'PROG/P',\n description: meta?.header?.description,\n language: meta?.header?.originalLanguage,\n programType: meta?.program?.programType,\n }),\n\n setSources: (prog, sources) => {\n if (sources.main) {\n (prog as unknown as { _pendingSource: string })._pendingSource =\n sources.main;\n }\n },\n});\n","/**\n * DEVC (package) handler for gCTS / AFF format.\n *\n * Packages use a fixed filename (`package.devc.json`) — same convention as\n * abapGit's `package.devc.xml`.\n */\nimport { AdkPackage } from '@abapify/adk';\nimport { createHandler, PACKAGE_FILENAME } from '../base';\n\nexport const packageHandler = createHandler(AdkPackage, {\n metadataFileName: PACKAGE_FILENAME,\n\n toMetadata(pkg) {\n return {\n header: {\n formatVersion: '1.0',\n description: pkg.description ?? '',\n originalLanguage:\n pkg.dataSync?.language ?? pkg.dataSync?.masterLanguage,\n },\n package: {\n // DEVCLASS is carried by filename/directory, not by metadata.\n softwareComponent: pkg.dataSync?.transport?.softwareComponent?.name,\n applicationComponent: pkg.dataSync?.applicationComponent?.name,\n packageType: pkg.dataSync?.attributes?.packageType,\n },\n };\n },\n\n fromMetadata: (meta: any) => ({\n name: '',\n description: meta?.header?.description,\n }),\n});\n","/**\n * DOMA (domain) handler for gCTS / AFF format.\n */\nimport { AdkDomain } from '@abapify/adk';\nimport { createHandler } from '../base';\n\nexport const domainHandler = createHandler(AdkDomain, {\n toMetadata(doma) {\n const data = doma.dataSync as Record<string, unknown>;\n return {\n header: {\n formatVersion: '1.0',\n description: doma.description ?? '',\n originalLanguage:\n (data.language as string) ?? (data.masterLanguage as string),\n },\n domain: {\n dataType: data.dataType,\n length: data.length,\n decimals: data.decimals,\n outputLength: data.outputLength,\n caseSensitive: data.caseSensitive === true,\n valueTable: (data.valueTableRef as { name?: string } | undefined)?.name,\n },\n };\n },\n\n fromMetadata: (meta: any) => ({\n name: (meta?.domain?.name ?? '').toUpperCase(),\n description: meta?.header?.description,\n dataType: meta?.domain?.dataType,\n length: meta?.domain?.length,\n decimals: meta?.domain?.decimals,\n }),\n});\n","/**\n * DTEL (data element) handler for gCTS / AFF format.\n */\nimport { AdkDataElement } from '@abapify/adk';\nimport { createHandler } from '../base';\n\nexport const dataElementHandler = createHandler(AdkDataElement, {\n toMetadata(dtel) {\n const data = dtel.dataSync as Record<string, unknown>;\n return {\n header: {\n formatVersion: '1.0',\n description: dtel.description ?? '',\n originalLanguage:\n (data.language as string) ?? (data.masterLanguage as string),\n },\n dataElement: {\n typeKind: data.typeKind,\n dataType: data.dataType,\n length: data.length,\n decimals: data.decimals,\n domain: (data.domainRef as { name?: string } | undefined)?.name,\n predefinedType: data.predefinedType,\n },\n };\n },\n\n fromMetadata: (meta: any) => ({\n name: (meta?.dataElement?.name ?? '').toUpperCase(),\n description: meta?.header?.description,\n dataType: meta?.dataElement?.dataType,\n }),\n});\n","/**\n * TABL (table / structure) handler for gCTS / AFF format.\n */\nimport { AdkTable } from '@abapify/adk';\nimport { createHandler } from '../base';\n\nexport const tableHandler = createHandler(AdkTable, {\n toMetadata(tabl) {\n const data = tabl.dataSync as Record<string, unknown>;\n return {\n header: {\n formatVersion: '1.0',\n description: tabl.description ?? '',\n originalLanguage:\n (data.language as string) ?? (data.masterLanguage as string),\n },\n table: {\n tableCategory: data.tableCategory,\n deliveryClass: data.deliveryClass,\n dataMaintenance: data.dataMaintenance,\n fields: data.fields,\n },\n };\n },\n\n fromMetadata: (meta: any) => ({\n name: (meta?.table?.name ?? '').toUpperCase(),\n description: meta?.header?.description,\n }),\n});\n","/**\n * TTYP (table type) handler for gCTS / AFF format.\n */\nimport { AdkTableType } from '@abapify/adk';\nimport { createHandler } from '../base';\n\nexport const tableTypeHandler = createHandler(AdkTableType, {\n toMetadata(ttyp) {\n const data = ttyp.dataSync as Record<string, unknown>;\n return {\n header: {\n formatVersion: '1.0',\n description: ttyp.description ?? '',\n originalLanguage:\n (data.language as string) ?? (data.masterLanguage as string),\n },\n tableType: {\n accessMode: data.accessMode,\n rowType: (data.rowTypeRef as { name?: string } | undefined)?.name,\n primaryKey: data.primaryKey,\n secondaryKeys: data.secondaryKeys,\n },\n };\n },\n\n fromMetadata: (meta: any) => ({\n name: (meta?.tableType?.name ?? '').toUpperCase(),\n description: meta?.header?.description,\n }),\n});\n","/**\n * FUGR (function group) handler for gCTS / AFF format.\n *\n * AFF's FUGR representation nests function modules under the group\n * directory. This plugin emits the group metadata only — per-module files\n * are produced by individual FUNC handlers once ADK exposes them.\n */\nimport { AdkFunctionGroup } from '@abapify/adk';\nimport { createHandler } from '../base';\n\nexport const functionGroupHandler = createHandler(AdkFunctionGroup, {\n toMetadata(fugr) {\n const data = fugr.dataSync as Record<string, unknown>;\n return {\n header: {\n formatVersion: '1.0',\n description: fugr.description ?? '',\n originalLanguage:\n (data.language as string) ?? (data.masterLanguage as string),\n },\n functionGroup: {\n // Function-module enumeration is intentionally deferred — AFF treats\n // FMs as separate artefacts and ADK already models them per FM.\n fixedPointArithmetic: data.fixPointArithmetic === true,\n unicodeChecksActive: data.activeUnicodeCheck !== false,\n },\n };\n },\n\n fromMetadata: (meta: any) => ({\n name: (meta?.functionGroup?.name ?? '').toUpperCase(),\n description: meta?.header?.description,\n }),\n});\n","/**\n * gCTS / AFF FormatPlugin.\n *\n * Thin adapter that plugs the gCTS handler registry into the generic\n * `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('gcts')` and never import this package directly.\n *\n * Registration happens as a side-effect of importing\n * `@abapify/adt-plugin-gcts` (`src/index.ts`).\n */\n\nimport type { FormatPlugin, FormatHandler } from '@abapify/adt-plugin';\nimport { getHandler, getSupportedTypes } from '../handlers/base';\nimport '../handlers/objects';\nimport { parseGctsFilename } from './filename';\n\nexport const gctsFormatPlugin: FormatPlugin = {\n id: 'gcts',\n description:\n 'gCTS / AFF (abap-file-formats) serialization format (JSON metadata + .abap/.acds sources)',\n\n get supportedTypes(): ReadonlyArray<string> {\n return getSupportedTypes();\n },\n\n getHandler(type: string): FormatHandler | undefined {\n return getHandler(type) as unknown as FormatHandler | undefined;\n },\n\n parseFilename(filename: string) {\n return parseGctsFilename(filename);\n },\n};\n\nexport default gctsFormatPlugin;\n","/**\n * gCTS / AFF Deserializer — disk → ADK (format.export direction).\n *\n * Reads a gCTS-shaped file tree and yields `AdkObject` instances that the\n * `CheckinService` (E08) drives through the regular diff / plan / apply\n * pipeline. This is the counterpart to the serializer implemented in\n * `gcts-plugin.ts` (SAP → disk / format.import).\n *\n * Layout (matches the writer in `gcts-plugin.ts`):\n *\n * src/<pkg-lowercased>/<obj>.<type>.json metadata (AFF JSON)\n * src/<pkg-lowercased>/<obj>.<type>[.<sfx>].abap ABAP sources (and\n * .asddls / .asdcls for\n * CDS).\n * src/<pkg-lowercased>/package.devc.json package metadata (skipped\n * — packages must exist on\n * target, same convention\n * as abapGit).\n *\n * Unlike abapGit this plugin has no `.abapgit.xml` equivalent — AFF does not\n * encode folder-logic. We therefore rely on `options.rootPackage` (or\n * leave `packageRef` unset so downstream apply logic can decide) — no\n * guesswork per directory for now. Richer directory → package mapping is\n * tracked in the E06 follow-ups.\n */\n\nimport type { FileTree, ExportOptions } from '@abapify/adt-plugin';\nimport { createAdk, type AdkObject, type AdtClient } from '@abapify/adk';\nimport { getHandler, getSupportedTypes } from './handlers/base';\nimport { parseGctsFilename, PACKAGE_FILENAME } from './format/filename';\n\n/** Source-file extensions emitted by gCTS handlers. */\nconst SOURCE_EXTENSIONS = new Set(['abap', 'asddls', 'asdcls']);\n\n/**\n * Map numeric abapLanguageVersion codes (`'5'` etc.) to the descriptive\n * string the ADT REST API expects (`'cloudDevelopment'`). Mirrors the\n * helper in `adt-plugin-abapgit` — kept local so this package does not\n * depend on its sibling.\n */\nconst ABAP_LANG_VER_TO_ADT: Record<string, string> = {\n '2': 'keyUser',\n '5': 'cloudDevelopment',\n};\n\nfunction abapLangVerToAdt(code: string | undefined): string | undefined {\n if (!code) return undefined;\n return ABAP_LANG_VER_TO_ADT[code] ?? code;\n}\n\ninterface ObjectFiles {\n name: string;\n type: string;\n metadataFile?: string;\n sourceFiles: Array<{ path: string; suffix?: string }>;\n}\n\n/**\n * Deserialise a gCTS/AFF file tree into `AdkObject` instances.\n *\n * @param fileTree Virtual FS abstraction (checkin supplies a real-fs impl).\n * @param client `AdtClient` — required by `createAdk` to build ADK objects.\n * @param options Export options. `rootPackage` is assigned as packageRef\n * to every discovered object that lacks one, mirroring the\n * abapGit behaviour when `.abapgit.xml` is absent.\n */\nexport async function* deserialize(\n fileTree: FileTree,\n client: AdtClient,\n options?: ExportOptions,\n): AsyncGenerator<AdkObject> {\n const adk = createAdk(client);\n\n // Scan every JSON file — these are the anchors for each object.\n const jsonFiles = await fileTree.glob('**/*.json');\n\n const supportedTypes = new Set(\n getSupportedTypes().map((t) => t.toLowerCase()),\n );\n\n const objectMap = new Map<string, ObjectFiles>();\n\n for (const jsonPath of jsonFiles) {\n const filename = jsonPath.split('/').pop()!;\n\n // Packages are NOT deployed (same convention as abapGit's\n // package.devc.xml) — they must exist on target.\n if (filename === PACKAGE_FILENAME) continue;\n\n const parsed = parseGctsFilename(filename);\n if (!parsed) continue;\n if (parsed.extension !== 'json') continue;\n if (!supportedTypes.has(parsed.type.toLowerCase())) continue;\n\n const key = `${parsed.name.toUpperCase()}:${parsed.type.toUpperCase()}`;\n if (!objectMap.has(key)) {\n objectMap.set(key, {\n name: parsed.name.toUpperCase(),\n type: parsed.type.toUpperCase(),\n sourceFiles: [],\n });\n }\n objectMap.get(key)!.metadataFile = jsonPath;\n }\n\n // Collect every source file (.abap/.asddls/.asdcls) and group by name:type.\n for (const ext of SOURCE_EXTENSIONS) {\n const paths = await fileTree.glob(`**/*.${ext}`);\n for (const path of paths) {\n const filename = path.split('/').pop()!;\n const parsed = parseGctsFilename(filename);\n if (!parsed) continue;\n\n const key = `${parsed.name.toUpperCase()}:${parsed.type.toUpperCase()}`;\n const obj = objectMap.get(key);\n if (!obj) continue;\n\n obj.sourceFiles.push({ path, suffix: parsed.suffix });\n }\n }\n\n for (const [, objFiles] of objectMap) {\n if (!objFiles.metadataFile) continue;\n\n const handler = getHandler(objFiles.type);\n if (!handler) continue;\n\n try {\n const raw = await fileTree.read(objFiles.metadataFile);\n // Handler schema.parse is plain JSON.parse — the parsed object IS the\n // metadata passed to fromMetadata.\n const metadata = handler.schema.parse(raw);\n\n // Read sources, mapping suffix → source key via handler map.\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: {\n name: string;\n description?: string;\n [key: string]: unknown;\n } = handler.fromAbapGit\n ? handler.fromAbapGit(metadata)\n : { name: objFiles.name };\n\n // AFF metadata frequently omits the object name (it's encoded in the\n // filename). Fall back to the filename-derived name.\n const objectName = payload.name || objFiles.name;\n const fullData = { ...payload, name: objectName };\n\n const adkType =\n typeof payload.type === 'string' ? payload.type : objFiles.type;\n const adkObject = adk.getWithData(fullData, adkType) as AdkObject;\n\n if (Object.keys(sources).length > 0) {\n if (handler.setSources) {\n handler.setSources(adkObject, sources);\n } else if (sources.main) {\n (adkObject as unknown as { _pendingSource: string })._pendingSource =\n sources.main;\n }\n }\n\n if (payload.description) {\n (\n adkObject as unknown as { _pendingDescription: string }\n )._pendingDescription = payload.description;\n }\n\n // Record relative directory (useful for future directory-based package\n // resolution). Plain metadata dir, no starting-folder normalisation —\n // gCTS does not define one.\n const sourceDir = objFiles\n .metadataFile!.split('/')\n .slice(0, -1)\n .join('/');\n (adkObject as unknown as { _relDir: string })._relDir = sourceDir;\n\n // Assign rootPackage to every object without a packageRef — no folder\n // logic available, so we cannot derive per-package assignments (see\n // E06 follow-ups). Matches abapGit's \"no .abapgit.xml\" fallback.\n if (options?.rootPackage) {\n const data = (\n adkObject as unknown as { _data?: Record<string, unknown> }\n )._data;\n if (data && !data.packageRef) {\n data.packageRef = { name: options.rootPackage };\n }\n }\n\n if (options?.abapLanguageVersion) {\n const data = (\n adkObject as unknown as { _data?: Record<string, unknown> }\n )._data;\n if (data && !data.abapLanguageVersion) {\n data.abapLanguageVersion =\n abapLangVerToAdt(options.abapLanguageVersion) ??\n options.abapLanguageVersion;\n }\n }\n\n yield adkObject;\n } catch (error) {\n // Mirrors abapGit: log and continue so one bad object does not abort\n // the whole checkin.\n console.error(\n `Failed to deserialize ${objFiles.type} ${objFiles.name}:`,\n error,\n );\n }\n }\n}\n","/**\n * gCTS AdtPlugin.\n *\n * The `FormatPlugin` in `format/gcts-format.ts` provides the declarative\n * contract (used by registry consumers); this `AdtPlugin` provides the\n * behaviour expected by `adt-cli`'s higher-level import/export services.\n *\n * SAP → disk (\"import\") serialises ADK objects to AFF JSON + source files.\n * Disk → SAP (\"export\" in adt-cli terminology — Git → SAP direction) is\n * delegated to `./deserializer.ts`, which yields AdkObjects for the\n * `CheckinService` apply pipeline (E08). Together they close the\n * round-trip that the E06 v0.1 follow-ups called out.\n */\n\nimport { mkdirSync, writeFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { createPlugin, type AdtPlugin } from '@abapify/adt-plugin';\nimport type { AdtClient } from '@abapify/adk';\nimport { getHandler, getSupportedTypes, isSupported } from './handlers/base';\nimport './handlers/objects';\nimport { deserialize } from './deserializer';\n\nexport const gctsPlugin: AdtPlugin = createPlugin({\n name: 'gcts',\n version: '0.1.0',\n description: 'gCTS / AFF format plugin — JSON metadata + .abap/.acds sources',\n\n registry: {\n isSupported,\n getSupportedTypes,\n },\n\n format: {\n async import(object, targetPath, context) {\n try {\n const isPackage = object.type?.startsWith('DEVC');\n const objPackage = isPackage\n ? object.name\n : (object as { package?: string }).package || object.name || 'ROOT';\n const packagePath = await context.resolvePackagePath(objPackage);\n\n // gCTS layout: flat per-package directory under src/<package-path>/.\n // Object files live directly inside their package dir (no extra\n // per-object subdirectory — matches AFF's default \"flat\" layout).\n const packageDir = packagePath.map((p) => p.toLowerCase()).join('/');\n\n const handler = getHandler(object.type);\n if (!handler) {\n return {\n success: false,\n filesCreated: [],\n errors: [\n `No gCTS handler registered for object type: ${object.type}`,\n ],\n };\n }\n\n const files = await handler.serialize(object as unknown as never);\n const baseDir = join(targetPath, 'src', packageDir);\n mkdirSync(baseDir, { recursive: true });\n\n const written: string[] = [];\n for (const f of files) {\n const full = join(baseDir, f.path);\n mkdirSync(dirname(full), { recursive: true });\n writeFileSync(full, f.content, f.encoding ?? 'utf8');\n written.push(full);\n }\n\n return { success: true, filesCreated: written };\n } catch (error) {\n return {\n success: false,\n filesCreated: [],\n errors: [error instanceof Error ? error.message : String(error)],\n };\n }\n },\n\n // Git → SAP: deserialise a gCTS/AFF file tree into AdkObjects. The\n // apply pipeline (diff/plan/lock/save) lives in CheckinService — this\n // plugin only knows how to decode its own on-disk layout.\n export: (fileTree, client, options?) =>\n deserialize(fileTree, client as AdtClient, options),\n },\n});\n\nexport default gctsPlugin;\nexport { gctsPlugin as GctsPlugin };\n","/**\n * @abapify/adt-plugin-gcts — gCTS / AFF format plugin entry point.\n *\n * Importing this module self-registers the plugin into the global\n * `FormatPlugin` registry so that `--format gcts` becomes available\n * throughout the `adt` CLI.\n */\n\nimport { registerFormatPlugin } from '@abapify/adt-plugin';\nimport { gctsFormatPlugin } from './lib/format/gcts-format';\n\n// Self-register on module load. Idempotent — safe against dual module-graph\n// evaluation (the same guard abapGit uses).\nregisterFormatPlugin(gctsFormatPlugin);\n\n// FormatPlugin — preferred public entry-point.\nexport { gctsFormatPlugin } from './lib/format/gcts-format';\n\n// AdtPlugin — needed for dynamic-import code paths in adt-cli.\nexport { gctsPlugin, GctsPlugin } from './lib/gcts-plugin';\nexport { gctsPlugin as default } from './lib/gcts-plugin';\n\n// Handler utilities\nexport {\n getHandler,\n getSupportedTypes,\n isSupported,\n createHandler,\n} from './lib/handlers/base';\nexport type {\n GctsHandler,\n GctsHandlerDefinition,\n GctsSourceEntry,\n} from './lib/handlers/base';\n\n// Filename utilities\nexport {\n gctsFilename,\n parseGctsFilename,\n adtUriToGctsPath,\n PACKAGE_FILENAME,\n METADATA_EXTENSION,\n} from './lib/format/filename';\n\n// Type re-exports\nexport type { GctsMetadata, GctsHeader, WithHeader } from './lib/format/types';\nexport type {\n AdtPlugin,\n FormatPlugin,\n FormatHandler,\n SerializedFile,\n} from '@abapify/adt-plugin';\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../src/lib/format/filename.ts","../src/lib/handlers/base.ts","../src/lib/handlers/objects/clas.ts","../src/lib/handlers/objects/intf.ts","../src/lib/handlers/objects/prog.ts","../src/lib/handlers/objects/devc.ts","../src/lib/handlers/objects/doma.ts","../src/lib/handlers/objects/dtel.ts","../src/lib/handlers/objects/tabl.ts","../src/lib/handlers/objects/ttyp.ts","../src/lib/handlers/objects/fugr.ts","../src/lib/handlers/objects/ddls.ts","../src/lib/handlers/objects/dcls.ts","../src/lib/handlers/objects/bdef.ts","../src/lib/handlers/objects/srvd.ts","../src/lib/handlers/objects/srvb.ts","../src/lib/handlers/objects/msag.ts","../src/lib/handlers/objects/wave2-generic.ts","../src/lib/format/gcts-format.ts","../src/lib/deserializer.ts","../src/lib/gcts-plugin.ts","../src/index.ts"],"sourcesContent":["/**\n * gCTS / AFF filename conventions.\n *\n * gCTS and AFF both use the pattern `<name>.<type>.<ext>` (same as abapGit),\n * but with JSON for metadata instead of XML and with CDS-specific\n * extensions (`.acds`, `.asddls`, ...) for CDS sources.\n *\n * Packages use a fixed `package.devc.json` filename (mirrors abapGit's\n * `package.devc.xml`).\n *\n * This module is independent of any particular handler — it exists so that\n * consumers (diff, round-trip tests, deserializers) can map filenames to\n * (name, type) pairs without pulling in the object-type registry.\n */\n\nimport type { ParsedFormatFilename } from '@abapify/adt-plugin';\n\n/**\n * Extension used for the source-file part of each object type.\n *\n * Order of precedence: CDS types use AFF's `.asddls` / `.asdcls`; everything\n * else uses `.abap`. Metadata is always `.json`.\n */\nconst TYPE_TO_SOURCE_EXT: Record<string, string> = {\n CLAS: 'abap',\n INTF: 'abap',\n PROG: 'abap',\n FUGR: 'abap',\n FUNC: 'abap',\n DDLS: 'asddls',\n DCLS: 'asdcls',\n BDEF: 'abdl',\n SRVD: 'acds',\n};\n\n/** Metadata extension for all AFF/gCTS objects. */\nexport const METADATA_EXTENSION = 'json';\n\n/** Fixed filename for package metadata (AFF / gCTS convention). */\nexport const PACKAGE_FILENAME = 'package.devc.json';\n\n/**\n * Build the AFF/gCTS on-disk filename for an object.\n *\n * @param name Object name (case preserved — AFF normalises to lowercase)\n * @param type ABAP object type code (CLAS, INTF, ...)\n * @param kind `\"metadata\"` (default) or `\"source\"`.\n * @param suffix Optional sub-include suffix (e.g. `locals_def` for CLAS).\n */\nexport function gctsFilename(\n name: string,\n type: string,\n kind: 'metadata' | 'source' = 'metadata',\n suffix?: string,\n): string {\n const base = name.toLowerCase();\n const typeLower = mainType(type).toLowerCase();\n if (kind === 'metadata') {\n return `${base}.${typeLower}.${METADATA_EXTENSION}`;\n }\n const ext = TYPE_TO_SOURCE_EXT[mainType(type).toUpperCase()] ?? 'abap';\n return suffix\n ? `${base}.${typeLower}.${suffix}.${ext}`\n : `${base}.${typeLower}.${ext}`;\n}\n\n/**\n * Parse an AFF/gCTS filename back into its components.\n *\n * Returns `undefined` if the filename does not look like a known AFF/gCTS\n * artefact — callers should skip unknown files (e.g. `README.md`).\n */\nexport function parseGctsFilename(\n filename: string,\n): ParsedFormatFilename | undefined {\n // Fixed package filename.\n if (filename === PACKAGE_FILENAME) {\n return {\n name: '',\n type: 'DEVC',\n extension: METADATA_EXTENSION,\n };\n }\n\n const parts = filename.split('.');\n if (parts.length < 3) {\n return undefined;\n }\n\n const extension = parts.at(-1)!;\n const maybeSuffix = parts.length >= 4 ? parts.at(-2) : undefined;\n const nameParts = maybeSuffix ? parts.slice(0, -3) : parts.slice(0, -2);\n\n if (nameParts.length === 0) {\n return undefined;\n }\n\n // For 3-part filenames (name.type.ext) the \"maybeSuffix\" branch would\n // misclassify a 4-part filename vs a 3-part filename. Use a recognised\n // source extension to decide: if ext is 'json' there can't be a suffix.\n if (extension === METADATA_EXTENSION) {\n return {\n name: nameParts.length === 0 ? '' : parts.slice(0, -2).join('.'),\n type: parts.at(-2)!.toUpperCase(),\n extension,\n };\n }\n\n // Source file — suffix is optional.\n const knownSourceExts = new Set([\n 'abap',\n 'asddls',\n 'asdcls',\n 'abdl',\n 'acds',\n 'properties',\n ]);\n if (!knownSourceExts.has(extension)) {\n return undefined;\n }\n\n // Detect suffix: the part before the extension is a suffix only if the part\n // before THAT is a valid-looking lowercase type code. Use a narrow heuristic:\n // suffix present iff parts.length >= 4.\n if (parts.length >= 4) {\n return {\n name: parts.slice(0, -3).join('.'),\n type: parts.at(-3)!.toUpperCase(),\n suffix: parts.at(-2),\n extension,\n };\n }\n\n return {\n name: parts.slice(0, -2).join('.'),\n type: parts.at(-2)!.toUpperCase(),\n extension,\n };\n}\n\n/**\n * Translate an ADT object URI (e.g. `/sap/bc/adt/oo/classes/zcl_foo`) to\n * the AFF/gCTS on-disk path (e.g. `zcl_foo/zcl_foo.clas.json`).\n *\n * Matches the `adtUriToAbapGitPath` helper in the abapGit plugin.\n */\nexport function adtUriToGctsPath(uri: string): string | undefined {\n const ADT_PREFIX = '/sap/bc/adt/';\n if (!uri.startsWith(ADT_PREFIX)) return undefined;\n const tail = uri.slice(ADT_PREFIX.length);\n if (tail.length === 0) return undefined;\n\n // Common ADT URI → (type, name) table. Mirrors abapGit's mapping.\n const TABLE: Array<[RegExp, string]> = [\n [/^oo\\/classes\\/([^/]+)$/, 'CLAS'],\n [/^oo\\/interfaces\\/([^/]+)$/, 'INTF'],\n [/^programs\\/programs\\/([^/]+)$/, 'PROG'],\n [/^functions\\/groups\\/([^/]+)$/, 'FUGR'],\n [/^packages\\/([^/]+)$/, 'DEVC'],\n [/^ddic\\/domains\\/([^/]+)$/, 'DOMA'],\n [/^ddic\\/dataelements\\/([^/]+)$/, 'DTEL'],\n [/^ddic\\/structures\\/([^/]+)$/, 'TABL'],\n [/^ddic\\/tables\\/([^/]+)$/, 'TABL'],\n [/^ddic\\/tabletypes\\/([^/]+)$/, 'TTYP'],\n [/^ddic\\/ddl\\/sources\\/([^/]+)$/, 'DDLS'],\n [/^acm\\/dcls\\/sources\\/([^/]+)$/, 'DCLS'],\n ];\n\n for (const [pattern, type] of TABLE) {\n const m = pattern.exec(tail);\n if (m) {\n const name = m[1];\n if (type === 'DEVC') return `${name.toLowerCase()}/${PACKAGE_FILENAME}`;\n return `${name.toLowerCase()}/${gctsFilename(name, type)}`;\n }\n }\n\n return undefined;\n}\n\nfunction mainType(type: string): string {\n return type.split('/')[0];\n}\n","/**\n * gCTS / AFF handler factory.\n *\n * Mirrors the abapGit `createHandler` factory but produces **JSON** metadata\n * (AFF / gCTS convention) instead of abapGit's `.xml` files. Handlers are\n * kept intentionally small — business logic lives in `@abapify/adk` and the\n * only job of a gCTS handler is to project ADK data to the on-disk shape.\n *\n * Self-registration: `createHandler` stores the handler in the module-local\n * registry so `getHandler(type)` can resolve it. The `FormatPlugin` wrapper\n * (`format/gcts-format.ts`) exposes the registry through the public\n * `@abapify/adt-plugin` contract.\n */\n\nimport type { AdkObject, AdkKind } from '@abapify/adk';\nimport { getTypeForKind, getMainType } from '@abapify/adk';\nimport type { FormatHandler, SerializedFile } from '@abapify/adt-plugin';\nimport { gctsFilename } from '../format/filename';\nimport type { GctsMetadata } from '../format/types';\n\nexport type AbapObjectType = string;\n\nexport type AdkObjectClass<T extends AdkObject = AdkObject> = {\n new (...args: any[]): T;\n readonly kind: AdkKind;\n};\n\n/**\n * Lazy source entry.\n *\n * `content` may be a string, a promise, or a thunk returning either — the\n * factory awaits whichever form the handler returns.\n */\nexport interface GctsSourceEntry {\n suffix?: string;\n content: string | Promise<string> | (() => string | Promise<string>);\n}\n\n/**\n * Extra file emitted alongside the standard metadata + source files.\n * Used by compound handlers (e.g. FUGR emitting per-function-module files).\n * `path` is relative to the object directory.\n */\nexport interface GctsExtraFile {\n path: string;\n content: string | Promise<string> | (() => string | Promise<string>);\n}\n\n/**\n * Handler definition for a single ABAP object type.\n *\n * The shape intentionally mirrors the abapGit `HandlerDefinition` so that\n * anyone familiar with the sister plugin can move between them with minimal\n * friction. The `toMetadata` function is the only required hook: it maps an\n * ADK object to the JSON metadata shape for the target type.\n */\nexport interface GctsHandlerDefinition<\n T extends AdkObject,\n M extends GctsMetadata = GctsMetadata,\n> {\n /** Map ADK object → JSON metadata payload (including the required `header`). */\n toMetadata(object: T): M;\n\n /** Optional: single primary source file. */\n getSource?(object: T): string | Promise<string>;\n\n /** Optional: multiple source files (e.g. CLAS includes). */\n getSources?(object: T): GctsSourceEntry[];\n\n /** Optional: extra files with full paths (e.g. FUGR per-FM .func.json). */\n getExtraFiles?(object: T): GctsExtraFile[] | Promise<GctsExtraFile[]>;\n\n /** Optional: custom metadata filename (e.g. `package.devc.json` for DEVC). */\n metadataFileName?: string | ((object: T) => string);\n\n /**\n * Optional: inverse mapping used during deserialization.\n *\n * `fromMetadata` receives the parsed JSON payload and returns a partial\n * ADK-data projection. `setSources` mirrors abapGit's behaviour: it stages\n * source content on the ADK object for later deploy.\n */\n fromMetadata?(metadata: M): { name: string } & Record<string, unknown>;\n suffixToSourceKey?: Record<string, string>;\n setSources?(object: T, sources: Record<string, string>): void;\n}\n\n/** Runtime shape of a gCTS handler after `createHandler` processing. */\nexport interface GctsHandler<\n T extends AdkObject = AdkObject,\n> extends FormatHandler {\n readonly type: AbapObjectType;\n readonly fileExtension: string;\n readonly schema: {\n parse(raw: string): unknown;\n build(data: unknown): string;\n };\n serialize(object: T): Promise<SerializedFile[]>;\n fromAbapGit?(values: unknown): { name: string } & Record<string, unknown>;\n setSources?(object: T, sources: Record<string, string>): void;\n}\n\nconst handlerRegistry = new Map<AbapObjectType, GctsHandler>();\n\n/** Look up a handler (full-type first, then main-type fallback). */\nexport function getHandler(type: AbapObjectType): GctsHandler | undefined {\n return handlerRegistry.get(type) ?? handlerRegistry.get(getMainType(type));\n}\n\n/** `true` iff the given object type has a registered handler. */\nexport function isSupported(type: AbapObjectType): boolean {\n return handlerRegistry.has(type) || handlerRegistry.has(getMainType(type));\n}\n\n/** Snapshot of all registered object types. */\nexport function getSupportedTypes(): AbapObjectType[] {\n return [...handlerRegistry.keys()];\n}\n\n/** Internal — test helper. */\nexport function __resetRegistry(): void {\n handlerRegistry.clear();\n}\n\n/**\n * Build a JSON metadata file for the object. JSON is pretty-printed (2-space\n * indent) so the output is diff-friendly and matches AFF's own tooling.\n */\nfunction buildMetadataFile(meta: GctsMetadata): string {\n return JSON.stringify(meta, null, 2) + '\\n';\n}\n\n/**\n * Register a handler for an ADK class (preferred — `type` is derived from\n * the static `kind`) or an explicit type string (for types without an ADK\n * class, e.g. DOMA/DTEL).\n */\nexport function createHandler<\n T extends AdkObject,\n M extends GctsMetadata = GctsMetadata,\n>(\n adkClass: AdkObjectClass<T>,\n definition: GctsHandlerDefinition<T, M>,\n): GctsHandler<T>;\nexport function createHandler<\n T extends AdkObject,\n M extends GctsMetadata = GctsMetadata,\n>(\n type: AbapObjectType,\n definition: GctsHandlerDefinition<T, M>,\n): GctsHandler<T>;\nexport function createHandler<\n T extends AdkObject,\n M extends GctsMetadata = GctsMetadata,\n>(\n adkClassOrType: AdkObjectClass<T> | AbapObjectType,\n definition: GctsHandlerDefinition<T, M>,\n): GctsHandler<T> {\n let type: AbapObjectType;\n if (typeof adkClassOrType === 'string') {\n type = adkClassOrType;\n } else {\n const kind = adkClassOrType.kind;\n const derived = getTypeForKind(kind);\n if (!derived) {\n throw new Error(\n `Unknown ADK kind: ${kind}. Ensure the ADK class has a static 'kind' property.`,\n );\n }\n type = derived;\n }\n\n const fileExtension = getMainType(type).toLowerCase();\n\n async function resolveSource(entry: GctsSourceEntry): Promise<string> {\n const raw =\n typeof entry.content === 'function' ? entry.content() : entry.content;\n return await raw;\n }\n\n const handler: GctsHandler<T> = {\n type,\n fileExtension,\n // Minimal JSON \"schema\" — matches the FormatHandlerSchema contract.\n schema: {\n parse: (raw: string) => JSON.parse(raw) as unknown,\n build: (data: unknown) => JSON.stringify(data, null, 2) + '\\n',\n },\n suffixToSourceKey: definition.suffixToSourceKey,\n async serialize(object: T): Promise<SerializedFile[]> {\n const files: SerializedFile[] = [];\n const objectName = (object.name ?? '').toLowerCase();\n\n // Source files.\n if (definition.getSources) {\n for (const entry of definition.getSources(object)) {\n const content = await resolveSource(entry);\n if (!content) continue;\n files.push({\n path: gctsFilename(objectName, type, 'source', entry.suffix),\n content,\n });\n }\n } else if (definition.getSource) {\n const content = await definition.getSource(object);\n if (content) {\n files.push({\n path: gctsFilename(objectName, type, 'source'),\n content,\n });\n }\n }\n\n // Metadata file.\n const metadata = definition.toMetadata(object);\n const metadataFile =\n typeof definition.metadataFileName === 'function'\n ? definition.metadataFileName(object)\n : (definition.metadataFileName ??\n gctsFilename(objectName, type, 'metadata'));\n files.push({\n path: metadataFile,\n content: buildMetadataFile(metadata),\n });\n\n // Extra files (e.g. FUGR per-function-module .func.json + .func.abap).\n if (definition.getExtraFiles) {\n const extras = await definition.getExtraFiles(object);\n for (const extra of extras) {\n const content = await resolveSource(extra);\n if (!content) continue;\n files.push({ path: extra.path, content });\n }\n }\n\n return files;\n },\n fromAbapGit: definition.fromMetadata\n ? (values: unknown) =>\n definition.fromMetadata!(values as M) as { name: string } & Record<\n string,\n unknown\n >\n : undefined,\n setSources: definition.setSources,\n };\n\n handlerRegistry.set(type, handler as GctsHandler);\n return handler;\n}\n\n/** Convenience re-export — matches abapGit's `package.devc.xml` pattern. */\nexport { PACKAGE_FILENAME } from '../format/filename';\n","/**\n * CLAS handler for gCTS / AFF format.\n *\n * Projects ADK class data to the AFF clas-v1.json schema shape:\n *\n * {\n * formatVersion: \"1\",\n * header: { description, originalLanguage, abapLanguageVersion? },\n * category?,\n * fixPointArithmetic?,\n * messageClass?,\n * descriptions?: { types?, attributes?, events?, methods? }\n * }\n *\n * Sources are emitted per include (main, definitions, implementations, ...).\n * Abapgit suffix convention is reused for consistency — AFF does not\n * standardise include filenames, but using the same suffixes as abapGit\n * means downstream tooling (diff, round-trip) can treat both formats with\n * the same suffix map.\n */\n\nimport { AdkClass, type ClassIncludeType } from '@abapify/adk';\nimport { createHandler } from '../base';\nimport type { ClasAff } from '../../../schemas/generated';\n\nconst SUFFIX: Record<ClassIncludeType, string | undefined> = {\n main: undefined,\n definitions: 'locals_def',\n implementations: 'locals_imp',\n localtypes: 'locals_types',\n macros: 'macros',\n testclasses: 'testclasses',\n};\n\nconst SUFFIX_TO_SOURCE_KEY = Object.fromEntries(\n Object.entries(SUFFIX)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => [v, k]),\n) as Record<string, ClassIncludeType>;\n\n/**\n * ADK category enum → AFF category enum.\n * AFF uses a different, finer-grained set of category names.\n */\nconst CATEGORY_TO_AFF: Record<string, string> = {\n generalObjectType: 'generalObjectType',\n exitClass: 'exitClass',\n testClass: 'testclassAbapUnit',\n behaviorPool: 'behaviorClass',\n entityEventHandler: 'entityEventHandler',\n persistentClass: 'persistentClass',\n factoryClass: 'factoryForPersistentClass',\n rfcProxyClass: 'rfcProxyClass',\n communicationConnectionClass: 'communicationConnectionClass',\n exceptionClass: 'exceptionClass',\n areaClass: 'areaClassSharedObjects',\n bspClass: 'bspApplicationClass',\n};\n\nconst CATEGORY_FROM_AFF: Record<string, string> = Object.fromEntries(\n Object.entries(CATEGORY_TO_AFF).map(([k, v]) => [v, k]),\n);\n\nexport const classHandler = createHandler(AdkClass, {\n suffixToSourceKey: SUFFIX_TO_SOURCE_KEY,\n\n toMetadata(cls): ClasAff {\n const data = cls.dataSync;\n const lang = (data.language ?? data.masterLanguage ?? '').toLowerCase();\n return {\n formatVersion: '1',\n header: {\n description: cls.description ?? data.description ?? '',\n originalLanguage: lang,\n ...(data.abapLanguageVersion && data.abapLanguageVersion !== 'standard'\n ? {\n abapLanguageVersion:\n data.abapLanguageVersion as ClasAff['header']['abapLanguageVersion'],\n }\n : {}),\n },\n ...(data.category\n ? {\n category: (CATEGORY_TO_AFF[data.category] ??\n 'generalObjectType') as ClasAff['category'],\n }\n : {}),\n ...(typeof data.fixPointArithmetic === 'boolean'\n ? { fixPointArithmetic: data.fixPointArithmetic }\n : {}),\n };\n },\n\n getSources: (cls) => {\n const includes = cls.dataSync.include ?? [];\n return includes.map((inc) => ({\n suffix: SUFFIX[String(inc.includeType ?? 'main') as ClassIncludeType],\n content: () =>\n cls.getIncludeSource(\n String(inc.includeType ?? 'main') as ClassIncludeType,\n ),\n }));\n },\n\n fromMetadata: (meta: ClasAff) => ({\n name: '', // AFF clas schema has no name field — set by filename context\n type: 'CLAS/OC',\n description: meta.header.description,\n language: meta.header.originalLanguage?.toUpperCase(),\n masterLanguage: meta.header.originalLanguage?.toUpperCase(),\n category: meta.category\n ? (CATEGORY_FROM_AFF[meta.category] ?? meta.category)\n : undefined,\n abapLanguageVersion: meta.header.abapLanguageVersion,\n fixPointArithmetic: meta.fixPointArithmetic,\n }),\n\n setSources: (cls, sources) => {\n (\n cls as unknown as { _pendingSources: Record<string, string> }\n )._pendingSources = sources;\n if (sources.main) {\n (cls as unknown as { _pendingSource: string })._pendingSource =\n sources.main;\n }\n },\n});\n","/**\n * INTF handler for gCTS / AFF format.\n *\n * Projects ADK interface data to the AFF intf-v1.json schema shape:\n *\n * {\n * formatVersion: \"1\",\n * header: { description, originalLanguage, abapLanguageVersion? },\n * category?,\n * proxy?,\n * descriptions?\n * }\n */\n\nimport { AdkInterface } from '@abapify/adk';\nimport { createHandler } from '../base';\nimport type { IntfAff } from '../../../schemas/generated';\n\nexport const interfaceHandler = createHandler(AdkInterface, {\n toMetadata(intf): IntfAff {\n const data = intf.dataSync;\n const lang = (data.language ?? data.masterLanguage ?? '').toLowerCase();\n return {\n formatVersion: '1',\n header: {\n description: intf.description ?? data.description ?? '',\n originalLanguage: lang,\n ...(data.abapLanguageVersion && data.abapLanguageVersion !== 'standard'\n ? {\n abapLanguageVersion:\n data.abapLanguageVersion as IntfAff['header']['abapLanguageVersion'],\n }\n : {}),\n },\n };\n },\n\n getSource: (obj) => obj.getSource(),\n\n fromMetadata: (meta: IntfAff) => ({\n name: '',\n type: 'INTF/OI',\n description: meta.header.description,\n language: meta.header.originalLanguage?.toUpperCase(),\n masterLanguage: meta.header.originalLanguage?.toUpperCase(),\n abapLanguageVersion: meta.header.abapLanguageVersion,\n }),\n\n setSources: (intf, sources) => {\n if (sources.main) {\n (intf as unknown as { _pendingSource: string })._pendingSource =\n sources.main;\n }\n },\n});\n","/**\n * PROG handler for gCTS / AFF format.\n *\n * Projects ADK program data to the AFF prog-v1.json schema shape:\n *\n * {\n * formatVersion: \"1\",\n * header: { description, originalLanguage, abapLanguageVersion? },\n * generalInformation: { programType, programStatus, fixPointArithmetic?, ... }\n * }\n */\n\nimport { AdkProgram } from '@abapify/adk';\nimport { createHandler } from '../base';\nimport type { ProgAff } from '../../../schemas/generated';\n\n/** ADK sourceObjectStatus → AFF programStatus */\nconst STATUS_TO_AFF: Record<string, string> = {\n SAPStandardProduction: 'sapProductionProgram',\n customerProduction: 'customerProductionProgram',\n system: 'systemProgram',\n test: 'testProgram',\n};\n\nconst STATUS_FROM_AFF: Record<string, string> = Object.fromEntries(\n Object.entries(STATUS_TO_AFF).map(([k, v]) => [v, k]),\n);\n\nexport const programHandler = createHandler(AdkProgram, {\n toMetadata(prog): ProgAff {\n const data = prog.dataSync;\n const lang = (data.language ?? data.masterLanguage ?? '').toLowerCase();\n const generalInformation: Record<string, unknown> = {\n programType: (data.programType ??\n 'executableProgram') as ProgAff['generalInformation']['programType'],\n programStatus: (STATUS_TO_AFF[data.sourceObjectStatus ?? ''] ??\n 'systemProgram') as ProgAff['generalInformation']['programStatus'],\n };\n if (typeof data.fixPointArithmetic === 'boolean') {\n generalInformation.fixPointArithmetic = data.fixPointArithmetic;\n }\n return {\n formatVersion: '1',\n header: {\n description: prog.description ?? data.description ?? '',\n originalLanguage: lang,\n ...(data.abapLanguageVersion && data.abapLanguageVersion !== 'standard'\n ? {\n abapLanguageVersion:\n data.abapLanguageVersion as ProgAff['header']['abapLanguageVersion'],\n }\n : {}),\n },\n generalInformation: generalInformation as ProgAff['generalInformation'],\n };\n },\n\n getSource: (obj) => obj.getSource(),\n\n fromMetadata: (meta: ProgAff) => ({\n name: '',\n type: 'PROG/P',\n description: meta.header.description,\n language: meta.header.originalLanguage?.toUpperCase(),\n masterLanguage: meta.header.originalLanguage?.toUpperCase(),\n programType: meta.generalInformation?.programType,\n sourceObjectStatus: meta.generalInformation?.programStatus\n ? STATUS_FROM_AFF[meta.generalInformation.programStatus]\n : undefined,\n fixPointArithmetic: meta.generalInformation?.fixPointArithmetic,\n abapLanguageVersion: meta.header.abapLanguageVersion,\n }),\n\n setSources: (prog, sources) => {\n if (sources.main) {\n (prog as unknown as { _pendingSource: string })._pendingSource =\n sources.main;\n }\n },\n});\n","/**\n * DEVC (package) handler for gCTS / AFF format.\n *\n * Packages use a fixed filename (`package.devc.json`) — same convention as\n * abapGit's `package.devc.xml`.\n *\n * Note: DEVC has no AFF schema in SAP/abap-file-formats — this handler\n * uses a gCTS-compatible shape with formatVersion \"1\". If AFF adds a DEVC\n * schema later, align here.\n */\nimport { AdkPackage } from '@abapify/adk';\nimport { createHandler, PACKAGE_FILENAME } from '../base';\n\nexport const packageHandler = createHandler(AdkPackage, {\n metadataFileName: PACKAGE_FILENAME,\n\n toMetadata(pkg) {\n return {\n formatVersion: '1',\n header: {\n description: pkg.description ?? '',\n originalLanguage: (\n pkg.dataSync?.language ??\n pkg.dataSync?.masterLanguage ??\n ''\n ).toLowerCase(),\n ...(pkg.dataSync?.abapLanguageVersion &&\n pkg.dataSync.abapLanguageVersion !== 'standard'\n ? { abapLanguageVersion: pkg.dataSync.abapLanguageVersion }\n : {}),\n },\n package: {\n // DEVCLASS is carried by filename/directory, not by metadata.\n softwareComponent: pkg.dataSync?.transport?.softwareComponent?.name,\n applicationComponent: pkg.dataSync?.applicationComponent?.name,\n packageType: pkg.dataSync?.attributes?.packageType,\n },\n };\n },\n\n fromMetadata: (meta: any) => ({\n name: '',\n description: meta?.header?.description,\n language: meta?.header?.originalLanguage?.toUpperCase(),\n masterLanguage: meta?.header?.originalLanguage?.toUpperCase(),\n abapLanguageVersion: meta?.header?.abapLanguageVersion,\n }),\n});\n","/**\n * DOMA (domain) handler for gCTS / AFF format.\n *\n * Projects ADK domain data to the AFF doma-v1.json schema shape:\n *\n * {\n * formatVersion: \"1\",\n * header: { description, originalLanguage, abapLanguageVersion? },\n * format: { dataType, length, decimals? } (required),\n * outputCharacteristics?: { length?, caseSensitive?, conversionRoutine?, ... },\n * valueTable?: { name }\n * }\n */\n\nimport { AdkDomain } from '@abapify/adk';\nimport { createHandler } from '../base';\nimport type { DomaAff } from '../../../schemas/generated';\n\nexport const domainHandler = createHandler(AdkDomain, {\n toMetadata(doma): DomaAff {\n const data = doma.dataSync as Record<string, unknown>;\n const content = (data.content ?? {}) as Record<string, unknown>;\n const lang = (\n (data.language as string) ??\n (data.masterLanguage as string) ??\n ''\n ).toLowerCase();\n const ti = (content.typeInformation ?? {}) as Record<string, unknown>;\n const oi = (content.outputInformation ?? {}) as Record<string, unknown>;\n const vi = (content.valueInformation ?? {}) as Record<string, unknown>;\n\n const format: Record<string, unknown> = {\n dataType: ti.datatype ?? 'CHAR',\n length: ti.length ?? 1,\n };\n if (typeof ti.decimals === 'number') {\n format.decimals = ti.decimals;\n }\n\n const result: Record<string, unknown> = {\n formatVersion: '1',\n header: {\n description: doma.description ?? '',\n originalLanguage: lang,\n },\n format: format as DomaAff['format'],\n };\n\n // outputCharacteristics — only emit if we have meaningful values\n const outChars: Record<string, unknown> = {};\n if (typeof oi.length === 'number') outChars.length = oi.length;\n if (typeof oi.lowercase === 'boolean')\n outChars.caseSensitive = !oi.lowercase;\n if (oi.conversionExit) outChars.conversionRoutine = oi.conversionExit;\n if (Object.keys(outChars).length > 0) {\n result.outputCharacteristics = outChars;\n }\n\n // valueTable\n const vtRef = (vi.valueTableRef ?? {}) as { name?: string };\n if (vtRef.name) {\n result.valueTable = { name: vtRef.name };\n }\n\n return result as DomaAff;\n },\n\n fromMetadata: (meta: DomaAff) => {\n const result: Record<string, unknown> = {\n name: '',\n description: meta.header.description,\n language: meta.header.originalLanguage?.toUpperCase(),\n masterLanguage: meta.header.originalLanguage?.toUpperCase(),\n };\n const content: Record<string, unknown> = {\n typeInformation: {\n datatype: meta.format.dataType,\n length: meta.format.length,\n decimals: meta.format.decimals ?? 0,\n },\n };\n if (meta.outputCharacteristics) {\n content.outputInformation = {\n length: meta.outputCharacteristics.length,\n lowercase: meta.outputCharacteristics.caseSensitive ? false : undefined,\n conversionExit: meta.outputCharacteristics.conversionRoutine,\n };\n }\n if (meta.valueTable?.name) {\n content.valueInformation = {\n valueTableRef: { name: meta.valueTable.name },\n };\n }\n result.content = content;\n return result as { name: string } & Record<string, unknown>;\n },\n});\n","/**\n * DTEL (data element) handler for gCTS / AFF format.\n *\n * Projects ADK data element data to the AFF dtel-v1.json schema shape:\n *\n * {\n * formatVersion: \"1\",\n * header: { description, originalLanguage, abapLanguageVersion? },\n * dataTypeInformation: { domainName? } | { predefinedType: { dataType, length?, decimals? } },\n * fieldLabels?: { short, shortLength, medium, mediumLength, long, longLength, heading, headingLength }\n * }\n */\n\nimport { AdkDataElement } from '@abapify/adk';\nimport { createHandler } from '../base';\nimport type { DtelAff } from '../../../schemas/generated';\n\n// TODO: Replace Record<string, unknown> with generated ADK DTEL types once\n// adt-schemas exports a typed DataelementsSchema interface. Dynamic access is\n// required because AdkDataElement.dataSync returns a generic record today.\n// Cleanup issue: https://github.com/abapify/adt-cli/issues/195\nfunction buildDataTypeInformation(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const typeKind = data.typeKind as string | undefined;\n if (typeKind === 'domain' && data.typeName) {\n return { domainName: data.typeName };\n }\n if (data.dataType) {\n const predefinedType: Record<string, unknown> = { dataType: data.dataType };\n if (typeof data.dataTypeLength === 'number') {\n predefinedType.length = data.dataTypeLength;\n }\n if (typeof data.dataTypeDecimals === 'number') {\n predefinedType.decimals = data.dataTypeDecimals;\n }\n return { predefinedType };\n }\n return {};\n}\n\n// TODO: Same as above — replace with typed access once ADK exports DTEL types.\nfunction buildFieldLabels(\n data: Record<string, unknown>,\n): Record<string, unknown> {\n const labels: Record<string, unknown> = {};\n const fields: [string, string, string][] = [\n ['shortFieldLabel', 'short', 'shortFieldLength'],\n ['mediumFieldLabel', 'medium', 'mediumFieldLength'],\n ['longFieldLabel', 'long', 'longFieldLength'],\n ['headingFieldLabel', 'heading', 'headingFieldLength'],\n ];\n for (const [src, dst, lenKey] of fields) {\n if (data[src]) {\n labels[dst] = data[src];\n if (typeof data[lenKey] === 'number') {\n labels[`${dst}Length`] = data[lenKey];\n }\n }\n }\n return labels;\n}\n\nexport const dataElementHandler = createHandler(AdkDataElement, {\n toMetadata(dtel): DtelAff {\n const data = dtel.dataSync as Record<string, unknown>;\n const lang = (\n (data.language as string) ??\n (data.masterLanguage as string) ??\n ''\n ).toLowerCase();\n\n const result: Record<string, unknown> = {\n formatVersion: '1',\n header: {\n description: dtel.description ?? '',\n originalLanguage: lang,\n },\n dataTypeInformation: buildDataTypeInformation(data),\n };\n\n const fieldLabels = buildFieldLabels(data);\n if (Object.keys(fieldLabels).length > 0) {\n result.fieldLabels = fieldLabels;\n }\n\n return result as DtelAff;\n },\n\n fromMetadata: (meta: DtelAff) => {\n const dti = meta.dataTypeInformation ?? {};\n const result: Record<string, unknown> = {\n name: '',\n description: meta.header.description,\n language: meta.header.originalLanguage?.toUpperCase(),\n masterLanguage: meta.header.originalLanguage?.toUpperCase(),\n };\n if (dti.domainName) {\n result.typeKind = 'domain';\n result.typeName = dti.domainName;\n } else if (dti.predefinedType) {\n result.typeKind = 'predefinedAbapType';\n result.dataType = dti.predefinedType.dataType;\n result.dataTypeLength = dti.predefinedType.length;\n result.dataTypeDecimals = dti.predefinedType.decimals;\n }\n const fl = meta.fieldLabels;\n if (fl) {\n result.shortFieldLabel = fl.short;\n result.shortFieldLength = fl.shortLength;\n result.mediumFieldLabel = fl.medium;\n result.mediumFieldLength = fl.mediumLength;\n result.longFieldLabel = fl.long;\n result.longFieldLength = fl.longLength;\n result.headingFieldLabel = fl.heading;\n result.headingFieldLength = fl.headingLength;\n }\n return result as { name: string } & Record<string, unknown>;\n },\n});\n","/**\n * TABL (table / structure) handler for gCTS / AFF format.\n *\n * Note: TABL has no AFF schema in SAP/abap-file-formats — this handler\n * uses a gCTS-compatible shape with formatVersion \"1\". If AFF adds a TABL\n * schema later, align here.\n */\nimport { AdkTable } from '@abapify/adk';\nimport { createHandler } from '../base';\n\nexport const tableHandler = createHandler(AdkTable, {\n toMetadata(tabl) {\n const data = tabl.dataSync as Record<string, unknown>;\n return {\n formatVersion: '1',\n header: {\n description: tabl.description ?? '',\n originalLanguage: (\n (data.language as string) ??\n (data.masterLanguage as string) ??\n ''\n ).toLowerCase(),\n },\n table: {\n tableCategory: data.tableCategory,\n deliveryClass: data.deliveryClass,\n dataMaintenance: data.dataMaintenance,\n fields: data.fields,\n },\n };\n },\n\n fromMetadata: (meta: any) => ({\n name: '',\n description: meta?.header?.description,\n language: meta?.header?.originalLanguage?.toUpperCase(),\n masterLanguage: meta?.header?.originalLanguage?.toUpperCase(),\n tableCategory: meta?.table?.tableCategory,\n deliveryClass: meta?.table?.deliveryClass,\n dataMaintenance: meta?.table?.dataMaintenance,\n fields: meta?.table?.fields,\n }),\n});\n","/**\n * TTYP (table type) handler for gCTS / AFF format.\n *\n * Note: TTYP has no AFF schema in SAP/abap-file-formats — this handler\n * uses a gCTS-compatible shape with formatVersion \"1\". If AFF adds a TTYP\n * schema later, align here.\n */\nimport { AdkTableType } from '@abapify/adk';\nimport { createHandler } from '../base';\n\nexport const tableTypeHandler = createHandler(AdkTableType, {\n toMetadata(ttyp) {\n const data = ttyp.dataSync as Record<string, unknown>;\n return {\n formatVersion: '1',\n header: {\n description: ttyp.description ?? '',\n originalLanguage: (\n (data.language as string) ??\n (data.masterLanguage as string) ??\n ''\n ).toLowerCase(),\n },\n tableType: {\n accessMode: data.accessMode,\n rowType: (data.rowTypeRef as { name?: string } | undefined)?.name,\n primaryKey: data.primaryKey,\n secondaryKeys: data.secondaryKeys,\n },\n };\n },\n\n fromMetadata: (meta: any) => ({\n name: '',\n description: meta?.header?.description,\n language: meta?.header?.originalLanguage?.toUpperCase(),\n }),\n});\n","/**\n * FUGR (function group) handler for gCTS / AFF format.\n *\n * Projects ADK function group data to the AFF fugr-v1.json schema shape:\n *\n * {\n * formatVersion: \"1\",\n * header: { description, originalLanguage, abapLanguageVersion? },\n * fixPointArithmetic: boolean (required),\n * status?\n * }\n *\n * AFF's FUGR representation nests function modules under the group\n * directory. This handler emits the group metadata plus per-function-module\n * files when function module data is available:\n * <fmname>.func.json — FM metadata (func-v1.json schema)\n * <fmname>.func.abap — FM source\n */\n\nimport { AdkFunctionGroup } from '@abapify/adk';\nimport { createHandler, type GctsExtraFile } from '../base';\nimport type { FugrAff, FuncAff } from '../../../schemas/generated';\n\ntype FmDescriptor = {\n name: string;\n description?: string;\n processingType?: string;\n includeNumber?: string;\n source?: string;\n};\n\ntype FugrLike = {\n name: string;\n description?: string;\n dataSync?: Record<string, unknown>;\n functionModules?: FmDescriptor[];\n getSource?: () => Promise<string> | string;\n};\n\nfunction buildFuncMetadata(fm: FmDescriptor): string {\n const meta: Record<string, unknown> = {\n formatVersion: '1',\n header: {\n description: fm.description ?? fm.name ?? '',\n },\n processingType: fm.processingType ?? 'normal',\n includeNumber: fm.includeNumber ?? '0000',\n };\n return JSON.stringify(meta, null, 2) + '\\n';\n}\n\nexport const functionGroupHandler = createHandler(AdkFunctionGroup, {\n toMetadata(fugr: FugrLike): FugrAff {\n const data = (fugr.dataSync ?? {}) as Record<string, unknown>;\n const lang = (\n (data.language as string) ??\n (data.masterLanguage as string) ??\n ''\n ).toLowerCase();\n return {\n formatVersion: '1',\n header: {\n description: fugr.description ?? '',\n originalLanguage: lang,\n },\n fixPointArithmetic: data.fixPointArithmetic === true,\n };\n },\n\n getSource: (fugr: FugrLike) =>\n typeof fugr.getSource === 'function' ? fugr.getSource() : '',\n\n getExtraFiles(fugr: FugrLike): GctsExtraFile[] {\n const fms = fugr.functionModules ?? [];\n const files: GctsExtraFile[] = [];\n for (const fm of fms) {\n const fmName = fm.name.toLowerCase();\n files.push({\n path: `${fmName}.func.json`,\n content: buildFuncMetadata(fm),\n });\n if (fm.source) {\n files.push({\n path: `${fmName}.func.abap`,\n content: fm.source,\n });\n }\n }\n return files;\n },\n\n fromMetadata: (meta: FugrAff) => ({\n name: '',\n description: meta.header.description,\n language: meta.header.originalLanguage?.toUpperCase(),\n masterLanguage: meta.header.originalLanguage?.toUpperCase(),\n fixPointArithmetic: meta.fixPointArithmetic,\n }),\n});\n","/**\n * DDLS (CDS view) handler for gCTS / AFF format.\n *\n * Source-driven: emits `<name>.ddls.asddls` (source) + `<name>.ddls.json`\n * (metadata per ddls-v1.json schema).\n *\n * {\n * formatVersion: \"1\",\n * header: { description, originalLanguage, abapLanguageVersion? },\n * sourceOrigin: \"abapDevelopmentTools\" (required),\n * sourceType: \"unknown\" (required),\n * parentName?: string\n * }\n */\n\nimport { createHandler } from '../base';\nimport type { DdlsAff } from '../../../schemas/generated';\n\ntype DdlsLike = {\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 ddlSourceHandler = createHandler('DDLS', {\n toMetadata(obj: DdlsLike): DdlsAff {\n const lang = (obj.originalLanguage ?? '').toLowerCase();\n const meta: Record<string, unknown> = {\n formatVersion: '1',\n header: {\n description: obj.description ?? obj.name ?? '',\n originalLanguage: lang,\n ...(obj.abapLanguageVersion\n ? { abapLanguageVersion: obj.abapLanguageVersion }\n : {}),\n },\n sourceOrigin: obj.sourceOrigin ?? 'abapDevelopmentTools',\n sourceType: obj.sourceType ?? 'unknown',\n };\n return meta as DdlsAff;\n },\n\n getSource: (obj: DdlsLike) =>\n typeof obj.getSource === 'function' ? obj.getSource() : '',\n\n fromMetadata: (meta: DdlsAff) => ({\n name: '',\n description: meta.header.description,\n language: meta.header.originalLanguage?.toUpperCase(),\n masterLanguage: meta.header.originalLanguage?.toUpperCase(),\n sourceOrigin: meta.sourceOrigin,\n sourceType: meta.sourceType,\n }),\n});\n","/**\n * DCLS (CDS access control) handler for gCTS / AFF format.\n *\n * Source-driven: emits `<name>.dcls.asdcls` (source) + `<name>.dcls.json`\n * (metadata per dcls-v1.json schema).\n *\n * {\n * formatVersion: \"1\",\n * header: { description, originalLanguage, abapLanguageVersion? }\n * }\n */\n\nimport { createHandler } from '../base';\nimport type { DclsAff } from '../../../schemas/generated';\n\ntype DclsLike = {\n name: string;\n description?: string;\n originalLanguage?: string;\n abapLanguageVersion?: string;\n getSource?: () => Promise<string> | string;\n};\n\nexport const dclSourceHandler = createHandler('DCLS', {\n toMetadata(obj: DclsLike): DclsAff {\n const lang = (obj.originalLanguage ?? '').toLowerCase();\n return {\n formatVersion: '1',\n header: {\n description: obj.description ?? obj.name ?? '',\n originalLanguage: lang,\n ...(obj.abapLanguageVersion\n ? { abapLanguageVersion: obj.abapLanguageVersion }\n : {}),\n },\n } as DclsAff;\n },\n\n getSource: (obj: DclsLike) =>\n typeof obj.getSource === 'function' ? obj.getSource() : '',\n\n fromMetadata: (meta: DclsAff) => ({\n name: '',\n description: meta.header.description,\n language: meta.header.originalLanguage?.toUpperCase(),\n masterLanguage: meta.header.originalLanguage?.toUpperCase(),\n }),\n});\n","/**\n * BDEF (RAP behavior definition) handler for gCTS / AFF format.\n *\n * Source-driven: emits `<name>.bdef.abdl` (source) + `<name>.bdef.json`\n * (metadata per bdef-v1.json schema).\n *\n * {\n * formatVersion: \"1\",\n * header: { description, originalLanguage, abapLanguageVersion? },\n * extendedBehaviorDefintion?: { name?: string }\n * }\n */\n\nimport { createHandler } from '../base';\nimport type { BdefAff } from '../../../schemas/generated';\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('BDEF', {\n toMetadata(obj: BdefLike): BdefAff {\n const lang = (obj.originalLanguage ?? '').toLowerCase();\n return {\n formatVersion: '1',\n header: {\n description: obj.description ?? obj.name ?? '',\n originalLanguage: lang,\n ...(obj.abapLanguageVersion\n ? { abapLanguageVersion: obj.abapLanguageVersion }\n : {}),\n },\n } as BdefAff;\n },\n\n getSource: (obj: BdefLike) =>\n typeof obj.getSource === 'function' ? obj.getSource() : '',\n\n fromMetadata: (meta: BdefAff) => ({\n name: '',\n description: meta.header.description,\n language: meta.header.originalLanguage?.toUpperCase(),\n masterLanguage: meta.header.originalLanguage?.toUpperCase(),\n }),\n});\n","/**\n * SRVD (RAP service definition) handler for gCTS / AFF format.\n *\n * Source-driven: emits `<name>.srvd.acds` (source) + `<name>.srvd.json`\n * (metadata per srvd-v1.json schema).\n *\n * {\n * formatVersion: \"1\",\n * header: { description, originalLanguage, abapLanguageVersion? },\n * generalInformation: { sourceOrigin, sourceType }\n * }\n */\n\nimport { createHandler } from '../base';\nimport type { SrvdAff } from '../../../schemas/generated';\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('SRVD', {\n toMetadata(obj: SrvdLike): SrvdAff {\n const lang = (obj.originalLanguage ?? '').toLowerCase();\n return {\n formatVersion: '1',\n header: {\n description: obj.description ?? obj.name ?? '',\n originalLanguage: lang,\n ...(obj.abapLanguageVersion\n ? { abapLanguageVersion: obj.abapLanguageVersion }\n : {}),\n },\n generalInformation: {\n sourceOrigin: obj.sourceOrigin ?? 'abapDevelopmentTools',\n sourceType: obj.sourceType ?? 'definition',\n },\n } as SrvdAff;\n },\n\n getSource: (obj: SrvdLike) =>\n typeof obj.getSource === 'function' ? obj.getSource() : '',\n\n fromMetadata: (meta: SrvdAff) => ({\n name: '',\n description: meta.header.description,\n language: meta.header.originalLanguage?.toUpperCase(),\n masterLanguage: meta.header.originalLanguage?.toUpperCase(),\n sourceOrigin: meta.generalInformation.sourceOrigin,\n sourceType: meta.generalInformation.sourceType,\n }),\n});\n","/**\n * SRVB (RAP service binding) handler for gCTS / AFF format.\n *\n * Metadata-only (no source): emits `<name>.srvb.json` only\n * (metadata per srvb-v1.json schema).\n *\n * {\n * formatVersion: \"1\",\n * header: { description, originalLanguage, abapLanguageVersion? },\n * bindingType: string (required),\n * bindingTypeCategory: \"ui\" | \"webApi\" (required),\n * services: [{ name, versions: [{ serviceVersion, serviceDefinition }] }]\n * }\n */\n\nimport { createHandler } from '../base';\nimport type { SrvbAff } from '../../../schemas/generated';\n\ntype SrvbLike = {\n name: string;\n description?: string;\n originalLanguage?: string;\n abapLanguageVersion?: string;\n bindingType?: string;\n bindingTypeCategory?: string;\n services?: Array<{\n name: string;\n versions: Array<{\n serviceVersion: string;\n serviceBuildVersion?: string;\n serviceDefinition: string;\n }>;\n }>;\n};\n\nexport const serviceBindingHandler = createHandler('SRVB', {\n toMetadata(obj: SrvbLike): SrvbAff {\n const lang = (obj.originalLanguage ?? '').toLowerCase();\n return {\n formatVersion: '1',\n header: {\n description: obj.description ?? obj.name ?? '',\n originalLanguage: lang,\n ...(obj.abapLanguageVersion\n ? { abapLanguageVersion: obj.abapLanguageVersion }\n : {}),\n },\n bindingType: obj.bindingType ?? '',\n bindingTypeCategory: (obj.bindingTypeCategory as 'ui' | 'webApi') ?? 'ui',\n services: obj.services ?? [],\n } as SrvbAff;\n },\n\n fromMetadata: (meta: SrvbAff) => ({\n name: '',\n description: meta.header.description,\n language: meta.header.originalLanguage?.toUpperCase(),\n masterLanguage: meta.header.originalLanguage?.toUpperCase(),\n bindingType: meta.bindingType,\n bindingTypeCategory: meta.bindingTypeCategory,\n services: meta.services,\n }),\n});\n","/**\n * MSAG (message class) handler for gCTS / AFF format.\n *\n * Metadata-only (no source): emits `<name>.msag.json` only\n * (metadata per msag-v1.json schema).\n *\n * {\n * formatVersion: \"1\",\n * header: { description, originalLanguage },\n * messages: [{ number?: string, text?: string }]\n * }\n */\n\nimport { createHandler } from '../base';\nimport type { MsagAff } from '../../../schemas/generated';\n\ntype MsagLike = {\n name: string;\n description?: string;\n originalLanguage?: string;\n messages?: Array<{ number?: string; text?: string }>;\n};\n\nexport const messageClassHandler = createHandler('MSAG', {\n toMetadata(obj: MsagLike): MsagAff {\n const lang = (obj.originalLanguage ?? '').toLowerCase();\n return {\n formatVersion: '1',\n header: {\n description: obj.description ?? obj.name ?? '',\n originalLanguage: lang,\n },\n messages: obj.messages ?? [],\n } as MsagAff;\n },\n\n fromMetadata: (meta: MsagAff) => ({\n name: '',\n description: meta.header.description,\n language: meta.header.originalLanguage?.toUpperCase(),\n masterLanguage: meta.header.originalLanguage?.toUpperCase(),\n messages: meta.messages,\n }),\n});\n","/**\n * Generic AFF handler stubs for the remaining object types.\n *\n * Wave 2 mass-generates handlers for all AFF types that have JSON schemas\n * but no dedicated handler. Each stub emits the minimal AFF contract:\n * { formatVersion: \"1\", header: { description, originalLanguage } }\n *\n * Type-specific fields can be added later by promoting a stub to a\n * dedicated handler file (like clas.ts, ddls.ts, etc.) when the ADK\n * object model exposes richer data for that type.\n *\n * All types here are registered via the string-type form of\n * `createHandler` — no ADK class required.\n */\n\nimport { createHandler } from '../base';\n\n/** Minimal AFF metadata shape shared by all types. */\ninterface MinimalAff {\n formatVersion: string;\n header: {\n description: string;\n originalLanguage: string;\n abapLanguageVersion?: string;\n };\n [key: string]: unknown;\n}\n\ntype GenericLike = {\n name: string;\n description?: string;\n originalLanguage?: string;\n abapLanguageVersion?: string;\n getSource?: () => Promise<string> | string;\n};\n\nfunction toMetadata(obj: GenericLike): MinimalAff {\n const lang = (obj.originalLanguage ?? '').toLowerCase();\n const meta: MinimalAff = {\n formatVersion: '1',\n header: {\n description: obj.description ?? obj.name ?? '',\n originalLanguage: lang,\n },\n };\n if (obj.abapLanguageVersion) {\n meta.header.abapLanguageVersion = obj.abapLanguageVersion;\n }\n return meta;\n}\n\nfunction fromMetadata(meta: MinimalAff) {\n return {\n name: '',\n description: meta.header.description,\n language: meta.header.originalLanguage?.toUpperCase(),\n masterLanguage: meta.header.originalLanguage?.toUpperCase(),\n };\n}\n\nfunction getSource(obj: GenericLike): string | Promise<string> {\n return typeof obj.getSource === 'function' ? obj.getSource() : '';\n}\n\n/**\n * Remaining AFF types with schemas but no dedicated handler.\n * Each is registered with the same minimal toMetadata/fromMetadata.\n */\nconst WAVE2_TYPES = [\n 'ADVC',\n 'AIFA',\n 'AIFD',\n 'AIFF',\n 'AIFI',\n 'AIFN',\n 'AIFP',\n 'AIFR',\n 'AOBJ',\n 'APIC',\n 'APLO',\n 'APOB',\n 'BGQC',\n 'CDBO',\n 'CFDF',\n 'CHDO',\n 'CHKC',\n 'CHKO',\n 'CHKV',\n 'COTA',\n 'CSNM',\n 'DCAT',\n 'DDLA',\n 'DDLX',\n 'DESD',\n 'DMON',\n 'DOBJ',\n 'DRAS',\n 'DRTY',\n 'DSFD',\n 'DSFI',\n 'DTDC',\n 'DTEB',\n 'DTIX',\n 'DTSC',\n 'EDCC',\n 'EDCK',\n 'EDCR',\n 'EDOI',\n 'EEEC',\n 'ENHO',\n 'ENHS',\n 'ENQU',\n 'EVTB',\n 'EVTO',\n 'GSMP',\n 'HTTP',\n 'ILMB',\n 'INTM',\n 'INTS',\n 'IWNG',\n 'NONT',\n 'NROB',\n 'NTTA',\n 'NTTY',\n 'RONT',\n 'RVBC',\n 'SAIA',\n 'SAJC',\n 'SAJT',\n 'SCP1',\n 'SFPF',\n 'SIAD',\n 'SITO',\n 'SMBC',\n 'SMTG',\n 'SPRV',\n 'SRVC',\n 'SUCO',\n 'SUSI',\n 'SWCR',\n 'SXTG',\n 'UIAD',\n 'UIPG',\n 'UIST',\n];\n\nfor (const type of WAVE2_TYPES) {\n createHandler<GenericLike, MinimalAff>(type, {\n toMetadata,\n getSource,\n fromMetadata,\n });\n}\n","/**\n * gCTS / AFF FormatPlugin.\n *\n * Thin adapter that plugs the gCTS handler registry into the generic\n * `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('gcts')` and never import this package directly.\n *\n * Registration happens as a side-effect of importing\n * `@abapify/adt-plugin-gcts` (`src/index.ts`).\n */\n\nimport type { FormatPlugin, FormatHandler } from '@abapify/adt-plugin';\nimport { getHandler, getSupportedTypes } from '../handlers/base';\nimport '../handlers/objects';\nimport { parseGctsFilename } from './filename';\n\nexport const gctsFormatPlugin: FormatPlugin = {\n id: 'gcts',\n description:\n 'gCTS / AFF (abap-file-formats) serialization format (JSON metadata + .abap/.acds sources)',\n\n get supportedTypes(): ReadonlyArray<string> {\n return getSupportedTypes();\n },\n\n getHandler(type: string): FormatHandler | undefined {\n return getHandler(type) as unknown as FormatHandler | undefined;\n },\n\n parseFilename(filename: string) {\n return parseGctsFilename(filename);\n },\n};\n\nexport default gctsFormatPlugin;\n","/**\n * gCTS / AFF Deserializer — disk → ADK (format.export direction).\n *\n * Reads a gCTS-shaped file tree and yields `AdkObject` instances that the\n * `CheckinService` (E08) drives through the regular diff / plan / apply\n * pipeline. This is the counterpart to the serializer implemented in\n * `gcts-plugin.ts` (SAP → disk / format.import).\n *\n * Layout (matches the writer in `gcts-plugin.ts`):\n *\n * src/<pkg-lowercased>/<obj>.<type>.json metadata (AFF JSON)\n * src/<pkg-lowercased>/<obj>.<type>[.<sfx>].abap ABAP sources (and\n * .asddls / .asdcls for\n * CDS).\n * src/<pkg-lowercased>/package.devc.json package metadata (skipped\n * — packages must exist on\n * target, same convention\n * as abapGit).\n *\n * Unlike abapGit this plugin has no `.abapgit.xml` equivalent — AFF does not\n * encode folder-logic. We therefore rely on `options.rootPackage` (or\n * leave `packageRef` unset so downstream apply logic can decide) — no\n * guesswork per directory for now. Richer directory → package mapping is\n * tracked in the E06 follow-ups.\n */\n\nimport type { FileTree, ExportOptions } from '@abapify/adt-plugin';\nimport { createAdk, type AdkObject, type AdtClient } from '@abapify/adk';\nimport { getHandler, getSupportedTypes } from './handlers/base';\nimport { parseGctsFilename, PACKAGE_FILENAME } from './format/filename';\n\n/** Source-file extensions emitted by gCTS handlers. */\nconst SOURCE_EXTENSIONS = new Set(['abap', 'asddls', 'asdcls']);\n\n/**\n * Map numeric abapLanguageVersion codes (`'5'` etc.) to the descriptive\n * string the ADT REST API expects (`'cloudDevelopment'`). Mirrors the\n * helper in `adt-plugin-abapgit` — kept local so this package does not\n * depend on its sibling.\n */\nconst ABAP_LANG_VER_TO_ADT: Record<string, string> = {\n '2': 'keyUser',\n '5': 'cloudDevelopment',\n};\n\nfunction abapLangVerToAdt(code: string | undefined): string | undefined {\n if (!code) return undefined;\n return ABAP_LANG_VER_TO_ADT[code] ?? code;\n}\n\ninterface ObjectFiles {\n name: string;\n type: string;\n metadataFile?: string;\n sourceFiles: Array<{ path: string; suffix?: string }>;\n}\n\n/**\n * Deserialise a gCTS/AFF file tree into `AdkObject` instances.\n *\n * @param fileTree Virtual FS abstraction (checkin supplies a real-fs impl).\n * @param client `AdtClient` — required by `createAdk` to build ADK objects.\n * @param options Export options. `rootPackage` is assigned as packageRef\n * to every discovered object that lacks one, mirroring the\n * abapGit behaviour when `.abapgit.xml` is absent.\n */\nexport async function* deserialize(\n fileTree: FileTree,\n client: AdtClient,\n options?: ExportOptions,\n): AsyncGenerator<AdkObject> {\n const adk = createAdk(client);\n\n // Scan every JSON file — these are the anchors for each object.\n const jsonFiles = await fileTree.glob('**/*.json');\n\n const supportedTypes = new Set(\n getSupportedTypes().map((t) => t.toLowerCase()),\n );\n\n const objectMap = new Map<string, ObjectFiles>();\n\n for (const jsonPath of jsonFiles) {\n const filename = jsonPath.split('/').pop()!;\n\n // Packages are NOT deployed (same convention as abapGit's\n // package.devc.xml) — they must exist on target.\n if (filename === PACKAGE_FILENAME) continue;\n\n const parsed = parseGctsFilename(filename);\n if (!parsed) continue;\n if (parsed.extension !== 'json') continue;\n if (!supportedTypes.has(parsed.type.toLowerCase())) continue;\n\n const key = `${parsed.name.toUpperCase()}:${parsed.type.toUpperCase()}`;\n if (!objectMap.has(key)) {\n objectMap.set(key, {\n name: parsed.name.toUpperCase(),\n type: parsed.type.toUpperCase(),\n sourceFiles: [],\n });\n }\n objectMap.get(key)!.metadataFile = jsonPath;\n }\n\n // Collect every source file (.abap/.asddls/.asdcls) and group by name:type.\n for (const ext of SOURCE_EXTENSIONS) {\n const paths = await fileTree.glob(`**/*.${ext}`);\n for (const path of paths) {\n const filename = path.split('/').pop()!;\n const parsed = parseGctsFilename(filename);\n if (!parsed) continue;\n\n const key = `${parsed.name.toUpperCase()}:${parsed.type.toUpperCase()}`;\n const obj = objectMap.get(key);\n if (!obj) continue;\n\n obj.sourceFiles.push({ path, suffix: parsed.suffix });\n }\n }\n\n for (const [, objFiles] of objectMap) {\n if (!objFiles.metadataFile) continue;\n\n const handler = getHandler(objFiles.type);\n if (!handler) continue;\n\n try {\n const raw = await fileTree.read(objFiles.metadataFile);\n // Handler schema.parse is plain JSON.parse — the parsed object IS the\n // metadata passed to fromMetadata.\n const metadata = handler.schema.parse(raw);\n\n // Read sources, mapping suffix → source key via handler map.\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: {\n name: string;\n description?: string;\n [key: string]: unknown;\n } = handler.fromAbapGit\n ? handler.fromAbapGit(metadata)\n : { name: objFiles.name };\n\n // AFF metadata frequently omits the object name (it's encoded in the\n // filename). Fall back to the filename-derived name.\n const objectName = payload.name || objFiles.name;\n const fullData = { ...payload, name: objectName };\n\n const adkType =\n typeof payload.type === 'string' ? payload.type : objFiles.type;\n const adkObject = adk.getWithData(fullData, adkType) as AdkObject;\n\n if (Object.keys(sources).length > 0) {\n if (handler.setSources) {\n handler.setSources(adkObject, sources);\n } else if (sources.main) {\n (adkObject as unknown as { _pendingSource: string })._pendingSource =\n sources.main;\n }\n }\n\n if (payload.description) {\n (\n adkObject as unknown as { _pendingDescription: string }\n )._pendingDescription = payload.description;\n }\n\n // Record relative directory (useful for future directory-based package\n // resolution). Plain metadata dir, no starting-folder normalisation —\n // gCTS does not define one.\n const sourceDir = objFiles\n .metadataFile!.split('/')\n .slice(0, -1)\n .join('/');\n (adkObject as unknown as { _relDir: string })._relDir = sourceDir;\n\n // Assign rootPackage to every object without a packageRef — no folder\n // logic available, so we cannot derive per-package assignments (see\n // E06 follow-ups). Matches abapGit's \"no .abapgit.xml\" fallback.\n if (options?.rootPackage) {\n const data = (\n adkObject as unknown as { _data?: Record<string, unknown> }\n )._data;\n if (data && !data.packageRef) {\n data.packageRef = { name: options.rootPackage };\n }\n }\n\n if (options?.abapLanguageVersion) {\n const data = (\n adkObject as unknown as { _data?: Record<string, unknown> }\n )._data;\n if (data && !data.abapLanguageVersion) {\n data.abapLanguageVersion =\n abapLangVerToAdt(options.abapLanguageVersion) ??\n options.abapLanguageVersion;\n }\n }\n\n yield adkObject;\n } catch (error) {\n // Mirrors abapGit: log and continue so one bad object does not abort\n // the whole checkin.\n console.error(\n `Failed to deserialize ${objFiles.type} ${objFiles.name}:`,\n error,\n );\n }\n }\n}\n","/**\n * gCTS AdtPlugin.\n *\n * The `FormatPlugin` in `format/gcts-format.ts` provides the declarative\n * contract (used by registry consumers); this `AdtPlugin` provides the\n * behaviour expected by `adt-cli`'s higher-level import/export services.\n *\n * SAP → disk (\"import\") serialises ADK objects to AFF JSON + source files.\n * Disk → SAP (\"export\" in adt-cli terminology — Git → SAP direction) is\n * delegated to `./deserializer.ts`, which yields AdkObjects for the\n * `CheckinService` apply pipeline (E08). Together they close the\n * round-trip that the E06 v0.1 follow-ups called out.\n */\n\nimport { mkdirSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { createPlugin, type AdtPlugin } from '@abapify/adt-plugin';\nimport type { AdtClient } from '@abapify/adk';\nimport { getHandler, getSupportedTypes, isSupported } from './handlers/base';\nimport './handlers/objects';\nimport { deserialize } from './deserializer';\n\nexport const gctsPlugin: AdtPlugin = createPlugin({\n name: 'gcts',\n version: '0.1.0',\n description: 'gCTS / AFF format plugin — JSON metadata + .abap/.acds sources',\n\n registry: {\n isSupported,\n getSupportedTypes,\n },\n\n format: {\n async import(object, targetPath, context) {\n try {\n const isPackage = object.type?.startsWith('DEVC');\n const objPackage = isPackage\n ? object.name\n : (object as { package?: string }).package || object.name || 'ROOT';\n const packagePath = await context.resolvePackagePath(objPackage);\n\n // gCTS layout: flat per-package directory under src/<package-path>/.\n // Object files live directly inside their package dir (no extra\n // per-object subdirectory — matches AFF's default \"flat\" layout).\n const packageDir = packagePath.map((p) => p.toLowerCase()).join('/');\n\n const handler = getHandler(object.type);\n if (!handler) {\n return {\n success: false,\n filesCreated: [],\n errors: [\n `No gCTS handler registered for object type: ${object.type}`,\n ],\n };\n }\n\n const files = await handler.serialize(object as unknown as never);\n const baseDir = join(targetPath, 'src', packageDir);\n mkdirSync(baseDir, { recursive: true });\n\n const written: string[] = [];\n for (const f of files) {\n const full = join(baseDir, f.path);\n mkdirSync(dirname(full), { recursive: true });\n writeFileSync(full, f.content, f.encoding ?? 'utf8');\n written.push(full);\n }\n\n return { success: true, filesCreated: written };\n } catch (error) {\n return {\n success: false,\n filesCreated: [],\n errors: [error instanceof Error ? error.message : String(error)],\n };\n }\n },\n\n // Git → SAP: deserialise a gCTS/AFF file tree into AdkObjects. The\n // apply pipeline (diff/plan/lock/save) lives in CheckinService — this\n // plugin only knows how to decode its own on-disk layout.\n export: (fileTree, client, options?) =>\n deserialize(fileTree, client as AdtClient, options),\n },\n});\n\nexport default gctsPlugin;\nexport { gctsPlugin as GctsPlugin };\n","/**\n * @abapify/adt-plugin-gcts — gCTS / AFF format plugin entry point.\n *\n * Importing this module self-registers the plugin into the global\n * `FormatPlugin` registry so that `--format gcts` becomes available\n * throughout the `adt` CLI.\n */\n\nimport { registerFormatPlugin } from '@abapify/adt-plugin';\nimport { gctsFormatPlugin } from './lib/format/gcts-format';\n\n// Self-register on module load. Idempotent — safe against dual module-graph\n// evaluation (the same guard abapGit uses).\nregisterFormatPlugin(gctsFormatPlugin);\n\n// Register 'aff' as an alias for the same plugin so `getFormatPlugin('aff')`\n// resolves to the gCTS/AFF plugin (both ids share the same on-disk layout).\nregisterFormatPlugin({ ...gctsFormatPlugin, id: 'aff' });\n\n// FormatPlugin — preferred public entry-point.\nexport { gctsFormatPlugin } from './lib/format/gcts-format';\n\n// AdtPlugin — needed for dynamic-import code paths in adt-cli.\nexport { gctsPlugin, GctsPlugin } from './lib/gcts-plugin';\nexport { gctsPlugin as default } from './lib/gcts-plugin';\n\n// Handler utilities\nexport {\n getHandler,\n getSupportedTypes,\n isSupported,\n createHandler,\n} from './lib/handlers/base';\nexport type {\n GctsHandler,\n GctsHandlerDefinition,\n GctsSourceEntry,\n} from './lib/handlers/base';\n\n// Filename utilities\nexport {\n gctsFilename,\n parseGctsFilename,\n adtUriToGctsPath,\n PACKAGE_FILENAME,\n METADATA_EXTENSION,\n} from './lib/format/filename';\n\n// Type re-exports\nexport type { GctsMetadata, GctsHeader, WithHeader } from './lib/format/types';\nexport type {\n AdtPlugin,\n FormatPlugin,\n FormatHandler,\n SerializedFile,\n} from '@abapify/adt-plugin';\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@abapify/adt-plugin-gcts",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.3",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -18,8 +18,11 @@
|
|
|
18
18
|
"dist"
|
|
19
19
|
],
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@abapify/adk": "0.4.
|
|
22
|
-
"@abapify/adt-plugin": "0.4.
|
|
21
|
+
"@abapify/adk": "0.4.3",
|
|
22
|
+
"@abapify/adt-plugin": "0.4.3"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"json-schema-to-typescript": "15.0.4"
|
|
23
26
|
},
|
|
24
27
|
"repository": {
|
|
25
28
|
"type": "git",
|