@dbx-tools/appkit 0.3.44 → 0.4.1
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/lib/index.d.ts +23 -0
- package/lib/index.js +20 -0
- package/lib/src/appkit.d.ts +51 -0
- package/lib/src/appkit.js +57 -0
- package/lib/src/config.d.ts +89 -0
- package/lib/src/config.js +403 -0
- package/lib/src/create-app.d.ts +72 -0
- package/lib/src/create-app.js +120 -0
- package/lib/src/databricks.d.ts +60 -0
- package/lib/src/databricks.js +107 -0
- package/lib/src/lakebase-resolver.d.ts +122 -0
- package/lib/src/lakebase-resolver.js +679 -0
- package/lib/src/pgaddress.d.ts +104 -0
- package/lib/src/pgaddress.js +171 -0
- package/lib/src/plugin.d.ts +90 -0
- package/lib/src/plugin.js +97 -0
- package/lib/src/provision.d.ts +51 -0
- package/lib/src/provision.js +133 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +11 -7
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export * as appkit from "./src/appkit.js";
|
|
2
|
+
export * as config from "./src/config.js";
|
|
3
|
+
export * as createApp from "./src/create-app.js";
|
|
4
|
+
export * as databricks from "./src/databricks.js";
|
|
5
|
+
export * as lakebaseResolver from "./src/lakebase-resolver.js";
|
|
6
|
+
export * as pgaddress from "./src/pgaddress.js";
|
|
7
|
+
export * as plugin from "./src/plugin.js";
|
|
8
|
+
export * as provision from "./src/provision.js";
|
|
9
|
+
export { tryGetExecutionContext, ensureInitialized } from "./src/appkit.js";
|
|
10
|
+
export type { ExecutionContextLike, WorkspaceClientLike } from "./src/appkit.js";
|
|
11
|
+
export { flattenAppYamlEnv, flattenAppEnv, bundle, appYaml, getBundlePath, resolveConfigValue, withCliSources } from "./src/config.js";
|
|
12
|
+
export type { BundleValidateJson, ConfigFile, ConfigSource, ConfigMapValue, ResolveConfigValueOptions } from "./src/config.js";
|
|
13
|
+
export { autoConfigure } from "./src/create-app.js";
|
|
14
|
+
export type { AutoConfigureMode, CreateAppConfig } from "./src/create-app.js";
|
|
15
|
+
export { MAX_TCP_PORT, isAppEnv, toContext } from "./src/databricks.js";
|
|
16
|
+
export type { ContextLike } from "./src/databricks.js";
|
|
17
|
+
export { parsePort, parseSslMode, nextPollDelay, pollDelay, readLakebaseInputs, resolveLakebaseConnection, applyLakebaseToEnv } from "./src/lakebase-resolver.js";
|
|
18
|
+
export type { LakebaseResolverInputs, LakebaseConnection } from "./src/lakebase-resolver.js";
|
|
19
|
+
export { SSL_MODES, parseAddress, parseResourcePath } from "./src/pgaddress.js";
|
|
20
|
+
export type { SslMode, LakebaseConnectionInputs, ParsedAddress } from "./src/pgaddress.js";
|
|
21
|
+
export { data, instance, require } from "./src/plugin.js";
|
|
22
|
+
export type { PluginContextLike } from "./src/plugin.js";
|
|
23
|
+
export { cacheGrantStatements, provisionCacheSchema } from "./src/provision.js";
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// GENERATED by projen watch - DO NOT EDIT.
|
|
2
|
+
// Regenerated from the exporting modules in ./src.
|
|
3
|
+
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
|
+
export * as appkit from "./src/appkit.js";
|
|
5
|
+
export * as config from "./src/config.js";
|
|
6
|
+
export * as createApp from "./src/create-app.js";
|
|
7
|
+
export * as databricks from "./src/databricks.js";
|
|
8
|
+
export * as lakebaseResolver from "./src/lakebase-resolver.js";
|
|
9
|
+
export * as pgaddress from "./src/pgaddress.js";
|
|
10
|
+
export * as plugin from "./src/plugin.js";
|
|
11
|
+
export * as provision from "./src/provision.js";
|
|
12
|
+
export { tryGetExecutionContext, ensureInitialized } from "./src/appkit.js";
|
|
13
|
+
export { flattenAppYamlEnv, flattenAppEnv, bundle, appYaml, getBundlePath, resolveConfigValue, withCliSources } from "./src/config.js";
|
|
14
|
+
export { autoConfigure } from "./src/create-app.js";
|
|
15
|
+
export { MAX_TCP_PORT, isAppEnv, toContext } from "./src/databricks.js";
|
|
16
|
+
export { parsePort, parseSslMode, nextPollDelay, pollDelay, readLakebaseInputs, resolveLakebaseConnection, applyLakebaseToEnv } from "./src/lakebase-resolver.js";
|
|
17
|
+
export { SSL_MODES, parseAddress, parseResourcePath } from "./src/pgaddress.js";
|
|
18
|
+
export { data, instance, require } from "./src/plugin.js";
|
|
19
|
+
export { cacheGrantStatements, provisionCacheSchema } from "./src/provision.js";
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxPQUFPLEtBQUssTUFBTSxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEtBQUssTUFBTSxNQUFNLGNBQWMsQ0FBQztBQUN2QyxPQUFPLEtBQUssU0FBUyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxVQUFVLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxLQUFLLGdCQUFnQixNQUFNLHlCQUF5QixDQUFDO0FBQzVELE9BQU8sS0FBSyxTQUFTLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxLQUFLLE1BQU0sTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxLQUFLLFNBQVMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFcEksT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWpELE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXJFLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUUvSixPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV2RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCAqIGFzIGFwcGtpdCBmcm9tIFwiLi9zcmMvYXBwa2l0XCI7XG5leHBvcnQgKiBhcyBjb25maWcgZnJvbSBcIi4vc3JjL2NvbmZpZ1wiO1xuZXhwb3J0ICogYXMgY3JlYXRlQXBwIGZyb20gXCIuL3NyYy9jcmVhdGUtYXBwXCI7XG5leHBvcnQgKiBhcyBkYXRhYnJpY2tzIGZyb20gXCIuL3NyYy9kYXRhYnJpY2tzXCI7XG5leHBvcnQgKiBhcyBsYWtlYmFzZVJlc29sdmVyIGZyb20gXCIuL3NyYy9sYWtlYmFzZS1yZXNvbHZlclwiO1xuZXhwb3J0ICogYXMgcGdhZGRyZXNzIGZyb20gXCIuL3NyYy9wZ2FkZHJlc3NcIjtcbmV4cG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiLi9zcmMvcGx1Z2luXCI7XG5leHBvcnQgKiBhcyBwcm92aXNpb24gZnJvbSBcIi4vc3JjL3Byb3Zpc2lvblwiO1xuZXhwb3J0IHsgdHJ5R2V0RXhlY3V0aW9uQ29udGV4dCwgZW5zdXJlSW5pdGlhbGl6ZWQgfSBmcm9tIFwiLi9zcmMvYXBwa2l0XCI7XG5leHBvcnQgdHlwZSB7IEV4ZWN1dGlvbkNvbnRleHRMaWtlLCBXb3Jrc3BhY2VDbGllbnRMaWtlIH0gZnJvbSBcIi4vc3JjL2FwcGtpdFwiO1xuZXhwb3J0IHsgZmxhdHRlbkFwcFlhbWxFbnYsIGZsYXR0ZW5BcHBFbnYsIGJ1bmRsZSwgYXBwWWFtbCwgZ2V0QnVuZGxlUGF0aCwgcmVzb2x2ZUNvbmZpZ1ZhbHVlLCB3aXRoQ2xpU291cmNlcyB9IGZyb20gXCIuL3NyYy9jb25maWdcIjtcbmV4cG9ydCB0eXBlIHsgQnVuZGxlVmFsaWRhdGVKc29uLCBDb25maWdGaWxlLCBDb25maWdTb3VyY2UsIENvbmZpZ01hcFZhbHVlLCBSZXNvbHZlQ29uZmlnVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2NvbmZpZ1wiO1xuZXhwb3J0IHsgYXV0b0NvbmZpZ3VyZSB9IGZyb20gXCIuL3NyYy9jcmVhdGUtYXBwXCI7XG5leHBvcnQgdHlwZSB7IEF1dG9Db25maWd1cmVNb2RlLCBDcmVhdGVBcHBDb25maWcgfSBmcm9tIFwiLi9zcmMvY3JlYXRlLWFwcFwiO1xuZXhwb3J0IHsgTUFYX1RDUF9QT1JULCBpc0FwcEVudiwgdG9Db250ZXh0IH0gZnJvbSBcIi4vc3JjL2RhdGFicmlja3NcIjtcbmV4cG9ydCB0eXBlIHsgQ29udGV4dExpa2UgfSBmcm9tIFwiLi9zcmMvZGF0YWJyaWNrc1wiO1xuZXhwb3J0IHsgcGFyc2VQb3J0LCBwYXJzZVNzbE1vZGUsIG5leHRQb2xsRGVsYXksIHBvbGxEZWxheSwgcmVhZExha2ViYXNlSW5wdXRzLCByZXNvbHZlTGFrZWJhc2VDb25uZWN0aW9uLCBhcHBseUxha2ViYXNlVG9FbnYgfSBmcm9tIFwiLi9zcmMvbGFrZWJhc2UtcmVzb2x2ZXJcIjtcbmV4cG9ydCB0eXBlIHsgTGFrZWJhc2VSZXNvbHZlcklucHV0cywgTGFrZWJhc2VDb25uZWN0aW9uIH0gZnJvbSBcIi4vc3JjL2xha2ViYXNlLXJlc29sdmVyXCI7XG5leHBvcnQgeyBTU0xfTU9ERVMsIHBhcnNlQWRkcmVzcywgcGFyc2VSZXNvdXJjZVBhdGggfSBmcm9tIFwiLi9zcmMvcGdhZGRyZXNzXCI7XG5leHBvcnQgdHlwZSB7IFNzbE1vZGUsIExha2ViYXNlQ29ubmVjdGlvbklucHV0cywgUGFyc2VkQWRkcmVzcyB9IGZyb20gXCIuL3NyYy9wZ2FkZHJlc3NcIjtcbmV4cG9ydCB7IGRhdGEsIGluc3RhbmNlLCByZXF1aXJlIH0gZnJvbSBcIi4vc3JjL3BsdWdpblwiO1xuZXhwb3J0IHR5cGUgeyBQbHVnaW5Db250ZXh0TGlrZSB9IGZyb20gXCIuL3NyYy9wbHVnaW5cIjtcbmV4cG9ydCB7IGNhY2hlR3JhbnRTdGF0ZW1lbnRzLCBwcm92aXNpb25DYWNoZVNjaGVtYSB9IGZyb20gXCIuL3NyYy9wcm92aXNpb25cIjtcbiJdfQ==
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic AppKit runtime glue: the per-request execution context and the types
|
|
3
|
+
* derived from it. Not plugin-specific - that lives in `./plugin`.
|
|
4
|
+
*
|
|
5
|
+
* `getExecutionContext()` is AppKit's own accessor for the OBO-scoped workspace
|
|
6
|
+
* client + request metadata; the wrappers here make it safe to call outside a
|
|
7
|
+
* request scope ({@link tryGetExecutionContext}) and to lazily boot a bare app
|
|
8
|
+
* ({@link ensureInitialized}), and re-export the derived types so add-on
|
|
9
|
+
* packages can type a context / client without re-deriving them inline.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import { getExecutionContext } from "@databricks/appkit";
|
|
14
|
+
/**
|
|
15
|
+
* The AppKit per-request execution context returned by `getExecutionContext()`
|
|
16
|
+
* - the OBO-scoped workspace client plus the surrounding request metadata.
|
|
17
|
+
* Derived from AppKit's own return type so it tracks the installed version, and
|
|
18
|
+
* re-exported here so add-on packages can type a context parameter without each
|
|
19
|
+
* re-deriving the same `ReturnType<typeof getExecutionContext>` inline.
|
|
20
|
+
*/
|
|
21
|
+
export type ExecutionContextLike = ReturnType<typeof getExecutionContext>;
|
|
22
|
+
/**
|
|
23
|
+
* The auth-scoped Databricks workspace client carried on an
|
|
24
|
+
* `ExecutionContextLike` (`getExecutionContext().client`). Typed structurally
|
|
25
|
+
* off AppKit so consumers don't take a direct `@databricks/sdk-experimental`
|
|
26
|
+
* dependency - the dep flows in transitively through `@databricks/appkit`.
|
|
27
|
+
*/
|
|
28
|
+
export type WorkspaceClientLike = ExecutionContextLike["client"];
|
|
29
|
+
/**
|
|
30
|
+
* The current AppKit execution context, or `undefined` when AppKit isn't
|
|
31
|
+
* initialized (outside a request scope). Swallows AppKit's
|
|
32
|
+
* {@link InitializationError}; any other error propagates.
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* import { appkit } from "@dbx-tools/appkit";
|
|
36
|
+
* import { WorkspaceClient } from "@databricks/sdk-experimental";
|
|
37
|
+
*
|
|
38
|
+
* // OBO-scoped inside a request, service principal from a CLI or script.
|
|
39
|
+
* const client = appkit.tryGetExecutionContext()?.client ?? new WorkspaceClient({});
|
|
40
|
+
*/
|
|
41
|
+
export declare function tryGetExecutionContext(): ExecutionContextLike | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Initialize a bare AppKit app (no plugins) when none is running yet.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* import { appkit } from "@dbx-tools/appkit";
|
|
47
|
+
*
|
|
48
|
+
* await appkit.ensureInitialized();
|
|
49
|
+
* const client = appkit.tryGetExecutionContext()?.client;
|
|
50
|
+
*/
|
|
51
|
+
export declare function ensureInitialized(): Promise<void>;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic AppKit runtime glue: the per-request execution context and the types
|
|
3
|
+
* derived from it. Not plugin-specific - that lives in `./plugin`.
|
|
4
|
+
*
|
|
5
|
+
* `getExecutionContext()` is AppKit's own accessor for the OBO-scoped workspace
|
|
6
|
+
* client + request metadata; the wrappers here make it safe to call outside a
|
|
7
|
+
* request scope ({@link tryGetExecutionContext}) and to lazily boot a bare app
|
|
8
|
+
* ({@link ensureInitialized}), and re-export the derived types so add-on
|
|
9
|
+
* packages can type a context / client without re-deriving them inline.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import { createApp, getExecutionContext, InitializationError } from "@databricks/appkit";
|
|
14
|
+
import { log } from "@dbx-tools/shared-core";
|
|
15
|
+
const logger = log.logger("appkit");
|
|
16
|
+
/**
|
|
17
|
+
* The current AppKit execution context, or `undefined` when AppKit isn't
|
|
18
|
+
* initialized (outside a request scope). Swallows AppKit's
|
|
19
|
+
* {@link InitializationError}; any other error propagates.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* import { appkit } from "@dbx-tools/appkit";
|
|
23
|
+
* import { WorkspaceClient } from "@databricks/sdk-experimental";
|
|
24
|
+
*
|
|
25
|
+
* // OBO-scoped inside a request, service principal from a CLI or script.
|
|
26
|
+
* const client = appkit.tryGetExecutionContext()?.client ?? new WorkspaceClient({});
|
|
27
|
+
*/
|
|
28
|
+
export function tryGetExecutionContext() {
|
|
29
|
+
try {
|
|
30
|
+
const ctx = getExecutionContext();
|
|
31
|
+
if (ctx?.client) {
|
|
32
|
+
return ctx;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
if (!(error instanceof InitializationError)) {
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Initialize a bare AppKit app (no plugins) when none is running yet.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* import { appkit } from "@dbx-tools/appkit";
|
|
47
|
+
*
|
|
48
|
+
* await appkit.ensureInitialized();
|
|
49
|
+
* const client = appkit.tryGetExecutionContext()?.client;
|
|
50
|
+
*/
|
|
51
|
+
export async function ensureInitialized() {
|
|
52
|
+
if (!tryGetExecutionContext()) {
|
|
53
|
+
logger.debug("initializing a bare AppKit app");
|
|
54
|
+
await createApp({ plugins: [] });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwa2l0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FwcGtpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7R0FXRztBQUVILE9BQU8sRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFN0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQW1CcEM7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCO0lBQ3BDLElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLG1CQUFtQixFQUFFLENBQUM7UUFDbEMsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDaEIsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDO0lBQ0gsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksbUJBQW1CLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGlCQUFpQjtJQUNyQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsRUFBRSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztRQUMvQyxNQUFNLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmljIEFwcEtpdCBydW50aW1lIGdsdWU6IHRoZSBwZXItcmVxdWVzdCBleGVjdXRpb24gY29udGV4dCBhbmQgdGhlIHR5cGVzXG4gKiBkZXJpdmVkIGZyb20gaXQuIE5vdCBwbHVnaW4tc3BlY2lmaWMgLSB0aGF0IGxpdmVzIGluIGAuL3BsdWdpbmAuXG4gKlxuICogYGdldEV4ZWN1dGlvbkNvbnRleHQoKWAgaXMgQXBwS2l0J3Mgb3duIGFjY2Vzc29yIGZvciB0aGUgT0JPLXNjb3BlZCB3b3Jrc3BhY2VcbiAqIGNsaWVudCArIHJlcXVlc3QgbWV0YWRhdGE7IHRoZSB3cmFwcGVycyBoZXJlIG1ha2UgaXQgc2FmZSB0byBjYWxsIG91dHNpZGUgYVxuICogcmVxdWVzdCBzY29wZSAoe0BsaW5rIHRyeUdldEV4ZWN1dGlvbkNvbnRleHR9KSBhbmQgdG8gbGF6aWx5IGJvb3QgYSBiYXJlIGFwcFxuICogKHtAbGluayBlbnN1cmVJbml0aWFsaXplZH0pLCBhbmQgcmUtZXhwb3J0IHRoZSBkZXJpdmVkIHR5cGVzIHNvIGFkZC1vblxuICogcGFja2FnZXMgY2FuIHR5cGUgYSBjb250ZXh0IC8gY2xpZW50IHdpdGhvdXQgcmUtZGVyaXZpbmcgdGhlbSBpbmxpbmUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUFwcCwgZ2V0RXhlY3V0aW9uQ29udGV4dCwgSW5pdGlhbGl6YXRpb25FcnJvciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJhcHBraXRcIik7XG5cbi8qKlxuICogVGhlIEFwcEtpdCBwZXItcmVxdWVzdCBleGVjdXRpb24gY29udGV4dCByZXR1cm5lZCBieSBgZ2V0RXhlY3V0aW9uQ29udGV4dCgpYFxuICogLSB0aGUgT0JPLXNjb3BlZCB3b3Jrc3BhY2UgY2xpZW50IHBsdXMgdGhlIHN1cnJvdW5kaW5nIHJlcXVlc3QgbWV0YWRhdGEuXG4gKiBEZXJpdmVkIGZyb20gQXBwS2l0J3Mgb3duIHJldHVybiB0eXBlIHNvIGl0IHRyYWNrcyB0aGUgaW5zdGFsbGVkIHZlcnNpb24sIGFuZFxuICogcmUtZXhwb3J0ZWQgaGVyZSBzbyBhZGQtb24gcGFja2FnZXMgY2FuIHR5cGUgYSBjb250ZXh0IHBhcmFtZXRlciB3aXRob3V0IGVhY2hcbiAqIHJlLWRlcml2aW5nIHRoZSBzYW1lIGBSZXR1cm5UeXBlPHR5cGVvZiBnZXRFeGVjdXRpb25Db250ZXh0PmAgaW5saW5lLlxuICovXG5leHBvcnQgdHlwZSBFeGVjdXRpb25Db250ZXh0TGlrZSA9IFJldHVyblR5cGU8dHlwZW9mIGdldEV4ZWN1dGlvbkNvbnRleHQ+O1xuXG4vKipcbiAqIFRoZSBhdXRoLXNjb3BlZCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBjbGllbnQgY2FycmllZCBvbiBhblxuICogYEV4ZWN1dGlvbkNvbnRleHRMaWtlYCAoYGdldEV4ZWN1dGlvbkNvbnRleHQoKS5jbGllbnRgKS4gVHlwZWQgc3RydWN0dXJhbGx5XG4gKiBvZmYgQXBwS2l0IHNvIGNvbnN1bWVycyBkb24ndCB0YWtlIGEgZGlyZWN0IGBAZGF0YWJyaWNrcy9zZGstZXhwZXJpbWVudGFsYFxuICogZGVwZW5kZW5jeSAtIHRoZSBkZXAgZmxvd3MgaW4gdHJhbnNpdGl2ZWx5IHRocm91Z2ggYEBkYXRhYnJpY2tzL2FwcGtpdGAuXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZUNsaWVudExpa2UgPSBFeGVjdXRpb25Db250ZXh0TGlrZVtcImNsaWVudFwiXTtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQsIG9yIGB1bmRlZmluZWRgIHdoZW4gQXBwS2l0IGlzbid0XG4gKiBpbml0aWFsaXplZCAob3V0c2lkZSBhIHJlcXVlc3Qgc2NvcGUpLiBTd2FsbG93cyBBcHBLaXQnc1xuICoge0BsaW5rIEluaXRpYWxpemF0aW9uRXJyb3J9OyBhbnkgb3RoZXIgZXJyb3IgcHJvcGFnYXRlcy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgYXBwa2l0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3Mvc2RrLWV4cGVyaW1lbnRhbFwiO1xuICpcbiAqIC8vIE9CTy1zY29wZWQgaW5zaWRlIGEgcmVxdWVzdCwgc2VydmljZSBwcmluY2lwYWwgZnJvbSBhIENMSSBvciBzY3JpcHQuXG4gKiBjb25zdCBjbGllbnQgPSBhcHBraXQudHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpPy5jbGllbnQgPz8gbmV3IFdvcmtzcGFjZUNsaWVudCh7fSk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlHZXRFeGVjdXRpb25Db250ZXh0KCk6IEV4ZWN1dGlvbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBjdHggPSBnZXRFeGVjdXRpb25Db250ZXh0KCk7XG4gICAgaWYgKGN0eD8uY2xpZW50KSB7XG4gICAgICByZXR1cm4gY3R4O1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAoIShlcnJvciBpbnN0YW5jZW9mIEluaXRpYWxpemF0aW9uRXJyb3IpKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBJbml0aWFsaXplIGEgYmFyZSBBcHBLaXQgYXBwIChubyBwbHVnaW5zKSB3aGVuIG5vbmUgaXMgcnVubmluZyB5ZXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIGF3YWl0IGFwcGtpdC5lbnN1cmVJbml0aWFsaXplZCgpO1xuICogY29uc3QgY2xpZW50ID0gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50O1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5zdXJlSW5pdGlhbGl6ZWQoKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmICghdHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiaW5pdGlhbGl6aW5nIGEgYmFyZSBBcHBLaXQgYXBwXCIpO1xuICAgIGF3YWl0IGNyZWF0ZUFwcCh7IHBsdWdpbnM6IFtdIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Layered configuration resolution for local development against a Databricks
|
|
3
|
+
* App / Asset Bundle.
|
|
4
|
+
*
|
|
5
|
+
* Default sources: `explicit`, then `env`, then Databricks App `config.env`
|
|
6
|
+
* (from {@link bundle}) and hard-coded `app.yaml` env entries (from
|
|
7
|
+
* {@link appYaml}). Opt in to `cli` when a dev command wants flag overrides.
|
|
8
|
+
*
|
|
9
|
+
* Server-only (`node:child_process`, bundle root discovery). Databricks-app
|
|
10
|
+
* specific, so it lives in node-appkit rather than shared-core.
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
/** Parsed payload from `databricks bundle validate --output json`. */
|
|
15
|
+
export type BundleValidateJson = Record<string, unknown>;
|
|
16
|
+
/** A config file discovered on disk with its parsed contents. */
|
|
17
|
+
export interface ConfigFile {
|
|
18
|
+
path: string;
|
|
19
|
+
data: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
/** Supported configuration sources, consulted in array order. */
|
|
22
|
+
export type ConfigSource = "explicit" | "cli" | "env" | "bundle";
|
|
23
|
+
/** Single config map entry (string or repeated values, like headers). */
|
|
24
|
+
export type ConfigMapValue = string | string[] | undefined;
|
|
25
|
+
export interface ResolveConfigValueOptions {
|
|
26
|
+
/** Bundle validate JSON. Defaults to {@link bundle} (skipped inside a Databricks App). */
|
|
27
|
+
bundleData?: ConfigFile;
|
|
28
|
+
/** Parsed `app.yaml` contents. Defaults to {@link appYaml} (skipped inside a Databricks App). */
|
|
29
|
+
appData?: ConfigFile;
|
|
30
|
+
/**
|
|
31
|
+
* Sources to consult, first truthy string wins. Defaults to `explicit`, then
|
|
32
|
+
* `env`, then `bundle`.
|
|
33
|
+
*/
|
|
34
|
+
sources?: ConfigSource[];
|
|
35
|
+
/** Programmatic overrides. When set, `explicit` is prepended to `sources` unless already listed. */
|
|
36
|
+
explicit?: Record<string, ConfigMapValue>;
|
|
37
|
+
/** CLI flag values (when `cli` is listed in `sources`). */
|
|
38
|
+
cli?: Record<string, ConfigMapValue>;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Flatten `env` entries from parsed `app.yaml` content. Literal `value` entries
|
|
42
|
+
* are returned as-is; `valueFrom` entries resolve against the sibling
|
|
43
|
+
* `resources` array when possible.
|
|
44
|
+
*/
|
|
45
|
+
export declare function flattenAppYamlEnv(data: unknown): Record<string, string>;
|
|
46
|
+
/**
|
|
47
|
+
* Flatten `resources.apps.<key>.config.env` into a `name -> value` map.
|
|
48
|
+
* Auto-picks the app only when the bundle defines exactly one.
|
|
49
|
+
*/
|
|
50
|
+
export declare function flattenAppEnv(data: unknown): Record<string, string>;
|
|
51
|
+
/**
|
|
52
|
+
* Locate the bundle root and run `databricks bundle validate --output json`.
|
|
53
|
+
* When `cwd` is omitted or equals `process.cwd()`, the result is memoized for
|
|
54
|
+
* the process lifetime. Returns `undefined` inside a Databricks App.
|
|
55
|
+
*/
|
|
56
|
+
export declare function bundle(cwd?: string): Promise<ConfigFile | undefined>;
|
|
57
|
+
/**
|
|
58
|
+
* Locate and parse `app.yaml` / `app.yml` from the bundle or project root. When
|
|
59
|
+
* `cwd` is omitted or equals `process.cwd()`, the result is memoized for the
|
|
60
|
+
* process lifetime. Returns `undefined` inside a Databricks App.
|
|
61
|
+
*/
|
|
62
|
+
export declare function appYaml(cwd?: string): Promise<ConfigFile | undefined>;
|
|
63
|
+
/**
|
|
64
|
+
* Walk a dot-separated path through bundle validate JSON. When the terminal
|
|
65
|
+
* node is a bundle variable object (`{ value: "..." }`), the `value` field is
|
|
66
|
+
* returned.
|
|
67
|
+
*/
|
|
68
|
+
export declare function getBundlePath(data: BundleValidateJson, path: string): string | undefined;
|
|
69
|
+
/**
|
|
70
|
+
* Resolve a configuration string from the configured sources. Returns the first
|
|
71
|
+
* non-empty value, or `undefined` when nothing matches.
|
|
72
|
+
*
|
|
73
|
+
* Precedence follows AppKit's: explicit config, then environment variable, then
|
|
74
|
+
* whatever the Databricks App / bundle definition supplies.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* import { config } from "@dbx-tools/appkit";
|
|
78
|
+
*
|
|
79
|
+
* const warehouseId = await config.resolveConfigValue("DATABRICKS_WAREHOUSE_ID", {
|
|
80
|
+
* cli: { DATABRICKS_WAREHOUSE_ID: flags.warehouse },
|
|
81
|
+
* sources: config.withCliSources(),
|
|
82
|
+
* });
|
|
83
|
+
*/
|
|
84
|
+
export declare function resolveConfigValue(name: string, options?: ResolveConfigValueOptions): Promise<string | undefined>;
|
|
85
|
+
/**
|
|
86
|
+
* Sources with `cli` included, in CLI-first order. Use for dev commands that
|
|
87
|
+
* accept flag overrides.
|
|
88
|
+
*/
|
|
89
|
+
export declare function withCliSources(sources?: ConfigSource[]): ConfigSource[];
|