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
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/** Technical table settings (TABL/DTT): a separately locked XML document, not table source. */
|
|
2
|
+
import { XMLValidator } from 'fast-xml-parser';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { lockObject, unlockObject } from './crud.js';
|
|
5
|
+
import { fetchDiscoveryDocument, resolveAcceptType } from './discovery.js';
|
|
6
|
+
import { AdtApiError, AdtError } from './errors.js';
|
|
7
|
+
import { checkOperation, OperationType } from './safety.js';
|
|
8
|
+
import { escapeXmlAttr, parseXml } from './xml-parser.js';
|
|
9
|
+
export const TABLE_SETTINGS_COLLECTION = '/sap/bc/adt/ddic/db/settings';
|
|
10
|
+
export const TABLE_SETTINGS_CONTENT_TYPE = 'application/vnd.sap.adt.table.settings.v2+xml';
|
|
11
|
+
const bufferingPatch = z
|
|
12
|
+
.object({
|
|
13
|
+
allowed: z.enum(['N', 'A', 'X']).optional(),
|
|
14
|
+
type: z.enum(['', 'P', 'G', 'X']).optional(),
|
|
15
|
+
areaKeyFields: z.number().int().min(0).max(999).optional(),
|
|
16
|
+
})
|
|
17
|
+
.strict()
|
|
18
|
+
.refine((value) => Object.values(value).some((item) => item !== undefined), 'buffering must not be empty');
|
|
19
|
+
const settingsPatch = z
|
|
20
|
+
.object({
|
|
21
|
+
dataClass: z
|
|
22
|
+
.string()
|
|
23
|
+
.regex(/^[A-Z0-9_]{1,5}$/)
|
|
24
|
+
.optional(),
|
|
25
|
+
sizeCategory: z.number().int().min(0).max(9).optional(),
|
|
26
|
+
buffering: bufferingPatch.optional(),
|
|
27
|
+
})
|
|
28
|
+
.strict()
|
|
29
|
+
.refine((value) => Object.values(value).some((item) => item !== undefined), 'provide at least one setting');
|
|
30
|
+
export function parseTableSettingsPatch(source) {
|
|
31
|
+
try {
|
|
32
|
+
return settingsPatch.parse(JSON.parse(source));
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
throw new AdtError(`Invalid TABL/DTT source: ${error instanceof Error ? error.message : String(error)}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export const tableSettingsUrl = (name) => `${TABLE_SETTINGS_COLLECTION}/${encodeURIComponent(name.toLowerCase())}`;
|
|
39
|
+
export const tableSettingsParentUrl = (name) => `/sap/bc/adt/ddic/tables/${encodeURIComponent(name.toLowerCase())}`;
|
|
40
|
+
export async function assertTableSettingsService(http, safety) {
|
|
41
|
+
checkOperation(safety, OperationType.Read, 'ReadTableSettings');
|
|
42
|
+
let accept;
|
|
43
|
+
if (http.hasDiscoveryData())
|
|
44
|
+
accept = http.discoveryAcceptFor(TABLE_SETTINGS_COLLECTION);
|
|
45
|
+
else {
|
|
46
|
+
// Keep the discovery result request-local, as the shared client can serve different identities.
|
|
47
|
+
const { map } = await fetchDiscoveryDocument(http);
|
|
48
|
+
if (map.size === 0)
|
|
49
|
+
return; // Unknown availability: let the native request establish support.
|
|
50
|
+
accept = resolveAcceptType(map, TABLE_SETTINGS_COLLECTION);
|
|
51
|
+
}
|
|
52
|
+
if (!accept?.includes('table.settings')) {
|
|
53
|
+
throw new AdtApiError('TABL/DTT requires the ADT technical table settings service, unavailable on this system.', 404, TABLE_SETTINGS_COLLECTION);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function record(value) {
|
|
57
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
58
|
+
throw new AdtError('Invalid technical settings metadata.');
|
|
59
|
+
return value;
|
|
60
|
+
}
|
|
61
|
+
function scalar(value) {
|
|
62
|
+
if (typeof value === 'string')
|
|
63
|
+
return value;
|
|
64
|
+
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
65
|
+
const fields = value;
|
|
66
|
+
if (Object.keys(fields).every((key) => key === '#text' || key.startsWith('@_')))
|
|
67
|
+
return scalar(fields['#text'] ?? '');
|
|
68
|
+
}
|
|
69
|
+
throw new AdtError('Missing or duplicate technical settings field.');
|
|
70
|
+
}
|
|
71
|
+
function integer(value) {
|
|
72
|
+
const text = scalar(value);
|
|
73
|
+
if (!/^\d+$/.test(text) || !Number.isSafeInteger(Number(text)))
|
|
74
|
+
throw new AdtError('Invalid numeric technical settings metadata.');
|
|
75
|
+
return Number(text);
|
|
76
|
+
}
|
|
77
|
+
export function parseTableSettings(xml, name) {
|
|
78
|
+
if (XMLValidator.validate(xml) !== true)
|
|
79
|
+
throw new AdtError('Invalid technical settings XML.');
|
|
80
|
+
const root = record(parseXml(xml).tableSettings);
|
|
81
|
+
const parent = record(root.containerRef);
|
|
82
|
+
const version = root['@_version'];
|
|
83
|
+
if (root['@_name'] !== name.toUpperCase() ||
|
|
84
|
+
root['@_type'] !== 'TABL/DTT' ||
|
|
85
|
+
parent['@_name'] !== name.toUpperCase() ||
|
|
86
|
+
parent['@_type'] !== 'TABL/DT' ||
|
|
87
|
+
!['active', 'inactive', 'new'].includes(String(version))) {
|
|
88
|
+
throw new AdtError('Technical settings metadata does not match the requested table or has no known version.');
|
|
89
|
+
}
|
|
90
|
+
const buffering = record(root.buffering);
|
|
91
|
+
const source = {
|
|
92
|
+
dataClass: scalar(root.dataClassCategory),
|
|
93
|
+
sizeCategory: integer(root.sizeCategory),
|
|
94
|
+
buffering: {
|
|
95
|
+
allowed: scalar(buffering.allowed),
|
|
96
|
+
type: scalar(buffering.type),
|
|
97
|
+
areaKeyFields: integer(buffering.areaKeyFields),
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
return {
|
|
101
|
+
name: name.toUpperCase(),
|
|
102
|
+
type: 'TABL/DTT',
|
|
103
|
+
version: String(version),
|
|
104
|
+
source,
|
|
105
|
+
storageType: root.storageType,
|
|
106
|
+
loadUnit: root.loadUnit,
|
|
107
|
+
loggingEnabled: root.loggingEnabled,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export async function getTableSettings(http, safety, name, version) {
|
|
111
|
+
await assertTableSettingsService(http, safety);
|
|
112
|
+
// An unversioned GET can hide another user's draft. SAP falls back to active/new if none exists.
|
|
113
|
+
const response = await http.get(`${tableSettingsUrl(name)}?version=${version ?? 'inactive'}`, {
|
|
114
|
+
Accept: TABLE_SETTINGS_CONTENT_TYPE,
|
|
115
|
+
});
|
|
116
|
+
const result = parseTableSettings(response.body, name);
|
|
117
|
+
if (version && result.version !== version) {
|
|
118
|
+
throw new AdtError(`Cannot confirm ${version} technical settings for ${name}: SAP reports ${result.version}. Omit version for the working view.`);
|
|
119
|
+
}
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
/** Replace one scalar in its native scope; keep attributes, unknown elements and ordering intact. */
|
|
123
|
+
function replaceField(xml, prefix, field, value) {
|
|
124
|
+
const tag = `${prefix}${field}`;
|
|
125
|
+
const escapedTag = tag.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
126
|
+
const pattern = new RegExp(`<${escapedTag}(?:\\s[^>]*?)?>([^<]*)</${escapedTag}\\s*>|<${escapedTag}(?:\\s[^>]*?)?/>`, 'g');
|
|
127
|
+
const matches = [...xml.matchAll(pattern)];
|
|
128
|
+
if (matches.length !== 1)
|
|
129
|
+
throw new AdtError(`Cannot safely edit technical settings: expected one ${field} element.`);
|
|
130
|
+
return xml.replace(pattern, (match) => {
|
|
131
|
+
const opening = match.slice(0, match.indexOf('>') + 1).replace(/\s*\/>$/, '>');
|
|
132
|
+
return `${opening}${escapeXmlAttr(String(value))}</${tag}>`;
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
export function patchTableSettingsXml(xml, name, patch) {
|
|
136
|
+
patch = settingsPatch.parse(patch);
|
|
137
|
+
parseTableSettings(xml, name);
|
|
138
|
+
// Native settings contain scalar XML. Refuse lexical constructs that could hide matching tags.
|
|
139
|
+
if (/<!--|<!\[CDATA\[|<!DOCTYPE/i.test(xml))
|
|
140
|
+
throw new AdtError('Cannot safely edit technical settings containing comments, CDATA or a document type.');
|
|
141
|
+
const prefix = xml.match(/<([A-Za-z_][\w.-]*:)?tableSettings\b/)?.[1] ?? '';
|
|
142
|
+
if (patch.dataClass !== undefined)
|
|
143
|
+
xml = replaceField(xml, prefix, 'dataClassCategory', patch.dataClass);
|
|
144
|
+
if (patch.sizeCategory !== undefined)
|
|
145
|
+
xml = replaceField(xml, prefix, 'sizeCategory', patch.sizeCategory);
|
|
146
|
+
if (patch.buffering) {
|
|
147
|
+
const buffering = patch.buffering;
|
|
148
|
+
const escapedPrefix = prefix.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
149
|
+
const pattern = new RegExp(`<${escapedPrefix}buffering(?:\\s[^>]*?)?>[\\s\\S]*?</${escapedPrefix}buffering\\s*>`, 'g');
|
|
150
|
+
if ([...xml.matchAll(pattern)].length !== 1)
|
|
151
|
+
throw new AdtError('Cannot safely edit technical settings: expected one buffering element.');
|
|
152
|
+
xml = xml.replace(pattern, (block) => {
|
|
153
|
+
for (const [field, value] of Object.entries(buffering)) {
|
|
154
|
+
if (value !== undefined)
|
|
155
|
+
block = replaceField(block, prefix, field, value);
|
|
156
|
+
}
|
|
157
|
+
return block;
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
// A legal '>' inside an attribute can defeat lexical replacement; never PUT malformed XML.
|
|
161
|
+
if (XMLValidator.validate(xml) !== true)
|
|
162
|
+
throw new AdtError('Cannot safely edit this technical settings XML.');
|
|
163
|
+
return xml;
|
|
164
|
+
}
|
|
165
|
+
/** Caller enforces the actual parent table's package. This function never activates. */
|
|
166
|
+
export async function updateTableSettings(http, safety, name, patch, transport) {
|
|
167
|
+
checkOperation(safety, OperationType.Update, 'UpdateTableSettings');
|
|
168
|
+
await assertTableSettingsService(http, safety);
|
|
169
|
+
const url = tableSettingsUrl(name);
|
|
170
|
+
let saved = false;
|
|
171
|
+
let saveRequested = false;
|
|
172
|
+
try {
|
|
173
|
+
return await http.withStatefulSession(async (session) => {
|
|
174
|
+
const lock = await lockObject(session, safety, url, 'MODIFY');
|
|
175
|
+
try {
|
|
176
|
+
const before = (await session.get(`${url}?version=inactive`, { Accept: TABLE_SETTINGS_CONTENT_TYPE })).body;
|
|
177
|
+
const version = parseTableSettings(before, name).version;
|
|
178
|
+
const body = patchTableSettingsXml(before, name, patch);
|
|
179
|
+
const corr = transport ?? lock.corrNr;
|
|
180
|
+
const query = `?lockHandle=${encodeURIComponent(lock.lockHandle)}${corr ? `&corrNr=${encodeURIComponent(corr)}` : ''}`;
|
|
181
|
+
checkOperation(safety, OperationType.Update, 'UpdateTableSettings');
|
|
182
|
+
saveRequested = true;
|
|
183
|
+
await session.put(`${url}${query}`, body, TABLE_SETTINGS_CONTENT_TYPE, { Accept: TABLE_SETTINGS_CONTENT_TYPE },
|
|
184
|
+
// Do not replay an uncertain save; the failure hint asks the caller to inspect the draft.
|
|
185
|
+
{ retryTransientErrors: false });
|
|
186
|
+
saved = true;
|
|
187
|
+
return version;
|
|
188
|
+
}
|
|
189
|
+
finally {
|
|
190
|
+
await unlockObject(session, url, lock.lockHandle);
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
catch (error) {
|
|
195
|
+
if (saveRequested) {
|
|
196
|
+
const note = saved
|
|
197
|
+
? 'Technical settings were saved, but unlocking failed. Read the settings before retrying.'
|
|
198
|
+
: 'Technical settings save was requested but not confirmed. Read the settings before retrying.';
|
|
199
|
+
if (error instanceof AdtError)
|
|
200
|
+
error.extraHint = `${note}\n${error.extraHint ?? ''}`;
|
|
201
|
+
if (error instanceof Error)
|
|
202
|
+
error.message = `${note}\n${error.message}`;
|
|
203
|
+
}
|
|
204
|
+
throw error;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=table-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-settings.js","sourceRoot":"","sources":["../../src/adt/table-settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -28,6 +28,11 @@ declare const TEXT_ELEMENT_COLLECTIONS: {
|
|
|
28
28
|
export type TextElementPart = keyof typeof TEXT_ELEMENT_CT;
|
|
29
29
|
/** Object types that have a text pool on the textelements service. */
|
|
30
30
|
export type TextElementObjectType = keyof typeof TEXT_ELEMENT_COLLECTIONS;
|
|
31
|
+
export interface TextElementWriteResult {
|
|
32
|
+
changes: string;
|
|
33
|
+
state: 'active' | 'inactive' | 'unknown';
|
|
34
|
+
unchanged: boolean;
|
|
35
|
+
}
|
|
31
36
|
export declare const TEXT_ELEMENT_PARTS: TextElementPart[];
|
|
32
37
|
export declare const TEXT_ELEMENT_OBJECT_TYPES: TextElementObjectType[];
|
|
33
38
|
export declare function isTextElementObjectType(type: string): type is TextElementObjectType;
|
|
@@ -43,10 +48,11 @@ export declare function readTextElements(http: AdtHttpClient, safety: SafetyConf
|
|
|
43
48
|
part?: TextElementPart;
|
|
44
49
|
}): Promise<string>;
|
|
45
50
|
/** Write one part, unlock, then activate only the text pool in the same stateful session.
|
|
51
|
+
* Compare native bodies under the lock to report what the replacement removed.
|
|
46
52
|
* PUT uses the part's media type as BOTH Content-Type and Accept. SAP refuses activation
|
|
47
53
|
* while the pool is locked; a source read alone cannot distinguish its inactive version.
|
|
48
54
|
* A never-activated PROG still needs its first owner activation to activate the texts. */
|
|
49
|
-
export declare function writeTextElementPart(http: AdtHttpClient, safety: SafetyConfig, objectType: TextElementObjectType, name: string, part: TextElementPart, source: string, transport?: string): Promise<
|
|
55
|
+
export declare function writeTextElementPart(http: AdtHttpClient, safety: SafetyConfig, objectType: TextElementObjectType, name: string, part: TextElementPart, source: string, transport?: string): Promise<TextElementWriteResult>;
|
|
50
56
|
/** Activate one text-pool URI only; on failure, prefix `note` to the error and keep it as the hint. */
|
|
51
57
|
export declare function activateTextPool(http: AdtHttpClient, safety: SafetyConfig, uri: string, name: string, note: string): Promise<void>;
|
|
52
58
|
/** Caller already holds the owner lock in this session. The pool has an independent lock:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-elements.d.ts","sourceRoot":"","sources":["../../src/adt/text-elements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAiC,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"text-elements.d.ts","sourceRoot":"","sources":["../../src/adt/text-elements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAiC,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAI/E;sDACsD;AACtD,QAAA,MAAM,eAAe;aACnB,OAAO,EAAE,iDAAiD;aAC1D,UAAU,EAAE,oDAAoD;aAChE,QAAQ,EAAE,kDAAkD;CACpD,CAAC;AAEX,0FAA0F;AAC1F,QAAA,MAAM,wBAAwB;aAC5B,IAAI,EAAE,SAAS;aACf,IAAI,EAAE,UAAU;aAChB,IAAI,EAAE,gBAAgB;CACd,CAAC;AAEX,uDAAuD;AACvD,MAAM,MAAM,eAAe,GAAG,MAAM,OAAO,eAAe,CAAC;AAE3D,sEAAsE;AACtE,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,wBAAwB,CAAC;AAE1E,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;IACzC,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,eAAO,MAAM,kBAAkB,EAAmC,eAAe,EAAE,CAAC;AAEpF,eAAO,MAAM,yBAAyB,EAA4C,qBAAqB,EAAE,CAAC;AAE1G,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,qBAAqB,CAEnF;AAsBD,8DAA8D;AAC9D,wBAAgB,yBAAyB,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAQtG;AAED;gGACgG;AAChG,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,qBAAqB,EACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,eAAe,GACpB,OAAO,CAAC,MAAM,CAAC,CAQjB;AAED;4FAC4F;AAC5F,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,eAAe,CAAA;CAAE,GACxD,OAAO,CAAC,MAAM,CAAC,CAyBjB;AAED;;;;2FAI2F;AAC3F,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,qBAAqB,EACjC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,eAAe,EACrB,MAAM,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC,sBAAsB,CAAC,CAgEjC;AAwBD,uGAAuG;AACvG,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,aAAa,EACnB,MAAM,EAAE,YAAY,EACpB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAUf;AASD;;wFAEwF;AACxF,wBAAsB,2BAA2B,CAAC,CAAC,EACjD,OAAO,EAAE,aAAa,EACtB,MAAM,EAAE,YAAY,EACpB,UAAU,EAAE,MAAM,GAAG,MAAM,EAC3B,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAC5B,OAAO,CAAC,CAAC,CAAC,CAyBZ"}
|
|
@@ -13,6 +13,7 @@ import { lockObject, unlockObject } from './crud.js';
|
|
|
13
13
|
import { activate } from './devtools.js';
|
|
14
14
|
import { AdtApiError, AdtError } from './errors.js';
|
|
15
15
|
import { checkOperation, OperationType } from './safety.js';
|
|
16
|
+
import { textPartChanges } from './text-part-changes.js';
|
|
16
17
|
import { parseXml } from './xml-parser.js';
|
|
17
18
|
/** Media type per subobject. Each is used as BOTH Content-Type and Accept on the write PUT (SAP
|
|
18
19
|
* returns 400 "Accept header missing" otherwise). */
|
|
@@ -91,6 +92,7 @@ export async function readTextElements(http, safety, name, options) {
|
|
|
91
92
|
return chunks.length > 0 ? chunks.join('\n\n') : `No text elements maintained for ${objectType} ${name}.`;
|
|
92
93
|
}
|
|
93
94
|
/** Write one part, unlock, then activate only the text pool in the same stateful session.
|
|
95
|
+
* Compare native bodies under the lock to report what the replacement removed.
|
|
94
96
|
* PUT uses the part's media type as BOTH Content-Type and Accept. SAP refuses activation
|
|
95
97
|
* while the pool is locked; a source read alone cannot distinguish its inactive version.
|
|
96
98
|
* A never-activated PROG still needs its first owner activation to activate the texts. */
|
|
@@ -102,20 +104,67 @@ export async function writeTextElementPart(http, safety, objectType, name, part,
|
|
|
102
104
|
}
|
|
103
105
|
assertTextElementsService(http, objectType);
|
|
104
106
|
const obj = textElementsObject(objectType, name);
|
|
107
|
+
const result = { changes: '', state: 'unknown', unchanged: false };
|
|
105
108
|
await http.withStatefulSession(async (session) => {
|
|
106
109
|
const lock = await lockObject(session, safety, obj, 'MODIFY');
|
|
107
110
|
const corr = transport ?? (lock.corrNr || undefined);
|
|
111
|
+
let saved = false;
|
|
108
112
|
try {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
+
try {
|
|
114
|
+
const before = await readTextElementPart(session, safety, objectType, name, part);
|
|
115
|
+
// Initial empty CLAS/FUGR saves can strand an inactive pool in SAP (COMPAT-15).
|
|
116
|
+
// Content equality alone is not enough: an existing draft must never be skipped.
|
|
117
|
+
if (objectType !== 'PROG' && part === 'symbols' && source === '' && before === '') {
|
|
118
|
+
const state = await readTextPoolState(session, obj, objectType, name);
|
|
119
|
+
if (state === 'active') {
|
|
120
|
+
result.state = state;
|
|
121
|
+
result.unchanged = true;
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
let url = `${obj}/source/${part}?lockHandle=${encodeURIComponent(lock.lockHandle)}`;
|
|
126
|
+
if (corr)
|
|
127
|
+
url += `&corrNr=${encodeURIComponent(corr)}`;
|
|
128
|
+
await session.put(url, source, TEXT_ELEMENT_CT[part], { Accept: TEXT_ELEMENT_CT[part] });
|
|
129
|
+
saved = true;
|
|
130
|
+
const after = await readTextElementPart(session, safety, objectType, name, part);
|
|
131
|
+
result.changes = textPartChanges(part, before, after);
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
await unlockObject(session, obj, lock.lockHandle);
|
|
135
|
+
}
|
|
113
136
|
}
|
|
114
|
-
|
|
115
|
-
|
|
137
|
+
catch (err) {
|
|
138
|
+
if (saved) {
|
|
139
|
+
throwTextPoolFailure(err, 'Text elements were saved, but read-back or activation was not confirmed. Read the part before retrying.' +
|
|
140
|
+
result.changes);
|
|
141
|
+
}
|
|
142
|
+
throw err;
|
|
143
|
+
}
|
|
144
|
+
await activateTextPool(session, safety, obj, name, `Text elements were saved, but activation was not confirmed. Inspect the text pool before retrying the same text write.${result.changes}`);
|
|
145
|
+
try {
|
|
146
|
+
result.state = await readTextPoolState(session, obj, objectType, name);
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
// The save and activation request completed; do not turn a failed final read into a retry.
|
|
150
|
+
result.state = 'unknown';
|
|
116
151
|
}
|
|
117
|
-
await activateTextPool(session, safety, obj, name, 'Text elements were saved, but activation was not confirmed. Retry the same text write.');
|
|
118
152
|
});
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
/** Explicit metadata can reveal drafts omitted from the caller's inactive-object feed. */
|
|
156
|
+
async function readTextPoolState(http, uri, objectType, name) {
|
|
157
|
+
const response = await http.get(`${uri}?version=inactive`);
|
|
158
|
+
const pool = parseXml(response.body).textElement;
|
|
159
|
+
const state = pool?.['@_version'];
|
|
160
|
+
if (!pool ||
|
|
161
|
+
Array.isArray(pool) ||
|
|
162
|
+
pool['@_name'] !== name ||
|
|
163
|
+
pool['@_type'] !== (objectType === 'CLAS' ? 'CLAS/OCX' : `${objectType}/PX`) ||
|
|
164
|
+
(state !== 'active' && state !== 'inactive')) {
|
|
165
|
+
throw new AdtApiError('Cannot verify the text-pool state.', 409, uri);
|
|
166
|
+
}
|
|
167
|
+
return state;
|
|
119
168
|
}
|
|
120
169
|
/** Activate one text-pool URI only; on failure, prefix `note` to the error and keep it as the hint. */
|
|
121
170
|
export async function activateTextPool(http, safety, uri, name, note) {
|
|
@@ -127,15 +176,17 @@ export async function activateTextPool(http, safety, uri, name, note) {
|
|
|
127
176
|
}
|
|
128
177
|
}
|
|
129
178
|
catch (err) {
|
|
130
|
-
|
|
131
|
-
if (err instanceof AdtError && !err.extraHint)
|
|
132
|
-
err.extraHint = note;
|
|
133
|
-
if (err instanceof Error) {
|
|
134
|
-
err.message = `${note}\n${err.message}`;
|
|
135
|
-
}
|
|
136
|
-
throw err;
|
|
179
|
+
throwTextPoolFailure(err, note);
|
|
137
180
|
}
|
|
138
181
|
}
|
|
182
|
+
/** Keep confirmed save state visible even when minimal errors hide SAP diagnostics. */
|
|
183
|
+
function throwTextPoolFailure(err, note) {
|
|
184
|
+
if (err instanceof AdtError)
|
|
185
|
+
err.extraHint = err.extraHint ? `${note}\n${err.extraHint}` : note;
|
|
186
|
+
if (err instanceof Error)
|
|
187
|
+
err.message = `${note}\n${err.message}`;
|
|
188
|
+
throw err;
|
|
189
|
+
}
|
|
139
190
|
/** Caller already holds the owner lock in this session. The pool has an independent lock:
|
|
140
191
|
* hold both from the explicit inactive-version read through owner DELETE. The caller's
|
|
141
192
|
* inactive feed omits other users' drafts and cannot authorize automatic activation. */
|
|
@@ -145,22 +196,13 @@ export async function withActiveTextPoolForDelete(session, safety, objectType, n
|
|
|
145
196
|
const uri = textElementsObject(objectType, name);
|
|
146
197
|
const lock = await lockObject(session, safety, uri, 'MODIFY');
|
|
147
198
|
try {
|
|
148
|
-
const
|
|
149
|
-
const pool = parseXml(response.body).textElement;
|
|
150
|
-
const version = pool?.['@_version'];
|
|
151
|
-
if (!pool ||
|
|
152
|
-
Array.isArray(pool) ||
|
|
153
|
-
pool['@_name'] !== name ||
|
|
154
|
-
pool['@_type'] !== `${objectType}/PX` ||
|
|
155
|
-
(version !== 'active' && version !== 'inactive')) {
|
|
156
|
-
throw new AdtApiError('Cannot verify the text-pool state; the owner was not deleted.', 409, uri);
|
|
157
|
-
}
|
|
199
|
+
const version = await readTextPoolState(session, uri, objectType, name);
|
|
158
200
|
if (version === 'inactive') {
|
|
159
201
|
const hint = `${objectType} ${name} was not deleted because its text pool is inactive. ` +
|
|
160
202
|
'Review the draft with its author, then explicitly activate the pool and retry deletion. ' +
|
|
161
203
|
(objectType === 'PROG'
|
|
162
204
|
? `A newly created program needs its first owner activation. If its source cannot compile and you intend to discard it, replace the source with REPORT ${name}., activate the program, then retry deletion.`
|
|
163
|
-
: '
|
|
205
|
+
: 'SAP can leave an empty pool inactive despite a successful activation response. Stop and involve the user; ARC-1 has no verified automatic repair.');
|
|
164
206
|
const error = new AdtApiError('Deletion refused because the text pool is inactive.', 409, uri);
|
|
165
207
|
error.extraHint = hint;
|
|
166
208
|
throw error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"text-elements.js","sourceRoot":"","sources":["../../src/adt/text-elements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAqB,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C;sDACsD;AACtD,MAAM,eAAe,GAAG;IACtB,OAAO,EAAE,iDAAiD;IAC1D,UAAU,EAAE,oDAAoD;IAChE,QAAQ,EAAE,kDAAkD;CACpD,CAAC;AAEX,0FAA0F;AAC1F,MAAM,wBAAwB,GAAG;IAC/B,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,gBAAgB;CACd,CAAC;
|
|
1
|
+
{"version":3,"file":"text-elements.js","sourceRoot":"","sources":["../../src/adt/text-elements.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEpD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAqB,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C;sDACsD;AACtD,MAAM,eAAe,GAAG;IACtB,OAAO,EAAE,iDAAiD;IAC1D,UAAU,EAAE,oDAAoD;IAChE,QAAQ,EAAE,kDAAkD;CACpD,CAAC;AAEX,0FAA0F;AAC1F,MAAM,wBAAwB,GAAG;IAC/B,IAAI,EAAE,SAAS;IACf,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,gBAAgB;CACd,CAAC;AAcX,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAsB,CAAC;AAEpF,MAAM,CAAC,MAAM,yBAAyB,GAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAA4B,CAAC;AAE1G,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,OAAO,MAAM,CAAC,MAAM,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;AACvD,CAAC;AAED,8FAA8F;AAC9F,SAAS,UAAU,CAAC,UAAiC,EAAE,IAAqB;IAC1E,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,WAAW,CAAC,2CAA2C,EAAE,GAAG,EAAE,0BAA0B,CAAC,CAAC;IACtG,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,SAAS,kBAAkB,CAAC,UAAiC,EAAE,IAAY;IACzE,OAAO,4BAA4B,wBAAwB,CAAC,UAAU,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;AACxG,CAAC;AAED;;qCAEqC;AACrC,SAAS,gBAAgB,CAAC,IAAmB,EAAE,UAAiC;IAC9E,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,IAAI,CAAC,kBAAkB,CAAC,4BAA4B,wBAAwB,CAAC,UAAU,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC;AACnH,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,yBAAyB,CAAC,IAAmB,EAAE,UAAiC;IAC9F,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,WAAW,CACnB,qBAAqB,UAAU,uEAAuE,EACtG,GAAG,EACH,4BAA4B,wBAAwB,CAAC,UAAU,CAAC,EAAE,CACnE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;gGACgG;AAChG,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAmB,EACnB,MAAoB,EACpB,UAAiC,EACjC,IAAY,EACZ,IAAqB;IAErB,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC9D,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC7B,yBAAyB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE;QACpF,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC;KAC9B,CAAC,CAAC;IACH,OAAO,IAAI,CAAC,IAAI,CAAC;AACnB,CAAC;AAED;4FAC4F;AAC5F,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAmB,EACnB,MAAoB,EACpB,IAAY,EACZ,OAAyD;IAEzD,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IACjE,IAAI,CAAC,uBAAuB,CAAC,UAAU,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,WAAW,CACnB,gCAAgC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,UAAU,IAAI,EAC7F,GAAG,EACH,0BAA0B,CAC3B,CAAC;IACJ,CAAC;IACD,yBAAyB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5C,IAAI,OAAO,EAAE,IAAI;QAAE,OAAO,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5F,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,KAAK,GAA+B,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC;IACnG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7E,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,MAAM,CAAC,IAAI,CAAC,OAAO,IAAI,SAAS,IAAI,EAAE,CAAC,CAAC;IAC3D,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CACT,0JAA0J,CAC3J,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mCAAmC,UAAU,IAAI,IAAI,GAAG,CAAC;AAC5G,CAAC;AAED;;;;2FAI2F;AAC3F,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAmB,EACnB,MAAoB,EACpB,UAAiC,EACjC,IAAY,EACZ,IAAqB,EACrB,MAAc,EACd,SAAkB;IAElB,cAAc,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAClE,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IAC7B,IAAI,UAAU,KAAK,MAAM,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QAChD,MAAM,IAAI,WAAW,CACnB,yCAAyC,IAAI,yBAAyB,EACtE,GAAG,EACH,kCAAkC,CACnC,CAAC;IACJ,CAAC;IACD,yBAAyB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,MAAM,GAA2B,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC3F,MAAM,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC/C,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;QACrD,IAAI,KAAK,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC;YACH,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBAClF,gFAAgF;gBAChF,iFAAiF;gBACjF,IAAI,UAAU,KAAK,MAAM,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;oBAClF,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;oBACtE,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;wBACvB,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;wBACrB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC;wBACxB,OAAO;oBACT,CAAC;gBACH,CAAC;gBACD,IAAI,GAAG,GAAG,GAAG,GAAG,WAAW,IAAI,eAAe,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;gBACpF,IAAI,IAAI;oBAAE,GAAG,IAAI,WAAW,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;gBACvD,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACzF,KAAK,GAAG,IAAI,CAAC;gBACb,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;gBACjF,MAAM,CAAC,OAAO,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YACxD,CAAC;oBAAS,CAAC;gBACT,MAAM,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,KAAK,EAAE,CAAC;gBACV,oBAAoB,CAClB,GAAG,EACH,yGAAyG;oBACvG,MAAM,CAAC,OAAO,CACjB,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,MAAM,gBAAgB,CACpB,OAAO,EACP,MAAM,EACN,GAAG,EACH,IAAI,EACJ,yHAAyH,MAAM,CAAC,OAAO,EAAE,CAC1I,CAAC;QACF,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QACzE,CAAC;QAAC,MAAM,CAAC;YACP,2FAA2F;YAC3F,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,0FAA0F;AAC1F,KAAK,UAAU,iBAAiB,CAC9B,IAAmB,EACnB,GAAW,EACX,UAAiC,EACjC,IAAY;IAEZ,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,mBAAmB,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAkD,CAAC;IACxF,MAAM,KAAK,GAAG,IAAI,EAAE,CAAC,WAAW,CAAC,CAAC;IAClC,IACE,CAAC,IAAI;QACL,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACnB,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI;QACvB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,KAAK,CAAC;QAC5E,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,UAAU,CAAC,EAC5C,CAAC;QACD,MAAM,IAAI,WAAW,CAAC,oCAAoC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,uGAAuG;AACvG,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAmB,EACnB,MAAoB,EACpB,GAAW,EACX,IAAY,EACZ,IAAY;IAEZ,IAAI,CAAC;QACH,sEAAsE;QACtE,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5E,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,8BAA8B,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,oBAAoB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED,uFAAuF;AACvF,SAAS,oBAAoB,CAAC,GAAY,EAAE,IAAY;IACtD,IAAI,GAAG,YAAY,QAAQ;QAAE,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IAChG,IAAI,GAAG,YAAY,KAAK;QAAE,GAAG,CAAC,OAAO,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC;IAClE,MAAM,GAAG,CAAC;AACZ,CAAC;AAED;;wFAEwF;AACxF,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAsB,EACtB,MAAoB,EACpB,UAA2B,EAC3B,IAAY,EACZ,WAA6B;IAE7B,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC;QAAE,OAAO,WAAW,EAAE,CAAC;IACjE,MAAM,GAAG,GAAG,kBAAkB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QACxE,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YAC3B,MAAM,IAAI,GACR,GAAG,UAAU,IAAI,IAAI,sDAAsD;gBAC3E,0FAA0F;gBAC1F,CAAC,UAAU,KAAK,MAAM;oBACpB,CAAC,CAAC,uJAAuJ,IAAI,+CAA+C;oBAC5M,CAAC,CAAC,mJAAmJ,CAAC,CAAC;YAC3J,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,qDAAqD,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;YAC/F,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC;YACvB,MAAM,KAAK,CAAC;QACd,CAAC;QACD,OAAO,MAAM,WAAW,EAAE,CAAC;IAC7B,CAAC;YAAS,CAAC;QACT,IAAI,CAAC;YACH,MAAM,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;QAAC,MAAM,CAAC;YACP,iFAAiF;QACnF,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { TextElementPart } from './text-elements.js';
|
|
2
|
+
/** Describe only losses confirmed by a native read after the PUT, while still locked. */
|
|
3
|
+
export declare function textPartChanges(part: TextElementPart, before: string, after: string): string;
|
|
4
|
+
//# sourceMappingURL=text-part-changes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-part-changes.d.ts","sourceRoot":"","sources":["../../src/adt/text-part-changes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAqB1D,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAe5F"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/** Read SAP's canonical part bodies, not user input: SAP normalizes keys and resolves
|
|
2
|
+
* dictionary labels. Removed selections are absent or KEY=?..., empty headings KEY=. */
|
|
3
|
+
function entries(part, body) {
|
|
4
|
+
const result = new Map();
|
|
5
|
+
let ddic = false;
|
|
6
|
+
for (const line of body.split(/\r?\n/)) {
|
|
7
|
+
if (line.trim() === '@DDICReference')
|
|
8
|
+
ddic = true;
|
|
9
|
+
const equals = line.indexOf('=');
|
|
10
|
+
if (equals < 0)
|
|
11
|
+
continue;
|
|
12
|
+
const value = line.slice(equals + 1).trim();
|
|
13
|
+
result.set(line.slice(0, equals).trim(), {
|
|
14
|
+
maintained: value !== '' && (part !== 'selections' || value !== '?...'),
|
|
15
|
+
ddic,
|
|
16
|
+
});
|
|
17
|
+
ddic = false;
|
|
18
|
+
}
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
/** Describe only losses confirmed by a native read after the PUT, while still locked. */
|
|
22
|
+
export function textPartChanges(part, before, after) {
|
|
23
|
+
const next = entries(part, after);
|
|
24
|
+
const removed = [];
|
|
25
|
+
const references = [];
|
|
26
|
+
for (const [key, old] of entries(part, before)) {
|
|
27
|
+
const current = next.get(key);
|
|
28
|
+
if ((old.maintained && !current?.maintained) || (part === 'symbols' && !current))
|
|
29
|
+
removed.push(key);
|
|
30
|
+
if (old.ddic && !current?.ddic)
|
|
31
|
+
references.push(key);
|
|
32
|
+
}
|
|
33
|
+
const lines = [];
|
|
34
|
+
if (removed.length)
|
|
35
|
+
lines.push(`Removed texts: ${removed.join(', ')}.`);
|
|
36
|
+
if (references.length)
|
|
37
|
+
lines.push(`Removed dictionary references: ${references.join(', ')}.`);
|
|
38
|
+
if (!lines.length)
|
|
39
|
+
return '';
|
|
40
|
+
lines.push('To restore them, resend the previous complete part, including its annotations.');
|
|
41
|
+
return `\n${lines.join('\n')}`;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=text-part-changes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-part-changes.js","sourceRoot":"","sources":["../../src/adt/text-part-changes.ts"],"names":[],"mappings":"AAEA;wFACwF;AACxF,SAAS,OAAO,CAAC,IAAqB,EAAE,IAAY;IAClD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkD,CAAC;IACzE,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,gBAAgB;YAAE,IAAI,GAAG,IAAI,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,GAAG,CAAC;YAAE,SAAS;QACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE;YACvC,UAAU,EAAE,KAAK,KAAK,EAAE,IAAI,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,KAAK,MAAM,CAAC;YACvE,IAAI;SACL,CAAC,CAAC;QACH,IAAI,GAAG,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,eAAe,CAAC,IAAqB,EAAE,MAAc,EAAE,KAAa;IAClF,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAClC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,UAAU,IAAI,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpG,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,IAAI;YAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvD,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxE,IAAI,UAAU,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,kCAAkC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9F,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,gFAAgF,CAAC,CAAC;IAC7F,OAAO,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -1,28 +1,10 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Transport-scoped review diffs — backs `SAPTransport action="diff"`.
|
|
3
|
-
*
|
|
4
|
-
* Answers "what did this transport change?" by picking, per object, the revision written
|
|
5
|
-
* under the transport and the one immediately before it, then diffing those two sources.
|
|
6
|
-
*
|
|
7
|
-
* The selection mirrors SAP's own ADT MCP tool
|
|
8
|
-
* (`com.sap.adt.tm.backend.diff.TransportDiffService`, ADT 3.60.1) with four corrections
|
|
9
|
-
* proven necessary against live feeds — see docs/plans/2026-08-03-transport-diff.md:
|
|
10
|
-
*
|
|
11
|
-
* 1. match the request AND its tasks (SAP matches one exact correction number);
|
|
12
|
-
* 2. break timestamp ties on the version number — the feed is returned in neither
|
|
13
|
-
* version nor date order (a4h returns `00002, 00000, 00001`);
|
|
14
|
-
* 3. skip every same-transport sibling when walking back, not just one active entry,
|
|
15
|
-
* so two saves under one transport still diff against the pre-transport state;
|
|
16
|
-
* 4. never require the predecessor to carry a CTS id — released revisions with a blank
|
|
17
|
-
* transport exist and are valid baselines.
|
|
18
|
-
*
|
|
19
|
-
* `selectionMethod` and `baselineStatus` ride the result so a reviewer can tell exact
|
|
20
|
-
* evidence from a fallback guess; SAP's tool reports neither.
|
|
21
|
-
*/
|
|
22
1
|
import { type AdtClient } from './client.js';
|
|
2
|
+
import { ReviewBudget } from './transport-review-budget.js';
|
|
23
3
|
import type { RevisionInfo, TransportObject } from './types.js';
|
|
24
4
|
/** How `current` was chosen — evidence quality, surfaced to the caller. */
|
|
25
|
-
export type RevisionSelectionMethod = 'exact-transport' | '
|
|
5
|
+
export type RevisionSelectionMethod = 'exact-transport' | 'active-only-fallback' | 'no-revisions';
|
|
6
|
+
export type ReviewMode = 'released' | 'active';
|
|
7
|
+
export declare function revisionSourceState(r: RevisionInfo | null): 'released' | 'active' | 'draft' | 'unknown';
|
|
26
8
|
/** What the "before" side of a diff actually is. */
|
|
27
9
|
export type BaselineStatus = 'prior-revision'
|
|
28
10
|
/** A predecessor exists, but the "after" side was NOT matched to this transport — the diff
|
|
@@ -37,6 +19,8 @@ export interface TransportRevisionPair {
|
|
|
37
19
|
previous: RevisionInfo | null;
|
|
38
20
|
selectionMethod: RevisionSelectionMethod;
|
|
39
21
|
skipped: SkippedRevision[];
|
|
22
|
+
/** A candidate predecessor exists, but its chronology cannot be established. */
|
|
23
|
+
baselineAmbiguous?: boolean;
|
|
40
24
|
}
|
|
41
25
|
/**
|
|
42
26
|
* The 5-digit ADT version number of a revision.
|
|
@@ -52,12 +36,12 @@ export declare function revisionNumber(revision: RevisionInfo): string;
|
|
|
52
36
|
* the request on the systems verified so far, but matching both is a superset that can
|
|
53
37
|
* only add correct matches.
|
|
54
38
|
*/
|
|
55
|
-
export declare function selectTransportRevisionPair(revisions: RevisionInfo[], transportIds: Iterable<string
|
|
39
|
+
export declare function selectTransportRevisionPair(revisions: RevisionInfo[], transportIds: Iterable<string>, mode?: ReviewMode): TransportRevisionPair;
|
|
56
40
|
/**
|
|
57
41
|
* Classify the "before" side.
|
|
58
42
|
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
43
|
+
* No prior snapshot means only that no predecessor was found; it is not proof of creation.
|
|
44
|
+
* An exact transport match identifies attribution, not the completeness of retained history. A missing predecessor under a fallback selection is ambiguous — it may
|
|
61
45
|
* simply mean the object's history was never snapshotted.
|
|
62
46
|
*/
|
|
63
47
|
export declare function baselineStatusFor(pair: TransportRevisionPair, allRevisions?: RevisionInfo[]): BaselineStatus;
|
|
@@ -112,17 +96,24 @@ export interface TransportPartDiff {
|
|
|
112
96
|
/** The hunks were trimmed; `added`/`removed` still reflect the full change. */
|
|
113
97
|
diffTruncated?: boolean;
|
|
114
98
|
note?: string;
|
|
99
|
+
hunksOmitted?: boolean;
|
|
115
100
|
}
|
|
116
101
|
export interface TransportObjectDiff {
|
|
117
102
|
type: string;
|
|
118
103
|
name: string;
|
|
119
104
|
taskIds: string[];
|
|
120
105
|
parts: TransportPartDiff[];
|
|
106
|
+
/** CTS scope that the source comparison does not cover. */
|
|
107
|
+
notCompared?: string[];
|
|
108
|
+
scopeNote?: string;
|
|
121
109
|
/** Set instead of `parts` when the object carries no diffable source at all. */
|
|
122
110
|
inventoryReason?: string;
|
|
123
111
|
}
|
|
124
112
|
/** Diff every source part of one logical object. Never throws — failures become visible rows. */
|
|
125
113
|
export declare function diffTransportObject(client: AdtClient, object: LogicalTransportObject, transportIds: Set<string>, opts?: {
|
|
126
114
|
minimalErrors?: boolean;
|
|
115
|
+
mode?: ReviewMode;
|
|
116
|
+
budget?: ReviewBudget;
|
|
117
|
+
summary?: boolean;
|
|
127
118
|
}): Promise<TransportObjectDiff>;
|
|
128
119
|
//# sourceMappingURL=transport-diff.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport-diff.d.ts","sourceRoot":"","sources":["../../src/adt/transport-diff.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transport-diff.d.ts","sourceRoot":"","sources":["../../src/adt/transport-diff.ts"],"names":[],"mappings":"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"}
|