@dbx-tools/appkit 0.6.89 → 0.6.91
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.
- package/README.md +15 -16
- package/index.ts +3 -2
- package/lib/index.d.ts +3 -2
- package/lib/index.js +3 -2
- package/lib/src/_cache-storage.d.ts +4 -2
- package/lib/src/_cache-storage.js +31 -7
- package/lib/src/bundle.d.ts +14 -106
- package/lib/src/bundle.js +12 -351
- package/lib/src/lakebase-resolver.d.ts +2 -2
- package/lib/src/lakebase-resolver.js +8 -9
- package/package.json +4 -4
- package/src/_cache-storage.ts +39 -6
- package/src/bundle.ts +15 -405
- package/src/lakebase-resolver.ts +7 -8
package/README.md
CHANGED
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
Node-side helpers for Databricks AppKit apps.
|
|
4
4
|
|
|
5
5
|
Import this package when backend code needs AppKit execution context, typed
|
|
6
|
-
plugin lookup, Databricks SDK cancellation,
|
|
7
|
-
|
|
6
|
+
plugin lookup, Databricks SDK cancellation, or Lakebase auto-configuration
|
|
7
|
+
without taking on a heavier feature package.
|
|
8
8
|
|
|
9
9
|
**Key features:**
|
|
10
10
|
|
|
@@ -14,8 +14,8 @@ Lakebase auto-configuration without taking on a heavier feature package.
|
|
|
14
14
|
from a CLI, or from a background script.
|
|
15
15
|
- Typed plugin lookup helpers for AppKit plugins that depend on exports from
|
|
16
16
|
sibling plugins.
|
|
17
|
-
-
|
|
18
|
-
|
|
17
|
+
- Lakebase resolution through the shared `@dbx-tools/core` configuration path,
|
|
18
|
+
including local env, bundle, and `app.yaml` sources.
|
|
19
19
|
- SDK cancellation bridging from web `AbortSignal` values into Databricks SDK
|
|
20
20
|
`Context` values.
|
|
21
21
|
- Lakebase cache-schema provisioning for deployments where the app identity must
|
|
@@ -42,8 +42,8 @@ Use this package when the friction is around bootstrapping and reuse:
|
|
|
42
42
|
- AppKit plugin instances are generic; the lookup helpers keep sibling-plugin
|
|
43
43
|
access typed and errors actionable.
|
|
44
44
|
- AppKit does not own your local CLI flags, bundle validation output, or
|
|
45
|
-
`app.yaml`; `
|
|
46
|
-
|
|
45
|
+
`app.yaml`; `@dbx-tools/core` centralizes those sources for this package and
|
|
46
|
+
other Node callers.
|
|
47
47
|
- AppKit's `asUser(req)` throws outside `NODE_ENV=development` when a request
|
|
48
48
|
carries no OBO token; `identity` makes falling back to the service principal a
|
|
49
49
|
configured, per-request decision instead of a `NODE_ENV` side effect.
|
|
@@ -158,23 +158,22 @@ await; `lakebaseResolver.applyLakebaseEnv()` resolves and applies the full set.
|
|
|
158
158
|
|
|
159
159
|
## Resolve Local And Bundle Config
|
|
160
160
|
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
bundle definition.
|
|
161
|
+
Configuration is owned by `@dbx-tools/core`, not re-exported by this package.
|
|
162
|
+
Its default precedence is constant config, process env, `.env`, bundle
|
|
163
|
+
`config.env`, then `app.yaml` / `app.yml`.
|
|
165
164
|
|
|
166
165
|
```ts
|
|
167
|
-
import {
|
|
166
|
+
import { config } from "@dbx-tools/core";
|
|
168
167
|
|
|
169
|
-
const warehouseId =
|
|
170
|
-
|
|
171
|
-
sources: bundle.withCliSources(),
|
|
168
|
+
const warehouseId = config.resolveValue("DATABRICKS_WAREHOUSE_ID", {
|
|
169
|
+
data: { DATABRICKS_WAREHOUSE_ID: flags.warehouse },
|
|
172
170
|
});
|
|
173
171
|
```
|
|
174
172
|
|
|
175
173
|
Use this in CLIs and setup scripts that should behave the same locally and in a
|
|
176
|
-
Databricks App deployment. `
|
|
177
|
-
|
|
174
|
+
Databricks App deployment. `config.bundleFile()` exposes validated bundle
|
|
175
|
+
output, while `config.appFile()` exposes parsed App YAML. Both cache successful,
|
|
176
|
+
missing, and invalid results for the process lifetime.
|
|
178
177
|
|
|
179
178
|
## Parse Lakebase Addresses
|
|
180
179
|
|
package/index.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
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
|
|
|
5
|
+
export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit";
|
|
5
6
|
export * as appkit from "./src/appkit.ts";
|
|
6
7
|
export * as bundle from "./src/bundle.ts";
|
|
7
8
|
export * as databricks from "./src/databricks.ts";
|
|
@@ -12,8 +13,8 @@ export * as pgaddress from "./src/pgaddress.ts";
|
|
|
12
13
|
export * as plugin from "./src/plugin.ts";
|
|
13
14
|
export * as provision from "./src/provision.ts";
|
|
14
15
|
export type { AutoConfigureMode, CreateAppConfig, ExecutionContextLike, WorkspaceClientLike } from "./src/appkit.ts";
|
|
15
|
-
export { bundleAppResourceSchema } from "./src/bundle.ts";
|
|
16
|
-
export type { BundleValidateJson, ConfigFile,
|
|
16
|
+
export { bundleAppResourceSchema, flattenAppYamlEnv, flattenAppEnv, getBundlePath } from "./src/bundle.ts";
|
|
17
|
+
export type { BundleValidateJson, ConfigFile, ConfigMapValue, ConfigSource, ResolveConfigValueOptions } from "./src/bundle.ts";
|
|
17
18
|
export type { ContextLike } from "./src/databricks.ts";
|
|
18
19
|
export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER, IDENTITY_MODES, DEFAULT_IDENTITY_MODE } from "./src/identity.ts";
|
|
19
20
|
export type { IdentityMode, HeaderBearing } from "./src/identity.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit";
|
|
1
2
|
export * as appkit from "./src/appkit.ts";
|
|
2
3
|
export * as bundle from "./src/bundle.ts";
|
|
3
4
|
export * as databricks from "./src/databricks.ts";
|
|
@@ -8,8 +9,8 @@ export * as pgaddress from "./src/pgaddress.ts";
|
|
|
8
9
|
export * as plugin from "./src/plugin.ts";
|
|
9
10
|
export * as provision from "./src/provision.ts";
|
|
10
11
|
export type { AutoConfigureMode, CreateAppConfig, ExecutionContextLike, WorkspaceClientLike } from "./src/appkit.ts";
|
|
11
|
-
export { bundleAppResourceSchema } from "./src/bundle.ts";
|
|
12
|
-
export type { BundleValidateJson, ConfigFile,
|
|
12
|
+
export { bundleAppResourceSchema, flattenAppYamlEnv, flattenAppEnv, getBundlePath } from "./src/bundle.ts";
|
|
13
|
+
export type { BundleValidateJson, ConfigFile, ConfigMapValue, ConfigSource, ResolveConfigValueOptions } from "./src/bundle.ts";
|
|
13
14
|
export type { ContextLike } from "./src/databricks.ts";
|
|
14
15
|
export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER, IDENTITY_MODES, DEFAULT_IDENTITY_MODE } from "./src/identity.ts";
|
|
15
16
|
export type { IdentityMode, HeaderBearing } from "./src/identity.ts";
|
package/lib/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// GENERATED by projen watch - DO NOT EDIT.
|
|
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
|
+
export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit";
|
|
4
5
|
export * as appkit from "./src/appkit.js";
|
|
5
6
|
export * as bundle from "./src/bundle.js";
|
|
6
7
|
export * as databricks from "./src/databricks.js";
|
|
@@ -10,8 +11,8 @@ export * as lakebaseResolver from "./src/lakebase-resolver.js";
|
|
|
10
11
|
export * as pgaddress from "./src/pgaddress.js";
|
|
11
12
|
export * as plugin from "./src/plugin.js";
|
|
12
13
|
export * as provision from "./src/provision.js";
|
|
13
|
-
export { bundleAppResourceSchema } from "./src/bundle.js";
|
|
14
|
+
export { bundleAppResourceSchema, flattenAppYamlEnv, flattenAppEnv, getBundlePath } from "./src/bundle.js";
|
|
14
15
|
export { ACCESS_TOKEN_HEADER, USER_ID_HEADER, USER_EMAIL_HEADER, IDENTITY_MODES, DEFAULT_IDENTITY_MODE } from "./src/identity.js";
|
|
15
16
|
export { LifecycleBridgePlugin, lifecycleBridge } from "./src/interceptor.js";
|
|
16
17
|
export { SSL_MODES } from "./src/pgaddress.js";
|
|
17
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLGdCQUFnQixNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sS0FBSyxTQUFTLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBRWhELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHM0csT0FBTyxFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsSSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHOUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXRcIjtcbmV4cG9ydCAqIGFzIGFwcGtpdCBmcm9tIFwiLi9zcmMvYXBwa2l0LnRzXCI7XG5leHBvcnQgKiBhcyBidW5kbGUgZnJvbSBcIi4vc3JjL2J1bmRsZS50c1wiO1xuZXhwb3J0ICogYXMgZGF0YWJyaWNrcyBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrcy50c1wiO1xuZXhwb3J0ICogYXMgaWRlbnRpdHkgZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgKiBhcyBpbnRlcmNlcHRvciBmcm9tIFwiLi9zcmMvaW50ZXJjZXB0b3IudHNcIjtcbmV4cG9ydCAqIGFzIGxha2ViYXNlUmVzb2x2ZXIgZnJvbSBcIi4vc3JjL2xha2ViYXNlLXJlc29sdmVyLnRzXCI7XG5leHBvcnQgKiBhcyBwZ2FkZHJlc3MgZnJvbSBcIi4vc3JjL3BnYWRkcmVzcy50c1wiO1xuZXhwb3J0ICogYXMgcGx1Z2luIGZyb20gXCIuL3NyYy9wbHVnaW4udHNcIjtcbmV4cG9ydCAqIGFzIHByb3Zpc2lvbiBmcm9tIFwiLi9zcmMvcHJvdmlzaW9uLnRzXCI7XG5leHBvcnQgdHlwZSB7IEF1dG9Db25maWd1cmVNb2RlLCBDcmVhdGVBcHBDb25maWcsIEV4ZWN1dGlvbkNvbnRleHRMaWtlLCBXb3Jrc3BhY2VDbGllbnRMaWtlIH0gZnJvbSBcIi4vc3JjL2FwcGtpdC50c1wiO1xuZXhwb3J0IHsgYnVuZGxlQXBwUmVzb3VyY2VTY2hlbWEsIGZsYXR0ZW5BcHBZYW1sRW52LCBmbGF0dGVuQXBwRW52LCBnZXRCdW5kbGVQYXRoIH0gZnJvbSBcIi4vc3JjL2J1bmRsZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBCdW5kbGVWYWxpZGF0ZUpzb24sIENvbmZpZ0ZpbGUsIENvbmZpZ01hcFZhbHVlLCBDb25maWdTb3VyY2UsIFJlc29sdmVDb25maWdWYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvYnVuZGxlLnRzXCI7XG5leHBvcnQgdHlwZSB7IENvbnRleHRMaWtlIH0gZnJvbSBcIi4vc3JjL2RhdGFicmlja3MudHNcIjtcbmV4cG9ydCB7IEFDQ0VTU19UT0tFTl9IRUFERVIsIFVTRVJfSURfSEVBREVSLCBVU0VSX0VNQUlMX0hFQURFUiwgSURFTlRJVFlfTU9ERVMsIERFRkFVTFRfSURFTlRJVFlfTU9ERSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBJZGVudGl0eU1vZGUsIEhlYWRlckJlYXJpbmcgfSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCB7IExpZmVjeWNsZUJyaWRnZVBsdWdpbiwgbGlmZWN5Y2xlQnJpZGdlIH0gZnJvbSBcIi4vc3JjL2ludGVyY2VwdG9yLnRzXCI7XG5leHBvcnQgdHlwZSB7IExpZmVjeWNsZUV2ZW50LCBMaWZlY3ljbGVIYW5kbGVyLCBSZXNvbHZlZEFwcEVudiwgQmluZGFibGVQcm9jZXNzLCBJbnRlcmNlcHRvckNvbnRleHQsIEludGVyY2VwdG9yLCBJbnRlcmNlcHRvclJ1bnRpbWUgfSBmcm9tIFwiLi9zcmMvaW50ZXJjZXB0b3IudHNcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJhc2VSZXNvbHZlcklucHV0cywgTGFrZWJhc2VDb25uZWN0aW9uIH0gZnJvbSBcIi4vc3JjL2xha2ViYXNlLXJlc29sdmVyLnRzXCI7XG5leHBvcnQgeyBTU0xfTU9ERVMgfSBmcm9tIFwiLi9zcmMvcGdhZGRyZXNzLnRzXCI7XG5leHBvcnQgdHlwZSB7IFNzbE1vZGUsIExha2ViYXNlQ29ubmVjdGlvbklucHV0cywgUGFyc2VkQWRkcmVzcyB9IGZyb20gXCIuL3NyYy9wZ2FkZHJlc3MudHNcIjtcbmV4cG9ydCB0eXBlIHsgUGx1Z2luQ29udGV4dExpa2UgfSBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG4iXX0=
|
|
@@ -19,9 +19,11 @@ type CacheStorage = NonNullable<CacheConfig["storage"]>;
|
|
|
19
19
|
export type PersistentStorageBase = CacheStorage & {
|
|
20
20
|
initialize(): Promise<void>;
|
|
21
21
|
initialized: boolean;
|
|
22
|
+
schemaName?: string;
|
|
23
|
+
tableName?: string;
|
|
22
24
|
};
|
|
23
|
-
/** Soften `initialize()` so
|
|
24
|
-
export declare function softenInitialize(storage: PersistentStorageBase): void;
|
|
25
|
+
/** Soften `initialize()` so an ownership-only migration failure is not fatal. */
|
|
26
|
+
export declare function softenInitialize(storage: PersistentStorageBase, skipMigrations?: () => Promise<boolean>): void;
|
|
25
27
|
/** Verify the migrated cache table can serve the reads and writes AppKit needs. */
|
|
26
28
|
export declare function probeStorage(storage: PersistentStorageBase): Promise<void>;
|
|
27
29
|
/**
|
|
@@ -57,8 +57,30 @@ function loadPersistentStorage() {
|
|
|
57
57
|
return undefined;
|
|
58
58
|
}
|
|
59
59
|
}
|
|
60
|
-
/**
|
|
61
|
-
|
|
60
|
+
/**
|
|
61
|
+
* Whether an existing cache table belongs to another role.
|
|
62
|
+
*
|
|
63
|
+
* PostgreSQL allows granted reads/writes but reserves index DDL for the table
|
|
64
|
+
* owner. Skip AppKit migrations in that case; {@link probeStorage} still proves
|
|
65
|
+
* the existing table can serve the cache before it is accepted.
|
|
66
|
+
*/
|
|
67
|
+
async function tableOwnedByAnotherRole(storage, pool) {
|
|
68
|
+
if (!storage.schemaName || !storage.tableName)
|
|
69
|
+
return false;
|
|
70
|
+
const result = await pool.query(`SELECT pg_get_userbyid(c.relowner) = current_user AS owned
|
|
71
|
+
FROM pg_class c
|
|
72
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
73
|
+
WHERE n.nspname = $1 AND c.relname = $2 AND c.relkind IN ('r', 'p')`, [storage.schemaName, storage.tableName]);
|
|
74
|
+
if (result.rows[0]?.owned !== false)
|
|
75
|
+
return false;
|
|
76
|
+
logger.warn("persistent cache migrations skipped (table owned by another role)", {
|
|
77
|
+
schema: storage.schemaName,
|
|
78
|
+
table: storage.tableName,
|
|
79
|
+
});
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
/** Soften `initialize()` so an ownership-only migration failure is not fatal. */
|
|
83
|
+
export function softenInitialize(storage, skipMigrations) {
|
|
62
84
|
const originalInitialize = storage.initialize.bind(storage);
|
|
63
85
|
let softInitPromise;
|
|
64
86
|
storage.initialize = async () => {
|
|
@@ -66,7 +88,8 @@ export function softenInitialize(storage) {
|
|
|
66
88
|
return;
|
|
67
89
|
softInitPromise ??= (async () => {
|
|
68
90
|
try {
|
|
69
|
-
await
|
|
91
|
+
if (!(await skipMigrations?.()))
|
|
92
|
+
await originalInitialize();
|
|
70
93
|
}
|
|
71
94
|
catch (err) {
|
|
72
95
|
if (!isOwnershipMigrationError(err))
|
|
@@ -119,9 +142,10 @@ export async function createSoftPersistentStorage(cache) {
|
|
|
119
142
|
}
|
|
120
143
|
let pool;
|
|
121
144
|
try {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
145
|
+
const createdPool = createLakebasePool({ workspaceClient: getWorkspaceClient({}) });
|
|
146
|
+
pool = createdPool;
|
|
147
|
+
const storage = new PersistentStorage(cache ?? {}, createdPool);
|
|
148
|
+
softenInitialize(storage, () => tableOwnedByAnotherRole(storage, createdPool));
|
|
125
149
|
if (!(await storage.healthCheck())) {
|
|
126
150
|
await storage.close().catch(() => { });
|
|
127
151
|
return undefined;
|
|
@@ -140,4 +164,4 @@ export async function createSoftPersistentStorage(cache) {
|
|
|
140
164
|
return undefined;
|
|
141
165
|
}
|
|
142
166
|
}
|
|
143
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NhY2hlLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX2NhY2hlLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBb0IsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUxRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRTNDLHVEQUF1RDtBQUN2RCxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFFaEQsMERBQTBEO0FBQzFELFNBQVMsY0FBYztJQUNyQixPQUFPLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELHlGQUF5RjtBQUN6RixTQUFTLHlCQUF5QixDQUFDLEdBQVk7SUFDN0MsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBZ0JELElBQUkscUJBQXFCLEdBQW9ELElBQUksQ0FBQztBQUVsRjs7O0dBR0c7QUFDSCxTQUFTLHFCQUFxQjtJQUM1QixJQUFJLHFCQUFxQixLQUFLLElBQUksRUFBRSxDQUFDO1FBQ25DLE9BQU8scUJBQXFCLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLE1B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QUM7SUFDakIsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxFQUFFO1lBQ2hELEtBQUssRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztTQUMvQixDQUFDLENBQUM7UUFDSCxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ1QsTUFBTSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ25DLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU29mdC1mYWlsIExha2ViYXNlIGNhY2hlIHN0b3JhZ2UgZm9yIEFwcEtpdCdzIHBlcnNpc3RlbnQgY2FjaGUuXG4gKlxuICogQXBwS2l0J3MgYFBlcnNpc3RlbnRTdG9yYWdlLmluaXRpYWxpemUoKWAgcnVucyBEREwgbWlncmF0aW9ucyBhbmQgdGhyb3dzIG9uXG4gKiBhbnkgc3RlcCBmYWlsdXJlLiBXaXRoIGBjYWNoZS5zdHJpY3RQZXJzaXN0ZW5jZTogdHJ1ZWAgdGhhdCB0aHJvdyBtYWtlc1xuICogYENhY2hlTWFuYWdlcmAgc2lsZW50bHkgZGlzYWJsZSB0aGUgY2FjaGUuIFRoaXMgd3JhcHMgdGhlIHNhbWUgc3RvcmFnZSxcbiAqIHN0aWxsIHJ1bnMgaXRzIG1pZ3JhdGlvbnMsIGJ1dCBsb2dzIGEgZmFpbGVkIHN0ZXAgaW5zdGVhZCBvZiB0aHJvd2luZyBzbyBhXG4gKiB1c2FibGUgdGFibGUga2VlcHMgc2VydmluZy5cbiAqXG4gKiBgUGVyc2lzdGVudFN0b3JhZ2VgIGlzIG5vdCBvbiBBcHBLaXQncyBwdWJsaWMgZXhwb3J0IG1hcC4gVGhlIGRlZXAgbG9hZCBpc1xuICogbGF6eSBhbmQgYmVzdC1lZmZvcnQ6IGlmIHRoZSBpbnN0YWxsZWQgQXBwS2l0IGxheW91dCBjaGFuZ2VzLCB0aGlzIHJldHVybnNcbiAqIGB1bmRlZmluZWRgIGFuZCBgY3JlYXRlQXBwYCBsZWF2ZXMgQXBwS2l0IG9uIGl0cyBkZWZhdWx0IGNhY2hlIHBhdGguXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBjcmVhdGVMYWtlYmFzZVBvb2wsIGdldFdvcmtzcGFjZUNsaWVudCwgdHlwZSBDYWNoZUNvbmZpZyB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yLCBoYXNoLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwiY2FjaGUtc3RvcmFnZVwiKTtcblxuLyoqIFByb2Nlc3Mtd2lkZSBkZWR1cGUgZm9yIHNvZnQgbWlncmF0aW9uIHdhcm5pbmdzLiAqL1xuY29uc3QgbG9nZ2VkTWlncmF0aW9uRXJyb3JzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbi8qKiBXaGV0aGVyIGBMT0dfTEVWRUxgIGlzIGN1cnJlbnRseSBhdCBvciBiZWxvdyBkZWJ1Zy4gKi9cbmZ1bmN0aW9uIGlzRGVidWdFbmFibGVkKCk6IGJvb2xlYW4ge1xuICByZXR1cm4gbG9nLmlzTGV2ZWxFbmFibGVkKFwiZGVidWdcIik7XG59XG5cbi8qKiBXaGV0aGVyIGEgbWlncmF0aW9uIGZhaWxlZCBvbmx5IGJlY2F1c2UgdGhpcyByb2xlIGRvZXMgbm90IG93biBhbiBleGlzdGluZyBvYmplY3QuICovXG5mdW5jdGlvbiBpc093bmVyc2hpcE1pZ3JhdGlvbkVycm9yKGVycjogdW5rbm93bik6IGJvb2xlYW4ge1xuICByZXR1cm4gZXJyb3IuZXJyb3JDb250ZXh0KGVycikuaGFzTWVzc2FnZShcIm11c3QgYmUgb3duZXJcIik7XG59XG5cbnR5cGUgTGFrZWJhc2VQb29sID0gUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlTGFrZWJhc2VQb29sPjtcbnR5cGUgQ2FjaGVTdG9yYWdlID0gTm9uTnVsbGFibGU8Q2FjaGVDb25maWdbXCJzdG9yYWdlXCJdPjtcblxuLyoqIEFwcEtpdCdzIGludGVybmFsIHBlcnNpc3RlbnQgc3RvcmFnZSBzdXJmYWNlLiAqL1xuZXhwb3J0IHR5cGUgUGVyc2lzdGVudFN0b3JhZ2VCYXNlID0gQ2FjaGVTdG9yYWdlICYge1xuICBpbml0aWFsaXplKCk6IFByb21pc2U8dm9pZD47XG4gIGluaXRpYWxpemVkOiBib29sZWFuO1xufTtcblxudHlwZSBQZXJzaXN0ZW50U3RvcmFnZUNvbnN0cnVjdG9yID0gbmV3IChcbiAgY29uZmlnOiBDYWNoZUNvbmZpZyxcbiAgcG9vbDogTGFrZWJhc2VQb29sLFxuKSA9PiBQZXJzaXN0ZW50U3RvcmFnZUJhc2U7XG5cbmxldCBwZXJzaXN0ZW50U3RvcmFnZUN0b3I6IFBlcnNpc3RlbnRTdG9yYWdlQ29uc3RydWN0b3IgfCB1bmRlZmluZWQgfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBMYXppbHkgcmVzb2x2ZSBBcHBLaXQncyBpbnRlcm5hbCBgUGVyc2lzdGVudFN0b3JhZ2VgIGNvbnN0cnVjdG9yLiBgbnVsbGBcbiAqIG1lYW5zIG5vdCBhdHRlbXB0ZWQgeWV0OyBgdW5kZWZpbmVkYCBtZWFucyB0aGUgbG9va3VwIGFscmVhZHkgZmFpbGVkLlxuICovXG5mdW5jdGlvbiBsb2FkUGVyc2lzdGVudFN0b3JhZ2UoKTogUGVyc2lzdGVudFN0b3JhZ2VDb25zdHJ1Y3RvciB8IHVuZGVmaW5lZCB7XG4gIGlmIChwZXJzaXN0ZW50U3RvcmFnZUN0b3IgIT09IG51bGwpIHtcbiAgICByZXR1cm4gcGVyc2lzdGVudFN0b3JhZ2VDdG9yO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgICBjb25zdCBtb2R1bGVQYXRoID0gam9pbihcbiAgICAgIGRpcm5hbWUocmVxdWlyZS5yZXNvbHZlKFwiQGRhdGFicmlja3MvYXBwa2l0XCIpKSxcbiAgICAgIFwiY2FjaGUvc3RvcmFnZS9wZXJzaXN0ZW50LmpzXCIsXG4gICAgKTtcbiAgICBjb25zdCBsb2FkZWQgPSByZXF1aXJlKG1vZHVsZVBhdGgpLlBlcnNpc3RlbnRTdG9yYWdlIGFzXG4gICAgICBQZXJzaXN0ZW50U3RvcmFnZUNvbnN0cnVjdG9yIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgbG9hZGVkICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNvZnQgcGVyc2lzdGVudCBjYWNoZSBza2lwcGVkIChQZXJzaXN0ZW50U3RvcmFnZSBtaXNzaW5nKVwiKTtcbiAgICAgIHBlcnNpc3RlbnRTdG9yYWdlQ3RvciA9IHVuZGVmaW5lZDtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHBlcnNpc3RlbnRTdG9yYWdlQ3RvciA9IGxvYWRlZDtcbiAgICByZXR1cm4gbG9hZGVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJzb2Z0IHBlcnNpc3RlbnQgY2FjaGUgc2tpcHBlZCAoUGVyc2lzdGVudFN0b3JhZ2UgdW5hdmFpbGFibGUpXCIsIHtcbiAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgICBwZXJzaXN0ZW50U3RvcmFnZUN0b3IgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKiogU29mdGVuIGBpbml0aWFsaXplKClgIHNvIGEgbWlncmF0aW9uIGZhaWx1cmUgaXMgbG9nZ2VkIG9uY2UsIG5vdCB0aHJvd24uICovXG5leHBvcnQgZnVuY3Rpb24gc29mdGVuSW5pdGlhbGl6ZShzdG9yYWdlOiBQZXJzaXN0ZW50U3RvcmFnZUJhc2UpOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gc3RvcmFnZS5pbml0aWFsaXplLmJpbmQoc3RvcmFnZSk7XG4gIGxldCBzb2Z0SW5pdFByb21pc2U6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG5cbiAgc3RvcmFnZS5pbml0aWFsaXplID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChzdG9yYWdlLmluaXRpYWxpemVkKSByZXR1cm47XG4gICAgc29mdEluaXRQcm9taXNlID8/PSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgb3JpZ2luYWxJbml0aWFsaXplKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCFpc093bmVyc2hpcE1pZ3JhdGlvbkVycm9yKGVycikpIHRocm93IGVycjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yLmVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgICBpZiAoIWxvZ2dlZE1pZ3JhdGlvbkVycm9ycy5oYXMobWVzc2FnZSkpIHtcbiAgICAgICAgICBsb2dnZWRNaWdyYXRpb25FcnJvcnMuYWRkKG1lc3NhZ2UpO1xuICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJwZXJzaXN0ZW50IGNhY2hlIG1pZ3JhdGlvbiBmYWlsZWRcIiwgZXJyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJwZXJzaXN0ZW50IGNhY2hlIG1pZ3JhdGlvbiBmYWlsZWRcIiwgeyBlcnJvcjogbWVzc2FnZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzb2Z0SW5pdFByb21pc2U7XG4gICAgICBzdG9yYWdlLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNvZnRJbml0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH07XG59XG5cbi8qKiBWZXJpZnkgdGhlIG1pZ3JhdGVkIGNhY2hlIHRhYmxlIGNhbiBzZXJ2ZSB0aGUgcmVhZHMgYW5kIHdyaXRlcyBBcHBLaXQgbmVlZHMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvYmVTdG9yYWdlKHN0b3JhZ2U6IFBlcnNpc3RlbnRTdG9yYWdlQmFzZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBrZXkgPSBgZGJ4LXRvb2xzOmNhY2hlLXByb2JlOiR7aGFzaC5pZCgpfWA7XG4gIHRyeSB7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXQoa2V5LCB7IHZhbHVlOiBrZXksIGV4cGlyeTogRGF0ZS5ub3coKSArIDYwXzAwMCB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLmdldChrZXkpO1xuICAgIGlmIChyZXN1bHQ/LnZhbHVlICE9PSBrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInBlcnNpc3RlbnQgY2FjaGUgcHJvYmUgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCB2YWx1ZVwiKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgc3RvcmFnZS5kZWxldGUoa2V5KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgYSBzb2Z0LWZhaWwgTGFrZWJhc2UgY2FjaGUgc3RvcmFnZSB3aGVuIGEgcG9vbCBjYW4gYmUgY3JlYXRlZCBhbmRcbiAqIEFwcEtpdCdzIFBlcnNpc3RlbnRTdG9yYWdlIGNhbiBiZSBsb2FkZWQuIFJldHVybnMgYHVuZGVmaW5lZGAgb3RoZXJ3aXNlIHNvXG4gKiBBcHBLaXQgY2FuIGZhbGwgdGhyb3VnaCB0byBpdHMgbm9ybWFsIGNhY2hlIHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTb2Z0UGVyc2lzdGVudFN0b3JhZ2UoXG4gIGNhY2hlOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8Q2FjaGVTdG9yYWdlIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFBlcnNpc3RlbnRTdG9yYWdlID0gbG9hZFBlcnNpc3RlbnRTdG9yYWdlKCk7XG4gIGlmICghUGVyc2lzdGVudFN0b3JhZ2UpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IHBvb2w6IExha2ViYXNlUG9vbCB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBwb29sID0gY3JlYXRlTGFrZWJhc2VQb29sKHsgd29ya3NwYWNlQ2xpZW50OiBnZXRXb3Jrc3BhY2VDbGllbnQoe30pIH0pO1xuICAgIGNvbnN0IHN0b3JhZ2UgPSBuZXcgUGVyc2lzdGVudFN0b3JhZ2UoY2FjaGUgPz8ge30sIHBvb2wpO1xuICAgIHNvZnRlbkluaXRpYWxpemUoc3RvcmFnZSk7XG4gICAgaWYgKCEoYXdhaXQgc3RvcmFnZS5oZWFsdGhDaGVjaygpKSkge1xuICAgICAgYXdhaXQgc3RvcmFnZS5jbG9zZSgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGF3YWl0IHN0b3JhZ2UuaW5pdGlhbGl6ZSgpO1xuICAgIGF3YWl0IHByb2JlU3RvcmFnZShzdG9yYWdlKTtcbiAgICByZXR1cm4gc3RvcmFnZTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic29mdCBwZXJzaXN0ZW50IGNhY2hlIHVuYXZhaWxhYmxlXCIsIHtcbiAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgICBpZiAocG9vbCkge1xuICAgICAgYXdhaXQgcG9vbC5lbmQoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cbiJdfQ==
|
|
167
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2NhY2hlLXN0b3JhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvX2NhY2hlLXN0b3JhZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBb0IsTUFBTSxvQkFBb0IsQ0FBQztBQUM5RixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUUxRCxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRTNDLHVEQUF1RDtBQUN2RCxNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFFaEQsMERBQTBEO0FBQzFELFNBQVMsY0FBYztJQUNyQixPQUFPLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELHlGQUF5RjtBQUN6RixTQUFTLHlCQUF5QixDQUFDLEdBQVk7SUFDN0MsT0FBTyxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBa0JELElBQUkscUJBQXFCLEdBQW9ELElBQUksQ0FBQztBQUVsRjs7O0dBR0c7QUFDSCxTQUFTLHFCQUFxQjtJQUM1QixJQUFJLHFCQUFxQixLQUFLLElBQUksRUFBRSxDQUFDO1FBQ25DLE9BQU8scUJBQXFCLENBQUM7SUFDL0IsQ0FBQztJQUNELElBQUksQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9DLE1B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QUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTb2Z0LWZhaWwgTGFrZWJhc2UgY2FjaGUgc3RvcmFnZSBmb3IgQXBwS2l0J3MgcGVyc2lzdGVudCBjYWNoZS5cbiAqXG4gKiBBcHBLaXQncyBgUGVyc2lzdGVudFN0b3JhZ2UuaW5pdGlhbGl6ZSgpYCBydW5zIERETCBtaWdyYXRpb25zIGFuZCB0aHJvd3Mgb25cbiAqIGFueSBzdGVwIGZhaWx1cmUuIFdpdGggYGNhY2hlLnN0cmljdFBlcnNpc3RlbmNlOiB0cnVlYCB0aGF0IHRocm93IG1ha2VzXG4gKiBgQ2FjaGVNYW5hZ2VyYCBzaWxlbnRseSBkaXNhYmxlIHRoZSBjYWNoZS4gVGhpcyB3cmFwcyB0aGUgc2FtZSBzdG9yYWdlLFxuICogc3RpbGwgcnVucyBpdHMgbWlncmF0aW9ucywgYnV0IGxvZ3MgYSBmYWlsZWQgc3RlcCBpbnN0ZWFkIG9mIHRocm93aW5nIHNvIGFcbiAqIHVzYWJsZSB0YWJsZSBrZWVwcyBzZXJ2aW5nLlxuICpcbiAqIGBQZXJzaXN0ZW50U3RvcmFnZWAgaXMgbm90IG9uIEFwcEtpdCdzIHB1YmxpYyBleHBvcnQgbWFwLiBUaGUgZGVlcCBsb2FkIGlzXG4gKiBsYXp5IGFuZCBiZXN0LWVmZm9ydDogaWYgdGhlIGluc3RhbGxlZCBBcHBLaXQgbGF5b3V0IGNoYW5nZXMsIHRoaXMgcmV0dXJuc1xuICogYHVuZGVmaW5lZGAgYW5kIGBjcmVhdGVBcHBgIGxlYXZlcyBBcHBLaXQgb24gaXRzIGRlZmF1bHQgY2FjaGUgcGF0aC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gXCJub2RlOm1vZHVsZVwiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGNyZWF0ZUxha2ViYXNlUG9vbCwgZ2V0V29ya3NwYWNlQ2xpZW50LCB0eXBlIENhY2hlQ29uZmlnIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZXJyb3IsIGhhc2gsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJjYWNoZS1zdG9yYWdlXCIpO1xuXG4vKiogUHJvY2Vzcy13aWRlIGRlZHVwZSBmb3Igc29mdCBtaWdyYXRpb24gd2FybmluZ3MuICovXG5jb25zdCBsb2dnZWRNaWdyYXRpb25FcnJvcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuLyoqIFdoZXRoZXIgYExPR19MRVZFTGAgaXMgY3VycmVudGx5IGF0IG9yIGJlbG93IGRlYnVnLiAqL1xuZnVuY3Rpb24gaXNEZWJ1Z0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gIHJldHVybiBsb2cuaXNMZXZlbEVuYWJsZWQoXCJkZWJ1Z1wiKTtcbn1cblxuLyoqIFdoZXRoZXIgYSBtaWdyYXRpb24gZmFpbGVkIG9ubHkgYmVjYXVzZSB0aGlzIHJvbGUgZG9lcyBub3Qgb3duIGFuIGV4aXN0aW5nIG9iamVjdC4gKi9cbmZ1bmN0aW9uIGlzT3duZXJzaGlwTWlncmF0aW9uRXJyb3IoZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnJvci5lcnJvckNvbnRleHQoZXJyKS5oYXNNZXNzYWdlKFwibXVzdCBiZSBvd25lclwiKTtcbn1cblxudHlwZSBMYWtlYmFzZVBvb2wgPSBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVMYWtlYmFzZVBvb2w+O1xudHlwZSBDYWNoZVN0b3JhZ2UgPSBOb25OdWxsYWJsZTxDYWNoZUNvbmZpZ1tcInN0b3JhZ2VcIl0+O1xuXG4vKiogQXBwS2l0J3MgaW50ZXJuYWwgcGVyc2lzdGVudCBzdG9yYWdlIHN1cmZhY2UuICovXG5leHBvcnQgdHlwZSBQZXJzaXN0ZW50U3RvcmFnZUJhc2UgPSBDYWNoZVN0b3JhZ2UgJiB7XG4gIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPjtcbiAgaW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIHNjaGVtYU5hbWU/OiBzdHJpbmc7XG4gIHRhYmxlTmFtZT86IHN0cmluZztcbn07XG5cbnR5cGUgUGVyc2lzdGVudFN0b3JhZ2VDb25zdHJ1Y3RvciA9IG5ldyAoXG4gIGNvbmZpZzogQ2FjaGVDb25maWcsXG4gIHBvb2w6IExha2ViYXNlUG9vbCxcbikgPT4gUGVyc2lzdGVudFN0b3JhZ2VCYXNlO1xuXG5sZXQgcGVyc2lzdGVudFN0b3JhZ2VDdG9yOiBQZXJzaXN0ZW50U3RvcmFnZUNvbnN0cnVjdG9yIHwgdW5kZWZpbmVkIHwgbnVsbCA9IG51bGw7XG5cbi8qKlxuICogTGF6aWx5IHJlc29sdmUgQXBwS2l0J3MgaW50ZXJuYWwgYFBlcnNpc3RlbnRTdG9yYWdlYCBjb25zdHJ1Y3Rvci4gYG51bGxgXG4gKiBtZWFucyBub3QgYXR0ZW1wdGVkIHlldDsgYHVuZGVmaW5lZGAgbWVhbnMgdGhlIGxvb2t1cCBhbHJlYWR5IGZhaWxlZC5cbiAqL1xuZnVuY3Rpb24gbG9hZFBlcnNpc3RlbnRTdG9yYWdlKCk6IFBlcnNpc3RlbnRTdG9yYWdlQ29uc3RydWN0b3IgfCB1bmRlZmluZWQge1xuICBpZiAocGVyc2lzdGVudFN0b3JhZ2VDdG9yICE9PSBudWxsKSB7XG4gICAgcmV0dXJuIHBlcnNpc3RlbnRTdG9yYWdlQ3RvcjtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gICAgY29uc3QgbW9kdWxlUGF0aCA9IGpvaW4oXG4gICAgICBkaXJuYW1lKHJlcXVpcmUucmVzb2x2ZShcIkBkYXRhYnJpY2tzL2FwcGtpdFwiKSksXG4gICAgICBcImNhY2hlL3N0b3JhZ2UvcGVyc2lzdGVudC5qc1wiLFxuICAgICk7XG4gICAgY29uc3QgbG9hZGVkID0gcmVxdWlyZShtb2R1bGVQYXRoKS5QZXJzaXN0ZW50U3RvcmFnZSBhc1xuICAgICAgUGVyc2lzdGVudFN0b3JhZ2VDb25zdHJ1Y3RvciB8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGxvYWRlZCAhPT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJzb2Z0IHBlcnNpc3RlbnQgY2FjaGUgc2tpcHBlZCAoUGVyc2lzdGVudFN0b3JhZ2UgbWlzc2luZylcIik7XG4gICAgICBwZXJzaXN0ZW50U3RvcmFnZUN0b3IgPSB1bmRlZmluZWQ7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBwZXJzaXN0ZW50U3RvcmFnZUN0b3IgPSBsb2FkZWQ7XG4gICAgcmV0dXJuIGxvYWRlZDtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic29mdCBwZXJzaXN0ZW50IGNhY2hlIHNraXBwZWQgKFBlcnNpc3RlbnRTdG9yYWdlIHVuYXZhaWxhYmxlKVwiLCB7XG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gICAgcGVyc2lzdGVudFN0b3JhZ2VDdG9yID0gdW5kZWZpbmVkO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIGFuIGV4aXN0aW5nIGNhY2hlIHRhYmxlIGJlbG9uZ3MgdG8gYW5vdGhlciByb2xlLlxuICpcbiAqIFBvc3RncmVTUUwgYWxsb3dzIGdyYW50ZWQgcmVhZHMvd3JpdGVzIGJ1dCByZXNlcnZlcyBpbmRleCBEREwgZm9yIHRoZSB0YWJsZVxuICogb3duZXIuIFNraXAgQXBwS2l0IG1pZ3JhdGlvbnMgaW4gdGhhdCBjYXNlOyB7QGxpbmsgcHJvYmVTdG9yYWdlfSBzdGlsbCBwcm92ZXNcbiAqIHRoZSBleGlzdGluZyB0YWJsZSBjYW4gc2VydmUgdGhlIGNhY2hlIGJlZm9yZSBpdCBpcyBhY2NlcHRlZC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gdGFibGVPd25lZEJ5QW5vdGhlclJvbGUoXG4gIHN0b3JhZ2U6IFBlcnNpc3RlbnRTdG9yYWdlQmFzZSxcbiAgcG9vbDogTGFrZWJhc2VQb29sLFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGlmICghc3RvcmFnZS5zY2hlbWFOYW1lIHx8ICFzdG9yYWdlLnRhYmxlTmFtZSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb29sLnF1ZXJ5KFxuICAgIGBTRUxFQ1QgcGdfZ2V0X3VzZXJieWlkKGMucmVsb3duZXIpID0gY3VycmVudF91c2VyIEFTIG93bmVkXG4gICAgIEZST00gcGdfY2xhc3MgY1xuICAgICBKT0lOIHBnX25hbWVzcGFjZSBuIE9OIG4ub2lkID0gYy5yZWxuYW1lc3BhY2VcbiAgICAgV0hFUkUgbi5uc3BuYW1lID0gJDEgQU5EIGMucmVsbmFtZSA9ICQyIEFORCBjLnJlbGtpbmQgSU4gKCdyJywgJ3AnKWAsXG4gICAgW3N0b3JhZ2Uuc2NoZW1hTmFtZSwgc3RvcmFnZS50YWJsZU5hbWVdLFxuICApO1xuICBpZiAocmVzdWx0LnJvd3NbMF0/Lm93bmVkICE9PSBmYWxzZSkgcmV0dXJuIGZhbHNlO1xuICBsb2dnZXIud2FybihcInBlcnNpc3RlbnQgY2FjaGUgbWlncmF0aW9ucyBza2lwcGVkICh0YWJsZSBvd25lZCBieSBhbm90aGVyIHJvbGUpXCIsIHtcbiAgICBzY2hlbWE6IHN0b3JhZ2Uuc2NoZW1hTmFtZSxcbiAgICB0YWJsZTogc3RvcmFnZS50YWJsZU5hbWUsXG4gIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFNvZnRlbiBgaW5pdGlhbGl6ZSgpYCBzbyBhbiBvd25lcnNoaXAtb25seSBtaWdyYXRpb24gZmFpbHVyZSBpcyBub3QgZmF0YWwuICovXG5leHBvcnQgZnVuY3Rpb24gc29mdGVuSW5pdGlhbGl6ZShcbiAgc3RvcmFnZTogUGVyc2lzdGVudFN0b3JhZ2VCYXNlLFxuICBza2lwTWlncmF0aW9ucz86ICgpID0+IFByb21pc2U8Ym9vbGVhbj4sXG4pOiB2b2lkIHtcbiAgY29uc3Qgb3JpZ2luYWxJbml0aWFsaXplID0gc3RvcmFnZS5pbml0aWFsaXplLmJpbmQoc3RvcmFnZSk7XG4gIGxldCBzb2Z0SW5pdFByb21pc2U6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG5cbiAgc3RvcmFnZS5pbml0aWFsaXplID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmIChzdG9yYWdlLmluaXRpYWxpemVkKSByZXR1cm47XG4gICAgc29mdEluaXRQcm9taXNlID8/PSAoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKCEoYXdhaXQgc2tpcE1pZ3JhdGlvbnM/LigpKSkgYXdhaXQgb3JpZ2luYWxJbml0aWFsaXplKCk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKCFpc093bmVyc2hpcE1pZ3JhdGlvbkVycm9yKGVycikpIHRocm93IGVycjtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yLmVycm9yTWVzc2FnZShlcnIpO1xuICAgICAgICBpZiAoIWxvZ2dlZE1pZ3JhdGlvbkVycm9ycy5oYXMobWVzc2FnZSkpIHtcbiAgICAgICAgICBsb2dnZWRNaWdyYXRpb25FcnJvcnMuYWRkKG1lc3NhZ2UpO1xuICAgICAgICAgIGlmIChpc0RlYnVnRW5hYmxlZCgpKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJwZXJzaXN0ZW50IGNhY2hlIG1pZ3JhdGlvbiBmYWlsZWRcIiwgZXJyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJwZXJzaXN0ZW50IGNhY2hlIG1pZ3JhdGlvbiBmYWlsZWRcIiwgeyBlcnJvcjogbWVzc2FnZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBzb2Z0SW5pdFByb21pc2U7XG4gICAgICBzdG9yYWdlLmluaXRpYWxpemVkID0gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNvZnRJbml0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH07XG59XG5cbi8qKiBWZXJpZnkgdGhlIG1pZ3JhdGVkIGNhY2hlIHRhYmxlIGNhbiBzZXJ2ZSB0aGUgcmVhZHMgYW5kIHdyaXRlcyBBcHBLaXQgbmVlZHMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvYmVTdG9yYWdlKHN0b3JhZ2U6IFBlcnNpc3RlbnRTdG9yYWdlQmFzZSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBrZXkgPSBgZGJ4LXRvb2xzOmNhY2hlLXByb2JlOiR7aGFzaC5pZCgpfWA7XG4gIHRyeSB7XG4gICAgYXdhaXQgc3RvcmFnZS5zZXQoa2V5LCB7IHZhbHVlOiBrZXksIGV4cGlyeTogRGF0ZS5ub3coKSArIDYwXzAwMCB9KTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBzdG9yYWdlLmdldChrZXkpO1xuICAgIGlmIChyZXN1bHQ/LnZhbHVlICE9PSBrZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInBlcnNpc3RlbnQgY2FjaGUgcHJvYmUgcmV0dXJuZWQgYW4gdW5leHBlY3RlZCB2YWx1ZVwiKTtcbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgc3RvcmFnZS5kZWxldGUoa2V5KS5jYXRjaCgoKSA9PiB1bmRlZmluZWQpO1xuICB9XG59XG5cbi8qKlxuICogQnVpbGQgYSBzb2Z0LWZhaWwgTGFrZWJhc2UgY2FjaGUgc3RvcmFnZSB3aGVuIGEgcG9vbCBjYW4gYmUgY3JlYXRlZCBhbmRcbiAqIEFwcEtpdCdzIFBlcnNpc3RlbnRTdG9yYWdlIGNhbiBiZSBsb2FkZWQuIFJldHVybnMgYHVuZGVmaW5lZGAgb3RoZXJ3aXNlIHNvXG4gKiBBcHBLaXQgY2FuIGZhbGwgdGhyb3VnaCB0byBpdHMgbm9ybWFsIGNhY2hlIHBhdGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVTb2Z0UGVyc2lzdGVudFN0b3JhZ2UoXG4gIGNhY2hlOiBDYWNoZUNvbmZpZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8Q2FjaGVTdG9yYWdlIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IFBlcnNpc3RlbnRTdG9yYWdlID0gbG9hZFBlcnNpc3RlbnRTdG9yYWdlKCk7XG4gIGlmICghUGVyc2lzdGVudFN0b3JhZ2UpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgbGV0IHBvb2w6IExha2ViYXNlUG9vbCB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBjcmVhdGVkUG9vbCA9IGNyZWF0ZUxha2ViYXNlUG9vbCh7IHdvcmtzcGFjZUNsaWVudDogZ2V0V29ya3NwYWNlQ2xpZW50KHt9KSB9KTtcbiAgICBwb29sID0gY3JlYXRlZFBvb2w7XG4gICAgY29uc3Qgc3RvcmFnZSA9IG5ldyBQZXJzaXN0ZW50U3RvcmFnZShjYWNoZSA/PyB7fSwgY3JlYXRlZFBvb2wpO1xuICAgIHNvZnRlbkluaXRpYWxpemUoc3RvcmFnZSwgKCkgPT4gdGFibGVPd25lZEJ5QW5vdGhlclJvbGUoc3RvcmFnZSwgY3JlYXRlZFBvb2wpKTtcbiAgICBpZiAoIShhd2FpdCBzdG9yYWdlLmhlYWx0aENoZWNrKCkpKSB7XG4gICAgICBhd2FpdCBzdG9yYWdlLmNsb3NlKCkuY2F0Y2goKCkgPT4ge30pO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgYXdhaXQgc3RvcmFnZS5pbml0aWFsaXplKCk7XG4gICAgYXdhaXQgcHJvYmVTdG9yYWdlKHN0b3JhZ2UpO1xuICAgIHJldHVybiBzdG9yYWdlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJzb2Z0IHBlcnNpc3RlbnQgY2FjaGUgdW5hdmFpbGFibGVcIiwge1xuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICAgIGlmIChwb29sKSB7XG4gICAgICBhd2FpdCBwb29sLmVuZCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuIl19
|
package/lib/src/bundle.d.ts
CHANGED
|
@@ -1,114 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Compatibility exports for Databricks bundle/app configuration.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
* IS. That last part is this module: `sql_warehouse`, `genie_space`, and
|
|
7
|
-
* `postgres` are Databricks-App concepts, and an `app.yaml` / bundle
|
|
8
|
-
* `value_from` entry is a REFERENCE to one of them whose real value is the
|
|
9
|
-
* warehouse id or Genie space id sitting on the named resource. So this module
|
|
10
|
-
* extends node-core's resource schema, adds `app.yaml` (which the bundle CLI
|
|
11
|
-
* never sees), and resolves those references.
|
|
12
|
-
*
|
|
13
|
-
* Default sources: `explicit`, then `env`, then Databricks App `config.env`
|
|
14
|
-
* (from {@link bundle}) and hard-coded `app.yaml` env entries (from
|
|
15
|
-
* {@link appYaml}). Opt in to `cli` when a dev command wants flag overrides.
|
|
16
|
-
*
|
|
17
|
-
* Server-only, and Databricks-app specific, so it lives in node-appkit rather
|
|
18
|
-
* than node-core.
|
|
4
|
+
* Configuration sources, file loading, flattening, resource references, and
|
|
5
|
+
* name normalization live in `@dbx-tools/core`'s `config` module.
|
|
19
6
|
*
|
|
20
7
|
* @module
|
|
21
8
|
*/
|
|
22
|
-
import {
|
|
23
|
-
/** Parsed payload from `databricks bundle validate --output json`. */
|
|
9
|
+
import { config as coreConfig } from "@dbx-tools/core";
|
|
24
10
|
export type BundleValidateJson = Record<string, unknown>;
|
|
25
|
-
|
|
26
|
-
export
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
export declare const
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
id: z.ZodOptional<z.ZodString>;
|
|
36
|
-
}, z.core.$strip>>;
|
|
37
|
-
genie_space: z.ZodOptional<z.ZodObject<{
|
|
38
|
-
space_id: z.ZodOptional<z.ZodString>;
|
|
39
|
-
}, z.core.$strip>>;
|
|
40
|
-
postgres: z.ZodOptional<z.ZodObject<{
|
|
41
|
-
database: z.ZodOptional<z.ZodString>;
|
|
42
|
-
branch: z.ZodOptional<z.ZodString>;
|
|
43
|
-
endpoint: z.ZodOptional<z.ZodString>;
|
|
44
|
-
}, z.core.$strip>>;
|
|
45
|
-
}, z.core.$loose>;
|
|
46
|
-
/** Single config map entry (string or repeated values, like headers). */
|
|
47
|
-
export type ConfigMapValue = string | string[] | undefined;
|
|
48
|
-
export interface ResolveConfigValueOptions {
|
|
49
|
-
/** Bundle validate JSON. Defaults to {@link bundle} (skipped inside a Databricks App). */
|
|
50
|
-
bundleData?: ConfigFile;
|
|
51
|
-
/** Parsed `app.yaml` contents. Defaults to {@link appYaml} (skipped inside a Databricks App). */
|
|
52
|
-
appData?: ConfigFile;
|
|
53
|
-
/**
|
|
54
|
-
* Sources to consult, first truthy string wins. Defaults to `explicit`, then
|
|
55
|
-
* `env`, then `bundle`.
|
|
56
|
-
*/
|
|
57
|
-
sources?: ConfigSource[];
|
|
58
|
-
/** Programmatic overrides. When set, `explicit` is prepended to `sources` unless already listed. */
|
|
59
|
-
explicit?: Record<string, ConfigMapValue>;
|
|
60
|
-
/** CLI flag values (when `cli` is listed in `sources`). */
|
|
61
|
-
cli?: Record<string, ConfigMapValue>;
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Flatten `env` entries from parsed `app.yaml` content. Literal `value` entries
|
|
65
|
-
* are returned as-is; `valueFrom` entries resolve against the sibling
|
|
66
|
-
* `resources` array when possible.
|
|
67
|
-
*/
|
|
68
|
-
export declare function flattenAppYamlEnv(data: unknown): Record<string, string>;
|
|
69
|
-
/**
|
|
70
|
-
* Flatten `resources.apps.<key>.config.env` into a `name -> value` map.
|
|
71
|
-
* Auto-picks the app only when the bundle defines exactly one.
|
|
72
|
-
*/
|
|
73
|
-
export declare function flattenAppEnv(data: unknown): Record<string, string>;
|
|
74
|
-
/**
|
|
75
|
-
* The validated bundle for `cwd` - {@link coreConfig.bundleFile}, which caches it
|
|
76
|
-
* per working directory. Returns `undefined` inside a Databricks App, where the
|
|
77
|
-
* platform has already turned `config.env` into real environment variables and
|
|
78
|
-
* there is no bundle to validate.
|
|
79
|
-
*/
|
|
11
|
+
export type ConfigFile = coreConfig.ConfigFile;
|
|
12
|
+
export type ConfigMapValue = coreConfig.ConfigMapValue;
|
|
13
|
+
export type ConfigSource = coreConfig.ConfigSource;
|
|
14
|
+
export type ResolveConfigValueOptions = coreConfig.ConfigOptions;
|
|
15
|
+
export declare const bundleAppResourceSchema: import("zod").ZodObject<{
|
|
16
|
+
name: import("zod").ZodOptional<import("zod").ZodString>;
|
|
17
|
+
}, import("zod/v4/core").$loose>;
|
|
18
|
+
export declare const flattenAppYamlEnv: typeof coreConfig.flattenAppEnv;
|
|
19
|
+
export declare const flattenAppEnv: typeof coreConfig.flattenBundleEnv;
|
|
20
|
+
export declare const getBundlePath: typeof coreConfig.getBundlePath;
|
|
80
21
|
export declare function bundle(cwd?: string): Promise<ConfigFile | undefined>;
|
|
81
|
-
/**
|
|
82
|
-
* Locate and parse `app.yaml` / `app.yml` from the bundle or project root.
|
|
83
|
-
* Cached per working directory through {@link context.cached}, so a `cwd` change
|
|
84
|
-
* re-reads instead of returning another project's file. Returns `undefined`
|
|
85
|
-
* inside a Databricks App.
|
|
86
|
-
*/
|
|
87
|
-
export declare function appYaml(cwd?: string): Promise<ConfigFile | undefined>;
|
|
88
|
-
/**
|
|
89
|
-
* Walk a dot-separated path through bundle validate JSON. When the terminal
|
|
90
|
-
* node is a bundle variable object (`{ value: "..." }`), the `value` field is
|
|
91
|
-
* returned.
|
|
92
|
-
*/
|
|
93
|
-
export declare function getBundlePath(data: BundleValidateJson, path: string): string | undefined;
|
|
94
|
-
/**
|
|
95
|
-
* Resolve a configuration string from the configured sources. Returns the first
|
|
96
|
-
* non-empty value, or `undefined` when nothing matches.
|
|
97
|
-
*
|
|
98
|
-
* Precedence follows AppKit's: explicit config, then environment variable, then
|
|
99
|
-
* whatever the Databricks App / bundle definition supplies.
|
|
100
|
-
*
|
|
101
|
-
* @example
|
|
102
|
-
* import { bundle } from "@dbx-tools/appkit";
|
|
103
|
-
*
|
|
104
|
-
* const warehouseId = await bundle.resolveConfigValue("DATABRICKS_WAREHOUSE_ID", {
|
|
105
|
-
* cli: { DATABRICKS_WAREHOUSE_ID: flags.warehouse },
|
|
106
|
-
* sources: bundle.withCliSources(),
|
|
107
|
-
* });
|
|
108
|
-
*/
|
|
109
22
|
export declare function resolveConfigValue(name: string, options?: ResolveConfigValueOptions): Promise<string | undefined>;
|
|
110
|
-
/**
|
|
111
|
-
* Sources with `cli` included, in CLI-first order. Use for dev commands that
|
|
112
|
-
* accept flag overrides.
|
|
113
|
-
*/
|
|
114
|
-
export declare function withCliSources(sources?: ConfigSource[]): ConfigSource[];
|