@dbx-tools/postgres 0.9.129 → 0.9.132

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,28 +1,30 @@
1
- # `@dbx-tools/postgres`
1
+ # @dbx-tools/postgres
2
2
 
3
- Connection-correct PostgreSQL primitives for Node.js: advisory locks that hold the
4
- connection they lock, and a structured topic bus over `LISTEN`/`NOTIFY`.
5
-
6
- The package provides advisory locks, a typed topic bus, optional message
7
- persistence, sender identity, and connection helpers for Node services.
3
+ Use connection-correct PostgreSQL advisory locks and a structured
4
+ `LISTEN`/`NOTIFY` topic bus from Node.js. The package also provides optional
5
+ message persistence, sender identity, and connection helpers.
8
6
 
9
7
  Both work against a plain `pg.Pool` or anything structurally compatible with one,
10
- including the pool AppKit's Lakebase plugin exports — so a Databricks App gets
8
+ including the pool AppKit's Lakebase plugin exports, so a Databricks App gets
11
9
  them without a second database client or connection pool.
12
10
 
13
- ## Quick Start
11
+ ## Quick start
14
12
 
15
13
  Run protected work on the same PostgreSQL connection that holds the lock:
16
14
 
17
15
  ```ts
18
- import { withAdvisoryLock } from "@dbx-tools/postgres";
16
+ import { postgresConnectionOptions, withAdvisoryLock } from "@dbx-tools/postgres";
17
+ import { Pool } from "pg";
18
+
19
+ const pool = new Pool(postgresConnectionOptions({}));
20
+ const invoiceId = 42;
19
21
 
20
22
  await withAdvisoryLock(pool, ["invoice", invoiceId], async (client) => {
21
23
  await client.query("UPDATE invoices SET status = 'sent' WHERE id = $1", [invoiceId]);
22
24
  });
23
25
  ```
24
26
 
25
- ## Key Features
27
+ ## Capabilities
26
28
 
27
29
  - Converts an arbitrary structured key (string, array, object, `Date`, or an
28
30
  explicit `bigint`) into a stable signed 64-bit advisory-lock identifier.
@@ -39,14 +41,14 @@ await withAdvisoryLock(pool, ["invoice", invoiceId], async (client) => {
39
41
  - Rejects a payload that would not survive a JSON round trip unchanged, at the
40
42
  call site rather than on the wire.
41
43
  - Reconnects a dropped listener with bounded backoff while subscribers remain.
42
- - Optionally PERSISTS every published message to a package-owned table, so a
44
+ - Optionally persists every published message to a package-owned table, so a
43
45
  subscriber that was not listening can replay history by cursor, with a default
44
46
  TTL and cleanup on insert.
45
47
  - Two payload styles: the whole envelope in the notification, or a pointer the
46
- listener reads back — which lifts the 8000-byte `NOTIFY` limit and keeps the
47
- contents behind a table grant.
48
+ listener reads back. The pointer lifts the 8000-byte `NOTIFY` limit and keeps
49
+ the contents behind a table grant.
48
50
 
49
- ## Session Roles
51
+ ## Session roles
50
52
 
51
53
  Set `DBX_TOOLS_POSTGRES_ROLE` when every repository-owned PostgreSQL connection
52
54
  should assume one role after authenticating. `postgresConnectionOptions()` adds
@@ -70,14 +72,14 @@ service-principal and per-user OBO pools. Every login identity that can reach th
70
72
  pool must therefore be a member of the configured role, or otherwise have
71
73
  permission to `SET ROLE`, before the pool can connect successfully.
72
74
 
73
- ## Use With AppKit Lakebase
75
+ ## Use with AppKit Lakebase
74
76
 
75
77
  Use AppKit `lakebase()` to obtain and refresh the PostgreSQL pool. This package
76
78
  does not replace that plugin. Add it when work needs connection-correct advisory
77
79
  locks or cross-instance `LISTEN`/`NOTIFY` delivery, capabilities the native
78
80
  Lakebase plugin does not provide.
79
81
 
80
- ## Advisory Locks
82
+ ## Advisory locks
81
83
 
82
84
  ```ts
83
85
  import { postgresConnectionOptions, withAdvisoryLock } from "@dbx-tools/postgres";
@@ -107,7 +109,7 @@ await withAdvisoryTransactionLock(pool, { schema: "my_feature", version: 1 }, as
107
109
  `identity.advisoryLockId(key)` exposes the same reduction as a JSON-safe decimal
108
110
  string. A `bigint` key is
109
111
  used directly (narrowed to 64 bits) rather than hashed, so a lock can interoperate
110
- with another implementation that publishes its numeric lock id — `pgmq`'s
112
+ with another implementation that publishes its numeric lock id, such as `pgmq`'s
111
113
  installer lock, for instance. Anything else is canonicalized with
112
114
  `object.toStableKey` from `@dbx-tools/shared-core` and hashed, so key order in an
113
115
  object does not matter while a `1` and a `"1"` stay different locks. An array is
@@ -115,7 +117,7 @@ read as several parts, so `["invoice", 7]` and `"invoice_7"` are different locks
115
117
  non-finite number or a cyclic key throws `TypeError` rather than yielding an
116
118
  identity two callers could disagree about.
117
119
 
118
- ## Topic Bus
120
+ ## Topic bus
119
121
 
120
122
  ```ts
121
123
  import { PostgresTopicBus } from "@dbx-tools/postgres";
@@ -139,27 +141,27 @@ await unsubscribe();
139
141
  await bus.close();
140
142
  ```
141
143
 
142
- Every process listening on the channel receives every message; there are no
143
- competing consumers. That makes the bus right for live fan-out — an SSE stream per
144
- browser tab, a cache invalidation, a presence ping — and wrong for work
145
- distribution. Delivery is live-only by default; turn on `persist` (below) when a
144
+ Every process listening on the channel receives every message. There are no
145
+ competing consumers. The bus fits live fan-out such as an SSE stream per browser
146
+ tab, a cache invalidation, or a presence ping. It doesn't distribute work.
147
+ Delivery is live-only by default. Turn on `persist` when a
146
148
  subscriber needs replay, and use a real queue when it needs acks.
147
149
 
148
- ### The Envelope
150
+ ### Message envelope
149
151
 
150
152
  | Field | Source | Notes |
151
153
  | ------------- | ------ | ------------------------------------------------------------------ |
152
154
  | `id` | bus | Unique per message across instances. Use it to dedupe or as `id:`. |
153
155
  | `topic` | bus | The `broadcast` topic. Listeners on other topics never see it. |
154
- | `type` | caller | Event name, e.g. `order.updated`. Required, non-blank. |
156
+ | `type` | caller | Event name, for example `order.updated`. Required, non-blank. |
155
157
  | `metadata` | merged | Automatic context under the caller's. See below. |
156
158
  | `body` | caller | Passed through unchanged. |
157
- | `publishedAt` | bus | ISO-8601, from the publisher's clock — not the database's. |
159
+ | `publishedAt` | bus | ISO-8601, from the publisher's clock, not the database's. |
158
160
 
159
161
  `publishedAt` and `id` are for display and dedupe. Neither orders messages from
160
162
  different instances reliably.
161
163
 
162
- ### Metadata Precedence
164
+ ### Metadata precedence
163
165
 
164
166
  Weakest to strongest: automatic machine context, then AppKit sender identity, then
165
167
  the bus's `metadata` option, then the per-message `metadata`. A key present at a
@@ -174,23 +176,23 @@ Automatic keys, each omitted when it resolves to nothing: `project` (from
174
176
  architecture, runtime name, and runtime version are left out on purpose: IPs and
175
177
  pids are noisy (and often sensitive), the rest are constant per deployment, and
176
178
  every message would pay for them against the payload limit. Pass a `metadata`
177
- function when a process genuinely needs one of those values.
179
+ function when a process needs one of those values.
178
180
 
179
181
  The example above attaches a discovered public IP that way. The function runs on
180
182
  every broadcast, so memoize anything expensive.
181
183
 
182
184
  With the optional `@databricks/appkit` peer installed and a user execution context
183
185
  active, `senderId`, `senderName`, and `senderEmail` are added too. AppKit is
184
- imported lazily and never required; outside a request, or without the package, the
185
- bus just skips those keys.
186
+ imported lazily and never required. Outside a request, or without the package, the
187
+ bus skips those keys.
186
188
 
187
- ### What A Message May Contain
189
+ ### Supported message values
188
190
 
189
191
  The body and metadata must survive `JSON.parse(JSON.stringify(x))` unchanged, which
190
192
  is stricter than `JSON.stringify` not throwing. A `Date` becomes a string, `NaN`
191
- and `Infinity` become `null`, a `Map` becomes `{}`, and `undefined` vanishes — each
192
- reaches the listener as something other than what was sent, so all of them throw
193
- `TypeError` at the call instead. Cycles, functions, symbols, bigints, and class
193
+ and `Infinity` become `null`, a `Map` becomes `{}`, and `undefined` vanishes.
194
+ Each reaches the listener as something other than what was sent, so all of them
195
+ throw `TypeError` at the call instead. Cycles, functions, symbols, bigints, and class
194
196
  instances are rejected for the same reason.
195
197
 
196
198
  The rule lives in `@dbx-tools/shared-core` as `object.isSerializableValue` and
@@ -202,16 +204,16 @@ The encoded envelope is capped at 7900 bytes, under PostgreSQL's 8000-byte
202
204
  `NOTIFY` limit, and a larger one throws `RangeError`. Automatic metadata counts
203
205
  against that, so broadcast a reference and let the receiver fetch anything big.
204
206
 
205
- ### Connections, Lifecycle, And Failure
207
+ ### Connections, lifecycle, and failure
206
208
 
207
209
  Publishing borrows a pooled connection per call. Listening cannot: `LISTEN` is
208
- session state, so the bus checks out ONE dedicated client and keeps it for as long
210
+ session state, so the bus checks out one dedicated client and keeps it for as long
209
211
  as it has subscribers, however many topics and listeners are registered. Size the
210
212
  pool with that long-lived checkout in mind.
211
213
 
212
214
  Nothing connects until the first `listen`, or an explicit `start()` when you would
213
215
  rather find out about a connection problem at boot. `close()` releases the client
214
- and is required — register it with the host's shutdown hook. A closed bus stays
216
+ and is required. Register it with the host's shutdown hook. A closed bus stays
215
217
  closed and throws instead of silently reconnecting.
216
218
 
217
219
  When the notification connection drops, the bus reconnects on its own: immediately
@@ -219,15 +221,15 @@ first, then doubling from 250ms to a 5s ceiling, indefinitely, for as long as
219
221
  subscribers remain. A Postgres restart or a rotated Lakebase credential recovers
220
222
  without intervention. Messages published during the gap are lost. Every failed
221
223
  attempt, every dropped connection, and every listener that throws is reported
222
- through `onError`, which defaults to swallowing them — wire it to a logger in
224
+ through `onError`, which defaults to swallowing them. Configure a logger in
223
225
  anything long-running. A failing listener never affects the publisher or the other
224
226
  listeners.
225
227
 
226
- One channel carries many topics, so adding a topic costs nothing; give a genuinely
227
- high-volume unrelated stream its own channel instead, since every listening
228
+ One channel carries many topics, so adding a topic costs nothing. Give an
229
+ unrelated high-volume stream its own channel because every listening
228
230
  session decodes every message on the channel.
229
231
 
230
- ### Replay With `persist`
232
+ ### Replay with `persist`
231
233
 
232
234
  `NOTIFY` has no replay: a process that was not listening never learns what it
233
235
  missed. Set `persist` and each published message is INSERTed in the same
@@ -246,13 +248,13 @@ do {
246
248
  } while (cursor);
247
249
  ```
248
250
 
249
- The row and the notification COMMIT together, which is the property the whole
251
+ The row and the notification commit together, which is the property the whole
250
252
  design rests on: `NOTIFY` is delivered at commit rather than at statement time, so
251
253
  a listener can never be told about a row it cannot yet read.
252
254
 
253
255
  | Option | Default | Behavior |
254
256
  | ------------------ | ----------------- | -------------------------------------------------------------- |
255
- | `schema` | `dbx_message_bus` | Schema used for message persistence. |
257
+ | `schema` | `dbx_message_bus` | Schema used for message persistence. |
256
258
  | `scope` | `open` | Which tier's table publishes and history read by default. |
257
259
  | `tables` | `*_messages` | Override a tier's table name for a managed installation. |
258
260
  | `ttl` | `24 hours` | Per-message expiry. `false` keeps messages until deleted. |
@@ -261,44 +263,44 @@ a listener can never be told about a row it cannot yet read.
261
263
  | `provision` | `true` | Create the schema, tables, and indexes on first persisted use. |
262
264
 
263
265
  Messages EXPIRE by default. A 24-hour TTL is the default precisely because an
264
- unbounded message table is the failure this feature would otherwise introduce;
265
- expired rows are deleted in bounded batches on each persisted publish, and
266
+ unbounded message table is the failure this feature would otherwise introduce.
267
+ Expired rows are deleted in bounded batches on each persisted publish, and
266
268
  `cleanupExpired()` runs the same sweep on demand. `ttl: false` opts one bus (or
267
- `{ ttl: false }` on a single `broadcast`) out of expiry — it is available, but it
268
- is not the default.
269
+ `{ ttl: false }` on a single `broadcast`) out of expiry. It is available but
270
+ isn't the default.
269
271
 
270
272
  Two tiers, `open` and `restricted`, exist so one channel can carry messages with
271
273
  different read audiences: they are separate tables, so a role granted the open
272
274
  table cannot read restricted history. `messageBusGrantStatements(roles, scope,
273
275
  options)` emits exactly the grants a tier needs, and a `history` cursor is bound
274
- to the tier it came from — resuming an open page against the restricted table
275
- throws rather than silently returning someone else's rows. Publish to a tier
276
+ to the tier it came from. Resuming an open page against the restricted table
277
+ throws instead of returning someone else's rows. Publish to a tier
276
278
  per-message with `broadcast(topic, { scope: "restricted", ... })`.
277
279
 
278
- Set `provision: false` when a migration owns the schema; the statements are
280
+ Set `provision: false` when a migration owns the schema. The statements are
279
281
  otherwise applied once, under an advisory transaction lock, so concurrent
280
282
  instances installing at boot do not race.
281
283
 
282
- ### Envelope Or Pointer
284
+ ### Envelope or pointer
283
285
 
284
286
  `payload: "envelope"` (the default) puts the whole message in the notification.
285
287
  One round trip, no read amplification, bounded by PostgreSQL's payload limit.
286
288
 
287
- `payload: "pointer"` notifies with routing and identity only — `{ v, scope, topic,
288
- id, sequence }` — and the listener reads the envelope back. That lifts the size
289
+ `payload: "pointer"` notifies with routing and identity only
290
+ (`{ v, scope, topic, id, sequence }`), and the listener reads the envelope back. That lifts the size
289
291
  limit entirely (a body larger than 7900 bytes is only publishable this way) and
290
292
  means a subscriber without the tier's table grant learns that something happened
291
293
  without learning what. The cost is one read per notification. Listeners receive
292
- the same `TopicMessage` either way; the difference is invisible above `listen`.
294
+ the same `TopicMessage` either way. The difference is invisible above `listen`.
293
295
 
294
296
  A pointer whose row is already gone (TTL cleanup won the race) or unreadable
295
- delivers nothing rather than raising — expected on the restricted tier. Use
297
+ delivers nothing instead of raising, which is expected on the restricted tier. Use
296
298
  `decodePointer` if a non-bus consumer needs to read the raw notification.
297
299
 
298
- ### Naming A Channel
300
+ ### Name a channel
299
301
 
300
- `channel` takes whatever identifies the channel, not a pre-sanitized identifier —
301
- a name, a tenant id, a `[env, feature]` pair, a config object. One value or many:
302
+ `channel` takes whatever identifies the channel, not a pre-sanitized identifier:
303
+ a name, a tenant id, a `[env, feature]` pair, or a config object. One value or many:
302
304
  an array is read as several parts, anything else as one.
303
305
 
304
306
  ```ts
@@ -313,31 +315,31 @@ form (`object.toStableKey`) is appended. The hash is what makes the mapping
313
315
  trustworthy: tokenizing alone is lossy, so `my-app`, `my_app`, and `myApp` would
314
316
  collapse onto one channel, and a name long enough to hit Postgres's 63-character
315
317
  limit would collide with anything sharing its leading tokens. With the suffix the
316
- readable part stays readable and distinct inputs stay distinct — including
318
+ readable part stays readable and distinct inputs stay distinct, including
317
319
  `["billing", "prod"]` versus `"billing_prod"`, which differ in structure.
318
320
 
319
321
  Derivation is deterministic across processes and runs, so every participant that
320
322
  passes equivalent parts lands on the same channel without coordinating. Object key
321
- order does not matter; a different spelling does. Read `bus.channelName` to see
323
+ order does not matter. A different spelling does. Read `bus.channelName` to see
322
324
  what a set of parts resolved to, or to confirm two processes agree. Defaults to a
323
325
  shared `dbx_tools_topic_bus` channel.
324
326
 
325
327
  `identity.channelName(parts)` exposes the derivation without constructing a bus,
326
328
  which is useful for configuration checks and cross-runtime contract tests.
327
329
 
328
- ## Connection Lifecycles
330
+ ## Connection lifecycles
329
331
 
330
- Advisory locks are connection-scoped, and that is easy to get wrong invisibly:
332
+ Advisory locks are connection-scoped, and incorrect pool use can fail invisibly:
331
333
  taking the lock with `pool.query()` and doing the protected work with another
332
334
  `pool.query()` can use two different connections, so the lock protects nothing and
333
335
  the code looks correct. The same applies to `LISTEN`, which is session state a
334
336
  pooled query cannot hold. These helpers keep both lifecycles on dedicated
335
337
  connections and depend only on `pg`.
336
338
 
337
- AppKit supplies the Lakebase pool; these helpers add locks and cross-instance
339
+ AppKit supplies the Lakebase pool. These helpers add locks and cross-instance
338
340
  message delivery on top of it.
339
341
 
340
- ## Module Map
342
+ ## Module map
341
343
 
342
344
  | Module | Purpose |
343
345
  | -------------- | ---------------------------------------------------------------------- |
package/index.ts CHANGED
@@ -3,7 +3,7 @@
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
 
5
5
  export const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
6
- export const PACKAGE_VERSION = "0.9.129";
6
+ export const PACKAGE_VERSION = "0.9.132";
7
7
  export * as advisoryLock from "./src/advisory-lock.ts";
8
8
  export * as bindings from "./src/bindings.ts";
9
9
  export * as identity from "./src/identity.ts";
package/lib/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export declare const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
2
- export declare const PACKAGE_VERSION = "0.9.129";
2
+ export declare const PACKAGE_VERSION = "0.9.132";
3
3
  export * as advisoryLock from "./src/advisory-lock.ts";
4
4
  export * as bindings from "./src/bindings.ts";
5
5
  export * as identity from "./src/identity.ts";
package/lib/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  // Regenerated from the exporting modules in ./src.
3
3
  // Hand edits are overwritten on the next watch; this file is read-only.
4
4
  export const PACKAGE_IDENTIFIER = "@dbx-tools/postgres";
5
- export const PACKAGE_VERSION = "0.9.129";
5
+ export const PACKAGE_VERSION = "0.9.132";
6
6
  export * as advisoryLock from "./src/advisory-lock.js";
7
7
  export * as bindings from "./src/bindings.js";
8
8
  export * as identity from "./src/identity.js";
@@ -12,4 +12,4 @@ export * as topicBus from "./src/topic-bus.js";
12
12
  export { POINTER_VERSION } from "./src/persistence.js";
13
13
  export { PostgresTopicBus } from "./src/topic-bus.js";
14
14
  export * from "./exports.js";
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvcG9zdGdyZXNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xMjlcIjtcbmV4cG9ydCAqIGFzIGFkdmlzb3J5TG9jayBmcm9tIFwiLi9zcmMvYWR2aXNvcnktbG9jay50c1wiO1xuZXhwb3J0ICogYXMgYmluZGluZ3MgZnJvbSBcIi4vc3JjL2JpbmRpbmdzLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIHBlcnNpc3RlbmNlIGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuZXhwb3J0ICogYXMgc2Vzc2lvbiBmcm9tIFwiLi9zcmMvc2Vzc2lvbi50c1wiO1xuZXhwb3J0ICogYXMgdG9waWNCdXMgZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBZHZpc29yeUxvY2tLZXksIFBnUG9vbExpa2UsIFBnUXVlcnlhYmxlIH0gZnJvbSBcIi4vc3JjL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmV4cG9ydCB7IFBPSU5URVJfVkVSU0lPTiB9IGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBEdXJhdGlvbklucHV0LCBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3BlcnNpc3RlbmNlLnRzXCI7XG5leHBvcnQgeyBQb3N0Z3Jlc1RvcGljQnVzIH0gZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb3BpY01ldGFkYXRhLCBUb3BpY01lc3NhZ2UsIFRvcGljUHVibGlzaElucHV0LCBUb3BpY0xpc3RlbmVyLCBUb3BpY01ldGFkYXRhUHJvdmlkZXIsIFBvc3RncmVzVG9waWNCdXNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhwb3J0cy50c1wiO1xuIl19
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQztBQUN4RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssUUFBUSxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sS0FBSyxXQUFXLE1BQU0sc0JBQXNCLENBQUM7QUFDcEQsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUV2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUV0RCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdFTkVSQVRFRCBieSBwcm9qZW4gd2F0Y2ggLSBETyBOT1QgRURJVC5cbi8vIFJlZ2VuZXJhdGVkIGZyb20gdGhlIGV4cG9ydGluZyBtb2R1bGVzIGluIC4vc3JjLlxuLy8gSGFuZCBlZGl0cyBhcmUgb3ZlcndyaXR0ZW4gb24gdGhlIG5leHQgd2F0Y2g7IHRoaXMgZmlsZSBpcyByZWFkLW9ubHkuXG5cbmV4cG9ydCBjb25zdCBQQUNLQUdFX0lERU5USUZJRVIgPSBcIkBkYngtdG9vbHMvcG9zdGdyZXNcIjtcbmV4cG9ydCBjb25zdCBQQUNLQUdFX1ZFUlNJT04gPSBcIjAuOS4xMzJcIjtcbmV4cG9ydCAqIGFzIGFkdmlzb3J5TG9jayBmcm9tIFwiLi9zcmMvYWR2aXNvcnktbG9jay50c1wiO1xuZXhwb3J0ICogYXMgYmluZGluZ3MgZnJvbSBcIi4vc3JjL2JpbmRpbmdzLnRzXCI7XG5leHBvcnQgKiBhcyBpZGVudGl0eSBmcm9tIFwiLi9zcmMvaWRlbnRpdHkudHNcIjtcbmV4cG9ydCAqIGFzIHBlcnNpc3RlbmNlIGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuZXhwb3J0ICogYXMgc2Vzc2lvbiBmcm9tIFwiLi9zcmMvc2Vzc2lvbi50c1wiO1xuZXhwb3J0ICogYXMgdG9waWNCdXMgZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBBZHZpc29yeUxvY2tLZXksIFBnUG9vbExpa2UsIFBnUXVlcnlhYmxlIH0gZnJvbSBcIi4vc3JjL2Fkdmlzb3J5LWxvY2sudHNcIjtcbmV4cG9ydCB7IFBPSU5URVJfVkVSU0lPTiB9IGZyb20gXCIuL3NyYy9wZXJzaXN0ZW5jZS50c1wiO1xuZXhwb3J0IHR5cGUgeyBEdXJhdGlvbklucHV0LCBSZXNvbHZlZFRvcGljQnVzUGVyc2lzdGVuY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3BlcnNpc3RlbmNlLnRzXCI7XG5leHBvcnQgeyBQb3N0Z3Jlc1RvcGljQnVzIH0gZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0IHR5cGUgeyBUb3BpY01ldGFkYXRhLCBUb3BpY01lc3NhZ2UsIFRvcGljUHVibGlzaElucHV0LCBUb3BpY0xpc3RlbmVyLCBUb3BpY01ldGFkYXRhUHJvdmlkZXIsIFBvc3RncmVzVG9waWNCdXNPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3RvcGljLWJ1cy50c1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZXhwb3J0cy50c1wiO1xuIl19
package/package.json CHANGED
@@ -28,8 +28,8 @@
28
28
  "@databricks/appkit": "0.81.0"
29
29
  },
30
30
  "dependencies": {
31
- "@dbx-tools/lakebase": "^0.9.129",
32
- "@dbx-tools/shared-core": "^0.9.129",
31
+ "@dbx-tools/lakebase": "^0.9.132",
32
+ "@dbx-tools/shared-core": "^0.9.132",
33
33
  "pg": "^8.22.0"
34
34
  },
35
35
  "main": "./lib/index.js",
@@ -74,7 +74,7 @@
74
74
  "./package.json": "./package.json"
75
75
  }
76
76
  },
77
- "version": "0.9.129",
77
+ "version": "0.9.132",
78
78
  "types": "./lib/index.d.ts",
79
79
  "dbxToolsConfig": {
80
80
  "tags": [