@abapify/adt-plugin-gcts 0.4.17 → 0.4.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +0 -10
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +22 -44
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
package/dist/index.d.mts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { AdtPlugin, AdtPlugin as AdtPlugin$1, FormatHandler, FormatHandler as FormatHandler$1, FormatPlugin, FormatPlugin as FormatPlugin$1, ParsedFormatFilename, SerializedFile, SerializedFile as SerializedFile$1 } from "@abapify/adt-plugin";
|
|
2
2
|
import { AdkClass, AdkDataElement, AdkDomain, AdkFunctionGroup, AdkInterface, AdkKind, AdkObject, AdkPackage, AdkProgram, AdkTable, AdkTableType } from "@abapify/adk";
|
|
3
|
-
//#region src/lib/format/types.d.ts
|
|
4
3
|
/**
|
|
5
4
|
* gCTS / AFF format type definitions.
|
|
6
5
|
*
|
|
@@ -41,8 +40,6 @@ interface GctsMetadata<_TPayload extends object = object> {
|
|
|
41
40
|
type WithHeader<TPayload extends object> = {
|
|
42
41
|
header: GctsHeader;
|
|
43
42
|
} & TPayload;
|
|
44
|
-
//#endregion
|
|
45
|
-
//#region src/lib/format/filename.d.ts
|
|
46
43
|
/** Metadata extension for all AFF/gCTS objects. */
|
|
47
44
|
declare const METADATA_EXTENSION = "json";
|
|
48
45
|
/** Fixed filename for package metadata (AFF / gCTS convention). */
|
|
@@ -70,8 +67,6 @@ declare function parseGctsFilename(filename: string): ParsedFormatFilename | und
|
|
|
70
67
|
* Matches the `adtUriToAbapGitPath` helper in the abapGit plugin.
|
|
71
68
|
*/
|
|
72
69
|
declare function adtUriToGctsPath(uri: string): string | undefined;
|
|
73
|
-
//#endregion
|
|
74
|
-
//#region src/lib/handlers/base.d.ts
|
|
75
70
|
type AbapObjectType = string;
|
|
76
71
|
type AdkObjectClass<T extends AdkObject = AdkObject> = {
|
|
77
72
|
new (...args: any[]): T;
|
|
@@ -155,12 +150,7 @@ declare function getSupportedTypes(): AbapObjectType[];
|
|
|
155
150
|
*/
|
|
156
151
|
declare function createHandler<T extends AdkObject, M extends GctsMetadata = GctsMetadata>(adkClass: AdkObjectClass<T>, definition: GctsHandlerDefinition<T, M>): GctsHandler<T>;
|
|
157
152
|
declare function createHandler<T extends AdkObject, M extends GctsMetadata = GctsMetadata>(type: AbapObjectType, definition: GctsHandlerDefinition<T, M>): GctsHandler<T>;
|
|
158
|
-
//#endregion
|
|
159
|
-
//#region src/lib/format/gcts-format.d.ts
|
|
160
153
|
declare const gctsFormatPlugin: FormatPlugin$1;
|
|
161
|
-
//#endregion
|
|
162
|
-
//#region src/lib/gcts-plugin.d.ts
|
|
163
154
|
declare const gctsPlugin: AdtPlugin$1;
|
|
164
|
-
//#endregion
|
|
165
155
|
export { type AdtPlugin, type FormatHandler, type FormatPlugin, type GctsHandler, type GctsHandlerDefinition, type GctsHeader, type GctsMetadata, gctsPlugin as GctsPlugin, gctsPlugin as default, gctsPlugin, type GctsSourceEntry, METADATA_EXTENSION, PACKAGE_FILENAME, type SerializedFile, type WithHeader, adtUriToGctsPath, createHandler, gctsFilename, gctsFormatPlugin, getHandler, getSupportedTypes, isSupported, parseGctsFilename };
|
|
166
156
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/lib/format/types.ts","../src/lib/format/filename.ts","../src/lib/handlers/base.ts","../src/lib/format/gcts-format.ts","../src/lib/gcts-plugin.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":["SerializedFile","FormatHandler","FormatPlugin","AdtPlugin"],"sources":["../src/lib/format/types.ts","../src/lib/format/filename.ts","../src/lib/handlers/base.ts","../src/lib/format/gcts-format.ts","../src/lib/gcts-plugin.ts"],"mappings":";;;;;;;;;;;;;;;UAciB;;EAEf;;EAEA;;EAEA;;EAEA;;GAEC;;;;;;;UAQc,aAAa;;EAE5B,QAAQ;;GAEP;;;KAIS,WAAW;EACrB,QAAQ;IACN;;cCNS;;cAGA;;;;;;;;;iBAUG,aACd,cACA,cACA,8BACA;;;;;;;iBAmBc,kBACd,mBACC;;;;;;;iBAwEa,iBAAiB;KC9HrB;KAEA,eAAe,UAAU,YAAY;UACvC,cAAc;WACb,MAAM;;;;;;;;UASA;EACf;EACA,kBAAkB,kCAAkC;;;;;;;UAQrC;EACf;EACA,kBAAkB,kCAAkC;;;;;;;;;;UAWrC,sBACf,UAAU,WACV,UAAU,eAAe;;EAGzB,WAAW,QAAQ,IAAI;;EAGvB,WAAW,QAAQ,aAAa;;EAGhC,YAAY,QAAQ,IAAI;;EAGxB,eAAe,QAAQ,IAAI,kBAAkB,QAAQ;;EAGrD,8BAA8B,QAAQ;;;;;;;;EAStC,cAAc,UAAU;IAAM;MAAiB;EAC/C,oBAAoB;EACpB,YAAY,QAAQ,GAAG,SAAS;;;UAIjB,YACf,UAAU,YAAY,mBACdC;WACC,MAAM;WACN;WACA;IACP,MAAM;IACN,MAAM;;EAER,UAAU,QAAQ,IAAI,QAAQD;EAC9B,aAAa;IAAoB;MAAiB;EAClD,YAAY,QAAQ,GAAG,SAAS;;;iBAMlB,WAAW,MAAM,iBAAiB;;iBAKlC,YAAY,MAAM;;iBAKlB,qBAAqB;;;;;;iBAsBrB,cACd,UAAU,WACV,UAAU,eAAe,cAEzB,UAAU,eAAe,IACzB,YAAY,sBAAsB,GAAG,KACpC,YAAY;iBACC,cACd,UAAU,WACV,UAAU,eAAe,cAEzB,MAAM,gBACN,YAAY,sBAAsB,GAAG,KACpC,YAAY;cCpIF,kBAAkBE;cCIlB,YAAYC"}
|
package/dist/index.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import { AdkClass, AdkDataElement, AdkDomain, AdkFunctionGroup, AdkInterface, Ad
|
|
|
3
3
|
import { mkdirSync, writeFileSync } from "node:fs";
|
|
4
4
|
import { dirname, join } from "node:path";
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
// src/lib/format/filename.ts
|
|
7
7
|
/**
|
|
8
8
|
* Extension used for the source-file part of each object type.
|
|
9
9
|
*
|
|
@@ -118,8 +118,7 @@ function mainType(type) {
|
|
|
118
118
|
return type.split("/")[0];
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
|
|
122
|
-
//#region src/lib/handlers/base.ts
|
|
121
|
+
// src/lib/handlers/base.ts
|
|
123
122
|
const handlerRegistry = /* @__PURE__ */ new Map();
|
|
124
123
|
/** Look up a handler (full-type first, then main-type fallback). */
|
|
125
124
|
function getHandler(type) {
|
|
@@ -205,8 +204,7 @@ function createHandler(adkClassOrType, definition) {
|
|
|
205
204
|
return handler;
|
|
206
205
|
}
|
|
207
206
|
|
|
208
|
-
|
|
209
|
-
//#region src/lib/handlers/objects/clas.ts
|
|
207
|
+
// src/lib/handlers/objects/clas.ts
|
|
210
208
|
/**
|
|
211
209
|
* CLAS handler for gCTS / AFF format.
|
|
212
210
|
*
|
|
@@ -293,8 +291,7 @@ const classHandler = createHandler(AdkClass, {
|
|
|
293
291
|
}
|
|
294
292
|
});
|
|
295
293
|
|
|
296
|
-
|
|
297
|
-
//#region src/lib/handlers/objects/intf.ts
|
|
294
|
+
// src/lib/handlers/objects/intf.ts
|
|
298
295
|
/**
|
|
299
296
|
* INTF handler for gCTS / AFF format.
|
|
300
297
|
*
|
|
@@ -335,8 +332,7 @@ const interfaceHandler = createHandler(AdkInterface, {
|
|
|
335
332
|
}
|
|
336
333
|
});
|
|
337
334
|
|
|
338
|
-
|
|
339
|
-
//#region src/lib/handlers/objects/prog.ts
|
|
335
|
+
// src/lib/handlers/objects/prog.ts
|
|
340
336
|
/**
|
|
341
337
|
* PROG handler for gCTS / AFF format.
|
|
342
338
|
*
|
|
@@ -392,8 +388,7 @@ const programHandler = createHandler(AdkProgram, {
|
|
|
392
388
|
}
|
|
393
389
|
});
|
|
394
390
|
|
|
395
|
-
|
|
396
|
-
//#region src/lib/handlers/objects/devc.ts
|
|
391
|
+
// src/lib/handlers/objects/devc.ts
|
|
397
392
|
/**
|
|
398
393
|
* DEVC (package) handler for gCTS / AFF format.
|
|
399
394
|
*
|
|
@@ -430,8 +425,7 @@ const packageHandler = createHandler(AdkPackage, {
|
|
|
430
425
|
})
|
|
431
426
|
});
|
|
432
427
|
|
|
433
|
-
|
|
434
|
-
//#region src/lib/handlers/objects/doma.ts
|
|
428
|
+
// src/lib/handlers/objects/doma.ts
|
|
435
429
|
/**
|
|
436
430
|
* DOMA (domain) handler for gCTS / AFF format.
|
|
437
431
|
*
|
|
@@ -498,8 +492,7 @@ const domainHandler = createHandler(AdkDomain, {
|
|
|
498
492
|
}
|
|
499
493
|
});
|
|
500
494
|
|
|
501
|
-
|
|
502
|
-
//#region src/lib/handlers/objects/dtel.ts
|
|
495
|
+
// src/lib/handlers/objects/dtel.ts
|
|
503
496
|
/**
|
|
504
497
|
* DTEL (data element) handler for gCTS / AFF format.
|
|
505
498
|
*
|
|
@@ -599,8 +592,7 @@ const dataElementHandler = createHandler(AdkDataElement, {
|
|
|
599
592
|
}
|
|
600
593
|
});
|
|
601
594
|
|
|
602
|
-
|
|
603
|
-
//#region src/lib/handlers/objects/tabl.ts
|
|
595
|
+
// src/lib/handlers/objects/tabl.ts
|
|
604
596
|
/**
|
|
605
597
|
* TABL (table / structure) handler for gCTS / AFF format.
|
|
606
598
|
*
|
|
@@ -637,8 +629,7 @@ const tableHandler = createHandler(AdkTable, {
|
|
|
637
629
|
})
|
|
638
630
|
});
|
|
639
631
|
|
|
640
|
-
|
|
641
|
-
//#region src/lib/handlers/objects/ttyp.ts
|
|
632
|
+
// src/lib/handlers/objects/ttyp.ts
|
|
642
633
|
/**
|
|
643
634
|
* TTYP (table type) handler for gCTS / AFF format.
|
|
644
635
|
*
|
|
@@ -670,8 +661,7 @@ const tableTypeHandler = createHandler(AdkTableType, {
|
|
|
670
661
|
})
|
|
671
662
|
});
|
|
672
663
|
|
|
673
|
-
|
|
674
|
-
//#region src/lib/handlers/objects/fugr.ts
|
|
664
|
+
// src/lib/handlers/objects/fugr.ts
|
|
675
665
|
/**
|
|
676
666
|
* FUGR (function group) handler for gCTS / AFF format.
|
|
677
667
|
*
|
|
@@ -738,8 +728,7 @@ const functionGroupHandler = createHandler(AdkFunctionGroup, {
|
|
|
738
728
|
})
|
|
739
729
|
});
|
|
740
730
|
|
|
741
|
-
|
|
742
|
-
//#region src/lib/handlers/objects/ddls.ts
|
|
731
|
+
// src/lib/handlers/objects/ddls.ts
|
|
743
732
|
/**
|
|
744
733
|
* DDLS (CDS view) handler for gCTS / AFF format.
|
|
745
734
|
*
|
|
@@ -779,8 +768,7 @@ const ddlSourceHandler = createHandler("DDLS", {
|
|
|
779
768
|
})
|
|
780
769
|
});
|
|
781
770
|
|
|
782
|
-
|
|
783
|
-
//#region src/lib/handlers/objects/dcls.ts
|
|
771
|
+
// src/lib/handlers/objects/dcls.ts
|
|
784
772
|
/**
|
|
785
773
|
* DCLS (CDS access control) handler for gCTS / AFF format.
|
|
786
774
|
*
|
|
@@ -813,8 +801,7 @@ const dclSourceHandler = createHandler("DCLS", {
|
|
|
813
801
|
})
|
|
814
802
|
});
|
|
815
803
|
|
|
816
|
-
|
|
817
|
-
//#region src/lib/handlers/objects/bdef.ts
|
|
804
|
+
// src/lib/handlers/objects/bdef.ts
|
|
818
805
|
/**
|
|
819
806
|
* BDEF (RAP behavior definition) handler for gCTS / AFF format.
|
|
820
807
|
*
|
|
@@ -848,8 +835,7 @@ const behaviorDefinitionHandler = createHandler("BDEF", {
|
|
|
848
835
|
})
|
|
849
836
|
});
|
|
850
837
|
|
|
851
|
-
|
|
852
|
-
//#region src/lib/handlers/objects/srvd.ts
|
|
838
|
+
// src/lib/handlers/objects/srvd.ts
|
|
853
839
|
/**
|
|
854
840
|
* SRVD (RAP service definition) handler for gCTS / AFF format.
|
|
855
841
|
*
|
|
@@ -889,8 +875,7 @@ const serviceDefinitionHandler = createHandler("SRVD", {
|
|
|
889
875
|
})
|
|
890
876
|
});
|
|
891
877
|
|
|
892
|
-
|
|
893
|
-
//#region src/lib/handlers/objects/srvb.ts
|
|
878
|
+
// src/lib/handlers/objects/srvb.ts
|
|
894
879
|
/**
|
|
895
880
|
* SRVB (RAP service binding) handler for gCTS / AFF format.
|
|
896
881
|
*
|
|
@@ -931,8 +916,7 @@ const serviceBindingHandler = createHandler("SRVB", {
|
|
|
931
916
|
})
|
|
932
917
|
});
|
|
933
918
|
|
|
934
|
-
|
|
935
|
-
//#region src/lib/handlers/objects/msag.ts
|
|
919
|
+
// src/lib/handlers/objects/msag.ts
|
|
936
920
|
/**
|
|
937
921
|
* MSAG (message class) handler for gCTS / AFF format.
|
|
938
922
|
*
|
|
@@ -966,8 +950,7 @@ const messageClassHandler = createHandler("MSAG", {
|
|
|
966
950
|
})
|
|
967
951
|
});
|
|
968
952
|
|
|
969
|
-
|
|
970
|
-
//#region src/lib/handlers/objects/wave2-generic.ts
|
|
953
|
+
// src/lib/handlers/objects/wave2-generic.ts
|
|
971
954
|
/**
|
|
972
955
|
* Generic AFF handler stubs for the remaining object types.
|
|
973
956
|
*
|
|
@@ -1087,8 +1070,7 @@ for (const type of [
|
|
|
1087
1070
|
fromMetadata
|
|
1088
1071
|
});
|
|
1089
1072
|
|
|
1090
|
-
|
|
1091
|
-
//#region src/lib/format/gcts-format.ts
|
|
1073
|
+
// src/lib/format/gcts-format.ts
|
|
1092
1074
|
const gctsFormatPlugin = {
|
|
1093
1075
|
id: "gcts",
|
|
1094
1076
|
description: "gCTS / AFF (abap-file-formats) serialization format (JSON metadata + .abap/.acds sources)",
|
|
@@ -1103,8 +1085,7 @@ const gctsFormatPlugin = {
|
|
|
1103
1085
|
}
|
|
1104
1086
|
};
|
|
1105
1087
|
|
|
1106
|
-
|
|
1107
|
-
//#region src/lib/deserializer.ts
|
|
1088
|
+
// src/lib/deserializer.ts
|
|
1108
1089
|
/** Source-file extensions emitted by gCTS handlers. */
|
|
1109
1090
|
const SOURCE_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
1110
1091
|
"abap",
|
|
@@ -1211,8 +1192,7 @@ async function* deserialize(fileTree, client, options) {
|
|
|
1211
1192
|
}
|
|
1212
1193
|
}
|
|
1213
1194
|
|
|
1214
|
-
|
|
1215
|
-
//#region src/lib/gcts-plugin.ts
|
|
1195
|
+
// src/lib/gcts-plugin.ts
|
|
1216
1196
|
/**
|
|
1217
1197
|
* gCTS AdtPlugin.
|
|
1218
1198
|
*
|
|
@@ -1271,8 +1251,7 @@ const gctsPlugin = createPlugin({
|
|
|
1271
1251
|
}
|
|
1272
1252
|
});
|
|
1273
1253
|
|
|
1274
|
-
|
|
1275
|
-
//#region src/index.ts
|
|
1254
|
+
// src/index.ts
|
|
1276
1255
|
/**
|
|
1277
1256
|
* @abapify/adt-plugin-gcts — gCTS / AFF format plugin entry point.
|
|
1278
1257
|
*
|
|
@@ -1286,6 +1265,5 @@ registerFormatPlugin({
|
|
|
1286
1265
|
id: "aff"
|
|
1287
1266
|
});
|
|
1288
1267
|
|
|
1289
|
-
//#endregion
|
|
1290
1268
|
export { gctsPlugin as GctsPlugin, gctsPlugin as default, gctsPlugin, METADATA_EXTENSION, PACKAGE_FILENAME, adtUriToGctsPath, createHandler, gctsFilename, gctsFormatPlugin, getHandler, getSupportedTypes, isSupported, parseGctsFilename };
|
|
1291
1269
|
//# sourceMappingURL=index.mjs.map
|
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/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":";;;;;;;;;;;;AAuBA,MAAM,qBAA6C;CACjD,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;AACR;;AAGA,MAAa,qBAAqB;;AAGlC,MAAa,mBAAmB;;;;;;;;;AAUhC,SAAgB,aACd,MACA,MACA,OAA8B,YAC9B,QACQ;CACR,MAAM,OAAO,KAAK,YAAY;CAC9B,MAAM,YAAY,SAAS,IAAI,CAAC,CAAC,YAAY;CAC7C,IAAI,SAAS,YACX,OAAO,GAAG,KAAK,GAAG,UAAU,GAAG;CAEjC,MAAM,MAAM,mBAAmB,SAAS,IAAI,CAAC,CAAC,YAAY,MAAM;CAChE,OAAO,SACH,GAAG,KAAK,GAAG,UAAU,GAAG,OAAO,GAAG,QAClC,GAAG,KAAK,GAAG,UAAU,GAAG;AAC9B;;;;;;;AAQA,SAAgB,kBACd,UACkC;CAElC,IAAI,kCACF,OAAO;EACL,MAAM;EACN,MAAM;EACN,WAAW;CACb;CAGF,MAAM,QAAQ,SAAS,MAAM,GAAG;CAChC,IAAI,MAAM,SAAS,GACjB;CAGF,MAAM,YAAY,MAAM,GAAG,EAAE;CAE7B,MAAM,aADc,MAAM,UAAU,IAAI,MAAM,GAAG,EAAE,IAAI,UACvB,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM,MAAM,GAAG,EAAE;CAEtE,IAAI,UAAU,WAAW,GACvB;CAMF,IAAI,sBACF,OAAO;EACL,MAAM,UAAU,WAAW,IAAI,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG;EAC/D,MAAM,MAAM,GAAG,EAAE,CAAC,CAAE,YAAY;EAChC;CACF;CAYF,IAAI,kBAAC,IARuB,IAAI;EAC9B;EACA;EACA;EACA;EACA;EACA;CACF,CACmB,EAAC,CAAC,IAAI,SAAS,GAChC;CAMF,IAAI,MAAM,UAAU,GAClB,OAAO;EACL,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG;EACjC,MAAM,MAAM,GAAG,EAAE,CAAC,CAAE,YAAY;EAChC,QAAQ,MAAM,GAAG,EAAE;EACnB;CACF;CAGF,OAAO;EACL,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG;EACjC,MAAM,MAAM,GAAG,EAAE,CAAC,CAAE,YAAY;EAChC;CACF;AACF;;;;;;;AAQA,SAAgB,iBAAiB,KAAiC;CAEhE,IAAI,CAAC,IAAI,WAAW,cAAU,GAAG,OAAO;CACxC,MAAM,OAAO,IAAI,MAAM,EAAiB;CACxC,IAAI,KAAK,WAAW,GAAG,OAAO;CAkB9B,KAAK,MAAM,CAAC,SAAS,SAAS;EAd5B,CAAC,0BAA0B,MAAM;EACjC,CAAC,6BAA6B,MAAM;EACpC,CAAC,iCAAiC,MAAM;EACxC,CAAC,gCAAgC,MAAM;EACvC,CAAC,uBAAuB,MAAM;EAC9B,CAAC,4BAA4B,MAAM;EACnC,CAAC,iCAAiC,MAAM;EACxC,CAAC,+BAA+B,MAAM;EACtC,CAAC,2BAA2B,MAAM;EAClC,CAAC,+BAA+B,MAAM;EACtC,CAAC,iCAAiC,MAAM;EACxC,CAAC,iCAAiC,MAAM;CAGR,GAAG;EACnC,MAAM,IAAI,QAAQ,KAAK,IAAI;EAC3B,IAAI,GAAG;GACL,MAAM,OAAO,EAAE;GACf,IAAI,SAAS,QAAQ,OAAO,GAAG,KAAK,YAAY,EAAE,GAAG;GACrD,OAAO,GAAG,KAAK,YAAY,EAAE,GAAG,aAAa,MAAM,IAAI;EACzD;CACF;AAGF;AAEA,SAAS,SAAS,MAAsB;CACtC,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC;AACzB;;;;AChFA,MAAM,kCAAkB,IAAI,IAAiC;;AAG7D,SAAgB,WAAW,MAA+C;CACxE,OAAO,gBAAgB,IAAI,IAAI,KAAK,gBAAgB,IAAI,YAAY,IAAI,CAAC;AAC3E;;AAGA,SAAgB,YAAY,MAA+B;CACzD,OAAO,gBAAgB,IAAI,IAAI,KAAK,gBAAgB,IAAI,YAAY,IAAI,CAAC;AAC3E;;AAGA,SAAgB,oBAAsC;CACpD,OAAO,CAAC,GAAG,gBAAgB,KAAK,CAAC;AACnC;;;;;AAWA,SAAS,kBAAkB,MAA4B;CACrD,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;AACzC;AAqBA,SAAgB,cAId,gBACA,YACgB;CAChB,IAAI;CACJ,IAAI,OAAO,mBAAmB,UAC5B,OAAO;MACF;EACL,MAAM,OAAO,eAAe;EAC5B,MAAM,UAAU,eAAe,IAAI;EACnC,IAAI,CAAC,SACH,MAAM,IAAI,MACR,qBAAqB,KAAK,qDAC5B;EAEF,OAAO;CACT;CAEA,MAAM,gBAAgB,YAAY,IAAI,CAAC,CAAC,YAAY;CAEpD,eAAe,cAAc,OAAyC;EAGpE,OAAO,OADL,OAAO,MAAM,YAAY,aAAa,MAAM,QAAQ,IAAI,MAAM;CAElE;CAEA,MAAM,UAA0B;EAC9B;EACA;EAEA,QAAQ;GACN,QAAQ,QAAgB,KAAK,MAAM,GAAG;GACtC,QAAQ,SAAkB,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;EAC5D;EACA,mBAAmB,WAAW;EAC9B,MAAM,UAAU,QAAsC;GACpD,MAAM,QAA0B,CAAC;GACjC,MAAM,cAAc,OAAO,QAAQ,GAAE,CAAE,YAAY;GAGnD,IAAI,WAAW,YACb,KAAK,MAAM,SAAS,WAAW,WAAW,MAAM,GAAG;IACjD,MAAM,UAAU,MAAM,cAAc,KAAK;IACzC,IAAI,CAAC,SAAS;IACd,MAAM,KAAK;KACT,MAAM,aAAa,YAAY,MAAM,UAAU,MAAM,MAAM;KAC3D;IACF,CAAC;GACH;QACK,IAAI,WAAW,WAAW;IAC/B,MAAM,UAAU,MAAM,WAAW,UAAU,MAAM;IACjD,IAAI,SACF,MAAM,KAAK;KACT,MAAM,aAAa,YAAY,MAAM,QAAQ;KAC7C;IACF,CAAC;GAEL;GAGA,MAAM,WAAW,WAAW,WAAW,MAAM;GAC7C,MAAM,eACJ,OAAO,WAAW,qBAAqB,aACnC,WAAW,iBAAiB,MAAM,IACjC,WAAW,oBACZ,aAAa,YAAY,MAAM,UAAU;GAC/C,MAAM,KAAK;IACT,MAAM;IACN,SAAS,kBAAkB,QAAQ;GACrC,CAAC;GAGD,IAAI,WAAW,eAAe;IAC5B,MAAM,SAAS,MAAM,WAAW,cAAc,MAAM;IACpD,KAAK,MAAM,SAAS,QAAQ;KAC1B,MAAM,UAAU,MAAM,cAAc,KAAK;KACzC,IAAI,CAAC,SAAS;KACd,MAAM,KAAK;MAAE,MAAM,MAAM;MAAM;KAAQ,CAAC;IAC1C;GACF;GAEA,OAAO;EACT;EACA,aAAa,WAAW,gBACnB,WACC,WAAW,aAAc,MAAW,IAItC;EACJ,YAAY,WAAW;CACzB;CAEA,gBAAgB,IAAI,MAAM,OAAsB;CAChD,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;AChOA,MAAM,SAAuD;CAC3D,MAAM;CACN,aAAa;CACb,iBAAiB;CACjB,YAAY;CACZ,QAAQ;CACR,aAAa;AACf;AAEA,MAAM,uBAAuB,OAAO,YAClC,OAAO,QAAQ,MAAM,CAAC,CACnB,QAAQ,GAAG,OAAO,MAAM,MAAS,CAAC,CAClC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAC3B;;;;;AAMA,MAAM,kBAA0C;CAC9C,mBAAmB;CACnB,WAAW;CACX,WAAW;CACX,cAAc;CACd,oBAAoB;CACpB,iBAAiB;CACjB,cAAc;CACd,eAAe;CACf,8BAA8B;CAC9B,gBAAgB;CAChB,WAAW;CACX,UAAU;AACZ;AAEA,MAAM,oBAA4C,OAAO,YACvD,OAAO,QAAQ,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CACxD;AAEA,MAAa,eAAe,cAAc,UAAU;CAClD,mBAAmB;CAEnB,WAAW,KAAc;EACvB,MAAM,OAAO,IAAI;EACjB,MAAM,QAAQ,KAAK,YAAY,KAAK,kBAAkB,GAAE,CAAE,YAAY;EACtE,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe,KAAK,eAAe;IACpD,kBAAkB;IAClB,GAAI,KAAK,uBAAuB,KAAK,wBAAwB,aACzD,EACE,qBACE,KAAK,oBACT,IACA,CAAC;GACP;GACA,GAAI,KAAK,WACL,EACE,UAAW,gBAAgB,KAAK,aAC9B,oBACJ,IACA,CAAC;GACL,GAAI,OAAO,KAAK,uBAAuB,YACnC,EAAE,oBAAoB,KAAK,mBAAmB,IAC9C,CAAC;EACP;CACF;CAEA,aAAa,QAAQ;EAEnB,QADiB,IAAI,SAAS,WAAW,CAAC,EAC3B,CAAC,KAAK,SAAS;GAC5B,QAAQ,OAAO,OAAO,IAAI,eAAe,MAAM;GAC/C,eACE,IAAI,iBACF,OAAO,IAAI,eAAe,MAAM,CAClC;EACJ,EAAE;CACJ;CAEA,eAAe,UAAmB;EAChC,MAAM;EACN,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,UAAU,KAAK,WACV,kBAAkB,KAAK,aAAa,KAAK,WAC1C;EACJ,qBAAqB,KAAK,OAAO;EACjC,oBAAoB,KAAK;CAC3B;CAEA,aAAa,KAAK,YAAY;EAC5B,AACE,IACA,kBAAkB;EACpB,IAAI,QAAQ,MACV,AAAC,IAA8C,iBAC7C,QAAQ;CAEd;AACF,CAAC;;;;;;;;;;;;;;;;;AC5GD,MAAa,mBAAmB,cAAc,cAAc;CAC1D,WAAW,MAAe;EACxB,MAAM,OAAO,KAAK;EAClB,MAAM,QAAQ,KAAK,YAAY,KAAK,kBAAkB,GAAE,CAAE,YAAY;EACtE,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,KAAK,eAAe,KAAK,eAAe;IACrD,kBAAkB;IAClB,GAAI,KAAK,uBAAuB,KAAK,wBAAwB,aACzD,EACE,qBACE,KAAK,oBACT,IACA,CAAC;GACP;EACF;CACF;CAEA,YAAY,QAAQ,IAAI,UAAU;CAElC,eAAe,UAAmB;EAChC,MAAM;EACN,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,qBAAqB,KAAK,OAAO;CACnC;CAEA,aAAa,MAAM,YAAY;EAC7B,IAAI,QAAQ,MACV,AAAC,KAA+C,iBAC9C,QAAQ;CAEd;AACF,CAAC;;;;;;;;;;;;;;;;ACrCD,MAAM,gBAAwC;CAC5C,uBAAuB;CACvB,oBAAoB;CACpB,QAAQ;CACR,MAAM;AACR;AAEA,MAAM,kBAA0C,OAAO,YACrD,OAAO,QAAQ,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CACtD;AAEA,MAAa,iBAAiB,cAAc,YAAY;CACtD,WAAW,MAAe;EACxB,MAAM,OAAO,KAAK;EAClB,MAAM,QAAQ,KAAK,YAAY,KAAK,kBAAkB,GAAE,CAAE,YAAY;EACtE,MAAM,qBAA8C;GAClD,aAAc,KAAK,eACjB;GACF,eAAgB,cAAc,KAAK,sBAAsB,OACvD;EACJ;EACA,IAAI,OAAO,KAAK,uBAAuB,WACrC,mBAAmB,qBAAqB,KAAK;EAE/C,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,KAAK,eAAe,KAAK,eAAe;IACrD,kBAAkB;IAClB,GAAI,KAAK,uBAAuB,KAAK,wBAAwB,aACzD,EACE,qBACE,KAAK,oBACT,IACA,CAAC;GACP;GACoB;EACtB;CACF;CAEA,YAAY,QAAQ,IAAI,UAAU;CAElC,eAAe,UAAmB;EAChC,MAAM;EACN,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,aAAa,KAAK,oBAAoB;EACtC,oBAAoB,KAAK,oBAAoB,gBACzC,gBAAgB,KAAK,mBAAmB,iBACxC;EACJ,oBAAoB,KAAK,oBAAoB;EAC7C,qBAAqB,KAAK,OAAO;CACnC;CAEA,aAAa,MAAM,YAAY;EAC7B,IAAI,QAAQ,MACV,AAAC,KAA+C,iBAC9C,QAAQ;CAEd;AACF,CAAC;;;;;;;;;;;;;;AClED,MAAa,iBAAiB,cAAc,YAAY;CACtD,kBAAkB;CAElB,WAAW,KAAK;EACd,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe;IAChC,mBACE,IAAI,UAAU,YACd,IAAI,UAAU,kBACd,GAAE,CACF,YAAY;IACd,GAAI,IAAI,UAAU,uBAClB,IAAI,SAAS,wBAAwB,aACjC,EAAE,qBAAqB,IAAI,SAAS,oBAAoB,IACxD,CAAC;GACP;GACA,SAAS;IAEP,mBAAmB,IAAI,UAAU,WAAW,mBAAmB;IAC/D,sBAAsB,IAAI,UAAU,sBAAsB;IAC1D,aAAa,IAAI,UAAU,YAAY;GACzC;EACF;CACF;CAEA,eAAe,UAAe;EAC5B,MAAM;EACN,aAAa,MAAM,QAAQ;EAC3B,UAAU,MAAM,QAAQ,kBAAkB,YAAY;EACtD,gBAAgB,MAAM,QAAQ,kBAAkB,YAAY;EAC5D,qBAAqB,MAAM,QAAQ;CACrC;AACF,CAAC;;;;;;;;;;;;;;;;;AC7BD,MAAa,gBAAgB,cAAc,WAAW;CACpD,WAAW,MAAe;EACxB,MAAM,OAAO,KAAK;EAClB,MAAM,UAAW,KAAK,WAAW,CAAC;EAClC,MAAM,QACH,KAAK,YACL,KAAK,kBACN,GAAE,CACF,YAAY;EACd,MAAM,KAAM,QAAQ,mBAAmB,CAAC;EACxC,MAAM,KAAM,QAAQ,qBAAqB,CAAC;EAC1C,MAAM,KAAM,QAAQ,oBAAoB,CAAC;EAEzC,MAAM,SAAkC;GACtC,UAAU,GAAG,YAAY;GACzB,QAAQ,GAAG,UAAU;EACvB;EACA,IAAI,OAAO,GAAG,aAAa,UACzB,OAAO,WAAW,GAAG;EAGvB,MAAM,SAAkC;GACtC,eAAe;GACf,QAAQ;IACN,aAAa,KAAK,eAAe;IACjC,kBAAkB;GACpB;GACQ;EACV;EAGA,MAAM,WAAoC,CAAC;EAC3C,IAAI,OAAO,GAAG,WAAW,UAAU,SAAS,SAAS,GAAG;EACxD,IAAI,OAAO,GAAG,cAAc,WAC1B,SAAS,gBAAgB,CAAC,GAAG;EAC/B,IAAI,GAAG,gBAAgB,SAAS,oBAAoB,GAAG;EACvD,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC,SAAS,GACjC,OAAO,wBAAwB;EAIjC,MAAM,QAAS,GAAG,iBAAiB,CAAC;EACpC,IAAI,MAAM,MACR,OAAO,aAAa,EAAE,MAAM,MAAM,KAAK;EAGzC,OAAO;CACT;CAEA,eAAe,SAAkB;EAC/B,MAAM,SAAkC;GACtC,MAAM;GACN,aAAa,KAAK,OAAO;GACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;GACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC5D;EACA,MAAM,UAAmC,EACvC,iBAAiB;GACf,UAAU,KAAK,OAAO;GACtB,QAAQ,KAAK,OAAO;GACpB,UAAU,KAAK,OAAO,YAAY;EACpC,EACF;EACA,IAAI,KAAK,uBACP,QAAQ,oBAAoB;GAC1B,QAAQ,KAAK,sBAAsB;GACnC,WAAW,KAAK,sBAAsB,gBAAgB,QAAQ;GAC9D,gBAAgB,KAAK,sBAAsB;EAC7C;EAEF,IAAI,KAAK,YAAY,MACnB,QAAQ,mBAAmB,EACzB,eAAe,EAAE,MAAM,KAAK,WAAW,KAAK,EAC9C;EAEF,OAAO,UAAU;EACjB,OAAO;CACT;AACF,CAAC;;;;;;;;;;;;;;;;AC3ED,SAAS,yBACP,MACyB;CAEzB,IADiB,KAAK,aACL,YAAY,KAAK,UAChC,OAAO,EAAE,YAAY,KAAK,SAAS;CAErC,IAAI,KAAK,UAAU;EACjB,MAAM,iBAA0C,EAAE,UAAU,KAAK,SAAS;EAC1E,IAAI,OAAO,KAAK,mBAAmB,UACjC,eAAe,SAAS,KAAK;EAE/B,IAAI,OAAO,KAAK,qBAAqB,UACnC,eAAe,WAAW,KAAK;EAEjC,OAAO,EAAE,eAAe;CAC1B;CACA,OAAO,CAAC;AACV;AAGA,SAAS,iBACP,MACyB;CACzB,MAAM,SAAkC,CAAC;CAOzC,KAAK,MAAM,CAAC,KAAK,KAAK,WAAW;EAL/B;GAAC;GAAmB;GAAS;EAAkB;EAC/C;GAAC;GAAoB;GAAU;EAAmB;EAClD;GAAC;GAAkB;GAAQ;EAAiB;EAC5C;GAAC;GAAqB;GAAW;EAAoB;CAEjB,GACpC,IAAI,KAAK,MAAM;EACb,OAAO,OAAO,KAAK;EACnB,IAAI,OAAO,KAAK,YAAY,UAC1B,OAAO,GAAG,IAAI,WAAW,KAAK;CAElC;CAEF,OAAO;AACT;AAEA,MAAa,qBAAqB,cAAc,gBAAgB;CAC9D,WAAW,MAAe;EACxB,MAAM,OAAO,KAAK;EAClB,MAAM,QACH,KAAK,YACL,KAAK,kBACN,GAAE,CACF,YAAY;EAEd,MAAM,SAAkC;GACtC,eAAe;GACf,QAAQ;IACN,aAAa,KAAK,eAAe;IACjC,kBAAkB;GACpB;GACA,qBAAqB,yBAAyB,IAAI;EACpD;EAEA,MAAM,cAAc,iBAAiB,IAAI;EACzC,IAAI,OAAO,KAAK,WAAW,CAAC,CAAC,SAAS,GACpC,OAAO,cAAc;EAGvB,OAAO;CACT;CAEA,eAAe,SAAkB;EAC/B,MAAM,MAAM,KAAK,uBAAuB,CAAC;EACzC,MAAM,SAAkC;GACtC,MAAM;GACN,aAAa,KAAK,OAAO;GACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;GACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC5D;EACA,IAAI,IAAI,YAAY;GAClB,OAAO,WAAW;GAClB,OAAO,WAAW,IAAI;EACxB,OAAO,IAAI,IAAI,gBAAgB;GAC7B,OAAO,WAAW;GAClB,OAAO,WAAW,IAAI,eAAe;GACrC,OAAO,iBAAiB,IAAI,eAAe;GAC3C,OAAO,mBAAmB,IAAI,eAAe;EAC/C;EACA,MAAM,KAAK,KAAK;EAChB,IAAI,IAAI;GACN,OAAO,kBAAkB,GAAG;GAC5B,OAAO,mBAAmB,GAAG;GAC7B,OAAO,mBAAmB,GAAG;GAC7B,OAAO,oBAAoB,GAAG;GAC9B,OAAO,iBAAiB,GAAG;GAC3B,OAAO,kBAAkB,GAAG;GAC5B,OAAO,oBAAoB,GAAG;GAC9B,OAAO,qBAAqB,GAAG;EACjC;EACA,OAAO;CACT;AACF,CAAC;;;;;;;;;;;AC7GD,MAAa,eAAe,cAAc,UAAU;CAClD,WAAW,MAAM;EACf,MAAM,OAAO,KAAK;EAClB,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,KAAK,eAAe;IACjC,mBACG,KAAK,YACL,KAAK,kBACN,GAAE,CACF,YAAY;GAChB;GACA,OAAO;IACL,eAAe,KAAK;IACpB,eAAe,KAAK;IACpB,iBAAiB,KAAK;IACtB,QAAQ,KAAK;GACf;EACF;CACF;CAEA,eAAe,UAAe;EAC5B,MAAM;EACN,aAAa,MAAM,QAAQ;EAC3B,UAAU,MAAM,QAAQ,kBAAkB,YAAY;EACtD,gBAAgB,MAAM,QAAQ,kBAAkB,YAAY;EAC5D,eAAe,MAAM,OAAO;EAC5B,eAAe,MAAM,OAAO;EAC5B,iBAAiB,MAAM,OAAO;EAC9B,QAAQ,MAAM,OAAO;CACvB;AACF,CAAC;;;;;;;;;;;AChCD,MAAa,mBAAmB,cAAc,cAAc;CAC1D,WAAW,MAAM;EACf,MAAM,OAAO,KAAK;EAClB,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,KAAK,eAAe;IACjC,mBACG,KAAK,YACL,KAAK,kBACN,GAAE,CACF,YAAY;GAChB;GACA,WAAW;IACT,YAAY,KAAK;IACjB,SAAU,KAAK,YAA8C;IAC7D,YAAY,KAAK;IACjB,eAAe,KAAK;GACtB;EACF;CACF;CAEA,eAAe,UAAe;EAC5B,MAAM;EACN,aAAa,MAAM,QAAQ;EAC3B,UAAU,MAAM,QAAQ,kBAAkB,YAAY;CACxD;AACF,CAAC;;;;;;;;;;;;;;;;;;;;;;ACED,SAAS,kBAAkB,IAA0B;CACnD,MAAM,OAAgC;EACpC,eAAe;EACf,QAAQ,EACN,aAAa,GAAG,eAAe,GAAG,QAAQ,GAC5C;EACA,gBAAgB,GAAG,kBAAkB;EACrC,eAAe,GAAG,iBAAiB;CACrC;CACA,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;AACzC;AAEA,MAAa,uBAAuB,cAAc,kBAAkB;CAClE,WAAW,MAAyB;EAClC,MAAM,OAAQ,KAAK,YAAY,CAAC;EAChC,MAAM,QACH,KAAK,YACL,KAAK,kBACN,GAAE,CACF,YAAY;EACd,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,KAAK,eAAe;IACjC,kBAAkB;GACpB;GACA,oBAAoB,KAAK,uBAAuB;EAClD;CACF;CAEA,YAAY,SACV,OAAO,KAAK,cAAc,aAAa,KAAK,UAAU,IAAI;CAE5D,cAAc,MAAiC;EAC7C,MAAM,MAAM,KAAK,mBAAmB,CAAC;EACrC,MAAM,QAAyB,CAAC;EAChC,KAAK,MAAM,MAAM,KAAK;GACpB,MAAM,SAAS,GAAG,KAAK,YAAY;GACnC,MAAM,KAAK;IACT,MAAM,GAAG,OAAO;IAChB,SAAS,kBAAkB,EAAE;GAC/B,CAAC;GACD,IAAI,GAAG,QACL,MAAM,KAAK;IACT,MAAM,GAAG,OAAO;IAChB,SAAS,GAAG;GACd,CAAC;EAEL;EACA,OAAO;CACT;CAEA,eAAe,UAAmB;EAChC,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,oBAAoB,KAAK;CAC3B;AACF,CAAC;;;;;;;;;;;;;;;;;;ACtED,MAAa,mBAAmB,cAAc,QAAQ;CACpD,WAAW,KAAwB;EACjC,MAAM,QAAQ,IAAI,oBAAoB,GAAE,CAAE,YAAY;EAatD,OAAO;GAXL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe,IAAI,QAAQ;IAC5C,kBAAkB;IAClB,GAAI,IAAI,sBACJ,EAAE,qBAAqB,IAAI,oBAAoB,IAC/C,CAAC;GACP;GACA,cAAc,IAAI,gBAAgB;GAClC,YAAY,IAAI,cAAc;EAEtB;CACZ;CAEA,YAAY,QACV,OAAO,IAAI,cAAc,aAAa,IAAI,UAAU,IAAI;CAE1D,eAAe,UAAmB;EAChC,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,cAAc,KAAK;EACnB,YAAY,KAAK;CACnB;AACF,CAAC;;;;;;;;;;;;;;;AClCD,MAAa,mBAAmB,cAAc,QAAQ;CACpD,WAAW,KAAwB;EACjC,MAAM,QAAQ,IAAI,oBAAoB,GAAE,CAAE,YAAY;EACtD,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe,IAAI,QAAQ;IAC5C,kBAAkB;IAClB,GAAI,IAAI,sBACJ,EAAE,qBAAqB,IAAI,oBAAoB,IAC/C,CAAC;GACP;EACF;CACF;CAEA,YAAY,QACV,OAAO,IAAI,cAAc,aAAa,IAAI,UAAU,IAAI;CAE1D,eAAe,UAAmB;EAChC,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;CAC5D;AACF,CAAC;;;;;;;;;;;;;;;;ACvBD,MAAa,4BAA4B,cAAc,QAAQ;CAC7D,WAAW,KAAwB;EACjC,MAAM,QAAQ,IAAI,oBAAoB,GAAE,CAAE,YAAY;EACtD,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe,IAAI,QAAQ;IAC5C,kBAAkB;IAClB,GAAI,IAAI,sBACJ,EAAE,qBAAqB,IAAI,oBAAoB,IAC/C,CAAC;GACP;EACF;CACF;CAEA,YAAY,QACV,OAAO,IAAI,cAAc,aAAa,IAAI,UAAU,IAAI;CAE1D,eAAe,UAAmB;EAChC,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;CAC5D;AACF,CAAC;;;;;;;;;;;;;;;;ACtBD,MAAa,2BAA2B,cAAc,QAAQ;CAC5D,WAAW,KAAwB;EACjC,MAAM,QAAQ,IAAI,oBAAoB,GAAE,CAAE,YAAY;EACtD,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe,IAAI,QAAQ;IAC5C,kBAAkB;IAClB,GAAI,IAAI,sBACJ,EAAE,qBAAqB,IAAI,oBAAoB,IAC/C,CAAC;GACP;GACA,oBAAoB;IAClB,cAAc,IAAI,gBAAgB;IAClC,YAAY,IAAI,cAAc;GAChC;EACF;CACF;CAEA,YAAY,QACV,OAAO,IAAI,cAAc,aAAa,IAAI,UAAU,IAAI;CAE1D,eAAe,UAAmB;EAChC,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,cAAc,KAAK,mBAAmB;EACtC,YAAY,KAAK,mBAAmB;CACtC;AACF,CAAC;;;;;;;;;;;;;;;;;;ACrBD,MAAa,wBAAwB,cAAc,QAAQ;CACzD,WAAW,KAAwB;EACjC,MAAM,QAAQ,IAAI,oBAAoB,GAAE,CAAE,YAAY;EACtD,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe,IAAI,QAAQ;IAC5C,kBAAkB;IAClB,GAAI,IAAI,sBACJ,EAAE,qBAAqB,IAAI,oBAAoB,IAC/C,CAAC;GACP;GACA,aAAa,IAAI,eAAe;GAChC,qBAAsB,IAAI,uBAA2C;GACrE,UAAU,IAAI,YAAY,CAAC;EAC7B;CACF;CAEA,eAAe,UAAmB;EAChC,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,aAAa,KAAK;EAClB,qBAAqB,KAAK;EAC1B,UAAU,KAAK;CACjB;AACF,CAAC;;;;;;;;;;;;;;;;ACvCD,MAAa,sBAAsB,cAAc,QAAQ;CACvD,WAAW,KAAwB;EACjC,MAAM,QAAQ,IAAI,oBAAoB,GAAE,CAAE,YAAY;EACtD,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe,IAAI,QAAQ;IAC5C,kBAAkB;GACpB;GACA,UAAU,IAAI,YAAY,CAAC;EAC7B;CACF;CAEA,eAAe,UAAmB;EAChC,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,UAAU,KAAK;CACjB;AACF,CAAC;;;;;;;;;;;;;;;;;;ACPD,SAAS,WAAW,KAA8B;CAChD,MAAM,QAAQ,IAAI,oBAAoB,GAAE,CAAE,YAAY;CACtD,MAAM,OAAmB;EACvB,eAAe;EACf,QAAQ;GACN,aAAa,IAAI,eAAe,IAAI,QAAQ;GAC5C,kBAAkB;EACpB;CACF;CACA,IAAI,IAAI,qBACN,KAAK,OAAO,sBAAsB,IAAI;CAExC,OAAO;AACT;AAEA,SAAS,aAAa,MAAkB;CACtC,OAAO;EACL,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;CAC5D;AACF;AAEA,SAAS,UAAU,KAA4C;CAC7D,OAAO,OAAO,IAAI,cAAc,aAAa,IAAI,UAAU,IAAI;AACjE;AAoFA,KAAK,MAAM,QAAQ;CA7EjB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AAG2B,GAC3B,cAAuC,MAAM;CAC3C;CACA;CACA;AACF,CAAC;;;;ACrIH,MAAa,mBAAiC;CAC5C,IAAI;CACJ,aACE;CAEF,IAAI,iBAAwC;EAC1C,OAAO,kBAAkB;CAC3B;CAEA,WAAW,MAAyC;EAClD,OAAO,WAAW,IAAI;CACxB;CAEA,cAAc,UAAkB;EAC9B,OAAO,kBAAkB,QAAQ;CACnC;AACF;;;;;ACFA,MAAM,oCAAoB,IAAI,IAAI;CAAC;CAAQ;CAAU;AAAQ,CAAC;;;;;;;AAQ9D,MAAM,uBAA+C;CACnD,KAAK;CACL,KAAK;AACP;AAEA,SAAS,iBAAiB,MAA8C;CACtE,IAAI,CAAC,MAAM,OAAO;CAClB,OAAO,qBAAqB,SAAS;AACvC;;;;;;;;;;AAkBA,gBAAuB,YACrB,UACA,QACA,SAC2B;CAC3B,MAAM,MAAM,UAAU,MAAM;CAG5B,MAAM,YAAY,MAAM,SAAS,KAAK,WAAW;CAEjD,MAAM,iBAAiB,IAAI,IACzB,kBAAkB,CAAC,CAAC,KAAK,MAAM,EAAE,YAAY,CAAC,CAChD;CAEA,MAAM,4BAAY,IAAI,IAAyB;CAE/C,KAAK,MAAM,YAAY,WAAW;EAChC,MAAM,WAAW,SAAS,MAAM,GAAG,CAAC,CAAC,IAAI;EAIzC,IAAI,kCAA+B;EAEnC,MAAM,SAAS,kBAAkB,QAAQ;EACzC,IAAI,CAAC,QAAQ;EACb,IAAI,OAAO,cAAc,QAAQ;EACjC,IAAI,CAAC,eAAe,IAAI,OAAO,KAAK,YAAY,CAAC,GAAG;EAEpD,MAAM,MAAM,GAAG,OAAO,KAAK,YAAY,EAAE,GAAG,OAAO,KAAK,YAAY;EACpE,IAAI,CAAC,UAAU,IAAI,GAAG,GACpB,UAAU,IAAI,KAAK;GACjB,MAAM,OAAO,KAAK,YAAY;GAC9B,MAAM,OAAO,KAAK,YAAY;GAC9B,aAAa,CAAC;EAChB,CAAC;EAEH,UAAU,IAAI,GAAG,CAAC,CAAE,eAAe;CACrC;CAGA,KAAK,MAAM,OAAO,mBAAmB;EACnC,MAAM,QAAQ,MAAM,SAAS,KAAK,QAAQ,KAAK;EAC/C,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,WAAW,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI;GACrC,MAAM,SAAS,kBAAkB,QAAQ;GACzC,IAAI,CAAC,QAAQ;GAEb,MAAM,MAAM,GAAG,OAAO,KAAK,YAAY,EAAE,GAAG,OAAO,KAAK,YAAY;GACpE,MAAM,MAAM,UAAU,IAAI,GAAG;GAC7B,IAAI,CAAC,KAAK;GAEV,IAAI,YAAY,KAAK;IAAE;IAAM,QAAQ,OAAO;GAAO,CAAC;EACtD;CACF;CAEA,KAAK,MAAM,GAAG,aAAa,WAAW;EACpC,IAAI,CAAC,SAAS,cAAc;EAE5B,MAAM,UAAU,WAAW,SAAS,IAAI;EACxC,IAAI,CAAC,SAAS;EAEd,IAAI;GACF,MAAM,MAAM,MAAM,SAAS,KAAK,SAAS,YAAY;GAGrD,MAAM,WAAW,QAAQ,OAAO,MAAM,GAAG;GAGzC,MAAM,UAAkC,CAAC;GACzC,KAAK,MAAM,EAAE,MAAM,YAAY,SAAS,aAAa;IACnD,MAAM,UAAU,MAAM,SAAS,KAAK,IAAI;IACxC,MAAM,YAAY,SACb,QAAQ,oBAAoB,WAAW,SACxC;IACJ,QAAQ,aAAa;GACvB;GAEA,MAAM,UAIF,QAAQ,cACR,QAAQ,YAAY,QAAQ,IAC5B,EAAE,MAAM,SAAS,KAAK;GAI1B,MAAM,aAAa,QAAQ,QAAQ,SAAS;GAC5C,MAAM,WAAW;IAAE,GAAG;IAAS,MAAM;GAAW;GAEhD,MAAM,UACJ,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO,SAAS;GAC7D,MAAM,YAAY,IAAI,YAAY,UAAU,OAAO;GAEnD,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,GAAG;IACnC,IAAI,QAAQ,YACV,QAAQ,WAAW,WAAW,OAAO;SAChC,IAAI,QAAQ,MACjB,AAAC,UAAoD,iBACnD,QAAQ;GAEd;GAEA,IAAI,QAAQ,aACV,AACE,UACA,sBAAsB,QAAQ;GAUlC,AAAC,UAA6C,UAJ5B,SACf,aAAc,MAAM,GAAG,CAAC,CACxB,MAAM,GAAG,EAAE,CAAC,CACZ,KAAK,GACwD;GAKhE,IAAI,SAAS,aAAa;IACxB,MAAM,OACJ,UACA;IACF,IAAI,QAAQ,CAAC,KAAK,YAChB,KAAK,aAAa,EAAE,MAAM,QAAQ,YAAY;GAElD;GAEA,IAAI,SAAS,qBAAqB;IAChC,MAAM,OACJ,UACA;IACF,IAAI,QAAQ,CAAC,KAAK,qBAChB,KAAK,sBACH,iBAAiB,QAAQ,mBAAmB,KAC5C,QAAQ;GAEd;GAEA,MAAM;EACR,SAAS,OAAO;GAGd,QAAQ,MACN,yBAAyB,SAAS,KAAK,GAAG,SAAS,KAAK,IACxD,KACF;EACF;CACF;AACF;;;;;;;;;;;;;;;;;ACnMA,MAAa,aAAwB,aAAa;CAChD,MAAM;CACN,SAAS;CACT,aAAa;CAEb,UAAU;EACR;EACA;CACF;CAEA,QAAQ;EACN,MAAM,OAAO,QAAQ,YAAY,SAAS;GACxC,IAAI;IAEF,MAAM,aADY,OAAO,MAAM,WAAW,MAAM,IAE5C,OAAO,OACN,OAAgC,WAAW,OAAO,QAAQ;IAM/D,MAAM,cAAa,MALO,QAAQ,mBAAmB,UAAU,EAKjC,CAAC,KAAK,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,GAAG;IAEnE,MAAM,UAAU,WAAW,OAAO,IAAI;IACtC,IAAI,CAAC,SACH,OAAO;KACL,SAAS;KACT,cAAc,CAAC;KACf,QAAQ,CACN,+CAA+C,OAAO,MACxD;IACF;IAGF,MAAM,QAAQ,MAAM,QAAQ,UAAU,MAA0B;IAChE,MAAM,UAAU,KAAK,YAAY,OAAO,UAAU;IAClD,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;IAEtC,MAAM,UAAoB,CAAC;IAC3B,KAAK,MAAM,KAAK,OAAO;KACrB,MAAM,OAAO,KAAK,SAAS,EAAE,IAAI;KACjC,UAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;KAC5C,cAAc,MAAM,EAAE,SAAS,EAAE,YAAY,MAAM;KACnD,QAAQ,KAAK,IAAI;IACnB;IAEA,OAAO;KAAE,SAAS;KAAM,cAAc;IAAQ;GAChD,SAAS,OAAO;IACd,OAAO;KACL,SAAS;KACT,cAAc,CAAC;KACf,QAAQ,CAAC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;IACjE;GACF;EACF;EAKA,SAAS,UAAU,QAAQ,YACzB,YAAY,UAAU,QAAqB,OAAO;CACtD;AACF,CAAC;;;;;;;;;;;ACxED,qBAAqB,gBAAgB;AAIrC,qBAAqB;CAAE,GAAG;CAAkB,IAAI;AAAM,CAAC"}
|
|
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":";;;;;;;;;;;;AAuBA,MAAM,qBAA6C;CACjD,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;CACN,MAAM;AACR;;AAGA,MAAa,qBAAqB;;AAGlC,MAAa,mBAAmB;;;;;;;;;AAUhC,SAAgB,aACd,MACA,MACA,OAA8B,YAC9B,QACQ;CACR,MAAM,OAAO,KAAK,YAAY;CAC9B,MAAM,YAAY,SAAS,IAAI,CAAC,CAAC,YAAY;CAC7C,IAAI,SAAS,YACX,OAAO,GAAG,KAAK,GAAG,UAAU,GAAG;CAEjC,MAAM,MAAM,mBAAmB,SAAS,IAAI,CAAC,CAAC,YAAY,MAAM;CAChE,OAAO,SACH,GAAG,KAAK,GAAG,UAAU,GAAG,OAAO,GAAG,QAClC,GAAG,KAAK,GAAG,UAAU,GAAG;AAC9B;;;;;;;AAQA,SAAgB,kBACd,UACkC;CAElC,IAAI,kCACF,OAAO;EACL,MAAM;EACN,MAAM;EACN,WAAW;CACb;CAGF,MAAM,QAAQ,SAAS,MAAM,GAAG;CAChC,IAAI,MAAM,SAAS,GACjB;CAGF,MAAM,YAAY,MAAM,GAAG,EAAE;CAE7B,MAAM,aADc,MAAM,UAAU,IAAI,MAAM,GAAG,EAAE,IAAI,UACvB,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM,MAAM,GAAG,EAAE;CAEtE,IAAI,UAAU,WAAW,GACvB;CAMF,IAAI,sBACF,OAAO;EACL,MAAM,UAAU,WAAW,IAAI,KAAK,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG;EAC/D,MAAM,MAAM,GAAG,EAAE,CAAC,CAAE,YAAY;EAChC;CACF;CAYF,IAAI,kBAAC,IARuB,IAAI;EAC9B;EACA;EACA;EACA;EACA;EACA;CACF,CACmB,EAAC,CAAC,IAAI,SAAS,GAChC;CAMF,IAAI,MAAM,UAAU,GAClB,OAAO;EACL,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG;EACjC,MAAM,MAAM,GAAG,EAAE,CAAC,CAAE,YAAY;EAChC,QAAQ,MAAM,GAAG,EAAE;EACnB;CACF;CAGF,OAAO;EACL,MAAM,MAAM,MAAM,GAAG,EAAE,CAAC,CAAC,KAAK,GAAG;EACjC,MAAM,MAAM,GAAG,EAAE,CAAC,CAAE,YAAY;EAChC;CACF;AACF;;;;;;;AAQA,SAAgB,iBAAiB,KAAiC;CAEhE,IAAI,CAAC,IAAI,WAAW,cAAU,GAAG,OAAO;CACxC,MAAM,OAAO,IAAI,MAAM,EAAiB;CACxC,IAAI,KAAK,WAAW,GAAG,OAAO;CAkB9B,KAAK,MAAM,CAAC,SAAS,SAAS;EAd5B,CAAC,0BAA0B,MAAM;EACjC,CAAC,6BAA6B,MAAM;EACpC,CAAC,iCAAiC,MAAM;EACxC,CAAC,gCAAgC,MAAM;EACvC,CAAC,uBAAuB,MAAM;EAC9B,CAAC,4BAA4B,MAAM;EACnC,CAAC,iCAAiC,MAAM;EACxC,CAAC,+BAA+B,MAAM;EACtC,CAAC,2BAA2B,MAAM;EAClC,CAAC,+BAA+B,MAAM;EACtC,CAAC,iCAAiC,MAAM;EACxC,CAAC,iCAAiC,MAAM;CAGR,GAAG;EACnC,MAAM,IAAI,QAAQ,KAAK,IAAI;EAC3B,IAAI,GAAG;GACL,MAAM,OAAO,EAAE;GACf,IAAI,SAAS,QAAQ,OAAO,GAAG,KAAK,YAAY,EAAE,GAAG;GACrD,OAAO,GAAG,KAAK,YAAY,EAAE,GAAG,aAAa,MAAM,IAAI;EACzD;CACF;AAGF;AAEA,SAAS,SAAS,MAAsB;CACtC,OAAO,KAAK,MAAM,GAAG,CAAC,CAAC;AACzB;;;AChFA,MAAM,kCAAkB,IAAI,IAAiC;;AAG7D,SAAgB,WAAW,MAA+C;CACxE,OAAO,gBAAgB,IAAI,IAAI,KAAK,gBAAgB,IAAI,YAAY,IAAI,CAAC;AAC3E;;AAGA,SAAgB,YAAY,MAA+B;CACzD,OAAO,gBAAgB,IAAI,IAAI,KAAK,gBAAgB,IAAI,YAAY,IAAI,CAAC;AAC3E;;AAGA,SAAgB,oBAAsC;CACpD,OAAO,CAAC,GAAG,gBAAgB,KAAK,CAAC;AACnC;;;;;AAWA,SAAS,kBAAkB,MAA4B;CACrD,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;AACzC;AAqBA,SAAgB,cAId,gBACA,YACgB;CAChB,IAAI;CACJ,IAAI,OAAO,mBAAmB,UAC5B,OAAO;MACF;EACL,MAAM,OAAO,eAAe;EAC5B,MAAM,UAAU,eAAe,IAAI;EACnC,IAAI,CAAC,SACH,MAAM,IAAI,MACR,qBAAqB,KAAK,qDAC5B;EAEF,OAAO;CACT;CAEA,MAAM,gBAAgB,YAAY,IAAI,CAAC,CAAC,YAAY;CAEpD,eAAe,cAAc,OAAyC;EAGpE,OAAO,OADL,OAAO,MAAM,YAAY,aAAa,MAAM,QAAQ,IAAI,MAAM;CAElE;CAEA,MAAM,UAA0B;EAC9B;EACA;EAEA,QAAQ;GACN,QAAQ,QAAgB,KAAK,MAAM,GAAG;GACtC,QAAQ,SAAkB,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;EAC5D;EACA,mBAAmB,WAAW;EAC9B,MAAM,UAAU,QAAsC;GACpD,MAAM,QAA0B,CAAC;GACjC,MAAM,cAAc,OAAO,QAAQ,GAAE,CAAE,YAAY;GAGnD,IAAI,WAAW,YACb,KAAK,MAAM,SAAS,WAAW,WAAW,MAAM,GAAG;IACjD,MAAM,UAAU,MAAM,cAAc,KAAK;IACzC,IAAI,CAAC,SAAS;IACd,MAAM,KAAK;KACT,MAAM,aAAa,YAAY,MAAM,UAAU,MAAM,MAAM;KAC3D;IACF,CAAC;GACH;QACK,IAAI,WAAW,WAAW;IAC/B,MAAM,UAAU,MAAM,WAAW,UAAU,MAAM;IACjD,IAAI,SACF,MAAM,KAAK;KACT,MAAM,aAAa,YAAY,MAAM,QAAQ;KAC7C;IACF,CAAC;GAEL;GAGA,MAAM,WAAW,WAAW,WAAW,MAAM;GAC7C,MAAM,eACJ,OAAO,WAAW,qBAAqB,aACnC,WAAW,iBAAiB,MAAM,IACjC,WAAW,oBACZ,aAAa,YAAY,MAAM,UAAU;GAC/C,MAAM,KAAK;IACT,MAAM;IACN,SAAS,kBAAkB,QAAQ;GACrC,CAAC;GAGD,IAAI,WAAW,eAAe;IAC5B,MAAM,SAAS,MAAM,WAAW,cAAc,MAAM;IACpD,KAAK,MAAM,SAAS,QAAQ;KAC1B,MAAM,UAAU,MAAM,cAAc,KAAK;KACzC,IAAI,CAAC,SAAS;KACd,MAAM,KAAK;MAAE,MAAM,MAAM;MAAM;KAAQ,CAAC;IAC1C;GACF;GAEA,OAAO;EACT;EACA,aAAa,WAAW,gBACnB,WACC,WAAW,aAAc,MAAW,IAItC;EACJ,YAAY,WAAW;CACzB;CAEA,gBAAgB,IAAI,MAAM,OAAsB;CAChD,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;AChOA,MAAM,SAAuD;CAC3D,MAAM;CACN,aAAa;CACb,iBAAiB;CACjB,YAAY;CACZ,QAAQ;CACR,aAAa;AACf;AAEA,MAAM,uBAAuB,OAAO,YAClC,OAAO,QAAQ,MAAM,CAAC,CACnB,QAAQ,GAAG,OAAO,MAAM,MAAS,CAAC,CAClC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAC3B;;;;;AAMA,MAAM,kBAA0C;CAC9C,mBAAmB;CACnB,WAAW;CACX,WAAW;CACX,cAAc;CACd,oBAAoB;CACpB,iBAAiB;CACjB,cAAc;CACd,eAAe;CACf,8BAA8B;CAC9B,gBAAgB;CAChB,WAAW;CACX,UAAU;AACZ;AAEA,MAAM,oBAA4C,OAAO,YACvD,OAAO,QAAQ,eAAe,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CACxD;AAEA,MAAa,eAAe,cAAc,UAAU;CAClD,mBAAmB;CAEnB,WAAW,KAAc;EACvB,MAAM,OAAO,IAAI;EACjB,MAAM,QAAQ,KAAK,YAAY,KAAK,kBAAkB,GAAE,CAAE,YAAY;EACtE,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe,KAAK,eAAe;IACpD,kBAAkB;IAClB,GAAI,KAAK,uBAAuB,KAAK,wBAAwB,aACzD,EACE,qBACE,KAAK,oBACT,IACA,CAAC;GACP;GACA,GAAI,KAAK,WACL,EACE,UAAW,gBAAgB,KAAK,aAC9B,oBACJ,IACA,CAAC;GACL,GAAI,OAAO,KAAK,uBAAuB,YACnC,EAAE,oBAAoB,KAAK,mBAAmB,IAC9C,CAAC;EACP;CACF;CAEA,aAAa,QAAQ;EAEnB,QADiB,IAAI,SAAS,WAAW,CAAC,EAC3B,CAAC,KAAK,SAAS;GAC5B,QAAQ,OAAO,OAAO,IAAI,eAAe,MAAM;GAC/C,eACE,IAAI,iBACF,OAAO,IAAI,eAAe,MAAM,CAClC;EACJ,EAAE;CACJ;CAEA,eAAe,UAAmB;EAChC,MAAM;EACN,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,UAAU,KAAK,WACV,kBAAkB,KAAK,aAAa,KAAK,WAC1C;EACJ,qBAAqB,KAAK,OAAO;EACjC,oBAAoB,KAAK;CAC3B;CAEA,aAAa,KAAK,YAAY;EAC5B,AACE,IACA,kBAAkB;EACpB,IAAI,QAAQ,MACV,AAAC,IAA8C,iBAC7C,QAAQ;CAEd;AACF,CAAC;;;;;;;;;;;;;;;;AC5GD,MAAa,mBAAmB,cAAc,cAAc;CAC1D,WAAW,MAAe;EACxB,MAAM,OAAO,KAAK;EAClB,MAAM,QAAQ,KAAK,YAAY,KAAK,kBAAkB,GAAE,CAAE,YAAY;EACtE,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,KAAK,eAAe,KAAK,eAAe;IACrD,kBAAkB;IAClB,GAAI,KAAK,uBAAuB,KAAK,wBAAwB,aACzD,EACE,qBACE,KAAK,oBACT,IACA,CAAC;GACP;EACF;CACF;CAEA,YAAY,QAAQ,IAAI,UAAU;CAElC,eAAe,UAAmB;EAChC,MAAM;EACN,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,qBAAqB,KAAK,OAAO;CACnC;CAEA,aAAa,MAAM,YAAY;EAC7B,IAAI,QAAQ,MACV,AAAC,KAA+C,iBAC9C,QAAQ;CAEd;AACF,CAAC;;;;;;;;;;;;;;;ACrCD,MAAM,gBAAwC;CAC5C,uBAAuB;CACvB,oBAAoB;CACpB,QAAQ;CACR,MAAM;AACR;AAEA,MAAM,kBAA0C,OAAO,YACrD,OAAO,QAAQ,aAAa,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CACtD;AAEA,MAAa,iBAAiB,cAAc,YAAY;CACtD,WAAW,MAAe;EACxB,MAAM,OAAO,KAAK;EAClB,MAAM,QAAQ,KAAK,YAAY,KAAK,kBAAkB,GAAE,CAAE,YAAY;EACtE,MAAM,qBAA8C;GAClD,aAAc,KAAK,eACjB;GACF,eAAgB,cAAc,KAAK,sBAAsB,OACvD;EACJ;EACA,IAAI,OAAO,KAAK,uBAAuB,WACrC,mBAAmB,qBAAqB,KAAK;EAE/C,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,KAAK,eAAe,KAAK,eAAe;IACrD,kBAAkB;IAClB,GAAI,KAAK,uBAAuB,KAAK,wBAAwB,aACzD,EACE,qBACE,KAAK,oBACT,IACA,CAAC;GACP;GACoB;EACtB;CACF;CAEA,YAAY,QAAQ,IAAI,UAAU;CAElC,eAAe,UAAmB;EAChC,MAAM;EACN,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,aAAa,KAAK,oBAAoB;EACtC,oBAAoB,KAAK,oBAAoB,gBACzC,gBAAgB,KAAK,mBAAmB,iBACxC;EACJ,oBAAoB,KAAK,oBAAoB;EAC7C,qBAAqB,KAAK,OAAO;CACnC;CAEA,aAAa,MAAM,YAAY;EAC7B,IAAI,QAAQ,MACV,AAAC,KAA+C,iBAC9C,QAAQ;CAEd;AACF,CAAC;;;;;;;;;;;;;AClED,MAAa,iBAAiB,cAAc,YAAY;CACtD,kBAAkB;CAElB,WAAW,KAAK;EACd,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe;IAChC,mBACE,IAAI,UAAU,YACd,IAAI,UAAU,kBACd,GAAE,CACF,YAAY;IACd,GAAI,IAAI,UAAU,uBAClB,IAAI,SAAS,wBAAwB,aACjC,EAAE,qBAAqB,IAAI,SAAS,oBAAoB,IACxD,CAAC;GACP;GACA,SAAS;IAEP,mBAAmB,IAAI,UAAU,WAAW,mBAAmB;IAC/D,sBAAsB,IAAI,UAAU,sBAAsB;IAC1D,aAAa,IAAI,UAAU,YAAY;GACzC;EACF;CACF;CAEA,eAAe,UAAe;EAC5B,MAAM;EACN,aAAa,MAAM,QAAQ;EAC3B,UAAU,MAAM,QAAQ,kBAAkB,YAAY;EACtD,gBAAgB,MAAM,QAAQ,kBAAkB,YAAY;EAC5D,qBAAqB,MAAM,QAAQ;CACrC;AACF,CAAC;;;;;;;;;;;;;;;;AC7BD,MAAa,gBAAgB,cAAc,WAAW;CACpD,WAAW,MAAe;EACxB,MAAM,OAAO,KAAK;EAClB,MAAM,UAAW,KAAK,WAAW,CAAC;EAClC,MAAM,QACH,KAAK,YACL,KAAK,kBACN,GAAE,CACF,YAAY;EACd,MAAM,KAAM,QAAQ,mBAAmB,CAAC;EACxC,MAAM,KAAM,QAAQ,qBAAqB,CAAC;EAC1C,MAAM,KAAM,QAAQ,oBAAoB,CAAC;EAEzC,MAAM,SAAkC;GACtC,UAAU,GAAG,YAAY;GACzB,QAAQ,GAAG,UAAU;EACvB;EACA,IAAI,OAAO,GAAG,aAAa,UACzB,OAAO,WAAW,GAAG;EAGvB,MAAM,SAAkC;GACtC,eAAe;GACf,QAAQ;IACN,aAAa,KAAK,eAAe;IACjC,kBAAkB;GACpB;GACQ;EACV;EAGA,MAAM,WAAoC,CAAC;EAC3C,IAAI,OAAO,GAAG,WAAW,UAAU,SAAS,SAAS,GAAG;EACxD,IAAI,OAAO,GAAG,cAAc,WAC1B,SAAS,gBAAgB,CAAC,GAAG;EAC/B,IAAI,GAAG,gBAAgB,SAAS,oBAAoB,GAAG;EACvD,IAAI,OAAO,KAAK,QAAQ,CAAC,CAAC,SAAS,GACjC,OAAO,wBAAwB;EAIjC,MAAM,QAAS,GAAG,iBAAiB,CAAC;EACpC,IAAI,MAAM,MACR,OAAO,aAAa,EAAE,MAAM,MAAM,KAAK;EAGzC,OAAO;CACT;CAEA,eAAe,SAAkB;EAC/B,MAAM,SAAkC;GACtC,MAAM;GACN,aAAa,KAAK,OAAO;GACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;GACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC5D;EACA,MAAM,UAAmC,EACvC,iBAAiB;GACf,UAAU,KAAK,OAAO;GACtB,QAAQ,KAAK,OAAO;GACpB,UAAU,KAAK,OAAO,YAAY;EACpC,EACF;EACA,IAAI,KAAK,uBACP,QAAQ,oBAAoB;GAC1B,QAAQ,KAAK,sBAAsB;GACnC,WAAW,KAAK,sBAAsB,gBAAgB,QAAQ;GAC9D,gBAAgB,KAAK,sBAAsB;EAC7C;EAEF,IAAI,KAAK,YAAY,MACnB,QAAQ,mBAAmB,EACzB,eAAe,EAAE,MAAM,KAAK,WAAW,KAAK,EAC9C;EAEF,OAAO,UAAU;EACjB,OAAO;CACT;AACF,CAAC;;;;;;;;;;;;;;;AC3ED,SAAS,yBACP,MACyB;CAEzB,IADiB,KAAK,aACL,YAAY,KAAK,UAChC,OAAO,EAAE,YAAY,KAAK,SAAS;CAErC,IAAI,KAAK,UAAU;EACjB,MAAM,iBAA0C,EAAE,UAAU,KAAK,SAAS;EAC1E,IAAI,OAAO,KAAK,mBAAmB,UACjC,eAAe,SAAS,KAAK;EAE/B,IAAI,OAAO,KAAK,qBAAqB,UACnC,eAAe,WAAW,KAAK;EAEjC,OAAO,EAAE,eAAe;CAC1B;CACA,OAAO,CAAC;AACV;AAGA,SAAS,iBACP,MACyB;CACzB,MAAM,SAAkC,CAAC;CAOzC,KAAK,MAAM,CAAC,KAAK,KAAK,WAAW;EAL/B;GAAC;GAAmB;GAAS;EAAkB;EAC/C;GAAC;GAAoB;GAAU;EAAmB;EAClD;GAAC;GAAkB;GAAQ;EAAiB;EAC5C;GAAC;GAAqB;GAAW;EAAoB;CAEjB,GACpC,IAAI,KAAK,MAAM;EACb,OAAO,OAAO,KAAK;EACnB,IAAI,OAAO,KAAK,YAAY,UAC1B,OAAO,GAAG,IAAI,WAAW,KAAK;CAElC;CAEF,OAAO;AACT;AAEA,MAAa,qBAAqB,cAAc,gBAAgB;CAC9D,WAAW,MAAe;EACxB,MAAM,OAAO,KAAK;EAClB,MAAM,QACH,KAAK,YACL,KAAK,kBACN,GAAE,CACF,YAAY;EAEd,MAAM,SAAkC;GACtC,eAAe;GACf,QAAQ;IACN,aAAa,KAAK,eAAe;IACjC,kBAAkB;GACpB;GACA,qBAAqB,yBAAyB,IAAI;EACpD;EAEA,MAAM,cAAc,iBAAiB,IAAI;EACzC,IAAI,OAAO,KAAK,WAAW,CAAC,CAAC,SAAS,GACpC,OAAO,cAAc;EAGvB,OAAO;CACT;CAEA,eAAe,SAAkB;EAC/B,MAAM,MAAM,KAAK,uBAAuB,CAAC;EACzC,MAAM,SAAkC;GACtC,MAAM;GACN,aAAa,KAAK,OAAO;GACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;GACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC5D;EACA,IAAI,IAAI,YAAY;GAClB,OAAO,WAAW;GAClB,OAAO,WAAW,IAAI;EACxB,OAAO,IAAI,IAAI,gBAAgB;GAC7B,OAAO,WAAW;GAClB,OAAO,WAAW,IAAI,eAAe;GACrC,OAAO,iBAAiB,IAAI,eAAe;GAC3C,OAAO,mBAAmB,IAAI,eAAe;EAC/C;EACA,MAAM,KAAK,KAAK;EAChB,IAAI,IAAI;GACN,OAAO,kBAAkB,GAAG;GAC5B,OAAO,mBAAmB,GAAG;GAC7B,OAAO,mBAAmB,GAAG;GAC7B,OAAO,oBAAoB,GAAG;GAC9B,OAAO,iBAAiB,GAAG;GAC3B,OAAO,kBAAkB,GAAG;GAC5B,OAAO,oBAAoB,GAAG;GAC9B,OAAO,qBAAqB,GAAG;EACjC;EACA,OAAO;CACT;AACF,CAAC;;;;;;;;;;AC7GD,MAAa,eAAe,cAAc,UAAU;CAClD,WAAW,MAAM;EACf,MAAM,OAAO,KAAK;EAClB,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,KAAK,eAAe;IACjC,mBACG,KAAK,YACL,KAAK,kBACN,GAAE,CACF,YAAY;GAChB;GACA,OAAO;IACL,eAAe,KAAK;IACpB,eAAe,KAAK;IACpB,iBAAiB,KAAK;IACtB,QAAQ,KAAK;GACf;EACF;CACF;CAEA,eAAe,UAAe;EAC5B,MAAM;EACN,aAAa,MAAM,QAAQ;EAC3B,UAAU,MAAM,QAAQ,kBAAkB,YAAY;EACtD,gBAAgB,MAAM,QAAQ,kBAAkB,YAAY;EAC5D,eAAe,MAAM,OAAO;EAC5B,eAAe,MAAM,OAAO;EAC5B,iBAAiB,MAAM,OAAO;EAC9B,QAAQ,MAAM,OAAO;CACvB;AACF,CAAC;;;;;;;;;;AChCD,MAAa,mBAAmB,cAAc,cAAc;CAC1D,WAAW,MAAM;EACf,MAAM,OAAO,KAAK;EAClB,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,KAAK,eAAe;IACjC,mBACG,KAAK,YACL,KAAK,kBACN,GAAE,CACF,YAAY;GAChB;GACA,WAAW;IACT,YAAY,KAAK;IACjB,SAAU,KAAK,YAA8C;IAC7D,YAAY,KAAK;IACjB,eAAe,KAAK;GACtB;EACF;CACF;CAEA,eAAe,UAAe;EAC5B,MAAM;EACN,aAAa,MAAM,QAAQ;EAC3B,UAAU,MAAM,QAAQ,kBAAkB,YAAY;CACxD;AACF,CAAC;;;;;;;;;;;;;;;;;;;;;ACED,SAAS,kBAAkB,IAA0B;CACnD,MAAM,OAAgC;EACpC,eAAe;EACf,QAAQ,EACN,aAAa,GAAG,eAAe,GAAG,QAAQ,GAC5C;EACA,gBAAgB,GAAG,kBAAkB;EACrC,eAAe,GAAG,iBAAiB;CACrC;CACA,OAAO,KAAK,UAAU,MAAM,MAAM,CAAC,IAAI;AACzC;AAEA,MAAa,uBAAuB,cAAc,kBAAkB;CAClE,WAAW,MAAyB;EAClC,MAAM,OAAQ,KAAK,YAAY,CAAC;EAChC,MAAM,QACH,KAAK,YACL,KAAK,kBACN,GAAE,CACF,YAAY;EACd,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,KAAK,eAAe;IACjC,kBAAkB;GACpB;GACA,oBAAoB,KAAK,uBAAuB;EAClD;CACF;CAEA,YAAY,SACV,OAAO,KAAK,cAAc,aAAa,KAAK,UAAU,IAAI;CAE5D,cAAc,MAAiC;EAC7C,MAAM,MAAM,KAAK,mBAAmB,CAAC;EACrC,MAAM,QAAyB,CAAC;EAChC,KAAK,MAAM,MAAM,KAAK;GACpB,MAAM,SAAS,GAAG,KAAK,YAAY;GACnC,MAAM,KAAK;IACT,MAAM,GAAG,OAAO;IAChB,SAAS,kBAAkB,EAAE;GAC/B,CAAC;GACD,IAAI,GAAG,QACL,MAAM,KAAK;IACT,MAAM,GAAG,OAAO;IAChB,SAAS,GAAG;GACd,CAAC;EAEL;EACA,OAAO;CACT;CAEA,eAAe,UAAmB;EAChC,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,oBAAoB,KAAK;CAC3B;AACF,CAAC;;;;;;;;;;;;;;;;;ACtED,MAAa,mBAAmB,cAAc,QAAQ;CACpD,WAAW,KAAwB;EACjC,MAAM,QAAQ,IAAI,oBAAoB,GAAE,CAAE,YAAY;EAatD,OAAO;GAXL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe,IAAI,QAAQ;IAC5C,kBAAkB;IAClB,GAAI,IAAI,sBACJ,EAAE,qBAAqB,IAAI,oBAAoB,IAC/C,CAAC;GACP;GACA,cAAc,IAAI,gBAAgB;GAClC,YAAY,IAAI,cAAc;EAEtB;CACZ;CAEA,YAAY,QACV,OAAO,IAAI,cAAc,aAAa,IAAI,UAAU,IAAI;CAE1D,eAAe,UAAmB;EAChC,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,cAAc,KAAK;EACnB,YAAY,KAAK;CACnB;AACF,CAAC;;;;;;;;;;;;;;AClCD,MAAa,mBAAmB,cAAc,QAAQ;CACpD,WAAW,KAAwB;EACjC,MAAM,QAAQ,IAAI,oBAAoB,GAAE,CAAE,YAAY;EACtD,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe,IAAI,QAAQ;IAC5C,kBAAkB;IAClB,GAAI,IAAI,sBACJ,EAAE,qBAAqB,IAAI,oBAAoB,IAC/C,CAAC;GACP;EACF;CACF;CAEA,YAAY,QACV,OAAO,IAAI,cAAc,aAAa,IAAI,UAAU,IAAI;CAE1D,eAAe,UAAmB;EAChC,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;CAC5D;AACF,CAAC;;;;;;;;;;;;;;;ACvBD,MAAa,4BAA4B,cAAc,QAAQ;CAC7D,WAAW,KAAwB;EACjC,MAAM,QAAQ,IAAI,oBAAoB,GAAE,CAAE,YAAY;EACtD,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe,IAAI,QAAQ;IAC5C,kBAAkB;IAClB,GAAI,IAAI,sBACJ,EAAE,qBAAqB,IAAI,oBAAoB,IAC/C,CAAC;GACP;EACF;CACF;CAEA,YAAY,QACV,OAAO,IAAI,cAAc,aAAa,IAAI,UAAU,IAAI;CAE1D,eAAe,UAAmB;EAChC,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;CAC5D;AACF,CAAC;;;;;;;;;;;;;;;ACtBD,MAAa,2BAA2B,cAAc,QAAQ;CAC5D,WAAW,KAAwB;EACjC,MAAM,QAAQ,IAAI,oBAAoB,GAAE,CAAE,YAAY;EACtD,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe,IAAI,QAAQ;IAC5C,kBAAkB;IAClB,GAAI,IAAI,sBACJ,EAAE,qBAAqB,IAAI,oBAAoB,IAC/C,CAAC;GACP;GACA,oBAAoB;IAClB,cAAc,IAAI,gBAAgB;IAClC,YAAY,IAAI,cAAc;GAChC;EACF;CACF;CAEA,YAAY,QACV,OAAO,IAAI,cAAc,aAAa,IAAI,UAAU,IAAI;CAE1D,eAAe,UAAmB;EAChC,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,cAAc,KAAK,mBAAmB;EACtC,YAAY,KAAK,mBAAmB;CACtC;AACF,CAAC;;;;;;;;;;;;;;;;;ACrBD,MAAa,wBAAwB,cAAc,QAAQ;CACzD,WAAW,KAAwB;EACjC,MAAM,QAAQ,IAAI,oBAAoB,GAAE,CAAE,YAAY;EACtD,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe,IAAI,QAAQ;IAC5C,kBAAkB;IAClB,GAAI,IAAI,sBACJ,EAAE,qBAAqB,IAAI,oBAAoB,IAC/C,CAAC;GACP;GACA,aAAa,IAAI,eAAe;GAChC,qBAAsB,IAAI,uBAA2C;GACrE,UAAU,IAAI,YAAY,CAAC;EAC7B;CACF;CAEA,eAAe,UAAmB;EAChC,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,aAAa,KAAK;EAClB,qBAAqB,KAAK;EAC1B,UAAU,KAAK;CACjB;AACF,CAAC;;;;;;;;;;;;;;;ACvCD,MAAa,sBAAsB,cAAc,QAAQ;CACvD,WAAW,KAAwB;EACjC,MAAM,QAAQ,IAAI,oBAAoB,GAAE,CAAE,YAAY;EACtD,OAAO;GACL,eAAe;GACf,QAAQ;IACN,aAAa,IAAI,eAAe,IAAI,QAAQ;IAC5C,kBAAkB;GACpB;GACA,UAAU,IAAI,YAAY,CAAC;EAC7B;CACF;CAEA,eAAe,UAAmB;EAChC,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;EAC1D,UAAU,KAAK;CACjB;AACF,CAAC;;;;;;;;;;;;;;;;;ACPD,SAAS,WAAW,KAA8B;CAChD,MAAM,QAAQ,IAAI,oBAAoB,GAAE,CAAE,YAAY;CACtD,MAAM,OAAmB;EACvB,eAAe;EACf,QAAQ;GACN,aAAa,IAAI,eAAe,IAAI,QAAQ;GAC5C,kBAAkB;EACpB;CACF;CACA,IAAI,IAAI,qBACN,KAAK,OAAO,sBAAsB,IAAI;CAExC,OAAO;AACT;AAEA,SAAS,aAAa,MAAkB;CACtC,OAAO;EACL,MAAM;EACN,aAAa,KAAK,OAAO;EACzB,UAAU,KAAK,OAAO,kBAAkB,YAAY;EACpD,gBAAgB,KAAK,OAAO,kBAAkB,YAAY;CAC5D;AACF;AAEA,SAAS,UAAU,KAA4C;CAC7D,OAAO,OAAO,IAAI,cAAc,aAAa,IAAI,UAAU,IAAI;AACjE;AAoFA,KAAK,MAAM,QAAQ;CA7EjB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AAG2B,GAC3B,cAAuC,MAAM;CAC3C;CACA;CACA;AACF,CAAC;;;ACrIH,MAAa,mBAAiC;CAC5C,IAAI;CACJ,aACE;CAEF,IAAI,iBAAwC;EAC1C,OAAO,kBAAkB;CAC3B;CAEA,WAAW,MAAyC;EAClD,OAAO,WAAW,IAAI;CACxB;CAEA,cAAc,UAAkB;EAC9B,OAAO,kBAAkB,QAAQ;CACnC;AACF;;;;ACFA,MAAM,oCAAoB,IAAI,IAAI;CAAC;CAAQ;CAAU;AAAQ,CAAC;;;;;;;AAQ9D,MAAM,uBAA+C;CACnD,KAAK;CACL,KAAK;AACP;AAEA,SAAS,iBAAiB,MAA8C;CACtE,IAAI,CAAC,MAAM,OAAO;CAClB,OAAO,qBAAqB,SAAS;AACvC;;;;;;;;;;AAkBA,gBAAuB,YACrB,UACA,QACA,SAC2B;CAC3B,MAAM,MAAM,UAAU,MAAM;CAG5B,MAAM,YAAY,MAAM,SAAS,KAAK,WAAW;CAEjD,MAAM,iBAAiB,IAAI,IACzB,kBAAkB,CAAC,CAAC,KAAK,MAAM,EAAE,YAAY,CAAC,CAChD;CAEA,MAAM,4BAAY,IAAI,IAAyB;CAE/C,KAAK,MAAM,YAAY,WAAW;EAChC,MAAM,WAAW,SAAS,MAAM,GAAG,CAAC,CAAC,IAAI;EAIzC,IAAI,kCAA+B;EAEnC,MAAM,SAAS,kBAAkB,QAAQ;EACzC,IAAI,CAAC,QAAQ;EACb,IAAI,OAAO,cAAc,QAAQ;EACjC,IAAI,CAAC,eAAe,IAAI,OAAO,KAAK,YAAY,CAAC,GAAG;EAEpD,MAAM,MAAM,GAAG,OAAO,KAAK,YAAY,EAAE,GAAG,OAAO,KAAK,YAAY;EACpE,IAAI,CAAC,UAAU,IAAI,GAAG,GACpB,UAAU,IAAI,KAAK;GACjB,MAAM,OAAO,KAAK,YAAY;GAC9B,MAAM,OAAO,KAAK,YAAY;GAC9B,aAAa,CAAC;EAChB,CAAC;EAEH,UAAU,IAAI,GAAG,CAAC,CAAE,eAAe;CACrC;CAGA,KAAK,MAAM,OAAO,mBAAmB;EACnC,MAAM,QAAQ,MAAM,SAAS,KAAK,QAAQ,KAAK;EAC/C,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,WAAW,KAAK,MAAM,GAAG,CAAC,CAAC,IAAI;GACrC,MAAM,SAAS,kBAAkB,QAAQ;GACzC,IAAI,CAAC,QAAQ;GAEb,MAAM,MAAM,GAAG,OAAO,KAAK,YAAY,EAAE,GAAG,OAAO,KAAK,YAAY;GACpE,MAAM,MAAM,UAAU,IAAI,GAAG;GAC7B,IAAI,CAAC,KAAK;GAEV,IAAI,YAAY,KAAK;IAAE;IAAM,QAAQ,OAAO;GAAO,CAAC;EACtD;CACF;CAEA,KAAK,MAAM,GAAG,aAAa,WAAW;EACpC,IAAI,CAAC,SAAS,cAAc;EAE5B,MAAM,UAAU,WAAW,SAAS,IAAI;EACxC,IAAI,CAAC,SAAS;EAEd,IAAI;GACF,MAAM,MAAM,MAAM,SAAS,KAAK,SAAS,YAAY;GAGrD,MAAM,WAAW,QAAQ,OAAO,MAAM,GAAG;GAGzC,MAAM,UAAkC,CAAC;GACzC,KAAK,MAAM,EAAE,MAAM,YAAY,SAAS,aAAa;IACnD,MAAM,UAAU,MAAM,SAAS,KAAK,IAAI;IACxC,MAAM,YAAY,SACb,QAAQ,oBAAoB,WAAW,SACxC;IACJ,QAAQ,aAAa;GACvB;GAEA,MAAM,UAIF,QAAQ,cACR,QAAQ,YAAY,QAAQ,IAC5B,EAAE,MAAM,SAAS,KAAK;GAI1B,MAAM,aAAa,QAAQ,QAAQ,SAAS;GAC5C,MAAM,WAAW;IAAE,GAAG;IAAS,MAAM;GAAW;GAEhD,MAAM,UACJ,OAAO,QAAQ,SAAS,WAAW,QAAQ,OAAO,SAAS;GAC7D,MAAM,YAAY,IAAI,YAAY,UAAU,OAAO;GAEnD,IAAI,OAAO,KAAK,OAAO,CAAC,CAAC,SAAS,GAAG;IACnC,IAAI,QAAQ,YACV,QAAQ,WAAW,WAAW,OAAO;SAChC,IAAI,QAAQ,MACjB,AAAC,UAAoD,iBACnD,QAAQ;GAEd;GAEA,IAAI,QAAQ,aACV,AACE,UACA,sBAAsB,QAAQ;GAUlC,AAAC,UAA6C,UAJ5B,SACf,aAAc,MAAM,GAAG,CAAC,CACxB,MAAM,GAAG,EAAE,CAAC,CACZ,KAAK,GACwD;GAKhE,IAAI,SAAS,aAAa;IACxB,MAAM,OACJ,UACA;IACF,IAAI,QAAQ,CAAC,KAAK,YAChB,KAAK,aAAa,EAAE,MAAM,QAAQ,YAAY;GAElD;GAEA,IAAI,SAAS,qBAAqB;IAChC,MAAM,OACJ,UACA;IACF,IAAI,QAAQ,CAAC,KAAK,qBAChB,KAAK,sBACH,iBAAiB,QAAQ,mBAAmB,KAC5C,QAAQ;GAEd;GAEA,MAAM;EACR,SAAS,OAAO;GAGd,QAAQ,MACN,yBAAyB,SAAS,KAAK,GAAG,SAAS,KAAK,IACxD,KACF;EACF;CACF;AACF;;;;;;;;;;;;;;;;ACnMA,MAAa,aAAwB,aAAa;CAChD,MAAM;CACN,SAAS;CACT,aAAa;CAEb,UAAU;EACR;EACA;CACF;CAEA,QAAQ;EACN,MAAM,OAAO,QAAQ,YAAY,SAAS;GACxC,IAAI;IAEF,MAAM,aADY,OAAO,MAAM,WAAW,MAAM,IAE5C,OAAO,OACN,OAAgC,WAAW,OAAO,QAAQ;IAM/D,MAAM,cAAa,MALO,QAAQ,mBAAmB,UAAU,EAKjC,CAAC,KAAK,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,KAAK,GAAG;IAEnE,MAAM,UAAU,WAAW,OAAO,IAAI;IACtC,IAAI,CAAC,SACH,OAAO;KACL,SAAS;KACT,cAAc,CAAC;KACf,QAAQ,CACN,+CAA+C,OAAO,MACxD;IACF;IAGF,MAAM,QAAQ,MAAM,QAAQ,UAAU,MAA0B;IAChE,MAAM,UAAU,KAAK,YAAY,OAAO,UAAU;IAClD,UAAU,SAAS,EAAE,WAAW,KAAK,CAAC;IAEtC,MAAM,UAAoB,CAAC;IAC3B,KAAK,MAAM,KAAK,OAAO;KACrB,MAAM,OAAO,KAAK,SAAS,EAAE,IAAI;KACjC,UAAU,QAAQ,IAAI,GAAG,EAAE,WAAW,KAAK,CAAC;KAC5C,cAAc,MAAM,EAAE,SAAS,EAAE,YAAY,MAAM;KACnD,QAAQ,KAAK,IAAI;IACnB;IAEA,OAAO;KAAE,SAAS;KAAM,cAAc;IAAQ;GAChD,SAAS,OAAO;IACd,OAAO;KACL,SAAS;KACT,cAAc,CAAC;KACf,QAAQ,CAAC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;IACjE;GACF;EACF;EAKA,SAAS,UAAU,QAAQ,YACzB,YAAY,UAAU,QAAqB,OAAO;CACtD;AACF,CAAC;;;;;;;;;;ACxED,qBAAqB,gBAAgB;AAIrC,qBAAqB;CAAE,GAAG;CAAkB,IAAI;AAAM,CAAC"}
|
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.19",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
@@ -18,8 +18,8 @@
|
|
|
18
18
|
"dist"
|
|
19
19
|
],
|
|
20
20
|
"dependencies": {
|
|
21
|
-
"@abapify/adk": "0.4.
|
|
22
|
-
"@abapify/adt-plugin": "0.4.
|
|
21
|
+
"@abapify/adk": "0.4.19",
|
|
22
|
+
"@abapify/adt-plugin": "0.4.19"
|
|
23
23
|
},
|
|
24
24
|
"devDependencies": {
|
|
25
25
|
"json-schema-to-typescript": "15.0.4"
|