@dbx-tools/databricks 0.9.154 → 0.9.158

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.
@@ -6,9 +6,9 @@
6
6
  * @module
7
7
  */
8
8
  import { createWorkspaceClient as _createWorkspaceClient, } from "@databricks/appkit";
9
- import { appkit } from "@dbx-tools/appkit";
10
- import { client as authClient } from "@dbx-tools/auth";
11
- import { functionUtils, net, stringUtils } from "@dbx-tools/shared-core";
9
+ import { tryGetExecutionContext } from "@dbx-tools/appkit";
10
+ import { createAuthClient } from "@dbx-tools/auth";
11
+ import { memoize, urlBuilder, trimToUndefined } from "@dbx-tools/shared-core";
12
12
  /** Databricks workspace ids are a 10-20 digit run embedded in the host. */
13
13
  const WORKSPACE_ID_REGEX = /\d{10,20}/;
14
14
  const workspaceAuth = new WeakMap();
@@ -22,7 +22,7 @@ const workspaceAuth = new WeakMap();
22
22
  * execution.
23
23
  */
24
24
  export async function createWorkspaceClient(options = {}) {
25
- const auth = await authClient.createAuthClient(options);
25
+ const auth = await createAuthClient(options);
26
26
  const client = _createWorkspaceClient({ host: auth.host });
27
27
  client.config.credentials = {
28
28
  name: "pat",
@@ -58,14 +58,14 @@ export function toLegacyWorkspaceClient(client) {
58
58
  * construction happens at most once per process. Used only when there's no
59
59
  * AppKit execution context to borrow a client from.
60
60
  */
61
- const getDefaultWorkspaceClient = functionUtils.memoize(async () => (await createWorkspaceClient()).toLegacyWorkspaceClient());
61
+ const getDefaultWorkspaceClient = memoize(async () => (await createWorkspaceClient()).toLegacyWorkspaceClient());
62
62
  /**
63
63
  * The AppKit execution-context workspace client when available, otherwise
64
64
  * `undefined`. Never constructs a fallback client and never throws for a
65
65
  * missing AppKit scope.
66
66
  */
67
67
  export function tryGetWorkspaceClient() {
68
- return appkit.tryGetExecutionContext()?.client.toLegacyWorkspaceClient();
68
+ return tryGetExecutionContext()?.client.toLegacyWorkspaceClient();
69
69
  }
70
70
  /**
71
71
  * Resolve a {@link WorkspaceClient}: {@link tryGetWorkspaceClient} first, else
@@ -95,7 +95,7 @@ async function getWorkspaceConfig() {
95
95
  * calls `currentUser.me()` on {@link client} (or {@link getWorkspaceClient}).
96
96
  */
97
97
  export async function getCurrentUserName(client) {
98
- const contextUser = readContextUserName(appkit.tryGetExecutionContext());
98
+ const contextUser = readContextUserName(tryGetExecutionContext());
99
99
  if (contextUser)
100
100
  return contextUser;
101
101
  const resolved = client ?? (await getWorkspaceClient());
@@ -111,7 +111,7 @@ function readContextUserName(ctx) {
111
111
  if (typeof ctx !== "object" || ctx === null || !("userName" in ctx))
112
112
  return undefined;
113
113
  const value = ctx.userName;
114
- return stringUtils.trimToUndefined(value);
114
+ return trimToUndefined(value);
115
115
  }
116
116
  /**
117
117
  * Resolve the current workspace host as a `net.UrlBuilder`: the workspace
@@ -120,11 +120,11 @@ function readContextUserName(ctx) {
120
120
  export async function getWorkspaceUrl() {
121
121
  const config = await getWorkspaceConfig();
122
122
  if (config) {
123
- const configHost = net.urlBuilder(await config.getHost());
123
+ const configHost = urlBuilder(await config.getHost());
124
124
  if (configHost)
125
125
  return configHost;
126
126
  }
127
- const databricksHost = net.urlBuilder(process.env.DATABRICKS_HOST);
127
+ const databricksHost = urlBuilder(process.env.DATABRICKS_HOST);
128
128
  if (databricksHost)
129
129
  return databricksHost;
130
130
  return undefined;
@@ -146,4 +146,4 @@ export async function getWorkspaceId(workspaceHost) {
146
146
  }
147
147
  return undefined;
148
148
  }
149
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2UtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFDTCxxQkFBcUIsSUFBSSxzQkFBc0IsR0FFaEQsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sSUFBSSxVQUFVLEVBQStDLE1BQU0saUJBQWlCLENBQUM7QUFDcEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFekUsMkVBQTJFO0FBQzNFLE1BQU0sa0JBQWtCLEdBQUcsV0FBVyxDQUFDO0FBQ3ZDLE1BQU0sYUFBYSxHQUFHLElBQUksT0FBTyxFQUFxQyxDQUFDO0FBTXZFOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxxQkFBcUIsQ0FDekMsVUFBaUMsRUFBRTtJQUVuQyxNQUFNLElBQUksR0FBRyxNQUFNLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4RCxNQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRztRQUMxQixJQUFJLEVBQUUsS0FBSztRQUNYLEtBQUssQ0FBQyxTQUFTO1lBQ2IsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7Z0JBQ3ZCLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDakUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJ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RUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxlQUFlO0lBQ25DLE1BQU0sTUFBTSxHQUFHLE1BQU0sa0JBQWtCLEVBQUUsQ0FBQztJQUMxQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1gsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzFELElBQUksVUFBVTtZQUFFLE9BQU8sVUFBVSxDQUFDO0lBQ3BDLENBQUM7SUFDRCxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbkUsSUFBSSxjQUFjO1FBQUUsT0FBTyxjQUFjLENBQUM7SUFDMUMsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FBQyxhQUFzQjtJQUN6RCxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQztJQUM5RCxJQUFJLFdBQVc7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUNwQyxhQUFhLEdBQUcsYUFBYSxJQUFJLENBQUMsTUFBTSxlQUFlLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQztJQUNqRSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNvbHZlIHRoZSBjdXJyZW50IERhdGFicmlja3Mgd29ya3NwYWNlJ3MgVVJMLCBudW1lcmljIGlkLCBhbmQgY2xpZW50IGZyb21cbiAqIHRoZSBhY3RpdmUgZXhlY3V0aW9uIGNvbnRleHQgKEFwcEtpdCwgd2hlbiBpbml0aWFsaXplZCksIGEgZGVmYXVsdFxuICoge0BsaW5rIFdvcmtzcGFjZUNsaWVudH0sIG9yIHRoZSBlbnZpcm9ubWVudC4gU2VydmVyLW9ubHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGNyZWF0ZVdvcmtzcGFjZUNsaWVudCBhcyBfY3JlYXRlV29ya3NwYWNlQ2xpZW50LFxuICB0eXBlIFdvcmtzcGFjZUNsaWVudCBhcyBBcHBLaXRXb3Jrc3BhY2VDbGllbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgY2xpZW50IGFzIGF1dGhDbGllbnQsIHR5cGUgQXV0aENsaWVudCwgdHlwZSBEYXRhYnJpY2tzQXV0aE9wdGlvbnMgfSBmcm9tIFwiQGRieC10b29scy9hdXRoXCI7XG5pbXBvcnQgeyBmdW5jdGlvblV0aWxzLCBuZXQsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcblxuLyoqIERhdGFicmlja3Mgd29ya3NwYWNlIGlkcyBhcmUgYSAxMC0yMCBkaWdpdCBydW4gZW1iZWRkZWQgaW4gdGhlIGhvc3QuICovXG5jb25zdCBXT1JLU1BBQ0VfSURfUkVHRVggPSAvXFxkezEwLDIwfS87XG5jb25zdCB3b3Jrc3BhY2VBdXRoID0gbmV3IFdlYWtNYXA8QXBwS2l0V29ya3NwYWNlQ2xpZW50LCBBdXRoQ2xpZW50PigpO1xuXG4vKiogTGVnYWN5IFNESyBjbGllbnQgZXhwb3NlZCBieSBBcHBLaXQgZm9yIEFQSXMgbm90IHlldCBvbiBpdHMgZmFjYWRlLiAqL1xuZXhwb3J0IHR5cGUgV29ya3NwYWNlQ2xpZW50ID0gUmV0dXJuVHlwZTxBcHBLaXRXb3Jrc3BhY2VDbGllbnRbXCJ0b0xlZ2FjeVdvcmtzcGFjZUNsaWVudFwiXT47XG50eXBlIENvbmZpZyA9IFdvcmtzcGFjZUNsaWVudFtcImNvbmZpZ1wiXTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gQXBwS2l0IHdvcmtzcGFjZSBjbGllbnQgd2hvc2UgU0RLIGNyZWRlbnRpYWwgdmlzaXRvciBkZWxlZ2F0ZXMgdG9cbiAqIGBAZGJ4LXRvb2xzL2F1dGhgLlxuICpcbiAqIFRoZSBhdXRoIHBhY2thZ2UgcmVzb2x2ZXMgdGhlIGFjdGl2ZSBwcm9maWxlLCBob3N0LCB0b2tlbiBsaWZlY3ljbGUsIGFuZFxuICogdW5pZmllZC13b3Jrc3BhY2UgaGVhZGVyIHdpdGhvdXQgcmVxdWlyaW5nIGNhbGxlcnMgdG8gbWlycm9yIHByb2ZpbGUgdmFsdWVzXG4gKiBpbnRvIGVudmlyb25tZW50IHZhcmlhYmxlcy4gVGhlIFNESyBzdGlsbCBvd25zIHdvcmtzcGFjZSBBUElzIGFuZCByZXF1ZXN0XG4gKiBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjcmVhdGVXb3Jrc3BhY2VDbGllbnQoXG4gIG9wdGlvbnM6IERhdGFicmlja3NBdXRoT3B0aW9ucyA9IHt9LFxuKTogUHJvbWlzZTxBcHBLaXRXb3Jrc3BhY2VDbGllbnQ+IHtcbiAgY29uc3QgYXV0aCA9IGF3YWl0IGF1dGhDbGllbnQuY3JlYXRlQXV0aENsaWVudChvcHRpb25zKTtcbiAgY29uc3QgY2xpZW50ID0gX2NyZWF0ZVdvcmtzcGFjZUNsaWVudCh7IGhvc3Q6IGF1dGguaG9zdCB9KTtcbiAgY2xpZW50LmNvbmZpZy5jcmVkZW50aWFscyA9IHtcbiAgICBuYW1lOiBcInBhdFwiLFxuICAgIGFzeW5jIGNvbmZpZ3VyZSgpIHtcbiAgICAgIHJldHVybiBhc3luYyAoaGVhZGVycykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYXdhaXQgYXV0aC5oZWFkZXJzKCkpKSB7XG4gICAgICAgICAgaGVhZGVycy5zZXQobmFtZSwgdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG4gIH07XG4gIHdvcmtzcGFjZUF1dGguc2V0KGNsaWVudCwgYXV0aCk7XG4gIHJldHVybiBjbGllbnQ7XG59XG5cbi8qKlxuICogUmVmcmVzaCB0aGUgZGJ4LXRvb2xzIGNyZWRlbnRpYWwgbGlmZWN5Y2xlIGF0dGFjaGVkIGJ5XG4gKiB7QGxpbmsgY3JlYXRlV29ya3NwYWNlQ2xpZW50fS4gUmV0dXJucyBgZmFsc2VgIGZvciBleHRlcm5hbGx5IHN1cHBsaWVkXG4gKiBBcHBLaXQgY2xpZW50cyB3aG9zZSBjcmVkZW50aWFsIG93bmVyIGlzIHVua25vd24uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZWZyZXNoV29ya3NwYWNlQ2xpZW50QXV0aGVudGljYXRpb24oXG4gIGNsaWVudDogQXBwS2l0V29ya3NwYWNlQ2xpZW50LFxuKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IGF1dGggPSB3b3Jrc3BhY2VBdXRoLmdldChjbGllbnQpO1xuICBpZiAoIWF1dGgpIHJldHVybiBmYWxzZTtcbiAgYXdhaXQgYXV0aC5oZWFkZXJzKHsgbG9naW46IGZhbHNlLCByZWZyZXNoOiB0cnVlIH0pO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFJlc29sdmUgQXBwS2l0J3MgZmFjYWRlIG9yIGFuIGV4aXN0aW5nIGxlZ2FjeSBjbGllbnQgdG8gdGhlIGxlZ2FjeSBTREsgc3VyZmFjZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0xlZ2FjeVdvcmtzcGFjZUNsaWVudChcbiAgY2xpZW50OiBBcHBLaXRXb3Jrc3BhY2VDbGllbnQgfCBXb3Jrc3BhY2VDbGllbnQsXG4pOiBXb3Jrc3BhY2VDbGllbnQge1xuICByZXR1cm4gXCJ0b0xlZ2FjeVdvcmtzcGFjZUNsaWVudFwiIGluIGNsaWVudCA/IGNsaWVudC50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudCgpIDogY2xpZW50O1xufVxuXG4vKipcbiAqIExhemlseS1jb25zdHJ1Y3RlZCBkZWZhdWx0IGBXb3Jrc3BhY2VDbGllbnRgIChlbnYgLyBwcm9maWxlIGF1dGgpLCBtZW1vaXplZCBzb1xuICogY29uc3RydWN0aW9uIGhhcHBlbnMgYXQgbW9zdCBvbmNlIHBlciBwcm9jZXNzLiBVc2VkIG9ubHkgd2hlbiB0aGVyZSdzIG5vXG4gKiBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQgdG8gYm9ycm93IGEgY2xpZW50IGZyb20uXG4gKi9cbmNvbnN0IGdldERlZmF1bHRXb3Jrc3BhY2VDbGllbnQgPSBmdW5jdGlvblV0aWxzLm1lbW9pemUoYXN5bmMgKCkgPT5cbiAgKGF3YWl0IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpKS50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudCgpLFxuKTtcblxuLyoqXG4gKiBUaGUgQXBwS2l0IGV4ZWN1dGlvbi1jb250ZXh0IHdvcmtzcGFjZSBjbGllbnQgd2hlbiBhdmFpbGFibGUsIG90aGVyd2lzZVxuICogYHVuZGVmaW5lZGAuIE5ldmVyIGNvbnN0cnVjdHMgYSBmYWxsYmFjayBjbGllbnQgYW5kIG5ldmVyIHRocm93cyBmb3IgYVxuICogbWlzc2luZyBBcHBLaXQgc2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlHZXRXb3Jrc3BhY2VDbGllbnQoKTogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCk/LmNsaWVudC50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudCgpO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fToge0BsaW5rIHRyeUdldFdvcmtzcGFjZUNsaWVudH0gZmlyc3QsIGVsc2VcbiAqIGEgbWVtb2l6ZWQgZGVmYXVsdCBjbGllbnQgZnJvbSBlbnYgLyBwcm9maWxlIGF1dGguXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VDbGllbnQoKTogUHJvbWlzZTxXb3Jrc3BhY2VDbGllbnQ+IHtcbiAgcmV0dXJuIHRyeUdldFdvcmtzcGFjZUNsaWVudCgpID8/IChhd2FpdCBnZXREZWZhdWx0V29ya3NwYWNlQ2xpZW50KCkpO1xufVxuXG4vKipcbiAqIFRoZSBhY3RpdmUgd29ya3NwYWNlIGBDb25maWdgOiB0aGUgQXBwS2l0IGV4ZWN1dGlvbi1jb250ZXh0IGNsaWVudCdzIGNvbmZpZ1xuICogd2hlbiBBcHBLaXQgaXMgaW5pdGlhbGl6ZWQsIGVsc2UgdGhlIGRlZmF1bHQgY2xpZW50J3MuIFJldHVybnMgYHVuZGVmaW5lZGBcbiAqIChuZXZlciB0aHJvd3MpIHdoZW4gbmVpdGhlciBpcyBhdmFpbGFibGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldFdvcmtzcGFjZUNvbmZpZygpOiBQcm9taXNlPENvbmZpZyB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIHJldHVybiAoYXdhaXQgZ2V0V29ya3NwYWNlQ2xpZW50KCkpLmNvbmZpZztcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIEN1cnJlbnQgRGF0YWJyaWNrcyB1c2VybmFtZSBmb3Igd29ya3NwYWNlIGhvbWUgcGF0aHNcbiAqIChgL1dvcmtzcGFjZS9Vc2Vycy88dXNlck5hbWU+YCkuXG4gKlxuICogUHJlZmVycyBgdXNlck5hbWVgIG9uIHRoZSBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQgd2hlbiBzZXQsIG90aGVyd2lzZVxuICogY2FsbHMgYGN1cnJlbnRVc2VyLm1lKClgIG9uIHtAbGluayBjbGllbnR9IChvciB7QGxpbmsgZ2V0V29ya3NwYWNlQ2xpZW50fSkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRDdXJyZW50VXNlck5hbWUoY2xpZW50PzogV29ya3NwYWNlQ2xpZW50KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY29udGV4dFVzZXIgPSByZWFkQ29udGV4dFVzZXJOYW1lKGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCkpO1xuICBpZiAoY29udGV4dFVzZXIpIHJldHVybiBjb250ZXh0VXNlcjtcblxuICBjb25zdCByZXNvbHZlZCA9IGNsaWVudCA/PyAoYXdhaXQgZ2V0V29ya3NwYWNlQ2xpZW50KCkpO1xuICBjb25zdCBtZSA9IGF3YWl0IHJlc29sdmVkLmN1cnJlbnRVc2VyLm1lKCk7XG4gIGNvbnN0IHVzZXJOYW1lID0gbWUudXNlck5hbWU/LnRyaW0oKTtcbiAgaWYgKCF1c2VyTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkRhdGFicmlja3MgY3VycmVudFVzZXIubWUoKSBkaWQgbm90IHJldHVybiBhIHVzZXJOYW1lXCIpO1xuICB9XG4gIHJldHVybiB1c2VyTmFtZTtcbn1cblxuLyoqIEJlc3QtZWZmb3J0IGB1c2VyTmFtZWAgb2ZmIGFuIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCAoc2hhcGUgdmFyaWVzIGJ5IG1vZGUpLiAqL1xuZnVuY3Rpb24gcmVhZENvbnRleHRVc2VyTmFtZShjdHg6IHVua25vd24pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAodHlwZW9mIGN0eCAhPT0gXCJvYmplY3RcIiB8fCBjdHggPT09IG51bGwgfHwgIShcInVzZXJOYW1lXCIgaW4gY3R4KSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgdmFsdWUgPSAoY3R4IGFzIHsgdXNlck5hbWU/OiB1bmtub3duIH0pLnVzZXJOYW1lO1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKHZhbHVlKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBjdXJyZW50IHdvcmtzcGFjZSBob3N0IGFzIGEgYG5ldC5VcmxCdWlsZGVyYDogdGhlIHdvcmtzcGFjZVxuICogYENvbmZpZ2AgaG9zdCBmaXJzdCwgdGhlbiB0aGUgYERBVEFCUklDS1NfSE9TVGAgZW52IHZhciwgZWxzZSBgdW5kZWZpbmVkYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdvcmtzcGFjZVVybCgpOiBQcm9taXNlPG5ldC5VcmxCdWlsZGVyIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGdldFdvcmtzcGFjZUNvbmZpZygpO1xuICBpZiAoY29uZmlnKSB7XG4gICAgY29uc3QgY29uZmlnSG9zdCA9IG5ldC51cmxCdWlsZGVyKGF3YWl0IGNvbmZpZy5nZXRIb3N0KCkpO1xuICAgIGlmIChjb25maWdIb3N0KSByZXR1cm4gY29uZmlnSG9zdDtcbiAgfVxuICBjb25zdCBkYXRhYnJpY2tzSG9zdCA9IG5ldC51cmxCdWlsZGVyKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfSE9TVCk7XG4gIGlmIChkYXRhYnJpY2tzSG9zdCkgcmV0dXJuIGRhdGFicmlja3NIb3N0O1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc29sdmUgdGhlIG51bWVyaWMgd29ya3NwYWNlIGlkOiB0aGUgd29ya3NwYWNlIGBDb25maWdgJ3MgYHdvcmtzcGFjZUlkYFxuICogZmlyc3QsIGVsc2UgdGhlIDEwLTIwIGRpZ2l0IHJ1biBvZiBgd29ya3NwYWNlSG9zdGAgKGRlZmF1bHRpbmcgdG9cbiAqIHtAbGluayBnZXRXb3Jrc3BhY2VVcmx9J3MgaG9zdCkuIGB1bmRlZmluZWRgIHdoZW4gbmVpdGhlciB5aWVsZHMgYW4gaWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VJZCh3b3Jrc3BhY2VIb3N0Pzogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgd29ya3NwYWNlSWQgPSAoYXdhaXQgZ2V0V29ya3NwYWNlQ29uZmlnKCkpPy53b3Jrc3BhY2VJZDtcbiAgaWYgKHdvcmtzcGFjZUlkKSByZXR1cm4gd29ya3NwYWNlSWQ7XG4gIHdvcmtzcGFjZUhvc3QgPSB3b3Jrc3BhY2VIb3N0ID8/IChhd2FpdCBnZXRXb3Jrc3BhY2VVcmwoKSk/Lmhvc3Q7XG4gIGlmICh3b3Jrc3BhY2VIb3N0KSB7XG4gICAgY29uc3QgbWF0Y2ggPSB3b3Jrc3BhY2VIb3N0Lm1hdGNoKFdPUktTUEFDRV9JRF9SRUdFWCk/LlswXTtcbiAgICBpZiAobWF0Y2gpIHJldHVybiBtYXRjaDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlLWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2UtY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFDTCxxQkFBcUIsSUFBSSxzQkFBc0IsR0FFaEQsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzRCxPQUFPLEVBQStDLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEcsT0FBTyxFQUFFLE9BQU8sRUFBbUIsVUFBVSxFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRS9GLDJFQUEyRTtBQUMzRSxNQUFNLGtCQUFrQixHQUFHLFdBQVcsQ0FBQztBQUN2QyxNQUFNLGFBQWEsR0FBRyxJQUFJLE9BQU8sRUFBcUMsQ0FBQztBQU12RTs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUscUJBQXFCLENBQ3pDLFVBQWlDLEVBQUU7SUFFbkMsTUFBTSxJQUFJLEdBQUcsTUFBTSxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxNQUFNLE1BQU0sR0FBRyxzQkFBc0IsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMzRCxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRztRQUMxQixJQUFJLEVBQUUsS0FBSztRQUNYLEtBQUssQ0FBQyxTQUFTO1lBQ2IsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7Z0JBQ3ZCLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDakUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxD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LEdBQUcsTUFBTSxrQkFBa0IsRUFBRSxDQUFDO0lBQzFDLElBQUksTUFBTSxFQUFFLENBQUM7UUFDWCxNQUFNLFVBQVUsR0FBRyxVQUFVLENBQUMsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUN0RCxJQUFJLFVBQVU7WUFBRSxPQUFPLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsTUFBTSxjQUFjLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDL0QsSUFBSSxjQUFjO1FBQUUsT0FBTyxjQUFjLENBQUM7SUFDMUMsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGNBQWMsQ0FBQyxhQUFzQjtJQUN6RCxNQUFNLFdBQVcsR0FBRyxDQUFDLE1BQU0sa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQztJQUM5RCxJQUFJLFdBQVc7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUNwQyxhQUFhLEdBQUcsYUFBYSxJQUFJLENBQUMsTUFBTSxlQUFlLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQztJQUNqRSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksS0FBSztZQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBSZXNvbHZlIHRoZSBjdXJyZW50IERhdGFicmlja3Mgd29ya3NwYWNlJ3MgVVJMLCBudW1lcmljIGlkLCBhbmQgY2xpZW50IGZyb21cbiAqIHRoZSBhY3RpdmUgZXhlY3V0aW9uIGNvbnRleHQgKEFwcEtpdCwgd2hlbiBpbml0aWFsaXplZCksIGEgZGVmYXVsdFxuICoge0BsaW5rIFdvcmtzcGFjZUNsaWVudH0sIG9yIHRoZSBlbnZpcm9ubWVudC4gU2VydmVyLW9ubHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGNyZWF0ZVdvcmtzcGFjZUNsaWVudCBhcyBfY3JlYXRlV29ya3NwYWNlQ2xpZW50LFxuICB0eXBlIFdvcmtzcGFjZUNsaWVudCBhcyBBcHBLaXRXb3Jrc3BhY2VDbGllbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IHRyeUdldEV4ZWN1dGlvbkNvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IHR5cGUgQXV0aENsaWVudCwgdHlwZSBEYXRhYnJpY2tzQXV0aE9wdGlvbnMsIGNyZWF0ZUF1dGhDbGllbnQgfSBmcm9tIFwiQGRieC10b29scy9hdXRoXCI7XG5pbXBvcnQgeyBtZW1vaXplLCB0eXBlIFVybEJ1aWxkZXIsIHVybEJ1aWxkZXIsIHRyaW1Ub1VuZGVmaW5lZCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbi8qKiBEYXRhYnJpY2tzIHdvcmtzcGFjZSBpZHMgYXJlIGEgMTAtMjAgZGlnaXQgcnVuIGVtYmVkZGVkIGluIHRoZSBob3N0LiAqL1xuY29uc3QgV09SS1NQQUNFX0lEX1JFR0VYID0gL1xcZHsxMCwyMH0vO1xuY29uc3Qgd29ya3NwYWNlQXV0aCA9IG5ldyBXZWFrTWFwPEFwcEtpdFdvcmtzcGFjZUNsaWVudCwgQXV0aENsaWVudD4oKTtcblxuLyoqIExlZ2FjeSBTREsgY2xpZW50IGV4cG9zZWQgYnkgQXBwS2l0IGZvciBBUElzIG5vdCB5ZXQgb24gaXRzIGZhY2FkZS4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZUNsaWVudCA9IFJldHVyblR5cGU8QXBwS2l0V29ya3NwYWNlQ2xpZW50W1widG9MZWdhY3lXb3Jrc3BhY2VDbGllbnRcIl0+O1xudHlwZSBDb25maWcgPSBXb3Jrc3BhY2VDbGllbnRbXCJjb25maWdcIl07XG5cbi8qKlxuICogQ3JlYXRlIGFuIEFwcEtpdCB3b3Jrc3BhY2UgY2xpZW50IHdob3NlIFNESyBjcmVkZW50aWFsIHZpc2l0b3IgZGVsZWdhdGVzIHRvXG4gKiBgQGRieC10b29scy9hdXRoYC5cbiAqXG4gKiBUaGUgYXV0aCBwYWNrYWdlIHJlc29sdmVzIHRoZSBhY3RpdmUgcHJvZmlsZSwgaG9zdCwgdG9rZW4gbGlmZWN5Y2xlLCBhbmRcbiAqIHVuaWZpZWQtd29ya3NwYWNlIGhlYWRlciB3aXRob3V0IHJlcXVpcmluZyBjYWxsZXJzIHRvIG1pcnJvciBwcm9maWxlIHZhbHVlc1xuICogaW50byBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIFRoZSBTREsgc3RpbGwgb3ducyB3b3Jrc3BhY2UgQVBJcyBhbmQgcmVxdWVzdFxuICogZXhlY3V0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlV29ya3NwYWNlQ2xpZW50KFxuICBvcHRpb25zOiBEYXRhYnJpY2tzQXV0aE9wdGlvbnMgPSB7fSxcbik6IFByb21pc2U8QXBwS2l0V29ya3NwYWNlQ2xpZW50PiB7XG4gIGNvbnN0IGF1dGggPSBhd2FpdCBjcmVhdGVBdXRoQ2xpZW50KG9wdGlvbnMpO1xuICBjb25zdCBjbGllbnQgPSBfY3JlYXRlV29ya3NwYWNlQ2xpZW50KHsgaG9zdDogYXV0aC5ob3N0IH0pO1xuICBjbGllbnQuY29uZmlnLmNyZWRlbnRpYWxzID0ge1xuICAgIG5hbWU6IFwicGF0XCIsXG4gICAgYXN5bmMgY29uZmlndXJlKCkge1xuICAgICAgcmV0dXJuIGFzeW5jIChoZWFkZXJzKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhhd2FpdCBhdXRoLmhlYWRlcnMoKSkpIHtcbiAgICAgICAgICBoZWFkZXJzLnNldChuYW1lLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcbiAgfTtcbiAgd29ya3NwYWNlQXV0aC5zZXQoY2xpZW50LCBhdXRoKTtcbiAgcmV0dXJuIGNsaWVudDtcbn1cblxuLyoqXG4gKiBSZWZyZXNoIHRoZSBkYngtdG9vbHMgY3JlZGVudGlhbCBsaWZlY3ljbGUgYXR0YWNoZWQgYnlcbiAqIHtAbGluayBjcmVhdGVXb3Jrc3BhY2VDbGllbnR9LiBSZXR1cm5zIGBmYWxzZWAgZm9yIGV4dGVybmFsbHkgc3VwcGxpZWRcbiAqIEFwcEtpdCBjbGllbnRzIHdob3NlIGNyZWRlbnRpYWwgb3duZXIgaXMgdW5rbm93bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlZnJlc2hXb3Jrc3BhY2VDbGllbnRBdXRoZW50aWNhdGlvbihcbiAgY2xpZW50OiBBcHBLaXRXb3Jrc3BhY2VDbGllbnQsXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgYXV0aCA9IHdvcmtzcGFjZUF1dGguZ2V0KGNsaWVudCk7XG4gIGlmICghYXV0aCkgcmV0dXJuIGZhbHNlO1xuICBhd2FpdCBhdXRoLmhlYWRlcnMoeyBsb2dpbjogZmFsc2UsIHJlZnJlc2g6IHRydWUgfSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKiogUmVzb2x2ZSBBcHBLaXQncyBmYWNhZGUgb3IgYW4gZXhpc3RpbmcgbGVnYWN5IGNsaWVudCB0byB0aGUgbGVnYWN5IFNESyBzdXJmYWNlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KFxuICBjbGllbnQ6IEFwcEtpdFdvcmtzcGFjZUNsaWVudCB8IFdvcmtzcGFjZUNsaWVudCxcbik6IFdvcmtzcGFjZUNsaWVudCB7XG4gIHJldHVybiBcInRvTGVnYWN5V29ya3NwYWNlQ2xpZW50XCIgaW4gY2xpZW50ID8gY2xpZW50LnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KCkgOiBjbGllbnQ7XG59XG5cbi8qKlxuICogTGF6aWx5LWNvbnN0cnVjdGVkIGRlZmF1bHQgYFdvcmtzcGFjZUNsaWVudGAgKGVudiAvIHByb2ZpbGUgYXV0aCksIG1lbW9pemVkIHNvXG4gKiBjb25zdHJ1Y3Rpb24gaGFwcGVucyBhdCBtb3N0IG9uY2UgcGVyIHByb2Nlc3MuIFVzZWQgb25seSB3aGVuIHRoZXJlJ3Mgbm9cbiAqIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCB0byBib3Jyb3cgYSBjbGllbnQgZnJvbS5cbiAqL1xuY29uc3QgZ2V0RGVmYXVsdFdvcmtzcGFjZUNsaWVudCA9IG1lbW9pemUoYXN5bmMgKCkgPT5cbiAgKGF3YWl0IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpKS50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudCgpLFxuKTtcblxuLyoqXG4gKiBUaGUgQXBwS2l0IGV4ZWN1dGlvbi1jb250ZXh0IHdvcmtzcGFjZSBjbGllbnQgd2hlbiBhdmFpbGFibGUsIG90aGVyd2lzZVxuICogYHVuZGVmaW5lZGAuIE5ldmVyIGNvbnN0cnVjdHMgYSBmYWxsYmFjayBjbGllbnQgYW5kIG5ldmVyIHRocm93cyBmb3IgYVxuICogbWlzc2luZyBBcHBLaXQgc2NvcGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0cnlHZXRXb3Jrc3BhY2VDbGllbnQoKTogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50LnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KCk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIHtAbGluayBXb3Jrc3BhY2VDbGllbnR9OiB7QGxpbmsgdHJ5R2V0V29ya3NwYWNlQ2xpZW50fSBmaXJzdCwgZWxzZVxuICogYSBtZW1vaXplZCBkZWZhdWx0IGNsaWVudCBmcm9tIGVudiAvIHByb2ZpbGUgYXV0aC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldFdvcmtzcGFjZUNsaWVudCgpOiBQcm9taXNlPFdvcmtzcGFjZUNsaWVudD4ge1xuICByZXR1cm4gdHJ5R2V0V29ya3NwYWNlQ2xpZW50KCkgPz8gKGF3YWl0IGdldERlZmF1bHRXb3Jrc3BhY2VDbGllbnQoKSk7XG59XG5cbi8qKlxuICogVGhlIGFjdGl2ZSB3b3Jrc3BhY2UgYENvbmZpZ2A6IHRoZSBBcHBLaXQgZXhlY3V0aW9uLWNvbnRleHQgY2xpZW50J3MgY29uZmlnXG4gKiB3aGVuIEFwcEtpdCBpcyBpbml0aWFsaXplZCwgZWxzZSB0aGUgZGVmYXVsdCBjbGllbnQncy4gUmV0dXJucyBgdW5kZWZpbmVkYFxuICogKG5ldmVyIHRocm93cykgd2hlbiBuZWl0aGVyIGlzIGF2YWlsYWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0V29ya3NwYWNlQ29uZmlnKCk6IFByb21pc2U8Q29uZmlnIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCBnZXRXb3Jrc3BhY2VDbGllbnQoKSkuY29uZmlnO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogQ3VycmVudCBEYXRhYnJpY2tzIHVzZXJuYW1lIGZvciB3b3Jrc3BhY2UgaG9tZSBwYXRoc1xuICogKGAvV29ya3NwYWNlL1VzZXJzLzx1c2VyTmFtZT5gKS5cbiAqXG4gKiBQcmVmZXJzIGB1c2VyTmFtZWAgb24gdGhlIEFwcEtpdCBleGVjdXRpb24gY29udGV4dCB3aGVuIHNldCwgb3RoZXJ3aXNlXG4gKiBjYWxscyBgY3VycmVudFVzZXIubWUoKWAgb24ge0BsaW5rIGNsaWVudH0gKG9yIHtAbGluayBnZXRXb3Jrc3BhY2VDbGllbnR9KS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRVc2VyTmFtZShjbGllbnQ/OiBXb3Jrc3BhY2VDbGllbnQpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjb250ZXh0VXNlciA9IHJlYWRDb250ZXh0VXNlck5hbWUodHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpKTtcbiAgaWYgKGNvbnRleHRVc2VyKSByZXR1cm4gY29udGV4dFVzZXI7XG5cbiAgY29uc3QgcmVzb2x2ZWQgPSBjbGllbnQgPz8gKGF3YWl0IGdldFdvcmtzcGFjZUNsaWVudCgpKTtcbiAgY29uc3QgbWUgPSBhd2FpdCByZXNvbHZlZC5jdXJyZW50VXNlci5tZSgpO1xuICBjb25zdCB1c2VyTmFtZSA9IG1lLnVzZXJOYW1lPy50cmltKCk7XG4gIGlmICghdXNlck5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJEYXRhYnJpY2tzIGN1cnJlbnRVc2VyLm1lKCkgZGlkIG5vdCByZXR1cm4gYSB1c2VyTmFtZVwiKTtcbiAgfVxuICByZXR1cm4gdXNlck5hbWU7XG59XG5cbi8qKiBCZXN0LWVmZm9ydCBgdXNlck5hbWVgIG9mZiBhbiBBcHBLaXQgZXhlY3V0aW9uIGNvbnRleHQgKHNoYXBlIHZhcmllcyBieSBtb2RlKS4gKi9cbmZ1bmN0aW9uIHJlYWRDb250ZXh0VXNlck5hbWUoY3R4OiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHR5cGVvZiBjdHggIT09IFwib2JqZWN0XCIgfHwgY3R4ID09PSBudWxsIHx8ICEoXCJ1c2VyTmFtZVwiIGluIGN0eCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHZhbHVlID0gKGN0eCBhcyB7IHVzZXJOYW1lPzogdW5rbm93biB9KS51c2VyTmFtZTtcbiAgcmV0dXJuIHRyaW1Ub1VuZGVmaW5lZCh2YWx1ZSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSB0aGUgY3VycmVudCB3b3Jrc3BhY2UgaG9zdCBhcyBhIGBuZXQuVXJsQnVpbGRlcmA6IHRoZSB3b3Jrc3BhY2VcbiAqIGBDb25maWdgIGhvc3QgZmlyc3QsIHRoZW4gdGhlIGBEQVRBQlJJQ0tTX0hPU1RgIGVudiB2YXIsIGVsc2UgYHVuZGVmaW5lZGAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRXb3Jrc3BhY2VVcmwoKTogUHJvbWlzZTxVcmxCdWlsZGVyIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNvbmZpZyA9IGF3YWl0IGdldFdvcmtzcGFjZUNvbmZpZygpO1xuICBpZiAoY29uZmlnKSB7XG4gICAgY29uc3QgY29uZmlnSG9zdCA9IHVybEJ1aWxkZXIoYXdhaXQgY29uZmlnLmdldEhvc3QoKSk7XG4gICAgaWYgKGNvbmZpZ0hvc3QpIHJldHVybiBjb25maWdIb3N0O1xuICB9XG4gIGNvbnN0IGRhdGFicmlja3NIb3N0ID0gdXJsQnVpbGRlcihwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0hPU1QpO1xuICBpZiAoZGF0YWJyaWNrc0hvc3QpIHJldHVybiBkYXRhYnJpY2tzSG9zdDtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBudW1lcmljIHdvcmtzcGFjZSBpZDogdGhlIHdvcmtzcGFjZSBgQ29uZmlnYCdzIGB3b3Jrc3BhY2VJZGBcbiAqIGZpcnN0LCBlbHNlIHRoZSAxMC0yMCBkaWdpdCBydW4gb2YgYHdvcmtzcGFjZUhvc3RgIChkZWZhdWx0aW5nIHRvXG4gKiB7QGxpbmsgZ2V0V29ya3NwYWNlVXJsfSdzIGhvc3QpLiBgdW5kZWZpbmVkYCB3aGVuIG5laXRoZXIgeWllbGRzIGFuIGlkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0V29ya3NwYWNlSWQod29ya3NwYWNlSG9zdD86IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHdvcmtzcGFjZUlkID0gKGF3YWl0IGdldFdvcmtzcGFjZUNvbmZpZygpKT8ud29ya3NwYWNlSWQ7XG4gIGlmICh3b3Jrc3BhY2VJZCkgcmV0dXJuIHdvcmtzcGFjZUlkO1xuICB3b3Jrc3BhY2VIb3N0ID0gd29ya3NwYWNlSG9zdCA/PyAoYXdhaXQgZ2V0V29ya3NwYWNlVXJsKCkpPy5ob3N0O1xuICBpZiAod29ya3NwYWNlSG9zdCkge1xuICAgIGNvbnN0IG1hdGNoID0gd29ya3NwYWNlSG9zdC5tYXRjaChXT1JLU1BBQ0VfSURfUkVHRVgpPy5bMF07XG4gICAgaWYgKG1hdGNoKSByZXR1cm4gbWF0Y2g7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -24,12 +24,12 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@databricks/appkit": "0.81.0",
27
- "@dbx-tools/appkit": "^0.9.154",
28
- "@dbx-tools/auth": "^0.9.154",
29
- "@dbx-tools/cli-service": "^0.9.154",
30
- "@dbx-tools/core": "^0.9.154",
31
- "@dbx-tools/shared-core": "^0.9.154",
32
- "@dbx-tools/shared-fs": "^0.9.154"
27
+ "@dbx-tools/appkit": "^0.9.158",
28
+ "@dbx-tools/auth": "^0.9.158",
29
+ "@dbx-tools/cli-service": "^0.9.158",
30
+ "@dbx-tools/core": "^0.9.158",
31
+ "@dbx-tools/shared-core": "^0.9.158",
32
+ "@dbx-tools/shared-fs": "^0.9.158"
33
33
  },
34
34
  "main": "./lib/index.js",
35
35
  "license": "Apache-2.0",
@@ -42,34 +42,10 @@
42
42
  "types": "./lib/index.d.ts",
43
43
  "default": "./lib/index.js"
44
44
  },
45
- "./cloud": {
46
- "types": "./lib/src/cloud.d.ts",
47
- "default": "./lib/src/cloud.js"
48
- },
49
- "./databricks-fs": {
50
- "types": "./lib/src/databricks-fs.d.ts",
51
- "default": "./lib/src/databricks-fs.js"
52
- },
53
- "./databricks-path": {
54
- "types": "./lib/src/databricks-path.d.ts",
55
- "default": "./lib/src/databricks-path.js"
56
- },
57
- "./net": {
58
- "types": "./lib/src/net.d.ts",
59
- "default": "./lib/src/net.js"
60
- },
61
- "./workspace-client": {
62
- "types": "./lib/src/workspace-client.d.ts",
63
- "default": "./lib/src/workspace-client.js"
64
- },
65
- "./*": {
66
- "types": "./lib/src/*/index.d.ts",
67
- "default": "./lib/src/*/index.js"
68
- },
69
45
  "./package.json": "./package.json"
70
46
  }
71
47
  },
72
- "version": "0.9.154",
48
+ "version": "0.9.158",
73
49
  "types": "./lib/index.d.ts",
74
50
  "dbxToolsConfig": {
75
51
  "tags": [
@@ -82,34 +58,10 @@
82
58
  "types": "./lib/index.d.ts",
83
59
  "default": "./lib/index.js"
84
60
  },
85
- "./cloud": {
86
- "types": "./lib/src/cloud.d.ts",
87
- "default": "./lib/src/cloud.js"
88
- },
89
- "./databricks-fs": {
90
- "types": "./lib/src/databricks-fs.d.ts",
91
- "default": "./lib/src/databricks-fs.js"
92
- },
93
- "./databricks-path": {
94
- "types": "./lib/src/databricks-path.d.ts",
95
- "default": "./lib/src/databricks-path.js"
96
- },
97
- "./net": {
98
- "types": "./lib/src/net.d.ts",
99
- "default": "./lib/src/net.js"
100
- },
101
- "./workspace-client": {
102
- "types": "./lib/src/workspace-client.d.ts",
103
- "default": "./lib/src/workspace-client.js"
104
- },
105
- "./*": {
106
- "types": "./lib/src/*/index.d.ts",
107
- "default": "./lib/src/*/index.js"
108
- },
109
61
  "./package.json": "./package.json"
110
62
  },
111
63
  "files": [
112
- "index.ts",
64
+ "index*.ts",
113
65
  "src",
114
66
  "lib"
115
67
  ],
package/src/cloud.ts CHANGED
@@ -23,8 +23,21 @@ import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
23
23
  import { tmpdir } from "node:os";
24
24
  import { dirname, join } from "node:path";
25
25
 
26
- import { file } from "@dbx-tools/core";
27
- import { errorUtils, functionUtils, hash, http, json, log, net } from "@dbx-tools/shared-core";
26
+ import { statSync } from "@dbx-tools/core";
27
+ import {
28
+ log,
29
+ toError,
30
+ memoize,
31
+ fnvHash,
32
+ id,
33
+ createFetchError,
34
+ parse,
35
+ type Cidr,
36
+ type UrlLike,
37
+ parseIp,
38
+ findContainingCidr,
39
+ parseCidr,
40
+ } from "@dbx-tools/shared-core";
28
41
  import { resolveHostIps } from "./net.ts";
29
42
 
30
43
  const logger = log.logger("cloud");
@@ -67,7 +80,7 @@ export interface CloudLocation {
67
80
  }
68
81
 
69
82
  /** A parsed CIDR block tagged with the region it belongs to. */
70
- interface RegionCidr extends net.Cidr {
83
+ interface RegionCidr extends Cidr {
71
84
  region: string;
72
85
  }
73
86
 
@@ -96,7 +109,7 @@ interface ProviderRanges {
96
109
  * // { provider: CloudProvider.Aws,
97
110
  * // region: "us-west-2", ip: "...", cidr: "..." }
98
111
  */
99
- export async function resolveCloudLocation(input: net.UrlLike): Promise<CloudLocation | null> {
112
+ export async function resolveCloudLocation(input: UrlLike): Promise<CloudLocation | null> {
100
113
  const ips = await resolveHostIps(input);
101
114
  if (ips.length === 0) {
102
115
  logger.debug("no ips resolved", { input: String(input) });
@@ -104,10 +117,10 @@ export async function resolveCloudLocation(input: net.UrlLike): Promise<CloudLoc
104
117
  }
105
118
  const providers = await loadProviderRanges();
106
119
  for (const ip of ips) {
107
- const parsed = net.parseIp(ip);
120
+ const parsed = parseIp(ip);
108
121
  if (!parsed) continue;
109
122
  for (const { provider, ranges } of providers) {
110
- const match = net.findContainingCidr(parsed, ranges);
123
+ const match = findContainingCidr(parsed, ranges);
111
124
  if (match) {
112
125
  return { provider, region: match.region, ip, cidr: match.cidr };
113
126
  }
@@ -132,7 +145,7 @@ export async function loadProviderRanges(): Promise<ProviderRanges[]> {
132
145
  if (result.status === "fulfilled") {
133
146
  out.push(result.value);
134
147
  } else {
135
- logger.warn("provider range load failed", { error: errorUtils.toError(result.reason) });
148
+ logger.warn("provider range load failed", { error: toError(result.reason) });
136
149
  }
137
150
  }
138
151
  return out;
@@ -142,9 +155,9 @@ export async function loadProviderRanges(): Promise<ProviderRanges[]> {
142
155
  // Per-provider cached loaders
143
156
  // ────────────────────────────────────────────────────────────────
144
157
 
145
- const loadAwsRanges = functionUtils.memoize(fetchAwsRanges, { ttlMs: RANGE_CACHE_TTL_MS });
146
- const loadAzureRanges = functionUtils.memoize(fetchAzureRanges, { ttlMs: RANGE_CACHE_TTL_MS });
147
- const loadGcpRanges = functionUtils.memoize(fetchGcpRanges, { ttlMs: RANGE_CACHE_TTL_MS });
158
+ const loadAwsRanges = memoize(fetchAwsRanges, { ttlMs: RANGE_CACHE_TTL_MS });
159
+ const loadAzureRanges = memoize(fetchAzureRanges, { ttlMs: RANGE_CACHE_TTL_MS });
160
+ const loadGcpRanges = memoize(fetchGcpRanges, { ttlMs: RANGE_CACHE_TTL_MS });
148
161
 
149
162
  // ────────────────────────────────────────────────────────────────
150
163
  // Provider feed fetch + parse
@@ -233,7 +246,7 @@ async function fetchAzureRanges(): Promise<ProviderRanges> {
233
246
  /** Parse `cidr` and, when valid and `region` is set, push a tagged range. */
234
247
  function addRange(ranges: RegionCidr[], cidr?: string, region?: string): void {
235
248
  if (!cidr || !region) return;
236
- const parsed = net.parseCidr(cidr);
249
+ const parsed = parseCidr(cidr);
237
250
  if (parsed) ranges.push({ ...parsed, region });
238
251
  }
239
252
 
@@ -245,7 +258,7 @@ function addRange(ranges: RegionCidr[], cidr?: string, region?: string): void {
245
258
  */
246
259
  async function fetchJson<T>(url: string): Promise<T> {
247
260
  const text = await fetchText(url);
248
- const parsed = json.parse<T>(text);
261
+ const parsed = parse<T>(text);
249
262
  if (parsed === undefined) {
250
263
  throw new Error(`range feed returned non-JSON content: ${url}`);
251
264
  }
@@ -262,7 +275,7 @@ async function fetchJson<T>(url: string): Promise<T> {
262
275
  async function fetchText(url: string): Promise<string> {
263
276
  const cacheDir = join(tmpdir(), "dbx-tools", "shared", "cloud");
264
277
  const cacheDirCreated = await mkdir(cacheDir, { recursive: true });
265
- const cachePath = join(cacheDir, `fetch-${hash.fnvHash(url)}.txt`);
278
+ const cachePath = join(cacheDir, `fetch-${fnvHash(url)}.txt`);
266
279
  const createdAt = cacheDirCreated ? undefined : await getCreated(cachePath);
267
280
  if (createdAt) {
268
281
  const expiresAt = new Date(createdAt.getTime() + RANGE_CACHE_TTL_MS);
@@ -271,11 +284,11 @@ async function fetchText(url: string): Promise<string> {
271
284
  return readFile(cachePath, "utf8");
272
285
  }
273
286
  }
274
- let tempPath: string | null = join(cacheDir, `${hash.id()}.txt`);
287
+ let tempPath: string | null = join(cacheDir, `${id()}.txt`);
275
288
  try {
276
289
  const response = await fetch(url);
277
290
  if (!response.ok) {
278
- throw await http.createFetchError(response, url);
291
+ throw await createFetchError(response, url);
279
292
  }
280
293
  const responseText = await response.text();
281
294
  await mkdir(dirname(tempPath), { recursive: true });
@@ -294,5 +307,5 @@ async function fetchText(url: string): Promise<string> {
294
307
 
295
308
  /** Birth time of `path`, or `undefined` when it doesn't exist yet. */
296
309
  async function getCreated(path: string): Promise<Date | undefined> {
297
- return (await file.statSync(path))?.birthtime;
310
+ return (await statSync(path))?.birthtime;
298
311
  }
@@ -13,19 +13,19 @@
13
13
  * @module
14
14
  */
15
15
 
16
- import { hash, object } from "@dbx-tools/shared-core";
16
+ import { fnvHash, toDate } from "@dbx-tools/shared-core";
17
17
  import {
18
18
  BaseFileSystem,
19
- baseFS,
20
19
  FileSystemError,
21
- posixPath,
22
20
  type CopyOptions,
23
21
  type FileEntry,
24
22
  type FileStat,
25
23
  type WriteFileOptions,
24
+ mapFileSystemError,
25
+ isHomeRelativePath,
26
+ basename,
26
27
  } from "@dbx-tools/shared-fs";
27
28
  import {
28
- isHomeRelativePath,
29
29
  normalizeDatabricksRoot,
30
30
  resolveDatabricksFilesBackend,
31
31
  resolveDatabricksRoot,
@@ -121,7 +121,7 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
121
121
  constructor(options: DatabricksFileSystemOptions) {
122
122
  const root = normalizeDatabricksRoot(options.root, { userName: options.userName });
123
123
  super({
124
- id: options.id ?? `databricks-${hash.fnvHash(root)}`,
124
+ id: options.id ?? `databricks-${fnvHash(root)}`,
125
125
  backend: "databricks",
126
126
  root,
127
127
  readOnly: options.readOnly,
@@ -174,7 +174,7 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
174
174
  },
175
175
  });
176
176
  } catch (error) {
177
- throw baseFS.mapFileSystemError(error, resolvedPath);
177
+ throw mapFileSystemError(error, resolvedPath);
178
178
  }
179
179
  }
180
180
 
@@ -206,7 +206,7 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
206
206
  }),
207
207
  });
208
208
  } catch (error) {
209
- throw baseFS.mapFileSystemError(error, resolvedPath);
209
+ throw mapFileSystemError(error, resolvedPath);
210
210
  }
211
211
  }
212
212
 
@@ -306,13 +306,13 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
306
306
  return this.dispatch<FileEntry[]>(resolvedPath, {
307
307
  dbfs: (client) =>
308
308
  collect(client.dbfs.list({ path: resolvedPath }), (info) => ({
309
- name: posixPath.basename(info.path ?? ""),
309
+ name: basename(info.path ?? ""),
310
310
  type: info.is_dir ? "directory" : "file",
311
311
  size: info.file_size,
312
312
  })),
313
313
  workspace: (client) =>
314
314
  collect(client.workspace.list({ path: resolvedPath }), (info) => ({
315
- name: posixPath.basename(info.path ?? ""),
315
+ name: basename(info.path ?? ""),
316
316
  type: info.object_type === "DIRECTORY" ? "directory" : "file",
317
317
  metadata: {
318
318
  createdAt: info.created_at,
@@ -322,7 +322,7 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
322
322
  })),
323
323
  volumes: (client) =>
324
324
  collect(client.files.listDirectoryContents({ directory_path: resolvedPath }), (entry) => ({
325
- name: entry.name ?? posixPath.basename(entry.path ?? ""),
325
+ name: entry.name ?? basename(entry.path ?? ""),
326
326
  type: entry.is_directory ? "directory" : "file",
327
327
  size: entry.file_size,
328
328
  })),
@@ -330,13 +330,13 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
330
330
  }
331
331
 
332
332
  protected override async statAt(resolvedPath: string): Promise<Omit<FileStat, "path">> {
333
- const fallbackName = posixPath.basename(resolvedPath) || posixPath.basename(this.root);
333
+ const fallbackName = basename(resolvedPath) || basename(this.root);
334
334
  return this.dispatch<Omit<FileStat, "path">>(resolvedPath, {
335
335
  dbfs: async (client) => {
336
336
  const info = await client.dbfs.getStatus({ path: resolvedPath });
337
- const modified = object.toDate(info.modification_time);
337
+ const modified = toDate(info.modification_time);
338
338
  return {
339
- name: posixPath.basename(info.path ?? resolvedPath) || fallbackName,
339
+ name: basename(info.path ?? resolvedPath) || fallbackName,
340
340
  type: info.is_dir ? "directory" : "file",
341
341
  size: info.file_size,
342
342
  createdAt: modified,
@@ -346,10 +346,10 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
346
346
  workspace: async (client) => {
347
347
  const info = await client.workspace.getStatus({ path: resolvedPath });
348
348
  return {
349
- name: posixPath.basename(info.path ?? resolvedPath) || fallbackName,
349
+ name: basename(info.path ?? resolvedPath) || fallbackName,
350
350
  type: info.object_type === "DIRECTORY" ? "directory" : "file",
351
- createdAt: object.toDate(info.created_at),
352
- modifiedAt: object.toDate(info.modified_at),
351
+ createdAt: toDate(info.created_at),
352
+ modifiedAt: toDate(info.modified_at),
353
353
  };
354
354
  },
355
355
  volumes: (client) => this.statVolumePath(client, resolvedPath, fallbackName),
@@ -416,7 +416,7 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
416
416
  ): Promise<Omit<FileStat, "path">> {
417
417
  try {
418
418
  const metadata = await client.files.getMetadata({ file_path: absolutePath });
419
- const modified = object.toDate(metadata["last-modified"]);
419
+ const modified = toDate(metadata["last-modified"]);
420
420
  return {
421
421
  name: fallbackName,
422
422
  type: "file",
@@ -428,7 +428,7 @@ export class DatabricksFileSystem extends BaseFileSystem<"databricks"> {
428
428
  } catch (fileErr) {
429
429
  // A directory has no file metadata, and an unreadable one reports as
430
430
  // missing / denied - both are worth a directory probe before failing.
431
- const code = baseFS.mapFileSystemError(fileErr, absolutePath).code;
431
+ const code = mapFileSystemError(fileErr, absolutePath).code;
432
432
  if (code !== "NOT_FOUND" && code !== "PERMISSION_DENIED") throw fileErr;
433
433
  await client.files.getDirectoryMetadata({ directory_path: absolutePath });
434
434
  return { name: fallbackName, type: "directory" };
@@ -11,7 +11,13 @@
11
11
  * @module
12
12
  */
13
13
 
14
- import { posixPath } from "@dbx-tools/shared-fs";
14
+ import {
15
+ isHomeRelativePath,
16
+ toPosix,
17
+ expandHome,
18
+ normalizeRoot,
19
+ isAbsolute,
20
+ } from "@dbx-tools/shared-fs";
15
21
  import { getCurrentUserName, type WorkspaceClient } from "./workspace-client.ts";
16
22
 
17
23
  /** Which Databricks Files API serves an absolute path. */
@@ -37,9 +43,6 @@ export interface ResolveDatabricksRootOptions {
37
43
  client?: WorkspaceClient;
38
44
  }
39
45
 
40
- /** True when {@link input} is `~` or a path under `~/`. See {@link posixPath.isHomeRelativePath}. */
41
- export const isHomeRelativePath = posixPath.isHomeRelativePath;
42
-
43
46
  /**
44
47
  * Expand `~` / `~/...` to `/Workspace/Users/<userName>/...`.
45
48
  * Non-home inputs are returned unchanged (POSIX separators only).
@@ -50,9 +53,9 @@ export function expandHomePath(input: string, userName: string): string {
50
53
  throw new TypeError("Databricks home expansion requires a non-empty userName");
51
54
  }
52
55
  if (!isHomeRelativePath(input)) {
53
- return posixPath.toPosix(input.trim());
56
+ return toPosix(input.trim());
54
57
  }
55
- return posixPath.expandHome(input, `/Workspace/Users/${name}`);
58
+ return expandHome(input, `/Workspace/Users/${name}`);
56
59
  }
57
60
 
58
61
  /**
@@ -80,26 +83,26 @@ export function normalizeDatabricksRoot(
80
83
  `Databricks home path "${root}" requires userName; use resolveDatabricksRoot() or pass userName`,
81
84
  );
82
85
  }
83
- return posixPath.normalizeRoot(expandHomePath(trimmed, options.userName));
86
+ return normalizeRoot(expandHomePath(trimmed, options.userName));
84
87
  }
85
88
 
86
89
  const threePart = VOLUME_THREE_PART.exec(trimmed);
87
90
  if (threePart) {
88
- return posixPath.normalizeRoot(`/Volumes/${threePart[1]}/${threePart[2]}/${threePart[3]}`);
91
+ return normalizeRoot(`/Volumes/${threePart[1]}/${threePart[2]}/${threePart[3]}`);
89
92
  }
90
93
 
91
- let posix = posixPath.toPosix(trimmed);
94
+ let posix = toPosix(trimmed);
92
95
  if (posix === "/Volume" || posix.startsWith("/Volume/")) {
93
96
  posix = `/Volumes${posix.slice("/Volume".length)}`;
94
97
  }
95
98
 
96
- if (!posixPath.isAbsolute(posix)) {
99
+ if (!isAbsolute(posix)) {
97
100
  throw new TypeError(
98
101
  `Databricks filesystem root must be absolute, catalog.schema.volume, or ~, got: ${root}`,
99
102
  );
100
103
  }
101
104
 
102
- return posixPath.normalizeRoot(posix);
105
+ return normalizeRoot(posix);
103
106
  }
104
107
 
105
108
  /**
@@ -119,7 +122,7 @@ export async function resolveDatabricksRoot(
119
122
 
120
123
  /** True when {@link absolutePath} is served by the workspace objects API. */
121
124
  export function isWorkspaceFilesPath(absolutePath: string): boolean {
122
- const p = posixPath.toPosix(absolutePath);
125
+ const p = toPosix(absolutePath);
123
126
  return (
124
127
  p === "/Workspace" ||
125
128
  p.startsWith("/Workspace/") ||
@@ -131,13 +134,13 @@ export function isWorkspaceFilesPath(absolutePath: string): boolean {
131
134
 
132
135
  /** True when {@link absolutePath} is a Unity Catalog volume path. */
133
136
  export function isVolumesPath(absolutePath: string): boolean {
134
- const p = posixPath.toPosix(absolutePath);
137
+ const p = toPosix(absolutePath);
135
138
  return p === "/Volumes" || p.startsWith("/Volumes/");
136
139
  }
137
140
 
138
141
  /** True when {@link absolutePath} is a DBFS path. */
139
142
  export function isDbfsPath(absolutePath: string): boolean {
140
- const p = posixPath.toPosix(absolutePath);
143
+ const p = toPosix(absolutePath);
141
144
  return p === "/dbfs" || p.startsWith("/dbfs/");
142
145
  }
143
146
 
package/src/net.ts CHANGED
@@ -8,14 +8,20 @@
8
8
  */
9
9
 
10
10
  import { lookup } from "node:dns/promises";
11
- import { functionUtils, http, net } from "@dbx-tools/shared-core";
11
+ import {
12
+ memoize,
13
+ createFetchError,
14
+ type UrlLike,
15
+ urlBuilder,
16
+ parseIp,
17
+ } from "@dbx-tools/shared-core";
12
18
 
13
19
  /**
14
20
  * This process's outbound public IP, cached for 5 minutes. Asks Cloudflare's
15
21
  * `cdn-cgi/trace` first and falls back to ipify. Useful for allowlisting or for
16
22
  * reasoning about egress from a Databricks App.
17
23
  */
18
- export const getPublicIp = functionUtils.memoize(
24
+ export const getPublicIp = memoize(
19
25
  async () => {
20
26
  const cloudflareResponse = await fetch("https://cloudflare.com/cdn-cgi/trace");
21
27
  if (cloudflareResponse.ok) {
@@ -30,7 +36,7 @@ export const getPublicIp = functionUtils.memoize(
30
36
  }
31
37
  const ipifyResponse = await fetch("https://api.ipify.org?format=json");
32
38
  if (!ipifyResponse.ok) {
33
- throw await http.createFetchError(ipifyResponse);
39
+ throw await createFetchError(ipifyResponse);
34
40
  }
35
41
  const ipifyData = (await ipifyResponse.json()) as { ip?: string };
36
42
  const ip = ipifyData?.ip;
@@ -53,11 +59,11 @@ export const getPublicIp = functionUtils.memoize(
53
59
  * platform resolver order are honored, matching what an outbound connection to
54
60
  * the host would actually use.
55
61
  */
56
- export async function resolveHostIps(input: net.UrlLike): Promise<string[]> {
57
- const host = net.urlBuilder(input)?.hostname;
62
+ export async function resolveHostIps(input: UrlLike): Promise<string[]> {
63
+ const host = urlBuilder(input)?.hostname;
58
64
  if (!host) return [];
59
65
  // WHATWG `URL.hostname` brackets IPv6 literals; strip before parsing.
60
- const literal = net.parseIp(host.replace(/^\[|\]$/g, ""));
66
+ const literal = parseIp(host.replace(/^\[|\]$/g, ""));
61
67
  if (literal) return [host.replace(/^\[|\]$/g, "")];
62
68
  try {
63
69
  const results = await lookup(host, { all: true });