@dbx-tools/auth 0.6.180 → 0.9.28

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.
Files changed (53) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +116 -32
  3. package/index.ts +26 -2
  4. package/lib/exports.d.ts +2 -0
  5. package/lib/exports.js +3 -0
  6. package/lib/index.d.ts +27 -0
  7. package/lib/index.js +26 -1595
  8. package/lib/src/_logging.d.ts +10 -0
  9. package/lib/src/_logging.js +38 -0
  10. package/lib/src/_profile-core.d.ts +28 -0
  11. package/lib/src/_profile-core.js +216 -0
  12. package/lib/src/_profile.d.ts +15 -0
  13. package/lib/src/_profile.js +236 -0
  14. package/lib/src/databricks-auth.d.ts +11 -0
  15. package/lib/src/databricks-auth.js +314 -0
  16. package/lib/src/databricks-cli.d.ts +28 -0
  17. package/lib/src/databricks-cli.js +239 -0
  18. package/lib/src/errors.d.ts +7 -0
  19. package/lib/src/errors.js +14 -0
  20. package/lib/src/generated/databricks-cli-assets.json +33 -0
  21. package/lib/src/http-client.d.ts +23 -0
  22. package/lib/src/http-client.js +116 -0
  23. package/lib/src/lifecycle.d.ts +26 -0
  24. package/lib/src/lifecycle.js +229 -0
  25. package/lib/src/node-storage.d.ts +20 -0
  26. package/lib/src/node-storage.js +207 -0
  27. package/lib/src/personal-access-token.d.ts +11 -0
  28. package/lib/src/personal-access-token.js +30 -0
  29. package/lib/src/service-principal.d.ts +24 -0
  30. package/lib/src/service-principal.js +69 -0
  31. package/lib/src/storage.d.ts +20 -0
  32. package/lib/src/storage.js +98 -0
  33. package/lib/src/types.d.ts +157 -0
  34. package/lib/src/types.js +67 -0
  35. package/lib/tsconfig.tsbuildinfo +1 -0
  36. package/package.json +39 -16
  37. package/src/_logging.ts +42 -0
  38. package/src/_profile-core.ts +258 -0
  39. package/src/_profile.ts +319 -0
  40. package/src/databricks-auth.ts +416 -0
  41. package/src/databricks-cli.ts +298 -0
  42. package/src/errors.ts +16 -0
  43. package/src/generated/databricks-cli-assets.json +33 -0
  44. package/src/http-client.ts +147 -0
  45. package/src/lifecycle.ts +239 -0
  46. package/src/node-storage.ts +230 -0
  47. package/src/personal-access-token.ts +34 -0
  48. package/src/service-principal.ts +96 -0
  49. package/src/storage.ts +104 -0
  50. package/src/types.ts +188 -0
  51. package/src/_bindings-ffi.ts +0 -715
  52. package/src/_bindings.ts +0 -1794
  53. package/src/bindings.ts +0 -12
@@ -0,0 +1,236 @@
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=
@@ -0,0 +1,11 @@
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>;