arc-1 1.3.0 → 1.5.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 +1 -1
- package/dist/adt/abapgit.d.ts.map +1 -1
- package/dist/adt/abapgit.js +64 -7
- package/dist/adt/abapgit.js.map +1 -1
- package/dist/adt/aunit.js +4 -4
- package/dist/adt/aunit.js.map +1 -1
- package/dist/adt/class-structure.d.ts +4 -2
- package/dist/adt/class-structure.d.ts.map +1 -1
- package/dist/adt/class-structure.js +18 -9
- package/dist/adt/class-structure.js.map +1 -1
- package/dist/adt/client.d.ts +18 -52
- package/dist/adt/client.d.ts.map +1 -1
- package/dist/adt/client.js +69 -92
- package/dist/adt/client.js.map +1 -1
- package/dist/adt/config.d.ts +5 -0
- package/dist/adt/config.d.ts.map +1 -1
- package/dist/adt/config.js.map +1 -1
- package/dist/adt/create-request.d.ts +4 -0
- package/dist/adt/create-request.d.ts.map +1 -0
- package/dist/adt/create-request.js +16 -0
- package/dist/adt/create-request.js.map +1 -0
- package/dist/adt/crud.d.ts +3 -3
- package/dist/adt/crud.d.ts.map +1 -1
- package/dist/adt/crud.js +28 -9
- package/dist/adt/crud.js.map +1 -1
- package/dist/adt/data-source-policy.d.ts +20 -8
- package/dist/adt/data-source-policy.d.ts.map +1 -1
- package/dist/adt/data-source-policy.js +55 -109
- package/dist/adt/data-source-policy.js.map +1 -1
- package/dist/adt/ddic-xml.d.ts +9 -0
- package/dist/adt/ddic-xml.d.ts.map +1 -1
- package/dist/adt/ddic-xml.js +17 -3
- package/dist/adt/ddic-xml.js.map +1 -1
- package/dist/adt/devtools.d.ts.map +1 -1
- package/dist/adt/devtools.js +10 -7
- package/dist/adt/devtools.js.map +1 -1
- package/dist/adt/diagnostics.d.ts +11 -9
- package/dist/adt/diagnostics.d.ts.map +1 -1
- package/dist/adt/diagnostics.js +88 -14
- package/dist/adt/diagnostics.js.map +1 -1
- package/dist/adt/enhancements.d.ts +7 -0
- package/dist/adt/enhancements.d.ts.map +1 -0
- package/dist/adt/enhancements.js +89 -0
- package/dist/adt/enhancements.js.map +1 -0
- package/dist/adt/errors.d.ts +21 -10
- package/dist/adt/errors.d.ts.map +1 -1
- package/dist/adt/errors.js +76 -54
- package/dist/adt/errors.js.map +1 -1
- package/dist/adt/features.d.ts.map +1 -1
- package/dist/adt/features.js +2 -0
- package/dist/adt/features.js.map +1 -1
- package/dist/adt/flp.d.ts.map +1 -1
- package/dist/adt/flp.js +5 -4
- package/dist/adt/flp.js.map +1 -1
- package/dist/adt/fm-signature.d.ts +1 -1
- package/dist/adt/fm-signature.d.ts.map +1 -1
- package/dist/adt/fm-signature.js +9 -1
- package/dist/adt/fm-signature.js.map +1 -1
- package/dist/adt/http-deadline.d.ts +2 -0
- package/dist/adt/http-deadline.d.ts.map +1 -1
- package/dist/adt/http-deadline.js.map +1 -1
- package/dist/adt/http.d.ts +12 -29
- package/dist/adt/http.d.ts.map +1 -1
- package/dist/adt/http.js +102 -95
- package/dist/adt/http.js.map +1 -1
- package/dist/adt/internal-data-operations.d.ts +3 -2
- package/dist/adt/internal-data-operations.d.ts.map +1 -1
- package/dist/adt/internal-data-operations.js +8 -1
- package/dist/adt/internal-data-operations.js.map +1 -1
- package/dist/adt/lock-object.d.ts +92 -0
- package/dist/adt/lock-object.d.ts.map +1 -0
- package/dist/adt/lock-object.js +195 -0
- package/dist/adt/lock-object.js.map +1 -0
- package/dist/adt/publish-state.d.ts +4 -0
- package/dist/adt/publish-state.d.ts.map +1 -0
- package/dist/adt/publish-state.js +61 -0
- package/dist/adt/publish-state.js.map +1 -0
- package/dist/adt/rap-generate.d.ts +5 -1
- package/dist/adt/rap-generate.d.ts.map +1 -1
- package/dist/adt/rap-generate.js +112 -100
- package/dist/adt/rap-generate.js.map +1 -1
- package/dist/adt/server-driven.d.ts +56 -13
- package/dist/adt/server-driven.d.ts.map +1 -1
- package/dist/adt/server-driven.js +114 -23
- package/dist/adt/server-driven.js.map +1 -1
- package/dist/adt/source-precondition.d.ts +3 -0
- package/dist/adt/source-precondition.d.ts.map +1 -0
- package/dist/adt/source-precondition.js +12 -0
- package/dist/adt/source-precondition.js.map +1 -0
- package/dist/adt/text-search.js +5 -5
- package/dist/adt/text-search.js.map +1 -1
- package/dist/adt/transport.d.ts +1 -2
- package/dist/adt/transport.d.ts.map +1 -1
- package/dist/adt/transport.js +20 -15
- package/dist/adt/transport.js.map +1 -1
- package/dist/adt/types.d.ts +21 -1
- package/dist/adt/types.d.ts.map +1 -1
- package/dist/adt/user-agent.d.ts +4 -0
- package/dist/adt/user-agent.d.ts.map +1 -0
- package/dist/adt/user-agent.js +11 -0
- package/dist/adt/user-agent.js.map +1 -0
- package/dist/adt/xml-entities.d.ts +3 -0
- package/dist/adt/xml-entities.d.ts.map +1 -0
- package/dist/adt/xml-entities.js +19 -0
- package/dist/adt/xml-entities.js.map +1 -0
- package/dist/adt/xml-parser.d.ts +7 -30
- package/dist/adt/xml-parser.d.ts.map +1 -1
- package/dist/adt/xml-parser.js +25 -54
- package/dist/adt/xml-parser.js.map +1 -1
- package/dist/authz/policy.d.ts.map +1 -1
- package/dist/authz/policy.js +2 -0
- package/dist/authz/policy.js.map +1 -1
- package/dist/cache/caching-layer.d.ts.map +1 -1
- package/dist/cache/caching-layer.js +5 -10
- package/dist/cache/caching-layer.js.map +1 -1
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/dist/context/grep.d.ts +14 -0
- package/dist/context/grep.d.ts.map +1 -1
- package/dist/context/grep.js +49 -0
- package/dist/context/grep.js.map +1 -1
- package/dist/context/unit-surgery.d.ts +4 -2
- package/dist/context/unit-surgery.d.ts.map +1 -1
- package/dist/context/unit-surgery.js +54 -6
- package/dist/context/unit-surgery.js.map +1 -1
- package/dist/handlers/activate.d.ts.map +1 -1
- package/dist/handlers/activate.js +11 -20
- package/dist/handlers/activate.js.map +1 -1
- package/dist/handlers/diagnose.d.ts.map +1 -1
- package/dist/handlers/diagnose.js +11 -30
- package/dist/handlers/diagnose.js.map +1 -1
- package/dist/handlers/dispatch.d.ts.map +1 -1
- package/dist/handlers/dispatch.js +63 -8
- package/dist/handlers/dispatch.js.map +1 -1
- package/dist/handlers/editable-source.d.ts +6 -0
- package/dist/handlers/editable-source.d.ts.map +1 -0
- package/dist/handlers/editable-source.js +53 -0
- package/dist/handlers/editable-source.js.map +1 -0
- package/dist/handlers/feature-cache.d.ts +2 -0
- package/dist/handlers/feature-cache.d.ts.map +1 -1
- package/dist/handlers/feature-cache.js +8 -0
- package/dist/handlers/feature-cache.js.map +1 -1
- package/dist/handlers/hyperfocused.js +1 -1
- package/dist/handlers/hyperfocused.js.map +1 -1
- package/dist/handlers/lint.d.ts.map +1 -1
- package/dist/handlers/lint.js +13 -4
- package/dist/handlers/lint.js.map +1 -1
- package/dist/handlers/object-types.d.ts +2 -3
- package/dist/handlers/object-types.d.ts.map +1 -1
- package/dist/handlers/object-types.js +13 -5
- package/dist/handlers/object-types.js.map +1 -1
- package/dist/handlers/publish-failure.d.ts +7 -0
- package/dist/handlers/publish-failure.d.ts.map +1 -0
- package/dist/handlers/publish-failure.js +42 -0
- package/dist/handlers/publish-failure.js.map +1 -0
- package/dist/handlers/read.d.ts.map +1 -1
- package/dist/handlers/read.js +39 -9
- package/dist/handlers/read.js.map +1 -1
- package/dist/handlers/schemas.d.ts +45 -0
- package/dist/handlers/schemas.d.ts.map +1 -1
- package/dist/handlers/schemas.js +50 -7
- package/dist/handlers/schemas.js.map +1 -1
- package/dist/handlers/syntax.d.ts +5 -0
- package/dist/handlers/syntax.d.ts.map +1 -0
- package/dist/handlers/syntax.js +35 -0
- package/dist/handlers/syntax.js.map +1 -0
- package/dist/handlers/tool-descriptions.d.ts.map +1 -1
- package/dist/handlers/tool-descriptions.js +7 -5
- package/dist/handlers/tool-descriptions.js.map +1 -1
- package/dist/handlers/tool-registry.d.ts +4 -4
- package/dist/handlers/tool-registry.d.ts.map +1 -1
- package/dist/handlers/tool-registry.js +4 -0
- package/dist/handlers/tool-registry.js.map +1 -1
- package/dist/handlers/tools.d.ts +1 -16
- package/dist/handlers/tools.d.ts.map +1 -1
- package/dist/handlers/tools.js +44 -55
- package/dist/handlers/tools.js.map +1 -1
- package/dist/handlers/transport.d.ts.map +1 -1
- package/dist/handlers/transport.js +17 -3
- package/dist/handlers/transport.js.map +1 -1
- package/dist/handlers/write/class-edit.d.ts +16 -0
- package/dist/handlers/write/class-edit.d.ts.map +1 -0
- package/dist/handlers/write/class-edit.js +55 -0
- package/dist/handlers/write/class-edit.js.map +1 -0
- package/dist/handlers/write/class-surgery.d.ts +2 -2
- package/dist/handlers/write/class-surgery.d.ts.map +1 -1
- package/dist/handlers/write/class-surgery.js +189 -220
- package/dist/handlers/write/class-surgery.js.map +1 -1
- package/dist/handlers/write/context.d.ts +1 -8
- package/dist/handlers/write/context.d.ts.map +1 -1
- package/dist/handlers/write/create.d.ts.map +1 -1
- package/dist/handlers/write/create.js +11 -4
- package/dist/handlers/write/create.js.map +1 -1
- package/dist/handlers/write/metadata-update.d.ts +4 -0
- package/dist/handlers/write/metadata-update.d.ts.map +1 -0
- package/dist/handlers/write/metadata-update.js +58 -0
- package/dist/handlers/write/metadata-update.js.map +1 -0
- package/dist/handlers/write/rap.d.ts.map +1 -1
- package/dist/handlers/write/rap.js +132 -155
- package/dist/handlers/write/rap.js.map +1 -1
- package/dist/handlers/write/unit-surgery.d.ts +2 -2
- package/dist/handlers/write/unit-surgery.d.ts.map +1 -1
- package/dist/handlers/write/unit-surgery.js +58 -34
- package/dist/handlers/write/unit-surgery.js.map +1 -1
- package/dist/handlers/write/update-delete.d.ts.map +1 -1
- package/dist/handlers/write/update-delete.js +34 -82
- package/dist/handlers/write/update-delete.js.map +1 -1
- package/dist/handlers/write-helpers.d.ts +4 -3
- package/dist/handlers/write-helpers.d.ts.map +1 -1
- package/dist/handlers/write-helpers.js +135 -21
- package/dist/handlers/write-helpers.js.map +1 -1
- package/dist/handlers/write.d.ts.map +1 -1
- package/dist/handlers/write.js +13 -31
- package/dist/handlers/write.js.map +1 -1
- package/dist/lint/config-builder.d.ts +10 -1
- package/dist/lint/config-builder.d.ts.map +1 -1
- package/dist/lint/config-builder.js +4 -0
- package/dist/lint/config-builder.js.map +1 -1
- package/dist/lint/lint.d.ts +3 -1
- package/dist/lint/lint.d.ts.map +1 -1
- package/dist/lint/lint.js +2 -1
- package/dist/lint/lint.js.map +1 -1
- package/dist/public/read-only-client.d.ts +6 -0
- package/dist/public/read-only-client.d.ts.map +1 -0
- package/dist/public/read-only-client.js +66 -0
- package/dist/public/read-only-client.js.map +1 -0
- package/dist/public/testing.d.ts +4 -0
- package/dist/public/testing.d.ts.map +1 -1
- package/dist/public/testing.js +6 -0
- package/dist/public/testing.js.map +1 -1
- package/dist/public/types.d.ts +14 -15
- package/dist/public/types.d.ts.map +1 -1
- package/dist/server/audit.d.ts +6 -1
- package/dist/server/audit.d.ts.map +1 -1
- package/dist/server/audit.js.map +1 -1
- package/dist/server/config.d.ts.map +1 -1
- package/dist/server/config.js +9 -2
- package/dist/server/config.js.map +1 -1
- package/dist/server/deny-actions.d.ts +2 -1
- package/dist/server/deny-actions.d.ts.map +1 -1
- package/dist/server/deny-actions.js +13 -2
- package/dist/server/deny-actions.js.map +1 -1
- package/dist/server/http.d.ts.map +1 -1
- package/dist/server/http.js +7 -5
- package/dist/server/http.js.map +1 -1
- package/dist/server/logger.d.ts +3 -3
- package/dist/server/logger.d.ts.map +1 -1
- package/dist/server/logger.js +7 -7
- package/dist/server/logger.js.map +1 -1
- package/dist/server/multi-target-basic-auth.d.ts.map +1 -1
- package/dist/server/multi-target-basic-auth.js +1 -0
- package/dist/server/multi-target-basic-auth.js.map +1 -1
- 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/oauth-redirect-policy.d.ts +13 -0
- package/dist/server/oauth-redirect-policy.d.ts.map +1 -0
- package/dist/server/oauth-redirect-policy.js +21 -0
- package/dist/server/oauth-redirect-policy.js.map +1 -0
- package/dist/server/plugin-loader.d.ts.map +1 -1
- package/dist/server/plugin-loader.js +1 -3
- package/dist/server/plugin-loader.js.map +1 -1
- package/dist/server/safe-http-client.d.ts +8 -14
- package/dist/server/safe-http-client.d.ts.map +1 -1
- package/dist/server/safe-http-client.js +51 -73
- package/dist/server/safe-http-client.js.map +1 -1
- package/dist/server/server.d.ts +5 -4
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +36 -27
- package/dist/server/server.js.map +1 -1
- package/dist/server/types.d.ts +6 -4
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -1
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +15 -15
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { AdtApiError, AdtNetworkError } from './errors.js';
|
|
2
|
+
/** A failed create response does not prove SAP rejected the mutation. */
|
|
3
|
+
export async function postCreate(http, path, body, contentType, headers) {
|
|
4
|
+
try {
|
|
5
|
+
return await http.post(path, body, contentType, headers, { retryTransientErrors: false });
|
|
6
|
+
}
|
|
7
|
+
catch (error) {
|
|
8
|
+
if (error instanceof AdtNetworkError ||
|
|
9
|
+
(error instanceof AdtApiError && (error.statusCode === 429 || error.isServerError))) {
|
|
10
|
+
// Keep the original type, HTTP status and diagnostics for callers and audit.
|
|
11
|
+
error.creationOutcome = 'unknown';
|
|
12
|
+
}
|
|
13
|
+
throw error;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=create-request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-request.js","sourceRoot":"","sources":["../../src/adt/create-request.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAG3D,yEAAyE;AACzE,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAmB,EACnB,IAAY,EACZ,IAAY,EACZ,WAAoB,EACpB,OAAgC;IAEhC,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IACE,KAAK,YAAY,eAAe;YAChC,CAAC,KAAK,YAAY,WAAW,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC,EACnF,CAAC;YACD,6EAA6E;YAC7E,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC;QACpC,CAAC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/adt/crud.d.ts
CHANGED
|
@@ -32,9 +32,9 @@ export declare function updateObject(http: AdtHttpClient, safety: SafetyConfig,
|
|
|
32
32
|
export declare function deleteObject(http: AdtHttpClient, safety: SafetyConfig, objectUrl: string, lockHandle: string, transport?: string): Promise<void>;
|
|
33
33
|
/**
|
|
34
34
|
* High-level: update source with guaranteed unlock.
|
|
35
|
-
* lock → updateSource → unlock (in try-finally)
|
|
35
|
+
* lock → optional fresh read/transform and hash check → updateSource → unlock (in try-finally)
|
|
36
36
|
*/
|
|
37
|
-
export declare function safeUpdateSource(http: AdtHttpClient, safety: SafetyConfig, objectUrl: string, sourceUrl: string, source: string, transport?: string, abapRelease?: string): Promise<void>;
|
|
37
|
+
export declare function safeUpdateSource(http: AdtHttpClient, safety: SafetyConfig, objectUrl: string, sourceUrl: string, source: string | ((current: string, session: AdtHttpClient) => Promise<string>), transport?: string, abapRelease?: string, expectedSourceHash?: string): Promise<void>;
|
|
38
38
|
/**
|
|
39
39
|
* Initialise (create) an empty class-local include (CCDEF/CCIMP/CCMAC/CCAU).
|
|
40
40
|
*
|
|
@@ -75,7 +75,7 @@ export declare function initClassInclude(http: AdtHttpClient, safety: SafetyConf
|
|
|
75
75
|
* Returns `{ initialized }` so the handler can tell the caller whether the
|
|
76
76
|
* include was created as part of this write.
|
|
77
77
|
*/
|
|
78
|
-
export declare function safeUpdateClassInclude(http: AdtHttpClient, safety: SafetyConfig, classObjectUrl: string, includeUrl: string, source: string, transport?: string, abapRelease?: string): Promise<{
|
|
78
|
+
export declare function safeUpdateClassInclude(http: AdtHttpClient, safety: SafetyConfig, classObjectUrl: string, includeUrl: string, source: string, transport?: string, abapRelease?: string, expectedSourceHash?: string): Promise<{
|
|
79
79
|
initialized: boolean;
|
|
80
80
|
}>;
|
|
81
81
|
/**
|
package/dist/adt/crud.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../src/adt/crud.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../../src/adt/crud.ts"],"names":[],"mappings":"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"}
|
package/dist/adt/crud.js
CHANGED
|
@@ -9,8 +9,10 @@
|
|
|
9
9
|
* This was a hard-won lesson in the fr0ster codebase — earlier versions
|
|
10
10
|
* leaked locks on error, blocking the object for other developers.
|
|
11
11
|
*/
|
|
12
|
+
import { postCreate } from './create-request.js';
|
|
12
13
|
import { AdtApiError, extractExceptionType, isNotFoundError } from './errors.js';
|
|
13
14
|
import { checkOperation, OperationType } from './safety.js';
|
|
15
|
+
import { assertSourceHash } from './source-precondition.js';
|
|
14
16
|
/** Lock an ABAP object for editing */
|
|
15
17
|
export async function lockObject(http, safety, objectUrl, accessMode = 'MODIFY', abapRelease, systemType) {
|
|
16
18
|
if (accessMode === 'MODIFY') {
|
|
@@ -72,10 +74,13 @@ export async function createObject(http, safety, objectUrl, body, contentType =
|
|
|
72
74
|
}
|
|
73
75
|
const url = params.length > 0 ? `${objectUrl}?${params.join('&')}` : objectUrl;
|
|
74
76
|
try {
|
|
75
|
-
const resp = await http
|
|
77
|
+
const resp = await postCreate(http, url, body, contentType);
|
|
76
78
|
return resp.body;
|
|
77
79
|
}
|
|
78
80
|
catch (err) {
|
|
81
|
+
// Preserve uncertain 429/5xx outcomes instead of reclassifying them as definitive 4xx rejections.
|
|
82
|
+
if (err instanceof AdtApiError && err.creationOutcome === 'unknown')
|
|
83
|
+
throw err;
|
|
79
84
|
// Reclassify lock/exists conflicts that arrive as HTML or via structured
|
|
80
85
|
// exception type — same precedence as the lockObject path.
|
|
81
86
|
const conv = convertHtmlConflictToProperError(err, objectUrl, {
|
|
@@ -88,7 +93,7 @@ export async function createObject(http, safety, objectUrl, body, contentType =
|
|
|
88
93
|
throw conv;
|
|
89
94
|
const fallback = CONTENT_TYPE_FALLBACKS[contentType];
|
|
90
95
|
if (fallback && isUnsupportedMediaTypeError(err)) {
|
|
91
|
-
const resp = await http
|
|
96
|
+
const resp = await postCreate(http, url, body, fallback);
|
|
92
97
|
return resp.body;
|
|
93
98
|
}
|
|
94
99
|
throw err;
|
|
@@ -146,14 +151,25 @@ export async function deleteObject(http, safety, objectUrl, lockHandle, transpor
|
|
|
146
151
|
}
|
|
147
152
|
/**
|
|
148
153
|
* High-level: update source with guaranteed unlock.
|
|
149
|
-
* lock → updateSource → unlock (in try-finally)
|
|
154
|
+
* lock → optional fresh read/transform and hash check → updateSource → unlock (in try-finally)
|
|
150
155
|
*/
|
|
151
|
-
export async function safeUpdateSource(http, safety, objectUrl, sourceUrl, source, transport, abapRelease) {
|
|
156
|
+
export async function safeUpdateSource(http, safety, objectUrl, sourceUrl, source, transport, abapRelease, expectedSourceHash) {
|
|
157
|
+
checkOperation(safety, OperationType.Update, 'UpdateSource');
|
|
152
158
|
await http.withStatefulSession(async (session) => {
|
|
153
159
|
const lock = await lockObject(session, safety, objectUrl, 'MODIFY', abapRelease);
|
|
154
160
|
const effectiveTransport = transport ?? (lock.corrNr || undefined);
|
|
155
161
|
try {
|
|
156
|
-
|
|
162
|
+
let replacement;
|
|
163
|
+
if (expectedSourceHash !== undefined || typeof source === 'function') {
|
|
164
|
+
checkOperation(safety, OperationType.Read, 'GetSource');
|
|
165
|
+
const current = await session.get(sourceUrl, { 'Cache-Control': 'no-cache' });
|
|
166
|
+
assertSourceHash(current.body, expectedSourceHash, sourceUrl);
|
|
167
|
+
replacement = typeof source === 'function' ? await source(current.body, session) : source;
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
replacement = source;
|
|
171
|
+
}
|
|
172
|
+
await updateSource(session, safety, sourceUrl, replacement, lock.lockHandle, effectiveTransport);
|
|
157
173
|
}
|
|
158
174
|
finally {
|
|
159
175
|
await unlockObject(session, objectUrl, lock.lockHandle);
|
|
@@ -190,7 +206,7 @@ export async function initClassInclude(http, safety, includeUrl, lockHandle, tra
|
|
|
190
206
|
if (transport) {
|
|
191
207
|
url += `&corrNr=${encodeURIComponent(transport)}`;
|
|
192
208
|
}
|
|
193
|
-
await http
|
|
209
|
+
await postCreate(http, url, '');
|
|
194
210
|
}
|
|
195
211
|
/**
|
|
196
212
|
* High-level: update a class-local include, auto-initialising it first if it
|
|
@@ -209,7 +225,8 @@ export async function initClassInclude(http, safety, includeUrl, lockHandle, tra
|
|
|
209
225
|
* Returns `{ initialized }` so the handler can tell the caller whether the
|
|
210
226
|
* include was created as part of this write.
|
|
211
227
|
*/
|
|
212
|
-
export async function safeUpdateClassInclude(http, safety, classObjectUrl, includeUrl, source, transport, abapRelease) {
|
|
228
|
+
export async function safeUpdateClassInclude(http, safety, classObjectUrl, includeUrl, source, transport, abapRelease, expectedSourceHash) {
|
|
229
|
+
checkOperation(safety, OperationType.Update, 'UpdateSource');
|
|
213
230
|
return await http.withStatefulSession(async (session) => {
|
|
214
231
|
const lock = await lockObject(session, safety, classObjectUrl, 'MODIFY', abapRelease);
|
|
215
232
|
const effectiveTransport = transport ?? (lock.corrNr || undefined);
|
|
@@ -218,10 +235,12 @@ export async function safeUpdateClassInclude(http, safety, classObjectUrl, inclu
|
|
|
218
235
|
// Probe whether the include exists. 404 → not initialised yet.
|
|
219
236
|
let exists = true;
|
|
220
237
|
try {
|
|
221
|
-
|
|
238
|
+
checkOperation(safety, OperationType.Read, 'GetClassInclude');
|
|
239
|
+
const current = await session.get(includeUrl, { 'Cache-Control': 'no-cache' }, { suppressNotFoundLog: true });
|
|
240
|
+
assertSourceHash(current.body, expectedSourceHash, includeUrl);
|
|
222
241
|
}
|
|
223
242
|
catch (err) {
|
|
224
|
-
if (isNotFoundError(err)) {
|
|
243
|
+
if (isNotFoundError(err) && expectedSourceHash === undefined) {
|
|
225
244
|
exists = false;
|
|
226
245
|
}
|
|
227
246
|
else {
|
package/dist/adt/crud.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud.js","sourceRoot":"","sources":["../../src/adt/crud.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"crud.js","sourceRoot":"","sources":["../../src/adt/crud.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ export declare class DataSourcePolicyError extends AdtSafetyError {
|
|
|
22
22
|
readonly decisionId: string;
|
|
23
23
|
readonly matchedSource?: string;
|
|
24
24
|
readonly reason: string;
|
|
25
|
-
/** Always false:
|
|
25
|
+
/** Always false: the requested data query has not run; metadata reads may have run. */
|
|
26
26
|
readonly executed = false;
|
|
27
27
|
constructor(code: DataSourcePolicyErrorCode, directSource: string, sourcePath: string[], reason: string, options?: {
|
|
28
28
|
decisionId?: string;
|
|
@@ -73,9 +73,7 @@ export type ResolvedDirectDataSource = {
|
|
|
73
73
|
};
|
|
74
74
|
export interface DataSourcePolicyResolver {
|
|
75
75
|
resolveDirectSource(name: string): Promise<ResolvedDirectDataSource>;
|
|
76
|
-
|
|
77
|
-
canonicalTableSourceAvailable?: boolean;
|
|
78
|
-
readTableSource(name: string): Promise<string>;
|
|
76
|
+
readTableReplacement(name: string): Promise<TableReplacement | PhysicalTableContainer | undefined>;
|
|
79
77
|
readCdsDependencyGraph(ddlSource: string): Promise<CdsDependencyNode>;
|
|
80
78
|
}
|
|
81
79
|
export interface DataSourcePolicyBackend {
|
|
@@ -84,8 +82,7 @@ export interface DataSourcePolicyBackend {
|
|
|
84
82
|
objectType: string;
|
|
85
83
|
uri: string;
|
|
86
84
|
}>>;
|
|
87
|
-
|
|
88
|
-
readTableSource(name: string): Promise<string>;
|
|
85
|
+
readTableReplacement(name: string): Promise<TableReplacement | PhysicalTableContainer | undefined>;
|
|
89
86
|
dependencyGraphAccept(): string | undefined;
|
|
90
87
|
readDependencyGraph(path: string, accept: string): Promise<string>;
|
|
91
88
|
}
|
|
@@ -132,8 +129,23 @@ export declare const CDS_DEPENDENCY_GRAPH_PATH = "/sap/bc/adt/ddic/ddl/dependenc
|
|
|
132
129
|
* not the protection.
|
|
133
130
|
*/
|
|
134
131
|
export declare function parseCdsDependencyGraph(xml: string): CdsDependencyNode;
|
|
135
|
-
/**
|
|
136
|
-
export
|
|
132
|
+
/** The SQL view identifies the graph root; the DDLS source selects its graph resource. */
|
|
133
|
+
export interface TableReplacement {
|
|
134
|
+
name: string;
|
|
135
|
+
ddlSource: string;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* A pooled or cluster table has no replacement object (SAP forbids one) but stores its rows in a
|
|
139
|
+
* physical table pool/cluster, which is checked as its lineage node.
|
|
140
|
+
*/
|
|
141
|
+
export interface PhysicalTableContainer {
|
|
142
|
+
container: string;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* A bounded catalog result must prove one active transparent table with at most one replacement, or one
|
|
146
|
+
* active pooled/cluster table without replacement metadata and with its physical container.
|
|
147
|
+
*/
|
|
148
|
+
export declare function parseTableReplacement(table: string, rows: Record<string, string>[]): TableReplacement | PhysicalTableContainer | undefined;
|
|
137
149
|
/** Evaluate direct sources and their active lineage before a data-preview request is sent. */
|
|
138
150
|
export declare function enforceBlockedDataSources(directSources: string[], configuredBlockedSources: string[], resolver: DataSourcePolicyResolver): Promise<void>;
|
|
139
151
|
//# sourceMappingURL=data-source-policy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-source-policy.d.ts","sourceRoot":"","sources":["../../src/adt/data-source-policy.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAMrF,OAAO,EAAgC,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"data-source-policy.d.ts","sourceRoot":"","sources":["../../src/adt/data-source-policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import { XMLParser } from 'fast-xml-parser';
|
|
|
4
4
|
import { logger } from '../server/logger.js';
|
|
5
5
|
import { canonicalDataSourceName, DataSourceNameError, dataSourcePolicyFingerprint } from './data-source-name.js';
|
|
6
6
|
import { AdtApiError, AdtNetworkError, AdtSafetyError } from './errors.js';
|
|
7
|
+
import { INTERNAL_DATA_OPERATIONS } from './internal-data-operations.js';
|
|
7
8
|
import { analyzeSqlDataSources } from './sql-source-analyzer.js';
|
|
8
9
|
const MAX_GRAPH_XML_CHARS = 5_000_000;
|
|
9
10
|
const MAX_GRAPH_DEPTH = 64;
|
|
@@ -11,8 +12,6 @@ const MAX_GRAPH_NODES = 1_000;
|
|
|
11
12
|
const MAX_DIRECT_SOURCES = 64;
|
|
12
13
|
const MAX_REPLACEMENT_SOURCES = 256;
|
|
13
14
|
const MAX_RESOLUTION_ROOTS = 64;
|
|
14
|
-
const TABLE_SOURCE_UNAVAILABLE_REASON = 'the connected SAP system does not advertise the transparent-table source metadata required to prove replacement-object lineage; the standard ADT resource is available from SAP_BASIS 7.52 onward';
|
|
15
|
-
const TABLE_SOURCE_UNKNOWN_404_REASON = 'ADT discovery was unavailable and the canonical transparent-table source request returned HTTP 404, so replacement-object lineage support could not be established; the standard ADT resource is available from SAP_BASIS 7.52 onward';
|
|
16
15
|
const graphParser = new XMLParser({
|
|
17
16
|
ignoreAttributes: false,
|
|
18
17
|
attributeNamePrefix: '@_',
|
|
@@ -39,13 +38,13 @@ export class DataSourcePolicyError extends AdtSafetyError {
|
|
|
39
38
|
decisionId;
|
|
40
39
|
matchedSource;
|
|
41
40
|
reason;
|
|
42
|
-
/** Always false:
|
|
41
|
+
/** Always false: the requested data query has not run; metadata reads may have run. */
|
|
43
42
|
executed = false;
|
|
44
43
|
constructor(code, directSource, sourcePath, reason, options = {}) {
|
|
45
44
|
const path = sourcePath.length > 0 ? sourcePath.join(' -> ') : directSource;
|
|
46
45
|
const decisionId = options.decisionId ?? newDecisionId();
|
|
47
46
|
const operatorAction = code === 'DATA_POLICY_UNAVAILABLE'
|
|
48
|
-
? 'Keep data access disabled until this target can supply the
|
|
47
|
+
? 'Keep data access disabled until this target can supply the required catalog metadata. Clearing SAP_BLOCKED_DATA_SOURCES leaves every otherwise authorized source eligible and requires security approval.'
|
|
49
48
|
: 'Use a permitted static source, or change SAP_BLOCKED_DATA_SOURCES only after security review.';
|
|
50
49
|
super(`${code}: request denied before data execution (executed=false, decisionId=${decisionId}). ` +
|
|
51
50
|
`Source path: ${path}. Reason: ${reason}. ` +
|
|
@@ -74,8 +73,8 @@ export class DataSourcePolicyError extends AdtSafetyError {
|
|
|
74
73
|
clientMessage(minimalErrors) {
|
|
75
74
|
if (!minimalErrors)
|
|
76
75
|
return this.message;
|
|
77
|
-
return (`${this.code}: the request was denied by the administrator's data-source policy before
|
|
78
|
-
`data
|
|
76
|
+
return (`${this.code}: the request was denied by the administrator's data-source policy before the requested SAP ` +
|
|
77
|
+
`data query was executed (executed=false, decisionId=${this.decisionId}). ` +
|
|
79
78
|
`${this.safeAlternative()} Details are recorded in the server audit log; ask an operator to ` +
|
|
80
79
|
'correlate the decision id.');
|
|
81
80
|
}
|
|
@@ -85,7 +84,7 @@ export class DataSourcePolicyError extends AdtSafetyError {
|
|
|
85
84
|
case 'DATA_SQL_UNSUPPORTED':
|
|
86
85
|
return 'Rewrite the request as one complete static SELECT/WITH without comments, host expressions or dynamic sources, or use the structured SAPRead(type="TABLE_QUERY") parameters.';
|
|
87
86
|
case 'DATA_POLICY_UNAVAILABLE':
|
|
88
|
-
return 'This SAP target did not supply the metadata the policy needs
|
|
87
|
+
return 'This SAP target did not supply the metadata the policy needs. Retrying unchanged will be denied; ask an operator.';
|
|
89
88
|
case 'DATA_LINEAGE_UNRESOLVED':
|
|
90
89
|
return 'Query a source whose lineage ARC-1 can resolve, or use the structured SAPRead(type="TABLE_QUERY") parameters.';
|
|
91
90
|
default:
|
|
@@ -249,10 +248,9 @@ export class DataSourceBlocklistGuard {
|
|
|
249
248
|
async evaluate(directSources) {
|
|
250
249
|
await enforceBlockedDataSources(directSources, this.blockedSources, {
|
|
251
250
|
resolveDirectSource: (name) => this.resolveDirectSource(name),
|
|
252
|
-
|
|
253
|
-
readTableSource: (name) => {
|
|
251
|
+
readTableReplacement: (name) => {
|
|
254
252
|
this.metadataRequests += 1;
|
|
255
|
-
return this.backend.
|
|
253
|
+
return this.backend.readTableReplacement(name);
|
|
256
254
|
},
|
|
257
255
|
readCdsDependencyGraph: (ddlSource) => this.readCdsDependencyGraph(ddlSource),
|
|
258
256
|
});
|
|
@@ -502,98 +500,39 @@ export function parseCdsDependencyGraph(xml) {
|
|
|
502
500
|
}
|
|
503
501
|
}
|
|
504
502
|
/**
|
|
505
|
-
*
|
|
506
|
-
*
|
|
503
|
+
* A bounded catalog result must prove one active transparent table with at most one replacement, or one
|
|
504
|
+
* active pooled/cluster table without replacement metadata and with its physical container.
|
|
507
505
|
*/
|
|
508
|
-
function
|
|
509
|
-
const
|
|
510
|
-
const
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
506
|
+
export function parseTableReplacement(table, rows) {
|
|
507
|
+
const row = rows[0];
|
|
508
|
+
const fields = ['TABNAME', 'TABCLASS', 'VIEWREF', 'VIEWREF_ERR', 'SQLTAB', 'DDLNAME'];
|
|
509
|
+
if (rows.length !== 1 || !row || fields.some((field) => typeof row[field] !== 'string')) {
|
|
510
|
+
throw new DataSourceLineageError('replacement catalog returned missing or ambiguous metadata');
|
|
511
|
+
}
|
|
512
|
+
const tableClass = row.TABCLASS.trim();
|
|
513
|
+
if (row.TABNAME.trim() !== table || !['TRANSP', 'POOL', 'CLUSTER'].includes(tableClass) || row.VIEWREF_ERR.trim()) {
|
|
514
|
+
throw new DataSourceLineageError('replacement catalog did not confirm a valid active transparent, pooled or cluster table');
|
|
515
|
+
}
|
|
516
|
+
const name = row.VIEWREF.trim();
|
|
517
|
+
const ddlSource = row.DDLNAME.trim();
|
|
518
|
+
if (tableClass !== 'TRANSP') {
|
|
519
|
+
if (name || ddlSource) {
|
|
520
|
+
throw new DataSourceLineageError('replacement catalog reported replacement metadata for a pooled or cluster table');
|
|
523
521
|
}
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
mask(cursor++);
|
|
527
|
-
let closed = false;
|
|
528
|
-
while (cursor < source.length) {
|
|
529
|
-
if (source[cursor] === '*' && source[cursor + 1] === '/') {
|
|
530
|
-
mask(cursor++);
|
|
531
|
-
mask(cursor++);
|
|
532
|
-
closed = true;
|
|
533
|
-
break;
|
|
534
|
-
}
|
|
535
|
-
mask(cursor++);
|
|
536
|
-
}
|
|
537
|
-
if (!closed)
|
|
538
|
-
throw new DataSourceLineageError('table DDL contains an unterminated block comment');
|
|
539
|
-
continue;
|
|
522
|
+
try {
|
|
523
|
+
return { container: canonicalDataSourceName(row.SQLTAB) };
|
|
540
524
|
}
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
let value = '';
|
|
544
|
-
let closed = false;
|
|
545
|
-
mask(cursor++);
|
|
546
|
-
while (cursor < source.length) {
|
|
547
|
-
const char = source[cursor];
|
|
548
|
-
if (char === '\\' && cursor + 1 < source.length) {
|
|
549
|
-
value += source[cursor + 1];
|
|
550
|
-
mask(cursor++);
|
|
551
|
-
mask(cursor++);
|
|
552
|
-
continue;
|
|
553
|
-
}
|
|
554
|
-
if (char === "'") {
|
|
555
|
-
mask(cursor++);
|
|
556
|
-
if (source[cursor] === "'") {
|
|
557
|
-
value += "'";
|
|
558
|
-
mask(cursor++);
|
|
559
|
-
continue;
|
|
560
|
-
}
|
|
561
|
-
closed = true;
|
|
562
|
-
break;
|
|
563
|
-
}
|
|
564
|
-
value += char;
|
|
565
|
-
mask(cursor++);
|
|
566
|
-
}
|
|
567
|
-
if (!closed)
|
|
568
|
-
throw new DataSourceLineageError('table DDL contains an unterminated string literal');
|
|
569
|
-
strings.push({ start, value });
|
|
570
|
-
continue;
|
|
525
|
+
catch {
|
|
526
|
+
throw new DataSourceLineageError('replacement catalog did not supply the physical table pool or cluster');
|
|
571
527
|
}
|
|
572
|
-
cursor += 1;
|
|
573
528
|
}
|
|
574
|
-
|
|
575
|
-
}
|
|
576
|
-
/** Return a table's active CDS replacement object; malformed or duplicate annotations fail closed. */
|
|
577
|
-
export function extractReplacementObject(source) {
|
|
578
|
-
const { structural, strings } = scanDdlStructure(source);
|
|
579
|
-
const markers = [...structural.matchAll(/@\s*AbapCatalog\s*\.\s*replacementObject\b/gi)];
|
|
580
|
-
if (markers.length === 0)
|
|
529
|
+
if (!name && !ddlSource)
|
|
581
530
|
return undefined;
|
|
582
|
-
const annotations = [...structural.matchAll(/@\s*AbapCatalog\s*\.\s*replacementObject\s*:/gi)];
|
|
583
|
-
if (markers.length !== 1 || annotations.length !== 1 || markers[0].index !== annotations[0].index) {
|
|
584
|
-
throw new DataSourceLineageError('replacementObject annotation is duplicated or malformed');
|
|
585
|
-
}
|
|
586
|
-
const annotation = annotations[0];
|
|
587
|
-
const valueStart = annotation.index + annotation[0].length;
|
|
588
|
-
const valueSpan = strings.find((span) => span.start >= valueStart);
|
|
589
|
-
if (!valueSpan || structural.slice(valueStart, valueSpan.start).trim().length > 0) {
|
|
590
|
-
throw new DataSourceLineageError('replacementObject annotation is present but malformed');
|
|
591
|
-
}
|
|
592
531
|
try {
|
|
593
|
-
return canonicalDataSourceName(
|
|
532
|
+
return { name: canonicalDataSourceName(name), ddlSource: canonicalDataSourceName(ddlSource) };
|
|
594
533
|
}
|
|
595
534
|
catch {
|
|
596
|
-
throw new DataSourceLineageError('
|
|
535
|
+
throw new DataSourceLineageError('replacement catalog did not supply exact SQL-view and DDLS identities');
|
|
597
536
|
}
|
|
598
537
|
}
|
|
599
538
|
function safeLineageFailureReason(error) {
|
|
@@ -647,40 +586,48 @@ export async function enforceBlockedDataSources(directSources, configuredBlocked
|
|
|
647
586
|
if (replacementCache.size >= MAX_REPLACEMENT_SOURCES) {
|
|
648
587
|
throw new DataSourceLineageError(`replacement inspection exceeds source limit ${MAX_REPLACEMENT_SOURCES}`);
|
|
649
588
|
}
|
|
650
|
-
const replacement =
|
|
589
|
+
const replacement = await resolver.readTableReplacement(table);
|
|
651
590
|
replacementCache.set(table, replacement);
|
|
652
591
|
return replacement;
|
|
653
592
|
};
|
|
654
593
|
const replacementAt = async (directSource, table, path) => {
|
|
655
|
-
if (resolver.canonicalTableSourceAvailable === false) {
|
|
656
|
-
throw new DataSourcePolicyError('DATA_POLICY_UNAVAILABLE', directSource, path, TABLE_SOURCE_UNAVAILABLE_REASON);
|
|
657
|
-
}
|
|
658
594
|
try {
|
|
659
|
-
|
|
595
|
+
for (const source of INTERNAL_DATA_OPERATIONS.replacement_lineage.sources) {
|
|
596
|
+
checkBlocked(directSource, [...path, source], [source]);
|
|
597
|
+
}
|
|
598
|
+
const lineage = await replacementFor(table);
|
|
599
|
+
if (lineage && 'container' in lineage) {
|
|
600
|
+
// Blocking the pool/cluster blocks every logical table stored in it.
|
|
601
|
+
checkBlocked(directSource, [...path, lineage.container], [lineage.container]);
|
|
602
|
+
return undefined;
|
|
603
|
+
}
|
|
604
|
+
return lineage;
|
|
660
605
|
}
|
|
661
606
|
catch (error) {
|
|
662
607
|
if (error instanceof DataSourcePolicyError)
|
|
663
608
|
throw error;
|
|
664
|
-
if (
|
|
665
|
-
|
|
666
|
-
error.statusCode === 404) {
|
|
667
|
-
throw new DataSourcePolicyError('DATA_POLICY_UNAVAILABLE', directSource, path, TABLE_SOURCE_UNKNOWN_404_REASON);
|
|
609
|
+
if (error instanceof AdtApiError && error.statusCode === 404) {
|
|
610
|
+
throw new DataSourcePolicyError('DATA_POLICY_UNAVAILABLE', directSource, path, 'SAP did not provide the data-preview endpoint needed to read replacement catalog metadata');
|
|
668
611
|
}
|
|
669
612
|
throw unresolved(directSource, path, safeLineageFailureReason(error));
|
|
670
613
|
}
|
|
671
614
|
};
|
|
615
|
+
const evaluateReplacement = async (directSource, replacement, path) => {
|
|
616
|
+
await evaluateRoot(directSource, replacement.name, [...path, replacement.name], { kind: 'cds', ...replacement });
|
|
617
|
+
};
|
|
672
618
|
const evaluateResolved = async (directSource, resolved, path) => {
|
|
673
619
|
checkBlocked(directSource, path, [canonicalDataSourceName(resolved.name)]);
|
|
674
620
|
if (resolved.kind === 'table') {
|
|
675
621
|
const table = canonicalDataSourceName(resolved.name);
|
|
676
622
|
const replacement = await replacementAt(directSource, table, path);
|
|
677
623
|
if (replacement)
|
|
678
|
-
await
|
|
624
|
+
await evaluateReplacement(directSource, replacement, path);
|
|
679
625
|
return;
|
|
680
626
|
}
|
|
681
627
|
if (resolved.kind !== 'cds') {
|
|
682
628
|
throw unresolved(directSource, path, `source kind ${resolved.kind} has no proven lineage in the experimental policy`);
|
|
683
629
|
}
|
|
630
|
+
checkBlocked(directSource, path, [canonicalDataSourceName(resolved.ddlSource)]);
|
|
684
631
|
const graph = await resolver.readCdsDependencyGraph(canonicalDataSourceName(resolved.ddlSource));
|
|
685
632
|
const normalizedGraphAliases = graph.aliases.map((alias) => canonicalDataSourceName(alias));
|
|
686
633
|
if (!normalizedGraphAliases.includes(canonicalDataSourceName(resolved.name))) {
|
|
@@ -712,15 +659,14 @@ export async function enforceBlockedDataSources(directSources, configuredBlocked
|
|
|
712
659
|
for (const child of node.children)
|
|
713
660
|
validateGraph(child, [...nodePath, child.name], false);
|
|
714
661
|
};
|
|
715
|
-
// Check the complete graph before
|
|
716
|
-
//
|
|
717
|
-
// be unavailable for an earlier sibling table.
|
|
662
|
+
// Check the complete graph before catalog reads so a blocked sibling wins
|
|
663
|
+
// over unavailable metadata for an earlier table.
|
|
718
664
|
validateGraph(graph, graphPath, true);
|
|
719
665
|
const expandReplacements = async (node, nodePath) => {
|
|
720
666
|
if (node.kind === 'TABLE') {
|
|
721
667
|
const replacement = await replacementAt(directSource, node.name, nodePath);
|
|
722
668
|
if (replacement)
|
|
723
|
-
await
|
|
669
|
+
await evaluateReplacement(directSource, replacement, nodePath);
|
|
724
670
|
return;
|
|
725
671
|
}
|
|
726
672
|
for (const child of node.children)
|
|
@@ -728,7 +674,7 @@ export async function enforceBlockedDataSources(directSources, configuredBlocked
|
|
|
728
674
|
};
|
|
729
675
|
await expandReplacements(graph, graphPath);
|
|
730
676
|
};
|
|
731
|
-
const evaluateRoot = async (directSource, name, path) => {
|
|
677
|
+
const evaluateRoot = async (directSource, name, path, replacement) => {
|
|
732
678
|
checkBlocked(directSource, path, [name]);
|
|
733
679
|
if (activeResolution.size >= MAX_RESOLUTION_ROOTS) {
|
|
734
680
|
throw unresolved(directSource, path, `replacement lineage exceeds depth limit ${MAX_RESOLUTION_ROOTS}`);
|
|
@@ -738,7 +684,7 @@ export async function enforceBlockedDataSources(directSources, configuredBlocked
|
|
|
738
684
|
throw unresolved(directSource, path, `replacement cycle detected at ${name}`);
|
|
739
685
|
activeResolution.add(cycleKey);
|
|
740
686
|
try {
|
|
741
|
-
const resolved = await resolver.resolveDirectSource(name);
|
|
687
|
+
const resolved = replacement ?? (await resolver.resolveDirectSource(name));
|
|
742
688
|
await evaluateResolved(directSource, resolved, path);
|
|
743
689
|
}
|
|
744
690
|
finally {
|