arc-1 1.5.2 → 1.7.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 +26 -16
- 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/application-log.d.ts +36 -0
- package/dist/adt/application-log.d.ts.map +1 -0
- package/dist/adt/application-log.js +143 -0
- package/dist/adt/application-log.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 +2 -1
- package/dist/adt/class-structure.d.ts.map +1 -1
- package/dist/adt/class-structure.js +28 -10
- package/dist/adt/class-structure.js.map +1 -1
- package/dist/adt/client.d.ts +12 -6
- package/dist/adt/client.d.ts.map +1 -1
- package/dist/adt/client.js +32 -49
- package/dist/adt/client.js.map +1 -1
- package/dist/adt/codeintel.d.ts +9 -23
- package/dist/adt/codeintel.d.ts.map +1 -1
- package/dist/adt/codeintel.js +14 -34
- package/dist/adt/codeintel.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 +8 -1
- package/dist/adt/devtools.d.ts.map +1 -1
- package/dist/adt/devtools.js +94 -40
- package/dist/adt/devtools.js.map +1 -1
- package/dist/adt/diagnostics.d.ts +2 -0
- package/dist/adt/diagnostics.d.ts.map +1 -1
- package/dist/adt/diagnostics.js +10 -8
- package/dist/adt/diagnostics.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.d.ts +5 -1
- package/dist/adt/errors.d.ts.map +1 -1
- package/dist/adt/errors.js +32 -8
- package/dist/adt/errors.js.map +1 -1
- package/dist/adt/features.d.ts +3 -9
- package/dist/adt/features.d.ts.map +1 -1
- package/dist/adt/features.js +24 -8
- package/dist/adt/features.js.map +1 -1
- package/dist/adt/feed-schema.d.ts +32 -0
- package/dist/adt/feed-schema.d.ts.map +1 -0
- package/dist/adt/feed-schema.js +123 -0
- package/dist/adt/feed-schema.js.map +1 -0
- package/dist/adt/fm-parameter-docs.d.ts +7 -0
- package/dist/adt/fm-parameter-docs.d.ts.map +1 -0
- package/dist/adt/fm-parameter-docs.js +134 -0
- package/dist/adt/fm-parameter-docs.js.map +1 -0
- package/dist/adt/fm-signature.d.ts +8 -1
- package/dist/adt/fm-signature.d.ts.map +1 -1
- package/dist/adt/fm-signature.js +37 -28
- package/dist/adt/fm-signature.js.map +1 -1
- package/dist/adt/http-deadline.d.ts.map +1 -1
- package/dist/adt/http-deadline.js +4 -1
- package/dist/adt/http-deadline.js.map +1 -1
- package/dist/adt/http-retry-after.d.ts +20 -0
- package/dist/adt/http-retry-after.d.ts.map +1 -0
- package/dist/adt/http-retry-after.js +37 -0
- package/dist/adt/http-retry-after.js.map +1 -0
- package/dist/adt/http.d.ts +7 -20
- package/dist/adt/http.d.ts.map +1 -1
- package/dist/adt/http.js +112 -135
- package/dist/adt/http.js.map +1 -1
- package/dist/adt/include-expansion.d.ts +143 -0
- package/dist/adt/include-expansion.d.ts.map +1 -0
- package/dist/adt/include-expansion.js +475 -0
- package/dist/adt/include-expansion.js.map +1 -0
- package/dist/adt/internal-data-operations.d.ts +3 -3
- package/dist/adt/internal-data-operations.d.ts.map +1 -1
- package/dist/adt/internal-data-operations.js +9 -2
- package/dist/adt/internal-data-operations.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/revision-feed.d.ts +8 -0
- package/dist/adt/revision-feed.d.ts.map +1 -0
- package/dist/adt/revision-feed.js +108 -0
- package/dist/adt/revision-feed.js.map +1 -0
- package/dist/adt/security-session-gate.d.ts +23 -0
- package/dist/adt/security-session-gate.d.ts.map +1 -0
- package/dist/adt/security-session-gate.js +56 -0
- package/dist/adt/security-session-gate.js.map +1 -0
- 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/source-diff.d.ts +4 -1
- package/dist/adt/source-diff.d.ts.map +1 -1
- package/dist/adt/source-diff.js +5 -3
- package/dist/adt/source-diff.js.map +1 -1
- package/dist/adt/stored-text/chunks.d.ts +8 -0
- package/dist/adt/stored-text/chunks.d.ts.map +1 -0
- package/dist/adt/stored-text/chunks.js +55 -0
- package/dist/adt/stored-text/chunks.js.map +1 -0
- package/dist/adt/stored-text/decoder.d.ts +31 -0
- package/dist/adt/stored-text/decoder.d.ts.map +1 -0
- package/dist/adt/stored-text/decoder.js +319 -0
- package/dist/adt/stored-text/decoder.js.map +1 -0
- package/dist/adt/stored-text/errors.d.ts +10 -0
- package/dist/adt/stored-text/errors.d.ts.map +1 -0
- package/dist/adt/stored-text/errors.js +10 -0
- package/dist/adt/stored-text/errors.js.map +1 -0
- package/dist/adt/stored-text/index.d.ts +7 -0
- package/dist/adt/stored-text/index.d.ts.map +1 -0
- package/dist/adt/stored-text/index.js +6 -0
- package/dist/adt/stored-text/index.js.map +1 -0
- package/dist/adt/stored-text/key.d.ts +3 -0
- package/dist/adt/stored-text/key.d.ts.map +1 -0
- package/dist/adt/stored-text/key.js +23 -0
- package/dist/adt/stored-text/key.js.map +1 -0
- package/dist/adt/stored-text/reader.d.ts +52 -0
- package/dist/adt/stored-text/reader.d.ts.map +1 -0
- package/dist/adt/stored-text/reader.js +142 -0
- package/dist/adt/stored-text/reader.js.map +1 -0
- package/dist/adt/stored-text/source.d.ts +5 -0
- package/dist/adt/stored-text/source.d.ts.map +1 -0
- package/dist/adt/stored-text/source.js +284 -0
- package/dist/adt/stored-text/source.js.map +1 -0
- package/dist/adt/stored-text/types.d.ts +38 -0
- package/dist/adt/stored-text/types.d.ts.map +1 -0
- package/dist/adt/stored-text/types.js +2 -0
- package/dist/adt/stored-text/types.js.map +1 -0
- package/dist/adt/structure-hierarchy.d.ts.map +1 -1
- package/dist/adt/structure-hierarchy.js +11 -27
- package/dist/adt/structure-hierarchy.js.map +1 -1
- package/dist/adt/syntax-batch.d.ts +66 -0
- package/dist/adt/syntax-batch.d.ts.map +1 -0
- package/dist/adt/syntax-batch.js +115 -0
- package/dist/adt/syntax-batch.js.map +1 -0
- 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 +4 -2
- package/dist/adt/table-query.d.ts.map +1 -1
- package/dist/adt/table-query.js +37 -10
- 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 +7 -1
- package/dist/adt/text-elements.d.ts.map +1 -1
- package/dist/adt/text-elements.js +67 -25
- 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-diff.d.ts +16 -25
- package/dist/adt/transport-diff.d.ts.map +1 -1
- package/dist/adt/transport-diff.js +201 -103
- package/dist/adt/transport-diff.js.map +1 -1
- package/dist/adt/transport-review-budget.d.ts +15 -0
- package/dist/adt/transport-review-budget.d.ts.map +1 -0
- package/dist/adt/transport-review-budget.js +57 -0
- package/dist/adt/transport-review-budget.js.map +1 -0
- package/dist/adt/transport.d.ts +1 -1
- package/dist/adt/transport.d.ts.map +1 -1
- package/dist/adt/transport.js +4 -3
- package/dist/adt/transport.js.map +1 -1
- package/dist/adt/types.d.ts +10 -4
- package/dist/adt/types.d.ts.map +1 -1
- package/dist/adt/user-agent.d.ts +1 -1
- package/dist/adt/where-used-native.d.ts +22 -0
- package/dist/adt/where-used-native.d.ts.map +1 -0
- package/dist/adt/where-used-native.js +111 -0
- package/dist/adt/where-used-native.js.map +1 -0
- package/dist/adt/xml-parser.d.ts +6 -36
- package/dist/adt/xml-parser.d.ts.map +1 -1
- package/dist/adt/xml-parser.js +28 -235
- package/dist/adt/xml-parser.js.map +1 -1
- package/dist/aff/validator.d.ts.map +1 -1
- package/dist/aff/validator.js +8 -2
- package/dist/aff/validator.js.map +1 -1
- package/dist/authz/policy.d.ts.map +1 -1
- package/dist/authz/policy.js +10 -2
- package/dist/authz/policy.js.map +1 -1
- package/dist/cache/sqlite-driver.d.ts +24 -0
- package/dist/cache/sqlite-driver.d.ts.map +1 -0
- package/dist/cache/sqlite-driver.js +59 -0
- package/dist/cache/sqlite-driver.js.map +1 -0
- package/dist/cache/sqlite.d.ts +4 -2
- package/dist/cache/sqlite.d.ts.map +1 -1
- package/dist/cache/sqlite.js +5 -4
- package/dist/cache/sqlite.js.map +1 -1
- package/dist/cli.js +4 -1
- package/dist/cli.js.map +1 -1
- package/dist/context/grep.d.ts +2 -0
- package/dist/context/grep.d.ts.map +1 -1
- package/dist/context/grep.js +8 -7
- package/dist/context/grep.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/extract-sap-cookies.js +1 -0
- package/dist/extract-sap-cookies.js.map +1 -1
- package/dist/handlers/activate.d.ts.map +1 -1
- package/dist/handlers/activate.js +69 -7
- 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/application-log-input.d.ts +32 -0
- package/dist/handlers/application-log-input.d.ts.map +1 -0
- package/dist/handlers/application-log-input.js +34 -0
- package/dist/handlers/application-log-input.js.map +1 -0
- package/dist/handlers/application-log.d.ts +4 -0
- package/dist/handlers/application-log.d.ts.map +1 -0
- package/dist/handlers/application-log.js +14 -0
- package/dist/handlers/application-log.js.map +1 -0
- package/dist/handlers/cds-hints.d.ts +2 -2
- package/dist/handlers/cds-hints.d.ts.map +1 -1
- package/dist/handlers/cds-hints.js +21 -63
- package/dist/handlers/cds-hints.js.map +1 -1
- package/dist/handlers/context.d.ts.map +1 -1
- package/dist/handlers/context.js +7 -3
- package/dist/handlers/context.js.map +1 -1
- package/dist/handlers/diagnose.d.ts.map +1 -1
- package/dist/handlers/diagnose.js +10 -1
- package/dist/handlers/diagnose.js.map +1 -1
- package/dist/handlers/dispatch.d.ts.map +1 -1
- package/dist/handlers/dispatch.js +54 -9
- package/dist/handlers/dispatch.js.map +1 -1
- package/dist/handlers/dump-filter-inputs.d.ts +38 -0
- package/dist/handlers/dump-filter-inputs.d.ts.map +1 -0
- package/dist/handlers/dump-filter-inputs.js +44 -0
- package/dist/handlers/dump-filter-inputs.js.map +1 -0
- package/dist/handlers/expanded-read.d.ts +24 -0
- package/dist/handlers/expanded-read.d.ts.map +1 -0
- package/dist/handlers/expanded-read.js +56 -0
- package/dist/handlers/expanded-read.js.map +1 -0
- 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/function-parameter-language.d.ts +5 -0
- package/dist/handlers/function-parameter-language.d.ts.map +1 -0
- package/dist/handlers/function-parameter-language.js +19 -0
- package/dist/handlers/function-parameter-language.js.map +1 -0
- package/dist/handlers/function-processing.d.ts +5 -0
- package/dist/handlers/function-processing.d.ts.map +1 -1
- package/dist/handlers/function-processing.js +5 -0
- package/dist/handlers/function-processing.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 +2 -1
- package/dist/handlers/hyperfocused.js.map +1 -1
- package/dist/handlers/long-text-input.d.ts +113 -0
- package/dist/handlers/long-text-input.d.ts.map +1 -0
- package/dist/handlers/long-text-input.js +113 -0
- package/dist/handlers/long-text-input.js.map +1 -0
- package/dist/handlers/long-text.d.ts +5 -0
- package/dist/handlers/long-text.d.ts.map +1 -0
- package/dist/handlers/long-text.js +122 -0
- package/dist/handlers/long-text.js.map +1 -0
- package/dist/handlers/manage.d.ts.map +1 -1
- package/dist/handlers/manage.js +7 -23
- package/dist/handlers/manage.js.map +1 -1
- package/dist/handlers/navigate.d.ts.map +1 -1
- package/dist/handlers/navigate.js +8 -3
- package/dist/handlers/navigate.js.map +1 -1
- package/dist/handlers/object-types.d.ts.map +1 -1
- package/dist/handlers/object-types.js +31 -7
- package/dist/handlers/object-types.js.map +1 -1
- package/dist/handlers/query-input.d.ts +50 -0
- package/dist/handlers/query-input.d.ts.map +1 -0
- package/dist/handlers/query-input.js +59 -0
- package/dist/handlers/query-input.js.map +1 -0
- package/dist/handlers/query-tool.d.ts +11 -0
- package/dist/handlers/query-tool.d.ts.map +1 -0
- package/dist/handlers/query-tool.js +99 -0
- package/dist/handlers/query-tool.js.map +1 -0
- package/dist/handlers/query.d.ts +1 -1
- package/dist/handlers/query.d.ts.map +1 -1
- package/dist/handlers/query.js +7 -1
- package/dist/handlers/query.js.map +1 -1
- package/dist/handlers/read.d.ts +1 -0
- package/dist/handlers/read.d.ts.map +1 -1
- package/dist/handlers/read.js +119 -14
- package/dist/handlers/read.js.map +1 -1
- package/dist/handlers/schemas.d.ts +57 -4
- package/dist/handlers/schemas.d.ts.map +1 -1
- package/dist/handlers/schemas.js +140 -17
- 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 +8 -0
- 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 +8 -3
- 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 +99 -101
- package/dist/handlers/tools.js.map +1 -1
- package/dist/handlers/transport-review.d.ts +5 -0
- package/dist/handlers/transport-review.d.ts.map +1 -0
- package/dist/handlers/transport-review.js +108 -0
- package/dist/handlers/transport-review.js.map +1 -0
- package/dist/handlers/transport.d.ts.map +1 -1
- package/dist/handlers/transport.js +3 -58
- package/dist/handlers/transport.js.map +1 -1
- package/dist/handlers/where-used-details.d.ts +28 -0
- package/dist/handlers/where-used-details.d.ts.map +1 -0
- package/dist/handlers/where-used-details.js +67 -0
- package/dist/handlers/where-used-details.js.map +1 -0
- package/dist/handlers/where-used.d.ts +8 -3
- package/dist/handlers/where-used.d.ts.map +1 -1
- package/dist/handlers/where-used.js +40 -18
- 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 -27
- 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 +1 -1
- package/dist/handlers/write/update-delete.d.ts.map +1 -1
- package/dist/handlers/write/update-delete.js +32 -12
- 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/server/audit.d.ts +4 -0
- package/dist/server/audit.d.ts.map +1 -1
- package/dist/server/audit.js +49 -2
- package/dist/server/audit.js.map +1 -1
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +43 -2
- 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 +22 -15
- 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 +60 -89
- 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/tool-auth.d.ts +1 -1
- package/dist/server/tool-auth.d.ts.map +1 -1
- package/dist/server/tool-auth.js +24 -4
- package/dist/server/tool-auth.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 +21 -13
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { type AdtClient } from '../adt/client.js';
|
|
2
2
|
import { type ReferenceResult, type WhereUsedResult } from '../adt/codeintel.js';
|
|
3
|
+
import { type UsageOptions } from '../adt/where-used-native.js';
|
|
4
|
+
import { expandUsageDetails } from './where-used-details.js';
|
|
3
5
|
export type LiveUsageResult = WhereUsedResult | ReferenceResult;
|
|
4
6
|
export interface LiveUsageLookup {
|
|
5
7
|
/** At most `maxResults` entries. */
|
|
@@ -12,6 +14,8 @@ export interface LiveUsageLookup {
|
|
|
12
14
|
warning?: string;
|
|
13
15
|
/** The symbol SAP searched for, from its result scope (absent on the fallback endpoint). */
|
|
14
16
|
searchedFor?: string;
|
|
17
|
+
scopeFiltering?: 'server' | 'client';
|
|
18
|
+
usageDetails?: Awaited<ReturnType<typeof expandUsageDetails>>;
|
|
15
19
|
}
|
|
16
20
|
/** Resolve the canonical ADT object URI used by the where-used APIs. */
|
|
17
21
|
export declare function resolveWhereUsedUri(client: AdtClient, objectType: string, objectName: string): Promise<string | null>;
|
|
@@ -19,11 +23,12 @@ export declare function resolveWhereUsedUri(client: AdtClient, objectType: strin
|
|
|
19
23
|
* Run the live SAP-authorized where-used lookup shared by SAPNavigate.references and
|
|
20
24
|
* SAPContext.usages. Older systems fall back to the simple references endpoint.
|
|
21
25
|
*
|
|
22
|
-
*
|
|
26
|
+
* Legacy filtering and paging are client-side: the older `usageReferences` endpoint declares only
|
|
23
27
|
* `{?uri}` and ignores every limit/filter we can send — `objectTypeFilter` in the body, and
|
|
24
28
|
* `maxResults`/`maxItemCount`/`searchFromIndex` as query params all return byte-identical
|
|
25
29
|
* responses (verified live on 758, 9 variants). So the full set always crosses the wire; we bound
|
|
26
|
-
* what reaches the model, not what SAP computes.
|
|
30
|
+
* what reaches the model, not what SAP computes. SAPNavigate optionally uses native scope
|
|
31
|
+
* on systems advertising it; paging remains client-side.
|
|
27
32
|
*/
|
|
28
|
-
export declare function lookupLiveUsages(client: AdtClient, uri: string, objectType?: string, maxResults?: number): Promise<LiveUsageLookup>;
|
|
33
|
+
export declare function lookupLiveUsages(client: AdtClient, uri: string, objectType?: string, maxResults?: number, options?: UsageOptions): Promise<LiveUsageLookup>;
|
|
29
34
|
//# sourceMappingURL=where-used.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"where-used.d.ts","sourceRoot":"","sources":["../../src/handlers/where-used.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAsB,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"where-used.d.ts","sourceRoot":"","sources":["../../src/handlers/where-used.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAsB,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,eAAe,EACrB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAsC,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEpG,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,MAAM,eAAe,GAAG,eAAe,GAAG,eAAe,CAAC;AAMhE,MAAM,WAAW,eAAe;IAC9B,oCAAoC;IACpC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,+FAA+F;IAC/F,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,4FAA4F;IAC5F,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,4FAA4F;IAC5F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC;CAC/D;AAED,wEAAwE;AACxE,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,SAAS,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAaxB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,SAAS,EACjB,GAAG,EAAE,MAAM,EACX,UAAU,CAAC,EAAE,MAAM,EACnB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,eAAe,CAAC,CAyF1B"}
|
|
@@ -4,17 +4,12 @@ import { DataSourcePolicyError } from '../adt/data-source-policy.js';
|
|
|
4
4
|
import { AdtApiError } from '../adt/errors.js';
|
|
5
5
|
import { internalOperationWarning } from '../adt/internal-data-operations.js';
|
|
6
6
|
import { isOperationAllowed, OperationType } from '../adt/safety.js';
|
|
7
|
+
import { loadNativeUsages, matchesUsageType } from '../adt/where-used-native.js';
|
|
7
8
|
import { normalizeObjectType, objectUrlForType } from './object-types.js';
|
|
9
|
+
import { expandUsageDetails } from './where-used-details.js';
|
|
8
10
|
/** Default page size for where-used. A bare lookup on a common type returns thousands of rows
|
|
9
11
|
* (CL_ABAP_TYPEDESCR: 6,644 refs ≈ 968k tokens) — far past any context window. */
|
|
10
12
|
const DEFAULT_USAGE_RESULTS = 100;
|
|
11
|
-
/** Match a result's ADT type against a filter: "CLAS" matches "CLAS/OC", "CLAS/OC" matches exactly.
|
|
12
|
-
* Trimmed — a padded `" CLAS "` would otherwise match nothing and read as "no references found". */
|
|
13
|
-
function matchesObjectType(resultType, filter) {
|
|
14
|
-
const type = resultType.trim().toUpperCase();
|
|
15
|
-
const wanted = filter.trim().toUpperCase();
|
|
16
|
-
return type === wanted || type.startsWith(`${wanted}/`);
|
|
17
|
-
}
|
|
18
13
|
/** Resolve the canonical ADT object URI used by the where-used APIs. */
|
|
19
14
|
export async function resolveWhereUsedUri(client, objectType, objectName) {
|
|
20
15
|
const type = normalizeObjectType(objectType);
|
|
@@ -34,13 +29,14 @@ export async function resolveWhereUsedUri(client, objectType, objectName) {
|
|
|
34
29
|
* Run the live SAP-authorized where-used lookup shared by SAPNavigate.references and
|
|
35
30
|
* SAPContext.usages. Older systems fall back to the simple references endpoint.
|
|
36
31
|
*
|
|
37
|
-
*
|
|
32
|
+
* Legacy filtering and paging are client-side: the older `usageReferences` endpoint declares only
|
|
38
33
|
* `{?uri}` and ignores every limit/filter we can send — `objectTypeFilter` in the body, and
|
|
39
34
|
* `maxResults`/`maxItemCount`/`searchFromIndex` as query params all return byte-identical
|
|
40
35
|
* responses (verified live on 758, 9 variants). So the full set always crosses the wire; we bound
|
|
41
|
-
* what reaches the model, not what SAP computes.
|
|
36
|
+
* what reaches the model, not what SAP computes. SAPNavigate optionally uses native scope
|
|
37
|
+
* on systems advertising it; paging remains client-side.
|
|
42
38
|
*/
|
|
43
|
-
export async function lookupLiveUsages(client, uri, objectType, maxResults) {
|
|
39
|
+
export async function lookupLiveUsages(client, uri, objectType, maxResults, options) {
|
|
44
40
|
// Normalize the filter ONCE, at the entry, and use only this value below. A whitespace-only filter
|
|
45
41
|
// means "no filter" (matching the empty type would match nothing and read as "No references
|
|
46
42
|
// found"). Trimming here rather than at the comparison is what keeps `" CLAS/OC "` behaving like
|
|
@@ -52,29 +48,53 @@ export async function lookupLiveUsages(client, uri, objectType, maxResults) {
|
|
|
52
48
|
let searchedFor;
|
|
53
49
|
let referencedObjectIdentifier;
|
|
54
50
|
let fallbackUsed = false;
|
|
51
|
+
let native;
|
|
55
52
|
try {
|
|
56
|
-
|
|
53
|
+
native =
|
|
54
|
+
options && (options.packages?.length || (options.detail && options.detail !== 'objects'))
|
|
55
|
+
? await loadNativeUsages(client, uri, options)
|
|
56
|
+
: undefined;
|
|
57
|
+
({ results, searchedFor, referencedObjectIdentifier } =
|
|
58
|
+
native ?? (await findWhereUsedWithScope(client.http, client.safety, uri, filter)));
|
|
57
59
|
}
|
|
58
60
|
catch (err) {
|
|
59
|
-
if (!(err instanceof AdtApiError) ||
|
|
61
|
+
if (!(err instanceof AdtApiError) ||
|
|
62
|
+
![404, 405, 415, 501].includes(err.statusCode) ||
|
|
63
|
+
!/\/usageReferences(?:\?|$)/.test(err.path))
|
|
60
64
|
throw err;
|
|
65
|
+
if (options?.packages?.length)
|
|
66
|
+
throw new Error('This legacy reference endpoint cannot provide package-filtered results. Retry without packages.');
|
|
61
67
|
results = await findReferences(client.http, client.safety, uri);
|
|
62
68
|
fallbackUsed = true;
|
|
63
69
|
}
|
|
64
70
|
// Kept outside the try: an augment failure must not be mistaken for a missing where-used endpoint.
|
|
65
71
|
let warning;
|
|
66
|
-
// Empty
|
|
67
|
-
|
|
68
|
-
|
|
72
|
+
// Empty also occurs when SAP reports an unsupported search. Require native rows before
|
|
73
|
+
// treating an empty cursor identifier as fallback to the original object.
|
|
74
|
+
if (!fallbackUsed && (!scoped || (referencedObjectIdentifier === '' && results.length > 0))) {
|
|
75
|
+
warning = await augmentInterfaceImplementers(client, uri, filter, results, Boolean(options?.packages?.length));
|
|
69
76
|
}
|
|
70
77
|
if (scoped && !searchedFor) {
|
|
71
78
|
const scopeWarning = 'SAP did not report the searched symbol. Results may refer to the whole object; confirm the scope before using them.';
|
|
72
79
|
warning = warning ? `${warning} ${scopeWarning}` : scopeWarning;
|
|
73
80
|
}
|
|
74
|
-
const filtered =
|
|
81
|
+
const filtered = results.filter((result) => (!filter || matchesUsageType(result.type, filter)) &&
|
|
82
|
+
(!options?.packages?.length ||
|
|
83
|
+
(result.type !== 'DEVC/K' &&
|
|
84
|
+
'packageName' in result &&
|
|
85
|
+
options.packages.includes(result.packageName.toUpperCase()))));
|
|
75
86
|
const limit = clampSearchResults(maxResults, DEFAULT_USAGE_RESULTS);
|
|
87
|
+
const usageDetails = options?.detail && options.detail !== 'objects'
|
|
88
|
+
? await expandUsageDetails(client, results, filter, options, limit, native?.supportsSnippets ?? false, native?.deadline ?? Date.now())
|
|
89
|
+
: undefined;
|
|
76
90
|
return {
|
|
77
|
-
results: filtered.slice(0, limit)
|
|
91
|
+
results: filtered.slice(0, limit).map(({ ...row }) => {
|
|
92
|
+
if ('objectIdentifier' in row)
|
|
93
|
+
delete row.objectIdentifier;
|
|
94
|
+
return row;
|
|
95
|
+
}),
|
|
96
|
+
...(native && options?.packages?.length ? { scopeFiltering: native.scopeFiltering } : {}),
|
|
97
|
+
...(usageDetails ? { usageDetails } : {}),
|
|
78
98
|
total: filtered.length,
|
|
79
99
|
truncated: filtered.length > limit,
|
|
80
100
|
fallbackUsed,
|
|
@@ -82,13 +102,15 @@ export async function lookupLiveUsages(client, uri, objectType, maxResults) {
|
|
|
82
102
|
...(searchedFor ? { searchedFor } : {}),
|
|
83
103
|
};
|
|
84
104
|
}
|
|
85
|
-
async function augmentInterfaceImplementers(client, uri, objectType, results) {
|
|
105
|
+
async function augmentInterfaceImplementers(client, uri, objectType, results, packageFiltered) {
|
|
86
106
|
const intfMatch = uri.match(/\/sap\/bc\/adt\/oo\/interfaces\/([^/?#]+)/i);
|
|
87
107
|
if (!intfMatch || (objectType && !/^CLAS/i.test(objectType)))
|
|
88
108
|
return undefined;
|
|
89
109
|
const interfaceName = decodeURIComponent(intfMatch[1]).toUpperCase();
|
|
90
110
|
const canFreeSQL = isOperationAllowed(client.safety, OperationType.FreeSQL);
|
|
91
111
|
const canQuery = isOperationAllowed(client.safety, OperationType.Query);
|
|
112
|
+
if (packageFiltered && (canFreeSQL || canQuery))
|
|
113
|
+
return 'Interface-implementer enrichment was skipped: SEOMETAREL does not provide packages for filtering. Native results are retained.';
|
|
92
114
|
try {
|
|
93
115
|
let implementers = [];
|
|
94
116
|
if (canFreeSQL) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"where-used.js","sourceRoot":"","sources":["../../src/handlers/where-used.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,sCAAsC,EACtC,cAAc,EACd,sBAAsB,GAGvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"where-used.js","sourceRoot":"","sources":["../../src/handlers/where-used.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EACL,sCAAsC,EACtC,cAAc,EACd,sBAAsB,GAGvB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAqB,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAI7D;mFACmF;AACnF,MAAM,qBAAqB,GAAG,GAAG,CAAC;AAiBlC,wEAAwE;AACxE,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,MAAiB,EACjB,UAAkB,EAClB,UAAkB;IAElB,MAAM,IAAI,GAAG,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;IACtC,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QACtD,OAAO,KAAK;YACV,CAAC,CAAC,gCAAgC,kBAAkB,CAAC,KAAK,CAAC,aAAa,kBAAkB,CAAC,IAAI,CAAC,EAAE;YAClG,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IACD,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAiB,EACjB,GAAW,EACX,UAAmB,EACnB,UAAmB,EACnB,OAAsB;IAEtB,mGAAmG;IACnG,4FAA4F;IAC5F,iGAAiG;IACjG,6FAA6F;IAC7F,kGAAkG;IAClG,MAAM,MAAM,GAAG,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1C,IAAI,OAA0B,CAAC;IAC/B,IAAI,WAA+B,CAAC;IACpC,IAAI,0BAA8C,CAAC;IACnD,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,IAAI,MAAgE,CAAC;IACrE,IAAI,CAAC;QACH,MAAM;YACJ,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;gBACvF,CAAC,CAAC,MAAM,gBAAgB,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC;gBAC9C,CAAC,CAAC,SAAS,CAAC;QAChB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,0BAA0B,EAAE;YACnD,MAAM,IAAI,CAAC,MAAM,sBAAsB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACvF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IACE,CAAC,CAAC,GAAG,YAAY,WAAW,CAAC;YAC7B,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC;YAC9C,CAAC,2BAA2B,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAE3C,MAAM,GAAG,CAAC;QACZ,IAAI,OAAO,EAAE,QAAQ,EAAE,MAAM;YAC3B,MAAM,IAAI,KAAK,CACb,iGAAiG,CAClG,CAAC;QACJ,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChE,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IAED,mGAAmG;IACnG,IAAI,OAA2B,CAAC;IAChC,uFAAuF;IACvF,0EAA0E;IAC1E,IAAI,CAAC,YAAY,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,0BAA0B,KAAK,EAAE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,OAAO,GAAG,MAAM,4BAA4B,CAC1C,MAAM,EACN,GAAG,EACH,MAAM,EACN,OAA4B,EAC5B,OAAO,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CACnC,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QAC3B,MAAM,YAAY,GAChB,qHAAqH,CAAC;QACxH,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,IAAI,YAAY,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;IAClE,CAAC;IAED,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAC7B,CAAC,MAAM,EAAE,EAAE,CACT,CAAC,CAAC,MAAM,IAAI,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClD,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM;YACzB,CAAC,MAAM,CAAC,IAAI,KAAK,QAAQ;gBACvB,aAAa,IAAI,MAAM;gBACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CACpE,CAAC;IACF,MAAM,KAAK,GAAG,kBAAkB,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC;IACpE,MAAM,YAAY,GAChB,OAAO,EAAE,MAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS;QAC7C,CAAC,CAAC,MAAM,kBAAkB,CACtB,MAAM,EACN,OAA4B,EAC5B,MAAM,EACN,OAAO,EACP,KAAK,EACL,MAAM,EAAE,gBAAgB,IAAI,KAAK,EACjC,MAAM,EAAE,QAAQ,IAAI,IAAI,CAAC,GAAG,EAAE,CAC/B;QACH,CAAC,CAAC,SAAS,CAAC;IAChB,OAAO;QACL,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,EAAE;YACnD,IAAI,kBAAkB,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC,gBAAgB,CAAC;YAC3D,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;QACF,GAAG,CAAC,MAAM,IAAI,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,KAAK,EAAE,QAAQ,CAAC,MAAM;QACtB,SAAS,EAAE,QAAQ,CAAC,MAAM,GAAG,KAAK;QAClC,YAAY;QACZ,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,4BAA4B,CACzC,MAAiB,EACjB,GAAW,EACX,UAA8B,EAC9B,OAA0B,EAC1B,eAAwB;IAExB,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC1E,IAAI,CAAC,SAAS,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,SAAS,CAAC;IAE/E,MAAM,aAAa,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtE,MAAM,UAAU,GAAG,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IACxE,IAAI,eAAe,IAAI,CAAC,UAAU,IAAI,QAAQ,CAAC;QAC7C,OAAO,gIAAgI,CAAC;IAE1I,IAAI,CAAC;QACH,IAAI,YAAY,GAAsB,EAAE,CAAC;QACzC,IAAI,UAAU,EAAE,CAAC;YACf,YAAY,GAAG,MAAM,sCAAsC,CACzD,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EACvC,aAAa,CACd,CAAC;QACJ,CAAC;aAAM,IAAI,QAAQ,EAAE,CAAC;YACpB,2FAA2F;YAC3F,0FAA0F;YAC1F,wFAAwF;YACxF,YAAY,GAAG,MAAM,sCAAsC,CACzD,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,CACZ,MAAM,CAAC,aAAa,CAAC,YAAY,EAAE;gBACjC,OAAO,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC;gBAC7C,KAAK,EAAE;oBACL,EAAE,KAAK,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE;oBACtD,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;iBAC1C;gBACD,OAAO,EAAE,GAAG;aACb,CAAC,EACJ,aAAa,CACd,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACnG,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;QAChG,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,+FAA+F;QAC/F,wFAAwF;QACxF,wFAAwF;QACxF,OAAO,wBAAwB,CAC7B,wBAAwB,EACxB,KAAK,YAAY,qBAAqB,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,8BAA8B,CACrF,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/handlers/write/create.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/handlers/write/create.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+CH,OAAO,EAAe,KAAK,UAAU,EAAc,MAAM,cAAc,CAAC;AA4BxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAmapD,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAmXjF;AAED,wBAAsB,sBAAsB,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAwXtF"}
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
import { createObject, lockObject, safeUpdateObject, safeUpdateSource, unlockObject, updateObject, } from '../../adt/crud.js';
|
|
5
5
|
import { formatKtdWriteReport, normalizeAdtLanguage, rewriteKtdDocument, } from '../../adt/ddic-xml.js';
|
|
6
6
|
import { activate, activateBatch } from '../../adt/devtools.js';
|
|
7
|
+
import { badiContainerXml, hasBadiImplementations } from '../../adt/enhancement-impl.js';
|
|
7
8
|
import { AdtApiError, AdtSafetyError } from '../../adt/errors.js';
|
|
8
|
-
import { spliceFmSignature } from '../../adt/fm-signature.js';
|
|
9
|
+
import { findFmHeader, spliceFmSignature } from '../../adt/fm-signature.js';
|
|
9
10
|
import { checkOperation, checkPackage, OperationType } from '../../adt/safety.js';
|
|
10
11
|
import { isServerDrivenObjectType } from '../../adt/server-driven.js';
|
|
11
12
|
import { getTransport } from '../../adt/transport.js';
|
|
@@ -13,10 +14,11 @@ import { escapeXmlAttr, parseFunctionModuleProperties } from '../../adt/xml-pars
|
|
|
13
14
|
import { validateAffHeader } from '../../aff/validator.js';
|
|
14
15
|
import { activationDetailMatchesObject } from '../activation-results.js';
|
|
15
16
|
import { guardCdsSyntax } from '../cds-hints.js';
|
|
16
|
-
import { getCachedFeatures, isDomainsEndpointAvailable, isLockObjectsEndpointAvailable, isTablesEndpointAvailable, isTableTypesEndpointAvailable, } from '../feature-cache.js';
|
|
17
|
+
import { getCachedFeatures, isDomainsEndpointAvailable, isEnhoXhbEndpointAvailable, isLockObjectsEndpointAvailable, isTablesEndpointAvailable, isTableTypesEndpointAvailable, } from '../feature-cache.js';
|
|
18
|
+
import { resolveFmDescriptionLanguage } from '../function-parameter-language.js';
|
|
17
19
|
import { canonicalTablType, functionGroupObjectUrl, functionModuleObjectUrl, normalizeWriteObjectType, objectBasePath, objectUrlForType, sourceUrlForType, } from '../object-types.js';
|
|
18
20
|
import { errorResult, textResult } from '../shared.js';
|
|
19
|
-
import { buildCreateXml, createContentTypeForType, DOMA_WRITE_UNAVAILABLE_HINT, ENQU_WRITE_UNAVAILABLE_HINT, getMetadataWriteProperties, isMetadataWriteType, mergePreWriteWarnings, resolveWriteSystemType, runPreWriteLint, runRapPreflightValidation, SKTD_V2_CONTENT_TYPE, stripFmParamCommentBlock, TABL_DT_WRITE_UNAVAILABLE_HINT, TTYP_WRITE_UNAVAILABLE_HINT, tryPostSaveSyntaxCheck, vendorContentTypeForType, } from '../write-helpers.js';
|
|
21
|
+
import { buildCreateXml, createContentTypeForType, DOMA_WRITE_UNAVAILABLE_HINT, ENHO_WRITE_UNAVAILABLE_HINT, ENQU_WRITE_UNAVAILABLE_HINT, getMetadataWriteProperties, isMetadataWriteType, mergePreWriteWarnings, prepareEnhoCreateProperties, resolveWriteSystemType, runPreWriteLint, runRapPreflightValidation, SKTD_V2_CONTENT_TYPE, stripFmParamCommentBlock, TABL_DT_WRITE_UNAVAILABLE_HINT, TTYP_WRITE_UNAVAILABLE_HINT, tryPostSaveSyntaxCheck, vendorContentTypeForType, } from '../write-helpers.js';
|
|
20
22
|
import { batchCreateResult, batchEntryResult, batchFailureMessage, failBatchEntry, } from './batch-results.js';
|
|
21
23
|
import { resolveCreateTransport } from './create-transport.js';
|
|
22
24
|
const FUNCTION_MODULE_MEDIA_TYPE = /^application\/vnd\.sap\.adt\.functions\.fmodules(?:\.v\d+)?\+xml\b/i;
|
|
@@ -34,7 +36,7 @@ function normalizeTransportOverride(rawTransport) {
|
|
|
34
36
|
const value = String(rawTransport).trim();
|
|
35
37
|
return value || undefined;
|
|
36
38
|
}
|
|
37
|
-
function prepareFunctionModuleCreateSource(name, source, parameters) {
|
|
39
|
+
function prepareFunctionModuleCreateSource(name, source, parameters, language) {
|
|
38
40
|
const shouldWrite = !!source || (parameters !== undefined && parameters.length > 0);
|
|
39
41
|
if (!shouldWrite)
|
|
40
42
|
return { shouldWrite: false, source: '', warnings: [] };
|
|
@@ -43,13 +45,16 @@ function prepareFunctionModuleCreateSource(name, source, parameters) {
|
|
|
43
45
|
if (parameters !== undefined) {
|
|
44
46
|
const baseSource = !prepared || prepared.trim() === ''
|
|
45
47
|
? `FUNCTION ${name}.\nENDFUNCTION.\n`
|
|
46
|
-
:
|
|
48
|
+
: findFmHeader(prepared)
|
|
47
49
|
? prepared
|
|
48
50
|
: `FUNCTION ${name}.\n${prepared}\nENDFUNCTION.\n`;
|
|
49
51
|
try {
|
|
50
|
-
prepared = spliceFmSignature(baseSource, name, parameters);
|
|
52
|
+
prepared = spliceFmSignature(baseSource, name, parameters, language);
|
|
51
53
|
}
|
|
52
|
-
catch {
|
|
54
|
+
catch (error) {
|
|
55
|
+
// Explicit descriptions must never be silently dropped by the legacy source fallback.
|
|
56
|
+
if (parameters.some((parameter) => parameter.description !== undefined))
|
|
57
|
+
throw error;
|
|
53
58
|
prepared = baseSource;
|
|
54
59
|
warnings.push('Could not splice structured parameters into the FUNCTION source. Used the source without structured parameter changes.');
|
|
55
60
|
}
|
|
@@ -148,6 +153,25 @@ async function putTtypMetadataAfterCreate(client, objectUrl, name, body, content
|
|
|
148
153
|
throw new Error(ttypPostCreateFailureMessage(name, err));
|
|
149
154
|
}
|
|
150
155
|
}
|
|
156
|
+
/**
|
|
157
|
+
* ENHO create, step 2 (as Eclipse does it): the POST created the empty container; save the BAdI
|
|
158
|
+
* implementations with lock → PUT (with the transport) → unlock. Posting them with the create fails in a
|
|
159
|
+
* transportable package (live 816, 2026-10-07; see badiContainerXml).
|
|
160
|
+
*/
|
|
161
|
+
async function saveBadiImplementationsAfterCreate(client, objectUrl, name, body, contentType, transport, minimalErrors) {
|
|
162
|
+
if (!hasBadiImplementations(body))
|
|
163
|
+
return;
|
|
164
|
+
try {
|
|
165
|
+
await safeUpdateObject(client.http, client.safety, objectUrl, body, contentType, transport, getCachedFeatures()?.abapRelease);
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
// The POST already succeeded: the object exists. A blind retry of create would 409.
|
|
169
|
+
throw new Error(`Created ENHO ${name}, but saving or unlocking failed; the resulting state is unconfirmed. ` +
|
|
170
|
+
`The object exists — check it with SAPRead(type="ENHO", name="${name}"), then use ` +
|
|
171
|
+
`SAPWrite(action="update", type="ENHO", name="${name}", source=…) if needed; do not retry create.\n` +
|
|
172
|
+
batchFailureMessage(err, minimalErrors));
|
|
173
|
+
}
|
|
174
|
+
}
|
|
151
175
|
const KTD_REF_OBJECT_TYPES_ROUTABLE_BY_ARC = new Set([
|
|
152
176
|
'BDEF/BAC',
|
|
153
177
|
'BDEF/BAE',
|
|
@@ -163,12 +187,6 @@ const KTD_REF_OBJECT_TYPES_ROUTABLE_BY_ARC = new Set([
|
|
|
163
187
|
'SRVB/SVB',
|
|
164
188
|
'SRVD/SRV',
|
|
165
189
|
]);
|
|
166
|
-
// Parent types without a canonical ARC-1 object type (no objectBasePath case); the KTD parent
|
|
167
|
-
// adtcore:uri is built from this base path. SMBC = Business Configuration Maintenance Object,
|
|
168
|
-
// ADT returns /sap/bc/adt/bct/smbctyp/<name> for it (e.g. in package object listings).
|
|
169
|
-
const KTD_PARENT_BASE_PATHS = {
|
|
170
|
-
SMBC: '/sap/bc/adt/bct/smbctyp/',
|
|
171
|
-
};
|
|
172
190
|
// Live WBOBJTYPES_SCOPE registry entries for SCOPE_ID = 'DOCUMENTATION' observed on
|
|
173
191
|
// SAP_BASIS 758 and 816. This is diagnostic evidence, not a create allowlist:
|
|
174
192
|
// KTD create still needs a verified ADT parent URI route for <sktd:refObject>.
|
|
@@ -310,6 +328,8 @@ export async function writeActionCreate(ctx) {
|
|
|
310
328
|
// Discovery gate before any SAP call (the TTYP/DOMA gates live in write.ts, which is at its size budget).
|
|
311
329
|
if (type === 'ENQU' && isLockObjectsEndpointAvailable() === false)
|
|
312
330
|
return errorResult(ENQU_WRITE_UNAVAILABLE_HINT);
|
|
331
|
+
if (type === 'ENHO' && isEnhoXhbEndpointAvailable() === false)
|
|
332
|
+
return errorResult(ENHO_WRITE_UNAVAILABLE_HINT);
|
|
313
333
|
// FUNC and FUGR structural includes both INHERIT the parent group's package — SAP ignores
|
|
314
334
|
// _package for them — so the allowlist must be checked against the group's real package.
|
|
315
335
|
// Gating on args.package here would let a caller write into a disallowed package by claiming $TMP.
|
|
@@ -372,18 +392,17 @@ export async function writeActionCreate(ctx) {
|
|
|
372
392
|
return errorResult(`SKTD name "${name}" must match refObjectName "${refName}" — a Knowledge Transfer Document inherits the name of the ABAP object it documents (one KTD per object). To document "${refName}", call SAPWrite(action="create", type="SKTD", name="${refName}", refObjectType="${refType}", ...).`);
|
|
373
393
|
}
|
|
374
394
|
const refDescription = String(args.refObjectDescription ?? '');
|
|
375
|
-
// SAP_BASIS 758 rejects an empty SMBC parent description with only "Check of condition failed".
|
|
376
|
-
if (refType === 'SMBC/TYP' && !refDescription.trim()) {
|
|
377
|
-
return errorResult('"refObjectDescription" is required for SMBC/TYP KTD creation. Provide the business configuration description.');
|
|
378
|
-
}
|
|
379
395
|
// Build the parent URI. ADT URIs use lowercase names by convention (matches the Eclipse trace).
|
|
380
396
|
const refParentType = refType.split('/')[0] ?? '';
|
|
381
|
-
const refUri = `${
|
|
397
|
+
const refUri = `${objectBasePath(refParentType)}${encodeURIComponent(refName.toLowerCase())}`;
|
|
398
|
+
// SADT_OBJECT_REFERENCE reads adtcore:description under check="not-initial(...)": an empty
|
|
399
|
+
// attribute fails with "Check of condition failed"; an absent one is skipped.
|
|
400
|
+
const refDescriptionAttr = refDescription.trim() ? ` adtcore:description="${escapeXmlAttr(refDescription)}"` : '';
|
|
382
401
|
const ktdLang = normalizeAdtLanguage(config.language);
|
|
383
402
|
const ktdBody = `<?xml version="1.0" encoding="UTF-8"?>
|
|
384
403
|
<sktd:docu xmlns:sktd="http://www.sap.com/wbobj/texts/sktd" xmlns:adtcore="http://www.sap.com/adt/core" adtcore:language="${ktdLang}" adtcore:name="${escapeXmlAttr(name)}" adtcore:type="SKTD/TYP" adtcore:masterLanguage="${ktdLang}">
|
|
385
404
|
<adtcore:packageRef adtcore:name="${escapeXmlAttr(pkg)}"/>
|
|
386
|
-
<sktd:refObject
|
|
405
|
+
<sktd:refObject${refDescriptionAttr} adtcore:name="${escapeXmlAttr(refName)}" adtcore:type="${escapeXmlAttr(refType)}" adtcore:uri="${escapeXmlAttr(refUri)}"/>
|
|
387
406
|
</sktd:docu>`;
|
|
388
407
|
const ktdCreateUrl = '/sap/bc/adt/documentation/ktd/documents';
|
|
389
408
|
let ktdResult;
|
|
@@ -432,7 +451,7 @@ export async function writeActionCreate(ctx) {
|
|
|
432
451
|
// Prepare and lint before creating metadata: rejection must not leave an empty object
|
|
433
452
|
// or transport entry. FUNC parameters can synthesize source even when source is omitted.
|
|
434
453
|
const funcPreparation = type === 'FUNC'
|
|
435
|
-
? prepareFunctionModuleCreateSource(name, source, args.parameters)
|
|
454
|
+
? prepareFunctionModuleCreateSource(name, source, args.parameters, await resolveFmDescriptionLanguage(client, groupArg, args.parameters))
|
|
436
455
|
: { shouldWrite: !!source, source: source ?? '', warnings: [] };
|
|
437
456
|
const shouldWriteSource = funcPreparation.shouldWrite;
|
|
438
457
|
const lintWarnings = runPreWriteLint(funcPreparation.source, type, name, config, lintOverride);
|
|
@@ -447,6 +466,8 @@ export async function writeActionCreate(ctx) {
|
|
|
447
466
|
const systemType = resolveWriteSystemType(config, client);
|
|
448
467
|
const cloud = systemType === 'btp';
|
|
449
468
|
const responsible = config.username || (await client.getEffectiveUser());
|
|
469
|
+
if (type === 'ENHO')
|
|
470
|
+
await prepareEnhoCreateProperties(client, metadataProperties, name);
|
|
450
471
|
const body = buildCreateXml(type, name, pkg, description, metadataProperties, config.language, responsible, cloud);
|
|
451
472
|
// Step 1: Create the object (metadata only)
|
|
452
473
|
const createUrl = objectUrl.replace(/\/[^/]+$/, ''); // parent collection URL
|
|
@@ -457,7 +478,7 @@ export async function writeActionCreate(ctx) {
|
|
|
457
478
|
const needsPackageParam = type === 'BDEF' || type === 'TABL' || type === 'TABL/DT' || type === 'TABL/DS';
|
|
458
479
|
let result;
|
|
459
480
|
try {
|
|
460
|
-
result = await createObject(client.http, client.safety, createUrl, body, contentType, effectiveTransport, needsPackageParam ? pkg : undefined, getCachedFeatures()?.abapRelease, systemType, name);
|
|
481
|
+
result = await createObject(client.http, client.safety, createUrl, type === 'ENHO' ? badiContainerXml(body) : body, contentType, effectiveTransport, needsPackageParam ? pkg : undefined, getCachedFeatures()?.abapRelease, systemType, name);
|
|
461
482
|
}
|
|
462
483
|
catch (createErr) {
|
|
463
484
|
if (createErr instanceof AdtApiError && (createErr.statusCode === 400 || createErr.statusCode === 409)) {
|
|
@@ -515,6 +536,16 @@ export async function writeActionCreate(ctx) {
|
|
|
515
536
|
}
|
|
516
537
|
});
|
|
517
538
|
}
|
|
539
|
+
if (type === 'ENHO') {
|
|
540
|
+
try {
|
|
541
|
+
const ct = vendorContentTypeForType(type);
|
|
542
|
+
await saveBadiImplementationsAfterCreate(client, objectUrl, name, body, ct, effectiveTransport, config.minimalErrors);
|
|
543
|
+
}
|
|
544
|
+
catch (err) {
|
|
545
|
+
invalidateWrittenObject(type, name);
|
|
546
|
+
return errorResult(err instanceof Error ? err.message : String(err));
|
|
547
|
+
}
|
|
548
|
+
}
|
|
518
549
|
// TTYP: the POST creates a default-typed (CHAR) shell — a follow-up PUT writes the real row type.
|
|
519
550
|
if (type === 'TTYP') {
|
|
520
551
|
const ct = vendorContentTypeForType(type);
|
|
@@ -525,7 +556,9 @@ export async function writeActionCreate(ctx) {
|
|
|
525
556
|
? `\n\nNext steps:\n1. SAPActivate(type="SRVB", name="${name}")\n2. SAPActivate(action="publish_srvb", name="${name}")`
|
|
526
557
|
: type === 'ENQU'
|
|
527
558
|
? `\n\nNext step: SAPActivate(type="ENQU", name="${name}") — activation generates ENQUEUE_${name}/DEQUEUE_${name}.`
|
|
528
|
-
: ''
|
|
559
|
+
: type === 'ENHO'
|
|
560
|
+
? `\n\nNext step: activate the implementing class(es), then SAPActivate(type="ENHO", name="${name}").`
|
|
561
|
+
: '';
|
|
529
562
|
return textResult(`Created ${type} ${name} in package ${pkg}.\n${result}${followUpHint}`);
|
|
530
563
|
}
|
|
531
564
|
// Step 2: Write the already-validated source if provided.
|
|
@@ -614,6 +647,8 @@ export async function writeActionBatchCreate(ctx) {
|
|
|
614
647
|
errors.push(TTYP_WRITE_UNAVAILABLE_HINT);
|
|
615
648
|
if (plan.type === 'ENQU' && isLockObjectsEndpointAvailable() === false)
|
|
616
649
|
errors.push(ENQU_WRITE_UNAVAILABLE_HINT);
|
|
650
|
+
if (plan.type === 'ENHO' && isEnhoXhbEndpointAvailable() === false)
|
|
651
|
+
errors.push(ENHO_WRITE_UNAVAILABLE_HINT);
|
|
617
652
|
if (plan.type === 'INCL' && plan.name.startsWith('L')) {
|
|
618
653
|
errors.push('Function-group structural includes require a single SAPWrite create with group; batch_create does not support them.');
|
|
619
654
|
}
|
|
@@ -621,7 +656,7 @@ export async function writeActionBatchCreate(ctx) {
|
|
|
621
656
|
if (!aff.valid)
|
|
622
657
|
errors.push(`AFF metadata validation failed:\n- ${(aff.errors ?? []).join('\n- ')}`);
|
|
623
658
|
if (plan.type === 'FUNC') {
|
|
624
|
-
const prepared = prepareFunctionModuleCreateSource(plan.name, plan.source, plan.obj.parameters);
|
|
659
|
+
const prepared = prepareFunctionModuleCreateSource(plan.name, plan.source, plan.obj.parameters, await resolveFmDescriptionLanguage(client, plan.group ?? '', plan.obj.parameters));
|
|
625
660
|
plan.source = prepared.shouldWrite ? prepared.source : undefined;
|
|
626
661
|
warnings.push(...prepared.warnings.map((warning) => `${plan.type} ${plan.name}: ${warning}`));
|
|
627
662
|
}
|
|
@@ -646,6 +681,7 @@ export async function writeActionBatchCreate(ctx) {
|
|
|
646
681
|
}
|
|
647
682
|
if (plan.type === 'DTEL' ||
|
|
648
683
|
plan.type === 'TTYP' ||
|
|
684
|
+
plan.type === 'ENHO' ||
|
|
649
685
|
(plan.type === 'FUNC' && plan.metadata.processingType !== undefined) ||
|
|
650
686
|
(!plan.metadataObject && plan.source)) {
|
|
651
687
|
plan.result.write = 'not_attempted';
|
|
@@ -714,12 +750,14 @@ export async function writeActionBatchCreate(ctx) {
|
|
|
714
750
|
}
|
|
715
751
|
try {
|
|
716
752
|
applyBdefBehaviorExtensionMetadata(plan.type, plan.source, plan.metadata);
|
|
753
|
+
if (plan.type === 'ENHO')
|
|
754
|
+
await prepareEnhoCreateProperties(client, plan.metadata, plan.name);
|
|
717
755
|
plan.body = buildCreateXml(plan.type, plan.name, plan.packageName, plan.description, plan.metadata, config.language, responsible, cloud);
|
|
718
756
|
plan.contentType = createContentTypeForType(plan.type, cloud);
|
|
719
757
|
}
|
|
720
758
|
catch (err) {
|
|
721
|
-
// Construction errors are local input diagnostics,
|
|
722
|
-
failBatchEntry(plan.result, 'preflight', batchFailureMessage(err,
|
|
759
|
+
// Construction errors are local input diagnostics, except the ENHO spot read, which is a SAP response.
|
|
760
|
+
failBatchEntry(plan.result, 'preflight', batchFailureMessage(err, err instanceof AdtApiError && config.minimalErrors));
|
|
723
761
|
}
|
|
724
762
|
}
|
|
725
763
|
if (results.some((entry) => entry.status === 'failed'))
|
|
@@ -732,7 +770,7 @@ export async function writeActionBatchCreate(ctx) {
|
|
|
732
770
|
const needsPackage = plan.type === 'BDEF' || canonicalTablType(plan.type) === 'TABL';
|
|
733
771
|
entry.creation = 'unknown';
|
|
734
772
|
try {
|
|
735
|
-
await createObject(client.http, client.safety, plan.objectUrl.replace(/\/[^/]+$/, ''), plan.body, plan.contentType, plan.transport, needsPackage ? plan.packageName : undefined, getCachedFeatures()?.abapRelease, systemType, plan.name);
|
|
773
|
+
await createObject(client.http, client.safety, plan.objectUrl.replace(/\/[^/]+$/, ''), plan.type === 'ENHO' ? badiContainerXml(plan.body) : plan.body, plan.contentType, plan.transport, needsPackage ? plan.packageName : undefined, getCachedFeatures()?.abapRelease, systemType, plan.name);
|
|
736
774
|
}
|
|
737
775
|
catch (err) {
|
|
738
776
|
if (err instanceof AdtSafetyError)
|
|
@@ -752,6 +790,8 @@ export async function writeActionBatchCreate(ctx) {
|
|
|
752
790
|
if (plan.type === 'FUNC' && plan.metadata.processingType !== undefined) {
|
|
753
791
|
await persistFunctionModuleProcessingMetadata(client, plan.objectUrl, plan.name, plan.metadata.processingType, plan.metadata.updateTaskKind, plan.transport);
|
|
754
792
|
}
|
|
793
|
+
if (plan.type === 'ENHO')
|
|
794
|
+
await saveBadiImplementationsAfterCreate(client, plan.objectUrl, plan.name, plan.body, plan.contentType, plan.transport, config.minimalErrors);
|
|
755
795
|
if (plan.type === 'DTEL') {
|
|
756
796
|
await client.http.withStatefulSession(async (session) => {
|
|
757
797
|
const lock = await lockObject(session, client.safety, plan.objectUrl, 'MODIFY', getCachedFeatures()?.abapRelease);
|
|
@@ -776,7 +816,9 @@ export async function writeActionBatchCreate(ctx) {
|
|
|
776
816
|
else {
|
|
777
817
|
phase = 'activate';
|
|
778
818
|
entry.activation = 'unknown';
|
|
779
|
-
|
|
819
|
+
// Send the name like SAPActivate does: ENHO activation fails with 403 "Resource could not be
|
|
820
|
+
// locked" when the reference carries only the URI (live 816, 2026-10-07).
|
|
821
|
+
const outcome = await activate(client.http, client.safety, plan.objectUrl, { name: plan.name });
|
|
780
822
|
if (!outcome.success) {
|
|
781
823
|
entry.activation = 'failed';
|
|
782
824
|
failBatchEntry(entry, phase, `activation failed: ${batchFailureMessage(outcome.messages.join('; '), config.minimalErrors)}`);
|