arc-1 1.5.1 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -1
- package/bin/arc1-source.js +83 -0
- package/dist/adt/accept-fallback.d.ts +4 -0
- package/dist/adt/accept-fallback.d.ts.map +1 -0
- package/dist/adt/accept-fallback.js +27 -0
- package/dist/adt/accept-fallback.js.map +1 -0
- package/dist/adt/api-release.d.ts +40 -0
- package/dist/adt/api-release.d.ts.map +1 -0
- package/dist/adt/api-release.js +224 -0
- package/dist/adt/api-release.js.map +1 -0
- package/dist/adt/authorization-trace.d.ts.map +1 -1
- package/dist/adt/authorization-trace.js +2 -1
- package/dist/adt/authorization-trace.js.map +1 -1
- package/dist/adt/class-structure.d.ts.map +1 -1
- package/dist/adt/class-structure.js +24 -3
- package/dist/adt/class-structure.js.map +1 -1
- package/dist/adt/client.d.ts +8 -4
- package/dist/adt/client.d.ts.map +1 -1
- package/dist/adt/client.js +30 -48
- package/dist/adt/client.js.map +1 -1
- package/dist/adt/codeintel.d.ts +33 -5
- package/dist/adt/codeintel.d.ts.map +1 -1
- package/dist/adt/codeintel.js +41 -10
- package/dist/adt/codeintel.js.map +1 -1
- package/dist/adt/data-source-policy.d.ts +5 -2
- package/dist/adt/data-source-policy.d.ts.map +1 -1
- package/dist/adt/data-source-policy.js +106 -7
- package/dist/adt/data-source-policy.js.map +1 -1
- package/dist/adt/ddic-xml.d.ts +5 -3
- package/dist/adt/ddic-xml.d.ts.map +1 -1
- package/dist/adt/ddic-xml.js +14 -0
- package/dist/adt/ddic-xml.js.map +1 -1
- package/dist/adt/devtools.d.ts.map +1 -1
- package/dist/adt/devtools.js +27 -3
- package/dist/adt/devtools.js.map +1 -1
- package/dist/adt/discovery.d.ts +1 -1
- package/dist/adt/discovery.js +4 -3
- package/dist/adt/discovery.js.map +1 -1
- package/dist/adt/enhancement-impl.d.ts +125 -0
- package/dist/adt/enhancement-impl.d.ts.map +1 -0
- package/dist/adt/enhancement-impl.js +408 -0
- package/dist/adt/enhancement-impl.js.map +1 -0
- package/dist/adt/enhancements.d.ts.map +1 -1
- package/dist/adt/enhancements.js +4 -2
- package/dist/adt/enhancements.js.map +1 -1
- package/dist/adt/enho-filter.d.ts +49 -0
- package/dist/adt/enho-filter.d.ts.map +1 -0
- package/dist/adt/enho-filter.js +229 -0
- package/dist/adt/enho-filter.js.map +1 -0
- package/dist/adt/errors.js +6 -8
- package/dist/adt/errors.js.map +1 -1
- package/dist/adt/features.d.ts +5 -17
- package/dist/adt/features.d.ts.map +1 -1
- package/dist/adt/features.js +40 -27
- package/dist/adt/features.js.map +1 -1
- package/dist/adt/http.d.ts +1 -1
- package/dist/adt/http.d.ts.map +1 -1
- package/dist/adt/http.js +35 -57
- package/dist/adt/http.js.map +1 -1
- package/dist/adt/legacy-content-handler.d.ts +2 -0
- package/dist/adt/legacy-content-handler.d.ts.map +1 -1
- package/dist/adt/legacy-content-handler.js +13 -1
- package/dist/adt/legacy-content-handler.js.map +1 -1
- package/dist/adt/package-contents.d.ts +5 -0
- package/dist/adt/package-contents.d.ts.map +1 -1
- package/dist/adt/package-contents.js +31 -0
- package/dist/adt/package-contents.js.map +1 -1
- package/dist/adt/rap-generate.d.ts +2 -4
- package/dist/adt/rap-generate.d.ts.map +1 -1
- package/dist/adt/rap-generate.js +2 -4
- package/dist/adt/rap-generate.js.map +1 -1
- package/dist/adt/rap-preflight.js +7 -9
- package/dist/adt/rap-preflight.js.map +1 -1
- package/dist/adt/server-driven.d.ts +12 -1
- package/dist/adt/server-driven.d.ts.map +1 -1
- package/dist/adt/server-driven.js +22 -4
- package/dist/adt/server-driven.js.map +1 -1
- package/dist/adt/table-index.d.ts +23 -0
- package/dist/adt/table-index.d.ts.map +1 -0
- package/dist/adt/table-index.js +69 -0
- package/dist/adt/table-index.js.map +1 -0
- package/dist/adt/table-query.d.ts +1 -1
- package/dist/adt/table-query.d.ts.map +1 -1
- package/dist/adt/table-query.js +5 -6
- package/dist/adt/table-query.js.map +1 -1
- package/dist/adt/table-settings.d.ts +67 -0
- package/dist/adt/table-settings.d.ts.map +1 -0
- package/dist/adt/table-settings.js +207 -0
- package/dist/adt/table-settings.js.map +1 -0
- package/dist/adt/text-elements.d.ts +19 -4
- package/dist/adt/text-elements.d.ts.map +1 -1
- package/dist/adt/text-elements.js +119 -14
- package/dist/adt/text-elements.js.map +1 -1
- package/dist/adt/text-part-changes.d.ts +4 -0
- package/dist/adt/text-part-changes.d.ts.map +1 -0
- package/dist/adt/text-part-changes.js +43 -0
- package/dist/adt/text-part-changes.js.map +1 -0
- package/dist/adt/transport.js +2 -1
- package/dist/adt/transport.js.map +1 -1
- package/dist/adt/types.d.ts +10 -5
- package/dist/adt/types.d.ts.map +1 -1
- package/dist/adt/user-agent.d.ts +1 -1
- package/dist/adt/xml-parser.d.ts +5 -34
- package/dist/adt/xml-parser.d.ts.map +1 -1
- package/dist/adt/xml-parser.js +32 -149
- package/dist/adt/xml-parser.js.map +1 -1
- package/dist/context/line-range.d.ts +6 -0
- package/dist/context/line-range.d.ts.map +1 -0
- package/dist/context/line-range.js +23 -0
- package/dist/context/line-range.js.map +1 -0
- package/dist/context/method-surgery.d.ts.map +1 -1
- package/dist/context/method-surgery.js +46 -3
- package/dist/context/method-surgery.js.map +1 -1
- package/dist/handlers/activate.d.ts +1 -1
- package/dist/handlers/activate.d.ts.map +1 -1
- package/dist/handlers/activate.js +87 -9
- package/dist/handlers/activate.js.map +1 -1
- package/dist/handlers/activation-results.d.ts.map +1 -1
- package/dist/handlers/activation-results.js +9 -1
- package/dist/handlers/activation-results.js.map +1 -1
- package/dist/handlers/api-release-fields.d.ts +23 -0
- package/dist/handlers/api-release-fields.d.ts.map +1 -0
- package/dist/handlers/api-release-fields.js +21 -0
- package/dist/handlers/api-release-fields.js.map +1 -0
- package/dist/handlers/cds-hints.d.ts +1 -1
- package/dist/handlers/cds-hints.d.ts.map +1 -1
- package/dist/handlers/cds-hints.js.map +1 -1
- package/dist/handlers/feature-cache.d.ts +11 -3
- package/dist/handlers/feature-cache.d.ts.map +1 -1
- package/dist/handlers/feature-cache.js +57 -3
- package/dist/handlers/feature-cache.js.map +1 -1
- package/dist/handlers/hyperfocused.d.ts +1 -1
- package/dist/handlers/hyperfocused.d.ts.map +1 -1
- package/dist/handlers/hyperfocused.js.map +1 -1
- package/dist/handlers/manage.d.ts.map +1 -1
- package/dist/handlers/manage.js +19 -25
- package/dist/handlers/manage.js.map +1 -1
- package/dist/handlers/navigate.d.ts.map +1 -1
- package/dist/handlers/navigate.js +50 -12
- package/dist/handlers/navigate.js.map +1 -1
- package/dist/handlers/object-types.d.ts +0 -5
- package/dist/handlers/object-types.d.ts.map +1 -1
- package/dist/handlers/object-types.js +30 -12
- package/dist/handlers/object-types.js.map +1 -1
- package/dist/handlers/query-errors.d.ts.map +1 -1
- package/dist/handlers/query-errors.js +9 -0
- package/dist/handlers/query-errors.js.map +1 -1
- package/dist/handlers/read.d.ts.map +1 -1
- package/dist/handlers/read.js +77 -9
- package/dist/handlers/read.js.map +1 -1
- package/dist/handlers/schemas.d.ts +40 -0
- package/dist/handlers/schemas.d.ts.map +1 -1
- package/dist/handlers/schemas.js +98 -11
- package/dist/handlers/schemas.js.map +1 -1
- package/dist/handlers/search.d.ts.map +1 -1
- package/dist/handlers/search.js +10 -6
- package/dist/handlers/search.js.map +1 -1
- package/dist/handlers/syntax.d.ts.map +1 -1
- package/dist/handlers/syntax.js +44 -15
- package/dist/handlers/syntax.js.map +1 -1
- package/dist/handlers/table-type-fields.d.ts +33 -0
- package/dist/handlers/table-type-fields.d.ts.map +1 -0
- package/dist/handlers/table-type-fields.js +22 -0
- package/dist/handlers/table-type-fields.js.map +1 -0
- package/dist/handlers/tool-descriptions.d.ts.map +1 -1
- package/dist/handlers/tool-descriptions.js +9 -4
- package/dist/handlers/tool-descriptions.js.map +1 -1
- package/dist/handlers/tool-registry.d.ts +5 -5
- package/dist/handlers/tool-registry.d.ts.map +1 -1
- package/dist/handlers/tool-registry.js +10 -7
- package/dist/handlers/tool-registry.js.map +1 -1
- package/dist/handlers/tools.d.ts +1 -1
- package/dist/handlers/tools.d.ts.map +1 -1
- package/dist/handlers/tools.js +44 -44
- package/dist/handlers/tools.js.map +1 -1
- package/dist/handlers/where-used.d.ts +2 -0
- package/dist/handlers/where-used.d.ts.map +1 -1
- package/dist/handlers/where-used.js +13 -4
- package/dist/handlers/where-used.js.map +1 -1
- package/dist/handlers/write/create.d.ts.map +1 -1
- package/dist/handlers/write/create.js +69 -24
- package/dist/handlers/write/create.js.map +1 -1
- package/dist/handlers/write/rap.d.ts.map +1 -1
- package/dist/handlers/write/rap.js +2 -4
- package/dist/handlers/write/rap.js.map +1 -1
- package/dist/handlers/write/table-settings.d.ts +5 -0
- package/dist/handlers/write/table-settings.d.ts.map +1 -0
- package/dist/handlers/write/table-settings.js +27 -0
- package/dist/handlers/write/table-settings.js.map +1 -0
- package/dist/handlers/write/update-delete.d.ts +2 -2
- package/dist/handlers/write/update-delete.d.ts.map +1 -1
- package/dist/handlers/write/update-delete.js +50 -9
- package/dist/handlers/write/update-delete.js.map +1 -1
- package/dist/handlers/write-helpers.d.ts +4 -1
- package/dist/handlers/write-helpers.d.ts.map +1 -1
- package/dist/handlers/write-helpers.js +68 -8
- package/dist/handlers/write-helpers.js.map +1 -1
- package/dist/handlers/write.d.ts.map +1 -1
- package/dist/handlers/write.js +6 -10
- package/dist/handlers/write.js.map +1 -1
- package/dist/lint/config-builder.d.ts.map +1 -1
- package/dist/lint/config-builder.js +3 -2
- package/dist/lint/config-builder.js.map +1 -1
- package/dist/server/audit.d.ts +4 -0
- package/dist/server/audit.d.ts.map +1 -1
- package/dist/server/audit.js.map +1 -1
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +38 -1
- package/dist/server/config.js.map +1 -1
- package/dist/server/destination-discovery.d.ts +12 -2
- package/dist/server/destination-discovery.d.ts.map +1 -1
- package/dist/server/destination-discovery.js +33 -7
- package/dist/server/destination-discovery.js.map +1 -1
- package/dist/server/destination-registry.d.ts +10 -6
- package/dist/server/destination-registry.d.ts.map +1 -1
- package/dist/server/destination-registry.js +38 -15
- package/dist/server/destination-registry.js.map +1 -1
- package/dist/server/http-request-body.d.ts +4 -0
- package/dist/server/http-request-body.d.ts.map +1 -0
- package/dist/server/http-request-body.js +65 -0
- package/dist/server/http-request-body.js.map +1 -0
- package/dist/server/http.d.ts +5 -2
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +71 -9
- package/dist/server/http.js.map +1 -1
- package/dist/server/multi-target-authorization-audit.d.ts +5 -0
- package/dist/server/multi-target-authorization-audit.d.ts.map +1 -0
- package/dist/server/multi-target-authorization-audit.js +18 -0
- package/dist/server/multi-target-authorization-audit.js.map +1 -0
- package/dist/server/multi-target-authorization-startup.d.ts +8 -0
- package/dist/server/multi-target-authorization-startup.d.ts.map +1 -0
- package/dist/server/multi-target-authorization-startup.js +38 -0
- package/dist/server/multi-target-authorization-startup.js.map +1 -0
- package/dist/server/multi-target-authorization.d.ts +29 -0
- package/dist/server/multi-target-authorization.d.ts.map +1 -0
- package/dist/server/multi-target-authorization.js +97 -0
- package/dist/server/multi-target-authorization.js.map +1 -0
- package/dist/server/multi-target-bearer-auth.d.ts +5 -0
- package/dist/server/multi-target-bearer-auth.d.ts.map +1 -0
- package/dist/server/multi-target-bearer-auth.js +39 -0
- package/dist/server/multi-target-bearer-auth.js.map +1 -0
- package/dist/server/multi-target-catalog-enforced.d.ts +29 -0
- package/dist/server/multi-target-catalog-enforced.d.ts.map +1 -0
- package/dist/server/multi-target-catalog-enforced.js +142 -0
- package/dist/server/multi-target-catalog-enforced.js.map +1 -0
- package/dist/server/multi-target-catalog-projection.d.ts +7 -0
- package/dist/server/multi-target-catalog-projection.d.ts.map +1 -0
- package/dist/server/multi-target-catalog-projection.js +52 -0
- package/dist/server/multi-target-catalog-projection.js.map +1 -0
- package/dist/server/multi-target-feature-state.d.ts +0 -2
- package/dist/server/multi-target-feature-state.d.ts.map +1 -1
- package/dist/server/multi-target-feature-state.js +0 -19
- package/dist/server/multi-target-feature-state.js.map +1 -1
- package/dist/server/multi-target-identity.d.ts +3 -0
- package/dist/server/multi-target-identity.d.ts.map +1 -1
- package/dist/server/multi-target-identity.js +9 -0
- package/dist/server/multi-target-identity.js.map +1 -1
- package/dist/server/multi-target-request-projection.d.ts +14 -0
- package/dist/server/multi-target-request-projection.d.ts.map +1 -0
- package/dist/server/multi-target-request-projection.js +16 -0
- package/dist/server/multi-target-request-projection.js.map +1 -0
- package/dist/server/multi-target-runtime.d.ts.map +1 -1
- package/dist/server/multi-target-runtime.js +1 -0
- package/dist/server/multi-target-runtime.js.map +1 -1
- package/dist/server/multi-target-server.d.ts +4 -1
- package/dist/server/multi-target-server.d.ts.map +1 -1
- package/dist/server/multi-target-server.js +111 -11
- package/dist/server/multi-target-server.js.map +1 -1
- package/dist/server/multi-target-tools.d.ts +1 -1
- package/dist/server/multi-target-tools.d.ts.map +1 -1
- package/dist/server/multi-target-tools.js +14 -8
- package/dist/server/multi-target-tools.js.map +1 -1
- package/dist/server/private-mcp-response.d.ts +4 -0
- package/dist/server/private-mcp-response.d.ts.map +1 -0
- package/dist/server/private-mcp-response.js +14 -0
- package/dist/server/private-mcp-response.js.map +1 -0
- package/dist/server/server-cache.d.ts +5 -0
- package/dist/server/server-cache.d.ts.map +1 -0
- package/dist/server/server-cache.js +30 -0
- package/dist/server/server-cache.js.map +1 -0
- package/dist/server/server.d.ts +7 -21
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +58 -88
- package/dist/server/server.js.map +1 -1
- package/dist/server/sinks/btp-auditlog.d.ts.map +1 -1
- package/dist/server/sinks/btp-auditlog.js +4 -1
- package/dist/server/sinks/btp-auditlog.js.map +1 -1
- package/dist/server/types.d.ts +7 -0
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +4 -0
- package/dist/server/types.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +20 -14
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BAdI enhancement implementations (ENHO/XHB) — create/update XML and the JSON definition SAPWrite accepts.
|
|
3
|
+
*
|
|
4
|
+
* ADT models an XHB enhancement implementation as ONE metadata document (no /source/main):
|
|
5
|
+
* GET/PUT /sap/bc/adt/enhancements/enhoxhb/{name} application/vnd.sap.adt.enh.enhoxhb.v4+xml
|
|
6
|
+
* <enho:objectData adtcore:type="ENHO/XHB" …><adtcore:packageRef/>
|
|
7
|
+
* <enho:contentCommon enho:toolType="BADI_IMPL"><enho:usages> → the enhancement spot (ENHS/XSB)
|
|
8
|
+
* <enho:contentSpecific><enho:badiTechnology><enho:badiImplementations><enho:badiImplementation …>
|
|
9
|
+
* enhancementSpot, badiDefinition (ENHS/XB), implementingClass (CLAS/OC)
|
|
10
|
+
*
|
|
11
|
+
* The body mirrors SAP's own GET serialization (tests/fixtures/xml/enhancement-implementation.xml).
|
|
12
|
+
* Create follows Eclipse: POST the container (spot, no implementations), then lock → PUT the full
|
|
13
|
+
* document with the transport → unlock (`badiContainerXml`).
|
|
14
|
+
* Live evidence: docs/research/2026-10-07-enho-xhb-write-contract.md.
|
|
15
|
+
*
|
|
16
|
+
* SAPRead returns the implementation as JSON and SAPWrite takes the same JSON in "source", so a
|
|
17
|
+
* read → edit → write cycle needs no reshaping. Read-only keys (name, package, technology, …) are ignored.
|
|
18
|
+
*/
|
|
19
|
+
import { type FilterDeclaration } from './enho-filter.js';
|
|
20
|
+
import type { AdtHttpClient } from './http.js';
|
|
21
|
+
import { type SafetyConfig } from './safety.js';
|
|
22
|
+
import type { EnhancementImplementationInfo } from './types.js';
|
|
23
|
+
export declare const ENHO_XHB_CONTENT_TYPE = "application/vnd.sap.adt.enh.enhoxhb.v4+xml";
|
|
24
|
+
export declare const ENHO_XHB_COLLECTION = "/sap/bc/adt/enhancements/enhoxhb";
|
|
25
|
+
/** Media type of the spot read, live-verified from discovery and the response Content-Type. */
|
|
26
|
+
export declare const ENHS_XSB_CONTENT_TYPE = "application/vnd.sap.adt.enh.enhs.v2+xml";
|
|
27
|
+
export interface BadiImplementationEntry {
|
|
28
|
+
name: string;
|
|
29
|
+
badiDefinition: string;
|
|
30
|
+
implementingClass: string;
|
|
31
|
+
shortText?: string;
|
|
32
|
+
active?: boolean;
|
|
33
|
+
default?: boolean;
|
|
34
|
+
/** Filter condition as SAPRead shows it, e.g. `COUNTRY = 'BE'`; '' removes a stored filter. */
|
|
35
|
+
filter?: string;
|
|
36
|
+
/** Set by the merge: the stored `<enho:filterTree>` stays as it is (filter unchanged or not given). */
|
|
37
|
+
keepStoredFilter?: boolean;
|
|
38
|
+
/** Set by resolveBadiFilters: a new filter tree built from `filter` and the BAdI's declarations. */
|
|
39
|
+
filterTreeXml?: string;
|
|
40
|
+
/** Stored content ARC-1 does not model, carried through an update unchanged (set by the merge only). */
|
|
41
|
+
preserved?: PreservedImplementation;
|
|
42
|
+
}
|
|
43
|
+
/** Per-implementation content an update must not drop: SAP keeps only what the PUT sends (live 816). */
|
|
44
|
+
export interface PreservedImplementation {
|
|
45
|
+
example: string;
|
|
46
|
+
customizingLock: string;
|
|
47
|
+
/** SAP's own `<enho:filterTree>` element, re-sent verbatim. */
|
|
48
|
+
filterTreeXml: string;
|
|
49
|
+
}
|
|
50
|
+
/** The writable part of an XHB enhancement implementation — what SAPWrite accepts as JSON in "source". */
|
|
51
|
+
export interface BadiImplementationDefinition {
|
|
52
|
+
enhancementSpot?: string;
|
|
53
|
+
badiImplementations?: BadiImplementationEntry[];
|
|
54
|
+
/** Set by the update merge from the stored document; not a JSON key. */
|
|
55
|
+
abapLanguageVersion?: string;
|
|
56
|
+
}
|
|
57
|
+
/** Stored implementation plus the spot named in its usages (also present when it has no BAdI implementations). */
|
|
58
|
+
export type StoredBadiImplementation = EnhancementImplementationInfo & {
|
|
59
|
+
enhancementSpot?: string;
|
|
60
|
+
/** `adtcore:abapLanguageVersion` of the stored document, e.g. "standard" or "cloudDevelopment". */
|
|
61
|
+
abapLanguageVersion?: string;
|
|
62
|
+
/** Keyed by upper-case implementation name. */
|
|
63
|
+
preserved?: Map<string, PreservedImplementation>;
|
|
64
|
+
};
|
|
65
|
+
/** Read an XHB implementation. Omitting `version` returns SAP's developer view (a pending inactive edit). */
|
|
66
|
+
export declare function getBadiEnhancementImplementation(http: AdtHttpClient, safety: SafetyConfig, name: string): Promise<StoredBadiImplementation>;
|
|
67
|
+
/**
|
|
68
|
+
* Parse and validate the JSON definition from SAPWrite "source". Unknown keys are rejected (a typo
|
|
69
|
+
* such as "implementingclass" would otherwise silently keep the stored value); SAPRead's read-only
|
|
70
|
+
* keys are ignored so its output can be edited and written back unchanged.
|
|
71
|
+
*/
|
|
72
|
+
export declare function parseBadiImplementationDefinition(source: string): BadiImplementationDefinition;
|
|
73
|
+
/**
|
|
74
|
+
* Overlay a definition on the stored implementation for a full-document PUT. A supplied
|
|
75
|
+
* badiImplementations list replaces the stored one (entries left out are removed); within an entry
|
|
76
|
+
* that already exists, omitted shortText/active/default keep their stored value, so changing one
|
|
77
|
+
* flag cannot silently reset the others. The spot cannot change.
|
|
78
|
+
*
|
|
79
|
+
* SAP stores only what the PUT sends (live 816: `example`, `customizingLock` and filter trees were reset
|
|
80
|
+
* by a rebuilt document), so stored content outside the JSON model is carried over per entry. An omitted
|
|
81
|
+
* or unchanged `filter` keeps SAP's stored filter tree verbatim; a changed one is rebuilt by
|
|
82
|
+
* resolveBadiFilters; `filter: ""` removes it.
|
|
83
|
+
*/
|
|
84
|
+
export declare function mergeBadiImplementationDefinition(existing: StoredBadiImplementation, def: BadiImplementationDefinition): BadiImplementationDefinition;
|
|
85
|
+
export interface BadiImplementationXmlParams {
|
|
86
|
+
name: string;
|
|
87
|
+
description: string;
|
|
88
|
+
package: string;
|
|
89
|
+
definition: BadiImplementationDefinition;
|
|
90
|
+
/** Master language, e.g. "EN" (normalized by the caller). */
|
|
91
|
+
masterLanguage: string;
|
|
92
|
+
/** Pre-built ` adtcore:responsible="…"` attribute, or ''. */
|
|
93
|
+
responsibleAttr: string;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* The create POST body: the same document without BAdI implementations. Eclipse creates the empty
|
|
97
|
+
* container first and saves the implementations with a locked PUT. Posting them with the create fails in
|
|
98
|
+
* a transportable package with HTTP 500 "Screen output without connection to user" and leaves a TADIR
|
|
99
|
+
* entry without content (live 816, 2026-10-07); in $TMP both ways work.
|
|
100
|
+
*/
|
|
101
|
+
export declare function badiContainerXml(xml: string): string;
|
|
102
|
+
/** True when the document carries at least one BAdI implementation. */
|
|
103
|
+
export declare function hasBadiImplementations(xml: string): boolean;
|
|
104
|
+
/**
|
|
105
|
+
* Read the BAdI definitions of an enhancement spot (`GET /sap/bc/adt/enhancements/enhsxsb/{spot}`):
|
|
106
|
+
* BAdI name → its declared filters (type and DDIC check) from `<enhs:badiDefinition><enhs:filters>`.
|
|
107
|
+
*/
|
|
108
|
+
export declare function getEnhancementSpotBadis(http: AdtHttpClient, safety: SafetyConfig, spot: string): Promise<Map<string, Map<string, FilterDeclaration>>>;
|
|
109
|
+
/**
|
|
110
|
+
* Check every BAdI implementation against the spot and build the filter trees that are new or changed.
|
|
111
|
+
* The spot read is best-effort for the check alone (SAP repeats it at activation), but required when a
|
|
112
|
+
* filter has to be built, because its type and DDIC check come from the BAdI definition.
|
|
113
|
+
*
|
|
114
|
+
* `createName` (create only): a Z/Y implementation of an SAP-internal spot is refused here, because SAP
|
|
115
|
+
* refuses the create POST with HTTP 400 but still leaves a TADIR entry that ADT can neither read nor
|
|
116
|
+
* delete (live 2026-10-08). Such a create therefore always reads the spot, even without implementations,
|
|
117
|
+
* and fails when the read fails.
|
|
118
|
+
*/
|
|
119
|
+
export declare function resolveBadiFilters(http: AdtHttpClient, safety: SafetyConfig, definition: BadiImplementationDefinition, createName?: string): Promise<BadiImplementationDefinition>;
|
|
120
|
+
/**
|
|
121
|
+
* Build the create/update body. Element order and references follow SAP's own GET serialization.
|
|
122
|
+
* New entries default to active=true and default=false, the Eclipse defaults.
|
|
123
|
+
*/
|
|
124
|
+
export declare function buildBadiImplementationXml(params: BadiImplementationXmlParams): string;
|
|
125
|
+
//# sourceMappingURL=enhancement-impl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhancement-impl.d.ts","sourceRoot":"","sources":["../../src/adt/enhancement-impl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BAdI enhancement implementations (ENHO/XHB) — create/update XML and the JSON definition SAPWrite accepts.
|
|
3
|
+
*
|
|
4
|
+
* ADT models an XHB enhancement implementation as ONE metadata document (no /source/main):
|
|
5
|
+
* GET/PUT /sap/bc/adt/enhancements/enhoxhb/{name} application/vnd.sap.adt.enh.enhoxhb.v4+xml
|
|
6
|
+
* <enho:objectData adtcore:type="ENHO/XHB" …><adtcore:packageRef/>
|
|
7
|
+
* <enho:contentCommon enho:toolType="BADI_IMPL"><enho:usages> → the enhancement spot (ENHS/XSB)
|
|
8
|
+
* <enho:contentSpecific><enho:badiTechnology><enho:badiImplementations><enho:badiImplementation …>
|
|
9
|
+
* enhancementSpot, badiDefinition (ENHS/XB), implementingClass (CLAS/OC)
|
|
10
|
+
*
|
|
11
|
+
* The body mirrors SAP's own GET serialization (tests/fixtures/xml/enhancement-implementation.xml).
|
|
12
|
+
* Create follows Eclipse: POST the container (spot, no implementations), then lock → PUT the full
|
|
13
|
+
* document with the transport → unlock (`badiContainerXml`).
|
|
14
|
+
* Live evidence: docs/research/2026-10-07-enho-xhb-write-contract.md.
|
|
15
|
+
*
|
|
16
|
+
* SAPRead returns the implementation as JSON and SAPWrite takes the same JSON in "source", so a
|
|
17
|
+
* read → edit → write cycle needs no reshaping. Read-only keys (name, package, technology, …) are ignored.
|
|
18
|
+
*/
|
|
19
|
+
import { ABAP_NAME_RE, buildFilterTreeXml, normalizeFilterCondition, parseFilterCondition, withFilterConditions, } from './enho-filter.js';
|
|
20
|
+
import { AdtApiError } from './errors.js';
|
|
21
|
+
import { checkOperation, OperationType } from './safety.js';
|
|
22
|
+
import { escapeXmlAttr, getNestedArray, parseEnhancementImplementation, parseXml, toRecordArray, } from './xml-parser.js';
|
|
23
|
+
export const ENHO_XHB_CONTENT_TYPE = 'application/vnd.sap.adt.enh.enhoxhb.v4+xml';
|
|
24
|
+
export const ENHO_XHB_COLLECTION = '/sap/bc/adt/enhancements/enhoxhb';
|
|
25
|
+
/** Media type of the spot read, live-verified from discovery and the response Content-Type. */
|
|
26
|
+
export const ENHS_XSB_CONTENT_TYPE = 'application/vnd.sap.adt.enh.enhs.v2+xml';
|
|
27
|
+
/**
|
|
28
|
+
* A raw attribute value from a regex-captured attribute list, or ''. Only for ABAP names and type codes,
|
|
29
|
+
* which never contain entity references; free text comes from the (decoding) parser.
|
|
30
|
+
*/
|
|
31
|
+
function rawAttr(attrs, qualifiedName) {
|
|
32
|
+
return attrs.match(new RegExp(`(?:^|\\s)${qualifiedName}="([^"]*)"`))?.[1] ?? '';
|
|
33
|
+
}
|
|
34
|
+
/** Keep per implementation what the JSON model does not carry. */
|
|
35
|
+
function preservedImplementations(xml, doc) {
|
|
36
|
+
// The filter tree is cut out of the raw XML: it must be re-sent as SAP serialized it.
|
|
37
|
+
const trees = new Map();
|
|
38
|
+
for (const match of xml.matchAll(/<enho:badiImplementation\s((?:[^>"]|"[^"]*")*?)(?:\/>|>([\s\S]*?)<\/enho:badiImplementation>)/g)) {
|
|
39
|
+
const tree = (match[2] ?? '').match(/<enho:filterTree[\s>][\s\S]*<\/enho:filterTree>|<enho:filterTree\/>/)?.[0];
|
|
40
|
+
if (tree)
|
|
41
|
+
trees.set(rawAttr(match[1] ?? '', 'enho:name').toUpperCase(), tree);
|
|
42
|
+
}
|
|
43
|
+
// Attribute values come from the parser, already decoded, so escapeXmlAttr does not encode them twice.
|
|
44
|
+
const specific = asRecord(asRecord(doc.objectData)?.contentSpecific) ?? {};
|
|
45
|
+
const result = new Map();
|
|
46
|
+
for (const node of getNestedArray(asRecord(specific.badiTechnology) ?? {}, 'badiImplementations', 'badiImplementation')) {
|
|
47
|
+
const name = text(node['@_name']).toUpperCase();
|
|
48
|
+
if (!name)
|
|
49
|
+
continue;
|
|
50
|
+
result.set(name, {
|
|
51
|
+
example: text(node['@_example']),
|
|
52
|
+
customizingLock: String(node['@_customizingLock'] ?? ''),
|
|
53
|
+
filterTreeXml: trees.get(name) ?? '',
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
/** The ENHS/XSB spot from `<enho:contentCommon><enho:usages>`, or '' when the document names none. */
|
|
59
|
+
function usageSpot(doc) {
|
|
60
|
+
const common = asRecord(asRecord(doc.objectData)?.contentCommon) ?? {};
|
|
61
|
+
for (const ref of getNestedArray(common, 'usages', 'referencedObject')) {
|
|
62
|
+
// The parser yields objectReference as an array; mainObjectReference as a single node.
|
|
63
|
+
for (const target of [...toRecordArray(ref.objectReference), ...toRecordArray(ref.mainObjectReference)]) {
|
|
64
|
+
if (text(target['@_type']) === 'ENHS/XSB')
|
|
65
|
+
return text(target['@_name']).toUpperCase();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return '';
|
|
69
|
+
}
|
|
70
|
+
/** Read an XHB implementation. Omitting `version` returns SAP's developer view (a pending inactive edit). */
|
|
71
|
+
export async function getBadiEnhancementImplementation(http, safety, name) {
|
|
72
|
+
checkOperation(safety, OperationType.Read, 'GetEnhancementImplementation');
|
|
73
|
+
const resp = await http.get(`${ENHO_XHB_COLLECTION}/${encodeURIComponent(name)}`, { Accept: ENHO_XHB_CONTENT_TYPE });
|
|
74
|
+
const doc = parseXml(resp.body);
|
|
75
|
+
const info = withFilterConditions(doc, parseEnhancementImplementation(resp.body));
|
|
76
|
+
const spot = usageSpot(doc);
|
|
77
|
+
if (spot)
|
|
78
|
+
info.enhancementSpot = spot;
|
|
79
|
+
const version = text(asRecord(doc.objectData)?.['@_abapLanguageVersion']);
|
|
80
|
+
if (version)
|
|
81
|
+
info.abapLanguageVersion = version;
|
|
82
|
+
info.preserved = preservedImplementations(resp.body, doc);
|
|
83
|
+
return info;
|
|
84
|
+
}
|
|
85
|
+
/** Keys SAPRead emits that are not writable — accepted (and ignored) so read output round-trips. */
|
|
86
|
+
const READ_ONLY_KEYS = ['name', 'description', 'package', 'technology', 'switchSupported'];
|
|
87
|
+
const WRITABLE_KEYS = ['enhancementSpot', 'badiImplementations'];
|
|
88
|
+
const ENTRY_KEYS = [
|
|
89
|
+
'name',
|
|
90
|
+
'badiDefinition',
|
|
91
|
+
'implementingClass',
|
|
92
|
+
'enhancementSpot',
|
|
93
|
+
'shortText',
|
|
94
|
+
'active',
|
|
95
|
+
'default',
|
|
96
|
+
'filter',
|
|
97
|
+
];
|
|
98
|
+
function invalid(message) {
|
|
99
|
+
return new Error(`Invalid ENHO source: ${message}`);
|
|
100
|
+
}
|
|
101
|
+
function asRecord(value) {
|
|
102
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value)
|
|
103
|
+
? value
|
|
104
|
+
: undefined;
|
|
105
|
+
}
|
|
106
|
+
function text(value) {
|
|
107
|
+
return value === undefined || value === null ? '' : String(value).trim();
|
|
108
|
+
}
|
|
109
|
+
function rejectUnknownKeys(rec, allowed, where) {
|
|
110
|
+
const unknown = Object.keys(rec).filter((key) => !allowed.includes(key));
|
|
111
|
+
if (unknown.length)
|
|
112
|
+
throw invalid(`${where}: unknown key(s) ${unknown.map((key) => `"${key}"`).join(', ')}.`);
|
|
113
|
+
}
|
|
114
|
+
function validateName(value, where) {
|
|
115
|
+
const name = text(value).toUpperCase();
|
|
116
|
+
if (!name)
|
|
117
|
+
throw invalid(`${where} is required.`);
|
|
118
|
+
if (!ABAP_NAME_RE.test(name) || name.length > 30)
|
|
119
|
+
throw invalid(`${where} "${text(value)}" is not a valid ABAP name.`);
|
|
120
|
+
return name;
|
|
121
|
+
}
|
|
122
|
+
function optionalBoolean(value, where) {
|
|
123
|
+
if (value === undefined)
|
|
124
|
+
return undefined;
|
|
125
|
+
if (typeof value === 'boolean')
|
|
126
|
+
return value;
|
|
127
|
+
if (value === 'true' || value === 'false')
|
|
128
|
+
return value === 'true';
|
|
129
|
+
throw invalid(`${where} must be true or false.`);
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Parse and validate the JSON definition from SAPWrite "source". Unknown keys are rejected (a typo
|
|
133
|
+
* such as "implementingclass" would otherwise silently keep the stored value); SAPRead's read-only
|
|
134
|
+
* keys are ignored so its output can be edited and written back unchanged.
|
|
135
|
+
*/
|
|
136
|
+
export function parseBadiImplementationDefinition(source) {
|
|
137
|
+
let raw;
|
|
138
|
+
try {
|
|
139
|
+
raw = JSON.parse(source);
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
throw invalid(`expected a JSON object (${err instanceof Error ? err.message : String(err)}).`);
|
|
143
|
+
}
|
|
144
|
+
const rec = asRecord(raw);
|
|
145
|
+
if (!rec)
|
|
146
|
+
throw invalid('expected a JSON object.');
|
|
147
|
+
rejectUnknownKeys(rec, [...WRITABLE_KEYS, ...READ_ONLY_KEYS], 'definition');
|
|
148
|
+
if (rec.technology !== undefined && !['', 'BADI_IMPL'].includes(text(rec.technology))) {
|
|
149
|
+
throw invalid(`only BAdI implementations (technology "BADI_IMPL") are writable, got "${text(rec.technology)}".`);
|
|
150
|
+
}
|
|
151
|
+
// One enhancement implementation implements exactly one spot. SAPRead repeats it per entry.
|
|
152
|
+
const spots = new Set();
|
|
153
|
+
if (rec.enhancementSpot !== undefined)
|
|
154
|
+
spots.add(validateName(rec.enhancementSpot, 'enhancementSpot'));
|
|
155
|
+
const def = {};
|
|
156
|
+
if (rec.badiImplementations !== undefined) {
|
|
157
|
+
if (!Array.isArray(rec.badiImplementations))
|
|
158
|
+
throw invalid('badiImplementations must be an array.');
|
|
159
|
+
const seen = new Set();
|
|
160
|
+
def.badiImplementations = rec.badiImplementations.map((entry, i) => {
|
|
161
|
+
const where = `badiImplementations[${i}]`;
|
|
162
|
+
const erec = asRecord(entry);
|
|
163
|
+
if (!erec)
|
|
164
|
+
throw invalid(`${where} must be an object.`);
|
|
165
|
+
rejectUnknownKeys(erec, ENTRY_KEYS, where);
|
|
166
|
+
const name = validateName(erec.name, `${where}.name`);
|
|
167
|
+
if (seen.has(name))
|
|
168
|
+
throw invalid(`${where}.name "${name}" is listed twice.`);
|
|
169
|
+
seen.add(name);
|
|
170
|
+
if (erec.enhancementSpot !== undefined && text(erec.enhancementSpot) !== '') {
|
|
171
|
+
spots.add(validateName(erec.enhancementSpot, `${where}.enhancementSpot`));
|
|
172
|
+
}
|
|
173
|
+
const parsed = {
|
|
174
|
+
name,
|
|
175
|
+
badiDefinition: validateName(erec.badiDefinition, `${where}.badiDefinition`),
|
|
176
|
+
implementingClass: validateName(erec.implementingClass, `${where}.implementingClass`),
|
|
177
|
+
};
|
|
178
|
+
if (erec.shortText !== undefined && erec.shortText !== null) {
|
|
179
|
+
if (typeof erec.shortText !== 'string')
|
|
180
|
+
throw invalid(`${where}.shortText must be a text.`);
|
|
181
|
+
parsed.shortText = erec.shortText;
|
|
182
|
+
}
|
|
183
|
+
const active = optionalBoolean(erec.active, `${where}.active`);
|
|
184
|
+
if (active !== undefined)
|
|
185
|
+
parsed.active = active;
|
|
186
|
+
const isDefault = optionalBoolean(erec.default, `${where}.default`);
|
|
187
|
+
if (isDefault !== undefined)
|
|
188
|
+
parsed.default = isDefault;
|
|
189
|
+
if (erec.filter !== undefined && erec.filter !== null) {
|
|
190
|
+
if (typeof erec.filter !== 'string')
|
|
191
|
+
throw invalid(`${where}.filter must be a text such as "COUNTRY = 'DE'".`);
|
|
192
|
+
// Check the syntax now; the BAdI's declared filter names are checked against the spot later.
|
|
193
|
+
parsed.filter = erec.filter.trim() === '' ? '' : normalizeFilterCondition(erec.filter);
|
|
194
|
+
}
|
|
195
|
+
return parsed;
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
if (spots.size > 1) {
|
|
199
|
+
throw invalid(`an enhancement implementation belongs to one enhancement spot, got ${[...spots].join(', ')}.`);
|
|
200
|
+
}
|
|
201
|
+
if (spots.size === 1)
|
|
202
|
+
def.enhancementSpot = [...spots][0];
|
|
203
|
+
return def;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* Overlay a definition on the stored implementation for a full-document PUT. A supplied
|
|
207
|
+
* badiImplementations list replaces the stored one (entries left out are removed); within an entry
|
|
208
|
+
* that already exists, omitted shortText/active/default keep their stored value, so changing one
|
|
209
|
+
* flag cannot silently reset the others. The spot cannot change.
|
|
210
|
+
*
|
|
211
|
+
* SAP stores only what the PUT sends (live 816: `example`, `customizingLock` and filter trees were reset
|
|
212
|
+
* by a rebuilt document), so stored content outside the JSON model is carried over per entry. An omitted
|
|
213
|
+
* or unchanged `filter` keeps SAP's stored filter tree verbatim; a changed one is rebuilt by
|
|
214
|
+
* resolveBadiFilters; `filter: ""` removes it.
|
|
215
|
+
*/
|
|
216
|
+
export function mergeBadiImplementationDefinition(existing, def) {
|
|
217
|
+
// Rewriting another technology through the BAdI document would replace its content.
|
|
218
|
+
if (existing.technology && existing.technology !== 'BADI_IMPL') {
|
|
219
|
+
throw invalid(`${existing.name} is a ${existing.technology} enhancement; only BAdI implementations are writable.`);
|
|
220
|
+
}
|
|
221
|
+
const existingSpot = existing.enhancementSpot ||
|
|
222
|
+
(existing.badiImplementations.find((impl) => impl.enhancementSpot)?.enhancementSpot ?? '');
|
|
223
|
+
if (def.enhancementSpot && existingSpot && def.enhancementSpot !== existingSpot.toUpperCase()) {
|
|
224
|
+
throw invalid(`the enhancement spot cannot change (stored: ${existingSpot}, given: ${def.enhancementSpot}). ` +
|
|
225
|
+
'Create a new enhancement implementation for the other spot.');
|
|
226
|
+
}
|
|
227
|
+
const stored = new Map(existing.badiImplementations.map((impl) => [impl.name.toUpperCase(), impl]));
|
|
228
|
+
const entries = def.badiImplementations ?? existing.badiImplementations;
|
|
229
|
+
return {
|
|
230
|
+
enhancementSpot: def.enhancementSpot ?? (existingSpot.toUpperCase() || undefined),
|
|
231
|
+
// SAP stores only what the PUT sends; without it an ABAP-for-Cloud object could fall back to standard.
|
|
232
|
+
...(existing.abapLanguageVersion ? { abapLanguageVersion: existing.abapLanguageVersion } : {}),
|
|
233
|
+
badiImplementations: entries.map((entry) => {
|
|
234
|
+
const previous = stored.get(entry.name.toUpperCase());
|
|
235
|
+
const preserved = existing.preserved?.get(entry.name.toUpperCase());
|
|
236
|
+
// Decide on the stored tree itself, not on its text form: a tree ARC-1 cannot render (no `filter`
|
|
237
|
+
// in SAPRead) must still survive an update that leaves `filter` out.
|
|
238
|
+
const hasStoredTree = /<enho:filterToken[\s/>]/.test(preserved?.filterTreeXml ?? '');
|
|
239
|
+
const storedFilter = hasStoredTree ? (previous?.filter ?? '') : '';
|
|
240
|
+
const sameBadi = previous?.badiDefinition.toUpperCase() === entry.badiDefinition.toUpperCase();
|
|
241
|
+
const keepStoredFilter = hasStoredTree && sameBadi && (entry.filter === undefined || (!!storedFilter && entry.filter === storedFilter));
|
|
242
|
+
if (hasStoredTree && !sameBadi && entry.filter === undefined) {
|
|
243
|
+
throw invalid(`${entry.name}: its filter (${storedFilter || 'stored filter'}) belongs to BAdI ${previous?.badiDefinition}. ` +
|
|
244
|
+
'Give the filter for the new BAdI definition explicitly, or "filter": "" to remove it.');
|
|
245
|
+
}
|
|
246
|
+
return {
|
|
247
|
+
name: entry.name,
|
|
248
|
+
badiDefinition: entry.badiDefinition,
|
|
249
|
+
implementingClass: entry.implementingClass,
|
|
250
|
+
shortText: entry.shortText ?? previous?.shortText,
|
|
251
|
+
active: entry.active ?? previous?.active,
|
|
252
|
+
default: entry.default ?? previous?.default,
|
|
253
|
+
...(keepStoredFilter ? { keepStoredFilter } : entry.filter ? { filter: entry.filter } : {}),
|
|
254
|
+
...(preserved ? { preserved } : {}),
|
|
255
|
+
};
|
|
256
|
+
}),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* The create POST body: the same document without BAdI implementations. Eclipse creates the empty
|
|
261
|
+
* container first and saves the implementations with a locked PUT. Posting them with the create fails in
|
|
262
|
+
* a transportable package with HTTP 500 "Screen output without connection to user" and leaves a TADIR
|
|
263
|
+
* entry without content (live 816, 2026-10-07); in $TMP both ways work.
|
|
264
|
+
*/
|
|
265
|
+
export function badiContainerXml(xml) {
|
|
266
|
+
return xml.replace(/<enho:badiImplementations>[\s\S]*<\/enho:badiImplementations>/, '<enho:badiImplementations></enho:badiImplementations>');
|
|
267
|
+
}
|
|
268
|
+
/** True when the document carries at least one BAdI implementation. */
|
|
269
|
+
export function hasBadiImplementations(xml) {
|
|
270
|
+
return /<enho:badiImplementation\s/.test(xml);
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Read the BAdI definitions of an enhancement spot (`GET /sap/bc/adt/enhancements/enhsxsb/{spot}`):
|
|
274
|
+
* BAdI name → its declared filters (type and DDIC check) from `<enhs:badiDefinition><enhs:filters>`.
|
|
275
|
+
*/
|
|
276
|
+
export async function getEnhancementSpotBadis(http, safety, spot) {
|
|
277
|
+
return (await readEnhancementSpot(http, safety, spot)).badis;
|
|
278
|
+
}
|
|
279
|
+
async function readEnhancementSpot(http, safety, spot) {
|
|
280
|
+
checkOperation(safety, OperationType.Read, 'GetEnhancementSpot');
|
|
281
|
+
const resp = await http.get(`/sap/bc/adt/enhancements/enhsxsb/${encodeURIComponent(spot.toLowerCase())}`, {
|
|
282
|
+
Accept: ENHS_XSB_CONTENT_TYPE,
|
|
283
|
+
});
|
|
284
|
+
const result = new Map();
|
|
285
|
+
// A regex, not the parser: each filter's `<enhs:filterCheck>` is copied into the implementation as SAP wrote it.
|
|
286
|
+
for (const badi of resp.body.matchAll(/<enhs:badiDefinition\s((?:[^>"]|"[^"]*")*?)(?:\/>|>([\s\S]*?)<\/enhs:badiDefinition>)/g)) {
|
|
287
|
+
const name = rawAttr(badi[1], 'enhs:name').toUpperCase();
|
|
288
|
+
if (!name)
|
|
289
|
+
continue;
|
|
290
|
+
const body = badi[2] ?? '';
|
|
291
|
+
const filters = new Map();
|
|
292
|
+
// `<enhs:filter\s` does not match the `<enhs:filters>` wrapper or `<enhs:filterCheck>`.
|
|
293
|
+
for (const filter of body.matchAll(/<enhs:filter\s((?:[^>"]|"[^"]*")*?)(?:\/>|>([\s\S]*?)<\/enhs:filter>)/g)) {
|
|
294
|
+
const filterName = rawAttr(filter[1], 'enhs:filterName').toUpperCase();
|
|
295
|
+
if (!filterName)
|
|
296
|
+
continue;
|
|
297
|
+
const check = (filter[2] ?? '').match(/<enhs:filterCheck[\s>][\s\S]*?<\/enhs:filterCheck>|<enhs:filterCheck[^>]*\/>/)?.[0];
|
|
298
|
+
filters.set(filterName, {
|
|
299
|
+
type: rawAttr(filter[1], 'enhs:filterType'),
|
|
300
|
+
checkXml: check ? check.replace(/<(\/?)enhs:filterCheck/g, '<$1enho:filterCheck') : '',
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
result.set(name, filters);
|
|
304
|
+
}
|
|
305
|
+
// `<enhs:contentCommon enhs:internal="true">`: SAP refuses implementations in the customer namespace.
|
|
306
|
+
const common = resp.body.match(/<enhs:contentCommon\s((?:[^>"]|"[^"]*")*)>/)?.[1] ?? '';
|
|
307
|
+
return { internal: rawAttr(common, 'enhs:internal') === 'true', badis: result };
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Check every BAdI implementation against the spot and build the filter trees that are new or changed.
|
|
311
|
+
* The spot read is best-effort for the check alone (SAP repeats it at activation), but required when a
|
|
312
|
+
* filter has to be built, because its type and DDIC check come from the BAdI definition.
|
|
313
|
+
*
|
|
314
|
+
* `createName` (create only): a Z/Y implementation of an SAP-internal spot is refused here, because SAP
|
|
315
|
+
* refuses the create POST with HTTP 400 but still leaves a TADIR entry that ADT can neither read nor
|
|
316
|
+
* delete (live 2026-10-08). Such a create therefore always reads the spot, even without implementations,
|
|
317
|
+
* and fails when the read fails.
|
|
318
|
+
*/
|
|
319
|
+
export async function resolveBadiFilters(http, safety, definition, createName) {
|
|
320
|
+
const spot = definition.enhancementSpot;
|
|
321
|
+
const entries = definition.badiImplementations ?? [];
|
|
322
|
+
const needTree = entries.filter((entry) => entry.filter && !entry.keepStoredFilter);
|
|
323
|
+
const customerCreate = /^[ZY]/i.test(createName ?? '');
|
|
324
|
+
if (!spot || (!entries.length && !customerCreate))
|
|
325
|
+
return definition;
|
|
326
|
+
let badis = new Map();
|
|
327
|
+
let internal = false;
|
|
328
|
+
try {
|
|
329
|
+
({ badis, internal } = await readEnhancementSpot(http, safety, spot));
|
|
330
|
+
}
|
|
331
|
+
catch (err) {
|
|
332
|
+
if (err instanceof AdtApiError && err.statusCode === 404)
|
|
333
|
+
throw invalid(`enhancement spot ${spot} does not exist.`);
|
|
334
|
+
if (needTree.length || customerCreate)
|
|
335
|
+
throw err;
|
|
336
|
+
}
|
|
337
|
+
if (internal && customerCreate) {
|
|
338
|
+
throw invalid(`enhancement spot ${spot} is SAP-internal; SAP allows no implementation of it in the customer namespace.`);
|
|
339
|
+
}
|
|
340
|
+
if (!badis.size && needTree.length) {
|
|
341
|
+
throw invalid(`could not read the BAdI filter declarations of enhancement spot ${spot}.`);
|
|
342
|
+
}
|
|
343
|
+
if (badis.size) {
|
|
344
|
+
for (const entry of entries) {
|
|
345
|
+
if (!badis.has(entry.badiDefinition)) {
|
|
346
|
+
throw invalid(`BAdI ${entry.badiDefinition} is not defined in enhancement spot ${spot} ` +
|
|
347
|
+
`(defined: ${[...badis.keys()].join(', ')}).`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return {
|
|
352
|
+
...definition,
|
|
353
|
+
badiImplementations: entries.map((entry) => {
|
|
354
|
+
if (!entry.filter || entry.keepStoredFilter)
|
|
355
|
+
return entry;
|
|
356
|
+
const filters = badis.get(entry.badiDefinition) ?? new Map();
|
|
357
|
+
return {
|
|
358
|
+
...entry,
|
|
359
|
+
filterTreeXml: buildFilterTreeXml(parseFilterCondition(entry.filter), entry.name, filters, entry.badiDefinition),
|
|
360
|
+
};
|
|
361
|
+
}),
|
|
362
|
+
};
|
|
363
|
+
}
|
|
364
|
+
function lowerUriName(name) {
|
|
365
|
+
return encodeURIComponent(name.toLowerCase());
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Build the create/update body. Element order and references follow SAP's own GET serialization.
|
|
369
|
+
* New entries default to active=true and default=false, the Eclipse defaults.
|
|
370
|
+
*/
|
|
371
|
+
export function buildBadiImplementationXml(params) {
|
|
372
|
+
const { definition } = params;
|
|
373
|
+
const spot = definition.enhancementSpot;
|
|
374
|
+
if (!spot) {
|
|
375
|
+
throw invalid('enhancementSpot is required, e.g. {"enhancementSpot":"ES_MY_SPOT","badiImplementations":[{"name":"ZMY_IMPL",' +
|
|
376
|
+
'"badiDefinition":"BADI_MY","implementingClass":"ZCL_MY_IMPL"}]}.');
|
|
377
|
+
}
|
|
378
|
+
const spotRef = `adtcore:uri="/sap/bc/adt/enhancements/enhsxsb/${lowerUriName(spot)}" adtcore:type="ENHS/XSB" adtcore:name="${escapeXmlAttr(spot)}"`;
|
|
379
|
+
const version = definition.abapLanguageVersion
|
|
380
|
+
? ` adtcore:abapLanguageVersion="${escapeXmlAttr(definition.abapLanguageVersion)}"`
|
|
381
|
+
: '';
|
|
382
|
+
const implementations = (definition.badiImplementations ?? [])
|
|
383
|
+
.map((impl) => {
|
|
384
|
+
const kept = impl.preserved;
|
|
385
|
+
const filterTree = impl.filterTreeXml ?? (impl.keepStoredFilter ? kept?.filterTreeXml : '') ?? '';
|
|
386
|
+
// Guard: a new filter must have been resolved against the spot (resolveBadiFilters) before building.
|
|
387
|
+
if (impl.filter && !filterTree)
|
|
388
|
+
throw invalid(`${impl.name}: the filter was not resolved against the spot.`);
|
|
389
|
+
// Stored values of attributes outside the JSON model; omitted on create, where SAP sets its defaults.
|
|
390
|
+
const example = kept?.example === 'true' ? 'true' : 'false';
|
|
391
|
+
const lock = kept ? ` enho:customizingLock="${escapeXmlAttr(kept.customizingLock)}"` : '';
|
|
392
|
+
return (`<enho:badiImplementation enho:name="${escapeXmlAttr(impl.name)}" enho:shortText="${escapeXmlAttr(impl.shortText ?? '')}" enho:example="${example}" enho:default="${impl.default === true}" enho:active="${impl.active !== false}"${lock}>` +
|
|
393
|
+
`<enho:enhancementSpot ${spotRef}/>` +
|
|
394
|
+
`<enho:badiDefinition adtcore:uri="/sap/bc/adt/vit/wb/object_type/enhsxb/object_name/${encodeURIComponent(spot)}" adtcore:type="ENHS/XB" adtcore:name="${escapeXmlAttr(impl.badiDefinition)}"/>` +
|
|
395
|
+
`<enho:implementingClass adtcore:uri="/sap/bc/adt/oo/classes/${lowerUriName(impl.implementingClass)}" adtcore:type="CLAS/OC" adtcore:name="${escapeXmlAttr(impl.implementingClass)}"/>` +
|
|
396
|
+
// SAP's stored tree re-sent verbatim, or the one built from `filter`; an update must not drop it.
|
|
397
|
+
filterTree +
|
|
398
|
+
'</enho:badiImplementation>');
|
|
399
|
+
})
|
|
400
|
+
.join('');
|
|
401
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
402
|
+
<enho:objectData xmlns:enho="http://www.sap.com/adt/enhancements/enho" xmlns:adtcore="http://www.sap.com/adt/core" xmlns:enhcore="http://www.sap.com/abapsource/enhancementscore" adtcore:type="ENHO/XHB" adtcore:name="${escapeXmlAttr(params.name)}" adtcore:description="${escapeXmlAttr(params.description)}" adtcore:masterLanguage="${escapeXmlAttr(params.masterLanguage)}"${version}${params.responsibleAttr}>
|
|
403
|
+
<adtcore:packageRef adtcore:name="${escapeXmlAttr(params.package)}"/>
|
|
404
|
+
<enho:contentCommon enho:toolType="BADI_IMPL"><enho:usages><enhcore:referencedObject enhcore:program_id="R3TR" enhcore:element_usage="EXTO"><enhcore:objectReference ${spotRef}/><enhcore:mainObjectReference ${spotRef}/></enhcore:referencedObject></enho:usages></enho:contentCommon>
|
|
405
|
+
<enho:contentSpecific><enho:badiTechnology><enho:badiImplementations>${implementations}</enho:badiImplementations></enho:badiTechnology></enho:contentSpecific>
|
|
406
|
+
</enho:objectData>`;
|
|
407
|
+
}
|
|
408
|
+
//# sourceMappingURL=enhancement-impl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhancement-impl.js","sourceRoot":"","sources":["../../src/adt/enhancement-impl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EACL,YAAY,EACZ,kBAAkB,EAElB,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,aAAa,EAAqB,MAAM,aAAa,CAAC;AAE/E,OAAO,EACL,aAAa,EACb,cAAc,EACd,8BAA8B,EAC9B,QAAQ,EACR,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,MAAM,CAAC,MAAM,qBAAqB,GAAG,4CAA4C,CAAC;AAClF,MAAM,CAAC,MAAM,mBAAmB,GAAG,kCAAkC,CAAC;AACtE,+FAA+F;AAC/F,MAAM,CAAC,MAAM,qBAAqB,GAAG,yCAAyC,CAAC;AA4C/E;;;GAGG;AACH,SAAS,OAAO,CAAC,KAAa,EAAE,aAAqB;IACnD,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,YAAY,aAAa,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACnF,CAAC;AAED,kEAAkE;AAClE,SAAS,wBAAwB,CAAC,GAAW,EAAE,GAA4B;IACzE,sFAAsF;IACtF,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,CAC9B,gGAAgG,CACjG,EAAE,CAAC;QACF,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,qEAAqE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAChH,IAAI,IAAI;YAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,WAAW,CAAC,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;IAChF,CAAC;IACD,uGAAuG;IACvG,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,eAAe,CAAC,IAAI,EAAE,CAAC;IAC3E,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmC,CAAC;IAC1D,KAAK,MAAM,IAAI,IAAI,cAAc,CAC/B,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,EACvC,qBAAqB,EACrB,oBAAoB,CACrB,EAAE,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE;YACf,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAChC,eAAe,EAAE,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,CAAC;YACxD,aAAa,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;SACrC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,sGAAsG;AACtG,SAAS,SAAS,CAAC,GAA4B;IAC7C,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,aAAa,CAAC,IAAI,EAAE,CAAC;IACvE,KAAK,MAAM,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EAAE,CAAC;QACvE,uFAAuF;QACvF,KAAK,MAAM,MAAM,IAAI,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE,GAAG,aAAa,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC;YACxG,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,UAAU;gBAAE,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;QACzF,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,6GAA6G;AAC7G,MAAM,CAAC,KAAK,UAAU,gCAAgC,CACpD,IAAmB,EACnB,MAAoB,EACpB,IAAY;IAEZ,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,8BAA8B,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,mBAAmB,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACrH,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,GAA6B,oBAAoB,CAAC,GAAG,EAAE,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5G,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,IAAI;QAAE,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC1E,IAAI,OAAO;QAAE,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC;IAChD,IAAI,CAAC,SAAS,GAAG,wBAAwB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,oGAAoG;AACpG,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC;AAC3F,MAAM,aAAa,GAAG,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,CAAC;AACjE,MAAM,UAAU,GAAG;IACjB,MAAM;IACN,gBAAgB;IAChB,mBAAmB;IACnB,iBAAiB;IACjB,WAAW;IACX,QAAQ;IACR,SAAS;IACT,QAAQ;CACT,CAAC;AAEF,SAAS,OAAO,CAAC,OAAe;IAC9B,OAAO,IAAI,KAAK,CAAC,wBAAwB,OAAO,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACzE,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,SAAS,IAAI,CAAC,KAAc;IAC1B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC3E,CAAC;AAED,SAAS,iBAAiB,CAAC,GAA4B,EAAE,OAAiB,EAAE,KAAa;IACvF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IACzE,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,OAAO,CAAC,GAAG,KAAK,oBAAoB,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChH,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,KAAa;IACjD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,CAAC,IAAI;QAAE,MAAM,OAAO,CAAC,GAAG,KAAK,eAAe,CAAC,CAAC;IAClD,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,EAAE;QAC9C,MAAM,OAAO,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACvE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,eAAe,CAAC,KAAc,EAAE,KAAa;IACpD,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,KAAK,KAAK,MAAM,CAAC;IACnE,MAAM,OAAO,CAAC,GAAG,KAAK,yBAAyB,CAAC,CAAC;AACnD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iCAAiC,CAAC,MAAc;IAC9D,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,CAAC,2BAA2B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjG,CAAC;IACD,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,CAAC,GAAG;QAAE,MAAM,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACnD,iBAAiB,CAAC,GAAG,EAAE,CAAC,GAAG,aAAa,EAAE,GAAG,cAAc,CAAC,EAAE,YAAY,CAAC,CAAC;IAC5E,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,IAAI,CAAC,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACtF,MAAM,OAAO,CAAC,yEAAyE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACnH,CAAC;IACD,4FAA4F;IAC5F,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,IAAI,GAAG,CAAC,eAAe,KAAK,SAAS;QAAE,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACvG,MAAM,GAAG,GAAiC,EAAE,CAAC;IAC7C,IAAI,GAAG,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC1C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;YAAE,MAAM,OAAO,CAAC,uCAAuC,CAAC,CAAC;QACpG,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,GAAG,CAAC,mBAAmB,GAAG,GAAG,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACjE,MAAM,KAAK,GAAG,uBAAuB,CAAC,GAAG,CAAC;YAC1C,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC7B,IAAI,CAAC,IAAI;gBAAE,MAAM,OAAO,CAAC,GAAG,KAAK,qBAAqB,CAAC,CAAC;YACxD,iBAAiB,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;YAC3C,MAAM,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC;YACtD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,MAAM,OAAO,CAAC,GAAG,KAAK,UAAU,IAAI,oBAAoB,CAAC,CAAC;YAC9E,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC5E,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,CAAC,eAAe,EAAE,GAAG,KAAK,kBAAkB,CAAC,CAAC,CAAC;YAC5E,CAAC;YACD,MAAM,MAAM,GAA4B;gBACtC,IAAI;gBACJ,cAAc,EAAE,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,KAAK,iBAAiB,CAAC;gBAC5E,iBAAiB,EAAE,YAAY,CAAC,IAAI,CAAC,iBAAiB,EAAE,GAAG,KAAK,oBAAoB,CAAC;aACtF,CAAC;YACF,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;gBAC5D,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;oBAAE,MAAM,OAAO,CAAC,GAAG,KAAK,4BAA4B,CAAC,CAAC;gBAC5F,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YACpC,CAAC;YACD,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,SAAS,CAAC,CAAC;YAC/D,IAAI,MAAM,KAAK,SAAS;gBAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;YACjD,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,KAAK,UAAU,CAAC,CAAC;YACpE,IAAI,SAAS,KAAK,SAAS;gBAAE,MAAM,CAAC,OAAO,GAAG,SAAS,CAAC;YACxD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBACtD,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;oBAAE,MAAM,OAAO,CAAC,GAAG,KAAK,kDAAkD,CAAC,CAAC;gBAC/G,6FAA6F;gBAC7F,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACzF,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QACnB,MAAM,OAAO,CAAC,sEAAsE,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChH,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;QAAE,GAAG,CAAC,eAAe,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iCAAiC,CAC/C,QAAkC,EAClC,GAAiC;IAEjC,oFAAoF;IACpF,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,KAAK,WAAW,EAAE,CAAC;QAC/D,MAAM,OAAO,CAAC,GAAG,QAAQ,CAAC,IAAI,SAAS,QAAQ,CAAC,UAAU,uDAAuD,CAAC,CAAC;IACrH,CAAC;IACD,MAAM,YAAY,GAChB,QAAQ,CAAC,eAAe;QACxB,CAAC,QAAQ,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,eAAe,IAAI,EAAE,CAAC,CAAC;IAC7F,IAAI,GAAG,CAAC,eAAe,IAAI,YAAY,IAAI,GAAG,CAAC,eAAe,KAAK,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;QAC9F,MAAM,OAAO,CACX,+CAA+C,YAAY,YAAY,GAAG,CAAC,eAAe,KAAK;YAC7F,6DAA6D,CAChE,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACpG,MAAM,OAAO,GAAG,GAAG,CAAC,mBAAmB,IAAI,QAAQ,CAAC,mBAAmB,CAAC;IACxE,OAAO;QACL,eAAe,EAAE,GAAG,CAAC,eAAe,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,SAAS,CAAC;QACjF,uGAAuG;QACvG,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,QAAQ,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9F,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACzC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACtD,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACpE,kGAAkG;YAClG,qEAAqE;YACrE,MAAM,aAAa,GAAG,yBAAyB,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,IAAI,EAAE,CAAC,CAAC;YACrF,MAAM,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,MAAM,QAAQ,GAAG,QAAQ,EAAE,cAAc,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC,cAAc,CAAC,WAAW,EAAE,CAAC;YAC/F,MAAM,gBAAgB,GACpB,aAAa,IAAI,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC;YACjH,IAAI,aAAa,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC7D,MAAM,OAAO,CACX,GAAG,KAAK,CAAC,IAAI,iBAAiB,YAAY,IAAI,eAAe,qBAAqB,QAAQ,EAAE,cAAc,IAAI;oBAC5G,uFAAuF,CAC1F,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,cAAc,EAAE,KAAK,CAAC,cAAc;gBACpC,iBAAiB,EAAE,KAAK,CAAC,iBAAiB;gBAC1C,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,QAAQ,EAAE,SAAS;gBACjD,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,QAAQ,EAAE,MAAM;gBACxC,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,QAAQ,EAAE,OAAO;gBAC3C,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3F,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpC,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAaD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,GAAG,CAAC,OAAO,CAChB,+DAA+D,EAC/D,uDAAuD,CACxD,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,sBAAsB,CAAC,GAAW;IAChD,OAAO,4BAA4B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,IAAmB,EACnB,MAAoB,EACpB,IAAY;IAEZ,OAAO,CAAC,MAAM,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AAC/D,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,IAAmB,EACnB,MAAoB,EACpB,IAAY;IAEZ,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;IACjE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,oCAAoC,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE;QACxG,MAAM,EAAE,qBAAqB;KAC9B,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,GAAG,EAA0C,CAAC;IACjE,iHAAiH;IACjH,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CACnC,wFAAwF,CACzF,EAAE,CAAC;QACF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;QACzD,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,GAAG,EAA6B,CAAC;QACrD,wFAAwF;QACxF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,wEAAwE,CAAC,EAAE,CAAC;YAC7G,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC,WAAW,EAAE,CAAC;YACvE,IAAI,CAAC,UAAU;gBAAE,SAAS;YAC1B,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CACnC,8EAA8E,CAC/E,EAAE,CAAC,CAAC,CAAC,CAAC;YACP,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE;gBACtB,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,iBAAiB,CAAC;gBAC3C,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,yBAAyB,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAAE;aACvF,CAAC,CAAC;QACL,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5B,CAAC;IACD,sGAAsG;IACtG,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,4CAA4C,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACxF,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AAClF,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAAmB,EACnB,MAAoB,EACpB,UAAwC,EACxC,UAAmB;IAEnB,MAAM,IAAI,GAAG,UAAU,CAAC,eAAe,CAAC;IACxC,MAAM,OAAO,GAAG,UAAU,CAAC,mBAAmB,IAAI,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IACpF,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;IACvD,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,cAAc,CAAC;QAAE,OAAO,UAAU,CAAC;IACrE,IAAI,KAAK,GAAG,IAAI,GAAG,EAA0C,CAAC;IAC9D,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC;QACH,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,GAAG,YAAY,WAAW,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG;YAAE,MAAM,OAAO,CAAC,oBAAoB,IAAI,kBAAkB,CAAC,CAAC;QACpH,IAAI,QAAQ,CAAC,MAAM,IAAI,cAAc;YAAE,MAAM,GAAG,CAAC;IACnD,CAAC;IACD,IAAI,QAAQ,IAAI,cAAc,EAAE,CAAC;QAC/B,MAAM,OAAO,CACX,oBAAoB,IAAI,iFAAiF,CAC1G,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACnC,MAAM,OAAO,CAAC,mEAAmE,IAAI,GAAG,CAAC,CAAC;IAC5F,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;gBACrC,MAAM,OAAO,CACX,QAAQ,KAAK,CAAC,cAAc,uCAAuC,IAAI,GAAG;oBACxE,aAAa,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAChD,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO;QACL,GAAG,UAAU;QACb,mBAAmB,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;YACzC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,gBAAgB;gBAAE,OAAO,KAAK,CAAC;YAC1D,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,IAAI,GAAG,EAA6B,CAAC;YACxF,OAAO;gBACL,GAAG,KAAK;gBACR,aAAa,EAAE,kBAAkB,CAC/B,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,EAClC,KAAK,CAAC,IAAI,EACV,OAAO,EACP,KAAK,CAAC,cAAc,CACrB;aACF,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;AAChD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,MAAmC;IAC5E,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,eAAe,CAAC;IACxC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,OAAO,CACX,8GAA8G;YAC5G,kEAAkE,CACrE,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,iDAAiD,YAAY,CAAC,IAAI,CAAC,2CAA2C,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC;IACrJ,MAAM,OAAO,GAAG,UAAU,CAAC,mBAAmB;QAC5C,CAAC,CAAC,iCAAiC,aAAa,CAAC,UAAU,CAAC,mBAAmB,CAAC,GAAG;QACnF,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,eAAe,GAAG,CAAC,UAAU,CAAC,mBAAmB,IAAI,EAAE,CAAC;SAC3D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5B,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;QAClG,qGAAqG;QACrG,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU;YAAE,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,iDAAiD,CAAC,CAAC;QAC7G,sGAAsG;QACtG,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;QAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,0BAA0B,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,OAAO,CACL,uCAAuC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,aAAa,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,mBAAmB,OAAO,mBAAmB,IAAI,CAAC,OAAO,KAAK,IAAI,kBAAkB,IAAI,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,GAAG;YAC3O,yBAAyB,OAAO,IAAI;YACpC,uFAAuF,kBAAkB,CAAC,IAAI,CAAC,0CAA0C,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK;YAChM,+DAA+D,YAAY,CAAC,IAAI,CAAC,iBAAiB,CAAC,0CAA0C,aAAa,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK;YACvL,kGAAkG;YAClG,UAAU;YACV,4BAA4B,CAC7B,CAAC;IACJ,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO;0NACiN,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,0BAA0B,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,6BAA6B,aAAa,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,OAAO,GAAG,MAAM,CAAC,eAAe;sCAC9W,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC;yKACsG,OAAO,kCAAkC,OAAO;yEAChJ,eAAe;mBACrE,CAAC;AACpB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enhancements.d.ts","sourceRoot":"","sources":["../../src/adt/enhancements.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"enhancements.d.ts","sourceRoot":"","sources":["../../src/adt/enhancements.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAI7C,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAUhE,oGAAoG;AACpG,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,6BAA6B,CAuCnF;AAED,wBAAsB,6BAA6B,CACjD,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,cAAc,CAAC,EAC3D,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,6BAA6B,CAAC,CA0CxC"}
|
package/dist/adt/enhancements.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { withFilterConditions } from './enho-filter.js';
|
|
1
2
|
import { AdtApiError, AdtError } from './errors.js';
|
|
2
3
|
import { checkOperation, OperationType } from './safety.js';
|
|
3
4
|
import { getNestedArray, parseEnhancementImplementation, parseXml } from './xml-parser.js';
|
|
@@ -9,8 +10,9 @@ const ROUTES = {
|
|
|
9
10
|
/** Preserve the existing BAdI payload; source plug-ins additionally expose their hook locations. */
|
|
10
11
|
export function parseEnhancementMetadata(xml) {
|
|
11
12
|
const parsed = parseXml(xml);
|
|
12
|
-
if (parsed.objectData && typeof parsed.objectData === 'object')
|
|
13
|
-
return parseEnhancementImplementation(xml);
|
|
13
|
+
if (parsed.objectData && typeof parsed.objectData === 'object') {
|
|
14
|
+
return withFilterConditions(parsed, parseEnhancementImplementation(xml));
|
|
15
|
+
}
|
|
14
16
|
const root = parsed.enhancement;
|
|
15
17
|
if (!root || typeof root !== 'object' || Array.isArray(root)) {
|
|
16
18
|
throw new AdtError('Invalid ENHO metadata: expected objectData or enhancement.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enhancements.js","sourceRoot":"","sources":["../../src/adt/enhancements.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE5D,OAAO,EAAE,cAAc,EAAE,8BAA8B,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3F,MAAM,MAAM,GAAG;IACb,UAAU,EAAE,CAAC,SAAS,EAAE,4CAA4C,CAAC;IACrE,UAAU,EAAE,CAAC,SAAS,EAAE,4CAA4C,CAAC;IACrE,SAAS,EAAE,CAAC,QAAQ,EAAE,yCAAyC,CAAC;CACxD,CAAC;AAGX,oGAAoG;AACpG,MAAM,UAAU,wBAAwB,CAAC,GAAW;IAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,IAAI,MAAM,CAAC,UAAU,IAAI,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;
|
|
1
|
+
{"version":3,"file":"enhancements.js","sourceRoot":"","sources":["../../src/adt/enhancements.ts"],"names":[],"mappings":"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"}
|