@atscript/db 0.1.161 → 0.1.162
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/agg.cjs +1 -1
- package/dist/agg.d.cts +1 -1
- package/dist/agg.d.mts +1 -1
- package/dist/agg.mjs +1 -1
- package/dist/{aggregate-fns-B_sgl4mB.mjs → aggregate-fns-DsS9UQVB.mjs} +1 -1
- package/dist/{aggregate-fns-DFtKAv7Q.cjs → aggregate-fns-DupYzFD7.cjs} +1 -1
- package/dist/{buckets-8mG67Mtw.d.mts → buckets-DUTcrT4Z.d.mts} +475 -57
- package/dist/{buckets-B4T_alUe.d.cts → buckets-_iZV39Z3.d.cts} +475 -57
- package/dist/{column-diff-DpeUbhEI.cjs → column-diff-CZsMGQ_w.cjs} +846 -232
- package/dist/{column-diff-DR1glykD.mjs → column-diff-pdn53AIj.mjs} +829 -233
- package/dist/{validator-B3xlbrWf.d.cts → db-error-B_DRL1E9.d.cts} +18 -89
- package/dist/{validator-B3xlbrWf.d.mts → db-error-B_DRL1E9.d.mts} +18 -89
- package/dist/{db-error-JcfJqqpk.cjs → db-error-DmF1_xrz.cjs} +13 -0
- package/dist/{db-error-eSsQX7rt.mjs → db-error-hraC12B9.mjs} +8 -1
- package/dist/{db-validator-plugin-BWy60OvG.d.cts → db-validator-plugin-wRqMYNBI.d.cts} +6 -0
- package/dist/{db-validator-plugin-BWy60OvG.d.mts → db-validator-plugin-wRqMYNBI.d.mts} +6 -0
- package/dist/{fk-diff-5gX42hBt.d.mts → fk-diff-B5jW68T3.d.cts} +34 -10
- package/dist/{fk-diff-BWdQ7kRZ.d.cts → fk-diff-PhVBYohc.d.mts} +34 -10
- package/dist/index.cjs +12 -11
- package/dist/index.d.cts +24 -21
- package/dist/index.d.mts +24 -21
- package/dist/index.mjs +9 -12
- package/dist/{nested-writer-BOj_c_lI.mjs → nested-writer-ClUX0DB0.mjs} +16 -22
- package/dist/{nested-writer-Bl1SZS7x.cjs → nested-writer-yCy6wGuN.cjs} +16 -22
- package/dist/{object-CtPYTIvy.d.cts → object-Czia_qD4.d.cts} +7 -1
- package/dist/{object-CtPYTIvy.d.mts → object-Czia_qD4.d.mts} +7 -1
- package/dist/{object-Djg28csK.cjs → object-GjsuPNqo.cjs} +19 -0
- package/dist/{object-TkiJQ-Dp.mjs → object-PQ1J8jri.mjs} +14 -1
- package/dist/ops.cjs +6 -21
- package/dist/ops.mjs +6 -21
- package/dist/plugin.cjs +263 -323
- package/dist/plugin.mjs +163 -223
- package/dist/rel.cjs +2 -2
- package/dist/rel.d.cts +3 -3
- package/dist/rel.d.mts +3 -3
- package/dist/rel.mjs +2 -2
- package/dist/{relation-helpers-17_2f5hX.d.mts → relation-helpers-BAEkP4bH.d.cts} +1 -1
- package/dist/{relation-helpers-BLBrLQYi.d.cts → relation-helpers-BSYwxOSA.d.mts} +1 -1
- package/dist/{relation-loader-DeulLrAw.cjs → relation-loader-DujL_Mh9.cjs} +1 -1
- package/dist/{relation-loader-CNBMPfRr.mjs → relation-loader-Qv3LrQ42.mjs} +1 -1
- package/dist/{search-fields-CE8cmj9X.mjs → search-fields-0U0FAFGj.mjs} +47 -1
- package/dist/{search-fields-CT_UZ9fg.cjs → search-fields-Bi1n-pB1.cjs} +64 -0
- package/dist/search-fields-CHqqcC3W.d.cts +30 -0
- package/dist/search-fields-CHqqcC3W.d.mts +30 -0
- package/dist/shared.cjs +42 -26
- package/dist/shared.d.cts +98 -4
- package/dist/shared.d.mts +98 -4
- package/dist/shared.mjs +4 -2
- package/dist/sync.cjs +228 -65
- package/dist/sync.d.cts +41 -5
- package/dist/sync.d.mts +41 -5
- package/dist/sync.mjs +228 -66
- package/dist/validator-BcBtg8yW.d.cts +88 -0
- package/dist/validator-BcBtg8yW.d.mts +88 -0
- package/dist/{validator-B4YDLUkj.cjs → validator-DK9Ijpo7.cjs} +3 -2
- package/dist/{validator-B3fPJjS1.mjs → validator-DuDWsIdQ.mjs} +3 -2
- package/dist/validator.cjs +3 -3
- package/dist/validator.d.cts +4 -3
- package/dist/validator.d.mts +4 -3
- package/dist/validator.mjs +3 -3
- package/dist/{validation-utils-CtLNlBtB.cjs → view-validation-D50KWU7O.cjs} +452 -18
- package/dist/{validation-utils-BGjqc2jU.mjs → view-validation-QbqqXEAM.mjs} +364 -20
- package/package.json +6 -6
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { TAtscriptAnnotatedType, TAtscriptTypeArray, TAtscriptTypeObject, TValidatorPlugin, Validator } from "@atscript/typescript/utils";
|
|
2
|
-
|
|
3
1
|
//#region src/db-error.d.ts
|
|
4
2
|
type DbErrorCode = "CONFLICT" | "FK_VIOLATION" | "NOT_FOUND" | "CASCADE_CYCLE" | "INVALID_QUERY" | "DEPTH_EXCEEDED" | "VERSION_COLUMN_WRITE" | "CAS_EXHAUSTED" | "CAS_MISMATCH" | "ENC_CONFIG_MISSING" | "ENC_KEY_INVALID" | "ENC_NOT_ENCRYPTED" | "ENC_DECRYPT_FAILED" | "ENC_FIELD_FILTER" | "ENC_FIELD_SORT" | "ENC_FIELD_AGG" | "ENC_FIELD_PATCH_OP" | "GEO_INDEX_MISSING" | "GEO_NOT_SUPPORTED" | "FILTER_TYPE_MISMATCH" /** The adapter's `calendarBucketUnits()` lacks the requested unit (moost-db: 400). */ | "BUCKET_NOT_SUPPORTED" /** The engine cannot resolve the bucket's time zone — a store-configuration condition (moost-db: 501). */ | "BUCKET_TZ_UNAVAILABLE" /** A known aggregate function the adapter's `aggregateFns()` lacks (moost-db: 400). @since 0.1.136 */ | "AGG_FN_NOT_SUPPORTED"
|
|
5
3
|
/**
|
|
@@ -33,9 +31,25 @@ type DbErrorCode = "CONFLICT" | "FK_VIOLATION" | "NOT_FOUND" | "CASCADE_CYCLE" |
|
|
|
33
31
|
* PostgreSQL could not serialize the transaction (`40001`: under
|
|
34
32
|
* `REPEATABLE READ` / `SERIALIZABLE`, e.g. a row locked or updated after it
|
|
35
33
|
* changed since the snapshot). The transaction is aborted — retry it whole.
|
|
34
|
+
* Also thrown (since 0.1.162, path `limit`) by a bounded `updateMany` /
|
|
35
|
+
* `deleteMany` whose picked rows concurrent writers kept taking while rows
|
|
36
|
+
* still matched — retry the call (or its transaction).
|
|
36
37
|
* `retryable` is `true`. @since 0.1.153
|
|
37
38
|
*/
|
|
38
|
-
| "SERIALIZATION_FAILURE"
|
|
39
|
+
| "SERIALIZATION_FAILURE"
|
|
40
|
+
/**
|
|
41
|
+
* The adapter cannot take a row lock on a read (`findOne` / `findMany`
|
|
42
|
+
* with `{ lock }`) — MongoDB, or an adapter whose `supportsReadLocks()` is
|
|
43
|
+
* false. Use optimistic concurrency (`$cas`, `withOptimisticRetry`) there.
|
|
44
|
+
*/
|
|
45
|
+
| "LOCK_NOT_SUPPORTED"
|
|
46
|
+
/**
|
|
47
|
+
* The adapter cannot run a transaction at the requested isolation level
|
|
48
|
+
* (`withTransaction(fn, { isolation })`) — e.g. `serializable` on MongoDB,
|
|
49
|
+
* any level on a MongoDB without transactions, or an adapter whose
|
|
50
|
+
* `isolationLevels()` lacks it.
|
|
51
|
+
*/
|
|
52
|
+
| "ISOLATION_NOT_SUPPORTED";
|
|
39
53
|
declare class DbError extends Error {
|
|
40
54
|
readonly code: DbErrorCode;
|
|
41
55
|
readonly errors: Array<{
|
|
@@ -111,89 +125,4 @@ declare function bucketTimeZoneUnavailable(message: string): DbError;
|
|
|
111
125
|
*/
|
|
112
126
|
declare function aggregateExpressionsNotSupported(): DbError;
|
|
113
127
|
//#endregion
|
|
114
|
-
|
|
115
|
-
interface TArrayPatch<A extends readonly unknown[]> {
|
|
116
|
-
$replace?: A;
|
|
117
|
-
$insert?: A;
|
|
118
|
-
$upsert?: A;
|
|
119
|
-
$update?: Array<Partial<TArrayElement<A>>>;
|
|
120
|
-
$remove?: Array<Partial<TArrayElement<A>>>;
|
|
121
|
-
}
|
|
122
|
-
type TArrayElement<ArrayType extends readonly unknown[]> = ArrayType extends ReadonlyArray<infer ElementType> ? ElementType : never;
|
|
123
|
-
/**
|
|
124
|
-
* Maps each property of T into a patch payload:
|
|
125
|
-
* - Array properties become `TArrayPatch<T[K]>`
|
|
126
|
-
* - Non-array properties become `Partial<T[K]>`
|
|
127
|
-
*/
|
|
128
|
-
type TDbPatch<T> = { [K in keyof T]?: T[K] extends Array<infer _> ? TArrayPatch<T[K]> : Partial<T[K]> };
|
|
129
|
-
/**
|
|
130
|
-
* Extracts `@expect.array.key` properties from an array-of-objects type.
|
|
131
|
-
* These keys uniquely identify an element inside the array and are used
|
|
132
|
-
* for `$update`, `$remove`, and `$upsert` operations.
|
|
133
|
-
*
|
|
134
|
-
* @param def - Atscript array type definition.
|
|
135
|
-
* @returns Set of property names marked as keys; empty set if none.
|
|
136
|
-
*/
|
|
137
|
-
declare function getKeyProps(def: TAtscriptAnnotatedType<TAtscriptTypeArray>): Set<string>;
|
|
138
|
-
//#endregion
|
|
139
|
-
//#region src/validator.d.ts
|
|
140
|
-
/** Write operation mode for validator configuration. */
|
|
141
|
-
type ValidatorMode = "insert" | "patch" | "replace";
|
|
142
|
-
/** Singleton db validator plugin — stateless, safe to share across all validators. */
|
|
143
|
-
declare const dbPlugin: TValidatorPlugin;
|
|
144
|
-
/**
|
|
145
|
-
* Builds a validator for a given write mode.
|
|
146
|
-
*
|
|
147
|
-
* Shared between server-side (`AtscriptDbTable`) and client-side (`ClientValidator`).
|
|
148
|
-
* Both use the same plugin, same `replace`, same `partial` logic.
|
|
149
|
-
*
|
|
150
|
-
* @param type - The annotated type to validate against.
|
|
151
|
-
* @param mode - The write operation mode.
|
|
152
|
-
* @param extraPlugins - Additional adapter-specific plugins (prepended before the db plugin).
|
|
153
|
-
* @param opts - `unknownProps` overrides the validator's unknown-property policy
|
|
154
|
-
* (used by db-client's `lenientWrites`, where the served type may be a
|
|
155
|
-
* projection of the full server-side type).
|
|
156
|
-
*/
|
|
157
|
-
declare function buildDbValidator(type: TAtscriptAnnotatedType, mode: ValidatorMode, extraPlugins?: TValidatorPlugin[], opts?: {
|
|
158
|
-
unknownProps?: "strip" | "ignore" | "error";
|
|
159
|
-
}): Validator<any>;
|
|
160
|
-
/**
|
|
161
|
-
* Path-aware `partial` callback for patch/update validation — the single
|
|
162
|
-
* implementation shared by the server's `bulkUpdate` validator and the
|
|
163
|
-
* client's patch preflight:
|
|
164
|
-
*
|
|
165
|
-
* - the root object is partial (a patch names only the fields it touches)
|
|
166
|
-
* - nav-relation subtrees are partial (nested data is validated by its own table)
|
|
167
|
-
* - `@db.patch.strategy "merge"` blocks are partial (the decomposer merges
|
|
168
|
-
* per leaf, so absent keys survive server-side by design)
|
|
169
|
-
*
|
|
170
|
-
* Every other nested object stays strict: non-merge blocks are `$set` as a
|
|
171
|
-
* whole (replace semantics), so their required fields really are required.
|
|
172
|
-
*/
|
|
173
|
-
declare function buildPatchPartial(navPaths: ReadonlySet<string>): (def: TAtscriptAnnotatedType<TAtscriptTypeObject>, path: string) => boolean;
|
|
174
|
-
/** Returns true if the annotated type is a navigation relation (TO/FROM/VIA). */
|
|
175
|
-
declare function isNavRelation(type: TAtscriptAnnotatedType): boolean;
|
|
176
|
-
/**
|
|
177
|
-
* Forces nav fields non-optional so the plugin handles null/undefined checks.
|
|
178
|
-
* The Validator caches replace results internally, so this allocates at most once per type node.
|
|
179
|
-
*/
|
|
180
|
-
declare function forceNavNonOptional(type: TAtscriptAnnotatedType): TAtscriptAnnotatedType;
|
|
181
|
-
/** Result of {@link buildValidationContext}. */
|
|
182
|
-
interface ValidationContext {
|
|
183
|
-
/** Flat map of dotted field paths → annotated types (same shape the server builds). */
|
|
184
|
-
flatMap: Map<string, TAtscriptAnnotatedType>;
|
|
185
|
-
/** Set of field paths that are navigation relations (TO/FROM/VIA). */
|
|
186
|
-
navFields: ReadonlySet<string>;
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Builds a lightweight validation context from a deserialized Atscript type.
|
|
190
|
-
*
|
|
191
|
-
* This is the client-side equivalent of the server's `TableMetadata.build()`,
|
|
192
|
-
* without any adapter-specific processing (physical columns, index resolution, etc.).
|
|
193
|
-
*
|
|
194
|
-
* @param type - A deserialized annotated type (from `deserializeAnnotatedType(meta.type)`).
|
|
195
|
-
* @returns `flatMap` and `navFields` suitable for passing to `createDbValidatorPlugin` via `DbValidationContext`.
|
|
196
|
-
*/
|
|
197
|
-
declare function buildValidationContext(type: TAtscriptAnnotatedType<TAtscriptTypeObject>): ValidationContext;
|
|
198
|
-
//#endregion
|
|
199
|
-
export { aggregateFailure as _, buildValidationContext as a, isRetryableDbError as b, isNavRelation as c, getKeyProps as d, CasExhaustedError as f, aggregateExpressionsNotSupported as g, DbErrorCode as h, buildPatchPartial as i, TArrayPatch as l, DbError as m, ValidatorMode as n, dbPlugin as o, CasMismatchError as p, buildDbValidator as r, forceNavNonOptional as s, ValidationContext as t, TDbPatch as u, bucketTimeZoneUnavailable as v, isConflict as y };
|
|
128
|
+
export { aggregateExpressionsNotSupported as a, isConflict as c, DbErrorCode as i, isRetryableDbError as l, CasMismatchError as n, aggregateFailure as o, DbError as r, bucketTimeZoneUnavailable as s, CasExhaustedError as t };
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { TAtscriptAnnotatedType, TAtscriptTypeArray, TAtscriptTypeObject, TValidatorPlugin, Validator } from "@atscript/typescript/utils";
|
|
2
|
-
|
|
3
1
|
//#region src/db-error.d.ts
|
|
4
2
|
type DbErrorCode = "CONFLICT" | "FK_VIOLATION" | "NOT_FOUND" | "CASCADE_CYCLE" | "INVALID_QUERY" | "DEPTH_EXCEEDED" | "VERSION_COLUMN_WRITE" | "CAS_EXHAUSTED" | "CAS_MISMATCH" | "ENC_CONFIG_MISSING" | "ENC_KEY_INVALID" | "ENC_NOT_ENCRYPTED" | "ENC_DECRYPT_FAILED" | "ENC_FIELD_FILTER" | "ENC_FIELD_SORT" | "ENC_FIELD_AGG" | "ENC_FIELD_PATCH_OP" | "GEO_INDEX_MISSING" | "GEO_NOT_SUPPORTED" | "FILTER_TYPE_MISMATCH" /** The adapter's `calendarBucketUnits()` lacks the requested unit (moost-db: 400). */ | "BUCKET_NOT_SUPPORTED" /** The engine cannot resolve the bucket's time zone — a store-configuration condition (moost-db: 501). */ | "BUCKET_TZ_UNAVAILABLE" /** A known aggregate function the adapter's `aggregateFns()` lacks (moost-db: 400). @since 0.1.136 */ | "AGG_FN_NOT_SUPPORTED"
|
|
5
3
|
/**
|
|
@@ -33,9 +31,25 @@ type DbErrorCode = "CONFLICT" | "FK_VIOLATION" | "NOT_FOUND" | "CASCADE_CYCLE" |
|
|
|
33
31
|
* PostgreSQL could not serialize the transaction (`40001`: under
|
|
34
32
|
* `REPEATABLE READ` / `SERIALIZABLE`, e.g. a row locked or updated after it
|
|
35
33
|
* changed since the snapshot). The transaction is aborted — retry it whole.
|
|
34
|
+
* Also thrown (since 0.1.162, path `limit`) by a bounded `updateMany` /
|
|
35
|
+
* `deleteMany` whose picked rows concurrent writers kept taking while rows
|
|
36
|
+
* still matched — retry the call (or its transaction).
|
|
36
37
|
* `retryable` is `true`. @since 0.1.153
|
|
37
38
|
*/
|
|
38
|
-
| "SERIALIZATION_FAILURE"
|
|
39
|
+
| "SERIALIZATION_FAILURE"
|
|
40
|
+
/**
|
|
41
|
+
* The adapter cannot take a row lock on a read (`findOne` / `findMany`
|
|
42
|
+
* with `{ lock }`) — MongoDB, or an adapter whose `supportsReadLocks()` is
|
|
43
|
+
* false. Use optimistic concurrency (`$cas`, `withOptimisticRetry`) there.
|
|
44
|
+
*/
|
|
45
|
+
| "LOCK_NOT_SUPPORTED"
|
|
46
|
+
/**
|
|
47
|
+
* The adapter cannot run a transaction at the requested isolation level
|
|
48
|
+
* (`withTransaction(fn, { isolation })`) — e.g. `serializable` on MongoDB,
|
|
49
|
+
* any level on a MongoDB without transactions, or an adapter whose
|
|
50
|
+
* `isolationLevels()` lacks it.
|
|
51
|
+
*/
|
|
52
|
+
| "ISOLATION_NOT_SUPPORTED";
|
|
39
53
|
declare class DbError extends Error {
|
|
40
54
|
readonly code: DbErrorCode;
|
|
41
55
|
readonly errors: Array<{
|
|
@@ -111,89 +125,4 @@ declare function bucketTimeZoneUnavailable(message: string): DbError;
|
|
|
111
125
|
*/
|
|
112
126
|
declare function aggregateExpressionsNotSupported(): DbError;
|
|
113
127
|
//#endregion
|
|
114
|
-
|
|
115
|
-
interface TArrayPatch<A extends readonly unknown[]> {
|
|
116
|
-
$replace?: A;
|
|
117
|
-
$insert?: A;
|
|
118
|
-
$upsert?: A;
|
|
119
|
-
$update?: Array<Partial<TArrayElement<A>>>;
|
|
120
|
-
$remove?: Array<Partial<TArrayElement<A>>>;
|
|
121
|
-
}
|
|
122
|
-
type TArrayElement<ArrayType extends readonly unknown[]> = ArrayType extends ReadonlyArray<infer ElementType> ? ElementType : never;
|
|
123
|
-
/**
|
|
124
|
-
* Maps each property of T into a patch payload:
|
|
125
|
-
* - Array properties become `TArrayPatch<T[K]>`
|
|
126
|
-
* - Non-array properties become `Partial<T[K]>`
|
|
127
|
-
*/
|
|
128
|
-
type TDbPatch<T> = { [K in keyof T]?: T[K] extends Array<infer _> ? TArrayPatch<T[K]> : Partial<T[K]> };
|
|
129
|
-
/**
|
|
130
|
-
* Extracts `@expect.array.key` properties from an array-of-objects type.
|
|
131
|
-
* These keys uniquely identify an element inside the array and are used
|
|
132
|
-
* for `$update`, `$remove`, and `$upsert` operations.
|
|
133
|
-
*
|
|
134
|
-
* @param def - Atscript array type definition.
|
|
135
|
-
* @returns Set of property names marked as keys; empty set if none.
|
|
136
|
-
*/
|
|
137
|
-
declare function getKeyProps(def: TAtscriptAnnotatedType<TAtscriptTypeArray>): Set<string>;
|
|
138
|
-
//#endregion
|
|
139
|
-
//#region src/validator.d.ts
|
|
140
|
-
/** Write operation mode for validator configuration. */
|
|
141
|
-
type ValidatorMode = "insert" | "patch" | "replace";
|
|
142
|
-
/** Singleton db validator plugin — stateless, safe to share across all validators. */
|
|
143
|
-
declare const dbPlugin: TValidatorPlugin;
|
|
144
|
-
/**
|
|
145
|
-
* Builds a validator for a given write mode.
|
|
146
|
-
*
|
|
147
|
-
* Shared between server-side (`AtscriptDbTable`) and client-side (`ClientValidator`).
|
|
148
|
-
* Both use the same plugin, same `replace`, same `partial` logic.
|
|
149
|
-
*
|
|
150
|
-
* @param type - The annotated type to validate against.
|
|
151
|
-
* @param mode - The write operation mode.
|
|
152
|
-
* @param extraPlugins - Additional adapter-specific plugins (prepended before the db plugin).
|
|
153
|
-
* @param opts - `unknownProps` overrides the validator's unknown-property policy
|
|
154
|
-
* (used by db-client's `lenientWrites`, where the served type may be a
|
|
155
|
-
* projection of the full server-side type).
|
|
156
|
-
*/
|
|
157
|
-
declare function buildDbValidator(type: TAtscriptAnnotatedType, mode: ValidatorMode, extraPlugins?: TValidatorPlugin[], opts?: {
|
|
158
|
-
unknownProps?: "strip" | "ignore" | "error";
|
|
159
|
-
}): Validator<any>;
|
|
160
|
-
/**
|
|
161
|
-
* Path-aware `partial` callback for patch/update validation — the single
|
|
162
|
-
* implementation shared by the server's `bulkUpdate` validator and the
|
|
163
|
-
* client's patch preflight:
|
|
164
|
-
*
|
|
165
|
-
* - the root object is partial (a patch names only the fields it touches)
|
|
166
|
-
* - nav-relation subtrees are partial (nested data is validated by its own table)
|
|
167
|
-
* - `@db.patch.strategy "merge"` blocks are partial (the decomposer merges
|
|
168
|
-
* per leaf, so absent keys survive server-side by design)
|
|
169
|
-
*
|
|
170
|
-
* Every other nested object stays strict: non-merge blocks are `$set` as a
|
|
171
|
-
* whole (replace semantics), so their required fields really are required.
|
|
172
|
-
*/
|
|
173
|
-
declare function buildPatchPartial(navPaths: ReadonlySet<string>): (def: TAtscriptAnnotatedType<TAtscriptTypeObject>, path: string) => boolean;
|
|
174
|
-
/** Returns true if the annotated type is a navigation relation (TO/FROM/VIA). */
|
|
175
|
-
declare function isNavRelation(type: TAtscriptAnnotatedType): boolean;
|
|
176
|
-
/**
|
|
177
|
-
* Forces nav fields non-optional so the plugin handles null/undefined checks.
|
|
178
|
-
* The Validator caches replace results internally, so this allocates at most once per type node.
|
|
179
|
-
*/
|
|
180
|
-
declare function forceNavNonOptional(type: TAtscriptAnnotatedType): TAtscriptAnnotatedType;
|
|
181
|
-
/** Result of {@link buildValidationContext}. */
|
|
182
|
-
interface ValidationContext {
|
|
183
|
-
/** Flat map of dotted field paths → annotated types (same shape the server builds). */
|
|
184
|
-
flatMap: Map<string, TAtscriptAnnotatedType>;
|
|
185
|
-
/** Set of field paths that are navigation relations (TO/FROM/VIA). */
|
|
186
|
-
navFields: ReadonlySet<string>;
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Builds a lightweight validation context from a deserialized Atscript type.
|
|
190
|
-
*
|
|
191
|
-
* This is the client-side equivalent of the server's `TableMetadata.build()`,
|
|
192
|
-
* without any adapter-specific processing (physical columns, index resolution, etc.).
|
|
193
|
-
*
|
|
194
|
-
* @param type - A deserialized annotated type (from `deserializeAnnotatedType(meta.type)`).
|
|
195
|
-
* @returns `flatMap` and `navFields` suitable for passing to `createDbValidatorPlugin` via `DbValidationContext`.
|
|
196
|
-
*/
|
|
197
|
-
declare function buildValidationContext(type: TAtscriptAnnotatedType<TAtscriptTypeObject>): ValidationContext;
|
|
198
|
-
//#endregion
|
|
199
|
-
export { aggregateFailure as _, buildValidationContext as a, isRetryableDbError as b, isNavRelation as c, getKeyProps as d, CasExhaustedError as f, aggregateExpressionsNotSupported as g, DbErrorCode as h, buildPatchPartial as i, TArrayPatch as l, DbError as m, ValidatorMode as n, dbPlugin as o, CasMismatchError as p, buildDbValidator as r, forceNavNonOptional as s, ValidationContext as t, TDbPatch as u, bucketTimeZoneUnavailable as v, isConflict as y };
|
|
128
|
+
export { aggregateExpressionsNotSupported as a, isConflict as c, DbErrorCode as i, isRetryableDbError as l, CasMismatchError as n, aggregateFailure as o, DbError as r, bucketTimeZoneUnavailable as s, CasExhaustedError as t };
|
|
@@ -37,6 +37,13 @@ function isRetryableDbError(error) {
|
|
|
37
37
|
function isConflict(error) {
|
|
38
38
|
return error instanceof DbError && error.code === "CONFLICT";
|
|
39
39
|
}
|
|
40
|
+
/** @internal An `INVALID_QUERY` error with a single `{ path, message }` entry. */
|
|
41
|
+
function invalidQuery(path, message) {
|
|
42
|
+
return new DbError("INVALID_QUERY", [{
|
|
43
|
+
path,
|
|
44
|
+
message
|
|
45
|
+
}]);
|
|
46
|
+
}
|
|
40
47
|
/** @internal The error every handle of a closed `DbSpace` throws. */
|
|
41
48
|
function spaceClosedError() {
|
|
42
49
|
return new DbError("SPACE_CLOSED", [{
|
|
@@ -180,6 +187,12 @@ Object.defineProperty(exports, "bucketTimeZoneUnavailable", {
|
|
|
180
187
|
return bucketTimeZoneUnavailable;
|
|
181
188
|
}
|
|
182
189
|
});
|
|
190
|
+
Object.defineProperty(exports, "invalidQuery", {
|
|
191
|
+
enumerable: true,
|
|
192
|
+
get: function() {
|
|
193
|
+
return invalidQuery;
|
|
194
|
+
}
|
|
195
|
+
});
|
|
183
196
|
Object.defineProperty(exports, "isConflict", {
|
|
184
197
|
enumerable: true,
|
|
185
198
|
get: function() {
|
|
@@ -37,6 +37,13 @@ function isRetryableDbError(error) {
|
|
|
37
37
|
function isConflict(error) {
|
|
38
38
|
return error instanceof DbError && error.code === "CONFLICT";
|
|
39
39
|
}
|
|
40
|
+
/** @internal An `INVALID_QUERY` error with a single `{ path, message }` entry. */
|
|
41
|
+
function invalidQuery(path, message) {
|
|
42
|
+
return new DbError("INVALID_QUERY", [{
|
|
43
|
+
path,
|
|
44
|
+
message
|
|
45
|
+
}]);
|
|
46
|
+
}
|
|
40
47
|
/** @internal The error every handle of a closed `DbSpace` throws. */
|
|
41
48
|
function spaceClosedError() {
|
|
42
49
|
return new DbError("SPACE_CLOSED", [{
|
|
@@ -138,4 +145,4 @@ function aggregateExpressionsNotSupported() {
|
|
|
138
145
|
}]);
|
|
139
146
|
}
|
|
140
147
|
//#endregion
|
|
141
|
-
export { aggregateExpressionsNotSupported as a,
|
|
148
|
+
export { aggregateExpressionsNotSupported as a, invalidQuery as c, spaceClosedError as d, DepthLimitExceededError as i, isConflict as l, CasMismatchError as n, aggregateFailure as o, DbError as r, bucketTimeZoneUnavailable as s, CasExhaustedError as t, isRetryableDbError as u };
|
|
@@ -5,6 +5,12 @@ interface DbValidationContext {
|
|
|
5
5
|
mode: "insert" | "replace" | "patch";
|
|
6
6
|
/** Flat map from the table — used to check if an array is a top-level array. */
|
|
7
7
|
flatMap?: Map<string, TAtscriptAnnotatedType>;
|
|
8
|
+
/**
|
|
9
|
+
* The write picks its rows by a filter, not by the payload's primary key
|
|
10
|
+
* (`replaceMany(filter, data)`, since 0.1.162): a missing top-level
|
|
11
|
+
* `@meta.id` is accepted in `replace` mode.
|
|
12
|
+
*/
|
|
13
|
+
keyless?: boolean;
|
|
8
14
|
/** Precomputed nav field names — used to skip field-op validation inside TO/FROM/VIA relations. */
|
|
9
15
|
navFields?: ReadonlySet<string>;
|
|
10
16
|
/**
|
|
@@ -5,6 +5,12 @@ interface DbValidationContext {
|
|
|
5
5
|
mode: "insert" | "replace" | "patch";
|
|
6
6
|
/** Flat map from the table — used to check if an array is a top-level array. */
|
|
7
7
|
flatMap?: Map<string, TAtscriptAnnotatedType>;
|
|
8
|
+
/**
|
|
9
|
+
* The write picks its rows by a filter, not by the payload's primary key
|
|
10
|
+
* (`replaceMany(filter, data)`, since 0.1.162): a missing top-level
|
|
11
|
+
* `@meta.id` is accepted in `replace` mode.
|
|
12
|
+
*/
|
|
13
|
+
keyless?: boolean;
|
|
8
14
|
/** Precomputed nav field names — used to skip field-op validation inside TO/FROM/VIA relations. */
|
|
9
15
|
navFields?: ReadonlySet<string>;
|
|
10
16
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { B as TDbCollation, Bn as AtscriptDbReadable, Et as TExistingTableOption, G as TDbFieldMeta, H as TDbDefaultValue, K as TDbForeignKey, On as AtscriptQueryFieldRef, St as TDerivedColumn, V as TDbDefaultFn, dt as TDbStorageType, j as TColumnDiff, kn as AtscriptQueryNode, wt as TExistingColumn, yn as AtscriptDbView } from "./buckets-_iZV39Z3.cjs";
|
|
2
2
|
|
|
3
3
|
//#region src/schema/schema-hash.d.ts
|
|
4
4
|
interface TFieldSnapshot {
|
|
@@ -208,6 +208,36 @@ declare function snapshotToExistingTableOptions(snapshot: TTableSnapshot): TExis
|
|
|
208
208
|
* @since 0.1.137
|
|
209
209
|
*/
|
|
210
210
|
declare function isColumnTypeChanged(existingType: string, expectedType: string): boolean;
|
|
211
|
+
/**
|
|
212
|
+
* Whether a live column default (as the adapter's introspection normalized
|
|
213
|
+
* it) and a model default (`serializeDefaultValue`) denote the same value for
|
|
214
|
+
* `field` — compared in a canonical, type-aware form, because the DDL writes a
|
|
215
|
+
* literal that differs from the annotation text and the engine reformats it
|
|
216
|
+
* again: booleans as `1` / `0` (`true` / `1` → `1`), numbers numerically
|
|
217
|
+
* (`1.0` = `1`, a DECIMAL's `0.00` = `0`), JSON-stored values as parsed,
|
|
218
|
+
* key-sorted JSON (`{"a": 1}` = `{"a":1}`). With a column type `liveType`
|
|
219
|
+
* of a fixed scale (`DECIMAL(10,2)`, `NUMERIC(8,3)`) — the type the column
|
|
220
|
+
* has once synced, i.e. the model's — a model value is also the value the
|
|
221
|
+
* column stores for it (`2.345` = `2.35`).
|
|
222
|
+
* Function defaults (`fn:now`, `fn:uuid`, …) and every other value compare as
|
|
223
|
+
* strings. Exported for adapters that must agree with schema sync.
|
|
224
|
+
* @since 0.1.162
|
|
225
|
+
*/
|
|
226
|
+
declare function sameDefaultValue(field: Pick<TDbFieldMeta, "designType" | "storage">, live: string | undefined, desired: string | undefined, liveType?: string): boolean;
|
|
227
|
+
/** Options of {@link computeColumnDiff}. */
|
|
228
|
+
interface TColumnDiffOptions {
|
|
229
|
+
/**
|
|
230
|
+
* The table's stored snapshot (since 0.1.141) — the baseline a derived
|
|
231
|
+
* column's expression is compared with (the engine normalizes the
|
|
232
|
+
* expression it stores, so the live column cannot be). Without one, only a
|
|
233
|
+
* kind or type drift is seen.
|
|
234
|
+
*/
|
|
235
|
+
snapshot?: TTableSnapshot | null;
|
|
236
|
+
/** The adapter's `nativeDefaultFns()`: a column missing such a default drifts. */
|
|
237
|
+
nativeDefaultFns?: ReadonlySet<TDbDefaultFn>;
|
|
238
|
+
/** The adapter's `reportedDefault` hook (since 0.1.162): a live default equal to it is unchanged. */
|
|
239
|
+
reportedDefault?: (desired: string, field: TDbFieldMeta) => string;
|
|
240
|
+
}
|
|
211
241
|
/**
|
|
212
242
|
* Computes the difference between desired schema fields and existing database columns.
|
|
213
243
|
*
|
|
@@ -218,15 +248,9 @@ declare function isColumnTypeChanged(existingType: string, expectedType: string)
|
|
|
218
248
|
* Receives the full field meta (design type, annotations, PK status, etc.)
|
|
219
249
|
* so adapters can produce context-aware types (e.g., `VARCHAR(255)` from maxLength).
|
|
220
250
|
* Required for type change detection.
|
|
221
|
-
* @param opts
|
|
222
|
-
* derived column's expression is compared with (the engine normalizes
|
|
223
|
-
* the expression it stores, so the live column cannot be). Without
|
|
224
|
-
* one, only a kind or type drift is seen.
|
|
251
|
+
* @param opts - See {@link TColumnDiffOptions}.
|
|
225
252
|
*/
|
|
226
|
-
declare function computeColumnDiff(desired: readonly TDbFieldMeta[], existing: TExistingColumn[], typeMapper?: (field: TDbFieldMeta) => string, opts?:
|
|
227
|
-
snapshot?: TTableSnapshot | null;
|
|
228
|
-
nativeDefaultFns?: ReadonlySet<TDbDefaultFn>;
|
|
229
|
-
}): TColumnDiff;
|
|
253
|
+
declare function computeColumnDiff(desired: readonly TDbFieldMeta[], existing: TExistingColumn[], typeMapper?: (field: TDbFieldMeta) => string, opts?: TColumnDiffOptions): TColumnDiff;
|
|
230
254
|
//#endregion
|
|
231
255
|
//#region src/schema/fk-diff.d.ts
|
|
232
256
|
/**
|
|
@@ -263,4 +287,4 @@ declare function computeForeignKeyDiff(desired: ReadonlyMap<string, TDbForeignKe
|
|
|
263
287
|
/** Whether the FK diff contains any changes. */
|
|
264
288
|
declare function hasForeignKeyChanges(diff: TForeignKeyDiff): boolean;
|
|
265
289
|
//#endregion
|
|
266
|
-
export {
|
|
290
|
+
export { snapshotToExistingTableOptions as S, computeSchemaHash as _, hasForeignKeyChanges as a, computeViewSnapshot as b, isColumnTypeChanged as c, TForeignKeySnapshot as d, TTableSnapshot as f, canonicalizeQueryNode as g, TViewSnapshot as h, fkKey as i, sameDefaultValue as l, TViewJoinSnapshot as m, computeForeignKeyDiff as n, TColumnDiffOptions as o, TViewColumnSnapshot as p, fkColumns as r, computeColumnDiff as s, TForeignKeyDiff as t, TFieldSnapshot as u, computeTableHash as v, snapshotToExistingColumns as x, computeTableSnapshot as y };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { B as TDbCollation, Bn as AtscriptDbReadable, Et as TExistingTableOption, G as TDbFieldMeta, H as TDbDefaultValue, K as TDbForeignKey, On as AtscriptQueryFieldRef, St as TDerivedColumn, V as TDbDefaultFn, dt as TDbStorageType, j as TColumnDiff, kn as AtscriptQueryNode, wt as TExistingColumn, yn as AtscriptDbView } from "./buckets-DUTcrT4Z.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/schema/schema-hash.d.ts
|
|
4
4
|
interface TFieldSnapshot {
|
|
@@ -208,6 +208,36 @@ declare function snapshotToExistingTableOptions(snapshot: TTableSnapshot): TExis
|
|
|
208
208
|
* @since 0.1.137
|
|
209
209
|
*/
|
|
210
210
|
declare function isColumnTypeChanged(existingType: string, expectedType: string): boolean;
|
|
211
|
+
/**
|
|
212
|
+
* Whether a live column default (as the adapter's introspection normalized
|
|
213
|
+
* it) and a model default (`serializeDefaultValue`) denote the same value for
|
|
214
|
+
* `field` — compared in a canonical, type-aware form, because the DDL writes a
|
|
215
|
+
* literal that differs from the annotation text and the engine reformats it
|
|
216
|
+
* again: booleans as `1` / `0` (`true` / `1` → `1`), numbers numerically
|
|
217
|
+
* (`1.0` = `1`, a DECIMAL's `0.00` = `0`), JSON-stored values as parsed,
|
|
218
|
+
* key-sorted JSON (`{"a": 1}` = `{"a":1}`). With a column type `liveType`
|
|
219
|
+
* of a fixed scale (`DECIMAL(10,2)`, `NUMERIC(8,3)`) — the type the column
|
|
220
|
+
* has once synced, i.e. the model's — a model value is also the value the
|
|
221
|
+
* column stores for it (`2.345` = `2.35`).
|
|
222
|
+
* Function defaults (`fn:now`, `fn:uuid`, …) and every other value compare as
|
|
223
|
+
* strings. Exported for adapters that must agree with schema sync.
|
|
224
|
+
* @since 0.1.162
|
|
225
|
+
*/
|
|
226
|
+
declare function sameDefaultValue(field: Pick<TDbFieldMeta, "designType" | "storage">, live: string | undefined, desired: string | undefined, liveType?: string): boolean;
|
|
227
|
+
/** Options of {@link computeColumnDiff}. */
|
|
228
|
+
interface TColumnDiffOptions {
|
|
229
|
+
/**
|
|
230
|
+
* The table's stored snapshot (since 0.1.141) — the baseline a derived
|
|
231
|
+
* column's expression is compared with (the engine normalizes the
|
|
232
|
+
* expression it stores, so the live column cannot be). Without one, only a
|
|
233
|
+
* kind or type drift is seen.
|
|
234
|
+
*/
|
|
235
|
+
snapshot?: TTableSnapshot | null;
|
|
236
|
+
/** The adapter's `nativeDefaultFns()`: a column missing such a default drifts. */
|
|
237
|
+
nativeDefaultFns?: ReadonlySet<TDbDefaultFn>;
|
|
238
|
+
/** The adapter's `reportedDefault` hook (since 0.1.162): a live default equal to it is unchanged. */
|
|
239
|
+
reportedDefault?: (desired: string, field: TDbFieldMeta) => string;
|
|
240
|
+
}
|
|
211
241
|
/**
|
|
212
242
|
* Computes the difference between desired schema fields and existing database columns.
|
|
213
243
|
*
|
|
@@ -218,15 +248,9 @@ declare function isColumnTypeChanged(existingType: string, expectedType: string)
|
|
|
218
248
|
* Receives the full field meta (design type, annotations, PK status, etc.)
|
|
219
249
|
* so adapters can produce context-aware types (e.g., `VARCHAR(255)` from maxLength).
|
|
220
250
|
* Required for type change detection.
|
|
221
|
-
* @param opts
|
|
222
|
-
* derived column's expression is compared with (the engine normalizes
|
|
223
|
-
* the expression it stores, so the live column cannot be). Without
|
|
224
|
-
* one, only a kind or type drift is seen.
|
|
251
|
+
* @param opts - See {@link TColumnDiffOptions}.
|
|
225
252
|
*/
|
|
226
|
-
declare function computeColumnDiff(desired: readonly TDbFieldMeta[], existing: TExistingColumn[], typeMapper?: (field: TDbFieldMeta) => string, opts?:
|
|
227
|
-
snapshot?: TTableSnapshot | null;
|
|
228
|
-
nativeDefaultFns?: ReadonlySet<TDbDefaultFn>;
|
|
229
|
-
}): TColumnDiff;
|
|
253
|
+
declare function computeColumnDiff(desired: readonly TDbFieldMeta[], existing: TExistingColumn[], typeMapper?: (field: TDbFieldMeta) => string, opts?: TColumnDiffOptions): TColumnDiff;
|
|
230
254
|
//#endregion
|
|
231
255
|
//#region src/schema/fk-diff.d.ts
|
|
232
256
|
/**
|
|
@@ -263,4 +287,4 @@ declare function computeForeignKeyDiff(desired: ReadonlyMap<string, TDbForeignKe
|
|
|
263
287
|
/** Whether the FK diff contains any changes. */
|
|
264
288
|
declare function hasForeignKeyChanges(diff: TForeignKeyDiff): boolean;
|
|
265
289
|
//#endregion
|
|
266
|
-
export {
|
|
290
|
+
export { snapshotToExistingTableOptions as S, computeSchemaHash as _, hasForeignKeyChanges as a, computeViewSnapshot as b, isColumnTypeChanged as c, TForeignKeySnapshot as d, TTableSnapshot as f, canonicalizeQueryNode as g, TViewSnapshot as h, fkKey as i, sameDefaultValue as l, TViewJoinSnapshot as m, computeForeignKeyDiff as n, TColumnDiffOptions as o, TViewColumnSnapshot as p, fkColumns as r, computeColumnDiff as s, TForeignKeyDiff as t, TFieldSnapshot as u, computeTableHash as v, snapshotToExistingColumns as x, computeTableSnapshot as y };
|
package/dist/index.cjs
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_db_error = require("./db-error-
|
|
3
|
-
const require_column_diff = require("./column-diff-
|
|
4
|
-
const require_aggregate_fns = require("./aggregate-fns-
|
|
5
|
-
const require_nested_writer = require("./nested-writer-
|
|
6
|
-
const require_validator = require("./validator-
|
|
7
|
-
const require_search_fields = require("./search-fields-
|
|
8
|
-
const require_object = require("./object-
|
|
2
|
+
const require_db_error = require("./db-error-DmF1_xrz.cjs");
|
|
3
|
+
const require_column_diff = require("./column-diff-CZsMGQ_w.cjs");
|
|
4
|
+
const require_aggregate_fns = require("./aggregate-fns-DupYzFD7.cjs");
|
|
5
|
+
const require_nested_writer = require("./nested-writer-yCy6wGuN.cjs");
|
|
6
|
+
const require_validator = require("./validator-DK9Ijpo7.cjs");
|
|
7
|
+
const require_search_fields = require("./search-fields-Bi1n-pB1.cjs");
|
|
8
|
+
const require_object = require("./object-GjsuPNqo.cjs");
|
|
9
9
|
const require_consts = require("./consts-BzRfCcH2.cjs");
|
|
10
10
|
const require_ops = require("./ops.cjs");
|
|
11
11
|
let _atscript_typescript_utils = require("@atscript/typescript/utils");
|
|
@@ -175,10 +175,7 @@ var DbEncryption = class {
|
|
|
175
175
|
*/
|
|
176
176
|
async function withOptimisticRetry(table, filter, mutator, opts) {
|
|
177
177
|
const versionColumn = table.versionColumn;
|
|
178
|
-
if (versionColumn === void 0) throw
|
|
179
|
-
path: "$cas",
|
|
180
|
-
message: `withOptimisticRetry: table "${table.tableName}" has no @db.column.version column — CAS cannot be applied`
|
|
181
|
-
}]);
|
|
178
|
+
if (versionColumn === void 0) throw require_db_error.invalidQuery("$cas", `withOptimisticRetry: table "${table.tableName}" has no @db.column.version column — CAS cannot be applied`);
|
|
182
179
|
const maxAttempts = opts?.maxAttempts ?? 5;
|
|
183
180
|
let lastSeenVersion;
|
|
184
181
|
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
@@ -573,6 +570,7 @@ exports.$upsert = require_ops.$upsert;
|
|
|
573
570
|
exports.ADAPTER_FILTER_REASON = require_column_diff.ADAPTER_FILTER_REASON;
|
|
574
571
|
exports.ALL_AGGREGATE_FNS = require_aggregate_fns.ALL_AGGREGATE_FNS;
|
|
575
572
|
exports.ALL_BUCKET_UNITS = require_column_diff.ALL_BUCKET_UNITS;
|
|
573
|
+
exports.ALL_ISOLATION_LEVELS = require_column_diff.ALL_ISOLATION_LEVELS;
|
|
576
574
|
exports.ALL_VIEW_CAPABILITIES = require_column_diff.ALL_VIEW_CAPABILITIES;
|
|
577
575
|
exports.ApplicationIntegrity = require_column_diff.ApplicationIntegrity;
|
|
578
576
|
exports.AtscriptDbReadable = require_column_diff.AtscriptDbReadable;
|
|
@@ -626,6 +624,7 @@ Object.defineProperty(exports, "computeInsights", {
|
|
|
626
624
|
}
|
|
627
625
|
});
|
|
628
626
|
exports.containsRelationFilter = require_nested_writer.containsRelationFilter;
|
|
627
|
+
exports.createChangeRecorder = require_column_diff.createChangeRecorder;
|
|
629
628
|
exports.createDbValidatorPlugin = require_validator.createDbValidatorPlugin;
|
|
630
629
|
exports.createFailureCollector = require_column_diff.createFailureCollector;
|
|
631
630
|
exports.decomposePatch = require_column_diff.decomposePatch;
|
|
@@ -635,6 +634,7 @@ exports.describeFulltext = require_column_diff.describeFulltext;
|
|
|
635
634
|
exports.evaluateExpr = require_nested_writer.evaluateExpr;
|
|
636
635
|
exports.findAncestorInSet = require_object.findAncestorInSet;
|
|
637
636
|
exports.fkColumns = require_column_diff.fkColumns;
|
|
637
|
+
exports.fkKey = require_column_diff.fkKey;
|
|
638
638
|
exports.forEachResolvedRelation = require_nested_writer.forEachResolvedRelation;
|
|
639
639
|
exports.forceNavNonOptional = require_validator.forceNavNonOptional;
|
|
640
640
|
exports.geoIndexNotFoundMessage = require_column_diff.geoIndexNotFoundMessage;
|
|
@@ -694,6 +694,7 @@ exports.separateCas = require_ops.separateCas;
|
|
|
694
694
|
exports.separateFieldOps = require_ops.separateFieldOps;
|
|
695
695
|
exports.sortFieldNames = require_column_diff.sortFieldNames;
|
|
696
696
|
exports.splitFulltextFields = require_column_diff.splitFulltextFields;
|
|
697
|
+
exports.stableJson = require_object.stableJson;
|
|
697
698
|
exports.tableNameOf = require_nested_writer.tableNameOf;
|
|
698
699
|
exports.translateQueryTree = require_nested_writer.translateQueryTree;
|
|
699
700
|
exports.uniqueKeyTuple = require_nested_writer.uniqueKeyTuple;
|