@dbx-tools/auth 0.9.32 → 0.9.36

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 (72) hide show
  1. package/README.md +49 -97
  2. package/index.ts +8 -26
  3. package/lib/index.d.ts +8 -26
  4. package/lib/index.js +6 -22
  5. package/lib/src/{databricks-cli.d.ts → _databricks-cli.d.ts} +3 -7
  6. package/lib/src/_databricks-cli.js +172 -0
  7. package/lib/src/_errors.d.ts +5 -0
  8. package/lib/src/_errors.js +10 -0
  9. package/lib/src/{lifecycle.d.ts → _lifecycle.d.ts} +5 -5
  10. package/lib/src/_lifecycle.js +214 -0
  11. package/lib/src/_logging.d.ts +1 -1
  12. package/lib/src/_logging.js +2 -2
  13. package/lib/src/{personal-access-token.d.ts → _personal-access-token.d.ts} +1 -1
  14. package/lib/src/_personal-access-token.js +30 -0
  15. package/lib/src/_profile-config.d.ts +43 -0
  16. package/lib/src/_profile-config.js +443 -0
  17. package/lib/src/{service-principal.d.ts → _service-principal.d.ts} +1 -1
  18. package/lib/src/_service-principal.js +69 -0
  19. package/lib/src/{storage.d.ts → _storage.d.ts} +2 -13
  20. package/lib/src/_storage.js +94 -0
  21. package/lib/src/_types.d.ts +40 -0
  22. package/lib/src/_types.js +2 -0
  23. package/lib/src/client.d.ts +30 -0
  24. package/lib/src/client.js +223 -0
  25. package/lib/src/config.d.ts +36 -0
  26. package/lib/src/config.js +15 -0
  27. package/lib/src/profile.d.ts +11 -0
  28. package/lib/src/profile.js +21 -0
  29. package/lib/tsconfig.tsbuildinfo +1 -1
  30. package/package.json +34 -10
  31. package/src/{databricks-cli.ts → _databricks-cli.ts} +20 -109
  32. package/src/_errors.ts +11 -0
  33. package/src/{lifecycle.ts → _lifecycle.ts} +12 -40
  34. package/src/_logging.ts +2 -2
  35. package/src/{personal-access-token.ts → _personal-access-token.ts} +1 -1
  36. package/src/_profile-config.ts +545 -0
  37. package/src/{service-principal.ts → _service-principal.ts} +2 -2
  38. package/src/{storage.ts → _storage.ts} +2 -31
  39. package/src/_types.ts +45 -0
  40. package/src/client.ts +291 -0
  41. package/src/config.ts +44 -0
  42. package/src/profile.ts +33 -0
  43. package/lib/exports.d.ts +0 -2
  44. package/lib/exports.js +0 -3
  45. package/lib/src/_profile-core.d.ts +0 -28
  46. package/lib/src/_profile-core.js +0 -216
  47. package/lib/src/_profile.d.ts +0 -15
  48. package/lib/src/_profile.js +0 -236
  49. package/lib/src/databricks-auth.d.ts +0 -11
  50. package/lib/src/databricks-auth.js +0 -314
  51. package/lib/src/databricks-cli.js +0 -239
  52. package/lib/src/errors.d.ts +0 -7
  53. package/lib/src/errors.js +0 -14
  54. package/lib/src/file-storage.d.ts +0 -20
  55. package/lib/src/file-storage.js +0 -207
  56. package/lib/src/generated/databricks-cli-assets.json +0 -33
  57. package/lib/src/http-client.d.ts +0 -23
  58. package/lib/src/http-client.js +0 -116
  59. package/lib/src/lifecycle.js +0 -233
  60. package/lib/src/personal-access-token.js +0 -30
  61. package/lib/src/service-principal.js +0 -69
  62. package/lib/src/storage.js +0 -112
  63. package/lib/src/types.d.ts +0 -165
  64. package/lib/src/types.js +0 -67
  65. package/src/_profile-core.ts +0 -258
  66. package/src/_profile.ts +0 -319
  67. package/src/databricks-auth.ts +0 -416
  68. package/src/errors.ts +0 -16
  69. package/src/file-storage.ts +0 -230
  70. package/src/generated/databricks-cli-assets.json +0 -33
  71. package/src/http-client.ts +0 -147
  72. package/src/types.ts +0 -196
@@ -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[];
@@ -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>;