@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.
@@ -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 (isAppEnv()) {
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==
@@ -1 +1 @@
1
- {"root":["../src/_cache-storage.ts","../src/appkit.ts","../src/config.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"}
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.82",
32
- "@dbx-tools/shared-core": "0.6.82",
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.82",
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
- * Layered configuration resolution for local development against a Databricks
3
- * App / Asset Bundle.
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 (`node:child_process`, bundle root discovery). Databricks-app
10
- * specific, so it lives in node-appkit rather than shared-core.
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 { dirname, resolve } from "node:path";
24
+ import { resolve } from "node:path";
18
25
  import { ValidationError } from "@databricks/appkit";
19
- import { file, project } from "@dbx-tools/core";
20
- import { functionModule, json, object, log, string } from "@dbx-tools/shared-core";
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 interface ConfigFile {
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 bundleValidateCache = new Map<string, BundleValidateJson | undefined>();
45
-
46
- const normalizedString = z
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: normalizedString.optional(),
64
- branch: normalizedString.optional(),
65
- endpoint: normalizedString.optional(),
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 = z.object({
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 = z.object({
82
- name: normalizedString,
83
- value: z.string().optional(),
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 = z
88
- .object({
89
- name: normalizedString,
90
- sql_warehouse: z.object({ id: normalizedString.optional() }).optional(),
91
- genie_space: z.object({ space_id: normalizedString.optional() }).optional(),
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: normalizedString.optional(),
95
- branch: normalizedString.optional(),
96
- endpoint: normalizedString.optional(),
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
- if (entry.value?.trim()) {
235
- out[entry.name] = entry.value.trim();
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
- if (entry.value) {
272
- out[entry.name] = entry.value;
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 (isAppEnv()) return undefined;
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
- * Locate the bundle root and run `databricks bundle validate --output json`.
347
- * When `cwd` is omitted or equals `process.cwd()`, the result is memoized for
348
- * the process lifetime. Returns `undefined` inside a Databricks App.
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
- if (isAppEnv()) return Promise.resolve(undefined);
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. When
357
- * `cwd` is omitted or equals `process.cwd()`, the result is memoized for the
358
- * process lifetime. Returns `undefined` inside a Databricks App.
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 (isAppEnv()) return Promise.resolve(undefined);
362
- return cwd && resolve(cwd) !== process.cwd() ? loadAppYaml(cwd) : appYamlDefault();
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 { config } from "@dbx-tools/appkit";
366
+ * import { bundle } from "@dbx-tools/appkit";
419
367
  *
420
- * const warehouseId = await config.resolveConfigValue("DATABRICKS_WAREHOUSE_ID", {
368
+ * const warehouseId = await bundle.resolveConfigValue("DATABRICKS_WAREHOUSE_ID", {
421
369
  * cli: { DATABRICKS_WAREHOUSE_ID: flags.warehouse },
422
- * sources: config.withCliSources(),
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, plus Databricks runtime-environment detection.
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, env as envUtil } from "@dbx-tools/shared-core";
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 { env, string, token, type EnvKey } from "@dbx-tools/shared-core";
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: EnvKey,
104
+ envKeys: string | readonly string[],
104
105
  field = "identity",
105
106
  ): IdentityMode {
106
- const raw = env.string(configured, envKeys);
107
- if (raw === null) return DEFAULT_IDENTITY_MODE;
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(" / ");
@@ -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 "./config.ts";
48
+ import { resolveConfigValue } from "./bundle.ts";
49
49
 
50
- import { MAX_TCP_PORT, toContext } from "./databricks.ts";
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("PGPORT", value, `a TCP port between 1 and ${MAX_TCP_PORT}`);
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>` > `config.resolveConfigValue` (`env`, then bundle
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 (isAppEnv()) {
103
+ if (config.isDatabricksAppEnv()) {
105
104
  logger.debug("autopg: skip cache provisioning (inside a Databricks App)");
106
105
  return;
107
106
  }