@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
package/README.md CHANGED
@@ -1,122 +1,74 @@
1
1
  # `@dbx-tools/auth`
2
2
 
3
- Persistent Databricks authentication for Node.js and Bun without a native
4
- binding requirement.
3
+ Databricks profile resolution and token or authentication-header production for
4
+ Node.js and Bun.
5
5
 
6
- Outside Databricks Apps, the package reads PAT credentials directly, uses direct
7
- client credentials for service principals, and delegates U2M authentication to
8
- the Databricks CLI. CLI resolution is lazy: the package checks the installed CLI
9
- only when U2M reaches token acquisition, then checksum-verifies and installs the
10
- pinned build asset through `@dbx-tools/core/bin` when needed. Inside Databricks
11
- Apps, it accepts request-scoped App OBO headers or App SP environment
12
- credentials. No browser OAuth flow is implemented.
6
+ The package resolves profile configuration, selects PAT, M2M, CLI U2M, App
7
+ service-principal, or App OBO authentication, and coordinates token acquisition
8
+ in process memory. It does not own workspace HTTP APIs or construct Databricks
9
+ SDK clients.
13
10
 
14
11
  ## Features
15
12
 
16
- - Lazy, version-checked CLI U2M outside Databricks Apps.
17
- - Direct PAT and M2M/App SP credentials.
18
- - Request-scoped App OBO authentication inside Databricks Apps.
19
- - Databricks profile parsing with `__settings__.default_profile`, `DEFAULT`, and
20
- sole-profile selection.
21
- - Optional preference for one matching CLI U2M profile over an implicit M2M
22
- default. Explicit profiles are never remapped.
23
- - Check-lock-recheck token acquisition and rejected-token refresh.
24
- - Process-memory credential storage by default, with explicit file or
25
- caller-defined storage and lock adapters.
26
- - Same-origin authorization headers and one rejected-token retry in the bundled
27
- fetch client.
28
- - Secret-free profile enumeration with explicit cache refresh.
29
-
30
- When a cached U2M credential is missing or cannot refresh, the shared lifecycle
31
- holds the credential lock, runs `databricks auth login`, and then re-reads the
32
- CLI token. Passing `false` to token or header acquisition disables this
33
- interactive fallback.
34
-
35
- ## Relationship to the Databricks Python SDK
36
-
37
- The default provider shape intentionally follows the official Python SDK:
38
-
39
- | Concern | Python SDK behavior | `@dbx-tools/auth` behavior |
40
- | ------------------ | --------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
41
- | PAT | Reads the configured token directly. | Same. |
42
- | Service principal | Uses direct OAuth client credentials. | Same, including account and workspace targets. |
43
- | U2M | Delegates token acquisition to `databricks auth token`. | Same token command, but automatically runs `databricks auth login` under the credential lock when acquisition or refresh fails and login is allowed. |
44
- | Configuration | Parses `.databrickscfg` with a standard INI parser. | Uses the maintained `ini` package, caches each absolute config path, and exposes explicit invalidation. |
45
- | Implicit profile | Uses `__settings__.default_profile`, `DEFAULT`, or a sole profile. | Same, plus an optional unique matching CLI-U2M profile preference when the selected implicit default is M2M. Explicit profiles are never remapped. |
46
- | Token coordination | Providers manage their own acquisition behavior. | Adds memory/file caching and check-lock-recheck coordination shared by Node and PythonMonkey callers. |
47
- | CLI availability | Requires a compatible CLI already installed. | Resolves lazily, reuses a compatible installed or managed CLI, and can checksum-install a pinned build outside Apps. |
48
- | Databricks Apps | Earlier App credentials normally prevent reaching the CLI; the default chain can still reach it when they are absent. | App OBO and App SP remain preferred. Standard profile/PAT/M2M/U2M resolution continues when they are absent. CLI lookup stays lazy and never installs in an App unless `installCliInApp: true` is set. |
49
-
50
- Unlike the Python SDK, this package does not implement a separate native
51
- external-browser provider. Interactive U2M remains CLI-owned so login, token
52
- format, and credential persistence stay consistent with Databricks tooling.
13
+ - Standard `.databrickscfg` parsing and default-profile selection.
14
+ - Secret-free configured profile enumeration.
15
+ - CLI-backed U2M token and login commands.
16
+ - Direct PAT, M2M, App service-principal, and request-scoped App OBO tokens.
17
+ - Check-lock-recheck token acquisition and explicit token refresh.
18
+ - Authentication headers with the resolved workspace ID when available.
19
+ - No SDK, generic HTTP client, executable installer, or persistent token cache.
20
+
21
+ CLI-backed U2M requires an available `databricks` executable or an explicit
22
+ `DATABRICKS_CLI_PATH`. The Databricks CLI remains responsible for its own login
23
+ and credential persistence.
53
24
 
54
25
  ## Basic use
55
26
 
56
27
  ```ts
57
- import { createAuthClient } from "@dbx-tools/auth";
28
+ import { client, profile } from "@dbx-tools/auth";
58
29
 
59
- const auth = await createAuthClient();
60
- const headers = await auth.authenticate();
61
- const profile = auth.profile();
62
- const namedProfile = auth.profile("DEFAULT");
63
- const profiles = auth.listProfiles();
30
+ const auth = await client.createAuthClient({ profile: "DEFAULT" });
31
+ const token = await auth.token();
32
+ const headers = await auth.headers();
33
+ const host = auth.host;
34
+ const profiles = profile.listProfiles();
64
35
  ```
65
36
 
66
- `createAuthClient()` is the package's public factory. The returned client owns
67
- token and header acquisition, the selected secret-free profile, configured
68
- profile listing, lifecycle status, refresh, logout, and same-origin request
69
- headers.
70
-
71
- `authenticate()` returns the complete request header record, including
72
- `authorization` and `x-databricks-workspace-id` when the selected profile has a
73
- `workspace_id`. It allows login when a credential is missing or cannot refresh.
74
- Pass `false` to keep the call non-interactive:
75
-
76
- ```ts
77
- const headers = await auth.authenticate(false);
78
- ```
37
+ `headers()` returns the authorization header and
38
+ `x-databricks-workspace-id` when the selected profile has a workspace ID. Pass
39
+ `{ login: false }` to token or authentication acquisition to disable
40
+ interactive login. Pass `{ refresh: true }` to bypass a reusable cached token.
79
41
 
80
- `token()` remains available when only the token record is needed.
42
+ Browser and UI code should import auth-type values, target values, profile
43
+ summaries, profile selections, and client-configuration schemas from
44
+ `@dbx-tools/shared-auth`.
81
45
 
82
- ## Portable storage
46
+ ## Consumer-owned clients
83
47
 
84
- `createAuthClient()` keeps acquired credentials in process memory by default for
85
- CLI U2M, PAT, M2M, App SP, and App OBO flows. Pass `Storage.File` as the second
86
- argument when disk persistence is explicitly required.
48
+ Capability packages should use the returned `AuthClient` directly:
87
49
 
88
50
  ```ts
89
- import { createAuthClient, DatabricksAuthOptions, Storage } from "@dbx-tools/auth";
90
-
91
- const auth = await createAuthClient(
92
- DatabricksAuthOptions.create({ profile: "DEFAULT" }),
93
- Storage.File,
94
- );
51
+ const auth = await client.createAuthClient({ profile: "DEFAULT" });
52
+ const headers = await auth.headers();
95
53
  ```
96
54
 
97
- The opt-in file store uses `node:fs` with `@dbx-tools/core/file-lock` and
98
- preserves unrelated entries in `~/.databricks/token-cache.json`.
55
+ Use those headers in a capability-specific request, or inject the token and host
56
+ into an AppKit or Databricks SDK workspace client. Keep request paths, payloads,
57
+ response parsing, and retry policy in the consuming package.
99
58
 
100
- ## Debug logging
101
-
102
- Set `LOG_LEVEL=debug` to trace profile selection, configuration caching, CLI
103
- resolution, provider choice, credential locks, cache reuse, refresh/login
104
- fallback, OAuth discovery, same-origin header decisions, and HTTP retry state.
59
+ ## Public modules
105
60
 
106
- ```sh
107
- LOG_LEVEL=debug bun run my-auth-command
108
- ```
61
+ - `client` owns `createAuthClient`, `AuthClient`, access-token results, and
62
+ token lifecycle operations.
63
+ - `config` owns secret-bearing profile options, lifecycle timing, and canonical
64
+ header names.
65
+ - `profile` owns profile resolution and listing operations.
109
66
 
110
- Debug records include profile and host metadata, storage/backend choices,
111
- header names, token expiry state, and scope counts. They never include access
112
- tokens, refresh tokens, client secrets, authorization values, raw request
113
- headers, token-cache contents, or request/response bodies.
67
+ Provider, lifecycle, lock, and storage types are private implementation details.
114
68
 
115
- ## Modules
69
+ ## Debug logging
116
70
 
117
- - `databricksAuth` provides `PersistentAuth` and Databricks provider construction.
118
- - `profile` parses and resolves Databricks configuration.
119
- - `lifecycle` implements provider-neutral token coordination.
120
- - `storage` and `nodeStorage` provide memory and file adapters.
121
- - `servicePrincipal` provides Databricks client-credentials authentication.
122
- - `httpClient` provides a small fetch-based Databricks JSON client.
71
+ Set `LOG_LEVEL=debug` to trace profile selection, provider choice, credential
72
+ locks, cache reuse, token refresh, and login fallback. Logs never include access
73
+ tokens, refresh tokens, client secrets, authorization values, raw request
74
+ headers, or request bodies.
package/index.ts CHANGED
@@ -3,29 +3,11 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/auth";
6
- export const PACKAGE_VERSION = "0.9.32";
7
- export * as databricksAuth from "./src/databricks-auth.ts";
8
- export * as databricksCli from "./src/databricks-cli.ts";
9
- export * as errors from "./src/errors.ts";
10
- export * as fileStorage from "./src/file-storage.ts";
11
- export * as httpClient from "./src/http-client.ts";
12
- export * as lifecycle from "./src/lifecycle.ts";
13
- export * as personalAccessToken from "./src/personal-access-token.ts";
14
- export * as servicePrincipal from "./src/service-principal.ts";
15
- export * as storage from "./src/storage.ts";
16
- export * as types from "./src/types.ts";
17
- export type { DatabricksAuthDependencies } from "./src/databricks-auth.ts";
18
- export { DatabricksCliProvider } from "./src/databricks-cli.ts";
19
- export type { DatabricksCliResolver, DatabricksCliResolutionOptions } from "./src/databricks-cli.ts";
20
- export { AuthError } from "./src/errors.ts";
21
- export { FileCredentialStore } from "./src/file-storage.ts";
22
- export { DatabricksClient } from "./src/http-client.ts";
23
- export type { DatabricksRequestOptions } from "./src/http-client.ts";
24
- export { TokenLifecycle } from "./src/lifecycle.ts";
25
- export { DatabricksPersonalAccessTokenProvider } from "./src/personal-access-token.ts";
26
- export { DatabricksServicePrincipalProvider } from "./src/service-principal.ts";
27
- export type { DatabricksServicePrincipalConfig } from "./src/service-principal.ts";
28
- export { MemoryLockAdapter, MemoryCredentialStore } from "./src/storage.ts";
29
- export { AuthKind, TargetKind, Storage, FileLayout, DEFAULT_CLIENT_ID, DEFAULT_CONFIG_FILE, DEFAULT_ACCOUNTS_HOST, DEFAULT_ACCESS_TOKEN_HEADER, WORKSPACE_ID_HEADER, AUTH_TYPE_APP_OBO, AUTH_TYPE_APP_SP } from "./src/types.ts";
30
- export type { Token, AccessToken, DatabricksProfileSummary, DatabricksAuthStatus, DatabricksProfile, LockAdapter, CredentialStore, TokenProvider, AuthClient } from "./src/types.ts";
31
- export * from "./exports.ts";
6
+ export const PACKAGE_VERSION = "0.9.36";
7
+ export * as client from "./src/client.ts";
8
+ export * as config from "./src/config.ts";
9
+ export * as profile from "./src/profile.ts";
10
+ export type { AccessToken, TokenOptions, AuthClient, DatabricksAuthDependencies } from "./src/client.ts";
11
+ export { AUTH_DEFAULTS, DEFAULT_CLIENT_ID, DEFAULT_CONFIG_FILE, DEFAULT_ACCESS_TOKEN_HEADER, WORKSPACE_ID_HEADER } from "./src/config.ts";
12
+ export type { AuthOptions, DatabricksAuthOptions } from "./src/config.ts";
13
+ export type { ListProfilesOptions } from "./src/profile.ts";
package/lib/index.d.ts CHANGED
@@ -1,27 +1,9 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/auth";
2
- export declare const PACKAGE_VERSION = "0.9.32";
3
- export * as databricksAuth from "./src/databricks-auth.ts";
4
- export * as databricksCli from "./src/databricks-cli.ts";
5
- export * as errors from "./src/errors.ts";
6
- export * as fileStorage from "./src/file-storage.ts";
7
- export * as httpClient from "./src/http-client.ts";
8
- export * as lifecycle from "./src/lifecycle.ts";
9
- export * as personalAccessToken from "./src/personal-access-token.ts";
10
- export * as servicePrincipal from "./src/service-principal.ts";
11
- export * as storage from "./src/storage.ts";
12
- export * as types from "./src/types.ts";
13
- export type { DatabricksAuthDependencies } from "./src/databricks-auth.ts";
14
- export { DatabricksCliProvider } from "./src/databricks-cli.ts";
15
- export type { DatabricksCliResolver, DatabricksCliResolutionOptions } from "./src/databricks-cli.ts";
16
- export { AuthError } from "./src/errors.ts";
17
- export { FileCredentialStore } from "./src/file-storage.ts";
18
- export { DatabricksClient } from "./src/http-client.ts";
19
- export type { DatabricksRequestOptions } from "./src/http-client.ts";
20
- export { TokenLifecycle } from "./src/lifecycle.ts";
21
- export { DatabricksPersonalAccessTokenProvider } from "./src/personal-access-token.ts";
22
- export { DatabricksServicePrincipalProvider } from "./src/service-principal.ts";
23
- export type { DatabricksServicePrincipalConfig } from "./src/service-principal.ts";
24
- export { MemoryLockAdapter, MemoryCredentialStore } from "./src/storage.ts";
25
- export { AuthKind, TargetKind, Storage, FileLayout, DEFAULT_CLIENT_ID, DEFAULT_CONFIG_FILE, DEFAULT_ACCOUNTS_HOST, DEFAULT_ACCESS_TOKEN_HEADER, WORKSPACE_ID_HEADER, AUTH_TYPE_APP_OBO, AUTH_TYPE_APP_SP } from "./src/types.ts";
26
- export type { Token, AccessToken, DatabricksProfileSummary, DatabricksAuthStatus, DatabricksProfile, LockAdapter, CredentialStore, TokenProvider, AuthClient } from "./src/types.ts";
27
- export * from "./exports.ts";
2
+ export declare const PACKAGE_VERSION = "0.9.36";
3
+ export * as client from "./src/client.ts";
4
+ export * as config from "./src/config.ts";
5
+ export * as profile from "./src/profile.ts";
6
+ export type { AccessToken, TokenOptions, AuthClient, DatabricksAuthDependencies } from "./src/client.ts";
7
+ export { AUTH_DEFAULTS, DEFAULT_CLIENT_ID, DEFAULT_CONFIG_FILE, DEFAULT_ACCESS_TOKEN_HEADER, WORKSPACE_ID_HEADER } from "./src/config.ts";
8
+ export type { AuthOptions, DatabricksAuthOptions } from "./src/config.ts";
9
+ export type { ListProfilesOptions } from "./src/profile.ts";
package/lib/index.js CHANGED
@@ -2,25 +2,9 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/auth";
5
- export const PACKAGE_VERSION = "0.9.32";
6
- export * as databricksAuth from "./src/databricks-auth.js";
7
- export * as databricksCli from "./src/databricks-cli.js";
8
- export * as errors from "./src/errors.js";
9
- export * as fileStorage from "./src/file-storage.js";
10
- export * as httpClient from "./src/http-client.js";
11
- export * as lifecycle from "./src/lifecycle.js";
12
- export * as personalAccessToken from "./src/personal-access-token.js";
13
- export * as servicePrincipal from "./src/service-principal.js";
14
- export * as storage from "./src/storage.js";
15
- export * as types from "./src/types.js";
16
- export { DatabricksCliProvider } from "./src/databricks-cli.js";
17
- export { AuthError } from "./src/errors.js";
18
- export { FileCredentialStore } from "./src/file-storage.js";
19
- export { DatabricksClient } from "./src/http-client.js";
20
- export { TokenLifecycle } from "./src/lifecycle.js";
21
- export { DatabricksPersonalAccessTokenProvider } from "./src/personal-access-token.js";
22
- export { DatabricksServicePrincipalProvider } from "./src/service-principal.js";
23
- export { MemoryLockAdapter, MemoryCredentialStore } from "./src/storage.js";
24
- export { AuthKind, TargetKind, Storage, FileLayout, DEFAULT_CLIENT_ID, DEFAULT_CONFIG_FILE, DEFAULT_ACCOUNTS_HOST, DEFAULT_ACCESS_TOKEN_HEADER, WORKSPACE_ID_HEADER, AUTH_TYPE_APP_OBO, AUTH_TYPE_APP_SP } from "./src/types.js";
25
- export * from "./exports.js";
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxLQUFLLGFBQWEsTUFBTSx5QkFBeUIsQ0FBQztBQUN6RCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxtQkFBbUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0RSxPQUFPLEtBQUssZ0JBQWdCLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBRXhDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRWhFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkYsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLHFCQUFxQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxxQkFBcUIsRUFBRSwyQkFBMkIsRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRWpPLGNBQWMsY0FBYyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hdXRoXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjkuMzJcIjtcbmV4cG9ydCAqIGFzIGRhdGFicmlja3NBdXRoIGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzLWF1dGgudHNcIjtcbmV4cG9ydCAqIGFzIGRhdGFicmlja3NDbGkgZnJvbSBcIi4vc3JjL2RhdGFicmlja3MtY2xpLnRzXCI7XG5leHBvcnQgKiBhcyBlcnJvcnMgZnJvbSBcIi4vc3JjL2Vycm9ycy50c1wiO1xuZXhwb3J0ICogYXMgZmlsZVN0b3JhZ2UgZnJvbSBcIi4vc3JjL2ZpbGUtc3RvcmFnZS50c1wiO1xuZXhwb3J0ICogYXMgaHR0cENsaWVudCBmcm9tIFwiLi9zcmMvaHR0cC1jbGllbnQudHNcIjtcbmV4cG9ydCAqIGFzIGxpZmVjeWNsZSBmcm9tIFwiLi9zcmMvbGlmZWN5Y2xlLnRzXCI7XG5leHBvcnQgKiBhcyBwZXJzb25hbEFjY2Vzc1Rva2VuIGZyb20gXCIuL3NyYy9wZXJzb25hbC1hY2Nlc3MtdG9rZW4udHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZpY2VQcmluY2lwYWwgZnJvbSBcIi4vc3JjL3NlcnZpY2UtcHJpbmNpcGFsLnRzXCI7XG5leHBvcnQgKiBhcyBzdG9yYWdlIGZyb20gXCIuL3NyYy9zdG9yYWdlLnRzXCI7XG5leHBvcnQgKiBhcyB0eXBlcyBmcm9tIFwiLi9zcmMvdHlwZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc0F1dGhEZXBlbmRlbmNpZXMgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1hdXRoLnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzQ2xpUHJvdmlkZXIgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1jbGkudHNcIjtcbmV4cG9ydCB0eXBlIHsgRGF0YWJyaWNrc0NsaVJlc29sdmVyLCBEYXRhYnJpY2tzQ2xpUmVzb2x1dGlvbk9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy1jbGkudHNcIjtcbmV4cG9ydCB7IEF1dGhFcnJvciB9IGZyb20gXCIuL3NyYy9lcnJvcnMudHNcIjtcbmV4cG9ydCB7IEZpbGVDcmVkZW50aWFsU3RvcmUgfSBmcm9tIFwiLi9zcmMvZmlsZS1zdG9yYWdlLnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzQ2xpZW50IH0gZnJvbSBcIi4vc3JjL2h0dHAtY2xpZW50LnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NSZXF1ZXN0T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9odHRwLWNsaWVudC50c1wiO1xuZXhwb3J0IHsgVG9rZW5MaWZlY3ljbGUgfSBmcm9tIFwiLi9zcmMvbGlmZWN5Y2xlLnRzXCI7XG5leHBvcnQgeyBEYXRhYnJpY2tzUGVyc29uYWxBY2Nlc3NUb2tlblByb3ZpZGVyIH0gZnJvbSBcIi4vc3JjL3BlcnNvbmFsLWFjY2Vzcy10b2tlbi50c1wiO1xuZXhwb3J0IHsgRGF0YWJyaWNrc1NlcnZpY2VQcmluY2lwYWxQcm92aWRlciB9IGZyb20gXCIuL3NyYy9zZXJ2aWNlLXByaW5jaXBhbC50c1wiO1xuZXhwb3J0IHR5cGUgeyBEYXRhYnJpY2tzU2VydmljZVByaW5jaXBhbENvbmZpZyB9IGZyb20gXCIuL3NyYy9zZXJ2aWNlLXByaW5jaXBhbC50c1wiO1xuZXhwb3J0IHsgTWVtb3J5TG9ja0FkYXB0ZXIsIE1lbW9yeUNyZWRlbnRpYWxTdG9yZSB9IGZyb20gXCIuL3NyYy9zdG9yYWdlLnRzXCI7XG5leHBvcnQgeyBBdXRoS2luZCwgVGFyZ2V0S2luZCwgU3RvcmFnZSwgRmlsZUxheW91dCwgREVGQVVMVF9DTElFTlRfSUQsIERFRkFVTFRfQ09ORklHX0ZJTEUsIERFRkFVTFRfQUNDT1VOVFNfSE9TVCwgREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSLCBXT1JLU1BBQ0VfSURfSEVBREVSLCBBVVRIX1RZUEVfQVBQX09CTywgQVVUSF9UWVBFX0FQUF9TUCB9IGZyb20gXCIuL3NyYy90eXBlcy50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb2tlbiwgQWNjZXNzVG9rZW4sIERhdGFicmlja3NQcm9maWxlU3VtbWFyeSwgRGF0YWJyaWNrc0F1dGhTdGF0dXMsIERhdGFicmlja3NQcm9maWxlLCBMb2NrQWRhcHRlciwgQ3JlZGVudGlhbFN0b3JlLCBUb2tlblByb3ZpZGVyLCBBdXRoQ2xpZW50IH0gZnJvbSBcIi4vc3JjL3R5cGVzLnRzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9leHBvcnRzLnRzXCI7XG4iXX0=
5
+ export const PACKAGE_VERSION = "0.9.36";
6
+ export * as client from "./src/client.js";
7
+ export * as config from "./src/config.js";
8
+ export * as profile from "./src/profile.js";
9
+ export { AUTH_DEFAULTS, DEFAULT_CLIENT_ID, DEFAULT_CONFIG_FILE, DEFAULT_ACCESS_TOKEN_HEADER, WORKSPACE_ID_HEADER } from "./src/config.js";
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQztBQUNwRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsUUFBUSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsMkJBQTJCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvYXV0aFwiO1xuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfVkVSU0lPTiA9IFwiMC45LjM2XCI7XG5leHBvcnQgKiBhcyBjbGllbnQgZnJvbSBcIi4vc3JjL2NsaWVudC50c1wiO1xuZXhwb3J0ICogYXMgY29uZmlnIGZyb20gXCIuL3NyYy9jb25maWcudHNcIjtcbmV4cG9ydCAqIGFzIHByb2ZpbGUgZnJvbSBcIi4vc3JjL3Byb2ZpbGUudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWNjZXNzVG9rZW4sIFRva2VuT3B0aW9ucywgQXV0aENsaWVudCwgRGF0YWJyaWNrc0F1dGhEZXBlbmRlbmNpZXMgfSBmcm9tIFwiLi9zcmMvY2xpZW50LnRzXCI7XG5leHBvcnQgeyBBVVRIX0RFRkFVTFRTLCBERUZBVUxUX0NMSUVOVF9JRCwgREVGQVVMVF9DT05GSUdfRklMRSwgREVGQVVMVF9BQ0NFU1NfVE9LRU5fSEVBREVSLCBXT1JLU1BBQ0VfSURfSEVBREVSIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdXRoT3B0aW9ucywgRGF0YWJyaWNrc0F1dGhPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0IHR5cGUgeyBMaXN0UHJvZmlsZXNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3Byb2ZpbGUudHNcIjtcbiJdfQ==
@@ -1,12 +1,8 @@
1
- import type { Token, TokenProvider } from "./types.ts";
1
+ import type { Token, TokenProvider } from "./_types.ts";
2
2
  /** Deferred Databricks CLI lookup used by U2M token acquisition. */
3
3
  export type DatabricksCliResolver = () => Promise<string | undefined>;
4
- /** Controls whether CLI resolution may install the pinned managed executable. */
5
- export interface DatabricksCliResolutionOptions {
6
- install?: boolean;
7
- }
8
- /** Resolve a compatible Databricks CLI, installing the pinned build asset when needed. */
9
- export declare function resolveDatabricksCli(environment?: Readonly<Record<string, string | undefined>>, options?: DatabricksCliResolutionOptions): Promise<string | undefined>;
4
+ /** Resolve an available Databricks CLI without installing executables. */
5
+ export declare function resolveDatabricksCli(environment?: Readonly<Record<string, string | undefined>>): Promise<string | undefined>;
10
6
  /** Clear cached CLI resolution, primarily after installation or environment changes. */
11
7
  export declare function resetDatabricksCliResolution(): void;
12
8
  /** Run interactive Databricks CLI login for one profile. */
@@ -0,0 +1,172 @@
1
+ import * as exec from "@dbx-tools/core/exec";
2
+ import * as stringUtils from "@dbx-tools/shared-core/string-utils";
3
+ import { AuthError } from "./_errors.js";
4
+ import { authLogger, failureMetadata, tokenMetadata } from "./_logging.js";
5
+ const resolutionCache = new Map();
6
+ const logger = authLogger("cli");
7
+ /** Resolve an available Databricks CLI without installing executables. */
8
+ export function resolveDatabricksCli(environment = process.env) {
9
+ const candidate = stringValue(environment.DATABRICKS_CLI_PATH) ?? "databricks";
10
+ const cached = resolutionCache.get(candidate);
11
+ if (cached) {
12
+ logger.debug("reused Databricks CLI resolution", { candidate });
13
+ return cached;
14
+ }
15
+ logger.debug("resolving Databricks CLI", { candidate });
16
+ const resolved = compatibleDatabricksCli(candidate)
17
+ .then((compatible) => (compatible ? candidate : undefined))
18
+ .catch((error) => {
19
+ resolutionCache.delete(candidate);
20
+ throw error;
21
+ });
22
+ resolutionCache.set(candidate, resolved);
23
+ return resolved;
24
+ }
25
+ /** Clear cached CLI resolution, primarily after installation or environment changes. */
26
+ export function resetDatabricksCliResolution() {
27
+ resolutionCache.clear();
28
+ logger.debug("cleared Databricks CLI resolution cache");
29
+ }
30
+ async function compatibleDatabricksCli(executable) {
31
+ try {
32
+ const result = await runProcess(executable, ["--version"], {}, 10_000);
33
+ if (result.exitCode !== 0) {
34
+ logger.debug("Databricks CLI version probe failed", {
35
+ executable,
36
+ exitCode: result.exitCode,
37
+ });
38
+ return false;
39
+ }
40
+ logger.debug("selected installed Databricks CLI", { executable });
41
+ return true;
42
+ }
43
+ catch (cause) {
44
+ logger.debug("Databricks CLI version probe unavailable", {
45
+ executable,
46
+ error: failureMetadata(cause),
47
+ });
48
+ return false;
49
+ }
50
+ }
51
+ /** Run interactive Databricks CLI login for one profile. */
52
+ export async function databricksCliLogin(profile, timeoutMs, executable = process.env.DATABRICKS_CLI_PATH ?? "databricks", environment = {}) {
53
+ logger.debug("starting Databricks CLI login", { profile, executable, timeoutMs });
54
+ const result = await runProcess(executable, ["auth", "login", "--profile", profile, "--timeout", `${Math.ceil(timeoutMs / 1000)}s`], environment);
55
+ if (result.exitCode !== 0) {
56
+ throw new AuthError("cli", result.stderr || `databricks auth login exited ${result.exitCode}`);
57
+ }
58
+ logger.debug("Databricks CLI login completed", { profile, executable });
59
+ }
60
+ /** Request one profile token from the Databricks CLI. */
61
+ export async function databricksCliToken(profile, forceRefresh = false, executable = process.env.DATABRICKS_CLI_PATH ?? "databricks", environment = {}) {
62
+ logger.debug("requesting Databricks CLI token", { profile, executable, forceRefresh });
63
+ const args = ["auth", "token", "--profile", profile, "--output", "json"];
64
+ if (forceRefresh)
65
+ args.push("--force-refresh");
66
+ const result = await runProcess(executable, args, environment);
67
+ if (result.exitCode !== 0) {
68
+ throw new AuthError("cli", result.stderr || `databricks auth token exited ${result.exitCode}`);
69
+ }
70
+ let value;
71
+ try {
72
+ value = JSON.parse(result.stdout ?? "");
73
+ }
74
+ catch (cause) {
75
+ throw new AuthError("cli", "Databricks CLI token output was not JSON", { cause });
76
+ }
77
+ const accessToken = stringValue(value.access_token ?? value.accessToken);
78
+ if (!accessToken)
79
+ throw new AuthError("cli", "Databricks CLI token output had no access token");
80
+ const token = {
81
+ accessToken,
82
+ tokenType: stringValue(value.token_type ?? value.tokenType) ?? "Bearer",
83
+ ...(stringValue(value.refresh_token ?? value.refreshToken)
84
+ ? { refreshToken: stringValue(value.refresh_token ?? value.refreshToken) }
85
+ : {}),
86
+ ...(stringValue(value.expiry ?? value.expires_at)
87
+ ? { expiry: stringValue(value.expiry ?? value.expires_at) }
88
+ : {}),
89
+ scopes: Array.isArray(value.scopes)
90
+ ? value.scopes.filter((scope) => typeof scope === "string")
91
+ : [],
92
+ };
93
+ logger.debug("received Databricks CLI token", {
94
+ profile,
95
+ forceRefresh,
96
+ token: tokenMetadata(token),
97
+ });
98
+ return token;
99
+ }
100
+ async function runProcess(command, args, environment, timeoutMs) {
101
+ const controller = timeoutMs === undefined ? undefined : new AbortController();
102
+ const timeout = controller ? setTimeout(() => controller.abort(), timeoutMs) : undefined;
103
+ try {
104
+ return await exec.spawn(command, args, {
105
+ env: { ...process.env, ...environment },
106
+ stdin: "ignore",
107
+ stdout: "capture",
108
+ stderr: "capture",
109
+ signal: controller?.signal,
110
+ });
111
+ }
112
+ finally {
113
+ if (timeout)
114
+ clearTimeout(timeout);
115
+ }
116
+ }
117
+ /** Provider that lazily delegates U2M credentials to the Databricks CLI. */
118
+ export class DatabricksCliProvider {
119
+ profile;
120
+ executableOrResolver;
121
+ environment;
122
+ resolution;
123
+ constructor(profile, executableOrResolver = () => resolveDatabricksCli(), environment = {}) {
124
+ this.profile = profile;
125
+ this.executableOrResolver = executableOrResolver;
126
+ this.environment = environment;
127
+ }
128
+ async authenticate(_timeoutMs) {
129
+ return databricksCliToken(this.profile, false, await this.resolveExecutable(), this.environment);
130
+ }
131
+ async login(timeoutMs) {
132
+ const executable = await this.resolveExecutable();
133
+ await databricksCliLogin(this.profile, timeoutMs, executable, this.environment);
134
+ return databricksCliToken(this.profile, false, executable, this.environment);
135
+ }
136
+ async refresh(_token) {
137
+ return databricksCliToken(this.profile, true, await this.resolveExecutable(), this.environment);
138
+ }
139
+ canAuthenticateSilently() {
140
+ return true;
141
+ }
142
+ resolveExecutable() {
143
+ if (typeof this.executableOrResolver === "string") {
144
+ logger.debug("using configured Databricks CLI executable", {
145
+ profile: this.profile,
146
+ executable: this.executableOrResolver,
147
+ });
148
+ return Promise.resolve(this.executableOrResolver);
149
+ }
150
+ if (this.resolution) {
151
+ logger.debug("reused provider CLI resolution", { profile: this.profile });
152
+ return this.resolution;
153
+ }
154
+ logger.debug("resolving provider CLI lazily", { profile: this.profile });
155
+ this.resolution = this.executableOrResolver()
156
+ .then((executable) => {
157
+ if (!executable) {
158
+ throw new AuthError("cli", "Databricks CLI is unavailable on this platform");
159
+ }
160
+ return executable;
161
+ })
162
+ .catch((error) => {
163
+ this.resolution = undefined;
164
+ throw error;
165
+ });
166
+ return this.resolution;
167
+ }
168
+ }
169
+ function stringValue(value) {
170
+ return stringUtils.trimToNull(value) ?? undefined;
171
+ }
172
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2RhdGFicmlja3MtY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL19kYXRhYnJpY2tzLWNsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssSUFBSSxNQUFNLHNCQUFzQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxXQUFXLE1BQU0scUNBQXFDLENBQUM7QUFFbkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0UsTUFBTSxlQUFlLEdBQUcsSUFBSSxHQUFHLEVBQXVDLENBQUM7QUFDdkUsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBS2pDLDBFQUEwRTtBQUMxRSxNQUFNLFVBQVUsb0JBQW9CLENBQ2xDLGNBQTRELE9BQU8sQ0FBQyxHQUFHO0lBRXZFLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsSUFBSSxZQUFZLENBQUM7SUFDL0UsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsTUFBTSxDQUFDLEtBQUssQ0FBQyxrQ0FBa0MsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDaEUsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUNELE1BQU0sQ0FBQyxLQUFLLENBQUMsMEJBQTBCLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sUUFBUSxHQUFHLHVCQUF1QixDQUFDLFNBQVMsQ0FBQztTQUNoRCxJQUFJLENBQUMsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFD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WUFDL0UsQ0FBQztZQUNELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7WUFDNUIsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUNMLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFjO0lBQ2pDLE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUM7QUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGV4ZWMgZnJvbSBcIkBkYngtdG9vbHMvY29yZS9leGVjXCI7XG5pbXBvcnQgKiBhcyBzdHJpbmdVdGlscyBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZS9zdHJpbmctdXRpbHNcIjtcblxuaW1wb3J0IHsgQXV0aEVycm9yIH0gZnJvbSBcIi4vX2Vycm9ycy50c1wiO1xuaW1wb3J0IHsgYXV0aExvZ2dlciwgZmFpbHVyZU1ldGFkYXRhLCB0b2tlbk1ldGFkYXRhIH0gZnJvbSBcIi4vX2xvZ2dpbmcudHNcIjtcbmltcG9ydCB0eXBlIHsgVG9rZW4sIFRva2VuUHJvdmlkZXIgfSBmcm9tIFwiLi9fdHlwZXMudHNcIjtcblxuY29uc3QgcmVzb2x1dGlvbkNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPj4oKTtcbmNvbnN0IGxvZ2dlciA9IGF1dGhMb2dnZXIoXCJjbGlcIik7XG5cbi8qKiBEZWZlcnJlZCBEYXRhYnJpY2tzIENMSSBsb29rdXAgdXNlZCBieSBVMk0gdG9rZW4gYWNxdWlzaXRpb24uICovXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzQ2xpUmVzb2x2ZXIgPSAoKSA9PiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD47XG5cbi8qKiBSZXNvbHZlIGFuIGF2YWlsYWJsZSBEYXRhYnJpY2tzIENMSSB3aXRob3V0IGluc3RhbGxpbmcgZXhlY3V0YWJsZXMuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NDbGkoXG4gIGVudmlyb25tZW50OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+PiA9IHByb2Nlc3MuZW52LFxuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY2FuZGlkYXRlID0gc3RyaW5nVmFsdWUoZW52aXJvbm1lbnQuREFUQUJSSUNLU19DTElfUEFUSCkgPz8gXCJkYXRhYnJpY2tzXCI7XG4gIGNvbnN0IGNhY2hlZCA9IHJlc29sdXRpb25DYWNoZS5nZXQoY2FuZGlkYXRlKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInJldXNlZCBEYXRhYnJpY2tzIENMSSByZXNvbHV0aW9uXCIsIHsgY2FuZGlkYXRlIH0pO1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2aW5nIERhdGFicmlja3MgQ0xJXCIsIHsgY2FuZGlkYXRlIH0pO1xuICBjb25zdCByZXNvbHZlZCA9IGNvbXBhdGlibGVEYXRhYnJpY2tzQ2xpKGNhbmRpZGF0ZSlcbiAgICAudGhlbigoY29tcGF0aWJsZSkgPT4gKGNvbXBhdGlibGUgPyBjYW5kaWRhdGUgOiB1bmRlZmluZWQpKVxuICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgIHJlc29sdXRpb25DYWNoZS5kZWxldGUoY2FuZGlkYXRlKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0pO1xuICByZXNvbHV0aW9uQ2FjaGUuc2V0KGNhbmRpZGF0ZSwgcmVzb2x2ZWQpO1xuICByZXR1cm4gcmVzb2x2ZWQ7XG59XG5cbi8qKiBDbGVhciBjYWNoZWQgQ0xJIHJlc29sdXRpb24sIHByaW1hcmlseSBhZnRlciBpbnN0YWxsYXRpb24gb3IgZW52aXJvbm1lbnQgY2hhbmdlcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNldERhdGFicmlja3NDbGlSZXNvbHV0aW9uKCk6IHZvaWQge1xuICByZXNvbHV0aW9uQ2FjaGUuY2xlYXIoKTtcbiAgbG9nZ2VyLmRlYnVnKFwiY2xlYXJlZCBEYXRhYnJpY2tzIENMSSByZXNvbHV0aW9uIGNhY2hlXCIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb21wYXRpYmxlRGF0YWJyaWNrc0NsaShleGVjdXRhYmxlOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5Qcm9jZXNzKGV4ZWN1dGFibGUsIFtcIi0tdmVyc2lvblwiXSwge30sIDEwXzAwMCk7XG4gICAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiRGF0YWJyaWNrcyBDTEkgdmVyc2lvbiBwcm9iZSBmYWlsZWRcIiwge1xuICAgICAgICBleGVjdXRhYmxlLFxuICAgICAgICBleGl0Q29kZTogcmVzdWx0LmV4aXRDb2RlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxvZ2dlci5kZWJ1ZyhcInNlbGVjdGVkIGluc3RhbGxlZCBEYXRhYnJpY2tzIENMSVwiLCB7IGV4ZWN1dGFibGUgfSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiRGF0YWJyaWNrcyBDTEkgdmVyc2lvbiBwcm9iZSB1bmF2YWlsYWJsZVwiLCB7XG4gICAgICBleGVjdXRhYmxlLFxuICAgICAgZXJyb3I6IGZhaWx1cmVNZXRhZGF0YShjYXVzZSksXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKiBSdW4gaW50ZXJhY3RpdmUgRGF0YWJyaWNrcyBDTEkgbG9naW4gZm9yIG9uZSBwcm9maWxlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRhdGFicmlja3NDbGlMb2dpbihcbiAgcHJvZmlsZTogc3RyaW5nLFxuICB0aW1lb3V0TXM6IG51bWJlcixcbiAgZXhlY3V0YWJsZSA9IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfQ0xJX1BBVEggPz8gXCJkYXRhYnJpY2tzXCIsXG4gIGVudmlyb25tZW50OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge30sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbG9nZ2VyLmRlYnVnKFwic3RhcnRpbmcgRGF0YWJyaWNrcyBDTEkgbG9naW5cIiwgeyBwcm9maWxlLCBleGVjdXRhYmxlLCB0aW1lb3V0TXMgfSk7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1blByb2Nlc3MoXG4gICAgZXhlY3V0YWJsZSxcbiAgICBbXCJhdXRoXCIsIFwibG9naW5cIiwgXCItLXByb2ZpbGVcIiwgcHJvZmlsZSwgXCItLXRpbWVvdXRcIiwgYCR7TWF0aC5jZWlsKHRpbWVvdXRNcyAvIDEwMDApfXNgXSxcbiAgICBlbnZpcm9ubWVudCxcbiAgKTtcbiAgaWYgKHJlc3VsdC5leGl0Q29kZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjbGlcIiwgcmVzdWx0LnN0ZGVyciB8fCBgZGF0YWJyaWNrcyBhdXRoIGxvZ2luIGV4aXRlZCAke3Jlc3VsdC5leGl0Q29kZX1gKTtcbiAgfVxuICBsb2dnZXIuZGVidWcoXCJEYXRhYnJpY2tzIENMSSBsb2dpbiBjb21wbGV0ZWRcIiwgeyBwcm9maWxlLCBleGVjdXRhYmxlIH0pO1xufVxuXG4vKiogUmVxdWVzdCBvbmUgcHJvZmlsZSB0b2tlbiBmcm9tIHRoZSBEYXRhYnJpY2tzIENMSS4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkYXRhYnJpY2tzQ2xpVG9rZW4oXG4gIHByb2ZpbGU6IHN0cmluZyxcbiAgZm9yY2VSZWZyZXNoID0gZmFsc2UsXG4gIGV4ZWN1dGFibGUgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0NMSV9QQVRIID8/IFwiZGF0YWJyaWNrc1wiLFxuICBlbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9LFxuKTogUHJvbWlzZTxUb2tlbj4ge1xuICBsb2dnZXIuZGVidWcoXCJyZXF1ZXN0aW5nIERhdGFicmlja3MgQ0xJIHRva2VuXCIsIHsgcHJvZmlsZSwgZXhlY3V0YWJsZSwgZm9yY2VSZWZyZXNoIH0pO1xuICBjb25zdCBhcmdzID0gW1wiYXV0aFwiLCBcInRva2VuXCIsIFwiLS1wcm9maWxlXCIsIHByb2ZpbGUsIFwiLS1vdXRwdXRcIiwgXCJqc29uXCJdO1xuICBpZiAoZm9yY2VSZWZyZXNoKSBhcmdzLnB1c2goXCItLWZvcmNlLXJlZnJlc2hcIik7XG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJ1blByb2Nlc3MoZXhlY3V0YWJsZSwgYXJncywgZW52aXJvbm1lbnQpO1xuICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNsaVwiLCByZXN1bHQuc3RkZXJyIHx8IGBkYXRhYnJpY2tzIGF1dGggdG9rZW4gZXhpdGVkICR7cmVzdWx0LmV4aXRDb2RlfWApO1xuICB9XG4gIGxldCB2YWx1ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIHRyeSB7XG4gICAgdmFsdWUgPSBKU09OLnBhcnNlKHJlc3VsdC5zdGRvdXQgPz8gXCJcIikgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgdGhyb3cgbmV3IEF1dGhFcnJvcihcImNsaVwiLCBcIkRhdGFicmlja3MgQ0xJIHRva2VuIG91dHB1dCB3YXMgbm90IEpTT05cIiwgeyBjYXVzZSB9KTtcbiAgfVxuICBjb25zdCBhY2Nlc3NUb2tlbiA9IHN0cmluZ1ZhbHVlKHZhbHVlLmFjY2Vzc190b2tlbiA/PyB2YWx1ZS5hY2Nlc3NUb2tlbik7XG4gIGlmICghYWNjZXNzVG9rZW4pIHRocm93IG5ldyBBdXRoRXJyb3IoXCJjbGlcIiwgXCJEYXRhYnJpY2tzIENMSSB0b2tlbiBvdXRwdXQgaGFkIG5vIGFjY2VzcyB0b2tlblwiKTtcbiAgY29uc3QgdG9rZW4gPSB7XG4gICAgYWNjZXNzVG9rZW4sXG4gICAgdG9rZW5UeXBlOiBzdHJpbmdWYWx1ZSh2YWx1ZS50b2tlbl90eXBlID8/IHZhbHVlLnRva2VuVHlwZSkgPz8gXCJCZWFyZXJcIixcbiAgICAuLi4oc3RyaW5nVmFsdWUodmFsdWUucmVmcmVzaF90b2tlbiA/PyB2YWx1ZS5yZWZyZXNoVG9rZW4pXG4gICAgICA/IHsgcmVmcmVzaFRva2VuOiBzdHJpbmdWYWx1ZSh2YWx1ZS5yZWZyZXNoX3Rva2VuID8/IHZhbHVlLnJlZnJlc2hUb2tlbikgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHN0cmluZ1ZhbHVlKHZhbHVlLmV4cGlyeSA/PyB2YWx1ZS5leHBpcmVzX2F0KVxuICAgICAgPyB7IGV4cGlyeTogc3RyaW5nVmFsdWUodmFsdWUuZXhwaXJ5ID8/IHZhbHVlLmV4cGlyZXNfYXQpIH1cbiAgICAgIDoge30pLFxuICAgIHNjb3BlczogQXJyYXkuaXNBcnJheSh2YWx1ZS5zY29wZXMpXG4gICAgICA/IHZhbHVlLnNjb3Blcy5maWx0ZXIoKHNjb3BlKTogc2NvcGUgaXMgc3RyaW5nID0+IHR5cGVvZiBzY29wZSA9PT0gXCJzdHJpbmdcIilcbiAgICAgIDogW10sXG4gIH07XG4gIGxvZ2dlci5kZWJ1ZyhcInJlY2VpdmVkIERhdGFicmlja3MgQ0xJIHRva2VuXCIsIHtcbiAgICBwcm9maWxlLFxuICAgIGZvcmNlUmVmcmVzaCxcbiAgICB0b2tlbjogdG9rZW5NZXRhZGF0YSh0b2tlbiksXG4gIH0pO1xuICByZXR1cm4gdG9rZW47XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blByb2Nlc3MoXG4gIGNvbW1hbmQ6IHN0cmluZyxcbiAgYXJnczogc3RyaW5nW10sXG4gIGVudmlyb25tZW50OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICB0aW1lb3V0TXM/OiBudW1iZXIsXG4pOiBQcm9taXNlPHsgZXhpdENvZGU6IG51bWJlcjsgc3Rkb3V0OiBzdHJpbmc7IHN0ZGVycjogc3RyaW5nIH0+IHtcbiAgY29uc3QgY29udHJvbGxlciA9IHRpbWVvdXRNcyA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCB0aW1lb3V0ID0gY29udHJvbGxlciA/IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydCgpLCB0aW1lb3V0TXMpIDogdW5kZWZpbmVkO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBleGVjLnNwYXduKGNvbW1hbmQsIGFyZ3MsIHtcbiAgICAgIGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uZW52aXJvbm1lbnQgfSxcbiAgICAgIHN0ZGluOiBcImlnbm9yZVwiLFxuICAgICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICAgIHN0ZGVycjogXCJjYXB0dXJlXCIsXG4gICAgICBzaWduYWw6IGNvbnRyb2xsZXI/LnNpZ25hbCxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGltZW91dCkgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICB9XG59XG5cbi8qKiBQcm92aWRlciB0aGF0IGxhemlseSBkZWxlZ2F0ZXMgVTJNIGNyZWRlbnRpYWxzIHRvIHRoZSBEYXRhYnJpY2tzIENMSS4gKi9cbmV4cG9ydCBjbGFzcyBEYXRhYnJpY2tzQ2xpUHJvdmlkZXIgaW1wbGVtZW50cyBUb2tlblByb3ZpZGVyIHtcbiAgcHJpdmF0ZSByZXNvbHV0aW9uPzogUHJvbWlzZTxzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJvZmlsZTogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXhlY3V0YWJsZU9yUmVzb2x2ZXI6IHN0cmluZyB8IERhdGFicmlja3NDbGlSZXNvbHZlciA9ICgpID0+XG4gICAgICByZXNvbHZlRGF0YWJyaWNrc0NsaSgpLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgZW52aXJvbm1lbnQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSxcbiAgKSB7fVxuXG4gIGFzeW5jIGF1dGhlbnRpY2F0ZShfdGltZW91dE1zOiBudW1iZXIpOiBQcm9taXNlPFRva2VuPiB7XG4gICAgcmV0dXJuIGRhdGFicmlja3NDbGlUb2tlbihcbiAgICAgIHRoaXMucHJvZmlsZSxcbiAgICAgIGZhbHNlLFxuICAgICAgYXdhaXQgdGhpcy5yZXNvbHZlRXhlY3V0YWJsZSgpLFxuICAgICAgdGhpcy5lbnZpcm9ubWVudCxcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbG9naW4odGltZW91dE1zOiBudW1iZXIpOiBQcm9taXNlPFRva2VuPiB7XG4gICAgY29uc3QgZXhlY3V0YWJsZSA9IGF3YWl0IHRoaXMucmVzb2x2ZUV4ZWN1dGFibGUoKTtcbiAgICBhd2FpdCBkYXRhYnJpY2tzQ2xpTG9naW4odGhpcy5wcm9maWxlLCB0aW1lb3V0TXMsIGV4ZWN1dGFibGUsIHRoaXMuZW52aXJvbm1lbnQpO1xuICAgIHJldHVybiBkYXRhYnJpY2tzQ2xpVG9rZW4odGhpcy5wcm9maWxlLCBmYWxzZSwgZXhlY3V0YWJsZSwgdGhpcy5lbnZpcm9ubWVudCk7XG4gIH1cblxuICBhc3luYyByZWZyZXNoKF90b2tlbjogVG9rZW4pOiBQcm9taXNlPFRva2VuPiB7XG4gICAgcmV0dXJuIGRhdGFicmlja3NDbGlUb2tlbih0aGlzLnByb2ZpbGUsIHRydWUsIGF3YWl0IHRoaXMucmVzb2x2ZUV4ZWN1dGFibGUoKSwgdGhpcy5lbnZpcm9ubWVudCk7XG4gIH1cblxuICBjYW5BdXRoZW50aWNhdGVTaWxlbnRseSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZUV4ZWN1dGFibGUoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAodHlwZW9mIHRoaXMuZXhlY3V0YWJsZU9yUmVzb2x2ZXIgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInVzaW5nIGNvbmZpZ3VyZWQgRGF0YWJyaWNrcyBDTEkgZXhlY3V0YWJsZVwiLCB7XG4gICAgICAgIHByb2ZpbGU6IHRoaXMucHJvZmlsZSxcbiAgICAgICAgZXhlY3V0YWJsZTogdGhpcy5leGVjdXRhYmxlT3JSZXNvbHZlcixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLmV4ZWN1dGFibGVPclJlc29sdmVyKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucmVzb2x1dGlvbikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwicmV1c2VkIHByb3ZpZGVyIENMSSByZXNvbHV0aW9uXCIsIHsgcHJvZmlsZTogdGhpcy5wcm9maWxlIH0pO1xuICAgICAgcmV0dXJuIHRoaXMucmVzb2x1dGlvbjtcbiAgICB9XG4gICAgbG9nZ2VyLmRlYnVnKFwicmVzb2x2aW5nIHByb3ZpZGVyIENMSSBsYXppbHlcIiwgeyBwcm9maWxlOiB0aGlzLnByb2ZpbGUgfSk7XG4gICAgdGhpcy5yZXNvbHV0aW9uID0gdGhpcy5leGVjdXRhYmxlT3JSZXNvbHZlcigpXG4gICAgICAudGhlbigoZXhlY3V0YWJsZSkgPT4ge1xuICAgICAgICBpZiAoIWV4ZWN1dGFibGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQXV0aEVycm9yKFwiY2xpXCIsIFwiRGF0YWJyaWNrcyBDTEkgaXMgdW5hdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZXhlY3V0YWJsZTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgIHRoaXMucmVzb2x1dGlvbiA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9KTtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHV0aW9uO1xuICB9XG59XG5cbmZ1bmN0aW9uIHN0cmluZ1ZhbHVlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwodmFsdWUpID8/IHVuZGVmaW5lZDtcbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ /** Authentication failure with a stable category for callers and language shims. */
2
+ export declare class AuthError extends Error {
3
+ readonly kind: "config" | "oauth" | "cli";
4
+ constructor(kind: "config" | "oauth" | "cli", message: string, options?: ErrorOptions);
5
+ }
@@ -0,0 +1,10 @@
1
+ /** Authentication failure with a stable category for callers and language shims. */
2
+ export class AuthError extends Error {
3
+ kind;
4
+ constructor(kind, message, options) {
5
+ super(message, options);
6
+ this.kind = kind;
7
+ this.name = "AuthError";
8
+ }
9
+ }
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2Vycm9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9fZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLG9GQUFvRjtBQUNwRixNQUFNLE9BQU8sU0FBVSxTQUFRLEtBQUs7SUFFdkI7SUFEWCxZQUNXLElBQWdDLEVBQ3pDLE9BQWUsRUFDZixPQUFzQjtRQUV0QixLQUFLLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBSmYsU0FBSSxHQUFKLElBQUksQ0FBNEI7UUFLekMsSUFBSSxDQUFDLElBQUksR0FBRyxXQUFXLENBQUM7SUFDMUIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIEF1dGhlbnRpY2F0aW9uIGZhaWx1cmUgd2l0aCBhIHN0YWJsZSBjYXRlZ29yeSBmb3IgY2FsbGVycyBhbmQgbGFuZ3VhZ2Ugc2hpbXMuICovXG5leHBvcnQgY2xhc3MgQXV0aEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBraW5kOiBcImNvbmZpZ1wiIHwgXCJvYXV0aFwiIHwgXCJjbGlcIixcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IEVycm9yT3B0aW9ucyxcbiAgKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgb3B0aW9ucyk7XG4gICAgdGhpcy5uYW1lID0gXCJBdXRoRXJyb3JcIjtcbiAgfVxufVxuIl19
@@ -1,4 +1,6 @@
1
- import type { AccessToken, AuthOptions, CredentialStore, Token, TokenProvider } from "./types.ts";
1
+ import type { CredentialStore, Token, TokenProvider } from "./_types.ts";
2
+ import type { AccessToken } from "./client.ts";
3
+ import type { AuthOptions } from "./config.ts";
2
4
  /** Provider-neutral check-lock-check authentication and persistent token lifecycle. */
3
5
  export declare class TokenLifecycle {
4
6
  private readonly key;
@@ -6,17 +8,15 @@ export declare class TokenLifecycle {
6
8
  private readonly store;
7
9
  private readonly options;
8
10
  private readonly now;
9
- constructor(key: string, provider: TokenProvider, store: CredentialStore, options: AuthOptions, now?: () => Date);
10
- storeName(): string;
11
+ constructor(key: string, provider: TokenProvider, store: CredentialStore, options: Required<AuthOptions>, now?: () => Date);
11
12
  login(): Promise<AccessToken>;
12
13
  token(): Promise<AccessToken>;
13
14
  tokenOrLogin(): Promise<AccessToken>;
14
15
  tokenWithLogin(login?: boolean): Promise<AccessToken>;
15
16
  forceRefresh(login?: boolean): Promise<AccessToken>;
16
- refreshRejectedToken(staleAccessToken: string, login?: boolean): Promise<AccessToken>;
17
17
  logout(): Promise<void>;
18
18
  private loadToken;
19
- private refreshRejected;
19
+ private refresh;
20
20
  private renew;
21
21
  private canReuse;
22
22
  private withLock;