@rudderjs/database 1.1.0 → 1.2.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.
Files changed (126) hide show
  1. package/README.md +70 -0
  2. package/dist/db.d.ts +21 -3
  3. package/dist/db.d.ts.map +1 -1
  4. package/dist/db.js +27 -5
  5. package/dist/db.js.map +1 -1
  6. package/dist/index.d.ts +14 -2
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +23 -4
  9. package/dist/index.js.map +1 -1
  10. package/dist/native/adapter.d.ts +202 -0
  11. package/dist/native/adapter.d.ts.map +1 -0
  12. package/dist/native/adapter.js +440 -0
  13. package/dist/native/adapter.js.map +1 -0
  14. package/dist/native/compiler.d.ts +371 -0
  15. package/dist/native/compiler.d.ts.map +1 -0
  16. package/dist/native/compiler.js +978 -0
  17. package/dist/native/compiler.js.map +1 -0
  18. package/dist/native/dialect-mysql.d.ts +26 -0
  19. package/dist/native/dialect-mysql.d.ts.map +1 -0
  20. package/dist/native/dialect-mysql.js +188 -0
  21. package/dist/native/dialect-mysql.js.map +1 -0
  22. package/dist/native/dialect-pg.d.ts +26 -0
  23. package/dist/native/dialect-pg.d.ts.map +1 -0
  24. package/dist/native/dialect-pg.js +192 -0
  25. package/dist/native/dialect-pg.js.map +1 -0
  26. package/dist/native/dialect.d.ts +255 -0
  27. package/dist/native/dialect.d.ts.map +1 -0
  28. package/dist/native/dialect.js +237 -0
  29. package/dist/native/dialect.js.map +1 -0
  30. package/dist/native/driver.d.ts +37 -0
  31. package/dist/native/driver.d.ts.map +1 -0
  32. package/dist/native/driver.js +19 -0
  33. package/dist/native/driver.js.map +1 -0
  34. package/dist/native/drivers/better-sqlite3.d.ts +56 -0
  35. package/dist/native/drivers/better-sqlite3.d.ts.map +1 -0
  36. package/dist/native/drivers/better-sqlite3.js +171 -0
  37. package/dist/native/drivers/better-sqlite3.js.map +1 -0
  38. package/dist/native/drivers/mysql.d.ts +30 -0
  39. package/dist/native/drivers/mysql.d.ts.map +1 -0
  40. package/dist/native/drivers/mysql.js +176 -0
  41. package/dist/native/drivers/mysql.js.map +1 -0
  42. package/dist/native/drivers/postgres.d.ts +57 -0
  43. package/dist/native/drivers/postgres.d.ts.map +1 -0
  44. package/dist/native/drivers/postgres.js +155 -0
  45. package/dist/native/drivers/postgres.js.map +1 -0
  46. package/dist/native/errors.d.ts +43 -0
  47. package/dist/native/errors.d.ts.map +1 -0
  48. package/dist/native/errors.js +64 -0
  49. package/dist/native/errors.js.map +1 -0
  50. package/dist/native/index.d.ts +27 -0
  51. package/dist/native/index.d.ts.map +1 -0
  52. package/dist/native/index.js +55 -0
  53. package/dist/native/index.js.map +1 -0
  54. package/dist/native/isolation.d.ts +14 -0
  55. package/dist/native/isolation.d.ts.map +1 -0
  56. package/dist/native/isolation.js +37 -0
  57. package/dist/native/isolation.js.map +1 -0
  58. package/dist/native/query-builder.d.ts +303 -0
  59. package/dist/native/query-builder.d.ts.map +1 -0
  60. package/dist/native/query-builder.js +984 -0
  61. package/dist/native/query-builder.js.map +1 -0
  62. package/dist/native/replica-picker.d.ts +22 -0
  63. package/dist/native/replica-picker.d.ts.map +1 -0
  64. package/dist/native/replica-picker.js +65 -0
  65. package/dist/native/replica-picker.js.map +1 -0
  66. package/dist/native/schema/alter-blueprint.d.ts +37 -0
  67. package/dist/native/schema/alter-blueprint.d.ts.map +1 -0
  68. package/dist/native/schema/alter-blueprint.js +56 -0
  69. package/dist/native/schema/alter-blueprint.js.map +1 -0
  70. package/dist/native/schema/blueprint.d.ts +151 -0
  71. package/dist/native/schema/blueprint.d.ts.map +1 -0
  72. package/dist/native/schema/blueprint.js +286 -0
  73. package/dist/native/schema/blueprint.js.map +1 -0
  74. package/dist/native/schema/column.d.ts +168 -0
  75. package/dist/native/schema/column.d.ts.map +1 -0
  76. package/dist/native/schema/column.js +190 -0
  77. package/dist/native/schema/column.js.map +1 -0
  78. package/dist/native/schema/ddl-compiler.d.ts +34 -0
  79. package/dist/native/schema/ddl-compiler.d.ts.map +1 -0
  80. package/dist/native/schema/ddl-compiler.js +352 -0
  81. package/dist/native/schema/ddl-compiler.js.map +1 -0
  82. package/dist/native/schema/inspect.d.ts +67 -0
  83. package/dist/native/schema/inspect.d.ts.map +1 -0
  84. package/dist/native/schema/inspect.js +312 -0
  85. package/dist/native/schema/inspect.js.map +1 -0
  86. package/dist/native/schema/introspect.d.ts +34 -0
  87. package/dist/native/schema/introspect.d.ts.map +1 -0
  88. package/dist/native/schema/introspect.js +101 -0
  89. package/dist/native/schema/introspect.js.map +1 -0
  90. package/dist/native/schema/migration.d.ts +8 -0
  91. package/dist/native/schema/migration.d.ts.map +1 -0
  92. package/dist/native/schema/migration.js +19 -0
  93. package/dist/native/schema/migration.js.map +1 -0
  94. package/dist/native/schema/migrator.d.ts +144 -0
  95. package/dist/native/schema/migrator.d.ts.map +1 -0
  96. package/dist/native/schema/migrator.js +240 -0
  97. package/dist/native/schema/migrator.js.map +1 -0
  98. package/dist/native/schema/rebuild.d.ts +11 -0
  99. package/dist/native/schema/rebuild.d.ts.map +1 -0
  100. package/dist/native/schema/rebuild.js +92 -0
  101. package/dist/native/schema/rebuild.js.map +1 -0
  102. package/dist/native/schema/schema-builder.d.ts +46 -0
  103. package/dist/native/schema/schema-builder.d.ts.map +1 -0
  104. package/dist/native/schema/schema-builder.js +153 -0
  105. package/dist/native/schema/schema-builder.js.map +1 -0
  106. package/dist/native/schema/schema-facade.d.ts +63 -0
  107. package/dist/native/schema/schema-facade.d.ts.map +1 -0
  108. package/dist/native/schema/schema-facade.js +124 -0
  109. package/dist/native/schema/schema-facade.js.map +1 -0
  110. package/dist/native/schema/schema-types.d.ts +27 -0
  111. package/dist/native/schema/schema-types.d.ts.map +1 -0
  112. package/dist/native/schema/schema-types.js +52 -0
  113. package/dist/native/schema/schema-types.js.map +1 -0
  114. package/dist/native/schema/types-generator.d.ts +73 -0
  115. package/dist/native/schema/types-generator.d.ts.map +1 -0
  116. package/dist/native/schema/types-generator.js +181 -0
  117. package/dist/native/schema/types-generator.js.map +1 -0
  118. package/dist/registry-bridge.d.ts +24 -4
  119. package/dist/registry-bridge.d.ts.map +1 -1
  120. package/dist/registry-bridge.js +20 -0
  121. package/dist/registry-bridge.js.map +1 -1
  122. package/dist/sticky.d.ts +22 -0
  123. package/dist/sticky.d.ts.map +1 -0
  124. package/dist/sticky.js +61 -0
  125. package/dist/sticky.js.map +1 -0
  126. package/package.json +32 -2
@@ -0,0 +1,440 @@
1
+ // ─── NativeAdapter ─────────────────────────────────────────
2
+ //
3
+ // Node-only. Wires a {@link Driver} + {@link Dialect} into the `OrmAdapter`
4
+ // contract so `@rudderjs/orm` Models route through hand-built SQL instead of
5
+ // Prisma/Drizzle. Phase 1 = SQLite read path.
6
+ //
7
+ // Mirrors orm-drizzle's lifecycle: a `make()` factory does the (lazy) driver
8
+ // load, and a dev-HMR client cache on `globalThis` (keyed by `driver::url`)
9
+ // reuses one live connection across Vite re-boots, disposing the superseded
10
+ // one on a signature change — so a `config/database.ts` edit doesn't leak a
11
+ // connection per re-boot. No-op in production (single boot).
12
+ import { SqliteDialect } from './dialect.js';
13
+ import { PgDialect } from './dialect-pg.js';
14
+ import { MysqlDialect } from './dialect-mysql.js';
15
+ import { markWrote, stickyWrote } from '../sticky.js';
16
+ import { makeReplicaPicker } from './replica-picker.js';
17
+ import { NativeQueryBuilder } from './query-builder.js';
18
+ import { BetterSqlite3Driver } from './drivers/better-sqlite3.js';
19
+ import { PostgresDriver } from './drivers/postgres.js';
20
+ import { MysqlDriver } from './drivers/mysql.js';
21
+ import { SchemaBuilder } from './schema/schema-builder.js';
22
+ const NATIVE_CLIENT_CACHE_KEY = '__rudderjs_native_client__';
23
+ function nativeClientCache() {
24
+ const g = globalThis;
25
+ let cache = g[NATIVE_CLIENT_CACHE_KEY];
26
+ if (!(cache instanceof Map)) {
27
+ const map = new Map();
28
+ // Pre-map single-entry shape from an older bundle of this module (dev
29
+ // re-boot across a version edit) — keep the live driver, keyed by its
30
+ // signature so an unnamed lookup still reuses it.
31
+ const legacy = cache;
32
+ if (legacy && typeof legacy.signature === 'string') {
33
+ map.set(legacy.signature, { ...legacy, readDrivers: legacy.readDrivers ?? [] });
34
+ }
35
+ g[NATIVE_CLIENT_CACHE_KEY] = map;
36
+ cache = map;
37
+ }
38
+ return cache;
39
+ }
40
+ function reusableNativeClient(cacheKey, signature) {
41
+ const cache = nativeClientCache();
42
+ const cached = cache.get(cacheKey);
43
+ if (!cached)
44
+ return undefined;
45
+ if (cached.signature === signature) {
46
+ return { driver: cached.driver, readDrivers: cached.readDrivers, dialect: cached.dialect };
47
+ }
48
+ // Signature changed for this connection (e.g. a config edit) — dispose the
49
+ // superseded drivers (write + replicas), fire-and-forget, so their
50
+ // connections are released.
51
+ void Promise.resolve()
52
+ .then(() => Promise.all([cached.driver, ...cached.readDrivers].map((d) => d.close())))
53
+ .catch(() => { });
54
+ cache.delete(cacheKey);
55
+ return undefined;
56
+ }
57
+ function cacheNativeClient(cacheKey, entry) {
58
+ nativeClientCache().set(cacheKey, entry);
59
+ }
60
+ /**
61
+ * Wrap an {@link Executor} so every `execute` / `affectingExecute` call is timed
62
+ * with `performance.now()` and reported to the registered query listeners. The
63
+ * emit is best-effort: a throwing listener is swallowed (a broken Telescope
64
+ * collector must never fail the query), and only *successful* executions are
65
+ * reported (Laravel parity — `QueryExecuted` doesn't fire on a query error).
66
+ * `affectingExecute` is forwarded only when the underlying driver implements it,
67
+ * so capability checks (`typeof ex.affectingExecute === 'function'`) still hold.
68
+ */
69
+ function instrumentExecutor(exec, listeners, connection,
70
+ /** Read/write-split side tag for query events. Only set when the connection
71
+ * is configured with read replicas — single-connection events carry none. */
72
+ target) {
73
+ const emit = (sql, bindings, startedAt) => {
74
+ if (listeners.length === 0)
75
+ return;
76
+ const duration = performance.now() - startedAt;
77
+ // Snapshot so a listener registering/removing listeners mid-emit is safe.
78
+ for (const listener of [...listeners]) {
79
+ try {
80
+ listener({ sql, bindings: [...bindings], duration, connection, target });
81
+ }
82
+ catch {
83
+ // Listener errors must never break the query.
84
+ }
85
+ }
86
+ };
87
+ const wrapped = {
88
+ async execute(sql, bindings) {
89
+ const startedAt = performance.now();
90
+ const rows = await exec.execute(sql, bindings);
91
+ emit(sql, bindings, startedAt);
92
+ return rows;
93
+ },
94
+ };
95
+ const affecting = exec;
96
+ if (typeof affecting.affectingExecute === 'function') {
97
+ const affectingExecute = affecting.affectingExecute.bind(exec);
98
+ wrapped.affectingExecute = async (sql, bindings) => {
99
+ const startedAt = performance.now();
100
+ const result = await affectingExecute(sql, bindings);
101
+ emit(sql, bindings, startedAt);
102
+ return result;
103
+ };
104
+ }
105
+ return wrapped;
106
+ }
107
+ /**
108
+ * Wrap an executor so every statement records a sticky write for `connection`
109
+ * (see `../sticky.js`). Applied to the WRITE side of a split connection only —
110
+ * statements through it are writes, DDL, locked selects, or sticky-routed
111
+ * reads; marking the last two is a harmless over-approximation (conservative
112
+ * direction: more reads on the primary). Marks BEFORE executing so a
113
+ * concurrent read issued while the write is in flight already routes sticky.
114
+ */
115
+ function markWritesExecutor(exec, connection) {
116
+ const marked = {
117
+ async execute(sql, bindings) {
118
+ markWrote(connection);
119
+ return exec.execute(sql, bindings);
120
+ },
121
+ };
122
+ const affecting = exec;
123
+ if (typeof affecting.affectingExecute === 'function') {
124
+ const affectingExecute = affecting.affectingExecute.bind(exec);
125
+ marked.affectingExecute = async (sql, bindings) => {
126
+ markWrote(connection);
127
+ return affectingExecute(sql, bindings);
128
+ };
129
+ }
130
+ return marked;
131
+ }
132
+ export class NativeAdapter {
133
+ scope;
134
+ dialect;
135
+ primaryKey;
136
+ driver;
137
+ listeners;
138
+ connection;
139
+ readDrivers;
140
+ sticky;
141
+ /** Where queries run — the top-level connection, or a transaction scope,
142
+ * wrapped with query-listener instrumentation (see {@link instrumentExecutor}). */
143
+ executor;
144
+ /** Read-executor picker — set only on a split connection (`readUrls`).
145
+ * Strategy from `readPicker` (round-robin default). Returns the write
146
+ * executor on a sticky hit. The QB calls it per read terminal; locked
147
+ * selects bypass it (see `_readExecutor`). */
148
+ readPick;
149
+ constructor(
150
+ /** The raw connection / transaction scope queries run on (pre-instrumentation). */
151
+ executor,
152
+ /** Where a (nested) transaction is opened. Top-level: the {@link Driver};
153
+ * scoped: the active {@link Transaction} (so nesting → SAVEPOINT). */
154
+ scope, dialect, primaryKey,
155
+ /** The owned connection — present only on the top-level adapter, `null` on
156
+ * a transaction-scoped one (it must not close the shared connection). */
157
+ driver,
158
+ /** Query listeners (`onQuery` / `DB.listen`). Shared BY REFERENCE with every
159
+ * transaction-scoped adapter spawned from this one, so a listener registered
160
+ * on the top-level adapter also sees queries run inside `transaction()`. */
161
+ listeners = [],
162
+ /** Connection name reported on query events — the `config/database.ts`
163
+ * connection name when the provider passed one, else the driver name
164
+ * (`'sqlite'` / `'pg'` / `'mysql'`); `undefined` for a caller-supplied
165
+ * {@link NativeConfig.driverInstance}. */
166
+ connection = undefined,
167
+ /** Read-replica drivers (read/write split). Owned by the top-level adapter
168
+ * (closed by `disconnect()`); always empty on a transaction-scoped one. */
169
+ readDrivers = [],
170
+ /** Sticky reads enabled for this connection (only meaningful with a split). */
171
+ sticky = false,
172
+ /** Replica-selection strategy for the read pool (round-robin when omitted);
173
+ * see {@link ReadReplicaPicker}. Only meaningful with read drivers. */
174
+ readPicker = undefined,
175
+ /** Inherited split participation for transaction-scoped adapters: a tx
176
+ * spawned from a split adapter has no read drivers of its own but still
177
+ * tags its events `'write'` and marks sticky writes. */
178
+ inheritedSplitTag = undefined) {
179
+ this.scope = scope;
180
+ this.dialect = dialect;
181
+ this.primaryKey = primaryKey;
182
+ this.driver = driver;
183
+ this.listeners = listeners;
184
+ this.connection = connection;
185
+ this.readDrivers = readDrivers;
186
+ this.sticky = sticky;
187
+ const split = readDrivers.length > 0;
188
+ this.splitTag = split ? 'write' : inheritedSplitTag;
189
+ // Sticky marking wraps the WRITE side only, and only when this connection
190
+ // participates in a split (directly or via its spawning adapter).
191
+ const base = sticky && this.splitTag === 'write' && connection !== undefined
192
+ ? markWritesExecutor(executor, connection)
193
+ : executor;
194
+ this.executor = instrumentExecutor(base, listeners, connection, this.splitTag);
195
+ if (split && connection !== undefined) {
196
+ const readExecs = readDrivers.map((d) => instrumentExecutor(d, listeners, connection, 'read'));
197
+ // Builds the per-query index picker — weight lists validate here, so a
198
+ // bad config fails at adapter construction, not on the first read.
199
+ const pick = makeReplicaPicker(readPicker, readExecs.length);
200
+ this.readPick = () => {
201
+ if (this.sticky && stickyWrote(connection))
202
+ return this.executor;
203
+ return readExecs[pick()] ?? this.executor;
204
+ };
205
+ }
206
+ else {
207
+ this.readPick = null;
208
+ }
209
+ }
210
+ /** `'write'` when this adapter participates in a read/write split (directly
211
+ * or as a transaction scope spawned from one) — the query-event tag. */
212
+ splitTag;
213
+ /** Direct relations (`hasOne`/`hasMany`/`belongsTo`/`belongsToMany`) resolve
214
+ * in the ORM's Model layer — one batched `WHERE … IN` per relation, stitched
215
+ * onto the parents (same machinery as Drizzle and the polymorphic loader).
216
+ * The native QB's own `with()` stays a warn-only no-op: the adapter contract
217
+ * passes relation NAMES only, with no join shape to compile from. */
218
+ eagerLoadStrategy = 'model-layer';
219
+ /** Build a `NativeAdapter`, opening the configured driver (lazy import). */
220
+ static async make(config = {}) {
221
+ const primaryKey = config.primaryKey ?? 'id';
222
+ // Caller-supplied driver: no caching, they own the lifecycle. No built-in
223
+ // driver name to report on query events.
224
+ if (config.driverInstance) {
225
+ return NativeAdapter._topLevel(config.driverInstance, config.dialect ?? new SqliteDialect(), primaryKey, undefined);
226
+ }
227
+ const driverName = config.driver ?? 'sqlite';
228
+ const url = config.url ??
229
+ (typeof process !== 'undefined' ? process.env?.['DATABASE_URL'] : undefined) ??
230
+ ':memory:';
231
+ const readUrls = config.readUrls ?? [];
232
+ const sticky = config.sticky ?? false;
233
+ // Replica list is part of the signature so a replica edit disposes/reopens
234
+ // just this connection. The no-replica form stays byte-identical to before.
235
+ const signature = readUrls.length > 0
236
+ ? `${driverName}::${url}::${readUrls.join(',')}`
237
+ : `${driverName}::${url}`;
238
+ const cacheKey = config.connectionName ?? signature;
239
+ const connection = config.connectionName ?? driverName;
240
+ const reused = reusableNativeClient(cacheKey, signature);
241
+ if (reused) {
242
+ return NativeAdapter._topLevel(reused.driver, reused.dialect, primaryKey, connection, reused.readDrivers, sticky, config.readPicker);
243
+ }
244
+ const { driver, dialect } = await openDriver(driverName, url);
245
+ const readDrivers = [];
246
+ for (const readUrl of readUrls) {
247
+ readDrivers.push((await openDriver(driverName, readUrl)).driver);
248
+ }
249
+ cacheNativeClient(cacheKey, { signature, driver, readDrivers, dialect });
250
+ return NativeAdapter._topLevel(driver, dialect, primaryKey, connection, readDrivers, sticky, config.readPicker);
251
+ }
252
+ /** The adapter that owns the connection — queries and transactions both run
253
+ * on `driver`; `disconnect()` may close it. */
254
+ static _topLevel(driver, dialect, primaryKey, connection, readDrivers = [], sticky = false, readPicker = undefined) {
255
+ return new NativeAdapter(driver, driver, dialect, primaryKey, driver, [], connection, readDrivers, sticky, readPicker);
256
+ }
257
+ query(table, opts) {
258
+ const pk = opts?.primaryKey ?? this.primaryKey;
259
+ return new NativeQueryBuilder(this.executor, this.dialect, table, pk, this.readPick);
260
+ }
261
+ /**
262
+ * Raw `SELECT` for the `DB` facade (`DB.select`) — on a split connection
263
+ * routes to the read pool (sticky-aware, Laravel parity for `DB::select`);
264
+ * otherwise runs on this adapter's executor (the top-level connection, or
265
+ * the transaction scope when inside `transaction()`).
266
+ */
267
+ async selectRaw(sql, bindings) {
268
+ return (this.readPick?.() ?? this.executor).execute(sql, bindings);
269
+ }
270
+ /**
271
+ * Raw writing statement for the `DB` facade (`DB.insert`/`update`/`delete`/
272
+ * `statement`). On SQLite/Postgres the caller's `RETURNING *` makes
273
+ * `Executor.execute` resolve to the affected rows, so the count is
274
+ * `rows.length`. On MySQL (no RETURNING) the affected count comes from the
275
+ * driver's result metadata via {@link AffectingExecutor} instead.
276
+ */
277
+ async affectingStatement(sql, bindings) {
278
+ // On a no-RETURNING driver (MySQL) a raw write returns no rows — read the
279
+ // affected count from the driver's result metadata instead. SQLite/Postgres
280
+ // don't implement AffectingExecutor; they fall back to `rows.length`, where
281
+ // the caller's `RETURNING *` makes the count correct (the existing contract).
282
+ const ex = this.executor;
283
+ if (typeof ex.affectingExecute === 'function') {
284
+ const { affectedRows } = await ex.affectingExecute(sql, bindings);
285
+ return affectedRows;
286
+ }
287
+ const rows = await this.executor.execute(sql, bindings);
288
+ return rows.length;
289
+ }
290
+ /**
291
+ * A {@link SchemaBuilder} bound to this adapter's connection — the DDL surface
292
+ * the migration runner drives. Runs on the same executor as queries, so a
293
+ * transaction-scoped adapter's schema builder participates in the transaction.
294
+ */
295
+ schemaBuilder() {
296
+ return new SchemaBuilder(this.executor, this.dialect);
297
+ }
298
+ /**
299
+ * A {@link SchemaBuilder} bound to a *recording* executor: every statement it
300
+ * would run is handed to `record` instead of touching the database. Powers
301
+ * `migrate --pretend` — the migrator binds this to a migration's `up()` and
302
+ * collects the DDL it would emit. Catalog reads (`hasTable`/`hasColumn`)
303
+ * resolve to "absent" (empty rows), which is the correct dry-run default.
304
+ */
305
+ pretendSchemaBuilder(record) {
306
+ const recordingExecutor = {
307
+ async execute(sql, bindings) {
308
+ record(sql, bindings);
309
+ return [];
310
+ },
311
+ };
312
+ return new SchemaBuilder(recordingExecutor, this.dialect);
313
+ }
314
+ /**
315
+ * Generate `app/Models/__schema/registry.d.ts` from THIS connection's live
316
+ * schema (GATE 7-types) — introspect every table, fold in each model's
317
+ * declared `casts`, and (re)write the registry. Node-only; the fs-writing
318
+ * orchestrator is lazily imported so the adapter's static eval graph stays
319
+ * import-light. Returns the written path + table count for the CLI to report.
320
+ */
321
+ async generateSchemaTypes(cwd, models = []) {
322
+ const { generateSchemaTypes } = await import('./schema/schema-types.js');
323
+ return generateSchemaTypes(this.executor, this.dialect, cwd, models);
324
+ }
325
+ /**
326
+ * Database overview for `rudder db:show` — dialect, version, database name,
327
+ * and every user table (with sizes where the dialect can report them, row
328
+ * counts/views on request). Lazily imported like {@link generateSchemaTypes}
329
+ * to keep the adapter's static eval graph import-light.
330
+ */
331
+ async inspectDatabase(opts = {}) {
332
+ const { inspectDatabase } = await import('./schema/inspect.js');
333
+ return inspectDatabase(this.executor, this.dialect, opts);
334
+ }
335
+ /**
336
+ * Single-table detail for `rudder db:table <name>` — columns, indexes,
337
+ * foreign keys, row count. Null when the table doesn't exist.
338
+ */
339
+ async inspectTable(table) {
340
+ const { inspectTable } = await import('./schema/inspect.js');
341
+ return inspectTable(this.executor, this.dialect, table);
342
+ }
343
+ /**
344
+ * Run `fn` inside a transaction (or a SAVEPOINT when already inside one),
345
+ * passing it a transaction-scoped `NativeAdapter` whose queries execute on the
346
+ * transaction's connection. The Model layer threads that scoped adapter
347
+ * through `AsyncLocalStorage` so existing `Model.query()` calls inside `fn`
348
+ * transparently join the transaction. Commits on resolve; rolls back and
349
+ * re-throws on reject.
350
+ *
351
+ * `opts.isolationLevel` is forwarded to the driver: SET TRANSACTION ISOLATION
352
+ * LEVEL at transaction start on Postgres/MySQL; SQLite throws (no isolation
353
+ * levels); any driver throws when this scope is already a SAVEPOINT.
354
+ */
355
+ transaction(fn, opts) {
356
+ return this.scope.transaction((txScope) => {
357
+ // Shares `this.listeners` by reference — queries inside the transaction
358
+ // report to the same listeners as top-level ones. No read drivers: every
359
+ // statement in a transaction runs on the write connection; the inherited
360
+ // splitTag keeps event tagging + sticky marking intact.
361
+ const scoped = new NativeAdapter(txScope, txScope, this.dialect, this.primaryKey, null, this.listeners, this.connection, [], this.sticky, undefined, this.splitTag);
362
+ return fn(scoped);
363
+ }, opts);
364
+ }
365
+ /**
366
+ * Register a query listener ({@link OrmAdapter.onQuery}) — fired once per
367
+ * successfully executed query with the SQL, bindings, and wall-clock duration
368
+ * in ms. The app-facing entry point is `DB.listen()` (`@rudderjs/database`);
369
+ * Telescope's QueryCollector and Pulse's slow-query recorder hook in here too.
370
+ * Listener errors are swallowed — they never break the query. Registering on
371
+ * a transaction-scoped adapter registers on the shared (top-level) listener
372
+ * list. Transaction control statements (BEGIN/COMMIT/SAVEPOINT) run inside
373
+ * the driver and are not reported.
374
+ */
375
+ onQuery(listener) {
376
+ this.listeners.push(listener);
377
+ }
378
+ async connect() {
379
+ // Drivers open eagerly in make(); nothing to do here.
380
+ }
381
+ async disconnect() {
382
+ // A transaction-scoped adapter owns no connection — never close the shared
383
+ // one out from under the owning adapter.
384
+ if (!this.driver)
385
+ return;
386
+ // Evict the cached client BEFORE closing so a later make() with the same
387
+ // cache key opens a fresh driver instead of reusing this closed one. The
388
+ // cache only holds self-opened drivers (driverInstance bypasses caching),
389
+ // so any entry holding this driver is the one we're about to close.
390
+ const cache = nativeClientCache();
391
+ for (const [key, entry] of cache) {
392
+ if (entry.driver === this.driver)
393
+ cache.delete(key);
394
+ }
395
+ await this.driver.close();
396
+ for (const readDriver of this.readDrivers) {
397
+ await readDriver.close();
398
+ }
399
+ }
400
+ }
401
+ /** Open the built-in driver for `driverName` and pair it with its dialect. */
402
+ async function openDriver(driverName, url) {
403
+ switch (driverName) {
404
+ case 'sqlite': {
405
+ const driver = await BetterSqlite3Driver.open({ filename: url });
406
+ return { driver, dialect: new SqliteDialect() };
407
+ }
408
+ case 'pg': {
409
+ const driver = await PostgresDriver.open({ url });
410
+ return { driver, dialect: new PgDialect() };
411
+ }
412
+ case 'mysql': {
413
+ const driver = await MysqlDriver.open({ url });
414
+ return { driver, dialect: new MysqlDialect() };
415
+ }
416
+ default: {
417
+ const _exhaustive = driverName;
418
+ throw new Error(`[RudderJS ORM native] Unknown driver: ${String(_exhaustive)}`);
419
+ }
420
+ }
421
+ }
422
+ /**
423
+ * Build the native ORM adapter provider — the `OrmAdapterProvider` shape the
424
+ * database provider consumes (mirrors `drizzle(...)` / the prisma factory).
425
+ *
426
+ * @example
427
+ * import { native } from '@rudderjs/database'
428
+ * database({
429
+ * default: 'main',
430
+ * connections: { main: native({ driver: 'sqlite', url: 'file:./dev.db' }) },
431
+ * })
432
+ */
433
+ export function native(config = {}) {
434
+ return {
435
+ async create() {
436
+ return NativeAdapter.make(config);
437
+ },
438
+ };
439
+ }
440
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/native/adapter.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,4EAA4E;AAC5E,6EAA6E;AAC7E,8CAA8C;AAC9C,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,4EAA4E;AAC5E,4EAA4E;AAC5E,6DAA6D;AAI7D,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAErD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAA;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AA0E1D,MAAM,uBAAuB,GAAG,4BAA4B,CAAA;AAE5D,SAAS,iBAAiB;IACxB,MAAM,CAAC,GAAG,UAAqC,CAAA;IAC/C,IAAI,KAAK,GAAG,CAAC,CAAC,uBAAuB,CAAC,CAAA;IACtC,IAAI,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAkC,CAAA;QACrD,sEAAsE;QACtE,sEAAsE;QACtE,kDAAkD;QAClD,MAAM,MAAM,GAAG,KAA0E,CAAA;QACzF,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,SAAS,KAAK,QAAQ,EAAE,CAAC;YACnD,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,GAAG,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC,CAAA;QACjF,CAAC;QACD,CAAC,CAAC,uBAAuB,CAAC,GAAG,GAAG,CAAA;QAChC,KAAK,GAAG,GAAG,CAAA;IACb,CAAC;IACD,OAAO,KAA4C,CAAA;AACrD,CAAC;AAED,SAAS,oBAAoB,CAC3B,QAAgB,EAChB,SAAiB;IAEjB,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAA;IACjC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAClC,IAAI,CAAC,MAAM;QAAE,OAAO,SAAS,CAAA;IAC7B,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAA;IAC5F,CAAC;IACD,2EAA2E;IAC3E,mEAAmE;IACnE,4BAA4B;IAC5B,KAAK,OAAO,CAAC,OAAO,EAAE;SACnB,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;SACrF,KAAK,CAAC,GAAG,EAAE,GAAqB,CAAC,CAAC,CAAA;IACrC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;IACtB,OAAO,SAAS,CAAA;AAClB,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB,EAAE,KAA6B;IACxE,iBAAiB,EAAE,CAAC,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAA;AAC1C,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,kBAAkB,CACzB,IAAoB,EACpB,SAAoC,EACpC,UAA8B;AAC9B;8EAC8E;AAC9E,MAA4B;IAE5B,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,QAA4B,EAAE,SAAiB,EAAQ,EAAE;QAClF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAA;QAC9C,0EAA0E;QAC1E,KAAK,MAAM,QAAQ,IAAI,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC;gBACH,QAAQ,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAA;YAC1E,CAAC;YAAC,MAAM,CAAC;gBACP,8CAA8C;YAChD,CAAC;QACH,CAAC;IACH,CAAC,CAAA;IAED,MAAM,OAAO,GAA0C;QACrD,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,QAA4B;YACrD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;YACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;YAC9C,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;YAC9B,OAAO,IAAI,CAAA;QACb,CAAC;KACF,CAAA;IAED,MAAM,SAAS,GAAG,IAAkC,CAAA;IACpD,IAAI,OAAO,SAAS,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;QACrD,MAAM,gBAAgB,GAAG,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9D,OAAO,CAAC,gBAAgB,GAAG,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;YACjD,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;YACnC,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;YACpD,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAA;YAC9B,OAAO,MAAM,CAAA;QACf,CAAC,CAAA;IACH,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,kBAAkB,CAAC,IAAc,EAAE,UAAkB;IAC5D,MAAM,MAAM,GAA0C;QACpD,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,QAA4B;YACrD,SAAS,CAAC,UAAU,CAAC,CAAA;YACrB,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QACpC,CAAC;KACF,CAAA;IACD,MAAM,SAAS,GAAG,IAAkC,CAAA;IACpD,IAAI,OAAO,SAAS,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;QACrD,MAAM,gBAAgB,GAAG,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC9D,MAAM,CAAC,gBAAgB,GAAG,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;YAChD,SAAS,CAAC,UAAU,CAAC,CAAA;YACrB,OAAO,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QACxC,CAAC,CAAA;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,OAAO,aAAa;IAgBL;IACA;IACA;IAGA;IAIA;IAKA;IAGA;IAEA;IAlCnB;wFACoF;IACnE,QAAQ,CAAU;IAEnC;;;mDAG+C;IAC9B,QAAQ,CAAyB;IAElD;IACE,mFAAmF;IACnF,QAAkB;IAClB;2EACuE;IACtD,KAAuB,EACvB,OAAmB,EACnB,UAAkB;IACnC;8EAC0E;IACzD,MAAyB;IAC1C;;iFAE6E;IAC5D,YAA8B,EAAE;IACjD;;;+CAG2C;IAC1B,aAAiC,SAAS;IAC3D;gFAC4E;IAC3D,cAAwB,EAAE;IAC3C,+EAA+E;IAC9D,SAAkB,KAAK;IACxC;4EACwE;IACxE,aAA4C,SAAS;IACrD;;6DAEyD;IACzD,oBAAyC,SAAS;QA1BjC,UAAK,GAAL,KAAK,CAAkB;QACvB,YAAO,GAAP,OAAO,CAAY;QACnB,eAAU,GAAV,UAAU,CAAQ;QAGlB,WAAM,GAAN,MAAM,CAAmB;QAIzB,cAAS,GAAT,SAAS,CAAuB;QAKhC,eAAU,GAAV,UAAU,CAAgC;QAG1C,gBAAW,GAAX,WAAW,CAAe;QAE1B,WAAM,GAAN,MAAM,CAAiB;QASxC,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAA;QACpC,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAA;QACnD,0EAA0E;QAC1E,kEAAkE;QAClE,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,UAAU,KAAK,SAAS;YAC1E,CAAC,CAAC,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC;YAC1C,CAAC,CAAC,QAAQ,CAAA;QACZ,IAAI,CAAC,QAAQ,GAAG,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAC9E,IAAI,KAAK,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YACtC,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC,CAAA;YAC9F,uEAAuE;YACvE,mEAAmE;YACnE,MAAM,IAAI,GAAG,iBAAiB,CAAC,UAAU,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;YAC5D,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE;gBACnB,IAAI,IAAI,CAAC,MAAM,IAAI,WAAW,CAAC,UAAU,CAAC;oBAAE,OAAO,IAAI,CAAC,QAAQ,CAAA;gBAChE,OAAO,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAA;YAC3C,CAAC,CAAA;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;QACtB,CAAC;IACH,CAAC;IAED;6EACyE;IACxD,QAAQ,CAAqB;IAE9C;;;;0EAIsE;IAC7D,iBAAiB,GAAG,aAAsB,CAAA;IAEnD,4EAA4E;IAC5E,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAuB,EAAE;QACzC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,IAAI,IAAI,CAAA;QAE5C,0EAA0E;QAC1E,yCAAyC;QACzC,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YAC1B,OAAO,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,IAAI,IAAI,aAAa,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,CAAA;QACrH,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAA;QAC5C,MAAM,GAAG,GACP,MAAM,CAAC,GAAG;YACV,CAAC,OAAO,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC5E,UAAU,CAAA;QACZ,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAA;QACtC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,KAAK,CAAA;QACrC,2EAA2E;QAC3E,4EAA4E;QAC5E,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC;YACnC,CAAC,CAAC,GAAG,UAAU,KAAK,GAAG,KAAK,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAChD,CAAC,CAAC,GAAG,UAAU,KAAK,GAAG,EAAE,CAAA;QAC3B,MAAM,QAAQ,GAAG,MAAM,CAAC,cAAc,IAAI,SAAS,CAAA;QACnD,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,IAAI,UAAU,CAAA;QAEtD,MAAM,MAAM,GAAG,oBAAoB,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAA;QACxD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,aAAa,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;QACtI,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC,CAAA;QAC7D,MAAM,WAAW,GAAa,EAAE,CAAA;QAChC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;QAClE,CAAC;QACD,iBAAiB,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAA;QACxE,OAAO,aAAa,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAA;IACjH,CAAC;IAED;oDACgD;IACxC,MAAM,CAAC,SAAS,CACtB,MAAc,EACd,OAAgB,EAChB,UAAkB,EAClB,UAA8B,EAC9B,cAAwB,EAAE,EAC1B,MAAM,GAAG,KAAK,EACd,aAA4C,SAAS;QAErD,OAAO,IAAI,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,CAAC,CAAA;IACxH,CAAC;IAED,KAAK,CAAI,KAAa,EAAE,IAA0B;QAChD,MAAM,EAAE,GAAG,IAAI,EAAE,UAAU,IAAI,IAAI,CAAC,UAAU,CAAA;QAC9C,OAAO,IAAI,kBAAkB,CAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzF,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,SAAS,CAAC,GAAW,EAAE,QAA4B;QACvD,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;IACpE,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,kBAAkB,CAAC,GAAW,EAAE,QAA4B;QAChE,0EAA0E;QAC1E,4EAA4E;QAC5E,4EAA4E;QAC5E,8EAA8E;QAC9E,MAAM,EAAE,GAAG,IAAI,CAAC,QAAsC,CAAA;QACtD,IAAI,OAAO,EAAE,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;YAC9C,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,EAAE,CAAC,gBAAgB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;YACjE,OAAO,YAAY,CAAA;QACrB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;QACvD,OAAO,IAAI,CAAC,MAAM,CAAA;IACpB,CAAC;IAED;;;;OAIG;IACH,aAAa;QACX,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;IACvD,CAAC;IAED;;;;;;OAMG;IACH,oBAAoB,CAAC,MAA2D;QAC9E,MAAM,iBAAiB,GAAa;YAClC,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,QAA4B;gBACrD,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;gBACrB,OAAO,EAAE,CAAA;YACX,CAAC;SACF,CAAA;QACD,OAAO,IAAI,aAAa,CAAC,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3D,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,mBAAmB,CACvB,GAAW,EACX,SAA0B,EAAE;QAE5B,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAA;QACxE,OAAO,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;IACtE,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,eAAe,CAAC,OAA8C,EAAE;QACpE,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAA;QAC/D,OAAO,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAC3D,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,KAAa;QAC9B,MAAM,EAAE,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAA;QAC5D,OAAO,YAAY,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;IACzD,CAAC;IAED;;;;;;;;;;;OAWG;IACH,WAAW,CAAI,EAAkC,EAAE,IAAyB;QAC1E,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE,EAAE;YACxC,wEAAwE;YACxE,yEAAyE;YACzE,yEAAyE;YACzE,wDAAwD;YACxD,MAAM,MAAM,GAAG,IAAI,aAAa,CAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,UAAU,EACtF,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,CAC1C,CAAA;YACD,OAAO,EAAE,CAAC,MAAM,CAAC,CAAA;QACnB,CAAC,EAAE,IAAI,CAAC,CAAA;IACV,CAAC;IAED;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAuB;QAC7B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO;QACX,sDAAsD;IACxD,CAAC;IAED,KAAK,CAAC,UAAU;QACd,2EAA2E;QAC3E,yCAAyC;QACzC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAM;QACxB,yEAAyE;QACzE,yEAAyE;QACzE,0EAA0E;QAC1E,oEAAoE;QACpE,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAA;QACjC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;YACjC,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM;gBAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QACrD,CAAC;QACD,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;QACzB,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,MAAM,UAAU,CAAC,KAAK,EAAE,CAAA;QAC1B,CAAC;IACH,CAAC;CACF;AAED,8EAA8E;AAC9E,KAAK,UAAU,UAAU,CACvB,UAA4B,EAC5B,GAAW;IAEX,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAA;YAChE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,aAAa,EAAE,EAAE,CAAA;QACjD,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;YACjD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,SAAS,EAAE,EAAE,CAAA;QAC7C,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAA;YAC9C,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,YAAY,EAAE,EAAE,CAAA;QAChD,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,MAAM,WAAW,GAAU,UAAU,CAAA;YACrC,MAAM,IAAI,KAAK,CAAC,yCAAyC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAA;QACjF,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,MAAM,CAAC,SAAuB,EAAE;IAC9C,OAAO;QACL,KAAK,CAAC,MAAM;YACV,OAAO,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACnC,CAAC;KACF,CAAA;AACH,CAAC"}