@einlogic/mcp-fabric-api 2.4.1 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +662 -523
- package/build/auth/token-manager.d.ts +22 -1
- package/build/auth/token-manager.d.ts.map +1 -1
- package/build/auth/token-manager.js +119 -9
- package/build/auth/token-manager.js.map +1 -1
- package/build/client/fabric-client.d.ts.map +1 -1
- package/build/client/fabric-client.js +70 -12
- package/build/client/fabric-client.js.map +1 -1
- package/build/client/kusto-client.d.ts.map +1 -1
- package/build/client/kusto-client.js +18 -0
- package/build/client/kusto-client.js.map +1 -1
- package/build/client/powerbi-client.d.ts.map +1 -1
- package/build/client/powerbi-client.js +43 -9
- package/build/client/powerbi-client.js.map +1 -1
- package/build/client/sql-client.d.ts.map +1 -1
- package/build/client/sql-client.js +16 -0
- package/build/client/sql-client.js.map +1 -1
- package/build/core/errors.d.ts +13 -2
- package/build/core/errors.d.ts.map +1 -1
- package/build/core/errors.js +29 -1
- package/build/core/errors.js.map +1 -1
- package/build/core/lro.d.ts.map +1 -1
- package/build/core/lro.js +29 -0
- package/build/core/lro.js.map +1 -1
- package/build/core/pagination.d.ts.map +1 -1
- package/build/core/pagination.js +12 -0
- package/build/core/pagination.js.map +1 -1
- package/build/index.js +18 -2
- package/build/index.js.map +1 -1
- package/build/server.d.ts +2 -1
- package/build/server.d.ts.map +1 -1
- package/build/server.js +9 -2
- package/build/server.js.map +1 -1
- package/build/utils/logger.d.ts +27 -0
- package/build/utils/logger.d.ts.map +1 -0
- package/build/utils/logger.js +59 -0
- package/build/utils/logger.js.map +1 -0
- package/package.json +64 -64
- package/build/utils/file-reader.d.ts +0 -11
- package/build/utils/file-reader.d.ts.map +0 -1
- package/build/utils/file-reader.js +0 -84
- package/build/utils/file-reader.js.map +0 -1
|
@@ -1,14 +1,35 @@
|
|
|
1
1
|
import { type AccessToken } from "@azure/identity";
|
|
2
|
+
export type AuthMethod = "default" | "device-code" | "client-secret" | "interactive-browser";
|
|
3
|
+
export interface AuthConfig {
|
|
4
|
+
method: AuthMethod;
|
|
5
|
+
tenantId?: string;
|
|
6
|
+
clientId?: string;
|
|
7
|
+
clientSecret?: string;
|
|
8
|
+
/** Called with the device code prompt message so callers can surface it to the user (e.g., via MCP notifications). */
|
|
9
|
+
onDeviceCodePrompt?: (message: string) => void;
|
|
10
|
+
}
|
|
2
11
|
export declare class TokenManager {
|
|
3
12
|
private credential;
|
|
4
13
|
private cache;
|
|
5
14
|
private currentTenantId;
|
|
6
|
-
|
|
15
|
+
private authConfig;
|
|
16
|
+
/** Background device-code auth promises keyed by scope URL */
|
|
17
|
+
private pendingDeviceCodeAuth;
|
|
18
|
+
/** Latest device code message for display to user */
|
|
19
|
+
private lastDeviceCodeMessage;
|
|
20
|
+
constructor(config?: AuthConfig);
|
|
21
|
+
private createCredential;
|
|
7
22
|
switchTenant(tenantId?: string): void;
|
|
8
23
|
clearCache(): void;
|
|
9
24
|
getCurrentTenantId(): string | undefined;
|
|
10
25
|
getCachedToken(scope: "fabric" | "powerbi" | "database" | "kusto"): AccessToken | undefined;
|
|
11
26
|
getToken(scope: "fabric" | "powerbi" | "database" | "kusto"): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Device-code specific token acquisition.
|
|
29
|
+
* Starts polling in the background and throws DeviceCodeAuthRequired immediately
|
|
30
|
+
* so the tool can return the auth URL/code to the user instead of blocking.
|
|
31
|
+
*/
|
|
32
|
+
private getTokenWithDeviceCode;
|
|
12
33
|
getFabricToken(): Promise<string>;
|
|
13
34
|
getPowerBIToken(): Promise<string>;
|
|
14
35
|
getDatabaseToken(): Promise<string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../../src/auth/token-manager.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"token-manager.d.ts","sourceRoot":"","sources":["../../src/auth/token-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,WAAW,EACjB,MAAM,iBAAiB,CAAC;AASzB,MAAM,MAAM,UAAU,GAAG,SAAS,GAAG,aAAa,GAAG,eAAe,GAAG,qBAAqB,CAAC;AAE7F,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sHAAsH;IACtH,kBAAkB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,eAAe,CAAqB;IAC5C,OAAO,CAAC,UAAU,CAAa;IAC/B,8DAA8D;IAC9D,OAAO,CAAC,qBAAqB,CAA2C;IACxE,qDAAqD;IACrD,OAAO,CAAC,qBAAqB,CAAuB;gBAExC,MAAM,CAAC,EAAE,UAAU;IAM/B,OAAO,CAAC,gBAAgB;IAgDxB,YAAY,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI;IAQrC,UAAU,IAAI,IAAI;IAIlB,kBAAkB,IAAI,MAAM,GAAG,SAAS;IAIxC,cAAc,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,SAAS;IAKrF,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IA0CnF;;;;OAIG;YACW,sBAAsB;IAgE9B,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAIjC,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC;IAIlC,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC;CAGvC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { DefaultAzureCredential } from "@azure/identity";
|
|
1
|
+
import { DefaultAzureCredential, DeviceCodeCredential, ClientSecretCredential, InteractiveBrowserCredential, } from "@azure/identity";
|
|
2
|
+
import { DeviceCodeAuthRequired } from "../core/errors.js";
|
|
2
3
|
const FABRIC_SCOPE = "https://api.fabric.microsoft.com/.default";
|
|
3
4
|
const POWERBI_SCOPE = "https://analysis.windows.net/powerbi/api/.default";
|
|
4
5
|
const DATABASE_SCOPE = "https://database.windows.net/.default";
|
|
@@ -8,18 +9,61 @@ export class TokenManager {
|
|
|
8
9
|
credential;
|
|
9
10
|
cache = new Map();
|
|
10
11
|
currentTenantId;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
authConfig;
|
|
13
|
+
/** Background device-code auth promises keyed by scope URL */
|
|
14
|
+
pendingDeviceCodeAuth = new Map();
|
|
15
|
+
/** Latest device code message for display to user */
|
|
16
|
+
lastDeviceCodeMessage = null;
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.authConfig = config ?? { method: "default" };
|
|
19
|
+
this.currentTenantId = this.authConfig.tenantId;
|
|
20
|
+
this.credential = this.createCredential(this.currentTenantId);
|
|
21
|
+
}
|
|
22
|
+
createCredential(tenantId) {
|
|
23
|
+
const { method, clientId, clientSecret } = this.authConfig;
|
|
24
|
+
switch (method) {
|
|
25
|
+
case "device-code": {
|
|
26
|
+
if (!clientId || !tenantId) {
|
|
27
|
+
throw new Error("AUTH_METHOD=device-code requires AZURE_CLIENT_ID and AZURE_TENANT_ID");
|
|
28
|
+
}
|
|
29
|
+
const { onDeviceCodePrompt } = this.authConfig;
|
|
30
|
+
return new DeviceCodeCredential({
|
|
31
|
+
tenantId,
|
|
32
|
+
clientId,
|
|
33
|
+
userPromptCallback: (info) => {
|
|
34
|
+
console.error(`\n[Auth] ${info.message}\n`);
|
|
35
|
+
this.lastDeviceCodeMessage = info.message;
|
|
36
|
+
if (onDeviceCodePrompt) {
|
|
37
|
+
onDeviceCodePrompt(info.message);
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
case "client-secret": {
|
|
43
|
+
if (!tenantId || !clientId || !clientSecret) {
|
|
44
|
+
throw new Error("AUTH_METHOD=client-secret requires AZURE_TENANT_ID, AZURE_CLIENT_ID, and AZURE_CLIENT_SECRET");
|
|
45
|
+
}
|
|
46
|
+
return new ClientSecretCredential(tenantId, clientId, clientSecret);
|
|
47
|
+
}
|
|
48
|
+
case "interactive-browser": {
|
|
49
|
+
return new InteractiveBrowserCredential({
|
|
50
|
+
tenantId,
|
|
51
|
+
clientId,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
default: {
|
|
55
|
+
return tenantId
|
|
56
|
+
? new DefaultAzureCredential({ tenantId })
|
|
57
|
+
: new DefaultAzureCredential();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
16
60
|
}
|
|
17
61
|
switchTenant(tenantId) {
|
|
18
62
|
this.currentTenantId = tenantId;
|
|
19
|
-
this.credential = tenantId
|
|
20
|
-
? new DefaultAzureCredential({ tenantId })
|
|
21
|
-
: new DefaultAzureCredential();
|
|
63
|
+
this.credential = this.createCredential(tenantId);
|
|
22
64
|
this.cache.clear();
|
|
65
|
+
this.pendingDeviceCodeAuth.clear();
|
|
66
|
+
this.lastDeviceCodeMessage = null;
|
|
23
67
|
}
|
|
24
68
|
clearCache() {
|
|
25
69
|
this.cache.clear();
|
|
@@ -37,6 +81,10 @@ export class TokenManager {
|
|
|
37
81
|
if (cached && cached.expiresOnTimestamp - Date.now() > REFRESH_BUFFER_MS) {
|
|
38
82
|
return cached.token;
|
|
39
83
|
}
|
|
84
|
+
// For device-code flow, start auth in the background and return the code to the user immediately
|
|
85
|
+
if (this.authConfig.method === "device-code") {
|
|
86
|
+
return this.getTokenWithDeviceCode(scopeUrl);
|
|
87
|
+
}
|
|
40
88
|
try {
|
|
41
89
|
const token = await this.credential.getToken(scopeUrl);
|
|
42
90
|
if (!token) {
|
|
@@ -47,12 +95,74 @@ export class TokenManager {
|
|
|
47
95
|
}
|
|
48
96
|
catch (error) {
|
|
49
97
|
const message = error instanceof Error ? error.message : String(error);
|
|
98
|
+
const method = this.authConfig.method;
|
|
99
|
+
if (method === "client-secret") {
|
|
100
|
+
throw new Error(`Client secret authentication failed. Verify AZURE_TENANT_ID, AZURE_CLIENT_ID, and AZURE_CLIENT_SECRET are correct.\nDetails: ${message}`);
|
|
101
|
+
}
|
|
102
|
+
if (method === "interactive-browser") {
|
|
103
|
+
throw new Error(`Interactive browser authentication failed. Ensure a browser is accessible.\nDetails: ${message}`);
|
|
104
|
+
}
|
|
50
105
|
if (message.includes("az login") || message.includes("DefaultAzureCredential")) {
|
|
51
106
|
throw new Error(`Azure authentication failed. Run 'az login' first to authenticate.\nDetails: ${message}`);
|
|
52
107
|
}
|
|
53
108
|
throw error;
|
|
54
109
|
}
|
|
55
110
|
}
|
|
111
|
+
/**
|
|
112
|
+
* Device-code specific token acquisition.
|
|
113
|
+
* Starts polling in the background and throws DeviceCodeAuthRequired immediately
|
|
114
|
+
* so the tool can return the auth URL/code to the user instead of blocking.
|
|
115
|
+
*/
|
|
116
|
+
async getTokenWithDeviceCode(scopeUrl) {
|
|
117
|
+
// If there's already a pending auth for this scope, check if it completed
|
|
118
|
+
const pending = this.pendingDeviceCodeAuth.get(scopeUrl);
|
|
119
|
+
if (pending) {
|
|
120
|
+
// Race: either the background auth completed, or we time out quickly
|
|
121
|
+
const POLL_TIMEOUT_MS = 3000;
|
|
122
|
+
const result = await Promise.race([
|
|
123
|
+
pending.then((token) => ({ resolved: true, token })),
|
|
124
|
+
new Promise((resolve) => setTimeout(() => resolve({ resolved: false }), POLL_TIMEOUT_MS)),
|
|
125
|
+
]);
|
|
126
|
+
if (result.resolved) {
|
|
127
|
+
this.cache.set(scopeUrl, result.token);
|
|
128
|
+
this.pendingDeviceCodeAuth.delete(scopeUrl);
|
|
129
|
+
this.lastDeviceCodeMessage = null;
|
|
130
|
+
return result.token.token;
|
|
131
|
+
}
|
|
132
|
+
// Still waiting — remind the user
|
|
133
|
+
throw new DeviceCodeAuthRequired(this.lastDeviceCodeMessage ?? "Device code authentication is in progress. Please complete sign-in in your browser.");
|
|
134
|
+
}
|
|
135
|
+
// No pending auth — start a new one in the background
|
|
136
|
+
this.lastDeviceCodeMessage = null;
|
|
137
|
+
const authPromise = this.credential.getToken(scopeUrl).then((token) => {
|
|
138
|
+
if (!token)
|
|
139
|
+
throw new Error(`Failed to acquire token for scope: ${scopeUrl}`);
|
|
140
|
+
return token;
|
|
141
|
+
});
|
|
142
|
+
this.pendingDeviceCodeAuth.set(scopeUrl, authPromise);
|
|
143
|
+
// Handle background completion/failure
|
|
144
|
+
authPromise
|
|
145
|
+
.then((token) => {
|
|
146
|
+
this.cache.set(scopeUrl, token);
|
|
147
|
+
this.pendingDeviceCodeAuth.delete(scopeUrl);
|
|
148
|
+
this.lastDeviceCodeMessage = null;
|
|
149
|
+
console.error(`[Auth] Device code authentication completed for scope: ${scopeUrl}`);
|
|
150
|
+
})
|
|
151
|
+
.catch((err) => {
|
|
152
|
+
this.pendingDeviceCodeAuth.delete(scopeUrl);
|
|
153
|
+
console.error(`[Auth] Device code authentication failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
154
|
+
});
|
|
155
|
+
// Wait briefly for the device code callback to fire so we can capture the message
|
|
156
|
+
const CALLBACK_WAIT_MS = 3000;
|
|
157
|
+
await new Promise((resolve) => setTimeout(resolve, CALLBACK_WAIT_MS));
|
|
158
|
+
// If the auth already completed (e.g., cached token in the credential), return it
|
|
159
|
+
const nowCached = this.cache.get(scopeUrl);
|
|
160
|
+
if (nowCached && nowCached.expiresOnTimestamp - Date.now() > REFRESH_BUFFER_MS) {
|
|
161
|
+
return nowCached.token;
|
|
162
|
+
}
|
|
163
|
+
// Throw the device code info back to the caller so it surfaces in the tool response
|
|
164
|
+
throw new DeviceCodeAuthRequired(this.lastDeviceCodeMessage ?? "Device code authentication started. Please check the MCP server logs for the sign-in URL and code.");
|
|
165
|
+
}
|
|
56
166
|
async getFabricToken() {
|
|
57
167
|
return this.getToken("fabric");
|
|
58
168
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../../src/auth/token-manager.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"token-manager.js","sourceRoot":"","sources":["../../src/auth/token-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fabric-client.d.ts","sourceRoot":"","sources":["../../src/client/fabric-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"fabric-client.d.ts","sourceRoot":"","sources":["../../src/client/fabric-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAOxD,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,cAAc,CAAC,CAAC,GAAG,OAAO;IACzC,IAAI,EAAE,CAAC,CAAC;IACR,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,YAAY;IACX,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;YAEhC,UAAU;IAQxB,OAAO,CAAC,UAAU;YAcJ,cAAc;IAsFtB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAS1D,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAyB3E,KAAK,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAa3E,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;IAY7D,UAAU,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;CAOvE"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { FabricApiError } from "../core/errors.js";
|
|
2
|
+
import { logger, safeHeaders, summarizeDefinitionParts } from "../utils/logger.js";
|
|
2
3
|
const FABRIC_BASE_URL = "https://api.fabric.microsoft.com/v1";
|
|
4
|
+
const COMPONENT = "FabricClient";
|
|
3
5
|
export class FabricClient {
|
|
4
6
|
tokenManager;
|
|
5
7
|
constructor(tokenManager) {
|
|
@@ -26,11 +28,22 @@ export class FabricClient {
|
|
|
26
28
|
retryAfter: retryAfter ? parseInt(retryAfter, 10) : undefined,
|
|
27
29
|
};
|
|
28
30
|
}
|
|
29
|
-
async handleResponse(response) {
|
|
31
|
+
async handleResponse(response, method, url, startTime) {
|
|
32
|
+
const durationMs = Date.now() - startTime;
|
|
33
|
+
const requestId = response.headers.get("x-ms-request-id") ?? undefined;
|
|
34
|
+
logger.debug(COMPONENT, `${method} ${url} completed`, {
|
|
35
|
+
status: response.status,
|
|
36
|
+
durationMs,
|
|
37
|
+
requestId,
|
|
38
|
+
});
|
|
39
|
+
if (logger.isDebug()) {
|
|
40
|
+
logger.debug(COMPONENT, "Response headers", safeHeaders(response.headers));
|
|
41
|
+
}
|
|
30
42
|
if (response.status === 429) {
|
|
31
43
|
const retryAfter = response.headers.get("retry-after");
|
|
32
44
|
const waitMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 30000;
|
|
33
|
-
|
|
45
|
+
logger.warn(COMPONENT, `Rate limited on ${method} ${url}`, { retryAfterSecs: waitMs / 1000, requestId });
|
|
46
|
+
throw new FabricApiError(`Rate limited. Retry after ${waitMs / 1000}s`, 429, "TooManyRequests", undefined, requestId);
|
|
34
47
|
}
|
|
35
48
|
const lro = this.extractLro(response);
|
|
36
49
|
if (response.status === 204 || response.headers.get("content-length") === "0") {
|
|
@@ -47,45 +60,90 @@ export class FabricClient {
|
|
|
47
60
|
if (!response.ok && response.status !== 202) {
|
|
48
61
|
const err = body;
|
|
49
62
|
const errorBody = (err?.error ?? err);
|
|
50
|
-
|
|
63
|
+
const errorMessage = errorBody?.message ?? response.statusText;
|
|
64
|
+
const errorCode = errorBody?.errorCode ?? undefined;
|
|
65
|
+
const relatedResource = errorBody?.relatedResource ?? undefined;
|
|
66
|
+
const errorDetails = errorBody?.details ?? undefined;
|
|
67
|
+
logger.error(COMPONENT, `API error on ${method} ${url}`, {
|
|
68
|
+
status: response.status,
|
|
69
|
+
errorCode,
|
|
70
|
+
errorMessage,
|
|
71
|
+
relatedResource,
|
|
72
|
+
requestId,
|
|
73
|
+
details: errorDetails,
|
|
74
|
+
innerError: errorBody?.innererror,
|
|
75
|
+
durationMs,
|
|
76
|
+
});
|
|
77
|
+
throw new FabricApiError(errorMessage, response.status, errorCode, relatedResource, requestId, errorDetails);
|
|
78
|
+
}
|
|
79
|
+
if (lro) {
|
|
80
|
+
logger.debug(COMPONENT, `LRO initiated from ${method} ${url}`, {
|
|
81
|
+
operationId: lro.operationId,
|
|
82
|
+
location: lro.location,
|
|
83
|
+
requestId,
|
|
84
|
+
});
|
|
51
85
|
}
|
|
52
86
|
return { data: body, lro, status: response.status };
|
|
53
87
|
}
|
|
54
88
|
async get(path) {
|
|
89
|
+
const url = `${FABRIC_BASE_URL}${path}`;
|
|
90
|
+
logger.debug(COMPONENT, `GET ${url}`);
|
|
91
|
+
const startTime = Date.now();
|
|
55
92
|
const headers = await this.getHeaders();
|
|
56
|
-
const response = await fetch(
|
|
57
|
-
return this.handleResponse(response);
|
|
93
|
+
const response = await fetch(url, { headers });
|
|
94
|
+
return this.handleResponse(response, "GET", url, startTime);
|
|
58
95
|
}
|
|
59
96
|
async post(path, body) {
|
|
97
|
+
const url = `${FABRIC_BASE_URL}${path}`;
|
|
98
|
+
const debugMeta = {};
|
|
99
|
+
if (body !== undefined) {
|
|
100
|
+
debugMeta.bodyBytes = JSON.stringify(body).length;
|
|
101
|
+
// Auto-detect definition uploads and log part structure (no payload content)
|
|
102
|
+
const bodyObj = body;
|
|
103
|
+
const def = bodyObj?.definition;
|
|
104
|
+
if (def?.parts && Array.isArray(def.parts)) {
|
|
105
|
+
debugMeta.definitionParts = summarizeDefinitionParts(def.parts);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
logger.debug(COMPONENT, `POST ${url}`, Object.keys(debugMeta).length > 0 ? debugMeta : undefined);
|
|
109
|
+
const startTime = Date.now();
|
|
60
110
|
const headers = await this.getHeaders();
|
|
61
|
-
const response = await fetch(
|
|
111
|
+
const response = await fetch(url, {
|
|
62
112
|
method: "POST",
|
|
63
113
|
headers,
|
|
64
114
|
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
65
115
|
});
|
|
66
|
-
return this.handleResponse(response);
|
|
116
|
+
return this.handleResponse(response, "POST", url, startTime);
|
|
67
117
|
}
|
|
68
118
|
async patch(path, body) {
|
|
119
|
+
const url = `${FABRIC_BASE_URL}${path}`;
|
|
120
|
+
logger.debug(COMPONENT, `PATCH ${url}`, { bodyBytes: JSON.stringify(body).length });
|
|
121
|
+
const startTime = Date.now();
|
|
69
122
|
const headers = await this.getHeaders();
|
|
70
|
-
const response = await fetch(
|
|
123
|
+
const response = await fetch(url, {
|
|
71
124
|
method: "PATCH",
|
|
72
125
|
headers,
|
|
73
126
|
body: JSON.stringify(body),
|
|
74
127
|
});
|
|
75
|
-
return this.handleResponse(response);
|
|
128
|
+
return this.handleResponse(response, "PATCH", url, startTime);
|
|
76
129
|
}
|
|
77
130
|
async delete(path) {
|
|
131
|
+
const url = `${FABRIC_BASE_URL}${path}`;
|
|
132
|
+
logger.debug(COMPONENT, `DELETE ${url}`);
|
|
133
|
+
const startTime = Date.now();
|
|
78
134
|
const headers = await this.getHeaders();
|
|
79
|
-
const response = await fetch(
|
|
135
|
+
const response = await fetch(url, {
|
|
80
136
|
method: "DELETE",
|
|
81
137
|
headers,
|
|
82
138
|
});
|
|
83
|
-
return this.handleResponse(response);
|
|
139
|
+
return this.handleResponse(response, "DELETE", url, startTime);
|
|
84
140
|
}
|
|
85
141
|
async getFullUrl(url) {
|
|
142
|
+
logger.debug(COMPONENT, `GET ${url}`);
|
|
143
|
+
const startTime = Date.now();
|
|
86
144
|
const headers = await this.getHeaders();
|
|
87
145
|
const response = await fetch(url, { headers });
|
|
88
|
-
return this.handleResponse(response);
|
|
146
|
+
return this.handleResponse(response, "GET", url, startTime);
|
|
89
147
|
}
|
|
90
148
|
}
|
|
91
149
|
//# sourceMappingURL=fabric-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fabric-client.js","sourceRoot":"","sources":["../../src/client/fabric-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"fabric-client.js","sourceRoot":"","sources":["../../src/client/fabric-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kusto-client.d.ts","sourceRoot":"","sources":["../../src/client/kusto-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"kusto-client.d.ts","sourceRoot":"","sources":["../../src/client/kusto-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAYvD,qBAAa,WAAW;IACV,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAExC,YAAY,CAChB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,MAAyB,GACjC,OAAO,CAAC,cAAc,CAAC;CAiF3B"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import { logger } from "../utils/logger.js";
|
|
1
2
|
const DEFAULT_MAX_ROWS = 1000;
|
|
3
|
+
const COMPONENT = "KustoClient";
|
|
2
4
|
export class KustoClient {
|
|
3
5
|
tokenManager;
|
|
4
6
|
constructor(tokenManager) {
|
|
@@ -17,6 +19,8 @@ export class KustoClient {
|
|
|
17
19
|
},
|
|
18
20
|
},
|
|
19
21
|
};
|
|
22
|
+
logger.debug(COMPONENT, `POST ${url}`, { database, maxRows });
|
|
23
|
+
const startTime = Date.now();
|
|
20
24
|
const response = await fetch(url, {
|
|
21
25
|
method: "POST",
|
|
22
26
|
headers: {
|
|
@@ -26,6 +30,7 @@ export class KustoClient {
|
|
|
26
30
|
},
|
|
27
31
|
body: JSON.stringify(body),
|
|
28
32
|
});
|
|
33
|
+
const durationMs = Date.now() - startTime;
|
|
29
34
|
if (!response.ok) {
|
|
30
35
|
let errorDetail;
|
|
31
36
|
try {
|
|
@@ -37,6 +42,12 @@ export class KustoClient {
|
|
|
37
42
|
catch {
|
|
38
43
|
errorDetail = await response.text();
|
|
39
44
|
}
|
|
45
|
+
logger.error(COMPONENT, `KQL query failed`, {
|
|
46
|
+
status: response.status,
|
|
47
|
+
database,
|
|
48
|
+
durationMs,
|
|
49
|
+
errorDetail,
|
|
50
|
+
});
|
|
40
51
|
throw new Error(`KQL query failed (HTTP ${response.status}): ${errorDetail}`);
|
|
41
52
|
}
|
|
42
53
|
const frames = (await response.json());
|
|
@@ -54,6 +65,13 @@ export class KustoClient {
|
|
|
54
65
|
}
|
|
55
66
|
return record;
|
|
56
67
|
});
|
|
68
|
+
logger.debug(COMPONENT, `KQL query completed`, {
|
|
69
|
+
status: response.status,
|
|
70
|
+
database,
|
|
71
|
+
durationMs,
|
|
72
|
+
columnCount: columns.length,
|
|
73
|
+
rowCount: rows.length,
|
|
74
|
+
});
|
|
57
75
|
return { columns, rows, rowCount: rows.length };
|
|
58
76
|
}
|
|
59
77
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kusto-client.js","sourceRoot":"","sources":["../../src/client/kusto-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"kusto-client.js","sourceRoot":"","sources":["../../src/client/kusto-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"powerbi-client.d.ts","sourceRoot":"","sources":["../../src/client/powerbi-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"powerbi-client.d.ts","sourceRoot":"","sources":["../../src/client/powerbi-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAOxD,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO;IAC1C,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,aAAa;IACZ,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;YAEhC,UAAU;YAQV,cAAc;IA0EtB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAS3D,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAa5E,MAAM,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;CAWrE"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { FabricApiError } from "../core/errors.js";
|
|
2
|
+
import { logger, safeHeaders } from "../utils/logger.js";
|
|
2
3
|
const POWERBI_BASE_URL = "https://api.powerbi.com/v1.0/myorg";
|
|
4
|
+
const COMPONENT = "PowerBIClient";
|
|
3
5
|
export class PowerBIClient {
|
|
4
6
|
tokenManager;
|
|
5
7
|
constructor(tokenManager) {
|
|
@@ -12,11 +14,22 @@ export class PowerBIClient {
|
|
|
12
14
|
"Content-Type": "application/json",
|
|
13
15
|
};
|
|
14
16
|
}
|
|
15
|
-
async handleResponse(response) {
|
|
17
|
+
async handleResponse(response, method, url, startTime) {
|
|
18
|
+
const durationMs = Date.now() - startTime;
|
|
19
|
+
const requestId = response.headers.get("requestid") ?? response.headers.get("x-ms-request-id") ?? undefined;
|
|
20
|
+
logger.debug(COMPONENT, `${method} ${url} completed`, {
|
|
21
|
+
status: response.status,
|
|
22
|
+
durationMs,
|
|
23
|
+
requestId,
|
|
24
|
+
});
|
|
25
|
+
if (logger.isDebug()) {
|
|
26
|
+
logger.debug(COMPONENT, "Response headers", safeHeaders(response.headers));
|
|
27
|
+
}
|
|
16
28
|
if (response.status === 429) {
|
|
17
29
|
const retryAfter = response.headers.get("retry-after");
|
|
18
30
|
const waitMs = retryAfter ? parseInt(retryAfter, 10) * 1000 : 30000;
|
|
19
|
-
|
|
31
|
+
logger.warn(COMPONENT, `Rate limited on ${method} ${url}`, { retryAfterSecs: waitMs / 1000, requestId });
|
|
32
|
+
throw new FabricApiError(`Rate limited. Retry after ${waitMs / 1000}s`, 429, "TooManyRequests", undefined, requestId);
|
|
20
33
|
}
|
|
21
34
|
if (response.status === 204 || response.headers.get("content-length") === "0") {
|
|
22
35
|
return { data: undefined, status: response.status };
|
|
@@ -32,31 +45,52 @@ export class PowerBIClient {
|
|
|
32
45
|
if (!response.ok) {
|
|
33
46
|
const err = body;
|
|
34
47
|
const errorBody = (err?.error ?? err);
|
|
35
|
-
|
|
48
|
+
const errorMessage = errorBody?.message ?? response.statusText;
|
|
49
|
+
const errorCode = errorBody?.errorCode ?? undefined;
|
|
50
|
+
const errorDetails = errorBody?.details ?? undefined;
|
|
51
|
+
logger.error(COMPONENT, `API error on ${method} ${url}`, {
|
|
52
|
+
status: response.status,
|
|
53
|
+
errorCode,
|
|
54
|
+
errorMessage,
|
|
55
|
+
requestId,
|
|
56
|
+
details: errorDetails,
|
|
57
|
+
innerError: errorBody?.innererror,
|
|
58
|
+
durationMs,
|
|
59
|
+
});
|
|
60
|
+
throw new FabricApiError(errorMessage, response.status, errorCode, undefined, requestId, errorDetails);
|
|
36
61
|
}
|
|
37
62
|
return { data: body, status: response.status };
|
|
38
63
|
}
|
|
39
64
|
async get(path) {
|
|
65
|
+
const url = `${POWERBI_BASE_URL}${path}`;
|
|
66
|
+
logger.debug(COMPONENT, `GET ${url}`);
|
|
67
|
+
const startTime = Date.now();
|
|
40
68
|
const headers = await this.getHeaders();
|
|
41
|
-
const response = await fetch(
|
|
42
|
-
return this.handleResponse(response);
|
|
69
|
+
const response = await fetch(url, { headers });
|
|
70
|
+
return this.handleResponse(response, "GET", url, startTime);
|
|
43
71
|
}
|
|
44
72
|
async post(path, body) {
|
|
73
|
+
const url = `${POWERBI_BASE_URL}${path}`;
|
|
74
|
+
logger.debug(COMPONENT, `POST ${url}`, body !== undefined ? { bodyBytes: JSON.stringify(body).length } : undefined);
|
|
75
|
+
const startTime = Date.now();
|
|
45
76
|
const headers = await this.getHeaders();
|
|
46
|
-
const response = await fetch(
|
|
77
|
+
const response = await fetch(url, {
|
|
47
78
|
method: "POST",
|
|
48
79
|
headers,
|
|
49
80
|
body: body !== undefined ? JSON.stringify(body) : undefined,
|
|
50
81
|
});
|
|
51
|
-
return this.handleResponse(response);
|
|
82
|
+
return this.handleResponse(response, "POST", url, startTime);
|
|
52
83
|
}
|
|
53
84
|
async delete(path) {
|
|
85
|
+
const url = `${POWERBI_BASE_URL}${path}`;
|
|
86
|
+
logger.debug(COMPONENT, `DELETE ${url}`);
|
|
87
|
+
const startTime = Date.now();
|
|
54
88
|
const headers = await this.getHeaders();
|
|
55
|
-
const response = await fetch(
|
|
89
|
+
const response = await fetch(url, {
|
|
56
90
|
method: "DELETE",
|
|
57
91
|
headers,
|
|
58
92
|
});
|
|
59
|
-
return this.handleResponse(response);
|
|
93
|
+
return this.handleResponse(response, "DELETE", url, startTime);
|
|
60
94
|
}
|
|
61
95
|
}
|
|
62
96
|
//# sourceMappingURL=powerbi-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"powerbi-client.js","sourceRoot":"","sources":["../../src/client/powerbi-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"powerbi-client.js","sourceRoot":"","sources":["../../src/client/powerbi-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEzD,MAAM,gBAAgB,GAAG,oCAAoC,CAAC;AAC9D,MAAM,SAAS,GAAG,eAAe,CAAC;AAOlC,MAAM,OAAO,aAAa;IACJ;IAApB,YAAoB,YAA0B;QAA1B,iBAAY,GAAZ,YAAY,CAAc;IAAG,CAAC;IAE1C,KAAK,CAAC,UAAU;QACtB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,CAAC;QACxD,OAAO;YACL,aAAa,EAAE,UAAU,KAAK,EAAE;YAChC,cAAc,EAAE,kBAAkB;SACnC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,QAAkB,EAClB,MAAc,EACd,GAAW,EACX,SAAiB;QAEjB,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QAC1C,MAAM,SAAS,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,IAAI,SAAS,CAAC;QAE5G,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,MAAM,IAAI,GAAG,YAAY,EAAE;YACpD,MAAM,EAAE,QAAQ,CAAC,MAAM;YACvB,UAAU;YACV,SAAS;SACV,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YACrB,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,kBAAkB,EAAE,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YACvD,MAAM,MAAM,GAAG,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;YACpE,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;YACzG,MAAM,IAAI,cAAc,CACtB,6BAA6B,MAAM,GAAG,IAAI,GAAG,EAC7C,GAAG,EACH,iBAAiB,EACjB,SAAS,EACT,SAAS,CACV,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,GAAG,EAAE,CAAC;YAC9E,OAAO,EAAE,IAAI,EAAE,SAAc,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3D,CAAC;QAED,IAAI,IAAa,CAAC;QAClB,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;QAC/D,IAAI,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC7C,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,GAAG,GAAG,IAA+B,CAAC;YAC5C,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,KAAK,IAAI,GAAG,CAA4B,CAAC;YACjE,MAAM,YAAY,GAAI,SAAS,EAAE,OAAkB,IAAI,QAAQ,CAAC,UAAU,CAAC;YAC3E,MAAM,SAAS,GAAI,SAAS,EAAE,SAAoB,IAAI,SAAS,CAAC;YAChE,MAAM,YAAY,GAAI,SAAS,EAAE,OAAqB,IAAI,SAAS,CAAC;YAEpE,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,gBAAgB,MAAM,IAAI,GAAG,EAAE,EAAE;gBACvD,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,SAAS;gBACT,YAAY;gBACZ,SAAS;gBACT,OAAO,EAAE,YAAY;gBACrB,UAAU,EAAE,SAAS,EAAE,UAAU;gBACjC,UAAU;aACX,CAAC,CAAC;YAEH,MAAM,IAAI,cAAc,CACtB,YAAY,EACZ,QAAQ,CAAC,MAAM,EACf,SAAS,EACT,SAAS,EACT,SAAS,EACT,YAAY,CACb,CAAC;QACJ,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,IAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;IACtD,CAAC;IAED,KAAK,CAAC,GAAG,CAAc,IAAY;QACjC,MAAM,GAAG,GAAG,GAAG,gBAAgB,GAAG,IAAI,EAAE,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QAC/C,OAAO,IAAI,CAAC,cAAc,CAAI,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,IAAI,CAAc,IAAY,EAAE,IAAc;QAClD,MAAM,GAAG,GAAG,GAAG,gBAAgB,GAAG,IAAI,EAAE,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,QAAQ,GAAG,EAAE,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACpH,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,MAAM;YACd,OAAO;YACP,IAAI,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,cAAc,CAAI,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,MAAM,CAAc,IAAY;QACpC,MAAM,GAAG,GAAG,GAAG,gBAAgB,GAAG,IAAI,EAAE,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,QAAQ;YAChB,OAAO;SACR,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,cAAc,CAAI,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC;IACpE,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-client.d.ts","sourceRoot":"","sources":["../../src/client/sql-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"sql-client.d.ts","sourceRoot":"","sources":["../../src/client/sql-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAMvD,qBAAa,SAAS;IACR,OAAO,CAAC,YAAY;gBAAZ,YAAY,EAAE,YAAY;IAExC,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAyB,GACjC,OAAO,CAAC,cAAc,CAAC;CAsF3B"}
|