@dbx-tools/appkit 0.6.82 → 0.6.86
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 +6 -9
- package/index.ts +3 -3
- package/lib/index.d.ts +3 -3
- package/lib/index.js +3 -3
- package/lib/src/{config.d.ts → bundle.d.ts} +40 -17
- package/lib/src/bundle.js +359 -0
- package/lib/src/databricks.d.ts +1 -16
- package/lib/src/databricks.js +3 -20
- package/lib/src/identity.d.ts +1 -2
- package/lib/src/identity.js +5 -4
- package/lib/src/lakebase-resolver.d.ts +1 -1
- package/lib/src/lakebase-resolver.js +7 -7
- package/lib/src/provision.js +3 -3
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
- package/src/{config.ts → bundle.ts} +55 -107
- package/src/databricks.ts +2 -21
- package/src/identity.ts +5 -4
- package/src/lakebase-resolver.ts +10 -6
- package/src/provision.ts +2 -3
- package/lib/src/config.js +0 -403
package/lib/src/provision.js
CHANGED
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
* @module
|
|
22
22
|
*/
|
|
23
23
|
import { createLakebasePool, getWorkspaceClient, ValidationError } from "@databricks/appkit";
|
|
24
|
+
import { config } from "@dbx-tools/core";
|
|
24
25
|
import { error, log } from "@dbx-tools/shared-core";
|
|
25
|
-
import { isAppEnv } from "./databricks.js";
|
|
26
26
|
const defaultLogger = log.logger("provision");
|
|
27
27
|
/** AppKit persistent-cache schema (see AppKit's `PersistentStorage`). */
|
|
28
28
|
const CACHE_SCHEMA = "appkit";
|
|
@@ -89,7 +89,7 @@ export function cacheGrantStatements(role) {
|
|
|
89
89
|
* await provision.provisionCacheSchema("app-service-principal@databricks.com");
|
|
90
90
|
*/
|
|
91
91
|
export async function provisionCacheSchema(role, logger = defaultLogger) {
|
|
92
|
-
if (
|
|
92
|
+
if (config.isDatabricksAppEnv()) {
|
|
93
93
|
logger.debug("autopg: skip cache provisioning (inside a Databricks App)");
|
|
94
94
|
return;
|
|
95
95
|
}
|
|
@@ -130,4 +130,4 @@ export async function provisionCacheSchema(role, logger = defaultLogger) {
|
|
|
130
130
|
await pool.end().catch(() => { });
|
|
131
131
|
}
|
|
132
132
|
}
|
|
133
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3Zpc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNDLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFOUMseUVBQXlFO0FBQ3pFLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQztBQUU5Qjs7O0dBR0c7QUFDSCxNQUFNLFlBQVksR0FBRywyQkFBMkIsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7QUFDbEMsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFFcEM7Ozs7OztHQU1HO0FBQ0gsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUMvQixPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUMxQyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFZO0lBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxPQUFPO1FBQ0wsaUNBQWlDLE1BQU0sT0FBTyxNQUFNLEVBQUU7UUFDdEQsZ0RBQWdELE1BQU0sT0FBTyxNQUFNLEVBQUU7UUFDckUsbURBQW1ELE1BQU0sT0FBTyxNQUFNLEVBQUU7UUFDeEUsc0NBQXNDLE1BQU0sMkJBQTJCLE1BQU0sRUFBRTtRQUMvRSxzQ0FBc0MsTUFBTSw4QkFBOEIsTUFBTSxFQUFFO0tBQ25GLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsSUFBd0IsRUFDeEIsU0FBcUIsYUFBYTtJQUVsQyxJQUFJLFFBQVEsRUFBRSxFQUFFLENBQUM7UUFDZixNQUFNLENBQUMsS0FBSyxDQUFDLDJEQUEyRCxDQUFDLENBQUM7UUFDMUUsT0FBTztJQUNULENBQUM7SUFDRCxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLENBQUMsSUFBSSxDQUFDLHFFQUFxRSxDQUFDLENBQUM7UUFDbkYsT0FBTztJQUNULENBQUM7SUFDRCxnRUFBZ0U7SUFDaEUsMkVBQTJFO0lBQzNFLDhFQUE4RTtJQUM5RSw2RUFBNkU7SUFDN0UsMEVBQTBFO0lBQzFFLGlGQUFpRjtJQUNqRixNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQztRQUM5QixJQUFJLEVBQUUsSUFBSTtRQUNWLGVBQWUsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7UUFDdkMsdUJBQXVCLEVBQUUsa0JBQWtCO1FBQzNDLGlCQUFpQixFQUFFLG9CQUFvQjtLQUN4QyxDQUFDLENBQUM7SUFDSCxJQUFJLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQzVCLGtFQUFrRSxFQUNsRSxDQUFDLFlBQVksQ0FBQyxDQUNmLENBQUM7UUFDRixJQUFJLEtBQUssQ0FBQyxRQUFRLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekIsTUFBTSxDQUFDLEtBQUssQ0FBQyxpREFBaUQsRUFBRSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1lBQzFGLE9BQU87UUFDVCxDQUFDO1FBQ0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN4QixDQUFDO1FBQ0QsTUFBTSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNiLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0RBQWdELEVBQUU7WUFDNUQsTUFBTSxFQUFFLFlBQVk7WUFDcEIsS0FBSyxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUM7WUFBUyxDQUFDO1FBQ1QsTUFBTSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxHQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25DLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMYWtlYmFzZSBjYWNoZS1zY2hlbWEgZ3JhbnQgZml4LXVwLlxuICpcbiAqIEFwcEtpdCdzIHBlcnNpc3RlbnQgY2FjaGUgKGBDYWNoZU1hbmFnZXJgIC0+IGBQZXJzaXN0ZW50U3RvcmFnZWApIHVzZXMgYVxuICogc2NoZW1hIGBhcHBraXRgIGFuZCBhIHRhYmxlIGBhcHBraXQuYXBwa2l0X2NhY2hlX2VudHJpZXNgLiBXaGVuIHRoZSBjb25uZWN0aW5nXG4gKiBEYXRhYnJpY2tzIGlkZW50aXR5IGxhY2tzIHByaXZpbGVnZXMgb24gdGhhdCBzY2hlbWEsIHRoZSBjYWNoZSBtaWdyYXRpb25cbiAqIHRocm93cywgYW5kIGJlY2F1c2UgQXBwS2l0IGlzIHR5cGljYWxseSBydW4gd2l0aCBgY2FjaGUuc3RyaWN0UGVyc2lzdGVuY2U6XG4gKiB0cnVlYCwgdGhlIGNhY2hlIGlzIHNpbGVudGx5IHN3aXRjaGVkIHRvIGEgZGlzYWJsZWQgaW4tbWVtb3J5IHN0dWIgLSBzbyBldmVyeVxuICogcGVyc2lzdGVudCByZWFkIChjaGFydCBsb25nLXBvbGwsIGhpc3RvcnksIGV0Yy4pIG1pc3NlcyBhbmQgNDA0cy5cbiAqXG4gKiBUaGlzIGdyYW50cyB0aGUgY29ubmVjdGluZyByb2xlIGZ1bGwgcmlnaHRzIG9uIHRoZSBjYWNoZSBzY2hlbWEsIGJ1dCBvbmx5IHdoZW5cbiAqIHRoZSBzY2hlbWEgQUxSRUFEWSBFWElTVFMgLSBpdCBuZXZlciBjcmVhdGVzIHRoZSBzY2hlbWEgaXRzZWxmLiBSdW4gZnJvbSBhXG4gKiBMT0NBTCBpZGVudGl0eSB0aGF0IG93bnMgdGhlIHNjaGVtYSAob3IgaG9sZHMgZ3JhbnQgb3B0aW9uIG9uIGl0KTsgaXQgaXNcbiAqIHNraXBwZWQgaW5zaWRlIGEgRGF0YWJyaWNrcyBBcHAsIHdoZXJlIHRoZSBhcHAgU1AgY2Fubm90IGdyYW50IGFuZCBpdHNcbiAqIFBvc3RncmVzIHJvbGUgZG9lcyBub3QgZXhpc3QgdW50aWwgaXRzIGZpcnN0IGNvbm5lY3Rpb24uXG4gKlxuICogTXVzdCBydW4gQUZURVIge0BsaW5rIGFwcGx5TGFrZWJhc2VUb0Vudn0gaGFzIHdyaXR0ZW4gdGhlIHJlc29sdmVkIGNvbm5lY3Rpb25cbiAqIHRvIGBwcm9jZXNzLmVudmAgKHNvIGBjcmVhdGVMYWtlYmFzZVBvb2xgIHBpY2tzIHVwIGhvc3QgLyBkYXRhYmFzZSAvIGVuZHBvaW50KVxuICogYW5kIEJFRk9SRSBgY3JlYXRlQXBwYCBpbml0aWFsaXplcyB0aGUgY2FjaGUuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUxha2ViYXNlUG9vbCwgZ2V0V29ya3NwYWNlQ2xpZW50LCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvciwgbG9nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuaW1wb3J0IHsgaXNBcHBFbnYgfSBmcm9tIFwiLi9kYXRhYnJpY2tzLnRzXCI7XG5cbmNvbnN0IGRlZmF1bHRMb2dnZXIgPSBsb2cubG9nZ2VyKFwicHJvdmlzaW9uXCIpO1xuXG4vKiogQXBwS2l0IHBlcnNpc3RlbnQtY2FjaGUgc2NoZW1hIChzZWUgQXBwS2l0J3MgYFBlcnNpc3RlbnRTdG9yYWdlYCkuICovXG5jb25zdCBDQUNIRV9TQ0hFTUEgPSBcImFwcGtpdFwiO1xuXG4vKipcbiAqIENoYXJhY3RlcnMgYSBMYWtlYmFzZSBQb3N0Z3JlcyByb2xlIGNhbiBsZWdpdGltYXRlbHkgY29udGFpbjogd29ya3NwYWNlXG4gKiBpZGVudGl0aWVzIGFyZSBlbWFpbHMsIHNlcnZpY2UgcHJpbmNpcGFscyBhcmUgVVVJRHMuXG4gKi9cbmNvbnN0IFJPTEVfUEFUVEVSTiA9IC9eW0EtWmEtejAtOS5fQCstXXsxLDI1NX0kLztcblxuLyoqXG4gKiBQcm92aXNpb25pbmcgcnVucyBhdCBib290IGFzIHRoZSBsb2NhbCBkZXZlbG9wZXIgaWRlbnRpdHksIGJlZm9yZSBhbnkgcGx1Z2luXG4gKiBleGlzdHMsIHNvIGl0IGlzIG91dHNpZGUgQXBwS2l0J3MgaW50ZXJjZXB0b3IgY2hhaW4gYW5kIGluaGVyaXRzIG5vIHRpbWVvdXRcbiAqIGZyb20gaXQuIEJvdGggYm91bmRzIGFyZSBleHBsaWNpdCBmb3IgdGhhdCByZWFzb24uXG4gKi9cbmNvbnN0IENPTk5FQ1RfVElNRU9VVF9NUyA9IDEwXzAwMDtcbmNvbnN0IFNUQVRFTUVOVF9USU1FT1VUX01TID0gMTVfMDAwO1xuXG4vKipcbiAqIFF1b3RlIGEgUG9zdGdyZXMgaWRlbnRpZmllcjogd3JhcCBpbiBkb3VibGUgcXVvdGVzIGFuZCBkb3VibGUgYW55IGVtYmVkZGVkXG4gKiBxdW90ZS4gU2NoZW1hIGFuZCByb2xlIG5hbWVzIGFyZSBpZGVudGlmaWVycywgYW5kIFBvc3RncmVzIGRvZXMgbm90IGFjY2VwdCBhXG4gKiBiaW5kIHBhcmFtZXRlciBpbiBhbiBpZGVudGlmaWVyIHBvc2l0aW9uLCBzbyBxdW90aW5nIGlzIHRoZSBvbmx5IGRlZmVuc2VcbiAqIGF2YWlsYWJsZSBmb3IgdGhlc2Ugc3RhdGVtZW50cy4gTGFrZWJhc2Ugcm9sZSBuYW1lcyBhcmUgdXN1YWxseSBlbWFpbHNcbiAqIChgdXNlckBob3N0YCksIHdoaWNoIG11c3QgYmUgcXVvdGVkIHRvIGJlIGEgdmFsaWQgaWRlbnRpZmllciBhdCBhbGwuXG4gKi9cbmZ1bmN0aW9uIHF1b3RlSWRlbnQoaWRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgXCIke2lkZW50LnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgO1xufVxuXG4vKipcbiAqIElkZW1wb3RlbnQgZ3JhbnRzIHRoYXQgbWFrZSB0aGUgKGFscmVhZHktZXhpc3RpbmcpIEFwcEtpdCBjYWNoZSBzY2hlbWEgZnVsbHlcbiAqIHVzYWJsZSBieSBgcm9sZWAuIFRoZSBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTYCBsaW5lcyBjb3ZlciB0aGUgY2FjaGUgdGFibGVcbiAqIHdoZW5ldmVyIHRoZSBzY2hlbWEgb3duZXIgY3JlYXRlcyBpdCBsYXRlci5cbiAqXG4gKiBUaHJvd3MgYSB7QGxpbmsgVmFsaWRhdGlvbkVycm9yfSB3aGVuIGByb2xlYCBpcyBub3QgYSBwbGF1c2libGUgUG9zdGdyZXMgcm9sZVxuICogbmFtZSwgc2luY2UgdGhlIHZhbHVlIGxhbmRzIGluIGFuIGlkZW50aWZpZXIgcG9zaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZUdyYW50U3RhdGVtZW50cyhyb2xlOiBzdHJpbmcpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIGlmICghUk9MRV9QQVRURVJOLnRlc3Qocm9sZSkpIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFwicm9sZVwiLCByb2xlLCBcImEgUG9zdGdyZXMgcm9sZSBuYW1lXCIpO1xuICB9XG4gIGNvbnN0IHNjaGVtYSA9IHF1b3RlSWRlbnQoQ0FDSEVfU0NIRU1BKTtcbiAgY29uc3QgdGFyZ2V0ID0gcXVvdGVJZGVudChyb2xlKTtcbiAgcmV0dXJuIFtcbiAgICBgR1JBTlQgVVNBR0UsIENSRUFURSBPTiBTQ0hFTUEgJHtzY2hlbWF9IFRPICR7dGFyZ2V0fWAsXG4gICAgYEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BICR7c2NoZW1hfSBUTyAke3RhcmdldH1gLFxuICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgU0VRVUVOQ0VTIElOIFNDSEVNQSAke3NjaGVtYX0gVE8gJHt0YXJnZXR9YCxcbiAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIElOIFNDSEVNQSAke3NjaGVtYX0gR1JBTlQgQUxMIE9OIFRBQkxFUyBUTyAke3RhcmdldH1gLFxuICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgSU4gU0NIRU1BICR7c2NoZW1hfSBHUkFOVCBBTEwgT04gU0VRVUVOQ0VTIFRPICR7dGFyZ2V0fWAsXG4gIF07XG59XG5cbi8qKlxuICogR3JhbnQgYHJvbGVgIHJpZ2h0cyBvbiB0aGUgQXBwS2l0IGNhY2hlIHNjaGVtYSwgYnV0IG9ubHkgd2hlbiB0aGF0IHNjaGVtYVxuICogYWxyZWFkeSBleGlzdHMuXG4gKlxuICogTm8tb3BzIGluc2lkZSBhIERhdGFicmlja3MgQXBwIGVudiwgd2hlbiBgcm9sZWAgaXMgdW5kZWZpbmVkLCBvciB3aGVuIHRoZVxuICogc2NoZW1hIGlzIGFic2VudC4gQmVzdC1lZmZvcnQgb3RoZXJ3aXNlOiBhbnkgZmFpbHVyZSAoZS5nLiB0aGUgbG9jYWwgaWRlbnRpdHlcbiAqIGRvZXNuJ3Qgb3duIHRoZSBzY2hlbWEpIGlzIGxvZ2dlZCBhbmQgc3dhbGxvd2VkIHNvIGl0IG5ldmVyIGJsb2NrcyBzdGFydHVwIC1cbiAqIGEgZGlzYWJsZWQgY2FjaGUgaXMgZGVncmFkZWQsIG5vdCBmYXRhbC5cbiAqXG4gKiBAcGFyYW0gcm9sZSAtIFBvc3RncmVzIHJvbGUgdG8gZ3JhbnQgdG8gYW5kIGNvbm5lY3QgYXMgKHRoZSByZXNvbHZlZFxuICogICB3b3Jrc3BhY2UtY2xpZW50IGlkZW50aXR5KTsgc2tpcHMgd2hlbiB1bmRlZmluZWQuXG4gKiBAcGFyYW0gbG9nZ2VyIC0gTG9nZ2VyIHRvIHJlcG9ydCBwcm9ncmVzcyBvbi4gRGVmYXVsdHMgdG8gdGhpcyBtb2R1bGUncy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgcHJvdmlzaW9uIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogYXdhaXQgcHJvdmlzaW9uLnByb3Zpc2lvbkNhY2hlU2NoZW1hKFwiYXBwLXNlcnZpY2UtcHJpbmNpcGFsQGRhdGFicmlja3MuY29tXCIpO1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvdmlzaW9uQ2FjaGVTY2hlbWEoXG4gIHJvbGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbG9nZ2VyOiBsb2cuTG9nZ2VyID0gZGVmYXVsdExvZ2dlcixcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoaXNBcHBFbnYoKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogc2tpcCBjYWNoZSBwcm92aXNpb25pbmcgKGluc2lkZSBhIERhdGFicmlja3MgQXBwKVwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFyb2xlKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJhdXRvcGc6IHNraXAgY2FjaGUgcHJvdmlzaW9uaW5nIChjb3VsZCBub3QgcmVzb2x2ZSBjb25uZWN0aW5nIHJvbGUpXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBQYXNzIGB1c2VyYCBleHBsaWNpdGx5OiBhdXRvcGcgcmVzb2x2ZXMgdGhlIGNvbm5lY3Rpb24gdGFyZ2V0XG4gIC8vIChob3N0L2RhdGFiYXNlL2VuZHBvaW50KSBidXQgbm90IHRoZSBpZGVudGl0eSwgc28gYGNyZWF0ZUxha2ViYXNlUG9vbGAnc1xuICAvLyBzeW5jaHJvbm91cyB1c2VybmFtZSBsb29rdXAgd291bGQgb3RoZXJ3aXNlIHRocm93LiBgZ2V0V29ya3NwYWNlQ2xpZW50KHt9KWBcbiAgLy8gcmV0dXJucyBhIGZyZXNoIGRlZmF1bHQtYXV0aCBjbGllbnQgLSBsaXRlcmFsbHkgYG5ldyBXb3Jrc3BhY2VDbGllbnQoe30pYCxcbiAgLy8gYnV0IGJ1aWx0IGFnYWluc3QgdGhlIFNESyB2ZXJzaW9uIEFwcEtpdCdzIGBjcmVhdGVMYWtlYmFzZVBvb2xgIGV4cGVjdHNcbiAgLy8gKGltcG9ydGluZyB0aGUgU0RLIGNsYXNzIGRpcmVjdGx5IGhlcmUgcHVsbHMgYSBuZXdlciwgdHlwZS1pbmNvbXBhdGlibGUgY29weSkuXG4gIGNvbnN0IHBvb2wgPSBjcmVhdGVMYWtlYmFzZVBvb2woe1xuICAgIHVzZXI6IHJvbGUsXG4gICAgd29ya3NwYWNlQ2xpZW50OiBnZXRXb3Jrc3BhY2VDbGllbnQoe30pLFxuICAgIGNvbm5lY3Rpb25UaW1lb3V0TWlsbGlzOiBDT05ORUNUX1RJTUVPVVRfTVMsXG4gICAgc3RhdGVtZW50X3RpbWVvdXQ6IFNUQVRFTUVOVF9USU1FT1VUX01TLFxuICB9KTtcbiAgdHJ5IHtcbiAgICBjb25zdCBmb3VuZCA9IGF3YWl0IHBvb2wucXVlcnkoXG4gICAgICBcIlNFTEVDVCAxIEZST00gaW5mb3JtYXRpb25fc2NoZW1hLnNjaGVtYXRhIFdIRVJFIHNjaGVtYV9uYW1lID0gJDFcIixcbiAgICAgIFtDQUNIRV9TQ0hFTUFdLFxuICAgICk7XG4gICAgaWYgKGZvdW5kLnJvd0NvdW50ID09PSAwKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IHNraXAgY2FjaGUgcHJvdmlzaW9uaW5nIChzY2hlbWEgYWJzZW50KVwiLCB7IHNjaGVtYTogQ0FDSEVfU0NIRU1BIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHNxbCBvZiBjYWNoZUdyYW50U3RhdGVtZW50cyhyb2xlKSkge1xuICAgICAgYXdhaXQgcG9vbC5xdWVyeShzcWwpO1xuICAgIH1cbiAgICBsb2dnZXIuaW5mbyhcImF1dG9wZzogZ3JhbnRlZCBjYWNoZSBzY2hlbWFcIiwgeyBzY2hlbWE6IENBQ0hFX1NDSEVNQSwgcm9sZSB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJhdXRvcGc6IGNhY2hlIHByb3Zpc2lvbmluZyBmYWlsZWQgKGNvbnRpbnVpbmcpXCIsIHtcbiAgICAgIHNjaGVtYTogQ0FDSEVfU0NIRU1BLFxuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IHBvb2wuZW5kKCkuY2F0Y2goKCkgPT4ge30pO1xuICB9XG59XG4iXX0=
|
|
133
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3Zpc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXBELE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFOUMseUVBQXlFO0FBQ3pFLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQztBQUU5Qjs7O0dBR0c7QUFDSCxNQUFNLFlBQVksR0FBRywyQkFBMkIsQ0FBQztBQUVqRDs7OztHQUlHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxNQUFNLENBQUM7QUFDbEMsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUM7QUFFcEM7Ozs7OztHQU1HO0FBQ0gsU0FBUyxVQUFVLENBQUMsS0FBYTtJQUMvQixPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQztBQUMxQyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFZO0lBQy9DLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxlQUFlLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBQ0QsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxPQUFPO1FBQ0wsaUNBQWlDLE1BQU0sT0FBTyxNQUFNLEVBQUU7UUFDdEQsZ0RBQWdELE1BQU0sT0FBTyxNQUFNLEVBQUU7UUFDckUsbURBQW1ELE1BQU0sT0FBTyxNQUFNLEVBQUU7UUFDeEUsc0NBQXNDLE1BQU0sMkJBQTJCLE1BQU0sRUFBRTtRQUMvRSxzQ0FBc0MsTUFBTSw4QkFBOEIsTUFBTSxFQUFFO0tBQ25GLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsSUFBd0IsRUFDeEIsU0FBcUIsYUFBYTtJQUVsQyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUM7UUFDaEMsTUFBTSxDQUFDLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1FBQzFFLE9BQU87SUFDVCxDQUFDO0lBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1FBQ25GLE9BQU87SUFDVCxDQUFDO0lBQ0QsZ0VBQWdFO0lBQ2hFLDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLDBFQUEwRTtJQUMxRSxpRkFBaUY7SUFDakYsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUM7UUFDOUIsSUFBSSxFQUFFLElBQUk7UUFDVixlQUFlLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLHVCQUF1QixFQUFFLGtCQUFrQjtRQUMzQyxpQkFBaUIsRUFBRSxvQkFBb0I7S0FDeEMsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUM1QixrRUFBa0UsRUFDbEUsQ0FBQyxZQUFZLENBQUMsQ0FDZixDQUFDO1FBQ0YsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsaURBQWlELEVBQUUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUMxRixPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssTUFBTSxHQUFHLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxFQUFFO1lBQzVELE1BQU0sRUFBRSxZQUFZO1lBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztTQUMvQixDQUFDLENBQUM7SUFDTCxDQUFDO1lBQVMsQ0FBQztRQUNULE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGFrZWJhc2UgY2FjaGUtc2NoZW1hIGdyYW50IGZpeC11cC5cbiAqXG4gKiBBcHBLaXQncyBwZXJzaXN0ZW50IGNhY2hlIChgQ2FjaGVNYW5hZ2VyYCAtPiBgUGVyc2lzdGVudFN0b3JhZ2VgKSB1c2VzIGFcbiAqIHNjaGVtYSBgYXBwa2l0YCBhbmQgYSB0YWJsZSBgYXBwa2l0LmFwcGtpdF9jYWNoZV9lbnRyaWVzYC4gV2hlbiB0aGUgY29ubmVjdGluZ1xuICogRGF0YWJyaWNrcyBpZGVudGl0eSBsYWNrcyBwcml2aWxlZ2VzIG9uIHRoYXQgc2NoZW1hLCB0aGUgY2FjaGUgbWlncmF0aW9uXG4gKiB0aHJvd3MsIGFuZCBiZWNhdXNlIEFwcEtpdCBpcyB0eXBpY2FsbHkgcnVuIHdpdGggYGNhY2hlLnN0cmljdFBlcnNpc3RlbmNlOlxuICogdHJ1ZWAsIHRoZSBjYWNoZSBpcyBzaWxlbnRseSBzd2l0Y2hlZCB0byBhIGRpc2FibGVkIGluLW1lbW9yeSBzdHViIC0gc28gZXZlcnlcbiAqIHBlcnNpc3RlbnQgcmVhZCAoY2hhcnQgbG9uZy1wb2xsLCBoaXN0b3J5LCBldGMuKSBtaXNzZXMgYW5kIDQwNHMuXG4gKlxuICogVGhpcyBncmFudHMgdGhlIGNvbm5lY3Rpbmcgcm9sZSBmdWxsIHJpZ2h0cyBvbiB0aGUgY2FjaGUgc2NoZW1hLCBidXQgb25seSB3aGVuXG4gKiB0aGUgc2NoZW1hIEFMUkVBRFkgRVhJU1RTIC0gaXQgbmV2ZXIgY3JlYXRlcyB0aGUgc2NoZW1hIGl0c2VsZi4gUnVuIGZyb20gYVxuICogTE9DQUwgaWRlbnRpdHkgdGhhdCBvd25zIHRoZSBzY2hlbWEgKG9yIGhvbGRzIGdyYW50IG9wdGlvbiBvbiBpdCk7IGl0IGlzXG4gKiBza2lwcGVkIGluc2lkZSBhIERhdGFicmlja3MgQXBwLCB3aGVyZSB0aGUgYXBwIFNQIGNhbm5vdCBncmFudCBhbmQgaXRzXG4gKiBQb3N0Z3JlcyByb2xlIGRvZXMgbm90IGV4aXN0IHVudGlsIGl0cyBmaXJzdCBjb25uZWN0aW9uLlxuICpcbiAqIE11c3QgcnVuIEFGVEVSIHtAbGluayBhcHBseUxha2ViYXNlVG9FbnZ9IGhhcyB3cml0dGVuIHRoZSByZXNvbHZlZCBjb25uZWN0aW9uXG4gKiB0byBgcHJvY2Vzcy5lbnZgIChzbyBgY3JlYXRlTGFrZWJhc2VQb29sYCBwaWNrcyB1cCBob3N0IC8gZGF0YWJhc2UgLyBlbmRwb2ludClcbiAqIGFuZCBCRUZPUkUgYGNyZWF0ZUFwcGAgaW5pdGlhbGl6ZXMgdGhlIGNhY2hlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVMYWtlYmFzZVBvb2wsIGdldFdvcmtzcGFjZUNsaWVudCwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgZXJyb3IsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmNvbnN0IGRlZmF1bHRMb2dnZXIgPSBsb2cubG9nZ2VyKFwicHJvdmlzaW9uXCIpO1xuXG4vKiogQXBwS2l0IHBlcnNpc3RlbnQtY2FjaGUgc2NoZW1hIChzZWUgQXBwS2l0J3MgYFBlcnNpc3RlbnRTdG9yYWdlYCkuICovXG5jb25zdCBDQUNIRV9TQ0hFTUEgPSBcImFwcGtpdFwiO1xuXG4vKipcbiAqIENoYXJhY3RlcnMgYSBMYWtlYmFzZSBQb3N0Z3JlcyByb2xlIGNhbiBsZWdpdGltYXRlbHkgY29udGFpbjogd29ya3NwYWNlXG4gKiBpZGVudGl0aWVzIGFyZSBlbWFpbHMsIHNlcnZpY2UgcHJpbmNpcGFscyBhcmUgVVVJRHMuXG4gKi9cbmNvbnN0IFJPTEVfUEFUVEVSTiA9IC9eW0EtWmEtejAtOS5fQCstXXsxLDI1NX0kLztcblxuLyoqXG4gKiBQcm92aXNpb25pbmcgcnVucyBhdCBib290IGFzIHRoZSBsb2NhbCBkZXZlbG9wZXIgaWRlbnRpdHksIGJlZm9yZSBhbnkgcGx1Z2luXG4gKiBleGlzdHMsIHNvIGl0IGlzIG91dHNpZGUgQXBwS2l0J3MgaW50ZXJjZXB0b3IgY2hhaW4gYW5kIGluaGVyaXRzIG5vIHRpbWVvdXRcbiAqIGZyb20gaXQuIEJvdGggYm91bmRzIGFyZSBleHBsaWNpdCBmb3IgdGhhdCByZWFzb24uXG4gKi9cbmNvbnN0IENPTk5FQ1RfVElNRU9VVF9NUyA9IDEwXzAwMDtcbmNvbnN0IFNUQVRFTUVOVF9USU1FT1VUX01TID0gMTVfMDAwO1xuXG4vKipcbiAqIFF1b3RlIGEgUG9zdGdyZXMgaWRlbnRpZmllcjogd3JhcCBpbiBkb3VibGUgcXVvdGVzIGFuZCBkb3VibGUgYW55IGVtYmVkZGVkXG4gKiBxdW90ZS4gU2NoZW1hIGFuZCByb2xlIG5hbWVzIGFyZSBpZGVudGlmaWVycywgYW5kIFBvc3RncmVzIGRvZXMgbm90IGFjY2VwdCBhXG4gKiBiaW5kIHBhcmFtZXRlciBpbiBhbiBpZGVudGlmaWVyIHBvc2l0aW9uLCBzbyBxdW90aW5nIGlzIHRoZSBvbmx5IGRlZmVuc2VcbiAqIGF2YWlsYWJsZSBmb3IgdGhlc2Ugc3RhdGVtZW50cy4gTGFrZWJhc2Ugcm9sZSBuYW1lcyBhcmUgdXN1YWxseSBlbWFpbHNcbiAqIChgdXNlckBob3N0YCksIHdoaWNoIG11c3QgYmUgcXVvdGVkIHRvIGJlIGEgdmFsaWQgaWRlbnRpZmllciBhdCBhbGwuXG4gKi9cbmZ1bmN0aW9uIHF1b3RlSWRlbnQoaWRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgXCIke2lkZW50LnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgO1xufVxuXG4vKipcbiAqIElkZW1wb3RlbnQgZ3JhbnRzIHRoYXQgbWFrZSB0aGUgKGFscmVhZHktZXhpc3RpbmcpIEFwcEtpdCBjYWNoZSBzY2hlbWEgZnVsbHlcbiAqIHVzYWJsZSBieSBgcm9sZWAuIFRoZSBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTYCBsaW5lcyBjb3ZlciB0aGUgY2FjaGUgdGFibGVcbiAqIHdoZW5ldmVyIHRoZSBzY2hlbWEgb3duZXIgY3JlYXRlcyBpdCBsYXRlci5cbiAqXG4gKiBUaHJvd3MgYSB7QGxpbmsgVmFsaWRhdGlvbkVycm9yfSB3aGVuIGByb2xlYCBpcyBub3QgYSBwbGF1c2libGUgUG9zdGdyZXMgcm9sZVxuICogbmFtZSwgc2luY2UgdGhlIHZhbHVlIGxhbmRzIGluIGFuIGlkZW50aWZpZXIgcG9zaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWNoZUdyYW50U3RhdGVtZW50cyhyb2xlOiBzdHJpbmcpOiByZWFkb25seSBzdHJpbmdbXSB7XG4gIGlmICghUk9MRV9QQVRURVJOLnRlc3Qocm9sZSkpIHtcbiAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFwicm9sZVwiLCByb2xlLCBcImEgUG9zdGdyZXMgcm9sZSBuYW1lXCIpO1xuICB9XG4gIGNvbnN0IHNjaGVtYSA9IHF1b3RlSWRlbnQoQ0FDSEVfU0NIRU1BKTtcbiAgY29uc3QgdGFyZ2V0ID0gcXVvdGVJZGVudChyb2xlKTtcbiAgcmV0dXJuIFtcbiAgICBgR1JBTlQgVVNBR0UsIENSRUFURSBPTiBTQ0hFTUEgJHtzY2hlbWF9IFRPICR7dGFyZ2V0fWAsXG4gICAgYEdSQU5UIEFMTCBQUklWSUxFR0VTIE9OIEFMTCBUQUJMRVMgSU4gU0NIRU1BICR7c2NoZW1hfSBUTyAke3RhcmdldH1gLFxuICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgU0VRVUVOQ0VTIElOIFNDSEVNQSAke3NjaGVtYX0gVE8gJHt0YXJnZXR9YCxcbiAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIElOIFNDSEVNQSAke3NjaGVtYX0gR1JBTlQgQUxMIE9OIFRBQkxFUyBUTyAke3RhcmdldH1gLFxuICAgIGBBTFRFUiBERUZBVUxUIFBSSVZJTEVHRVMgSU4gU0NIRU1BICR7c2NoZW1hfSBHUkFOVCBBTEwgT04gU0VRVUVOQ0VTIFRPICR7dGFyZ2V0fWAsXG4gIF07XG59XG5cbi8qKlxuICogR3JhbnQgYHJvbGVgIHJpZ2h0cyBvbiB0aGUgQXBwS2l0IGNhY2hlIHNjaGVtYSwgYnV0IG9ubHkgd2hlbiB0aGF0IHNjaGVtYVxuICogYWxyZWFkeSBleGlzdHMuXG4gKlxuICogTm8tb3BzIGluc2lkZSBhIERhdGFicmlja3MgQXBwIGVudiwgd2hlbiBgcm9sZWAgaXMgdW5kZWZpbmVkLCBvciB3aGVuIHRoZVxuICogc2NoZW1hIGlzIGFic2VudC4gQmVzdC1lZmZvcnQgb3RoZXJ3aXNlOiBhbnkgZmFpbHVyZSAoZS5nLiB0aGUgbG9jYWwgaWRlbnRpdHlcbiAqIGRvZXNuJ3Qgb3duIHRoZSBzY2hlbWEpIGlzIGxvZ2dlZCBhbmQgc3dhbGxvd2VkIHNvIGl0IG5ldmVyIGJsb2NrcyBzdGFydHVwIC1cbiAqIGEgZGlzYWJsZWQgY2FjaGUgaXMgZGVncmFkZWQsIG5vdCBmYXRhbC5cbiAqXG4gKiBAcGFyYW0gcm9sZSAtIFBvc3RncmVzIHJvbGUgdG8gZ3JhbnQgdG8gYW5kIGNvbm5lY3QgYXMgKHRoZSByZXNvbHZlZFxuICogICB3b3Jrc3BhY2UtY2xpZW50IGlkZW50aXR5KTsgc2tpcHMgd2hlbiB1bmRlZmluZWQuXG4gKiBAcGFyYW0gbG9nZ2VyIC0gTG9nZ2VyIHRvIHJlcG9ydCBwcm9ncmVzcyBvbi4gRGVmYXVsdHMgdG8gdGhpcyBtb2R1bGUncy5cbiAqXG4gKiBAZXhhbXBsZVxuICogaW1wb3J0IHsgcHJvdmlzaW9uIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG4gKlxuICogYXdhaXQgcHJvdmlzaW9uLnByb3Zpc2lvbkNhY2hlU2NoZW1hKFwiYXBwLXNlcnZpY2UtcHJpbmNpcGFsQGRhdGFicmlja3MuY29tXCIpO1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJvdmlzaW9uQ2FjaGVTY2hlbWEoXG4gIHJvbGU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgbG9nZ2VyOiBsb2cuTG9nZ2VyID0gZGVmYXVsdExvZ2dlcixcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoY29uZmlnLmlzRGF0YWJyaWNrc0FwcEVudigpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBza2lwIGNhY2hlIHByb3Zpc2lvbmluZyAoaW5zaWRlIGEgRGF0YWJyaWNrcyBBcHApXCIpO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIXJvbGUpIHtcbiAgICBsb2dnZXIud2FybihcImF1dG9wZzogc2tpcCBjYWNoZSBwcm92aXNpb25pbmcgKGNvdWxkIG5vdCByZXNvbHZlIGNvbm5lY3Rpbmcgcm9sZSlcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIFBhc3MgYHVzZXJgIGV4cGxpY2l0bHk6IGF1dG9wZyByZXNvbHZlcyB0aGUgY29ubmVjdGlvbiB0YXJnZXRcbiAgLy8gKGhvc3QvZGF0YWJhc2UvZW5kcG9pbnQpIGJ1dCBub3QgdGhlIGlkZW50aXR5LCBzbyBgY3JlYXRlTGFrZWJhc2VQb29sYCdzXG4gIC8vIHN5bmNocm9ub3VzIHVzZXJuYW1lIGxvb2t1cCB3b3VsZCBvdGhlcndpc2UgdGhyb3cuIGBnZXRXb3Jrc3BhY2VDbGllbnQoe30pYFxuICAvLyByZXR1cm5zIGEgZnJlc2ggZGVmYXVsdC1hdXRoIGNsaWVudCAtIGxpdGVyYWxseSBgbmV3IFdvcmtzcGFjZUNsaWVudCh7fSlgLFxuICAvLyBidXQgYnVpbHQgYWdhaW5zdCB0aGUgU0RLIHZlcnNpb24gQXBwS2l0J3MgYGNyZWF0ZUxha2ViYXNlUG9vbGAgZXhwZWN0c1xuICAvLyAoaW1wb3J0aW5nIHRoZSBTREsgY2xhc3MgZGlyZWN0bHkgaGVyZSBwdWxscyBhIG5ld2VyLCB0eXBlLWluY29tcGF0aWJsZSBjb3B5KS5cbiAgY29uc3QgcG9vbCA9IGNyZWF0ZUxha2ViYXNlUG9vbCh7XG4gICAgdXNlcjogcm9sZSxcbiAgICB3b3Jrc3BhY2VDbGllbnQ6IGdldFdvcmtzcGFjZUNsaWVudCh7fSksXG4gICAgY29ubmVjdGlvblRpbWVvdXRNaWxsaXM6IENPTk5FQ1RfVElNRU9VVF9NUyxcbiAgICBzdGF0ZW1lbnRfdGltZW91dDogU1RBVEVNRU5UX1RJTUVPVVRfTVMsXG4gIH0pO1xuICB0cnkge1xuICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgcG9vbC5xdWVyeShcbiAgICAgIFwiU0VMRUNUIDEgRlJPTSBpbmZvcm1hdGlvbl9zY2hlbWEuc2NoZW1hdGEgV0hFUkUgc2NoZW1hX25hbWUgPSAkMVwiLFxuICAgICAgW0NBQ0hFX1NDSEVNQV0sXG4gICAgKTtcbiAgICBpZiAoZm91bmQucm93Q291bnQgPT09IDApIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImF1dG9wZzogc2tpcCBjYWNoZSBwcm92aXNpb25pbmcgKHNjaGVtYSBhYnNlbnQpXCIsIHsgc2NoZW1hOiBDQUNIRV9TQ0hFTUEgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3Qgc3FsIG9mIGNhY2hlR3JhbnRTdGF0ZW1lbnRzKHJvbGUpKSB7XG4gICAgICBhd2FpdCBwb29sLnF1ZXJ5KHNxbCk7XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKFwiYXV0b3BnOiBncmFudGVkIGNhY2hlIHNjaGVtYVwiLCB7IHNjaGVtYTogQ0FDSEVfU0NIRU1BLCByb2xlIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImF1dG9wZzogY2FjaGUgcHJvdmlzaW9uaW5nIGZhaWxlZCAoY29udGludWluZylcIiwge1xuICAgICAgc2NoZW1hOiBDQUNIRV9TQ0hFTUEsXG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH0gZmluYWxseSB7XG4gICAgYXdhaXQgcG9vbC5lbmQoKS5jYXRjaCgoKSA9PiB7fSk7XG4gIH1cbn1cbiJdfQ==
|
package/lib/tsconfig.tsbuildinfo
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"root":["../src/_cache-storage.ts","../src/appkit.ts","../src/
|
|
1
|
+
{"root":["../src/_cache-storage.ts","../src/appkit.ts","../src/bundle.ts","../src/databricks.ts","../src/identity.ts","../src/interceptor.ts","../src/lakebase-resolver.ts","../src/pgaddress.ts","../src/plugin.ts","../src/provision.ts","../index.ts"],"version":"5.9.3"}
|
package/package.json
CHANGED
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"@databricks/sdk-experimental": "^0.17.0",
|
|
31
|
-
"@dbx-tools/core": "0.6.
|
|
32
|
-
"@dbx-tools/shared-core": "0.6.
|
|
31
|
+
"@dbx-tools/core": "0.6.86",
|
|
32
|
+
"@dbx-tools/shared-core": "0.6.86",
|
|
33
33
|
"yaml": "^2.9.0",
|
|
34
34
|
"zod": "4.3.6"
|
|
35
35
|
},
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"./package.json": "./package.json"
|
|
48
48
|
}
|
|
49
49
|
},
|
|
50
|
-
"version": "0.6.
|
|
50
|
+
"version": "0.6.86",
|
|
51
51
|
"types": "./lib/index.d.ts",
|
|
52
52
|
"type": "module",
|
|
53
53
|
"exports": {
|
|
@@ -1,38 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
2
|
+
* DATABRICKS-APP configuration resolution: the bundle and `app.yaml` vocabulary.
|
|
3
|
+
*
|
|
4
|
+
* node-core's `config` module owns the generic lookup - environment, `.env`,
|
|
5
|
+
* `databricks bundle validate` - and knows nothing about what a bundle resource
|
|
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.
|
|
4
12
|
*
|
|
5
13
|
* Default sources: `explicit`, then `env`, then Databricks App `config.env`
|
|
6
14
|
* (from {@link bundle}) and hard-coded `app.yaml` env entries (from
|
|
7
15
|
* {@link appYaml}). Opt in to `cli` when a dev command wants flag overrides.
|
|
8
16
|
*
|
|
9
|
-
* Server-only
|
|
10
|
-
*
|
|
17
|
+
* Server-only, and Databricks-app specific, so it lives in node-appkit rather
|
|
18
|
+
* than node-core.
|
|
11
19
|
*
|
|
12
20
|
* @module
|
|
13
21
|
*/
|
|
14
22
|
|
|
15
|
-
import { spawnSync } from "node:child_process";
|
|
16
23
|
import { readFile } from "node:fs/promises";
|
|
17
|
-
import {
|
|
24
|
+
import { resolve } from "node:path";
|
|
18
25
|
import { ValidationError } from "@databricks/appkit";
|
|
19
|
-
import { file, project } from "@dbx-tools/core";
|
|
20
|
-
import {
|
|
26
|
+
import { config as coreConfig, file, project } from "@dbx-tools/core";
|
|
27
|
+
import { context, object, log, string } from "@dbx-tools/shared-core";
|
|
21
28
|
import { parse as parseYamlText } from "yaml";
|
|
22
29
|
import { z } from "zod";
|
|
23
30
|
|
|
24
|
-
import { isAppEnv } from "./databricks.ts";
|
|
25
|
-
|
|
26
31
|
const logger = log.logger("config");
|
|
27
32
|
|
|
28
33
|
/** Parsed payload from `databricks bundle validate --output json`. */
|
|
29
34
|
export type BundleValidateJson = Record<string, unknown>;
|
|
30
35
|
|
|
31
36
|
/** A config file discovered on disk with its parsed contents. */
|
|
32
|
-
export
|
|
33
|
-
path: string;
|
|
34
|
-
data: Record<string, unknown>;
|
|
35
|
-
}
|
|
37
|
+
export type ConfigFile = coreConfig.ConfigFile;
|
|
36
38
|
|
|
37
39
|
/** Supported configuration sources, consulted in array order. */
|
|
38
40
|
export type ConfigSource = "explicit" | "cli" | "env" | "bundle";
|
|
@@ -41,36 +43,19 @@ const defaultConfigSources: ConfigSource[] = ["explicit", "env", "bundle"];
|
|
|
41
43
|
|
|
42
44
|
const APP_YAML_NAMES = ["app.yaml", "app.yml"] as const;
|
|
43
45
|
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
.string()
|
|
48
|
-
.transform((value) => value.trim())
|
|
49
|
-
.pipe(z.string().min(1));
|
|
50
|
-
|
|
51
|
-
const bundleAppEnvEntrySchema = z.object({
|
|
52
|
-
name: normalizedString.optional(),
|
|
53
|
-
value: z.string().optional(),
|
|
54
|
-
value_from: normalizedString.optional(),
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
const bundleAppResourceSchema = z.object({
|
|
58
|
-
name: normalizedString.optional(),
|
|
59
|
-
sql_warehouse: z.object({ id: normalizedString.optional() }).optional(),
|
|
60
|
-
genie_space: z.object({ space_id: normalizedString.optional() }).optional(),
|
|
46
|
+
export const bundleAppResourceSchema = coreConfig.bundleResourceSchema.extend({
|
|
47
|
+
sql_warehouse: z.object({ id: coreConfig.bundleValue.optional() }).optional(),
|
|
48
|
+
genie_space: z.object({ space_id: coreConfig.bundleValue.optional() }).optional(),
|
|
61
49
|
postgres: z
|
|
62
50
|
.object({
|
|
63
|
-
database:
|
|
64
|
-
branch:
|
|
65
|
-
endpoint:
|
|
51
|
+
database: coreConfig.bundleValue.optional(),
|
|
52
|
+
branch: coreConfig.bundleValue.optional(),
|
|
53
|
+
endpoint: coreConfig.bundleValue.optional(),
|
|
66
54
|
})
|
|
67
55
|
.optional(),
|
|
68
56
|
});
|
|
69
57
|
|
|
70
|
-
const bundleAppSchema =
|
|
71
|
-
name: normalizedString.optional(),
|
|
72
|
-
source_code_path: z.string().optional(),
|
|
73
|
-
config: z.object({ env: z.array(bundleAppEnvEntrySchema).optional() }).optional(),
|
|
58
|
+
const bundleAppSchema = coreConfig.bundleAppSchema.extend({
|
|
74
59
|
resources: z.array(bundleAppResourceSchema).optional(),
|
|
75
60
|
});
|
|
76
61
|
|
|
@@ -78,22 +63,21 @@ const bundleValidateAppsSchema = z.object({
|
|
|
78
63
|
resources: z.object({ apps: z.record(z.string(), bundleAppSchema).optional() }).optional(),
|
|
79
64
|
});
|
|
80
65
|
|
|
81
|
-
const appYamlEnvEntrySchema =
|
|
82
|
-
name:
|
|
83
|
-
|
|
84
|
-
valueFrom: normalizedString.optional(),
|
|
66
|
+
const appYamlEnvEntrySchema = coreConfig.bundleEnvEntrySchema.omit({ value_from: true }).extend({
|
|
67
|
+
name: coreConfig.bundleValue,
|
|
68
|
+
valueFrom: coreConfig.bundleValue.optional(),
|
|
85
69
|
});
|
|
86
70
|
|
|
87
|
-
const appYamlResourceSchema =
|
|
88
|
-
.
|
|
89
|
-
name:
|
|
90
|
-
sql_warehouse: z.object({ id:
|
|
91
|
-
genie_space: z.object({ space_id:
|
|
71
|
+
const appYamlResourceSchema = coreConfig.bundleResourceSchema
|
|
72
|
+
.extend({
|
|
73
|
+
name: coreConfig.bundleValue,
|
|
74
|
+
sql_warehouse: z.object({ id: coreConfig.bundleValue.optional() }).optional(),
|
|
75
|
+
genie_space: z.object({ space_id: coreConfig.bundleValue.optional() }).optional(),
|
|
92
76
|
postgres: z
|
|
93
77
|
.object({
|
|
94
|
-
database:
|
|
95
|
-
branch:
|
|
96
|
-
endpoint:
|
|
78
|
+
database: coreConfig.bundleValue.optional(),
|
|
79
|
+
branch: coreConfig.bundleValue.optional(),
|
|
80
|
+
endpoint: coreConfig.bundleValue.optional(),
|
|
97
81
|
})
|
|
98
82
|
.optional(),
|
|
99
83
|
})
|
|
@@ -125,9 +109,6 @@ export interface ResolveConfigValueOptions {
|
|
|
125
109
|
cli?: Record<string, ConfigMapValue>;
|
|
126
110
|
}
|
|
127
111
|
|
|
128
|
-
const bundleDefault = functionModule.memoize(() => loadBundle(process.cwd()));
|
|
129
|
-
const appYamlDefault = functionModule.memoize(() => loadAppYaml(process.cwd()));
|
|
130
|
-
|
|
131
112
|
function envKeysForName(name: string): object.Sequence<string> {
|
|
132
113
|
const trimmed = name.trim();
|
|
133
114
|
if (!trimmed) {
|
|
@@ -231,8 +212,9 @@ export function flattenAppYamlEnv(data: unknown): Record<string, string> {
|
|
|
231
212
|
|
|
232
213
|
const out: Record<string, string> = {};
|
|
233
214
|
for (const entry of parsed.data.env) {
|
|
234
|
-
|
|
235
|
-
|
|
215
|
+
const value = coreConfig.bundleValue.safeParse(entry.value);
|
|
216
|
+
if (value.success) {
|
|
217
|
+
out[entry.name] = value.data;
|
|
236
218
|
continue;
|
|
237
219
|
}
|
|
238
220
|
if (!entry.valueFrom) continue;
|
|
@@ -268,8 +250,9 @@ export function flattenAppEnv(data: unknown): Record<string, string> {
|
|
|
268
250
|
const out: Record<string, string> = {};
|
|
269
251
|
for (const entry of app.config.env) {
|
|
270
252
|
if (!entry.name) continue;
|
|
271
|
-
|
|
272
|
-
|
|
253
|
+
const value = coreConfig.bundleValue.safeParse(entry.value);
|
|
254
|
+
if (value.success) {
|
|
255
|
+
out[entry.name] = value.data;
|
|
273
256
|
continue;
|
|
274
257
|
}
|
|
275
258
|
if (!entry.value_from) continue;
|
|
@@ -279,42 +262,6 @@ export function flattenAppEnv(data: unknown): Record<string, string> {
|
|
|
279
262
|
return out;
|
|
280
263
|
}
|
|
281
264
|
|
|
282
|
-
function validateBundle(root: string): BundleValidateJson | undefined {
|
|
283
|
-
const key = root;
|
|
284
|
-
if (bundleValidateCache.has(key)) {
|
|
285
|
-
return bundleValidateCache.get(key);
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
const args = ["bundle", "validate", "--output", "json"];
|
|
289
|
-
try {
|
|
290
|
-
const proc = spawnSync("databricks", args, {
|
|
291
|
-
cwd: root,
|
|
292
|
-
encoding: "utf8",
|
|
293
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
294
|
-
});
|
|
295
|
-
const text = proc.stdout?.trim();
|
|
296
|
-
if (!text) {
|
|
297
|
-
bundleValidateCache.set(key, undefined);
|
|
298
|
-
return undefined;
|
|
299
|
-
}
|
|
300
|
-
const data = json.parse<BundleValidateJson>(text);
|
|
301
|
-
bundleValidateCache.set(key, data);
|
|
302
|
-
return data;
|
|
303
|
-
} catch {
|
|
304
|
-
bundleValidateCache.set(key, undefined);
|
|
305
|
-
return undefined;
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
|
|
309
|
-
async function loadBundle(cwd: string): Promise<ConfigFile | undefined> {
|
|
310
|
-
const configFile = resolveConfigFile(cwd, "databricks.yml");
|
|
311
|
-
if (configFile) {
|
|
312
|
-
const data = validateBundle(dirname(configFile));
|
|
313
|
-
if (data) return { path: configFile, data };
|
|
314
|
-
}
|
|
315
|
-
return undefined;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
265
|
async function loadAppYaml(cwd: string): Promise<ConfigFile | undefined> {
|
|
319
266
|
for (const fileName of APP_YAML_NAMES) {
|
|
320
267
|
const configFile = resolveConfigFile(cwd, fileName);
|
|
@@ -334,7 +281,7 @@ async function loadAppYaml(cwd: string): Promise<ConfigFile | undefined> {
|
|
|
334
281
|
}
|
|
335
282
|
|
|
336
283
|
function resolveConfigFile(cwd: string, configFile: string): string | undefined {
|
|
337
|
-
if (
|
|
284
|
+
if (coreConfig.isDatabricksAppEnv()) return undefined;
|
|
338
285
|
for (const rootDir of project.resolveProjectRoots(cwd)) {
|
|
339
286
|
const bundlePath = resolve(rootDir, configFile);
|
|
340
287
|
if (file.statSync(bundlePath)?.isFile()) return bundlePath;
|
|
@@ -343,23 +290,24 @@ function resolveConfigFile(cwd: string, configFile: string): string | undefined
|
|
|
343
290
|
}
|
|
344
291
|
|
|
345
292
|
/**
|
|
346
|
-
*
|
|
347
|
-
*
|
|
348
|
-
*
|
|
293
|
+
* The validated bundle for `cwd` - {@link coreConfig.bundleFile}, which caches it
|
|
294
|
+
* per working directory. Returns `undefined` inside a Databricks App, where the
|
|
295
|
+
* platform has already turned `config.env` into real environment variables and
|
|
296
|
+
* there is no bundle to validate.
|
|
349
297
|
*/
|
|
350
298
|
export function bundle(cwd?: string): Promise<ConfigFile | undefined> {
|
|
351
|
-
|
|
352
|
-
return cwd && resolve(cwd) !== process.cwd() ? loadBundle(cwd) : bundleDefault();
|
|
299
|
+
return Promise.resolve(coreConfig.isDatabricksAppEnv() ? undefined : coreConfig.bundleFile(cwd));
|
|
353
300
|
}
|
|
354
301
|
|
|
355
302
|
/**
|
|
356
|
-
* Locate and parse `app.yaml` / `app.yml` from the bundle or project root.
|
|
357
|
-
*
|
|
358
|
-
*
|
|
303
|
+
* Locate and parse `app.yaml` / `app.yml` from the bundle or project root.
|
|
304
|
+
* Cached per working directory through {@link context.cached}, so a `cwd` change
|
|
305
|
+
* re-reads instead of returning another project's file. Returns `undefined`
|
|
306
|
+
* inside a Databricks App.
|
|
359
307
|
*/
|
|
360
308
|
export function appYaml(cwd?: string): Promise<ConfigFile | undefined> {
|
|
361
|
-
if (
|
|
362
|
-
return
|
|
309
|
+
if (coreConfig.isDatabricksAppEnv()) return Promise.resolve(undefined);
|
|
310
|
+
return context.cached(["appkit", "appYaml"], (resolved) => loadAppYaml(resolved ?? "."), cwd);
|
|
363
311
|
}
|
|
364
312
|
|
|
365
313
|
/**
|
|
@@ -415,11 +363,11 @@ function resolveSources(options: ResolveConfigValueOptions): ConfigSource[] {
|
|
|
415
363
|
* whatever the Databricks App / bundle definition supplies.
|
|
416
364
|
*
|
|
417
365
|
* @example
|
|
418
|
-
* import {
|
|
366
|
+
* import { bundle } from "@dbx-tools/appkit";
|
|
419
367
|
*
|
|
420
|
-
* const warehouseId = await
|
|
368
|
+
* const warehouseId = await bundle.resolveConfigValue("DATABRICKS_WAREHOUSE_ID", {
|
|
421
369
|
* cli: { DATABRICKS_WAREHOUSE_ID: flags.warehouse },
|
|
422
|
-
* sources:
|
|
370
|
+
* sources: bundle.withCliSources(),
|
|
423
371
|
* });
|
|
424
372
|
*/
|
|
425
373
|
export async function resolveConfigValue(
|
package/src/databricks.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Generic Databricks SDK glue (no AppKit): adapt WHATWG cancellation
|
|
3
3
|
* (`AbortSignal` / `AbortController`) into the SDK's `Context` /
|
|
4
4
|
* `CancellationToken` shapes so a single `AbortController` can drive every
|
|
5
|
-
* in-flight SDK call
|
|
5
|
+
* in-flight SDK call.
|
|
6
6
|
*
|
|
7
7
|
* Server-only: leans on the Databricks SDK `Context`. Lives in node-appkit so
|
|
8
8
|
* the browser-safe shared-core stays SDK-free.
|
|
@@ -12,26 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
import type { CancellationToken } from "@databricks/sdk-experimental";
|
|
14
14
|
import { Context } from "@databricks/sdk-experimental";
|
|
15
|
-
import { async
|
|
16
|
-
|
|
17
|
-
/** Highest valid TCP port number. */
|
|
18
|
-
export const MAX_TCP_PORT = envUtil.MAX_TCP_PORT;
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Detect the Databricks App runtime from environment shape: requires a
|
|
22
|
-
* non-empty `DATABRICKS_APP_NAME`, a `DATABRICKS_HOST` that parses as an
|
|
23
|
-
* `http`/`https` URL, and a `DATABRICKS_APP_PORT` that is a valid TCP port.
|
|
24
|
-
* Reads `process.env` when no `env` is passed.
|
|
25
|
-
*
|
|
26
|
-
* @example
|
|
27
|
-
* import { databricks } from "@dbx-tools/appkit";
|
|
28
|
-
*
|
|
29
|
-
* // Skip bundle / app.yaml discovery when the app is already deployed.
|
|
30
|
-
* const local = !databricks.isAppEnv();
|
|
31
|
-
*/
|
|
32
|
-
export function isAppEnv(env: Record<string, string | undefined> = process.env): boolean {
|
|
33
|
-
return envUtil.isAppEnv(env);
|
|
34
|
-
}
|
|
15
|
+
import { async } from "@dbx-tools/shared-core";
|
|
35
16
|
|
|
36
17
|
/** Either an SDK `Context` or a WHATWG `AbortSignal`. */
|
|
37
18
|
export type ContextLike = Context | AbortSignal;
|
package/src/identity.ts
CHANGED
|
@@ -53,7 +53,8 @@
|
|
|
53
53
|
*/
|
|
54
54
|
|
|
55
55
|
import { ConfigurationError } from "@databricks/appkit";
|
|
56
|
-
import {
|
|
56
|
+
import { config } from "@dbx-tools/core";
|
|
57
|
+
import { string, token } from "@dbx-tools/shared-core";
|
|
57
58
|
|
|
58
59
|
/**
|
|
59
60
|
* Header the Databricks Apps front door forwards the caller's OBO token on.
|
|
@@ -100,11 +101,11 @@ export interface HeaderBearing {
|
|
|
100
101
|
*/
|
|
101
102
|
export function resolveIdentityMode(
|
|
102
103
|
configured: string | undefined,
|
|
103
|
-
envKeys:
|
|
104
|
+
envKeys: string | readonly string[],
|
|
104
105
|
field = "identity",
|
|
105
106
|
): IdentityMode {
|
|
106
|
-
const raw =
|
|
107
|
-
if (raw ===
|
|
107
|
+
const raw = config.string(configured, envKeys, config.ENV_ONLY);
|
|
108
|
+
if (raw === undefined) return DEFAULT_IDENTITY_MODE;
|
|
108
109
|
const mode = raw.toLowerCase() as IdentityMode;
|
|
109
110
|
if (!IDENTITY_MODES.includes(mode)) {
|
|
110
111
|
const names = typeof envKeys === "string" ? envKeys : envKeys.join(" / ");
|
package/src/lakebase-resolver.ts
CHANGED
|
@@ -42,12 +42,12 @@ import {
|
|
|
42
42
|
getWorkspaceClient,
|
|
43
43
|
ValidationError,
|
|
44
44
|
} from "@databricks/appkit";
|
|
45
|
-
import { project } from "@dbx-tools/core";
|
|
45
|
+
import { config as coreConfig, project } from "@dbx-tools/core";
|
|
46
46
|
import { async, log, object, string } from "@dbx-tools/shared-core";
|
|
47
47
|
import { z } from "zod";
|
|
48
|
-
import { resolveConfigValue } from "./
|
|
48
|
+
import { resolveConfigValue } from "./bundle.ts";
|
|
49
49
|
|
|
50
|
-
import {
|
|
50
|
+
import { toContext } from "./databricks.ts";
|
|
51
51
|
import {
|
|
52
52
|
parseAddress,
|
|
53
53
|
parseResourcePath,
|
|
@@ -195,7 +195,7 @@ const operationSchema = z.object({
|
|
|
195
195
|
type Operation = z.infer<typeof operationSchema>;
|
|
196
196
|
|
|
197
197
|
/** `PGPORT` must land inside the TCP port range. */
|
|
198
|
-
const portSchema = z.coerce.number().int().min(1).max(MAX_TCP_PORT);
|
|
198
|
+
const portSchema = z.coerce.number().int().min(1).max(coreConfig.MAX_TCP_PORT);
|
|
199
199
|
|
|
200
200
|
const sslModeSchema = z.enum(SSL_MODES);
|
|
201
201
|
|
|
@@ -208,7 +208,11 @@ export function parsePort(value: string | number | undefined): number | undefine
|
|
|
208
208
|
if (value === undefined || value === "") return undefined;
|
|
209
209
|
const parsed = portSchema.safeParse(value);
|
|
210
210
|
if (!parsed.success) {
|
|
211
|
-
throw ValidationError.invalidValue(
|
|
211
|
+
throw ValidationError.invalidValue(
|
|
212
|
+
"PGPORT",
|
|
213
|
+
value,
|
|
214
|
+
`a TCP port between 1 and ${coreConfig.MAX_TCP_PORT}`,
|
|
215
|
+
);
|
|
212
216
|
}
|
|
213
217
|
return parsed.data;
|
|
214
218
|
}
|
|
@@ -251,7 +255,7 @@ export function pollDelay(attempt: number, baseMs: number, signal?: AbortSignal)
|
|
|
251
255
|
* Pull resolver inputs from `process.env`, parse the address blob, and
|
|
252
256
|
* layer explicit config on top with this precedence:
|
|
253
257
|
*
|
|
254
|
-
* `config.<field>` > `
|
|
258
|
+
* `config.<field>` > `bundle.resolveConfigValue` (`env`, then bundle
|
|
255
259
|
* validate JSON) > whatever {@link parseAddress} recovered from the
|
|
256
260
|
* `endpoint` / `LAKEBASE_ENDPOINT` blob.
|
|
257
261
|
*
|
package/src/provision.ts
CHANGED
|
@@ -22,10 +22,9 @@
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import { createLakebasePool, getWorkspaceClient, ValidationError } from "@databricks/appkit";
|
|
25
|
+
import { config } from "@dbx-tools/core";
|
|
25
26
|
import { error, log } from "@dbx-tools/shared-core";
|
|
26
27
|
|
|
27
|
-
import { isAppEnv } from "./databricks.ts";
|
|
28
|
-
|
|
29
28
|
const defaultLogger = log.logger("provision");
|
|
30
29
|
|
|
31
30
|
/** AppKit persistent-cache schema (see AppKit's `PersistentStorage`). */
|
|
@@ -101,7 +100,7 @@ export async function provisionCacheSchema(
|
|
|
101
100
|
role: string | undefined,
|
|
102
101
|
logger: log.Logger = defaultLogger,
|
|
103
102
|
): Promise<void> {
|
|
104
|
-
if (
|
|
103
|
+
if (config.isDatabricksAppEnv()) {
|
|
105
104
|
logger.debug("autopg: skip cache provisioning (inside a Databricks App)");
|
|
106
105
|
return;
|
|
107
106
|
}
|