@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,10 @@
1
+ import * as log from "@dbx-tools/shared-core/log";
2
+ import type { Token } from "./types.ts";
3
+ /** Auth logger with a stable capability-specific tag. */
4
+ export declare function authLogger(scope: string): log.Logger;
5
+ /** Stable non-secret identifier for a credential cache key. */
6
+ export declare function credentialId(key: string): string;
7
+ /** Secret-free token lifecycle metadata for debug output. */
8
+ export declare function tokenMetadata(token: Token | undefined, now?: Date): Record<string, unknown>;
9
+ /** Failure classification without serializing error messages or causes. */
10
+ export declare function failureMetadata(cause: unknown): Record<string, unknown>;
@@ -0,0 +1,38 @@
1
+ import * as hash from "@dbx-tools/shared-core/hash";
2
+ import * as log from "@dbx-tools/shared-core/log";
3
+ import { AuthError } from "./errors.js";
4
+ /** Auth logger with a stable capability-specific tag. */
5
+ export function authLogger(scope) {
6
+ return log.logger(`auth:${scope}`);
7
+ }
8
+ /** Stable non-secret identifier for a credential cache key. */
9
+ export function credentialId(key) {
10
+ return hash.fnvHash(key);
11
+ }
12
+ /** Secret-free token lifecycle metadata for debug output. */
13
+ export function tokenMetadata(token, now = new Date()) {
14
+ if (!token)
15
+ return { present: false };
16
+ const expiryMs = token.expiry ? Date.parse(token.expiry) : undefined;
17
+ return {
18
+ present: true,
19
+ tokenType: token.tokenType,
20
+ scopeCount: token.scopes.length,
21
+ hasRefreshToken: Boolean(token.refreshToken),
22
+ hasExpiry: Boolean(token.expiry),
23
+ ...(expiryMs !== undefined && Number.isFinite(expiryMs)
24
+ ? {
25
+ expired: expiryMs <= now.getTime(),
26
+ expiresInSeconds: Math.round((expiryMs - now.getTime()) / 1000),
27
+ }
28
+ : {}),
29
+ };
30
+ }
31
+ /** Failure classification without serializing error messages or causes. */
32
+ export function failureMetadata(cause) {
33
+ return {
34
+ name: cause instanceof Error ? cause.name : typeof cause,
35
+ ...(cause instanceof AuthError ? { kind: cause.kind } : {}),
36
+ };
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2xvZ2dpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX2xvZ2dpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLElBQUksTUFBTSw2QkFBNkIsQ0FBQztBQUNwRCxPQUFPLEtBQUssR0FBRyxNQUFNLDRCQUE0QixDQUFDO0FBRWxELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFHeEMseURBQXlEO0FBQ3pELE1BQU0sVUFBVSxVQUFVLENBQUMsS0FBYTtJQUN0QyxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCwrREFBK0Q7QUFDL0QsTUFBTSxVQUFVLFlBQVksQ0FBQyxHQUFXO0lBQ3RDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsNkRBQTZEO0FBQzdELE1BQU0sVUFBVSxhQUFhLENBQUMsS0FBd0IsRUFBRSxHQUFHLEdBQUcsSUFBSSxJQUFJLEVBQUU7SUFDdEUsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxDQUFDO0lBQ3RDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDckUsT0FBTztRQUNMLE9BQU8sRUFBRSxJQUFJO1FBQ2IsU0FBUyxFQUFFLEtBQUssQ0FBQyxTQUFTO1FBQzFCLFVBQVUsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU07UUFDL0IsZUFBZSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQzVDLFNBQVMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUNoQyxHQUFHLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztZQUNyRCxDQUFDLENBQUM7Z0JBQ0UsT0FBTyxFQUFFLFFBQVEsSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFO2dCQUNsQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQzthQUNoRTtZQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDUixDQUFDO0FBQ0osQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWM7SUFDNUMsT0FBTztRQUNMLElBQUksRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUs7UUFDeEQsR0FBRyxDQUFDLEtBQUssWUFBWSxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0tBQzVELENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaGFzaCBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9oYXNoXCI7XG5pbXBvcnQgKiBhcyBsb2cgZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmUvbG9nXCI7XG5cbmltcG9ydCB7IEF1dGhFcnJvciB9IGZyb20gXCIuL2Vycm9ycy50c1wiO1xuaW1wb3J0IHR5cGUgeyBUb2tlbiB9IGZyb20gXCIuL3R5cGVzLnRzXCI7XG5cbi8qKiBBdXRoIGxvZ2dlciB3aXRoIGEgc3RhYmxlIGNhcGFiaWxpdHktc3BlY2lmaWMgdGFnLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF1dGhMb2dnZXIoc2NvcGU6IHN0cmluZyk6IGxvZy5Mb2dnZXIge1xuICByZXR1cm4gbG9nLmxvZ2dlcihgYXV0aDoke3Njb3BlfWApO1xufVxuXG4vKiogU3RhYmxlIG5vbi1zZWNyZXQgaWRlbnRpZmllciBmb3IgYSBjcmVkZW50aWFsIGNhY2hlIGtleS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVkZW50aWFsSWQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaGFzaC5mbnZIYXNoKGtleSk7XG59XG5cbi8qKiBTZWNyZXQtZnJlZSB0b2tlbiBsaWZlY3ljbGUgbWV0YWRhdGEgZm9yIGRlYnVnIG91dHB1dC4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbk1ldGFkYXRhKHRva2VuOiBUb2tlbiB8IHVuZGVmaW5lZCwgbm93ID0gbmV3IERhdGUoKSk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgaWYgKCF0b2tlbikgcmV0dXJuIHsgcHJlc2VudDogZmFsc2UgfTtcbiAgY29uc3QgZXhwaXJ5TXMgPSB0b2tlbi5leHBpcnkgPyBEYXRlLnBhcnNlKHRva2VuLmV4cGlyeSkgOiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgcHJlc2VudDogdHJ1ZSxcbiAgICB0b2tlblR5cGU6IHRva2VuLnRva2VuVHlwZSxcbiAgICBzY29wZUNvdW50OiB0b2tlbi5zY29wZXMubGVuZ3RoLFxuICAgIGhhc1JlZnJlc2hUb2tlbjogQm9vbGVhbih0b2tlbi5yZWZyZXNoVG9rZW4pLFxuICAgIGhhc0V4cGlyeTogQm9vbGVhbih0b2tlbi5leHBpcnkpLFxuICAgIC4uLihleHBpcnlNcyAhPT0gdW5kZWZpbmVkICYmIE51bWJlci5pc0Zpbml0ZShleHBpcnlNcylcbiAgICAgID8ge1xuICAgICAgICAgIGV4cGlyZWQ6IGV4cGlyeU1zIDw9IG5vdy5nZXRUaW1lKCksXG4gICAgICAgICAgZXhwaXJlc0luU2Vjb25kczogTWF0aC5yb3VuZCgoZXhwaXJ5TXMgLSBub3cuZ2V0VGltZSgpKSAvIDEwMDApLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cblxuLyoqIEZhaWx1cmUgY2xhc3NpZmljYXRpb24gd2l0aG91dCBzZXJpYWxpemluZyBlcnJvciBtZXNzYWdlcyBvciBjYXVzZXMuICovXG5leHBvcnQgZnVuY3Rpb24gZmFpbHVyZU1ldGFkYXRhKGNhdXNlOiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGNhdXNlIGluc3RhbmNlb2YgRXJyb3IgPyBjYXVzZS5uYW1lIDogdHlwZW9mIGNhdXNlLFxuICAgIC4uLihjYXVzZSBpbnN0YW5jZW9mIEF1dGhFcnJvciA/IHsga2luZDogY2F1c2Uua2luZCB9IDoge30pLFxuICB9O1xufVxuIl19
@@ -0,0 +1,28 @@
1
+ import { AuthKind, TargetKind } from "./types.ts";
2
+ export declare const SETTINGS_SECTION = "__settings__";
3
+ export type Environment = Readonly<Record<string, string | undefined>>;
4
+ export type IniConfig = Map<string, Map<string, string>>;
5
+ export interface RawProfile {
6
+ host?: string;
7
+ accountId?: string;
8
+ workspaceId?: string;
9
+ clientId?: string;
10
+ clientSecret?: string;
11
+ accessToken?: string;
12
+ groupId?: string;
13
+ scopes?: string;
14
+ authType?: string;
15
+ }
16
+ /** Parse Databricks INI text through the maintained `ini` package. */
17
+ export declare function parseDatabricksConfig(source: string): IniConfig;
18
+ export declare function loadRawProfile(config: IniConfig | undefined, name: string): RawProfile;
19
+ export declare function resolveProfileName(requested: string | undefined, explicit: boolean, config: IniConfig | undefined, preferUserToMachine: boolean): string;
20
+ /** Normalize Databricks hosts and require TLS outside loopback development. */
21
+ export declare function normalizeHost(value: string | undefined, profile?: string): string;
22
+ export declare function resolveAuthKind(authType: string | undefined, clientId: string | undefined, clientSecret: string | undefined, accessToken: string | undefined): AuthKind;
23
+ export declare function requestOboToken(headers?: Record<string, string>, headerName?: string): string | undefined;
24
+ export declare function inferTarget(host: string | undefined, accountId: string | undefined): TargetKind;
25
+ export declare function parseTarget(value: string): TargetKind;
26
+ export declare function cleanList(values: readonly string[]): string[];
27
+ export declare function nonempty(value: string | undefined): string | undefined;
28
+ export declare function missing(profile: string, field: string): never;
@@ -0,0 +1,216 @@
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==
@@ -0,0 +1,15 @@
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[];