@dbx-tools/appkit 0.3.44 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Lakebase cache-schema grant fix-up.
3
+ *
4
+ * AppKit's persistent cache (`CacheManager` -> `PersistentStorage`) uses a
5
+ * schema `appkit` and a table `appkit.appkit_cache_entries`. When the connecting
6
+ * Databricks identity lacks privileges on that schema, the cache migration
7
+ * throws, and because AppKit is typically run with `cache.strictPersistence:
8
+ * true`, the cache is silently switched to a disabled in-memory stub - so every
9
+ * persistent read (chart long-poll, history, etc.) misses and 404s.
10
+ *
11
+ * This grants the connecting role full rights on the cache schema, but only when
12
+ * the schema ALREADY EXISTS - it never creates the schema itself. Run from a
13
+ * LOCAL identity that owns the schema (or holds grant option on it); it is
14
+ * skipped inside a Databricks App, where the app SP cannot grant and its
15
+ * Postgres role does not exist until its first connection.
16
+ *
17
+ * Must run AFTER {@link applyLakebaseToEnv} has written the resolved connection
18
+ * to `process.env` (so `createLakebasePool` picks up host / database / endpoint)
19
+ * and BEFORE `createApp` initializes the cache.
20
+ *
21
+ * @module
22
+ */
23
+ import { createLakebasePool, getWorkspaceClient, ValidationError } from "@databricks/appkit";
24
+ import { error, log } from "@dbx-tools/shared-core";
25
+ import { isAppEnv } from "./databricks.js";
26
+ const defaultLogger = log.logger("provision");
27
+ /** AppKit persistent-cache schema (see AppKit's `PersistentStorage`). */
28
+ const CACHE_SCHEMA = "appkit";
29
+ /**
30
+ * Characters a Lakebase Postgres role can legitimately contain: workspace
31
+ * identities are emails, service principals are UUIDs.
32
+ */
33
+ const ROLE_PATTERN = /^[A-Za-z0-9._@+-]{1,255}$/;
34
+ /**
35
+ * Provisioning runs at boot as the local developer identity, before any plugin
36
+ * exists, so it is outside AppKit's interceptor chain and inherits no timeout
37
+ * from it. Both bounds are explicit for that reason.
38
+ */
39
+ const CONNECT_TIMEOUT_MS = 10_000;
40
+ const STATEMENT_TIMEOUT_MS = 15_000;
41
+ /**
42
+ * Quote a Postgres identifier: wrap in double quotes and double any embedded
43
+ * quote. Schema and role names are identifiers, and Postgres does not accept a
44
+ * bind parameter in an identifier position, so quoting is the only defense
45
+ * available for these statements. Lakebase role names are usually emails
46
+ * (`user@host`), which must be quoted to be a valid identifier at all.
47
+ */
48
+ function quoteIdent(ident) {
49
+ return `"${ident.replace(/"/g, '""')}"`;
50
+ }
51
+ /**
52
+ * Idempotent grants that make the (already-existing) AppKit cache schema fully
53
+ * usable by `role`. The `ALTER DEFAULT PRIVILEGES` lines cover the cache table
54
+ * whenever the schema owner creates it later.
55
+ *
56
+ * Throws a {@link ValidationError} when `role` is not a plausible Postgres role
57
+ * name, since the value lands in an identifier position.
58
+ */
59
+ export function cacheGrantStatements(role) {
60
+ if (!ROLE_PATTERN.test(role)) {
61
+ throw ValidationError.invalidValue("role", role, "a Postgres role name");
62
+ }
63
+ const schema = quoteIdent(CACHE_SCHEMA);
64
+ const target = quoteIdent(role);
65
+ return [
66
+ `GRANT USAGE, CREATE ON SCHEMA ${schema} TO ${target}`,
67
+ `GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA ${schema} TO ${target}`,
68
+ `GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA ${schema} TO ${target}`,
69
+ `ALTER DEFAULT PRIVILEGES IN SCHEMA ${schema} GRANT ALL ON TABLES TO ${target}`,
70
+ `ALTER DEFAULT PRIVILEGES IN SCHEMA ${schema} GRANT ALL ON SEQUENCES TO ${target}`,
71
+ ];
72
+ }
73
+ /**
74
+ * Grant `role` rights on the AppKit cache schema, but only when that schema
75
+ * already exists.
76
+ *
77
+ * No-ops inside a Databricks App env, when `role` is undefined, or when the
78
+ * schema is absent. Best-effort otherwise: any failure (e.g. the local identity
79
+ * doesn't own the schema) is logged and swallowed so it never blocks startup -
80
+ * a disabled cache is degraded, not fatal.
81
+ *
82
+ * @param role - Postgres role to grant to and connect as (the resolved
83
+ * workspace-client identity); skips when undefined.
84
+ * @param logger - Logger to report progress on. Defaults to this module's.
85
+ *
86
+ * @example
87
+ * import { provision } from "@dbx-tools/appkit";
88
+ *
89
+ * await provision.provisionCacheSchema("app-service-principal@databricks.com");
90
+ */
91
+ export async function provisionCacheSchema(role, logger = defaultLogger) {
92
+ if (isAppEnv()) {
93
+ logger.debug("autopg: skip cache provisioning (inside a Databricks App)");
94
+ return;
95
+ }
96
+ if (!role) {
97
+ logger.warn("autopg: skip cache provisioning (could not resolve connecting role)");
98
+ return;
99
+ }
100
+ // Pass `user` explicitly: autopg resolves the connection target
101
+ // (host/database/endpoint) but not the identity, so `createLakebasePool`'s
102
+ // synchronous username lookup would otherwise throw. `getWorkspaceClient({})`
103
+ // returns a fresh default-auth client - literally `new WorkspaceClient({})`,
104
+ // but built against the SDK version AppKit's `createLakebasePool` expects
105
+ // (importing the SDK class directly here pulls a newer, type-incompatible copy).
106
+ const pool = createLakebasePool({
107
+ user: role,
108
+ workspaceClient: getWorkspaceClient({}),
109
+ connectionTimeoutMillis: CONNECT_TIMEOUT_MS,
110
+ statement_timeout: STATEMENT_TIMEOUT_MS,
111
+ });
112
+ try {
113
+ const found = await pool.query("SELECT 1 FROM information_schema.schemata WHERE schema_name = $1", [CACHE_SCHEMA]);
114
+ if (found.rowCount === 0) {
115
+ logger.debug("autopg: skip cache provisioning (schema absent)", { schema: CACHE_SCHEMA });
116
+ return;
117
+ }
118
+ for (const sql of cacheGrantStatements(role)) {
119
+ await pool.query(sql);
120
+ }
121
+ logger.info("autopg: granted cache schema", { schema: CACHE_SCHEMA, role });
122
+ }
123
+ catch (err) {
124
+ logger.warn("autopg: cache provisioning failed (continuing)", {
125
+ schema: CACHE_SCHEMA,
126
+ error: error.errorMessage(err),
127
+ });
128
+ }
129
+ finally {
130
+ await pool.end().catch(() => { });
131
+ }
132
+ }
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvdmlzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Byb3Zpc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLGtCQUFrQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFcEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUV4QyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBRTlDLHlFQUF5RTtBQUN6RSxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUM7QUFFOUI7OztHQUdHO0FBQ0gsTUFBTSxZQUFZLEdBQUcsMkJBQTJCLENBQUM7QUFFakQ7Ozs7R0FJRztBQUNILE1BQU0sa0JBQWtCLEdBQUcsTUFBTSxDQUFDO0FBQ2xDLE1BQU0sb0JBQW9CLEdBQUcsTUFBTSxDQUFDO0FBRXBDOzs7Ozs7R0FNRztBQUNILFNBQVMsVUFBVSxDQUFDLEtBQWE7SUFDL0IsT0FBTyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUM7QUFDMUMsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsSUFBWTtJQUMvQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzdCLE1BQU0sZUFBZSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDaEMsT0FBTztRQUNMLGlDQUFpQyxNQUFNLE9BQU8sTUFBTSxFQUFFO1FBQ3RELGdEQUFnRCxNQUFNLE9BQU8sTUFBTSxFQUFFO1FBQ3JFLG1EQUFtRCxNQUFNLE9BQU8sTUFBTSxFQUFFO1FBQ3hFLHNDQUFzQyxNQUFNLDJCQUEyQixNQUFNLEVBQUU7UUFDL0Usc0NBQXNDLE1BQU0sOEJBQThCLE1BQU0sRUFBRTtLQUNuRixDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLElBQXdCLEVBQ3hCLFNBQXFCLGFBQWE7SUFFbEMsSUFBSSxRQUFRLEVBQUUsRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO1FBQzFFLE9BQU87SUFDVCxDQUFDO0lBQ0QsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ1YsTUFBTSxDQUFDLElBQUksQ0FBQyxxRUFBcUUsQ0FBQyxDQUFDO1FBQ25GLE9BQU87SUFDVCxDQUFDO0lBQ0QsZ0VBQWdFO0lBQ2hFLDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUsNkVBQTZFO0lBQzdFLDBFQUEwRTtJQUMxRSxpRkFBaUY7SUFDakYsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLENBQUM7UUFDOUIsSUFBSSxFQUFFLElBQUk7UUFDVixlQUFlLEVBQUUsa0JBQWtCLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLHVCQUF1QixFQUFFLGtCQUFrQjtRQUMzQyxpQkFBaUIsRUFBRSxvQkFBb0I7S0FDeEMsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxDQUFDO1FBQ0gsTUFBTSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsS0FBSyxDQUM1QixrRUFBa0UsRUFDbEUsQ0FBQyxZQUFZLENBQUMsQ0FDZixDQUFDO1FBQ0YsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsaURBQWlELEVBQUUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUMxRixPQUFPO1FBQ1QsQ0FBQztRQUNELEtBQUssTUFBTSxHQUFHLElBQUksb0JBQW9CLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QyxNQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUNELE1BQU0sQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixNQUFNLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxFQUFFO1lBQzVELE1BQU0sRUFBRSxZQUFZO1lBQ3BCLEtBQUssRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztTQUMvQixDQUFDLENBQUM7SUFDTCxDQUFDO1lBQVMsQ0FBQztRQUNULE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTGFrZWJhc2UgY2FjaGUtc2NoZW1hIGdyYW50IGZpeC11cC5cbiAqXG4gKiBBcHBLaXQncyBwZXJzaXN0ZW50IGNhY2hlIChgQ2FjaGVNYW5hZ2VyYCAtPiBgUGVyc2lzdGVudFN0b3JhZ2VgKSB1c2VzIGFcbiAqIHNjaGVtYSBgYXBwa2l0YCBhbmQgYSB0YWJsZSBgYXBwa2l0LmFwcGtpdF9jYWNoZV9lbnRyaWVzYC4gV2hlbiB0aGUgY29ubmVjdGluZ1xuICogRGF0YWJyaWNrcyBpZGVudGl0eSBsYWNrcyBwcml2aWxlZ2VzIG9uIHRoYXQgc2NoZW1hLCB0aGUgY2FjaGUgbWlncmF0aW9uXG4gKiB0aHJvd3MsIGFuZCBiZWNhdXNlIEFwcEtpdCBpcyB0eXBpY2FsbHkgcnVuIHdpdGggYGNhY2hlLnN0cmljdFBlcnNpc3RlbmNlOlxuICogdHJ1ZWAsIHRoZSBjYWNoZSBpcyBzaWxlbnRseSBzd2l0Y2hlZCB0byBhIGRpc2FibGVkIGluLW1lbW9yeSBzdHViIC0gc28gZXZlcnlcbiAqIHBlcnNpc3RlbnQgcmVhZCAoY2hhcnQgbG9uZy1wb2xsLCBoaXN0b3J5LCBldGMuKSBtaXNzZXMgYW5kIDQwNHMuXG4gKlxuICogVGhpcyBncmFudHMgdGhlIGNvbm5lY3Rpbmcgcm9sZSBmdWxsIHJpZ2h0cyBvbiB0aGUgY2FjaGUgc2NoZW1hLCBidXQgb25seSB3aGVuXG4gKiB0aGUgc2NoZW1hIEFMUkVBRFkgRVhJU1RTIC0gaXQgbmV2ZXIgY3JlYXRlcyB0aGUgc2NoZW1hIGl0c2VsZi4gUnVuIGZyb20gYVxuICogTE9DQUwgaWRlbnRpdHkgdGhhdCBvd25zIHRoZSBzY2hlbWEgKG9yIGhvbGRzIGdyYW50IG9wdGlvbiBvbiBpdCk7IGl0IGlzXG4gKiBza2lwcGVkIGluc2lkZSBhIERhdGFicmlja3MgQXBwLCB3aGVyZSB0aGUgYXBwIFNQIGNhbm5vdCBncmFudCBhbmQgaXRzXG4gKiBQb3N0Z3JlcyByb2xlIGRvZXMgbm90IGV4aXN0IHVudGlsIGl0cyBmaXJzdCBjb25uZWN0aW9uLlxuICpcbiAqIE11c3QgcnVuIEFGVEVSIHtAbGluayBhcHBseUxha2ViYXNlVG9FbnZ9IGhhcyB3cml0dGVuIHRoZSByZXNvbHZlZCBjb25uZWN0aW9uXG4gKiB0byBgcHJvY2Vzcy5lbnZgIChzbyBgY3JlYXRlTGFrZWJhc2VQb29sYCBwaWNrcyB1cCBob3N0IC8gZGF0YWJhc2UgLyBlbmRwb2ludClcbiAqIGFuZCBCRUZPUkUgYGNyZWF0ZUFwcGAgaW5pdGlhbGl6ZXMgdGhlIGNhY2hlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBjcmVhdGVMYWtlYmFzZVBvb2wsIGdldFdvcmtzcGFjZUNsaWVudCwgVmFsaWRhdGlvbkVycm9yIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZXJyb3IsIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5cbmltcG9ydCB7IGlzQXBwRW52IH0gZnJvbSBcIi4vZGF0YWJyaWNrc1wiO1xuXG5jb25zdCBkZWZhdWx0TG9nZ2VyID0gbG9nLmxvZ2dlcihcInByb3Zpc2lvblwiKTtcblxuLyoqIEFwcEtpdCBwZXJzaXN0ZW50LWNhY2hlIHNjaGVtYSAoc2VlIEFwcEtpdCdzIGBQZXJzaXN0ZW50U3RvcmFnZWApLiAqL1xuY29uc3QgQ0FDSEVfU0NIRU1BID0gXCJhcHBraXRcIjtcblxuLyoqXG4gKiBDaGFyYWN0ZXJzIGEgTGFrZWJhc2UgUG9zdGdyZXMgcm9sZSBjYW4gbGVnaXRpbWF0ZWx5IGNvbnRhaW46IHdvcmtzcGFjZVxuICogaWRlbnRpdGllcyBhcmUgZW1haWxzLCBzZXJ2aWNlIHByaW5jaXBhbHMgYXJlIFVVSURzLlxuICovXG5jb25zdCBST0xFX1BBVFRFUk4gPSAvXltBLVphLXowLTkuX0ArLV17MSwyNTV9JC87XG5cbi8qKlxuICogUHJvdmlzaW9uaW5nIHJ1bnMgYXQgYm9vdCBhcyB0aGUgbG9jYWwgZGV2ZWxvcGVyIGlkZW50aXR5LCBiZWZvcmUgYW55IHBsdWdpblxuICogZXhpc3RzLCBzbyBpdCBpcyBvdXRzaWRlIEFwcEtpdCdzIGludGVyY2VwdG9yIGNoYWluIGFuZCBpbmhlcml0cyBubyB0aW1lb3V0XG4gKiBmcm9tIGl0LiBCb3RoIGJvdW5kcyBhcmUgZXhwbGljaXQgZm9yIHRoYXQgcmVhc29uLlxuICovXG5jb25zdCBDT05ORUNUX1RJTUVPVVRfTVMgPSAxMF8wMDA7XG5jb25zdCBTVEFURU1FTlRfVElNRU9VVF9NUyA9IDE1XzAwMDtcblxuLyoqXG4gKiBRdW90ZSBhIFBvc3RncmVzIGlkZW50aWZpZXI6IHdyYXAgaW4gZG91YmxlIHF1b3RlcyBhbmQgZG91YmxlIGFueSBlbWJlZGRlZFxuICogcXVvdGUuIFNjaGVtYSBhbmQgcm9sZSBuYW1lcyBhcmUgaWRlbnRpZmllcnMsIGFuZCBQb3N0Z3JlcyBkb2VzIG5vdCBhY2NlcHQgYVxuICogYmluZCBwYXJhbWV0ZXIgaW4gYW4gaWRlbnRpZmllciBwb3NpdGlvbiwgc28gcXVvdGluZyBpcyB0aGUgb25seSBkZWZlbnNlXG4gKiBhdmFpbGFibGUgZm9yIHRoZXNlIHN0YXRlbWVudHMuIExha2ViYXNlIHJvbGUgbmFtZXMgYXJlIHVzdWFsbHkgZW1haWxzXG4gKiAoYHVzZXJAaG9zdGApLCB3aGljaCBtdXN0IGJlIHF1b3RlZCB0byBiZSBhIHZhbGlkIGlkZW50aWZpZXIgYXQgYWxsLlxuICovXG5mdW5jdGlvbiBxdW90ZUlkZW50KGlkZW50OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYFwiJHtpZGVudC5yZXBsYWNlKC9cIi9nLCAnXCJcIicpfVwiYDtcbn1cblxuLyoqXG4gKiBJZGVtcG90ZW50IGdyYW50cyB0aGF0IG1ha2UgdGhlIChhbHJlYWR5LWV4aXN0aW5nKSBBcHBLaXQgY2FjaGUgc2NoZW1hIGZ1bGx5XG4gKiB1c2FibGUgYnkgYHJvbGVgLiBUaGUgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFU2AgbGluZXMgY292ZXIgdGhlIGNhY2hlIHRhYmxlXG4gKiB3aGVuZXZlciB0aGUgc2NoZW1hIG93bmVyIGNyZWF0ZXMgaXQgbGF0ZXIuXG4gKlxuICogVGhyb3dzIGEge0BsaW5rIFZhbGlkYXRpb25FcnJvcn0gd2hlbiBgcm9sZWAgaXMgbm90IGEgcGxhdXNpYmxlIFBvc3RncmVzIHJvbGVcbiAqIG5hbWUsIHNpbmNlIHRoZSB2YWx1ZSBsYW5kcyBpbiBhbiBpZGVudGlmaWVyIHBvc2l0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2FjaGVHcmFudFN0YXRlbWVudHMocm9sZTogc3RyaW5nKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuICBpZiAoIVJPTEVfUEFUVEVSTi50ZXN0KHJvbGUpKSB7XG4gICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcInJvbGVcIiwgcm9sZSwgXCJhIFBvc3RncmVzIHJvbGUgbmFtZVwiKTtcbiAgfVxuICBjb25zdCBzY2hlbWEgPSBxdW90ZUlkZW50KENBQ0hFX1NDSEVNQSk7XG4gIGNvbnN0IHRhcmdldCA9IHF1b3RlSWRlbnQocm9sZSk7XG4gIHJldHVybiBbXG4gICAgYEdSQU5UIFVTQUdFLCBDUkVBVEUgT04gU0NIRU1BICR7c2NoZW1hfSBUTyAke3RhcmdldH1gLFxuICAgIGBHUkFOVCBBTEwgUFJJVklMRUdFUyBPTiBBTEwgVEFCTEVTIElOIFNDSEVNQSAke3NjaGVtYX0gVE8gJHt0YXJnZXR9YCxcbiAgICBgR1JBTlQgQUxMIFBSSVZJTEVHRVMgT04gQUxMIFNFUVVFTkNFUyBJTiBTQ0hFTUEgJHtzY2hlbWF9IFRPICR7dGFyZ2V0fWAsXG4gICAgYEFMVEVSIERFRkFVTFQgUFJJVklMRUdFUyBJTiBTQ0hFTUEgJHtzY2hlbWF9IEdSQU5UIEFMTCBPTiBUQUJMRVMgVE8gJHt0YXJnZXR9YCxcbiAgICBgQUxURVIgREVGQVVMVCBQUklWSUxFR0VTIElOIFNDSEVNQSAke3NjaGVtYX0gR1JBTlQgQUxMIE9OIFNFUVVFTkNFUyBUTyAke3RhcmdldH1gLFxuICBdO1xufVxuXG4vKipcbiAqIEdyYW50IGByb2xlYCByaWdodHMgb24gdGhlIEFwcEtpdCBjYWNoZSBzY2hlbWEsIGJ1dCBvbmx5IHdoZW4gdGhhdCBzY2hlbWFcbiAqIGFscmVhZHkgZXhpc3RzLlxuICpcbiAqIE5vLW9wcyBpbnNpZGUgYSBEYXRhYnJpY2tzIEFwcCBlbnYsIHdoZW4gYHJvbGVgIGlzIHVuZGVmaW5lZCwgb3Igd2hlbiB0aGVcbiAqIHNjaGVtYSBpcyBhYnNlbnQuIEJlc3QtZWZmb3J0IG90aGVyd2lzZTogYW55IGZhaWx1cmUgKGUuZy4gdGhlIGxvY2FsIGlkZW50aXR5XG4gKiBkb2Vzbid0IG93biB0aGUgc2NoZW1hKSBpcyBsb2dnZWQgYW5kIHN3YWxsb3dlZCBzbyBpdCBuZXZlciBibG9ja3Mgc3RhcnR1cCAtXG4gKiBhIGRpc2FibGVkIGNhY2hlIGlzIGRlZ3JhZGVkLCBub3QgZmF0YWwuXG4gKlxuICogQHBhcmFtIHJvbGUgLSBQb3N0Z3JlcyByb2xlIHRvIGdyYW50IHRvIGFuZCBjb25uZWN0IGFzICh0aGUgcmVzb2x2ZWRcbiAqICAgd29ya3NwYWNlLWNsaWVudCBpZGVudGl0eSk7IHNraXBzIHdoZW4gdW5kZWZpbmVkLlxuICogQHBhcmFtIGxvZ2dlciAtIExvZ2dlciB0byByZXBvcnQgcHJvZ3Jlc3Mgb24uIERlZmF1bHRzIHRvIHRoaXMgbW9kdWxlJ3MuXG4gKlxuICogQGV4YW1wbGVcbiAqIGltcG9ydCB7IHByb3Zpc2lvbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuICpcbiAqIGF3YWl0IHByb3Zpc2lvbi5wcm92aXNpb25DYWNoZVNjaGVtYShcImFwcC1zZXJ2aWNlLXByaW5jaXBhbEBkYXRhYnJpY2tzLmNvbVwiKTtcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3Zpc2lvbkNhY2hlU2NoZW1hKFxuICByb2xlOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGxvZ2dlcjogbG9nLkxvZ2dlciA9IGRlZmF1bHRMb2dnZXIsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKGlzQXBwRW52KCkpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJhdXRvcGc6IHNraXAgY2FjaGUgcHJvdmlzaW9uaW5nIChpbnNpZGUgYSBEYXRhYnJpY2tzIEFwcClcIik7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICghcm9sZSkge1xuICAgIGxvZ2dlci53YXJuKFwiYXV0b3BnOiBza2lwIGNhY2hlIHByb3Zpc2lvbmluZyAoY291bGQgbm90IHJlc29sdmUgY29ubmVjdGluZyByb2xlKVwiKTtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gUGFzcyBgdXNlcmAgZXhwbGljaXRseTogYXV0b3BnIHJlc29sdmVzIHRoZSBjb25uZWN0aW9uIHRhcmdldFxuICAvLyAoaG9zdC9kYXRhYmFzZS9lbmRwb2ludCkgYnV0IG5vdCB0aGUgaWRlbnRpdHksIHNvIGBjcmVhdGVMYWtlYmFzZVBvb2xgJ3NcbiAgLy8gc3luY2hyb25vdXMgdXNlcm5hbWUgbG9va3VwIHdvdWxkIG90aGVyd2lzZSB0aHJvdy4gYGdldFdvcmtzcGFjZUNsaWVudCh7fSlgXG4gIC8vIHJldHVybnMgYSBmcmVzaCBkZWZhdWx0LWF1dGggY2xpZW50IC0gbGl0ZXJhbGx5IGBuZXcgV29ya3NwYWNlQ2xpZW50KHt9KWAsXG4gIC8vIGJ1dCBidWlsdCBhZ2FpbnN0IHRoZSBTREsgdmVyc2lvbiBBcHBLaXQncyBgY3JlYXRlTGFrZWJhc2VQb29sYCBleHBlY3RzXG4gIC8vIChpbXBvcnRpbmcgdGhlIFNESyBjbGFzcyBkaXJlY3RseSBoZXJlIHB1bGxzIGEgbmV3ZXIsIHR5cGUtaW5jb21wYXRpYmxlIGNvcHkpLlxuICBjb25zdCBwb29sID0gY3JlYXRlTGFrZWJhc2VQb29sKHtcbiAgICB1c2VyOiByb2xlLFxuICAgIHdvcmtzcGFjZUNsaWVudDogZ2V0V29ya3NwYWNlQ2xpZW50KHt9KSxcbiAgICBjb25uZWN0aW9uVGltZW91dE1pbGxpczogQ09OTkVDVF9USU1FT1VUX01TLFxuICAgIHN0YXRlbWVudF90aW1lb3V0OiBTVEFURU1FTlRfVElNRU9VVF9NUyxcbiAgfSk7XG4gIHRyeSB7XG4gICAgY29uc3QgZm91bmQgPSBhd2FpdCBwb29sLnF1ZXJ5KFxuICAgICAgXCJTRUxFQ1QgMSBGUk9NIGluZm9ybWF0aW9uX3NjaGVtYS5zY2hlbWF0YSBXSEVSRSBzY2hlbWFfbmFtZSA9ICQxXCIsXG4gICAgICBbQ0FDSEVfU0NIRU1BXSxcbiAgICApO1xuICAgIGlmIChmb3VuZC5yb3dDb3VudCA9PT0gMCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiYXV0b3BnOiBza2lwIGNhY2hlIHByb3Zpc2lvbmluZyAoc2NoZW1hIGFic2VudClcIiwgeyBzY2hlbWE6IENBQ0hFX1NDSEVNQSB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzcWwgb2YgY2FjaGVHcmFudFN0YXRlbWVudHMocm9sZSkpIHtcbiAgICAgIGF3YWl0IHBvb2wucXVlcnkoc3FsKTtcbiAgICB9XG4gICAgbG9nZ2VyLmluZm8oXCJhdXRvcGc6IGdyYW50ZWQgY2FjaGUgc2NoZW1hXCIsIHsgc2NoZW1hOiBDQUNIRV9TQ0hFTUEsIHJvbGUgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiYXV0b3BnOiBjYWNoZSBwcm92aXNpb25pbmcgZmFpbGVkIChjb250aW51aW5nKVwiLCB7XG4gICAgICBzY2hlbWE6IENBQ0hFX1NDSEVNQSxcbiAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBwb29sLmVuZCgpLmNhdGNoKCgpID0+IHt9KTtcbiAgfVxufVxuIl19
@@ -0,0 +1 @@
1
+ {"root":["../src/appkit.ts","../src/config.ts","../src/create-app.ts","../src/databricks.ts","../src/lakebase-resolver.ts","../src/pgaddress.ts","../src/plugin.ts","../src/provision.ts","../index.ts"],"version":"5.9.3"}
package/package.json CHANGED
@@ -18,24 +18,28 @@
18
18
  "@databricks/sdk-experimental": "^0.17.0",
19
19
  "yaml": "^2.9.0",
20
20
  "zod": "4.3.6",
21
- "@dbx-tools/core": "0.3.44",
22
- "@dbx-tools/shared-core": "0.3.44"
21
+ "@dbx-tools/core": "0.4.1",
22
+ "@dbx-tools/shared-core": "0.4.1"
23
23
  },
24
- "main": "index.ts",
24
+ "main": "./lib/index.js",
25
25
  "license": "UNLICENSED",
26
26
  "publishConfig": {
27
27
  "access": "public"
28
28
  },
29
- "version": "0.3.44",
30
- "types": "index.ts",
29
+ "version": "0.4.1",
30
+ "types": "./lib/index.d.ts",
31
31
  "type": "module",
32
32
  "exports": {
33
- ".": "./index.ts",
33
+ ".": {
34
+ "types": "./lib/index.d.ts",
35
+ "default": "./lib/index.js"
36
+ },
34
37
  "./package.json": "./package.json"
35
38
  },
36
39
  "files": [
37
40
  "index.ts",
38
- "src"
41
+ "src",
42
+ "lib"
39
43
  ],
40
44
  "peerDependenciesMeta": {
41
45
  "@databricks/appkit": {