@vibeorm/runtime 2.0.2 → 2.2.0
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/dist/advisory-lock.d.ts +68 -0
- package/dist/advisory-lock.d.ts.map +1 -0
- package/dist/client.d.ts +104 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/codecs.d.ts +3 -3
- package/dist/diagnostics/index.d.ts +3 -1
- package/dist/diagnostics/index.d.ts.map +1 -1
- package/dist/diagnostics/plan.d.ts +36 -0
- package/dist/diagnostics/plan.d.ts.map +1 -1
- package/dist/diagnostics/statement-diagnostics.d.ts +172 -0
- package/dist/diagnostics/statement-diagnostics.d.ts.map +1 -0
- package/dist/extensions.d.ts +7 -0
- package/dist/extensions.d.ts.map +1 -1
- package/dist/index.d.ts +11 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2026 -720
- package/dist/index.js.map +23 -17
- package/dist/nested-writes.d.ts.map +1 -1
- package/dist/policy.d.ts.map +1 -1
- package/dist/query-builder.d.ts +11 -0
- package/dist/query-builder.d.ts.map +1 -1
- package/dist/read-only.d.ts +114 -0
- package/dist/read-only.d.ts.map +1 -0
- package/dist/relation-loader.d.ts +12 -0
- package/dist/relation-loader.d.ts.map +1 -1
- package/dist/relation-plan.d.ts +14 -0
- package/dist/relation-plan.d.ts.map +1 -1
- package/dist/render-cache.d.ts.map +1 -1
- package/dist/rls-readiness.d.ts.map +1 -1
- package/dist/scoped.d.ts.map +1 -1
- package/dist/sql-access.d.ts +8 -0
- package/dist/sql-access.d.ts.map +1 -0
- package/dist/sql.d.ts +29 -0
- package/dist/sql.d.ts.map +1 -0
- package/dist/telemetry/statement.d.ts +7 -0
- package/dist/telemetry/statement.d.ts.map +1 -1
- package/dist/views.d.ts +3 -3
- package/dist/views.d.ts.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Advisory locks — locking a resource the APPLICATION defines, including one
|
|
3
|
+
* that has no row to lock.
|
|
4
|
+
*
|
|
5
|
+
* "Nobody else may import this supplier's price list while I am rebuilding it"
|
|
6
|
+
* is not a row lock: the rows do not exist yet, or they are the very rows being
|
|
7
|
+
* replaced. PostgreSQL's advisory locks give that mutual exclusion a name of
|
|
8
|
+
* your choosing (a number in a lock space you own), enforced by the database
|
|
9
|
+
* rather than by hope.
|
|
10
|
+
*
|
|
11
|
+
* Three deliberate limits:
|
|
12
|
+
*
|
|
13
|
+
* 1. **Transaction-scoped only.** Every lock taken here is released by COMMIT
|
|
14
|
+
* and by ROLLBACK, and by `ROLLBACK TO SAVEPOINT` when it was taken after
|
|
15
|
+
* that savepoint. The session-scoped family (`pg_advisory_lock`) is NOT
|
|
16
|
+
* exposed at all: on a pooled connection its lock outlives the caller and
|
|
17
|
+
* the next borrower inherits a lock it never asked for.
|
|
18
|
+
* 2. **Inside a transaction only.** Outside one, PostgreSQL's implicit
|
|
19
|
+
* single-statement transaction releases the lock before the next statement
|
|
20
|
+
* runs — the lock is taken and gone (probe-verified: a second session took
|
|
21
|
+
* the same key immediately afterwards). That is a silent no-op, so the call
|
|
22
|
+
* is refused instead.
|
|
23
|
+
* 3. **Numeric keys only.** No string hashing: a hash collides, and a
|
|
24
|
+
* collision between two unrelated resources is a deadlock or a stall nobody
|
|
25
|
+
* can explain from the code. Own your key space explicitly.
|
|
26
|
+
*/
|
|
27
|
+
import type { AdvisoryLockMode } from "@vibeorm/schema";
|
|
28
|
+
import type { AdvisoryLockStatement, SqlDialect } from "@vibeorm/sql";
|
|
29
|
+
/**
|
|
30
|
+
* Which resource to lock, and how.
|
|
31
|
+
*
|
|
32
|
+
* The two key forms are DIFFERENT lock spaces in the database — holding
|
|
33
|
+
* `{ classId: 11, objectId: 22 }` does not block `{ key: 47244640278n }` even
|
|
34
|
+
* though the numbers correspond (probe-verified on PostgreSQL 18.6). Pick one
|
|
35
|
+
* form per resource family and stay in it.
|
|
36
|
+
*
|
|
37
|
+
* `mode` defaults to `"exclusive"` (one holder). `"shared"` lets many holders
|
|
38
|
+
* in at once while still excluding every exclusive holder.
|
|
39
|
+
*/
|
|
40
|
+
export type AdvisoryLockOptions = {
|
|
41
|
+
readonly key: bigint | number;
|
|
42
|
+
readonly mode?: AdvisoryLockMode;
|
|
43
|
+
/** Never both forms: checking a union allows any member's properties unless the others forbid them. */
|
|
44
|
+
readonly classId?: never;
|
|
45
|
+
readonly objectId?: never;
|
|
46
|
+
} | {
|
|
47
|
+
readonly classId: number;
|
|
48
|
+
readonly objectId: number;
|
|
49
|
+
readonly mode?: AdvisoryLockMode;
|
|
50
|
+
readonly key?: never;
|
|
51
|
+
};
|
|
52
|
+
/** The two methods, for messages that must name the call the caller made. */
|
|
53
|
+
export type AdvisoryLockMethod = "$advisoryLock" | "$tryAdvisoryLock";
|
|
54
|
+
/**
|
|
55
|
+
* Read the public options into an AST statement, refusing anything the request
|
|
56
|
+
* cannot honestly deliver.
|
|
57
|
+
*
|
|
58
|
+
* Order of refusals is deliberate: what the DIALECT can never do comes first
|
|
59
|
+
* (a permanent property of this client), then what this CALL SITE cannot do
|
|
60
|
+
* (outside a transaction), then the arguments.
|
|
61
|
+
*/
|
|
62
|
+
export declare function compileAdvisoryLock(params: {
|
|
63
|
+
dialect: SqlDialect;
|
|
64
|
+
method: AdvisoryLockMethod;
|
|
65
|
+
inTransaction: boolean;
|
|
66
|
+
options: unknown;
|
|
67
|
+
}): AdvisoryLockStatement;
|
|
68
|
+
//# sourceMappingURL=advisory-lock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advisory-lock.d.ts","sourceRoot":"","sources":["../src/advisory-lock.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,KAAK,EAAmB,qBAAqB,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAIvF;;;;;;;;;;GAUG;AACH,MAAM,MAAM,mBAAmB,GAC3B;IACE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACjC,uGAAuG;IACvG,QAAQ,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;CAC3B,GACD;IACE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACjC,QAAQ,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;CACtB,CAAC;AAEN,6EAA6E;AAC7E,MAAM,MAAM,kBAAkB,GAAG,eAAe,GAAG,kBAAkB,CAAC;AAqDtE;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,OAAO,EAAE,UAAU,CAAC;IACpB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB,GAAG,qBAAqB,CA4DxB"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
import type { SqlFragment, ResultDecoder } from "@vibeorm/sql";
|
|
1
2
|
import type { SchemaIR } from "@vibeorm/schema";
|
|
3
|
+
import type { AdvisoryLockOptions } from "./advisory-lock.ts";
|
|
2
4
|
import type { DatabaseAdapter, TransactionOptions } from "./adapter.ts";
|
|
3
5
|
import type { RelationStrategy } from "./query-builder.ts";
|
|
4
6
|
import type { ClientComputedOptions } from "./computed.ts";
|
|
@@ -8,6 +10,7 @@ import type { WriteValidators } from "./validators.ts";
|
|
|
8
10
|
import type { PolicyContextValue } from "./policy.ts";
|
|
9
11
|
import type { ScopedClientConfig } from "./scoped.ts";
|
|
10
12
|
import type { UpsertManyResult } from "./bulk-upsert.ts";
|
|
13
|
+
import type { StatementDiagnosticsOptions } from "./diagnostics/statement-diagnostics.ts";
|
|
11
14
|
import type { TelemetryOptions } from "./telemetry/types.ts";
|
|
12
15
|
/** One executed statement, reported to `ClientOptions.onQuery`. */
|
|
13
16
|
export type QueryEvent = {
|
|
@@ -36,6 +39,21 @@ export type ClientOptions = {
|
|
|
36
39
|
* only). A per-query `relationStrategy` argument overrides it.
|
|
37
40
|
*/
|
|
38
41
|
readonly relationStrategy?: RelationStrategy;
|
|
42
|
+
/**
|
|
43
|
+
* Relation loading for the `"query"` strategy. `concurrency` (default 1) is
|
|
44
|
+
* how many of ONE query's relation statements may be in flight at once:
|
|
45
|
+
* sibling relations of a level, `_count` entries and a relation's key chunks.
|
|
46
|
+
*
|
|
47
|
+
* It is a LATENCY option, worth setting against a remote database with wide
|
|
48
|
+
* include trees — 4 siblings at 5 ms of network each cost 20 ms serially and
|
|
49
|
+
* 5 ms concurrently. It is ignored inside `$transaction` (those statements
|
|
50
|
+
* share one connection and must stay ordered), and it buys nothing on an
|
|
51
|
+
* embedded adapter or when the JavaScript thread is already the ceiling.
|
|
52
|
+
* Above 1 the connection pool must be able to lend that many connections.
|
|
53
|
+
*/
|
|
54
|
+
readonly relationLoading?: {
|
|
55
|
+
readonly concurrency?: number;
|
|
56
|
+
};
|
|
39
57
|
/**
|
|
40
58
|
* Append the primary key to ORDER BY when a find has no explicit orderBy
|
|
41
59
|
* (default false) — deterministic row order at the cost of a sort. v1 parity.
|
|
@@ -62,6 +80,19 @@ export type ClientOptions = {
|
|
|
62
80
|
* but never shuts it down.
|
|
63
81
|
*/
|
|
64
82
|
readonly telemetry?: TelemetryOptions;
|
|
83
|
+
/**
|
|
84
|
+
* Statement diagnostics: a slow-statement log with an automatic `EXPLAIN`.
|
|
85
|
+
* Every statement slower than `slowerThanMs` (default 0 = all) is handed to
|
|
86
|
+
* `sink` (default: one `console.warn` line) with its duration; with
|
|
87
|
+
* `explain: "estimate"` or `"analyze"` a plan summary is attached on
|
|
88
|
+
* PostgreSQL/PGlite for read statements that ran outside a transaction —
|
|
89
|
+
* `"analyze"` EXECUTES the statement again, inside a read-only transaction
|
|
90
|
+
* on its own pooled connection, after the caller's promise has settled.
|
|
91
|
+
* `VIBEORM_DIAGNOSTICS=<explain>[:<slowerThanMs>]` (e.g. `analyze:5`)
|
|
92
|
+
* switches it on for a run; the explicit option wins field by field. Local
|
|
93
|
+
* runs only — never production.
|
|
94
|
+
*/
|
|
95
|
+
readonly diagnostics?: StatementDiagnosticsOptions;
|
|
65
96
|
/**
|
|
66
97
|
* Strict argument handling (EPIC 2), **on by default**: an explicit
|
|
67
98
|
* `undefined` anywhere in ORM argument syntax is refused BEFORE a statement
|
|
@@ -116,6 +147,49 @@ export type ModelDelegate = {
|
|
|
116
147
|
readonly aggregate: (args: ClientRow) => Promise<ClientRow>;
|
|
117
148
|
readonly groupBy: (args: ClientRow) => Promise<ClientRow[]>;
|
|
118
149
|
};
|
|
150
|
+
/**
|
|
151
|
+
* The read half of a model's methods — the shape a `$readOnly` handle exposes,
|
|
152
|
+
* and the shape `$defineView` needs (a view reads and never writes).
|
|
153
|
+
*
|
|
154
|
+
* Written out rather than derived from `ModelDelegate` with `Omit`: the
|
|
155
|
+
* generated `.d.ts` mirrors this member list per model, and a pre-resolved
|
|
156
|
+
* object type costs the consumer's tsserver nothing (constitution rule 2).
|
|
157
|
+
*/
|
|
158
|
+
export type ReadOnlyModelDelegate = {
|
|
159
|
+
readonly findMany: (args?: ClientRow) => Promise<ClientRow[]>;
|
|
160
|
+
readonly findFirst: (args?: ClientRow) => Promise<ClientRow | null>;
|
|
161
|
+
readonly findFirstOrThrow: (args?: ClientRow) => Promise<ClientRow>;
|
|
162
|
+
readonly findUnique: (args: ClientRow) => Promise<ClientRow | null>;
|
|
163
|
+
readonly findUniqueOrThrow: (args: ClientRow) => Promise<ClientRow>;
|
|
164
|
+
readonly count: (args?: ClientRow) => Promise<number | Record<string, number>>;
|
|
165
|
+
readonly aggregate: (args: ClientRow) => Promise<ClientRow>;
|
|
166
|
+
readonly groupBy: (args: ClientRow) => Promise<ClientRow[]>;
|
|
167
|
+
};
|
|
168
|
+
/**
|
|
169
|
+
* A read-only client handle (`$readOnly`). CLOSED under every handle it can
|
|
170
|
+
* produce: transactions, views, scoped and policy handles built from it are
|
|
171
|
+
* read-only too, so no route recovers a writable client.
|
|
172
|
+
*
|
|
173
|
+
* Raw SQL, connection lifecycle and advisory locks are absent by design, and
|
|
174
|
+
* so is anything the access table in `read-only.ts` does not classify.
|
|
175
|
+
*/
|
|
176
|
+
export type ReadOnlyClient = {
|
|
177
|
+
readonly $models: Readonly<Record<string, ReadOnlyModelDelegate>>;
|
|
178
|
+
readonly $on: (event: "query", listener: (event: QueryEvent) => void) => () => void;
|
|
179
|
+
/** One transaction of reads. The callback's handle is read-only; the array form takes read operations only. */
|
|
180
|
+
readonly $transaction: {
|
|
181
|
+
<T>(fn: (tx: ReadOnlyClient) => Promise<T>, options?: TransactionOptions): Promise<T>;
|
|
182
|
+
<T extends readonly unknown[]>(operations: readonly [...T], options?: TransactionOptions): Promise<{
|
|
183
|
+
-readonly [K in keyof T]: Awaited<T[K]>;
|
|
184
|
+
}>;
|
|
185
|
+
};
|
|
186
|
+
readonly $defineView?: DefineViewFn;
|
|
187
|
+
readonly $scoped?: (config: ScopedClientConfig) => ReadOnlyClient;
|
|
188
|
+
readonly $withPolicy?: (context: Readonly<Record<string, PolicyContextValue>>) => ReadOnlyClient;
|
|
189
|
+
readonly $bypassPolicy?: () => ReadOnlyClient;
|
|
190
|
+
/** Idempotent: restricting an already-restricted handle returns the same handle. */
|
|
191
|
+
readonly $readOnly: () => ReadOnlyClient;
|
|
192
|
+
};
|
|
119
193
|
/**
|
|
120
194
|
* The client. Delegates are also attached as own properties under their
|
|
121
195
|
* camelCase names (`client.user.findMany()`); the type surfaces them through
|
|
@@ -148,11 +222,34 @@ export type DynamicClient = {
|
|
|
148
222
|
}>;
|
|
149
223
|
};
|
|
150
224
|
/** Tagged template — interpolations become bound parameters, never text. */
|
|
225
|
+
readonly $querySql: <T>(params: {
|
|
226
|
+
query: SqlFragment;
|
|
227
|
+
decoder: ResultDecoder<T>;
|
|
228
|
+
}) => Promise<T[]>;
|
|
229
|
+
readonly $executeSql: (params: {
|
|
230
|
+
query: SqlFragment;
|
|
231
|
+
}) => Promise<number>;
|
|
151
232
|
readonly $queryRaw: (strings: TemplateStringsArray, ...values: unknown[]) => Promise<ClientRow[]>;
|
|
152
233
|
/** Tagged template returning the affected-row count. */
|
|
153
234
|
readonly $executeRaw: (strings: TemplateStringsArray, ...values: unknown[]) => Promise<number>;
|
|
154
235
|
readonly $queryRawUnsafe: (text: string, ...values: unknown[]) => Promise<ClientRow[]>;
|
|
155
236
|
readonly $executeRawUnsafe: (text: string, ...values: unknown[]) => Promise<number>;
|
|
237
|
+
/**
|
|
238
|
+
* Take a transaction-scoped advisory lock on an application-defined key,
|
|
239
|
+
* BLOCKING until it is held. Released by commit and by rollback — there is no
|
|
240
|
+
* unlock call, so nothing can leak onto a pooled connection.
|
|
241
|
+
*
|
|
242
|
+
* Only inside `$transaction` (outside one the lock would be released before
|
|
243
|
+
* the next statement), and only on PostgreSQL/PGlite; every other dialect
|
|
244
|
+
* refuses with `VIBE_UNSUPPORTED_CAPABILITY`.
|
|
245
|
+
*/
|
|
246
|
+
readonly $advisoryLock: (options: AdvisoryLockOptions) => Promise<void>;
|
|
247
|
+
/**
|
|
248
|
+
* Take the same lock WITHOUT waiting: `true` when it was acquired, `false`
|
|
249
|
+
* when someone else holds it. The transaction stays usable either way — a
|
|
250
|
+
* refusal here is a verdict, not an error.
|
|
251
|
+
*/
|
|
252
|
+
readonly $tryAdvisoryLock: (options: AdvisoryLockOptions) => Promise<boolean>;
|
|
156
253
|
readonly $connect: () => Promise<void>;
|
|
157
254
|
readonly $disconnect: () => Promise<void>;
|
|
158
255
|
/**
|
|
@@ -176,6 +273,13 @@ export type DynamicClient = {
|
|
|
176
273
|
* tenant (raw SQL refused). Always attached; refuses on @@policy schemas.
|
|
177
274
|
*/
|
|
178
275
|
readonly $scoped?: (config: ScopedClientConfig) => DynamicClient;
|
|
276
|
+
/**
|
|
277
|
+
* A read-only handle over this one, built from the runtime's ALLOWLIST of
|
|
278
|
+
* read methods (`read-only.ts`). Attached after construction (hence optional
|
|
279
|
+
* in the type); absent only on the unbound native-RLS root, which cannot
|
|
280
|
+
* query until `$withContext` binds an identity.
|
|
281
|
+
*/
|
|
282
|
+
readonly $readOnly?: () => ReadOnlyClient;
|
|
179
283
|
};
|
|
180
284
|
/**
|
|
181
285
|
* Build a client for a schema over an adapter.
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/codecs.d.ts
CHANGED
|
@@ -92,9 +92,9 @@ export declare function fieldEncoder(params: {
|
|
|
92
92
|
*
|
|
93
93
|
* With a `wire` declaration (board #30 — the ADAPTER's promise about what its
|
|
94
94
|
* driver delivers), decoders that are provably no-ops for that wire are pruned
|
|
95
|
-
* too ({@link decodeIsNoop}): non-list
|
|
96
|
-
*
|
|
97
|
-
* idempotency-guarded decoder set applies
|
|
95
|
+
* too ({@link decodeIsNoop}): non-list Json/Int/Float columns on drivers that
|
|
96
|
+
* already deliver native forms. DateTime retains finite-value validation.
|
|
97
|
+
* Without a declaration the full idempotency-guarded decoder set applies.
|
|
98
98
|
*/
|
|
99
99
|
export declare function fieldDecoder(params: {
|
|
100
100
|
dialect: Dialect;
|
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
* Module barrel — the package's root barrel re-exports from here.
|
|
6
6
|
*/
|
|
7
7
|
export { parameterTypeTag, previewOperation } from "./preview.ts";
|
|
8
|
-
export { PLAN_DEFAULTS, explainOperation, explainSql, parsePostgresPlan } from "./plan.ts";
|
|
8
|
+
export { PLAN_DEFAULTS, explainOnSession, explainOperation, explainSql, isExecutableRead, parsePostgresPlan } from "./plan.ts";
|
|
9
|
+
export { STATEMENT_DIAGNOSTICS_DEFAULTS, createStatementDiagnostics, formatStatementDiagnostic, parseDiagnosticsEnv, resolveStatementDiagnostics, summarizePlan, } from "./statement-diagnostics.ts";
|
|
10
|
+
export type { ExplainSkipReason, ObservedStatement, ResolvedStatementDiagnostics, StatementDiagnostic, StatementDiagnosticPlan, StatementDiagnosticsHook, StatementDiagnosticsOptions, StatementExplainMode, } from "./statement-diagnostics.ts";
|
|
9
11
|
export { readWorkloadStatistics } from "./workload.ts";
|
|
10
12
|
export { DIAGNOSTIC_THRESHOLDS, analyzeOperationTelemetry, recommendFromPlan } from "./insight.ts";
|
|
11
13
|
export type { DiagnosticFinding, DiagnosticFindingCode, ExplainMode, IndexCandidate, IndexFacts, OperationPreview, ParsedPlan, PlanContext, PlanNode, PreviewLimitation, PreviewLimitationCode, PreviewStatement, QueryPlanReport, SlowOperation, SuspectedPattern, TableFacts, TelemetryDiagnosticReport, WorkloadAvailability, WorkloadReport, WorkloadStatement, } from "./types.ts";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/diagnostics/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/diagnostics/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,UAAU,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAC/H,OAAO,EACL,8BAA8B,EAC9B,0BAA0B,EAC1B,yBAAyB,EACzB,mBAAmB,EACnB,2BAA2B,EAC3B,aAAa,GACd,MAAM,4BAA4B,CAAC;AACpC,YAAY,EACV,iBAAiB,EACjB,iBAAiB,EACjB,4BAA4B,EAC5B,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,2BAA2B,EAC3B,oBAAoB,GACrB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACnG,YAAY,EACV,iBAAiB,EACjB,qBAAqB,EACrB,WAAW,EACX,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,QAAQ,EACR,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,yBAAyB,EACzB,oBAAoB,EACpB,cAAc,EACd,iBAAiB,GAClB,MAAM,YAAY,CAAC"}
|
|
@@ -38,6 +38,15 @@ export declare function parsePostgresPlan(params: {
|
|
|
38
38
|
maxNodes?: number;
|
|
39
39
|
includeLiterals?: boolean;
|
|
40
40
|
}): ParsedPlan;
|
|
41
|
+
/**
|
|
42
|
+
* Is this SQL text one the executing explain mode would accept — a single
|
|
43
|
+
* statement led by `SELECT` / `WITH` / `TABLE` / `VALUES`? The same structural
|
|
44
|
+
* rule `explainSql` enforces for `analyze`, exposed for callers that must skip
|
|
45
|
+
* rather than refuse. Not a safety proof (see {@link executableReadRefusal}).
|
|
46
|
+
*/
|
|
47
|
+
export declare function isExecutableRead(params: {
|
|
48
|
+
text: string;
|
|
49
|
+
}): boolean;
|
|
41
50
|
/**
|
|
42
51
|
* Take a plan for already-rendered SQL.
|
|
43
52
|
*
|
|
@@ -64,6 +73,33 @@ export declare function explainSql(params: {
|
|
|
64
73
|
maxNodes?: number;
|
|
65
74
|
includeLiterals?: boolean;
|
|
66
75
|
}): Promise<QueryPlanReport>;
|
|
76
|
+
/**
|
|
77
|
+
* The plan-taking body of {@link explainSql}, for a caller that ALREADY owns
|
|
78
|
+
* the session: every statement here runs through `executor` on whatever
|
|
79
|
+
* connection it is bound to, and nothing here begins, commits or rolls back.
|
|
80
|
+
*
|
|
81
|
+
* The caller is responsible for the two guarantees the wrapper otherwise
|
|
82
|
+
* provides: a single connection (the context settings and the plan must share
|
|
83
|
+
* one session), and — for `analyze` — a `READ ONLY` transaction plus the
|
|
84
|
+
* read-statement check ({@link isExecutableRead}). The statement-diagnostics
|
|
85
|
+
* hook uses this inside the adapter's own `transaction()` so it never has to
|
|
86
|
+
* drive `BEGIN` through a pooled executor.
|
|
87
|
+
*/
|
|
88
|
+
export declare function explainOnSession(params: {
|
|
89
|
+
executor: SqlExecutor;
|
|
90
|
+
dialect: Dialect;
|
|
91
|
+
sql: {
|
|
92
|
+
readonly text: string;
|
|
93
|
+
readonly values: readonly unknown[];
|
|
94
|
+
};
|
|
95
|
+
mode: ExplainMode;
|
|
96
|
+
/** Warnings the wrapper already collected; the plan's own are appended. */
|
|
97
|
+
warnings?: string[];
|
|
98
|
+
rlsContext?: Readonly<Record<string, unknown>>;
|
|
99
|
+
requireRepresentativeContext?: boolean;
|
|
100
|
+
maxNodes?: number;
|
|
101
|
+
includeLiterals?: boolean;
|
|
102
|
+
}): Promise<QueryPlanReport>;
|
|
67
103
|
/**
|
|
68
104
|
* Take a plan for one ORM operation, built through the same pure planning path
|
|
69
105
|
* `previewOperation` uses. Multi-statement and data-dependent flows are refused
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/diagnostics/plan.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAGzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAG/F,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAyB,eAAe,EAAE,MAAM,YAAY,CAAC;AAIlG,oFAAoF;AACpF,eAAO,MAAM,aAAa,EAAE;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;CACwB,CAAC;AAyD/D;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B,GAAG,UAAU,CA+Eb;
|
|
1
|
+
{"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/diagnostics/plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Statement diagnostics — the always-on slow-statement log with an automatic
|
|
3
|
+
* `EXPLAIN` (`ClientOptions.diagnostics`, or `VIBEORM_DIAGNOSTICS` for a run).
|
|
4
|
+
*
|
|
5
|
+
* What it is for: an agent or a developer switches ONE option on and every
|
|
6
|
+
* statement over a threshold shows up in the sink with its duration and, on
|
|
7
|
+
* PostgreSQL, a one-line plan summary. No hand replay, no separate CLI run.
|
|
8
|
+
*
|
|
9
|
+
* What it must never do:
|
|
10
|
+
*
|
|
11
|
+
* - delay the caller: the report is built after the statement resolved and
|
|
12
|
+
* the EXPLAIN runs in a macrotask AFTER the caller's promise has settled;
|
|
13
|
+
* - run on the caller's connection: the EXPLAIN takes its own pooled
|
|
14
|
+
* connection through the adapter's `transaction()`; a statement that ran
|
|
15
|
+
* inside `$transaction` is reported with `explainSkipped: "in-transaction"`;
|
|
16
|
+
* - execute a write: `analyze` re-executes the statement, so only single
|
|
17
|
+
* read statements qualify ({@link isExecutableRead}), inside a `READ ONLY`
|
|
18
|
+
* transaction — defence in depth, not a proof of safety;
|
|
19
|
+
* - fail the caller: a failing EXPLAIN or a throwing sink is reported (or
|
|
20
|
+
* swallowed), never propagated;
|
|
21
|
+
* - leave a statement unawaited: outstanding explains are tracked, and
|
|
22
|
+
* `$disconnect()` waits for them — bounded, so a wedged EXPLAIN cannot hang
|
|
23
|
+
* shutdown.
|
|
24
|
+
*/
|
|
25
|
+
import type { DatabaseAdapter } from "../adapter.ts";
|
|
26
|
+
import type { SqlDialect } from "@vibeorm/sql";
|
|
27
|
+
import type { ExplainMode, ParsedPlan } from "./types.ts";
|
|
28
|
+
/** `off` logs duration only; `estimate` adds `EXPLAIN`; `analyze` adds `EXPLAIN (ANALYZE, BUFFERS)` — which EXECUTES the statement again. */
|
|
29
|
+
export type StatementExplainMode = "off" | ExplainMode;
|
|
30
|
+
/** Why a report carries no plan. */
|
|
31
|
+
export type ExplainSkipReason = "not-a-read" | "dialect" | "in-transaction" | "error";
|
|
32
|
+
/** `ClientOptions.diagnostics`. */
|
|
33
|
+
export type StatementDiagnosticsOptions = {
|
|
34
|
+
/** Statements slower than this (ms) are reported. Default 0 = every statement. */
|
|
35
|
+
readonly slowerThanMs?: number;
|
|
36
|
+
/**
|
|
37
|
+
* `"off"` (default) logs duration only; `"estimate"` adds `EXPLAIN (FORMAT
|
|
38
|
+
* JSON)`; `"analyze"` adds `EXPLAIN (ANALYZE, BUFFERS, FORMAT JSON)` — which
|
|
39
|
+
* EXECUTES the statement again. PostgreSQL and PGlite only; read statements
|
|
40
|
+
* only; never inside a transaction.
|
|
41
|
+
*/
|
|
42
|
+
readonly explain?: StatementExplainMode;
|
|
43
|
+
/** Where reports go. Default: `console.warn`, one line per statement. */
|
|
44
|
+
readonly sink?: (report: StatementDiagnostic) => void;
|
|
45
|
+
/** Bound literals in plan text are redacted unless true. */
|
|
46
|
+
readonly showLiterals?: boolean;
|
|
47
|
+
};
|
|
48
|
+
/** The plan half of a report — the one-liner plus the parsed tree it came from. */
|
|
49
|
+
export type StatementDiagnosticPlan = {
|
|
50
|
+
/** Root node, execution ms, the hottest loop and buffers — what an agent reads first. */
|
|
51
|
+
readonly summary: string;
|
|
52
|
+
readonly nodes: ParsedPlan;
|
|
53
|
+
readonly executionMs?: number;
|
|
54
|
+
readonly planningMs?: number;
|
|
55
|
+
/** Shared buffer hits at the root, `analyze` only. */
|
|
56
|
+
readonly buffersShared?: number;
|
|
57
|
+
/** Every node that ran more than once, hottest first. */
|
|
58
|
+
readonly loops?: readonly {
|
|
59
|
+
readonly node: string;
|
|
60
|
+
readonly loops: number;
|
|
61
|
+
readonly rows: number;
|
|
62
|
+
}[];
|
|
63
|
+
};
|
|
64
|
+
/** One reported statement. */
|
|
65
|
+
export type StatementDiagnostic = {
|
|
66
|
+
readonly model: string | null;
|
|
67
|
+
readonly method: string;
|
|
68
|
+
readonly text: string;
|
|
69
|
+
readonly durationMs: number;
|
|
70
|
+
readonly parameterCount: number;
|
|
71
|
+
readonly inTransaction: boolean;
|
|
72
|
+
readonly plan?: StatementDiagnosticPlan;
|
|
73
|
+
readonly explainSkipped?: ExplainSkipReason;
|
|
74
|
+
/** The `VibeError` code when `explainSkipped` is `"error"`. */
|
|
75
|
+
readonly explainError?: string;
|
|
76
|
+
};
|
|
77
|
+
/** Every one of these is a bound or a default, not a preference. */
|
|
78
|
+
export declare const STATEMENT_DIAGNOSTICS_DEFAULTS: {
|
|
79
|
+
readonly slowerThanMs: number;
|
|
80
|
+
readonly explain: StatementExplainMode;
|
|
81
|
+
/** Server-side statement timeout for the EXPLAIN where the adapter can enforce one, and the bound `$disconnect()` waits for outstanding explains. */
|
|
82
|
+
readonly explainTimeoutMs: number;
|
|
83
|
+
/** `analyze` below this threshold re-executes (nearly) every read; the client warns once. */
|
|
84
|
+
readonly analyzeWarnBelowMs: number;
|
|
85
|
+
readonly envVariable: string;
|
|
86
|
+
};
|
|
87
|
+
/** The option with every default applied. */
|
|
88
|
+
export type ResolvedStatementDiagnostics = {
|
|
89
|
+
readonly slowerThanMs: number;
|
|
90
|
+
readonly explain: StatementExplainMode;
|
|
91
|
+
readonly sink: (report: StatementDiagnostic) => void;
|
|
92
|
+
readonly showLiterals: boolean;
|
|
93
|
+
/** True when the configuration came (at least partly) from the environment. */
|
|
94
|
+
readonly fromEnvironment: boolean;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Parse `VIBEORM_DIAGNOSTICS=<explain>[:<slowerThanMs>]` — e.g. `analyze:5`,
|
|
98
|
+
* `estimate`, `off:20`. An empty or unset variable means "not configured".
|
|
99
|
+
*
|
|
100
|
+
* @throws VibeError `VIBE_CONFIG` on anything else — a typo must not silently
|
|
101
|
+
* run a session without the diagnostics the operator thinks are on.
|
|
102
|
+
*/
|
|
103
|
+
export declare function parseDiagnosticsEnv(params: {
|
|
104
|
+
value: string | undefined;
|
|
105
|
+
}): {
|
|
106
|
+
explain: StatementExplainMode;
|
|
107
|
+
slowerThanMs: number;
|
|
108
|
+
} | undefined;
|
|
109
|
+
/** The default sink: one `console.warn` line per statement. */
|
|
110
|
+
export declare function formatStatementDiagnostic(params: {
|
|
111
|
+
report: StatementDiagnostic;
|
|
112
|
+
}): string;
|
|
113
|
+
/**
|
|
114
|
+
* Merge the explicit option over the environment switch. Returns `undefined`
|
|
115
|
+
* when neither is present — the client then installs NO hook at all.
|
|
116
|
+
*
|
|
117
|
+
* @throws VibeError `VIBE_CONFIG` on an invalid mode, threshold or env value.
|
|
118
|
+
*/
|
|
119
|
+
export declare function resolveStatementDiagnostics(params: {
|
|
120
|
+
options: StatementDiagnosticsOptions | undefined;
|
|
121
|
+
env: string | undefined;
|
|
122
|
+
}): ResolvedStatementDiagnostics | undefined;
|
|
123
|
+
/**
|
|
124
|
+
* Turn a parsed plan into the one line an agent needs: root node type,
|
|
125
|
+
* execution ms (or the planner's cost units for an estimate), the node with
|
|
126
|
+
* the most loops and its loops × rows, and shared buffer hits.
|
|
127
|
+
*
|
|
128
|
+
* @example
|
|
129
|
+
* "Nested Loop Left Join 60.2 ms · Index Scan on OrderItem loops=12000 rows=2 · shared hit 23,647"
|
|
130
|
+
*/
|
|
131
|
+
export declare function summarizePlan(params: {
|
|
132
|
+
plan: ParsedPlan;
|
|
133
|
+
mode: ExplainMode;
|
|
134
|
+
}): StatementDiagnosticPlan;
|
|
135
|
+
/**
|
|
136
|
+
* What `runStatement` hands the hook after the adapter resolved. `values` are
|
|
137
|
+
* the RENDERED values — the same the `onQuery` observers see, before the
|
|
138
|
+
* client bound scalar lists through `adapter.formatArrayParam` — and `raw`
|
|
139
|
+
* says which adapter path ran them, because the two paths serialize a bare JS
|
|
140
|
+
* array differently (LEARNINGS: ORM-path vs raw-path array params).
|
|
141
|
+
*/
|
|
142
|
+
export type ObservedStatement = {
|
|
143
|
+
readonly model: string | null;
|
|
144
|
+
readonly method: string;
|
|
145
|
+
readonly text: string;
|
|
146
|
+
readonly values: readonly unknown[];
|
|
147
|
+
readonly durationMs: number;
|
|
148
|
+
readonly inTransaction: boolean;
|
|
149
|
+
/** True for `$queryRaw*` / `$executeRaw*` statements (the adapter's raw path). */
|
|
150
|
+
readonly raw: boolean;
|
|
151
|
+
};
|
|
152
|
+
/** One client's diagnostics hook; shared by every transaction engine. */
|
|
153
|
+
export type StatementDiagnosticsHook = {
|
|
154
|
+
readonly config: ResolvedStatementDiagnostics;
|
|
155
|
+
/** Synchronous and non-throwing: filters, reports, and schedules the EXPLAIN. */
|
|
156
|
+
readonly observe: (statement: ObservedStatement) => void;
|
|
157
|
+
/** Wait (bounded) for every scheduled EXPLAIN to settle. */
|
|
158
|
+
readonly flush: () => Promise<void>;
|
|
159
|
+
/** Scheduled explains not yet settled — for tests and shutdown accounting. */
|
|
160
|
+
readonly outstanding: () => number;
|
|
161
|
+
};
|
|
162
|
+
/**
|
|
163
|
+
* Build the hook over the POOL adapter. `adapter` must be the client's root
|
|
164
|
+
* adapter — never a transaction's — because the EXPLAIN takes its own
|
|
165
|
+
* connection through `adapter.transaction()`.
|
|
166
|
+
*/
|
|
167
|
+
export declare function createStatementDiagnostics(params: {
|
|
168
|
+
config: ResolvedStatementDiagnostics;
|
|
169
|
+
adapter: DatabaseAdapter;
|
|
170
|
+
dialect: SqlDialect;
|
|
171
|
+
}): StatementDiagnosticsHook;
|
|
172
|
+
//# sourceMappingURL=statement-diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"statement-diagnostics.d.ts","sourceRoot":"","sources":["../../src/diagnostics/statement-diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAY,MAAM,YAAY,CAAC;AAIpE,6IAA6I;AAC7I,MAAM,MAAM,oBAAoB,GAAG,KAAK,GAAG,WAAW,CAAC;AAEvD,oCAAoC;AACpC,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,SAAS,GAAG,gBAAgB,GAAG,OAAO,CAAC;AAEtF,mCAAmC;AACnC,MAAM,MAAM,2BAA2B,GAAG;IACxC,kFAAkF;IAClF,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC;IACxC,yEAAyE;IACzE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACtD,4DAA4D;IAC5D,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAEF,mFAAmF;AACnF,MAAM,MAAM,uBAAuB,GAAG;IACpC,yFAAyF;IACzF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,sDAAsD;IACtD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,yDAAyD;IACzD,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACtG,CAAC;AAEF,8BAA8B;AAC9B,MAAM,MAAM,mBAAmB,GAAG;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC;IACxC,QAAQ,CAAC,cAAc,CAAC,EAAE,iBAAiB,CAAC;IAC5C,+DAA+D;IAC/D,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAIF,oEAAoE;AACpE,eAAO,MAAM,8BAA8B,EAAE;IAC3C,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IACvC,qJAAqJ;IACrJ,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,6FAA6F;IAC7F,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAO7B,CAAC;AAEH,6CAA6C;AAC7C,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,OAAO,EAAE,oBAAoB,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,IAAI,CAAC;IACrD,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,+EAA+E;IAC/E,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;CACnC,CAAC;AAuBF;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAAG;IAC1E,OAAO,EAAE,oBAAoB,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACtB,GAAG,SAAS,CAsBZ;AAED,+DAA+D;AAC/D,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,mBAAmB,CAAA;CAAE,GAAG,MAAM,CASzF;AAMD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,OAAO,EAAE,2BAA2B,GAAG,SAAS,CAAC;IACjD,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;CACzB,GAAG,4BAA4B,GAAG,SAAS,CA0B3C;AAwBD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GAAG,uBAAuB,CAwBtG;AAID;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,kFAAkF;IAClF,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF,yEAAyE;AACzE,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,CAAC,MAAM,EAAE,4BAA4B,CAAC;IAC9C,iFAAiF;IACjF,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACzD,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,8EAA8E;IAC9E,QAAQ,CAAC,WAAW,EAAE,MAAM,MAAM,CAAC;CACpC,CAAC;AAMF;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IACjD,MAAM,EAAE,4BAA4B,CAAC;IACrC,OAAO,EAAE,eAAe,CAAC;IACzB,OAAO,EAAE,UAAU,CAAC;CACrB,GAAG,wBAAwB,CA6H3B"}
|
package/dist/extensions.d.ts
CHANGED
|
@@ -52,6 +52,13 @@ export type ClientExtensionMount = {
|
|
|
52
52
|
/** Model name (IR name) — required for scope "model". */
|
|
53
53
|
readonly model?: string;
|
|
54
54
|
readonly property: string;
|
|
55
|
+
/**
|
|
56
|
+
* What a READ-ONLY client (`$readOnly`) may call here — baked from the
|
|
57
|
+
* extension's own classification. `true` = the mounted METHOD only reads; a
|
|
58
|
+
* list = the NAMESPACE members that only read. Absent means denied: an
|
|
59
|
+
* extension surface nobody classified never appears on a read-only client.
|
|
60
|
+
*/
|
|
61
|
+
readonly readOnly?: true | readonly string[];
|
|
55
62
|
readonly create: (ctx: ExtensionMountContext) => unknown;
|
|
56
63
|
};
|
|
57
64
|
/** Extension wiring accepted by `createClient`. */
|
package/dist/extensions.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,KAAK,EACV,OAAO,EACP,sBAAsB,EACtB,QAAQ,EACR,aAAa,EACd,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,mBAAmB,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAInF,0DAA0D;AAC1D,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE;QAC7B,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;QAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACzC,kEAAkE;IAClE,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE;QAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,KAAK,OAAO,GAAG,SAAS,CAAC;CAC3B,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC;IACnC,yDAAyD;IACzD,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,qBAAqB,KAAK,OAAO,CAAC;CAC1D,CAAC;AAEF,mDAAmD;AACnD,MAAM,MAAM,uBAAuB,GAAG;IACpC;;;OAGG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IAC9C,+EAA+E;IAC/E,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,sBAAsB,EAAE,CAAC;IACtD,qDAAqD;IACrD,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACnD,CAAC;AAIF;;;;;GAKG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE;IAC9C,QAAQ,EAAE,SAAS,sBAAsB,EAAE,CAAC;IAC5C,SAAS,EAAE,SAAS,aAAa,EAAE,GAAG,SAAS,CAAC;CACjD,GAAG,IAAI,CAkCP;AAID;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE;IAChD,SAAS,EAAE,SAAS,aAAa,EAAE,CAAC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;CACpB,GAAG,WAAW,CAAC,MAAM,EAAE,mBAAmB,CAAC,GAAG,IAAI,CAqClD;AAID,kFAAkF;AAClF,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE;IACjC,OAAO,EAAE,CAAC,UAAU,EAAE;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;KAC7B,KAAK,OAAO,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;CACnD,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEpB,6EAA6E;AAC7E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,SAAS,EAAE,SAAS,aAAa,EAAE,CAAC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;CACpB,GAAG,SAAS,WAAW,EAAE,CAoBzB"}
|
|
1
|
+
{"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../src/extensions.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,9 +4,15 @@
|
|
|
4
4
|
* the query builder and the dynamic client. The typed generated client wraps
|
|
5
5
|
* this surface in P2 proper.
|
|
6
6
|
*/
|
|
7
|
+
export { sql, decode } from "@vibeorm/sql";
|
|
8
|
+
export type { SqlFragment, ResultDecoder, Decoded, ExtendedDateTime } from "@vibeorm/sql";
|
|
9
|
+
export { createSqlModel, sqlProjection } from "./sql.ts";
|
|
10
|
+
export type { SqlColumn, SqlModel, SqlProjectionResult } from "./sql.ts";
|
|
7
11
|
export { toSqlExecutor } from "./adapter.ts";
|
|
8
12
|
export { dbNow, isDbNow } from "./db-now.ts";
|
|
9
13
|
export type { DbNow } from "./db-now.ts";
|
|
14
|
+
export { compileAdvisoryLock } from "./advisory-lock.ts";
|
|
15
|
+
export type { AdvisoryLockMethod, AdvisoryLockOptions } from "./advisory-lock.ts";
|
|
10
16
|
export type { DatabaseAdapter, IsolationLevel, QueryResult, SqlExecutor, TransactionOptions, } from "./adapter.ts";
|
|
11
17
|
export type { AdapterBudgetSupport, StatementTimeoutSupport, TransactionDeadline, TransactionDeadlineEnforcement, TransactionDeadlineSupport, } from "./adapter.ts";
|
|
12
18
|
export { buildRuntimeMeta, generateCuid, generateDefaultValue, generateNanoid, generateUlid, generateUuid, getFieldMeta, getModelMeta, toClientName, } from "./model-meta.ts";
|
|
@@ -15,8 +21,8 @@ export { DIALECT_CODECS, MYSQL_CODECS, POSTGRES_CODECS, SQLITE_CODECS, decodeAgg
|
|
|
15
21
|
export type { CodecTable, ScalarCodec, WireFidelity } from "./codecs.ts";
|
|
16
22
|
export { COUNT_ALIAS, buildQuery, compileOrderBy, compileSelect, compileWhere, lateralColumnAlias, resolveResultShape, } from "./query-builder.ts";
|
|
17
23
|
export type { AggregateKey, AggregateSelection, AggregateSpec, BuilderClientOptions, QueryMethod, QueryPlan, RelationStrategy, } from "./query-builder.ts";
|
|
18
|
-
export { DIAGNOSTIC_THRESHOLDS, PLAN_DEFAULTS, analyzeOperationTelemetry, explainOperation, explainSql, parameterTypeTag, parsePostgresPlan, previewOperation, readWorkloadStatistics, recommendFromPlan, } from "./diagnostics/index.ts";
|
|
19
|
-
export type { DiagnosticFinding, DiagnosticFindingCode, ExplainMode, IndexCandidate, IndexFacts, OperationPreview, ParsedPlan, PlanContext, PlanNode, PreviewLimitation, PreviewLimitationCode, PreviewStatement, QueryPlanReport, SlowOperation, SuspectedPattern, TableFacts, TelemetryDiagnosticReport, WorkloadAvailability, WorkloadReport, WorkloadStatement, } from "./diagnostics/index.ts";
|
|
24
|
+
export { DIAGNOSTIC_THRESHOLDS, PLAN_DEFAULTS, STATEMENT_DIAGNOSTICS_DEFAULTS, analyzeOperationTelemetry, createStatementDiagnostics, explainOnSession, explainOperation, explainSql, formatStatementDiagnostic, isExecutableRead, parameterTypeTag, parseDiagnosticsEnv, parsePostgresPlan, previewOperation, readWorkloadStatistics, recommendFromPlan, resolveStatementDiagnostics, summarizePlan, } from "./diagnostics/index.ts";
|
|
25
|
+
export type { DiagnosticFinding, DiagnosticFindingCode, ExplainMode, ExplainSkipReason, ObservedStatement, ResolvedStatementDiagnostics, StatementDiagnostic, StatementDiagnosticPlan, StatementDiagnosticsHook, StatementDiagnosticsOptions, StatementExplainMode, IndexCandidate, IndexFacts, OperationPreview, ParsedPlan, PlanContext, PlanNode, PreviewLimitation, PreviewLimitationCode, PreviewStatement, QueryPlanReport, SlowOperation, SuspectedPattern, TableFacts, TelemetryDiagnosticReport, WorkloadAvailability, WorkloadReport, WorkloadStatement, } from "./diagnostics/index.ts";
|
|
20
26
|
export { resolveRelationLink, resolveRelationSelection } from "./relation-plan.ts";
|
|
21
27
|
export type { RelationArgs, RelationKind, RelationLink, RelationSelection, RelationTreeNode, } from "./relation-plan.ts";
|
|
22
28
|
export { attachLateralRelations, attachRelations } from "./relation-loader.ts";
|
|
@@ -38,7 +44,9 @@ export type { DefineViewFn, ViewClientShape, ViewDefinition, ViewModelDelegate }
|
|
|
38
44
|
export { assertNativeRlsReady, formatNativeRlsReport, inspectNativeRls, inspectNativeRlsTransaction } from "./rls-readiness.ts";
|
|
39
45
|
export type { NativeRlsCheck, NativeRlsCheckName, NativeRlsCheckStatus, NativeRlsReport, NativeRlsUnsafeObject } from "./rls-readiness.ts";
|
|
40
46
|
export { createClient } from "./client.ts";
|
|
41
|
-
export type { BatchResult, ClientOptions, ClientRow, DynamicClient, ModelDelegate, QueryEvent, } from "./client.ts";
|
|
47
|
+
export type { BatchResult, ClientOptions, ClientRow, DynamicClient, ModelDelegate, QueryEvent, ReadOnlyClient, ReadOnlyModelDelegate, } from "./client.ts";
|
|
48
|
+
export { CLIENT_MEMBER_ACCESS, DELEGATE_METHOD_ACCESS, READ_DELEGATE_METHODS, WRITE_DELEGATE_METHODS, attachReadOnly, clientMemberAccess, delegateMethodAccess, inheritReadOnly, readOnlyRefusal, } from "./read-only.ts";
|
|
49
|
+
export type { ClientMemberAccess, DelegateMethodAccess, LazyOperationBridge, } from "./read-only.ts";
|
|
42
50
|
export { KEYSET_MAX_PAGE_SIZE, KEYSET_TOKEN_PREFIX, KEYSET_TOKEN_VERSION, compileKeysetOrderPlan, decodeKeysetToken, encodeKeysetToken, keysetRowIsAfter, keysetRowValues, } from "./keyset.ts";
|
|
43
51
|
export type { KeysetDirection, KeysetNulls, KeysetOrderInput, KeysetOrderKey, KeysetOrderPlan, KeysetTimestampPrecision, KeysetValueTag, } from "./keyset.ts";
|
|
44
52
|
export { iterateKeyset } from "./keyset-iterator.ts";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE7C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|