@dbx-tools/auth 0.9.32 → 0.9.37
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 +49 -97
- package/index.ts +8 -26
- package/lib/index.d.ts +8 -26
- package/lib/index.js +6 -22
- package/lib/src/{databricks-cli.d.ts → _databricks-cli.d.ts} +3 -7
- package/lib/src/_databricks-cli.js +172 -0
- package/lib/src/_errors.d.ts +5 -0
- package/lib/src/_errors.js +10 -0
- package/lib/src/{lifecycle.d.ts → _lifecycle.d.ts} +5 -5
- package/lib/src/_lifecycle.js +214 -0
- package/lib/src/_logging.d.ts +1 -1
- package/lib/src/_logging.js +2 -2
- package/lib/src/{personal-access-token.d.ts → _personal-access-token.d.ts} +1 -1
- package/lib/src/_personal-access-token.js +30 -0
- package/lib/src/_profile-config.d.ts +43 -0
- package/lib/src/_profile-config.js +443 -0
- package/lib/src/{service-principal.d.ts → _service-principal.d.ts} +1 -1
- package/lib/src/_service-principal.js +69 -0
- package/lib/src/{storage.d.ts → _storage.d.ts} +2 -13
- package/lib/src/_storage.js +94 -0
- package/lib/src/_types.d.ts +40 -0
- package/lib/src/_types.js +2 -0
- package/lib/src/client.d.ts +30 -0
- package/lib/src/client.js +223 -0
- package/lib/src/config.d.ts +36 -0
- package/lib/src/config.js +15 -0
- package/lib/src/profile.d.ts +11 -0
- package/lib/src/profile.js +21 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +34 -10
- package/src/{databricks-cli.ts → _databricks-cli.ts} +20 -109
- package/src/_errors.ts +11 -0
- package/src/{lifecycle.ts → _lifecycle.ts} +12 -40
- package/src/_logging.ts +2 -2
- package/src/{personal-access-token.ts → _personal-access-token.ts} +1 -1
- package/src/_profile-config.ts +545 -0
- package/src/{service-principal.ts → _service-principal.ts} +2 -2
- package/src/{storage.ts → _storage.ts} +2 -31
- package/src/_types.ts +45 -0
- package/src/client.ts +291 -0
- package/src/config.ts +44 -0
- package/src/profile.ts +33 -0
- package/lib/exports.d.ts +0 -2
- package/lib/exports.js +0 -3
- package/lib/src/_profile-core.d.ts +0 -28
- package/lib/src/_profile-core.js +0 -216
- package/lib/src/_profile.d.ts +0 -15
- package/lib/src/_profile.js +0 -236
- package/lib/src/databricks-auth.d.ts +0 -11
- package/lib/src/databricks-auth.js +0 -314
- package/lib/src/databricks-cli.js +0 -239
- package/lib/src/errors.d.ts +0 -7
- package/lib/src/errors.js +0 -14
- package/lib/src/file-storage.d.ts +0 -20
- package/lib/src/file-storage.js +0 -207
- package/lib/src/generated/databricks-cli-assets.json +0 -33
- package/lib/src/http-client.d.ts +0 -23
- package/lib/src/http-client.js +0 -116
- package/lib/src/lifecycle.js +0 -233
- package/lib/src/personal-access-token.js +0 -30
- package/lib/src/service-principal.js +0 -69
- package/lib/src/storage.js +0 -112
- package/lib/src/types.d.ts +0 -165
- package/lib/src/types.js +0 -67
- package/src/_profile-core.ts +0 -258
- package/src/_profile.ts +0 -319
- package/src/databricks-auth.ts +0 -416
- package/src/errors.ts +0 -16
- package/src/file-storage.ts +0 -230
- package/src/generated/databricks-cli-assets.json +0 -33
- package/src/http-client.ts +0 -147
- package/src/types.ts +0 -196
package/lib/src/_profile.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { type Environment } from "./_profile-core.ts";
|
|
2
|
-
import { type DatabricksAuthOptions, type DatabricksProfile, type DatabricksProfileSummary } from "./types.ts";
|
|
3
|
-
export { normalizeHost, parseDatabricksConfig } from "./_profile-core.ts";
|
|
4
|
-
/** Expand and resolve the selected Databricks CLI configuration path. */
|
|
5
|
-
export declare function resolveConfigFile(explicit?: string, environment?: Environment): string;
|
|
6
|
-
/** Invalidate the process-wide parsed configuration cache after an external write. */
|
|
7
|
-
export declare function invalidateConfigFile(configFile?: string): void;
|
|
8
|
-
/** Return whether a named profile exists in the selected configuration. */
|
|
9
|
-
export declare function configProfileExists(profile: string, configFile?: string): boolean;
|
|
10
|
-
/** Enumerate secret-free profile metadata from the cached CLI configuration. */
|
|
11
|
-
export declare function listDatabricksProfiles(configFile?: string, refresh?: boolean, environment?: Environment): DatabricksProfileSummary[];
|
|
12
|
-
/** Resolve options, environment, request headers, and CLI configuration into one profile. */
|
|
13
|
-
export declare function resolveDatabricksProfile(options: DatabricksAuthOptions, environment?: Environment): DatabricksProfile;
|
|
14
|
-
export declare function effectiveScopes(scopes: readonly string[]): string[];
|
|
15
|
-
export declare function machineScopes(scopes: readonly string[]): string[];
|
package/lib/src/_profile.js
DELETED
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
2
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
3
|
-
import { homedir } from "node:os";
|
|
4
|
-
import { isAbsolute, resolve } from "node:path";
|
|
5
|
-
import * as environmentUtils from "@dbx-tools/shared-core/environment-utils";
|
|
6
|
-
import { authLogger } from "./_logging.js";
|
|
7
|
-
import { cleanList, inferTarget, loadRawProfile, missing, nonempty, normalizeHost, parseDatabricksConfig, parseTarget, requestOboToken, resolveAuthKind, resolveProfileName, SETTINGS_SECTION, } from "./_profile-core.js";
|
|
8
|
-
import { AuthError } from "./errors.js";
|
|
9
|
-
import { AUTH_TYPE_APP_OBO, AUTH_TYPE_APP_SP, AuthKind, DEFAULT_CLIENT_ID, DEFAULT_CONFIG_FILE, } from "./types.js";
|
|
10
|
-
const configCache = new Map();
|
|
11
|
-
const logger = authLogger("profile");
|
|
12
|
-
export { normalizeHost, parseDatabricksConfig } from "./_profile-core.js";
|
|
13
|
-
/** Expand and resolve the selected Databricks CLI configuration path. */
|
|
14
|
-
export function resolveConfigFile(explicit, environment = process.env) {
|
|
15
|
-
const selected = nonempty(explicit) ?? nonempty(environment.DATABRICKS_CONFIG_FILE) ?? DEFAULT_CONFIG_FILE;
|
|
16
|
-
const expanded = selected === "~"
|
|
17
|
-
? homedir()
|
|
18
|
-
: selected.startsWith("~/")
|
|
19
|
-
? resolve(homedir(), selected.slice(2))
|
|
20
|
-
: selected;
|
|
21
|
-
const path = isAbsolute(expanded) ? expanded : resolve(expanded);
|
|
22
|
-
logger.debug("resolved Databricks config file", {
|
|
23
|
-
path,
|
|
24
|
-
source: nonempty(explicit)
|
|
25
|
-
? "option"
|
|
26
|
-
: nonempty(environment.DATABRICKS_CONFIG_FILE)
|
|
27
|
-
? "environment"
|
|
28
|
-
: "default",
|
|
29
|
-
});
|
|
30
|
-
return path;
|
|
31
|
-
}
|
|
32
|
-
/** Invalidate the process-wide parsed configuration cache after an external write. */
|
|
33
|
-
export function invalidateConfigFile(configFile) {
|
|
34
|
-
const path = resolveConfigFile(configFile);
|
|
35
|
-
configCache.delete(path);
|
|
36
|
-
logger.debug("invalidated Databricks config cache", { path });
|
|
37
|
-
}
|
|
38
|
-
/** Return whether a named profile exists in the selected configuration. */
|
|
39
|
-
export function configProfileExists(profile, configFile) {
|
|
40
|
-
if (!profile.trim() || profile === SETTINGS_SECTION)
|
|
41
|
-
return false;
|
|
42
|
-
return loadConfig(resolveConfigFile(configFile))?.has(profile) ?? false;
|
|
43
|
-
}
|
|
44
|
-
/** Enumerate secret-free profile metadata from the cached CLI configuration. */
|
|
45
|
-
export function listDatabricksProfiles(configFile, refresh = false, environment = process.env) {
|
|
46
|
-
const path = resolveConfigFile(configFile, environment);
|
|
47
|
-
if (refresh)
|
|
48
|
-
configCache.delete(path);
|
|
49
|
-
const config = loadConfig(path);
|
|
50
|
-
if (!config) {
|
|
51
|
-
logger.debug("listed Databricks profiles", { path, refresh, count: 0 });
|
|
52
|
-
return [];
|
|
53
|
-
}
|
|
54
|
-
const profiles = [...config.keys()]
|
|
55
|
-
.filter((name) => name !== SETTINGS_SECTION)
|
|
56
|
-
.map((name) => {
|
|
57
|
-
const profile = loadRawProfile(config, name);
|
|
58
|
-
const host = nonempty(profile.host);
|
|
59
|
-
const accountId = nonempty(profile.accountId);
|
|
60
|
-
return {
|
|
61
|
-
name,
|
|
62
|
-
...(host ? { host } : {}),
|
|
63
|
-
...(accountId ? { accountId } : {}),
|
|
64
|
-
...(nonempty(profile.workspaceId) ? { workspaceId: nonempty(profile.workspaceId) } : {}),
|
|
65
|
-
target: inferTarget(host, accountId),
|
|
66
|
-
authKind: resolveAuthKind(profile.authType, profile.clientId, profile.clientSecret, profile.accessToken),
|
|
67
|
-
};
|
|
68
|
-
})
|
|
69
|
-
.sort((left, right) => left.name.localeCompare(right.name));
|
|
70
|
-
logger.debug("listed Databricks profiles", { path, refresh, count: profiles.length });
|
|
71
|
-
return profiles;
|
|
72
|
-
}
|
|
73
|
-
/** Resolve options, environment, request headers, and CLI configuration into one profile. */
|
|
74
|
-
export function resolveDatabricksProfile(options, environment = process.env) {
|
|
75
|
-
const inApp = environmentUtils.isDatabricksAppEnv({ ...environment });
|
|
76
|
-
const environmentProfile = nonempty(environment.DATABRICKS_CONFIG_PROFILE);
|
|
77
|
-
const explicitProfile = Boolean(nonempty(options.profile) ?? environmentProfile);
|
|
78
|
-
const requestToken = requestOboToken(options.requestHeaders, options.accessTokenHeader);
|
|
79
|
-
const explicitAuthType = nonempty(options.authType)?.toLowerCase() ??
|
|
80
|
-
(!inApp && !explicitProfile
|
|
81
|
-
? nonempty(environment.DATABRICKS_AUTH_TYPE)?.toLowerCase()
|
|
82
|
-
: undefined);
|
|
83
|
-
const appServicePrincipal = [
|
|
84
|
-
environment.DATABRICKS_HOST,
|
|
85
|
-
environment.DATABRICKS_CLIENT_ID,
|
|
86
|
-
environment.DATABRICKS_CLIENT_SECRET,
|
|
87
|
-
].every(nonempty);
|
|
88
|
-
const selectedAuthType = !inApp || explicitProfile || explicitAuthType
|
|
89
|
-
? explicitAuthType
|
|
90
|
-
: requestToken
|
|
91
|
-
? AUTH_TYPE_APP_OBO
|
|
92
|
-
: appServicePrincipal
|
|
93
|
-
? AUTH_TYPE_APP_SP
|
|
94
|
-
: undefined;
|
|
95
|
-
const appAuth = [AUTH_TYPE_APP_OBO, "app-obo", AUTH_TYPE_APP_SP, "app-sp"].includes(selectedAuthType ?? "");
|
|
96
|
-
const ignoreAmbientCredentials = explicitProfile && !appAuth;
|
|
97
|
-
const configPath = resolveConfigFile(options.configFile, environment);
|
|
98
|
-
const config = loadConfig(configPath);
|
|
99
|
-
const requestedName = nonempty(options.profile) ?? environmentProfile;
|
|
100
|
-
const profileName = resolveProfileName(requestedName, explicitProfile, config, options.preferUserToMachine);
|
|
101
|
-
const configured = loadRawProfile(config, profileName);
|
|
102
|
-
const ambient = (name) => ignoreAmbientCredentials ? undefined : nonempty(environment[name]);
|
|
103
|
-
const host = normalizeHost(options.host ?? ambient("DATABRICKS_HOST") ?? configured.host, profileName);
|
|
104
|
-
const accountId = nonempty(options.accountId) ??
|
|
105
|
-
ambient("DATABRICKS_ACCOUNT_ID") ??
|
|
106
|
-
nonempty(configured.accountId);
|
|
107
|
-
const workspaceId = nonempty(options.workspaceId) ??
|
|
108
|
-
ambient("DATABRICKS_WORKSPACE_ID") ??
|
|
109
|
-
nonempty(configured.workspaceId);
|
|
110
|
-
const clientIdValue = nonempty(options.clientId) ?? ambient("DATABRICKS_CLIENT_ID") ?? nonempty(configured.clientId);
|
|
111
|
-
const clientSecret = nonempty(options.clientSecret) ??
|
|
112
|
-
ambient("DATABRICKS_CLIENT_SECRET") ??
|
|
113
|
-
nonempty(configured.clientSecret);
|
|
114
|
-
const accessToken = selectedAuthType === AUTH_TYPE_APP_OBO || selectedAuthType === "app-obo"
|
|
115
|
-
? requestToken
|
|
116
|
-
: (nonempty(options.accessToken) ??
|
|
117
|
-
ambient("DATABRICKS_TOKEN") ??
|
|
118
|
-
nonempty(configured.accessToken));
|
|
119
|
-
const authType = selectedAuthType ??
|
|
120
|
-
ambient("DATABRICKS_AUTH_TYPE") ??
|
|
121
|
-
nonempty(configured.authType)?.toLowerCase();
|
|
122
|
-
const authKind = resolveAuthKind(authType, clientIdValue, clientSecret, accessToken);
|
|
123
|
-
const clientId = authKind === AuthKind.UserToMachine
|
|
124
|
-
? (clientIdValue ?? DEFAULT_CLIENT_ID)
|
|
125
|
-
: authKind === AuthKind.MachineToMachine || authKind === AuthKind.AppServicePrincipal
|
|
126
|
-
? (clientIdValue ?? missing(profileName, "client_id"))
|
|
127
|
-
: (clientIdValue ?? "");
|
|
128
|
-
const scopes = options.scopes?.length
|
|
129
|
-
? cleanList(options.scopes)
|
|
130
|
-
: cleanList(configured.scopes?.split(",") ?? ["all-apis"]);
|
|
131
|
-
const target = options.target ? parseTarget(options.target) : inferTarget(host, accountId);
|
|
132
|
-
const groupId = nonempty(options.groupId) ?? ambient("DATABRICKS_GROUP_ID") ?? nonempty(configured.groupId);
|
|
133
|
-
const principal = authKind === AuthKind.MachineToMachine || authKind === AuthKind.AppServicePrincipal
|
|
134
|
-
? clientId
|
|
135
|
-
: profileName;
|
|
136
|
-
const cacheKey = credentialCacheKey({
|
|
137
|
-
name: profileName,
|
|
138
|
-
host,
|
|
139
|
-
accountId,
|
|
140
|
-
workspaceId,
|
|
141
|
-
clientId,
|
|
142
|
-
groupId,
|
|
143
|
-
scopes,
|
|
144
|
-
authKind,
|
|
145
|
-
accessToken,
|
|
146
|
-
});
|
|
147
|
-
logger.debug("resolved Databricks profile", {
|
|
148
|
-
profile: profileName,
|
|
149
|
-
host,
|
|
150
|
-
authKind,
|
|
151
|
-
target,
|
|
152
|
-
inApp,
|
|
153
|
-
explicitProfile,
|
|
154
|
-
authType: authType ?? "automatic",
|
|
155
|
-
hasAccountId: Boolean(accountId),
|
|
156
|
-
hasWorkspaceId: Boolean(workspaceId),
|
|
157
|
-
hasGroupId: Boolean(groupId),
|
|
158
|
-
scopeCount: scopes.length,
|
|
159
|
-
configPath,
|
|
160
|
-
});
|
|
161
|
-
return {
|
|
162
|
-
name: profileName,
|
|
163
|
-
host,
|
|
164
|
-
...(accountId ? { accountId } : {}),
|
|
165
|
-
...(workspaceId ? { workspaceId } : {}),
|
|
166
|
-
clientId,
|
|
167
|
-
...(groupId ? { groupId } : {}),
|
|
168
|
-
scopes,
|
|
169
|
-
target,
|
|
170
|
-
authKind,
|
|
171
|
-
...(authType ? { authType } : {}),
|
|
172
|
-
...(clientSecret ? { clientSecret } : {}),
|
|
173
|
-
...(accessToken ? { accessToken } : {}),
|
|
174
|
-
cacheKey,
|
|
175
|
-
principal,
|
|
176
|
-
};
|
|
177
|
-
}
|
|
178
|
-
function loadConfig(path) {
|
|
179
|
-
if (configCache.has(path)) {
|
|
180
|
-
const cached = configCache.get(path);
|
|
181
|
-
if (cached instanceof Error)
|
|
182
|
-
throw cached;
|
|
183
|
-
logger.debug("reused Databricks config cache", {
|
|
184
|
-
path,
|
|
185
|
-
exists: Boolean(cached),
|
|
186
|
-
profileCount: cached?.size ?? 0,
|
|
187
|
-
});
|
|
188
|
-
return cached;
|
|
189
|
-
}
|
|
190
|
-
if (!existsSync(path)) {
|
|
191
|
-
configCache.set(path, undefined);
|
|
192
|
-
logger.debug("Databricks config file not found", { path });
|
|
193
|
-
return undefined;
|
|
194
|
-
}
|
|
195
|
-
try {
|
|
196
|
-
const config = parseDatabricksConfig(readFileSync(path, "utf8"));
|
|
197
|
-
configCache.set(path, config);
|
|
198
|
-
logger.debug("parsed Databricks config file", { path, profileCount: config.size });
|
|
199
|
-
return config;
|
|
200
|
-
}
|
|
201
|
-
catch (cause) {
|
|
202
|
-
const error = cause instanceof Error ? cause : new AuthError("config", `Could not read ${path}`, { cause });
|
|
203
|
-
configCache.set(path, error);
|
|
204
|
-
throw error;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
function credentialCacheKey(profile) {
|
|
208
|
-
if (profile.authKind === AuthKind.UserToMachine)
|
|
209
|
-
return profile.name;
|
|
210
|
-
if (profile.authKind === AuthKind.PersonalAccessToken) {
|
|
211
|
-
const digest = createHash("sha256")
|
|
212
|
-
.update(profile.accessToken ?? "")
|
|
213
|
-
.digest("hex");
|
|
214
|
-
return `${profile.name}-pat-${digest}`;
|
|
215
|
-
}
|
|
216
|
-
if (profile.authKind === AuthKind.AppOnBehalfOf)
|
|
217
|
-
return `${profile.name}-app-obo`;
|
|
218
|
-
const identity = [
|
|
219
|
-
profile.host,
|
|
220
|
-
profile.accountId ?? "",
|
|
221
|
-
profile.workspaceId ?? "",
|
|
222
|
-
profile.clientId,
|
|
223
|
-
profile.groupId ?? "",
|
|
224
|
-
machineScopes(profile.scopes).join(" "),
|
|
225
|
-
].join("\0");
|
|
226
|
-
const digest = createHash("sha256").update(identity).digest("hex");
|
|
227
|
-
return `${profile.name}-${profile.authKind === AuthKind.AppServicePrincipal ? "app-sp" : "oauth-m2m"}-${digest}`;
|
|
228
|
-
}
|
|
229
|
-
export function effectiveScopes(scopes) {
|
|
230
|
-
return cleanList(["offline_access", ...scopes]);
|
|
231
|
-
}
|
|
232
|
-
export function machineScopes(scopes) {
|
|
233
|
-
const values = cleanList(scopes.length ? scopes : ["all-apis"]);
|
|
234
|
-
return [...values].sort();
|
|
235
|
-
}
|
|
236
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3Byb2ZpbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX3Byb2ZpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNuRCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWhELE9BQU8sS0FBSyxnQkFBZ0IsTUFBTSwwQ0FBMEMsQ0FBQztBQUU3RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxTQUFTLEVBRVQsV0FBVyxFQUVYLGNBQWMsRUFDZCxPQUFPLEVBQ1AsUUFBUSxFQUNSLGFBQWEsRUFDYixxQkFBcUIsRUFDckIsV0FBVyxFQUNYLGVBQWUsRUFDZixlQUFlLEVBQ2Ysa0JBQWtCLEVBQ2xCLGdCQUFnQixHQUNqQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixnQkFBZ0IsRUFDaEIsUUFBUSxFQUlSLGlCQUFpQixFQUNqQixtQkFBbUIsR0FDcEIsTUFBTSxZQUFZLENBQUM7QUFFcEIsTUFBTSxXQUFXLEdBQUcsSUFBSSxHQUFHLEVBQXlDLENBQUM7QUFDckUsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBRXJDLE9BQU8sRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUxRSx5RUFBeUU7QUFDekUsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixRQUFpQixFQUNqQixjQUEyQixPQUFPLENBQUMsR0FBRztJQUV0QyxNQUFNLFFB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QU0sVUFBVSxhQUFhLENBQUMsTUFBeUI7SUFDckQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzVCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBpc0Fic29sdXRlLCByZXNvbHZlIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuXG5pbXBvcnQgKiBhcyBlbnZpcm9ubWVudFV0aWxzIGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlL2Vudmlyb25tZW50LXV0aWxzXCI7XG5cbmltcG9ydCB7IGF1dGhMb2dnZXIgfSBmcm9tIFwiLi9fbG9nZ2luZy50c1wiO1xuaW1wb3J0IHtcbiAgY2xlYW5MaXN0LFxuICB0eXBlIEVudmlyb25tZW50LFxuICBpbmZlclRhcmdldCxcbiAgdHlwZSBJbmlDb25maWcsXG4gIGxvYWRSYXdQcm9maWxlLFxuICBtaXNzaW5nLFxuICBub25lbXB0eSxcbiAgbm9ybWFsaXplSG9zdCxcbiAgcGFyc2VEYXRhYnJpY2tzQ29uZmlnLFxuICBwYXJzZVRhcmdldCxcbiAgcmVxdWVzdE9ib1Rva2VuLFxuICByZXNvbHZlQXV0aEtpbmQsXG4gIHJlc29sdmVQcm9maWxlTmFtZSxcbiAgU0VUVElOR1NfU0VDVElPTixcbn0gZnJvbSBcIi4vX3Byb2ZpbGUtY29yZS50c1wiO1xuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLnRzXCI7XG5pbXBvcnQge1xuICBBVVRIX1RZUEVfQVBQX09CTyxcbiAgQVVUSF9UWVBFX0FQUF9TUCxcbiAgQXV0aEtpbmQsXG4gIHR5cGUgRGF0YWJyaWNrc0F1dGhPcHRpb25zLFxuICB0eXBlIERhdGFicmlja3NQcm9maWxlLFxuICB0eXBlIERhdGFicmlja3NQcm9maWxlU3VtbWFyeSxcbiAgREVGQVVMVF9DTElFTlRfSUQsXG4gIERFRkFVTFRfQ09ORklHX0ZJTEUsXG59IGZyb20gXCIuL3R5cGVzLnRzXCI7XG5cbmNvbnN0IGNvbmZpZ0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEluaUNvbmZpZyB8IEVycm9yIHwgdW5kZWZpbmVkPigpO1xuY29uc3QgbG9nZ2VyID0gYXV0aExvZ2dlcihcInByb2ZpbGVcIik7XG5cbmV4cG9ydCB7IG5vcm1hbGl6ZUhvc3QsIHBhcnNlRGF0YWJyaWNrc0NvbmZpZyB9IGZyb20gXCIuL19wcm9maWxlLWNvcmUudHNcIjtcblxuLyoqIEV4cGFuZCBhbmQgcmVzb2x2ZSB0aGUgc2VsZWN0ZWQgRGF0YWJyaWNrcyBDTEkgY29uZmlndXJhdGlvbiBwYXRoLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVDb25maWdGaWxlKFxuICBleHBsaWNpdD86IHN0cmluZyxcbiAgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50ID0gcHJvY2Vzcy5lbnYsXG4pOiBzdHJpbmcge1xuICBjb25zdCBzZWxlY3RlZCA9XG4gICAgbm9uZW1wdHkoZXhwbGljaXQpID8/IG5vbmVtcHR5KGVudmlyb25tZW50LkRBVEFCUklDS1NfQ09ORklHX0ZJTEUpID8/IERFRkFVTFRfQ09ORklHX0ZJTEU7XG4gIGNvbnN0IGV4cGFuZGVkID1cbiAgICBzZWxlY3RlZCA9PT0gXCJ+XCJcbiAgICAgID8gaG9tZWRpcigpXG4gICAgICA6IHNlbGVjdGVkLnN0YXJ0c1dpdGgoXCJ+L1wiKVxuICAgICAgICA/IHJlc29sdmUoaG9tZWRpcigpLCBzZWxlY3RlZC5zbGljZSgyKSlcbiAgICAgICAgOiBzZWxlY3RlZDtcbiAgY29uc3QgcGF0aCA9IGlzQWJzb2x1dGUoZXhwYW5kZWQpID8gZXhwYW5kZWQgOiByZXNvbHZlKGV4cGFuZGVkKTtcbiAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2ZWQgRGF0YWJyaWNrcyBjb25maWcgZmlsZVwiLCB7XG4gICAgcGF0aCxcbiAgICBzb3VyY2U6IG5vbmVtcHR5KGV4cGxpY2l0KVxuICAgICAgPyBcIm9wdGlvblwiXG4gICAgICA6IG5vbmVtcHR5KGVudmlyb25tZW50LkRBVEFCUklDS1NfQ09ORklHX0ZJTEUpXG4gICAgICAgID8gXCJlbnZpcm9ubWVudFwiXG4gICAgICAgIDogXCJkZWZhdWx0XCIsXG4gIH0pO1xuICByZXR1cm4gcGF0aDtcbn1cblxuLyoqIEludmFsaWRhdGUgdGhlIHByb2Nlc3Mtd2lkZSBwYXJzZWQgY29uZmlndXJhdGlvbiBjYWNoZSBhZnRlciBhbiBleHRlcm5hbCB3cml0ZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnZhbGlkYXRlQ29uZmlnRmlsZShjb25maWdGaWxlPzogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IHBhdGggPSByZXNvbHZlQ29uZmlnRmlsZShjb25maWdGaWxlKTtcbiAgY29uZmlnQ2FjaGUuZGVsZXRlKHBhdGgpO1xuICBsb2dnZXIuZGVidWcoXCJpbnZhbGlkYXRlZCBEYXRhYnJpY2tzIGNvbmZpZyBjYWNoZVwiLCB7IHBhdGggfSk7XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciBhIG5hbWVkIHByb2ZpbGUgZXhpc3RzIGluIHRoZSBzZWxlY3RlZCBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ1Byb2ZpbGVFeGlzdHMocHJvZmlsZTogc3RyaW5nLCBjb25maWdGaWxlPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICghcHJvZmlsZS50cmltKCkgfHwgcHJvZmlsZSA9PT0gU0VUVElOR1NfU0VDVElPTikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gbG9hZENvbmZpZyhyZXNvbHZlQ29uZmlnRmlsZShjb25maWdGaWxlKSk/Lmhhcyhwcm9maWxlKSA/PyBmYWxzZTtcbn1cblxuLyoqIEVudW1lcmF0ZSBzZWNyZXQtZnJlZSBwcm9maWxlIG1ldGFkYXRhIGZyb20gdGhlIGNhY2hlZCBDTEkgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsaXN0RGF0YWJyaWNrc1Byb2ZpbGVzKFxuICBjb25maWdGaWxlPzogc3RyaW5nLFxuICByZWZyZXNoID0gZmFsc2UsXG4gIGVudmlyb25tZW50OiBFbnZpcm9ubWVudCA9IHByb2Nlc3MuZW52LFxuKTogRGF0YWJyaWNrc1Byb2ZpbGVTdW1tYXJ5W10ge1xuICBjb25zdCBwYXRoID0gcmVzb2x2ZUNvbmZpZ0ZpbGUoY29uZmlnRmlsZSwgZW52aXJvbm1lbnQpO1xuICBpZiAocmVmcmVzaCkgY29uZmlnQ2FjaGUuZGVsZXRlKHBhdGgpO1xuICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKHBhdGgpO1xuICBpZiAoIWNvbmZpZykge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImxpc3RlZCBEYXRhYnJpY2tzIHByb2ZpbGVzXCIsIHsgcGF0aCwgcmVmcmVzaCwgY291bnQ6IDAgfSk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGNvbnN0IHByb2ZpbGVzID0gWy4uLmNvbmZpZy5rZXlzKCldXG4gICAgLmZpbHRlcigobmFtZSkgPT4gbmFtZSAhPT0gU0VUVElOR1NfU0VDVElPTilcbiAgICAubWFwKChuYW1lKSA9PiB7XG4gICAgICBjb25zdCBwcm9maWxlID0gbG9hZFJhd1Byb2ZpbGUoY29uZmlnLCBuYW1lKTtcbiAgICAgIGNvbnN0IGhvc3QgPSBub25lbXB0eShwcm9maWxlLmhvc3QpO1xuICAgICAgY29uc3QgYWNjb3VudElkID0gbm9uZW1wdHkocHJvZmlsZS5hY2NvdW50SWQpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZSxcbiAgICAgICAgLi4uKGhvc3QgPyB7IGhvc3QgfSA6IHt9KSxcbiAgICAgICAgLi4uKGFjY291bnRJZCA/IHsgYWNjb3VudElkIH0gOiB7fSksXG4gICAgICAgIC4uLihub25lbXB0eShwcm9maWxlLndvcmtzcGFjZUlkKSA/IHsgd29ya3NwYWNlSWQ6IG5vbmVtcHR5KHByb2ZpbGUud29ya3NwYWNlSWQpIH0gOiB7fSksXG4gICAgICAgIHRhcmdldDogaW5mZXJUYXJnZXQoaG9zdCwgYWNjb3VudElkKSxcbiAgICAgICAgYXV0aEtpbmQ6IHJlc29sdmVBdXRoS2luZChcbiAgICAgICAgICBwcm9maWxlLmF1dGhUeXBlLFxuICAgICAgICAgIHByb2ZpbGUuY2xpZW50SWQsXG4gICAgICAgICAgcHJvZmlsZS5jbGllbnRTZWNyZXQsXG4gICAgICAgICAgcHJvZmlsZS5hY2Nlc3NUb2tlbixcbiAgICAgICAgKSxcbiAgICAgIH07XG4gICAgfSlcbiAgICAuc29ydCgobGVmdCwgcmlnaHQpID0+IGxlZnQubmFtZS5sb2NhbGVDb21wYXJlKHJpZ2h0Lm5hbWUpKTtcbiAgbG9nZ2VyLmRlYnVnKFwibGlzdGVkIERhdGFicmlja3MgcHJvZmlsZXNcIiwgeyBwYXRoLCByZWZyZXNoLCBjb3VudDogcHJvZmlsZXMubGVuZ3RoIH0pO1xuICByZXR1cm4gcHJvZmlsZXM7XG59XG5cbi8qKiBSZXNvbHZlIG9wdGlvbnMsIGVudmlyb25tZW50LCByZXF1ZXN0IGhlYWRlcnMsIGFuZCBDTEkgY29uZmlndXJhdGlvbiBpbnRvIG9uZSBwcm9maWxlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEYXRhYnJpY2tzUHJvZmlsZShcbiAgb3B0aW9uczogRGF0YWJyaWNrc0F1dGhPcHRpb25zLFxuICBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQgPSBwcm9jZXNzLmVudixcbik6IERhdGFicmlja3NQcm9maWxlIHtcbiAgY29uc3QgaW5BcHAgPSBlbnZpcm9ubWVudFV0aWxzLmlzRGF0YWJyaWNrc0FwcEVudih7IC4uLmVudmlyb25tZW50IH0pO1xuICBjb25zdCBlbnZpcm9ubWVudFByb2ZpbGUgPSBub25lbXB0eShlbnZpcm9ubWVudC5EQVRBQlJJQ0tTX0NPTkZJR19QUk9GSUxFKTtcbiAgY29uc3QgZXhwbGljaXRQcm9maWxlID0gQm9vbGVhbihub25lbXB0eShvcHRpb25zLnByb2ZpbGUpID8/IGVudmlyb25tZW50UHJvZmlsZSk7XG4gIGNvbnN0IHJlcXVlc3RUb2tlbiA9IHJlcXVlc3RPYm9Ub2tlbihvcHRpb25zLnJlcXVlc3RIZWFkZXJzLCBvcHRpb25zLmFjY2Vzc1Rva2VuSGVhZGVyKTtcbiAgY29uc3QgZXhwbGljaXRBdXRoVHlwZSA9XG4gICAgbm9uZW1wdHkob3B0aW9ucy5hdXRoVHlwZSk/LnRvTG93ZXJDYXNlKCkgPz9cbiAgICAoIWluQXBwICYmICFleHBsaWNpdFByb2ZpbGVcbiAgICAgID8gbm9uZW1wdHkoZW52aXJvbm1lbnQuREFUQUJSSUNLU19BVVRIX1RZUEUpPy50b0xvd2VyQ2FzZSgpXG4gICAgICA6IHVuZGVmaW5lZCk7XG4gIGNvbnN0IGFwcFNlcnZpY2VQcmluY2lwYWwgPSBbXG4gICAgZW52aXJvbm1lbnQuREFUQUJSSUNLU19IT1NULFxuICAgIGVudmlyb25tZW50LkRBVEFCUklDS1NfQ0xJRU5UX0lELFxuICAgIGVudmlyb25tZW50LkRBVEFCUklDS1NfQ0xJRU5UX1NFQ1JFVCxcbiAgXS5ldmVyeShub25lbXB0eSk7XG4gIGNvbnN0IHNlbGVjdGVkQXV0aFR5cGUgPVxuICAgICFpbkFwcCB8fCBleHBsaWNpdFByb2ZpbGUgfHwgZXhwbGljaXRBdXRoVHlwZVxuICAgICAgPyBleHBsaWNpdEF1dGhUeXBlXG4gICAgICA6IHJlcXVlc3RUb2tlblxuICAgICAgICA/IEFVVEhfVFlQRV9BUFBfT0JPXG4gICAgICAgIDogYXBwU2VydmljZVByaW5jaXBhbFxuICAgICAgICAgID8gQVVUSF9UWVBFX0FQUF9TUFxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBhcHBBdXRoID0gW0FVVEhfVFlQRV9BUFBfT0JPLCBcImFwcC1vYm9cIiwgQVVUSF9UWVBFX0FQUF9TUCwgXCJhcHAtc3BcIl0uaW5jbHVkZXMoXG4gICAgc2VsZWN0ZWRBdXRoVHlwZSA/PyBcIlwiLFxuICApO1xuICBjb25zdCBpZ25vcmVBbWJpZW50Q3JlZGVudGlhbHMgPSBleHBsaWNpdFByb2ZpbGUgJiYgIWFwcEF1dGg7XG4gIGNvbnN0IGNvbmZpZ1BhdGggPSByZXNvbHZlQ29uZmlnRmlsZShvcHRpb25zLmNvbmZpZ0ZpbGUsIGVudmlyb25tZW50KTtcbiAgY29uc3QgY29uZmlnID0gbG9hZENvbmZpZyhjb25maWdQYXRoKTtcbiAgY29uc3QgcmVxdWVzdGVkTmFtZSA9IG5vbmVtcHR5KG9wdGlvbnMucHJvZmlsZSkgPz8gZW52aXJvbm1lbnRQcm9maWxlO1xuICBjb25zdCBwcm9maWxlTmFtZSA9IHJlc29sdmVQcm9maWxlTmFtZShcbiAgICByZXF1ZXN0ZWROYW1lLFxuICAgIGV4cGxpY2l0UHJvZmlsZSxcbiAgICBjb25maWcsXG4gICAgb3B0aW9ucy5wcmVmZXJVc2VyVG9NYWNoaW5lLFxuICApO1xuICBjb25zdCBjb25maWd1cmVkID0gbG9hZFJhd1Byb2ZpbGUoY29uZmlnLCBwcm9maWxlTmFtZSk7XG4gIGNvbnN0IGFtYmllbnQgPSAobmFtZToga2V5b2YgTm9kZUpTLlByb2Nlc3NFbnYpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT5cbiAgICBpZ25vcmVBbWJpZW50Q3JlZGVudGlhbHMgPyB1bmRlZmluZWQgOiBub25lbXB0eShlbnZpcm9ubWVudFtuYW1lXSk7XG4gIGNvbnN0IGhvc3QgPSBub3JtYWxpemVIb3N0KFxuICAgIG9wdGlvbnMuaG9zdCA/PyBhbWJpZW50KFwiREFUQUJSSUNLU19IT1NUXCIpID8/IGNvbmZpZ3VyZWQuaG9zdCxcbiAgICBwcm9maWxlTmFtZSxcbiAgKTtcbiAgY29uc3QgYWNjb3VudElkID1cbiAgICBub25lbXB0eShvcHRpb25zLmFjY291bnRJZCkgPz9cbiAgICBhbWJpZW50KFwiREFUQUJSSUNLU19BQ0NPVU5UX0lEXCIpID8/XG4gICAgbm9uZW1wdHkoY29uZmlndXJlZC5hY2NvdW50SWQpO1xuICBjb25zdCB3b3Jrc3BhY2VJZCA9XG4gICAgbm9uZW1wdHkob3B0aW9ucy53b3Jrc3BhY2VJZCkgPz9cbiAgICBhbWJpZW50KFwiREFUQUJSSUNLU19XT1JLU1BBQ0VfSURcIikgPz9cbiAgICBub25lbXB0eShjb25maWd1cmVkLndvcmtzcGFjZUlkKTtcbiAgY29uc3QgY2xpZW50SWRWYWx1ZSA9XG4gICAgbm9uZW1wdHkob3B0aW9ucy5jbGllbnRJZCkgPz8gYW1iaWVudChcIkRBVEFCUklDS1NfQ0xJRU5UX0lEXCIpID8/IG5vbmVtcHR5KGNvbmZpZ3VyZWQuY2xpZW50SWQpO1xuICBjb25zdCBjbGllbnRTZWNyZXQgPVxuICAgIG5vbmVtcHR5KG9wdGlvbnMuY2xpZW50U2VjcmV0KSA/P1xuICAgIGFtYmllbnQoXCJEQVRBQlJJQ0tTX0NMSUVOVF9TRUNSRVRcIikgPz9cbiAgICBub25lbXB0eShjb25maWd1cmVkLmNsaWVudFNlY3JldCk7XG4gIGNvbnN0IGFjY2Vzc1Rva2VuID1cbiAgICBzZWxlY3RlZEF1dGhUeXBlID09PSBBVVRIX1RZUEVfQVBQX09CTyB8fCBzZWxlY3RlZEF1dGhUeXBlID09PSBcImFwcC1vYm9cIlxuICAgICAgPyByZXF1ZXN0VG9rZW5cbiAgICAgIDogKG5vbmVtcHR5KG9wdGlvbnMuYWNjZXNzVG9rZW4pID8/XG4gICAgICAgIGFtYmllbnQoXCJEQVRBQlJJQ0tTX1RPS0VOXCIpID8/XG4gICAgICAgIG5vbmVtcHR5KGNvbmZpZ3VyZWQuYWNjZXNzVG9rZW4pKTtcbiAgY29uc3QgYXV0aFR5cGUgPVxuICAgIHNlbGVjdGVkQXV0aFR5cGUgPz9cbiAgICBhbWJpZW50KFwiREFUQUJSSUNLU19BVVRIX1RZUEVcIikgPz9cbiAgICBub25lbXB0eShjb25maWd1cmVkLmF1dGhUeXBlKT8udG9Mb3dlckNhc2UoKTtcbiAgY29uc3QgYXV0aEtpbmQgPSByZXNvbHZlQXV0aEtpbmQoYXV0aFR5cGUsIGNsaWVudElkVmFsdWUsIGNsaWVudFNlY3JldCwgYWNjZXNzVG9rZW4pO1xuICBjb25zdCBjbGllbnRJZCA9XG4gICAgYXV0aEtpbmQgPT09IEF1dGhLaW5kLlVzZXJUb01hY2hpbmVcbiAgICAgID8gKGNsaWVudElkVmFsdWUgPz8gREVGQVVMVF9DTElFTlRfSUQpXG4gICAgICA6IGF1dGhLaW5kID09PSBBdXRoS2luZC5NYWNoaW5lVG9NYWNoaW5lIHx8IGF1dGhLaW5kID09PSBBdXRoS2luZC5BcHBTZXJ2aWNlUHJpbmNpcGFsXG4gICAgICAgID8gKGNsaWVudElkVmFsdWUgPz8gbWlzc2luZyhwcm9maWxlTmFtZSwgXCJjbGllbnRfaWRcIikpXG4gICAgICAgIDogKGNsaWVudElkVmFsdWUgPz8gXCJcIik7XG4gIGNvbnN0IHNjb3BlcyA9IG9wdGlvbnMuc2NvcGVzPy5sZW5ndGhcbiAgICA/IGNsZWFuTGlzdChvcHRpb25zLnNjb3BlcylcbiAgICA6IGNsZWFuTGlzdChjb25maWd1cmVkLnNjb3Blcz8uc3BsaXQoXCIsXCIpID8/IFtcImFsbC1hcGlzXCJdKTtcbiAgY29uc3QgdGFyZ2V0ID0gb3B0aW9ucy50YXJnZXQgPyBwYXJzZVRhcmdldChvcHRpb25zLnRhcmdldCkgOiBpbmZlclRhcmdldChob3N0LCBhY2NvdW50SWQpO1xuICBjb25zdCBncm91cElkID1cbiAgICBub25lbXB0eShvcHRpb25zLmdyb3VwSWQpID8/IGFtYmllbnQoXCJEQVRBQlJJQ0tTX0dST1VQX0lEXCIpID8/IG5vbmVtcHR5KGNvbmZpZ3VyZWQuZ3JvdXBJZCk7XG4gIGNvbnN0IHByaW5jaXBhbCA9XG4gICAgYXV0aEtpbmQgPT09IEF1dGhLaW5kLk1hY2hpbmVUb01hY2hpbmUgfHwgYXV0aEtpbmQgPT09IEF1dGhLaW5kLkFwcFNlcnZpY2VQcmluY2lwYWxcbiAgICAgID8gY2xpZW50SWRcbiAgICAgIDogcHJvZmlsZU5hbWU7XG4gIGNvbnN0IGNhY2hlS2V5ID0gY3JlZGVudGlhbENhY2hlS2V5KHtcbiAgICBuYW1lOiBwcm9maWxlTmFtZSxcbiAgICBob3N0LFxuICAgIGFjY291bnRJZCxcbiAgICB3b3Jrc3BhY2VJZCxcbiAgICBjbGllbnRJZCxcbiAgICBncm91cElkLFxuICAgIHNjb3BlcyxcbiAgICBhdXRoS2luZCxcbiAgICBhY2Nlc3NUb2tlbixcbiAgfSk7XG4gIGxvZ2dlci5kZWJ1ZyhcInJlc29sdmVkIERhdGFicmlja3MgcHJvZmlsZVwiLCB7XG4gICAgcHJvZmlsZTogcHJvZmlsZU5hbWUsXG4gICAgaG9zdCxcbiAgICBhdXRoS2luZCxcbiAgICB0YXJnZXQsXG4gICAgaW5BcHAsXG4gICAgZXhwbGljaXRQcm9maWxlLFxuICAgIGF1dGhUeXBlOiBhdXRoVHlwZSA/PyBcImF1dG9tYXRpY1wiLFxuICAgIGhhc0FjY291bnRJZDogQm9vbGVhbihhY2NvdW50SWQpLFxuICAgIGhhc1dvcmtzcGFjZUlkOiBCb29sZWFuKHdvcmtzcGFjZUlkKSxcbiAgICBoYXNHcm91cElkOiBCb29sZWFuKGdyb3VwSWQpLFxuICAgIHNjb3BlQ291bnQ6IHNjb3Blcy5sZW5ndGgsXG4gICAgY29uZmlnUGF0aCxcbiAgfSk7XG4gIHJldHVybiB7XG4gICAgbmFtZTogcHJvZmlsZU5hbWUsXG4gICAgaG9zdCxcbiAgICAuLi4oYWNjb3VudElkID8geyBhY2NvdW50SWQgfSA6IHt9KSxcbiAgICAuLi4od29ya3NwYWNlSWQgPyB7IHdvcmtzcGFjZUlkIH0gOiB7fSksXG4gICAgY2xpZW50SWQsXG4gICAgLi4uKGdyb3VwSWQgPyB7IGdyb3VwSWQgfSA6IHt9KSxcbiAgICBzY29wZXMsXG4gICAgdGFyZ2V0LFxuICAgIGF1dGhLaW5kLFxuICAgIC4uLihhdXRoVHlwZSA/IHsgYXV0aFR5cGUgfSA6IHt9KSxcbiAgICAuLi4oY2xpZW50U2VjcmV0ID8geyBjbGllbnRTZWNyZXQgfSA6IHt9KSxcbiAgICAuLi4oYWNjZXNzVG9rZW4gPyB7IGFjY2Vzc1Rva2VuIH0gOiB7fSksXG4gICAgY2FjaGVLZXksXG4gICAgcHJpbmNpcGFsLFxuICB9O1xufVxuXG5mdW5jdGlvbiBsb2FkQ29uZmlnKHBhdGg6IHN0cmluZyk6IEluaUNvbmZpZyB8IHVuZGVmaW5lZCB7XG4gIGlmIChjb25maWdDYWNoZS5oYXMocGF0aCkpIHtcbiAgICBjb25zdCBjYWNoZWQgPSBjb25maWdDYWNoZS5nZXQocGF0aCk7XG4gICAgaWYgKGNhY2hlZCBpbnN0YW5jZW9mIEVycm9yKSB0aHJvdyBjYWNoZWQ7XG4gICAgbG9nZ2VyLmRlYnVnKFwicmV1c2VkIERhdGFicmlja3MgY29uZmlnIGNhY2hlXCIsIHtcbiAgICAgIHBhdGgsXG4gICAgICBleGlzdHM6IEJvb2xlYW4oY2FjaGVkKSxcbiAgICAgIHByb2ZpbGVDb3VudDogY2FjaGVkPy5zaXplID8/IDAsXG4gICAgfSk7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuICBpZiAoIWV4aXN0c1N5bmMocGF0aCkpIHtcbiAgICBjb25maWdDYWNoZS5zZXQocGF0aCwgdW5kZWZpbmVkKTtcbiAgICBsb2dnZXIuZGVidWcoXCJEYXRhYnJpY2tzIGNvbmZpZyBmaWxlIG5vdCBmb3VuZFwiLCB7IHBhdGggfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHBhcnNlRGF0YWJyaWNrc0NvbmZpZyhyZWFkRmlsZVN5bmMocGF0aCwgXCJ1dGY4XCIpKTtcbiAgICBjb25maWdDYWNoZS5zZXQocGF0aCwgY29uZmlnKTtcbiAgICBsb2dnZXIuZGVidWcoXCJwYXJzZWQgRGF0YWJyaWNrcyBjb25maWcgZmlsZVwiLCB7IHBhdGgsIHByb2ZpbGVDb3VudDogY29uZmlnLnNpemUgfSk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICBjb25zdCBlcnJvciA9XG4gICAgICBjYXVzZSBpbnN0YW5jZW9mIEVycm9yID8gY2F1c2UgOiBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIGBDb3VsZCBub3QgcmVhZCAke3BhdGh9YCwgeyBjYXVzZSB9KTtcbiAgICBjb25maWdDYWNoZS5zZXQocGF0aCwgZXJyb3IpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWRlbnRpYWxDYWNoZUtleShcbiAgcHJvZmlsZTogUGljazxcbiAgICBEYXRhYnJpY2tzUHJvZmlsZSxcbiAgICB8IFwibmFtZVwiXG4gICAgfCBcImhvc3RcIlxuICAgIHwgXCJhY2NvdW50SWRcIlxuICAgIHwgXCJ3b3Jrc3BhY2VJZFwiXG4gICAgfCBcImNsaWVudElkXCJcbiAgICB8IFwiZ3JvdXBJZFwiXG4gICAgfCBcInNjb3Blc1wiXG4gICAgfCBcImF1dGhLaW5kXCJcbiAgICB8IFwiYWNjZXNzVG9rZW5cIlxuICA+LFxuKTogc3RyaW5nIHtcbiAgaWYgKHByb2ZpbGUuYXV0aEtpbmQgPT09IEF1dGhLaW5kLlVzZXJUb01hY2hpbmUpIHJldHVybiBwcm9maWxlLm5hbWU7XG4gIGlmIChwcm9maWxlLmF1dGhLaW5kID09PSBBdXRoS2luZC5QZXJzb25hbEFjY2Vzc1Rva2VuKSB7XG4gICAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgICAgLnVwZGF0ZShwcm9maWxlLmFjY2Vzc1Rva2VuID8/IFwiXCIpXG4gICAgICAuZGlnZXN0KFwiaGV4XCIpO1xuICAgIHJldHVybiBgJHtwcm9maWxlLm5hbWV9LXBhdC0ke2RpZ2VzdH1gO1xuICB9XG4gIGlmIChwcm9maWxlLmF1dGhLaW5kID09PSBBdXRoS2luZC5BcHBPbkJlaGFsZk9mKSByZXR1cm4gYCR7cHJvZmlsZS5uYW1lfS1hcHAtb2JvYDtcbiAgY29uc3QgaWRlbnRpdHkgPSBbXG4gICAgcHJvZmlsZS5ob3N0LFxuICAgIHByb2ZpbGUuYWNjb3VudElkID8/IFwiXCIsXG4gICAgcHJvZmlsZS53b3Jrc3BhY2VJZCA/PyBcIlwiLFxuICAgIHByb2ZpbGUuY2xpZW50SWQsXG4gICAgcHJvZmlsZS5ncm91cElkID8/IFwiXCIsXG4gICAgbWFjaGluZVNjb3Blcyhwcm9maWxlLnNjb3Blcykuam9pbihcIiBcIiksXG4gIF0uam9pbihcIlxcMFwiKTtcbiAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoaWRlbnRpdHkpLmRpZ2VzdChcImhleFwiKTtcbiAgcmV0dXJuIGAke3Byb2ZpbGUubmFtZX0tJHtwcm9maWxlLmF1dGhLaW5kID09PSBBdXRoS2luZC5BcHBTZXJ2aWNlUHJpbmNpcGFsID8gXCJhcHAtc3BcIiA6IFwib2F1dGgtbTJtXCJ9LSR7ZGlnZXN0fWA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlZmZlY3RpdmVTY29wZXMoc2NvcGVzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIGNsZWFuTGlzdChbXCJvZmZsaW5lX2FjY2Vzc1wiLCAuLi5zY29wZXNdKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hY2hpbmVTY29wZXMoc2NvcGVzOiByZWFkb25seSBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgdmFsdWVzID0gY2xlYW5MaXN0KHNjb3Blcy5sZW5ndGggPyBzY29wZXMgOiBbXCJhbGwtYXBpc1wiXSk7XG4gIHJldHVybiBbLi4udmFsdWVzXS5zb3J0KCk7XG59XG4iXX0=
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { type AuthClient, type DatabricksAuthOptions, Storage } from "./types.ts";
|
|
2
|
-
/** Injectable host capabilities for Databricks authentication. */
|
|
3
|
-
export interface DatabricksAuthDependencies {
|
|
4
|
-
environment?: Readonly<Record<string, string | undefined>>;
|
|
5
|
-
fetch?: typeof globalThis.fetch;
|
|
6
|
-
resolveCli?: (options: {
|
|
7
|
-
install: boolean;
|
|
8
|
-
}) => Promise<string | undefined>;
|
|
9
|
-
}
|
|
10
|
-
/** Create a Databricks authentication client. */
|
|
11
|
-
export declare function createAuthClient(options?: DatabricksAuthOptions, storage?: Storage, dependencies?: DatabricksAuthDependencies): Promise<AuthClient>;
|