@dbx-tools/auth 0.9.31 → 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 (73) 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} +4 -6
  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} +24 -48
  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 +109 -0
  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/generated/databricks-cli-assets.json +0 -33
  55. package/lib/src/http-client.d.ts +0 -23
  56. package/lib/src/http-client.js +0 -116
  57. package/lib/src/lifecycle.js +0 -229
  58. package/lib/src/node-storage.d.ts +0 -20
  59. package/lib/src/node-storage.js +0 -207
  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 -98
  63. package/lib/src/types.d.ts +0 -157
  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/generated/databricks-cli-assets.json +0 -33
  70. package/src/http-client.ts +0 -147
  71. package/src/node-storage.ts +0 -230
  72. package/src/storage.ts +0 -104
  73. package/src/types.ts +0 -188
@@ -1,216 +0,0 @@
1
- import { parse as parseIni } from "ini";
2
- import { authLogger } from "./_logging.js";
3
- import { AuthError } from "./errors.js";
4
- import { AUTH_TYPE_APP_OBO, AUTH_TYPE_APP_SP, AuthKind, DEFAULT_ACCESS_TOKEN_HEADER, TargetKind, } from "./types.js";
5
- const logger = authLogger("profile-selection");
6
- export const SETTINGS_SECTION = "__settings__";
7
- /** Parse Databricks INI text through the maintained `ini` package. */
8
- export function parseDatabricksConfig(source) {
9
- let parsed;
10
- try {
11
- parsed = parseIni(source);
12
- }
13
- catch (cause) {
14
- throw new AuthError("config", "Databricks configuration is not valid INI", { cause });
15
- }
16
- const config = new Map();
17
- for (const [name, value] of Object.entries(parsed)) {
18
- if (!name.trim() || !isRecord(value))
19
- throw new AuthError("config", "Databricks configuration values must belong to a profile");
20
- const section = new Map();
21
- for (const [key, entry] of Object.entries(value)) {
22
- if (entry === undefined || entry === null)
23
- continue;
24
- section.set(key.trim().toLowerCase(), String(entry).trim());
25
- }
26
- config.set(name.trim(), section);
27
- }
28
- return config;
29
- }
30
- export function loadRawProfile(config, name) {
31
- const section = config?.get(name);
32
- return {
33
- host: section?.get("host"),
34
- accountId: section?.get("account_id"),
35
- workspaceId: section?.get("workspace_id"),
36
- clientId: section?.get("client_id"),
37
- clientSecret: section?.get("client_secret"),
38
- accessToken: section?.get("token"),
39
- groupId: section?.get("group_id"),
40
- scopes: section?.get("scopes"),
41
- authType: nonempty(section?.get("auth_type"))?.toLowerCase(),
42
- };
43
- }
44
- export function resolveProfileName(requested, explicit, config, preferUserToMachine) {
45
- let selected = requested;
46
- let source = requested ? "requested" : undefined;
47
- if (!selected) {
48
- selected = nonempty(config?.get(SETTINGS_SECTION)?.get("default_profile"));
49
- if (selected)
50
- source = "settings-default";
51
- }
52
- if (!selected && config?.has("DEFAULT")) {
53
- selected = "DEFAULT";
54
- source = "default-section";
55
- }
56
- if (!selected) {
57
- const profiles = [...(config?.keys() ?? [])].filter((name) => name !== SETTINGS_SECTION);
58
- if (profiles.length === 1) {
59
- selected = profiles[0];
60
- source = "sole-profile";
61
- }
62
- }
63
- if (!selected) {
64
- selected = "DEFAULT";
65
- source = "fallback";
66
- }
67
- if (selected === SETTINGS_SECTION)
68
- throw new AuthError("config", `${SETTINGS_SECTION} is reserved`);
69
- if (explicit || !preferUserToMachine || !config) {
70
- logger.debug("selected Databricks profile", {
71
- profile: selected,
72
- source,
73
- explicit,
74
- preferUserToMachine,
75
- });
76
- return selected;
77
- }
78
- const current = loadRawProfile(config, selected);
79
- if (!isM2mProfile(current) || !current.host) {
80
- logger.debug("selected Databricks profile", {
81
- profile: selected,
82
- source,
83
- explicit,
84
- preferUserToMachine,
85
- });
86
- return selected;
87
- }
88
- const matches = [...config.keys()].filter((name) => {
89
- if (name === selected || name === SETTINGS_SECTION)
90
- return false;
91
- const candidate = loadRawProfile(config, name);
92
- return candidate.authType === "databricks-cli" && sameTarget(current, candidate);
93
- });
94
- const preferred = matches.length === 1 ? matches[0] : selected;
95
- logger.debug("selected Databricks profile", {
96
- profile: preferred,
97
- source: preferred === selected ? source : "matching-cli-profile",
98
- originalProfile: preferred === selected ? undefined : selected,
99
- explicit,
100
- preferUserToMachine,
101
- matchingCliProfiles: matches.length,
102
- });
103
- return preferred;
104
- }
105
- /** Normalize Databricks hosts and require TLS outside loopback development. */
106
- export function normalizeHost(value, profile = "DEFAULT") {
107
- const selected = nonempty(value);
108
- if (!selected)
109
- throw new AuthError("config", `Profile ${profile} has no host`);
110
- const withScheme = /^https?:\/\//i.test(selected) ? selected : `https://${selected}`;
111
- let url;
112
- try {
113
- url = new URL(withScheme);
114
- }
115
- catch (cause) {
116
- throw new AuthError("config", `Profile ${profile} has an invalid host`, { cause });
117
- }
118
- if (url.protocol !== "https:" && url.hostname !== "localhost" && url.hostname !== "127.0.0.1") {
119
- throw new AuthError("config", "Databricks host must use HTTPS");
120
- }
121
- return url.toString().replace(/\/$/, "");
122
- }
123
- export function resolveAuthKind(authType, clientId, clientSecret, accessToken) {
124
- switch (authType) {
125
- case "databricks-cli":
126
- case "oauth-u2m":
127
- return AuthKind.UserToMachine;
128
- case "oauth-m2m":
129
- if (!clientId || !clientSecret)
130
- throw new AuthError("config", "oauth-m2m requires client_id and client_secret");
131
- return AuthKind.MachineToMachine;
132
- case "pat":
133
- if (!accessToken)
134
- throw new AuthError("config", "pat requires token");
135
- return AuthKind.PersonalAccessToken;
136
- case AUTH_TYPE_APP_OBO:
137
- case "app-obo":
138
- if (!accessToken)
139
- throw new AuthError("config", "app_obo requires the configured access token header");
140
- return AuthKind.AppOnBehalfOf;
141
- case AUTH_TYPE_APP_SP:
142
- case "app-sp":
143
- if (!clientId || !clientSecret)
144
- throw new AuthError("config", "app_sp requires client id and secret");
145
- return AuthKind.AppServicePrincipal;
146
- case undefined:
147
- if (clientId && clientSecret)
148
- return AuthKind.MachineToMachine;
149
- if (clientSecret)
150
- throw new AuthError("config", "oauth-m2m client_secret requires client_id");
151
- return accessToken ? AuthKind.PersonalAccessToken : AuthKind.UserToMachine;
152
- default:
153
- throw new AuthError("config", `Authentication type ${authType} is not supported`);
154
- }
155
- }
156
- export function requestOboToken(headers, headerName = DEFAULT_ACCESS_TOKEN_HEADER) {
157
- const entry = Object.entries(headers ?? {}).find(([name]) => name.toLowerCase() === headerName.toLowerCase());
158
- const value = nonempty(entry?.[1]);
159
- if (!value)
160
- return undefined;
161
- if (headerName.toLowerCase() !== DEFAULT_ACCESS_TOKEN_HEADER)
162
- return value;
163
- const [scheme, ...parts] = value.split(/\s+/);
164
- return scheme?.toLowerCase() === "bearer" ? nonempty(parts.join(" ")) : undefined;
165
- }
166
- export function inferTarget(host, accountId) {
167
- if (accountId && host) {
168
- try {
169
- if (new URL(normalizeHost(host)).hostname === "accounts.cloud.databricks.com")
170
- return TargetKind.Account;
171
- }
172
- catch { }
173
- }
174
- return TargetKind.Workspace;
175
- }
176
- export function parseTarget(value) {
177
- switch (value.trim().toLowerCase()) {
178
- case TargetKind.Workspace:
179
- return TargetKind.Workspace;
180
- case TargetKind.Account:
181
- return TargetKind.Account;
182
- case TargetKind.Unified:
183
- return TargetKind.Unified;
184
- default:
185
- throw new AuthError("config", "Target must be workspace, account, or unified");
186
- }
187
- }
188
- export function cleanList(values) {
189
- return [...new Set(values.map((value) => value.trim()).filter(Boolean))];
190
- }
191
- export function nonempty(value) {
192
- const selected = value?.trim();
193
- return selected ? selected : undefined;
194
- }
195
- export function missing(profile, field) {
196
- throw new AuthError("config", `Profile ${profile} requires ${field}`);
197
- }
198
- function sameTarget(left, right) {
199
- try {
200
- if (normalizeHost(left.host) !== normalizeHost(right.host))
201
- return false;
202
- }
203
- catch {
204
- return false;
205
- }
206
- return ((!left.accountId || left.accountId === right.accountId) &&
207
- (!left.workspaceId || left.workspaceId === right.workspaceId));
208
- }
209
- function isM2mProfile(profile) {
210
- return (profile.authType === "oauth-m2m" ||
211
- (!profile.authType && Boolean(profile.clientId && profile.clientSecret)));
212
- }
213
- function isRecord(value) {
214
- return Boolean(value) && typeof value === "object" && !Array.isArray(value);
215
- }
216
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX3Byb2ZpbGUtY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fcHJvZmlsZS1jb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLElBQUksUUFBUSxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBRXhDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLGdCQUFnQixFQUNoQixRQUFRLEVBQ1IsMkJBQTJCLEVBQzNCLFVBQVUsR0FDWCxNQUFNLFlBQVksQ0FBQztBQUVwQixNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxjQUFjLENBQUM7QUFpQi9DLHNFQUFzRTtBQUN0RSxNQUFNLFVBQVUscUJBQXFCLENBQUMsTUFBYztJQUNsRCxJQUFJLE1BQStCLENBQUM7SUFDcEMsSUFBSSxDQUFDO1FBQ0gsTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQTRCLENBQUM7SUFDdkQsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixNQUFNLElBQUksU0FBUyxDQUFDLFFBQVEsRUFBRSwyQ0FBMkMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDeEYsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFjLElBQUksR0FBRyxFQUFFLENBQUM7SUFDcEMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztZQUNsQyxNQUFNLElBQUksU0FBUyxDQUFDLFFBQVEs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QUN6RSxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLEtBQWM7SUFDOUIsT0FBTyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcGFyc2UgYXMgcGFyc2VJbmkgfSBmcm9tIFwiaW5pXCI7XG5cbmltcG9ydCB7IGF1dGhMb2dnZXIgfSBmcm9tIFwiLi9fbG9nZ2luZy50c1wiO1xuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLnRzXCI7XG5pbXBvcnQge1xuICBBVVRIX1RZUEVfQVBQX09CTyxcbiAgQVVUSF9UWVBFX0FQUF9TUCxcbiAgQXV0aEtpbmQsXG4gIERFRkFVTFRfQUNDRVNTX1RPS0VOX0hFQURFUixcbiAgVGFyZ2V0S2luZCxcbn0gZnJvbSBcIi4vdHlwZXMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gYXV0aExvZ2dlcihcInByb2ZpbGUtc2VsZWN0aW9uXCIpO1xuXG5leHBvcnQgY29uc3QgU0VUVElOR1NfU0VDVElPTiA9IFwiX19zZXR0aW5nc19fXCI7XG5cbmV4cG9ydCB0eXBlIEVudmlyb25tZW50ID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj47XG5leHBvcnQgdHlwZSBJbmlDb25maWcgPSBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBzdHJpbmc+PjtcblxuZXhwb3J0IGludGVyZmFjZSBSYXdQcm9maWxlIHtcbiAgaG9zdD86IHN0cmluZztcbiAgYWNjb3VudElkPzogc3RyaW5nO1xuICB3b3Jrc3BhY2VJZD86IHN0cmluZztcbiAgY2xpZW50SWQ/OiBzdHJpbmc7XG4gIGNsaWVudFNlY3JldD86IHN0cmluZztcbiAgYWNjZXNzVG9rZW4/OiBzdHJpbmc7XG4gIGdyb3VwSWQ/OiBzdHJpbmc7XG4gIHNjb3Blcz86IHN0cmluZztcbiAgYXV0aFR5cGU/OiBzdHJpbmc7XG59XG5cbi8qKiBQYXJzZSBEYXRhYnJpY2tzIElOSSB0ZXh0IHRocm91Z2ggdGhlIG1haW50YWluZWQgYGluaWAgcGFja2FnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURhdGFicmlja3NDb25maWcoc291cmNlOiBzdHJpbmcpOiBJbmlDb25maWcge1xuICBsZXQgcGFyc2VkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBwYXJzZUluaShzb3VyY2UpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9IGNhdGNoIChjYXVzZSkge1xuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJEYXRhYnJpY2tzIGNvbmZpZ3VyYXRpb24gaXMgbm90IHZhbGlkIElOSVwiLCB7IGNhdXNlIH0pO1xuICB9XG4gIGNvbnN0IGNvbmZpZzogSW5pQ29uZmlnID0gbmV3IE1hcCgpO1xuICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VkKSkge1xuICAgIGlmICghbmFtZS50cmltKCkgfHwgIWlzUmVjb3JkKHZhbHVlKSlcbiAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJEYXRhYnJpY2tzIGNvbmZpZ3VyYXRpb24gdmFsdWVzIG11c3QgYmVsb25nIHRvIGEgcHJvZmlsZVwiKTtcbiAgICBjb25zdCBzZWN0aW9uID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZSkpIHtcbiAgICAgIGlmIChlbnRyeSA9PT0gdW5kZWZpbmVkIHx8IGVudHJ5ID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgIHNlY3Rpb24uc2V0KGtleS50cmltKCkudG9Mb3dlckNhc2UoKSwgU3RyaW5nKGVudHJ5KS50cmltKCkpO1xuICAgIH1cbiAgICBjb25maWcuc2V0KG5hbWUudHJpbSgpLCBzZWN0aW9uKTtcbiAgfVxuICByZXR1cm4gY29uZmlnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZFJhd1Byb2ZpbGUoY29uZmlnOiBJbmlDb25maWcgfCB1bmRlZmluZWQsIG5hbWU6IHN0cmluZyk6IFJhd1Byb2ZpbGUge1xuICBjb25zdCBzZWN0aW9uID0gY29uZmlnPy5nZXQobmFtZSk7XG4gIHJldHVybiB7XG4gICAgaG9zdDogc2VjdGlvbj8uZ2V0KFwiaG9zdFwiKSxcbiAgICBhY2NvdW50SWQ6IHNlY3Rpb24/LmdldChcImFjY291bnRfaWRcIiksXG4gICAgd29ya3NwYWNlSWQ6IHNlY3Rpb24/LmdldChcIndvcmtzcGFjZV9pZFwiKSxcbiAgICBjbGllbnRJZDogc2VjdGlvbj8uZ2V0KFwiY2xpZW50X2lkXCIpLFxuICAgIGNsaWVudFNlY3JldDogc2VjdGlvbj8uZ2V0KFwiY2xpZW50X3NlY3JldFwiKSxcbiAgICBhY2Nlc3NUb2tlbjogc2VjdGlvbj8uZ2V0KFwidG9rZW5cIiksXG4gICAgZ3JvdXBJZDogc2VjdGlvbj8uZ2V0KFwiZ3JvdXBfaWRcIiksXG4gICAgc2NvcGVzOiBzZWN0aW9uPy5nZXQoXCJzY29wZXNcIiksXG4gICAgYXV0aFR5cGU6IG5vbmVtcHR5KHNlY3Rpb24/LmdldChcImF1dGhfdHlwZVwiKSk/LnRvTG93ZXJDYXNlKCksXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUHJvZmlsZU5hbWUoXG4gIHJlcXVlc3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBleHBsaWNpdDogYm9vbGVhbixcbiAgY29uZmlnOiBJbmlDb25maWcgfCB1bmRlZmluZWQsXG4gIHByZWZlclVzZXJUb01hY2hpbmU6IGJvb2xlYW4sXG4pOiBzdHJpbmcge1xuICBsZXQgc2VsZWN0ZWQgPSByZXF1ZXN0ZWQ7XG4gIGxldCBzb3VyY2UgPSByZXF1ZXN0ZWQgPyBcInJlcXVlc3RlZFwiIDogdW5kZWZpbmVkO1xuICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgc2VsZWN0ZWQgPSBub25lbXB0eShjb25maWc/LmdldChTRVRUSU5HU19TRUNUSU9OKT8uZ2V0KFwiZGVmYXVsdF9wcm9maWxlXCIpKTtcbiAgICBpZiAoc2VsZWN0ZWQpIHNvdXJjZSA9IFwic2V0dGluZ3MtZGVmYXVsdFwiO1xuICB9XG4gIGlmICghc2VsZWN0ZWQgJiYgY29uZmlnPy5oYXMoXCJERUZBVUxUXCIpKSB7XG4gICAgc2VsZWN0ZWQgPSBcIkRFRkFVTFRcIjtcbiAgICBzb3VyY2UgPSBcImRlZmF1bHQtc2VjdGlvblwiO1xuICB9XG4gIGlmICghc2VsZWN0ZWQpIHtcbiAgICBjb25zdCBwcm9maWxlcyA9IFsuLi4oY29uZmlnPy5rZXlzKCkgPz8gW10pXS5maWx0ZXIoKG5hbWUpID0+IG5hbWUgIT09IFNFVFRJTkdTX1NFQ1RJT04pO1xuICAgIGlmIChwcm9maWxlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHNlbGVjdGVkID0gcHJvZmlsZXNbMF07XG4gICAgICBzb3VyY2UgPSBcInNvbGUtcHJvZmlsZVwiO1xuICAgIH1cbiAgfVxuICBpZiAoIXNlbGVjdGVkKSB7XG4gICAgc2VsZWN0ZWQgPSBcIkRFRkFVTFRcIjtcbiAgICBzb3VyY2UgPSBcImZhbGxiYWNrXCI7XG4gIH1cbiAgaWYgKHNlbGVjdGVkID09PSBTRVRUSU5HU19TRUNUSU9OKVxuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgYCR7U0VUVElOR1NfU0VDVElPTn0gaXMgcmVzZXJ2ZWRgKTtcbiAgaWYgKGV4cGxpY2l0IHx8ICFwcmVmZXJVc2VyVG9NYWNoaW5lIHx8ICFjb25maWcpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJzZWxlY3RlZCBEYXRhYnJpY2tzIHByb2ZpbGVcIiwge1xuICAgICAgcHJvZmlsZTogc2VsZWN0ZWQsXG4gICAgICBzb3VyY2UsXG4gICAgICBleHBsaWNpdCxcbiAgICAgIHByZWZlclVzZXJUb01hY2hpbmUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHNlbGVjdGVkO1xuICB9XG4gIGNvbnN0IGN1cnJlbnQgPSBsb2FkUmF3UHJvZmlsZShjb25maWcsIHNlbGVjdGVkKTtcbiAgaWYgKCFpc00ybVByb2ZpbGUoY3VycmVudCkgfHwgIWN1cnJlbnQuaG9zdCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIERhdGFicmlja3MgcHJvZmlsZVwiLCB7XG4gICAgICBwcm9maWxlOiBzZWxlY3RlZCxcbiAgICAgIHNvdXJjZSxcbiAgICAgIGV4cGxpY2l0LFxuICAgICAgcHJlZmVyVXNlclRvTWFjaGluZSxcbiAgICB9KTtcbiAgICByZXR1cm4gc2VsZWN0ZWQ7XG4gIH1cbiAgY29uc3QgbWF0Y2hlcyA9IFsuLi5jb25maWcua2V5cygpXS5maWx0ZXIoKG5hbWUpID0+IHtcbiAgICBpZiAobmFtZSA9PT0gc2VsZWN0ZWQgfHwgbmFtZSA9PT0gU0VUVElOR1NfU0VDVElPTikgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGxvYWRSYXdQcm9maWxlKGNvbmZpZywgbmFtZSk7XG4gICAgcmV0dXJuIGNhbmRpZGF0ZS5hdXRoVHlwZSA9PT0gXCJkYXRhYnJpY2tzLWNsaVwiICYmIHNhbWVUYXJnZXQoY3VycmVudCwgY2FuZGlkYXRlKTtcbiAgfSk7XG4gIGNvbnN0IHByZWZlcnJlZCA9IG1hdGNoZXMubGVuZ3RoID09PSAxID8gbWF0Y2hlc1swXSEgOiBzZWxlY3RlZDtcbiAgbG9nZ2VyLmRlYnVnKFwic2VsZWN0ZWQgRGF0YWJyaWNrcyBwcm9maWxlXCIsIHtcbiAgICBwcm9maWxlOiBwcmVmZXJyZWQsXG4gICAgc291cmNlOiBwcmVmZXJyZWQgPT09IHNlbGVjdGVkID8gc291cmNlIDogXCJtYXRjaGluZy1jbGktcHJvZmlsZVwiLFxuICAgIG9yaWdpbmFsUHJvZmlsZTogcHJlZmVycmVkID09PSBzZWxlY3RlZCA/IHVuZGVmaW5lZCA6IHNlbGVjdGVkLFxuICAgIGV4cGxpY2l0LFxuICAgIHByZWZlclVzZXJUb01hY2hpbmUsXG4gICAgbWF0Y2hpbmdDbGlQcm9maWxlczogbWF0Y2hlcy5sZW5ndGgsXG4gIH0pO1xuICByZXR1cm4gcHJlZmVycmVkO1xufVxuXG4vKiogTm9ybWFsaXplIERhdGFicmlja3MgaG9zdHMgYW5kIHJlcXVpcmUgVExTIG91dHNpZGUgbG9vcGJhY2sgZGV2ZWxvcG1lbnQuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplSG9zdCh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBwcm9maWxlID0gXCJERUZBVUxUXCIpOiBzdHJpbmcge1xuICBjb25zdCBzZWxlY3RlZCA9IG5vbmVtcHR5KHZhbHVlKTtcbiAgaWYgKCFzZWxlY3RlZCkgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBgUHJvZmlsZSAke3Byb2ZpbGV9IGhhcyBubyBob3N0YCk7XG4gIGNvbnN0IHdpdGhTY2hlbWUgPSAvXmh0dHBzPzpcXC9cXC8vaS50ZXN0KHNlbGVjdGVkKSA/IHNlbGVjdGVkIDogYGh0dHBzOi8vJHtzZWxlY3RlZH1gO1xuICBsZXQgdXJsOiBVUkw7XG4gIHRyeSB7XG4gICAgdXJsID0gbmV3IFVSTCh3aXRoU2NoZW1lKTtcbiAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIGBQcm9maWxlICR7cHJvZmlsZX0gaGFzIGFuIGludmFsaWQgaG9zdGAsIHsgY2F1c2UgfSk7XG4gIH1cbiAgaWYgKHVybC5wcm90b2NvbCAhPT0gXCJodHRwczpcIiAmJiB1cmwuaG9zdG5hbWUgIT09IFwibG9jYWxob3N0XCIgJiYgdXJsLmhvc3RuYW1lICE9PSBcIjEyNy4wLjAuMVwiKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBcIkRhdGFicmlja3MgaG9zdCBtdXN0IHVzZSBIVFRQU1wiKTtcbiAgfVxuICByZXR1cm4gdXJsLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwvJC8sIFwiXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUF1dGhLaW5kKFxuICBhdXRoVHlwZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjbGllbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBjbGllbnRTZWNyZXQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgYWNjZXNzVG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IEF1dGhLaW5kIHtcbiAgc3dpdGNoIChhdXRoVHlwZSkge1xuICAgIGNhc2UgXCJkYXRhYnJpY2tzLWNsaVwiOlxuICAgIGNhc2UgXCJvYXV0aC11Mm1cIjpcbiAgICAgIHJldHVybiBBdXRoS2luZC5Vc2VyVG9NYWNoaW5lO1xuICAgIGNhc2UgXCJvYXV0aC1tMm1cIjpcbiAgICAgIGlmICghY2xpZW50SWQgfHwgIWNsaWVudFNlY3JldClcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBcIm9hdXRoLW0ybSByZXF1aXJlcyBjbGllbnRfaWQgYW5kIGNsaWVudF9zZWNyZXRcIik7XG4gICAgICByZXR1cm4gQXV0aEtpbmQuTWFjaGluZVRvTWFjaGluZTtcbiAgICBjYXNlIFwicGF0XCI6XG4gICAgICBpZiAoIWFjY2Vzc1Rva2VuKSB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIFwicGF0IHJlcXVpcmVzIHRva2VuXCIpO1xuICAgICAgcmV0dXJuIEF1dGhLaW5kLlBlcnNvbmFsQWNjZXNzVG9rZW47XG4gICAgY2FzZSBBVVRIX1RZUEVfQVBQX09CTzpcbiAgICBjYXNlIFwiYXBwLW9ib1wiOlxuICAgICAgaWYgKCFhY2Nlc3NUb2tlbilcbiAgICAgICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBcImFwcF9vYm8gcmVxdWlyZXMgdGhlIGNvbmZpZ3VyZWQgYWNjZXNzIHRva2VuIGhlYWRlclwiKTtcbiAgICAgIHJldHVybiBBdXRoS2luZC5BcHBPbkJlaGFsZk9mO1xuICAgIGNhc2UgQVVUSF9UWVBFX0FQUF9TUDpcbiAgICBjYXNlIFwiYXBwLXNwXCI6XG4gICAgICBpZiAoIWNsaWVudElkIHx8ICFjbGllbnRTZWNyZXQpXG4gICAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJhcHBfc3AgcmVxdWlyZXMgY2xpZW50IGlkIGFuZCBzZWNyZXRcIik7XG4gICAgICByZXR1cm4gQXV0aEtpbmQuQXBwU2VydmljZVByaW5jaXBhbDtcbiAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgIGlmIChjbGllbnRJZCAmJiBjbGllbnRTZWNyZXQpIHJldHVybiBBdXRoS2luZC5NYWNoaW5lVG9NYWNoaW5lO1xuICAgICAgaWYgKGNsaWVudFNlY3JldCkgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNvbmZpZ1wiLCBcIm9hdXRoLW0ybSBjbGllbnRfc2VjcmV0IHJlcXVpcmVzIGNsaWVudF9pZFwiKTtcbiAgICAgIHJldHVybiBhY2Nlc3NUb2tlbiA/IEF1dGhLaW5kLlBlcnNvbmFsQWNjZXNzVG9rZW4gOiBBdXRoS2luZC5Vc2VyVG9NYWNoaW5lO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIGBBdXRoZW50aWNhdGlvbiB0eXBlICR7YXV0aFR5cGV9IGlzIG5vdCBzdXBwb3J0ZWRgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdE9ib1Rva2VuKFxuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgaGVhZGVyTmFtZSA9IERFRkFVTFRfQUNDRVNTX1RPS0VOX0hFQURFUixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGVudHJ5ID0gT2JqZWN0LmVudHJpZXMoaGVhZGVycyA/PyB7fSkuZmluZChcbiAgICAoW25hbWVdKSA9PiBuYW1lLnRvTG93ZXJDYXNlKCkgPT09IGhlYWRlck5hbWUudG9Mb3dlckNhc2UoKSxcbiAgKTtcbiAgY29uc3QgdmFsdWUgPSBub25lbXB0eShlbnRyeT8uWzFdKTtcbiAgaWYgKCF2YWx1ZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGhlYWRlck5hbWUudG9Mb3dlckNhc2UoKSAhPT0gREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSKSByZXR1cm4gdmFsdWU7XG4gIGNvbnN0IFtzY2hlbWUsIC4uLnBhcnRzXSA9IHZhbHVlLnNwbGl0KC9cXHMrLyk7XG4gIHJldHVybiBzY2hlbWU/LnRvTG93ZXJDYXNlKCkgPT09IFwiYmVhcmVyXCIgPyBub25lbXB0eShwYXJ0cy5qb2luKFwiIFwiKSkgOiB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmZlclRhcmdldChob3N0OiBzdHJpbmcgfCB1bmRlZmluZWQsIGFjY291bnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogVGFyZ2V0S2luZCB7XG4gIGlmIChhY2NvdW50SWQgJiYgaG9zdCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAobmV3IFVSTChub3JtYWxpemVIb3N0KGhvc3QpKS5ob3N0bmFtZSA9PT0gXCJhY2NvdW50cy5jbG91ZC5kYXRhYnJpY2tzLmNvbVwiKVxuICAgICAgICByZXR1cm4gVGFyZ2V0S2luZC5BY2NvdW50O1xuICAgIH0gY2F0Y2gge31cbiAgfVxuICByZXR1cm4gVGFyZ2V0S2luZC5Xb3Jrc3BhY2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVRhcmdldCh2YWx1ZTogc3RyaW5nKTogVGFyZ2V0S2luZCB7XG4gIHN3aXRjaCAodmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlIFRhcmdldEtpbmQuV29ya3NwYWNlOlxuICAgICAgcmV0dXJuIFRhcmdldEtpbmQuV29ya3NwYWNlO1xuICAgIGNhc2UgVGFyZ2V0S2luZC5BY2NvdW50OlxuICAgICAgcmV0dXJuIFRhcmdldEtpbmQuQWNjb3VudDtcbiAgICBjYXNlIFRhcmdldEtpbmQuVW5pZmllZDpcbiAgICAgIHJldHVybiBUYXJnZXRLaW5kLlVuaWZpZWQ7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjb25maWdcIiwgXCJUYXJnZXQgbXVzdCBiZSB3b3Jrc3BhY2UsIGFjY291bnQsIG9yIHVuaWZpZWRcIik7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuTGlzdCh2YWx1ZXM6IHJlYWRvbmx5IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLm5ldyBTZXQodmFsdWVzLm1hcCgodmFsdWUpID0+IHZhbHVlLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub25lbXB0eSh2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSB2YWx1ZT8udHJpbSgpO1xuICByZXR1cm4gc2VsZWN0ZWQgPyBzZWxlY3RlZCA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1pc3NpbmcocHJvZmlsZTogc3RyaW5nLCBmaWVsZDogc3RyaW5nKTogbmV2ZXIge1xuICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY29uZmlnXCIsIGBQcm9maWxlICR7cHJvZmlsZX0gcmVxdWlyZXMgJHtmaWVsZH1gKTtcbn1cblxuZnVuY3Rpb24gc2FtZVRhcmdldChsZWZ0OiBSYXdQcm9maWxlLCByaWdodDogUmF3UHJvZmlsZSk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGlmIChub3JtYWxpemVIb3N0KGxlZnQuaG9zdCkgIT09IG5vcm1hbGl6ZUhvc3QocmlnaHQuaG9zdCkpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAoXG4gICAgKCFsZWZ0LmFjY291bnRJZCB8fCBsZWZ0LmFjY291bnRJZCA9PT0gcmlnaHQuYWNjb3VudElkKSAmJlxuICAgICghbGVmdC53b3Jrc3BhY2VJZCB8fCBsZWZ0LndvcmtzcGFjZUlkID09PSByaWdodC53b3Jrc3BhY2VJZClcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNNMm1Qcm9maWxlKHByb2ZpbGU6IFJhd1Byb2ZpbGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICBwcm9maWxlLmF1dGhUeXBlID09PSBcIm9hdXRoLW0ybVwiIHx8XG4gICAgKCFwcm9maWxlLmF1dGhUeXBlICYmIEJvb2xlYW4ocHJvZmlsZS5jbGllbnRJZCAmJiBwcm9maWxlLmNsaWVudFNlY3JldCkpXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gQm9vbGVhbih2YWx1ZSkgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbiJdfQ==
@@ -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>;