@danceroutine/tango-orm 1.2.0 → 1.3.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/index.js +4 -4
- package/dist/manager/ManagerLike.d.ts +8 -8
- package/dist/manager/ModelManager.d.ts +13 -13
- package/dist/manager/index.js +3 -3
- package/dist/{manager-CKUy1CIt.js → manager-D6tU8xTO.js} +2 -2
- package/dist/{manager-CKUy1CIt.js.map → manager-D6tU8xTO.js.map} +1 -1
- package/dist/query/QuerySet.d.ts +45 -30
- package/dist/query/compiler/QueryCompiler.d.ts +11 -1
- package/dist/query/domain/CompiledQuery.d.ts +21 -0
- package/dist/query/domain/RelationMeta.d.ts +3 -3
- package/dist/query/domain/RelationTyping.d.ts +74 -0
- package/dist/query/domain/index.d.ts +2 -0
- package/dist/query/index.js +1 -1
- package/dist/{query-BKt2nKIt.js → query-6GeNOf-w.js} +221 -28
- package/dist/query-6GeNOf-w.js.map +1 -0
- package/dist/{registerModelObjects-vsX6GzCN.js → registerModelObjects-CXSI5ndy.js} +10 -18
- package/dist/registerModelObjects-CXSI5ndy.js.map +1 -0
- package/dist/runtime/index.d.ts +3 -3
- package/dist/runtime/index.js +3 -3
- package/dist/{runtime-BUpil272.js → runtime-7U5_XDad.js} +2 -2
- package/dist/runtime-7U5_XDad.js.map +1 -0
- package/dist/validation/SQLValidationEngine.d.ts +3 -3
- package/package.json +6 -6
- package/dist/query-BKt2nKIt.js.map +0 -1
- package/dist/registerModelObjects-vsX6GzCN.js.map +0 -1
- package/dist/runtime-BUpil272.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { PostgresAdapter } from "./PostgresAdapter-C9a1XJRx.js";
|
|
2
2
|
import { SqliteAdapter } from "./SqliteAdapter-Dp6VRXmz.js";
|
|
3
3
|
import { AdapterRegistry, connectDB, connection_exports, getDefaultAdapterRegistry } from "./connection-CVvycXus.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { manager_exports } from "./manager-
|
|
7
|
-
import { runtime_exports } from "./runtime-
|
|
4
|
+
import { QBuilder, QueryCompiler, QuerySet, query_exports } from "./query-6GeNOf-w.js";
|
|
5
|
+
import { ModelManager, TangoRuntime, getTangoRuntime, initializeTangoRuntime, resetTangoRuntime } from "./registerModelObjects-CXSI5ndy.js";
|
|
6
|
+
import { manager_exports } from "./manager-D6tU8xTO.js";
|
|
7
|
+
import { runtime_exports } from "./runtime-7U5_XDad.js";
|
|
8
8
|
import { UnitOfWork, transaction_exports } from "./transaction-DooTMuAl.js";
|
|
9
9
|
|
|
10
10
|
export { AdapterRegistry, ModelManager, PostgresAdapter, QBuilder as Q, QBuilder, QueryCompiler, QuerySet, SqliteAdapter, TangoRuntime, UnitOfWork, connectDB, connection_exports as connection, getDefaultAdapterRegistry, getTangoRuntime, initializeTangoRuntime, manager_exports as manager, query_exports as query, resetTangoRuntime, runtime_exports as runtime, transaction_exports as transaction };
|
|
@@ -3,13 +3,13 @@ import type { TableMeta } from '../query/domain/index';
|
|
|
3
3
|
/**
|
|
4
4
|
* Public manager contract consumed by Tango resources and applications.
|
|
5
5
|
*/
|
|
6
|
-
export interface ManagerLike<
|
|
6
|
+
export interface ManagerLike<TModelRow extends Record<string, unknown>, TSourceModel = unknown> {
|
|
7
7
|
readonly meta: TableMeta;
|
|
8
|
-
query(): QuerySet<
|
|
9
|
-
findById(id:
|
|
10
|
-
getOrThrow(id:
|
|
11
|
-
create(input: Partial<
|
|
12
|
-
update(id:
|
|
13
|
-
delete(id:
|
|
14
|
-
bulkCreate(inputs: Partial<
|
|
8
|
+
query(): QuerySet<TModelRow, TModelRow, TSourceModel>;
|
|
9
|
+
findById(id: TModelRow[keyof TModelRow]): Promise<TModelRow | null>;
|
|
10
|
+
getOrThrow(id: TModelRow[keyof TModelRow]): Promise<TModelRow>;
|
|
11
|
+
create(input: Partial<TModelRow>): Promise<TModelRow>;
|
|
12
|
+
update(id: TModelRow[keyof TModelRow], patch: Partial<TModelRow>): Promise<TModelRow>;
|
|
13
|
+
delete(id: TModelRow[keyof TModelRow]): Promise<void>;
|
|
14
|
+
bulkCreate(inputs: Partial<TModelRow>[]): Promise<TModelRow[]>;
|
|
15
15
|
}
|
|
@@ -8,7 +8,7 @@ type FieldLike = {
|
|
|
8
8
|
type: string;
|
|
9
9
|
primaryKey?: boolean;
|
|
10
10
|
};
|
|
11
|
-
type ModelLike<
|
|
11
|
+
type ModelLike<TModelRow extends Record<string, unknown>> = {
|
|
12
12
|
metadata: {
|
|
13
13
|
key?: string;
|
|
14
14
|
name: string;
|
|
@@ -16,14 +16,14 @@ type ModelLike<T extends Record<string, unknown>> = {
|
|
|
16
16
|
fields: FieldLike[];
|
|
17
17
|
};
|
|
18
18
|
schema: {
|
|
19
|
-
parse(input: unknown):
|
|
19
|
+
parse(input: unknown): TModelRow;
|
|
20
20
|
};
|
|
21
|
-
hooks?: ModelWriteHooks<
|
|
21
|
+
hooks?: ModelWriteHooks<TModelRow>;
|
|
22
22
|
};
|
|
23
23
|
/**
|
|
24
24
|
* Model-backed data access API exposed as `Model.objects`.
|
|
25
25
|
*/
|
|
26
|
-
export declare class ModelManager<
|
|
26
|
+
export declare class ModelManager<TModelRow extends Record<string, unknown>, TSourceModel = unknown> implements ManagerLike<TModelRow, TSourceModel> {
|
|
27
27
|
static readonly BRAND: "tango.orm.model_manager";
|
|
28
28
|
readonly __tangoBrand: typeof ModelManager.BRAND;
|
|
29
29
|
private readonly queryExecutor;
|
|
@@ -31,20 +31,20 @@ export declare class ModelManager<T extends Record<string, unknown>> implements
|
|
|
31
31
|
private readonly model;
|
|
32
32
|
private readonly client;
|
|
33
33
|
private readonly dialect;
|
|
34
|
-
constructor(model: ModelLike<
|
|
34
|
+
constructor(model: ModelLike<TModelRow>, runtime: TangoRuntime);
|
|
35
35
|
get meta(): TableMeta;
|
|
36
36
|
/**
|
|
37
37
|
* Narrow an unknown value to `ModelManager`.
|
|
38
38
|
*/
|
|
39
|
-
static isModelManager<
|
|
39
|
+
static isModelManager<TModelRow extends Record<string, unknown>>(value: unknown): value is ModelManager<TModelRow>;
|
|
40
40
|
private static createTableMeta;
|
|
41
|
-
query(): QuerySet<
|
|
42
|
-
findById(id:
|
|
43
|
-
getOrThrow(id:
|
|
44
|
-
create(input: Partial<
|
|
45
|
-
update(id:
|
|
46
|
-
delete(id:
|
|
47
|
-
bulkCreate(inputs: Partial<
|
|
41
|
+
query(): QuerySet<TModelRow, TModelRow, TSourceModel>;
|
|
42
|
+
findById(id: TModelRow[keyof TModelRow]): Promise<TModelRow | null>;
|
|
43
|
+
getOrThrow(id: TModelRow[keyof TModelRow]): Promise<TModelRow>;
|
|
44
|
+
create(input: Partial<TModelRow>): Promise<TModelRow>;
|
|
45
|
+
update(id: TModelRow[keyof TModelRow], patch: Partial<TModelRow>): Promise<TModelRow>;
|
|
46
|
+
delete(id: TModelRow[keyof TModelRow]): Promise<void>;
|
|
47
|
+
bulkCreate(inputs: Partial<TModelRow>[]): Promise<TModelRow[]>;
|
|
48
48
|
private runBeforeCreate;
|
|
49
49
|
private runBeforeUpdate;
|
|
50
50
|
}
|
package/dist/manager/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import "../PostgresAdapter-C9a1XJRx.js";
|
|
2
2
|
import "../SqliteAdapter-Dp6VRXmz.js";
|
|
3
3
|
import "../connection-CVvycXus.js";
|
|
4
|
-
import
|
|
5
|
-
import "../
|
|
6
|
-
import "../manager-
|
|
4
|
+
import "../query-6GeNOf-w.js";
|
|
5
|
+
import { ModelManager, registerModelObjects } from "../registerModelObjects-CXSI5ndy.js";
|
|
6
|
+
import "../manager-D6tU8xTO.js";
|
|
7
7
|
|
|
8
8
|
export { ModelManager, registerModelObjects };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __export } from "./chunk-DLY2FNSh.js";
|
|
2
|
-
import { ModelManager, registerModelObjects } from "./registerModelObjects-
|
|
2
|
+
import { ModelManager, registerModelObjects } from "./registerModelObjects-CXSI5ndy.js";
|
|
3
3
|
|
|
4
4
|
//#region src/manager/index.ts
|
|
5
5
|
var manager_exports = {};
|
|
@@ -10,4 +10,4 @@ __export(manager_exports, {
|
|
|
10
10
|
|
|
11
11
|
//#endregion
|
|
12
12
|
export { manager_exports };
|
|
13
|
-
//# sourceMappingURL=manager-
|
|
13
|
+
//# sourceMappingURL=manager-D6tU8xTO.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager-
|
|
1
|
+
{"version":3,"file":"manager-D6tU8xTO.js","names":[],"sources":["../src/manager/index.ts"],"sourcesContent":["/**\n * Domain boundary barrel: centralizes manager-first ORM APIs.\n */\nexport type { ManagerLike } from './ManagerLike';\nexport { ModelManager } from './ModelManager';\nexport { registerModelObjects } from './registerModelObjects';\n"],"mappings":""}
|
package/dist/query/QuerySet.d.ts
CHANGED
|
@@ -6,22 +6,21 @@ import type { QNode } from './domain/QNode';
|
|
|
6
6
|
import type { QueryResult } from './domain/QueryResult';
|
|
7
7
|
import type { OrderToken } from './domain/OrderToken';
|
|
8
8
|
import type { FilterInput } from './domain/FilterInput';
|
|
9
|
+
import type { CompiledQuery } from './domain/CompiledQuery';
|
|
10
|
+
import type { HydratedQueryResult, ManyRelationHydrationCardinality, MaybeHydratedRelationMap, PrefetchRelatedRelations, RelationKeys, SelectRelatedRelations, SingleRelationHydrationCardinality } from './domain/RelationTyping';
|
|
9
11
|
/**
|
|
10
12
|
* Query execution seam consumed by `QuerySet`.
|
|
11
13
|
*
|
|
12
14
|
* Application code usually reaches this through `Model.objects` or testing
|
|
13
15
|
* fixtures rather than implementing it directly.
|
|
14
16
|
*
|
|
15
|
-
* @template
|
|
17
|
+
* @template TModel - The model row type returned by the database client
|
|
16
18
|
*/
|
|
17
|
-
export interface QueryExecutor<
|
|
19
|
+
export interface QueryExecutor<TModel> {
|
|
18
20
|
meta: TableMeta;
|
|
19
21
|
client: DBClient;
|
|
20
22
|
dialect: Dialect;
|
|
21
|
-
run(compiled:
|
|
22
|
-
sql: string;
|
|
23
|
-
params: readonly unknown[];
|
|
24
|
-
}): Promise<T[]>;
|
|
23
|
+
run(compiled: CompiledQuery): Promise<TModel[]>;
|
|
25
24
|
}
|
|
26
25
|
type QueryShapeFunction<TInput, TOutput> = (row: TInput) => TOutput;
|
|
27
26
|
type QueryShapeParser<TInput, TOutput> = {
|
|
@@ -32,10 +31,13 @@ type QueryShapeOutput<TInput, TShape> = TShape extends QueryShapeFunction<TInput
|
|
|
32
31
|
type ProjectedResult<TModel extends Record<string, unknown>, TKeys extends readonly (keyof TModel)[]> = number extends TKeys['length'] ? TModel : [TKeys[number]] extends [never] ? TModel : Pick<TModel, TKeys[number]>;
|
|
33
32
|
/**
|
|
34
33
|
* Django-inspired query builder for constructing and executing database queries.
|
|
35
|
-
* Provides a fluent API for filtering, ordering, pagination, and
|
|
34
|
+
* Provides a fluent API for filtering, ordering, pagination, projection, and
|
|
35
|
+
* one-level relation hydration.
|
|
36
36
|
*
|
|
37
37
|
* @template TModel - The full model row type used for query composition
|
|
38
|
-
* @template
|
|
38
|
+
* @template TBaseResult - The selected base-row shape returned by execution methods
|
|
39
|
+
* @template TSourceModel - The source Tango model used for typed relation metadata
|
|
40
|
+
* @template THydrated - Relation properties accumulated by eager-loading calls
|
|
39
41
|
*
|
|
40
42
|
* @example
|
|
41
43
|
* ```typescript
|
|
@@ -48,7 +50,7 @@ type ProjectedResult<TModel extends Record<string, unknown>, TKeys extends reado
|
|
|
48
50
|
* .fetch();
|
|
49
51
|
* ```
|
|
50
52
|
*/
|
|
51
|
-
export declare class QuerySet<TModel extends Record<string, unknown>,
|
|
53
|
+
export declare class QuerySet<TModel extends Record<string, unknown>, TBaseResult extends Record<string, unknown> = TModel, TSourceModel = unknown, THydrated extends Record<string, unknown> = Record<never, never>> {
|
|
52
54
|
private executor;
|
|
53
55
|
private state;
|
|
54
56
|
static readonly BRAND: "tango.orm.query_set";
|
|
@@ -63,65 +65,71 @@ export declare class QuerySet<TModel extends Record<string, unknown>, TResult ex
|
|
|
63
65
|
*
|
|
64
66
|
* Multiple `filter()` calls are composed with `AND`.
|
|
65
67
|
*/
|
|
66
|
-
filter(q: FilterInput<TModel> | QNode<TModel>): QuerySet<TModel,
|
|
68
|
+
filter(q: FilterInput<TModel> | QNode<TModel>): QuerySet<TModel, TBaseResult, TSourceModel, THydrated>;
|
|
67
69
|
/**
|
|
68
70
|
* Add an exclusion expression to the query.
|
|
69
71
|
*
|
|
70
72
|
* Exclusions are translated to `NOT (...)` predicates.
|
|
71
73
|
*/
|
|
72
|
-
exclude(q: FilterInput<TModel> | QNode<TModel>): QuerySet<TModel,
|
|
74
|
+
exclude(q: FilterInput<TModel> | QNode<TModel>): QuerySet<TModel, TBaseResult, TSourceModel, THydrated>;
|
|
73
75
|
/**
|
|
74
76
|
* Apply ordering tokens such as `'name'` or `'-createdAt'`.
|
|
75
77
|
*/
|
|
76
|
-
orderBy(...tokens: OrderToken<TModel>[]): QuerySet<TModel,
|
|
78
|
+
orderBy(...tokens: OrderToken<TModel>[]): QuerySet<TModel, TBaseResult, TSourceModel, THydrated>;
|
|
77
79
|
/**
|
|
78
80
|
* Limit the maximum number of rows returned.
|
|
79
81
|
*/
|
|
80
|
-
limit(n: number): QuerySet<TModel,
|
|
82
|
+
limit(n: number): QuerySet<TModel, TBaseResult, TSourceModel, THydrated>;
|
|
81
83
|
/**
|
|
82
84
|
* Skip the first `n` rows.
|
|
83
85
|
*/
|
|
84
|
-
offset(n: number): QuerySet<TModel,
|
|
86
|
+
offset(n: number): QuerySet<TModel, TBaseResult, TSourceModel, THydrated>;
|
|
85
87
|
/**
|
|
86
|
-
* Restrict selected
|
|
88
|
+
* Restrict selected fields and narrow the fetched row type when the
|
|
87
89
|
* selected keys are known precisely at the call site.
|
|
88
90
|
*
|
|
89
91
|
* Empty selections reset back to the full model row, and repeated
|
|
90
92
|
* `select(...)` calls replace the previous projection rather than
|
|
91
93
|
* intersecting it.
|
|
92
94
|
*/
|
|
93
|
-
select<const TKeys extends readonly (keyof TModel)[]>(
|
|
94
|
-
select(
|
|
95
|
+
select<const TKeys extends readonly (keyof TModel)[]>(fields: TKeys): QuerySet<TModel, ProjectedResult<TModel, TKeys>, TSourceModel, THydrated>;
|
|
96
|
+
select(fields: readonly (keyof TModel)[]): QuerySet<TModel, ProjectedResult<TModel, readonly (keyof TModel)[]>, TSourceModel, THydrated>;
|
|
95
97
|
/**
|
|
96
|
-
*
|
|
98
|
+
* Hydrate single-valued relations through SQL joins.
|
|
99
|
+
*
|
|
100
|
+
* Forward `belongsTo` relations can be inferred from the source model's
|
|
101
|
+
* field-authored relation metadata. Reverse `hasOne` relations can be
|
|
102
|
+
* selected with a target model generic when the target model points back to
|
|
103
|
+
* the source model.
|
|
97
104
|
*/
|
|
98
|
-
selectRelated(...rels:
|
|
105
|
+
selectRelated<TTargetModel = undefined, const TRelationName extends RelationKeys<SelectRelatedRelations<TSourceModel, NoInfer<TTargetModel>>> = RelationKeys<SelectRelatedRelations<TSourceModel, NoInfer<TTargetModel>>>>(...rels: readonly TRelationName[]): QuerySet<TModel, TBaseResult, TSourceModel, THydrated & MaybeHydratedRelationMap<TSourceModel, SelectRelatedRelations<TSourceModel, NoInfer<TTargetModel>>, TRelationName, SingleRelationHydrationCardinality>>;
|
|
99
106
|
/**
|
|
100
|
-
*
|
|
107
|
+
* Hydrate collection relations with a follow-up query.
|
|
101
108
|
*
|
|
102
|
-
*
|
|
109
|
+
* Reverse `hasMany` relations can be prefetched with a target model generic
|
|
110
|
+
* when the target model points back to the source model.
|
|
103
111
|
*/
|
|
104
|
-
prefetchRelated(...rels:
|
|
112
|
+
prefetchRelated<TTargetModel = undefined, const TRelationName extends RelationKeys<PrefetchRelatedRelations<TSourceModel, NoInfer<TTargetModel>>> = RelationKeys<PrefetchRelatedRelations<TSourceModel, NoInfer<TTargetModel>>>>(...rels: readonly TRelationName[]): QuerySet<TModel, TBaseResult, TSourceModel, THydrated & MaybeHydratedRelationMap<TSourceModel, PrefetchRelatedRelations<TSourceModel, NoInfer<TTargetModel>>, TRelationName, ManyRelationHydrationCardinality>>;
|
|
105
113
|
/**
|
|
106
114
|
* Execute the query and optionally shape each row.
|
|
107
115
|
*
|
|
108
116
|
* When the queryset has been narrowed by `select(...)`, rows passed to the
|
|
109
117
|
* shaping callback or parser use that narrowed fetched-row type.
|
|
110
118
|
*/
|
|
111
|
-
fetch(): Promise<QueryResult<
|
|
112
|
-
fetch<Out>(shape: QueryShapeFunction<
|
|
113
|
-
fetch<Out>(shape: QueryShapeParser<
|
|
114
|
-
fetch<TShape extends QueryShape<
|
|
119
|
+
fetch(): Promise<QueryResult<HydratedQueryResult<TBaseResult, THydrated>>>;
|
|
120
|
+
fetch<Out>(shape: QueryShapeFunction<HydratedQueryResult<TBaseResult, THydrated>, Out>): Promise<QueryResult<Out>>;
|
|
121
|
+
fetch<Out>(shape: QueryShapeParser<HydratedQueryResult<TBaseResult, THydrated>, Out>): Promise<QueryResult<Out>>;
|
|
122
|
+
fetch<TShape extends QueryShape<HydratedQueryResult<TBaseResult, THydrated>> | undefined>(shape: TShape): Promise<QueryResult<HydratedQueryResult<TBaseResult, THydrated> | QueryShapeOutput<HydratedQueryResult<TBaseResult, THydrated>, NonNullable<TShape>>>>;
|
|
115
123
|
/**
|
|
116
124
|
* Execute the query and return the first row, or `null`.
|
|
117
125
|
*
|
|
118
126
|
* As with `fetch(...)`, parser and function overloads receive the current
|
|
119
127
|
* fetched-row type after any `select(...)` projection narrowing.
|
|
120
128
|
*/
|
|
121
|
-
fetchOne(): Promise<
|
|
122
|
-
fetchOne<Out>(shape: QueryShapeFunction<
|
|
123
|
-
fetchOne<Out>(shape: QueryShapeParser<
|
|
124
|
-
fetchOne<TShape extends QueryShape<
|
|
129
|
+
fetchOne(): Promise<HydratedQueryResult<TBaseResult, THydrated> | null>;
|
|
130
|
+
fetchOne<Out>(shape: QueryShapeFunction<HydratedQueryResult<TBaseResult, THydrated>, Out>): Promise<Out | null>;
|
|
131
|
+
fetchOne<Out>(shape: QueryShapeParser<HydratedQueryResult<TBaseResult, THydrated>, Out>): Promise<Out | null>;
|
|
132
|
+
fetchOne<TShape extends QueryShape<HydratedQueryResult<TBaseResult, THydrated>> | undefined>(shape: TShape): Promise<HydratedQueryResult<TBaseResult, THydrated> | QueryShapeOutput<HydratedQueryResult<TBaseResult, THydrated>, NonNullable<TShape>> | null>;
|
|
125
133
|
/**
|
|
126
134
|
* Execute a `COUNT(*)` query for the current filtered state.
|
|
127
135
|
*/
|
|
@@ -131,6 +139,13 @@ export declare class QuerySet<TModel extends Record<string, unknown>, TResult ex
|
|
|
131
139
|
*/
|
|
132
140
|
exists(): Promise<boolean>;
|
|
133
141
|
private normalizeRowsForSchemaParsing;
|
|
142
|
+
private validateHydrationState;
|
|
143
|
+
private hydrateRows;
|
|
144
|
+
private hydrateSelectedRows;
|
|
145
|
+
private hydratePrefetchedRows;
|
|
146
|
+
private fetchPrefetchGroup;
|
|
147
|
+
private normalizeTargetRow;
|
|
148
|
+
private normalizeTargetValue;
|
|
134
149
|
private isBooleanColumnType;
|
|
135
150
|
private normalizeSqliteBoolean;
|
|
136
151
|
private normalizeBooleanColumns;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { QuerySetState } from '../domain/QuerySetState';
|
|
2
2
|
import type { TableMeta } from '../domain/TableMeta';
|
|
3
|
-
import type { CompiledQuery } from '../domain/CompiledQuery';
|
|
3
|
+
import type { CompiledPrefetchHydration, CompiledPrefetchQuery, CompiledQuery } from '../domain/CompiledQuery';
|
|
4
4
|
import type { Dialect } from '../domain/Dialect';
|
|
5
5
|
/**
|
|
6
6
|
* Compiles immutable `QuerySet` state into parameterized SQL.
|
|
@@ -25,6 +25,16 @@ export declare class QueryCompiler {
|
|
|
25
25
|
* Compile a query state tree into a SQL statement and bound parameters.
|
|
26
26
|
*/
|
|
27
27
|
compile<T>(state: QuerySetState<T>): CompiledQuery;
|
|
28
|
+
/**
|
|
29
|
+
* Compile the follow-up query used by `prefetchRelated(...)`.
|
|
30
|
+
*
|
|
31
|
+
* The base query cannot bind source values until after it has returned rows,
|
|
32
|
+
* but SQL rendering and validation still belong to the compiler.
|
|
33
|
+
*/
|
|
34
|
+
compilePrefetch(prefetch: CompiledPrefetchHydration, sourceValues: readonly (string | number)[]): CompiledPrefetchQuery;
|
|
35
|
+
private buildHydrationColumnAlias;
|
|
36
|
+
private buildPrefetchSourceAlias;
|
|
37
|
+
private assertInternalAliasDoesNotCollide;
|
|
28
38
|
private compileQNode;
|
|
29
39
|
private compileAtom;
|
|
30
40
|
private compileAnd;
|
|
@@ -1,4 +1,25 @@
|
|
|
1
1
|
export interface CompiledQuery {
|
|
2
2
|
sql: string;
|
|
3
3
|
params: readonly unknown[];
|
|
4
|
+
hydrations?: readonly CompiledRelationHydration[];
|
|
5
|
+
prefetches?: readonly CompiledPrefetchHydration[];
|
|
6
|
+
}
|
|
7
|
+
export interface CompiledRelationHydration {
|
|
8
|
+
relationName: string;
|
|
9
|
+
alias: string;
|
|
10
|
+
columns: Record<string, string>;
|
|
11
|
+
}
|
|
12
|
+
export interface CompiledPrefetchHydration {
|
|
13
|
+
relationName: string;
|
|
14
|
+
sourceKey: string;
|
|
15
|
+
sourceKeyAlias?: string;
|
|
16
|
+
table: string;
|
|
17
|
+
targetKey: string;
|
|
18
|
+
targetColumns: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
export interface CompiledPrefetchQuery {
|
|
21
|
+
sql: string;
|
|
22
|
+
params: readonly unknown[];
|
|
23
|
+
targetKey: string;
|
|
24
|
+
targetColumns: Record<string, string>;
|
|
4
25
|
}
|
|
@@ -3,8 +3,8 @@ export type RelationKind = (typeof InternalRelationKind)[keyof typeof InternalRe
|
|
|
3
3
|
export interface RelationMeta {
|
|
4
4
|
kind: RelationKind;
|
|
5
5
|
table: string;
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
sourceKey: string;
|
|
7
|
+
targetKey: string;
|
|
8
|
+
targetColumns: Record<string, string>;
|
|
9
9
|
alias: string;
|
|
10
10
|
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
import type { Model, PersistedModelOutput } from '@danceroutine/tango-schema/domain';
|
|
3
|
+
import type { DecoratedFieldKind, InternalDecoratedFieldKind, RelationDecoratedSchema } from '@danceroutine/tango-schema/model';
|
|
4
|
+
export declare const InternalRelationHydrationCardinality: {
|
|
5
|
+
readonly SINGLE: "single";
|
|
6
|
+
readonly MANY: "many";
|
|
7
|
+
};
|
|
8
|
+
export type RelationHydrationCardinality = (typeof InternalRelationHydrationCardinality)[keyof typeof InternalRelationHydrationCardinality];
|
|
9
|
+
export type SingleRelationHydrationCardinality = typeof InternalRelationHydrationCardinality.SINGLE;
|
|
10
|
+
export type ManyRelationHydrationCardinality = typeof InternalRelationHydrationCardinality.MANY;
|
|
11
|
+
export type HydratedQueryResult<TBase extends Record<string, unknown>, THydrated extends Record<string, unknown>> = [
|
|
12
|
+
keyof THydrated
|
|
13
|
+
] extends [never] ? TBase : Omit<TBase, keyof THydrated> & THydrated;
|
|
14
|
+
type AnyModel = Model<z.ZodObject<z.ZodRawShape>, string>;
|
|
15
|
+
type ModelSchema<TModel> = TModel extends Model<infer TSchema extends z.ZodObject<z.ZodRawShape>, string> ? TSchema : never;
|
|
16
|
+
type ModelShape<TModel> = ModelSchema<TModel> extends z.ZodObject<infer TShape> ? TShape : never;
|
|
17
|
+
type ModelRow<TModel> = TModel extends Model<infer TSchema extends z.ZodObject<z.ZodRawShape>, string> ? PersistedModelOutput<TSchema> : never;
|
|
18
|
+
type IsLiteralString<TValue> = TValue extends string ? (string extends TValue ? false : true) : false;
|
|
19
|
+
type HasStrictModelKey<TModel> = TModel extends Model<z.ZodObject<z.ZodRawShape>, infer TKey> ? IsLiteralString<TKey> : false;
|
|
20
|
+
export type HasStrictRelationTyping<TSourceModel> = HasStrictModelKey<TSourceModel>;
|
|
21
|
+
type ModelKeysMatch<TCandidate, TExpected> = TCandidate extends Model<z.ZodObject<z.ZodRawShape>, infer TCandidateKey> ? TExpected extends Model<z.ZodObject<z.ZodRawShape>, infer TExpectedKey> ? IsLiteralString<TCandidateKey> extends true ? IsLiteralString<TExpectedKey> extends true ? [
|
|
22
|
+
TCandidateKey
|
|
23
|
+
] extends [TExpectedKey] ? true : false : false : false : false : false;
|
|
24
|
+
type FieldNamingHint<TKey extends string> = TKey extends `${infer TBase}Id` ? TBase : TKey extends `${infer TBase}_id` ? TBase : TKey;
|
|
25
|
+
type RelationName<TKey extends string, TName> = TName extends string ? TName : FieldNamingHint<TKey>;
|
|
26
|
+
type RelatedName<TName> = TName extends string ? TName : never;
|
|
27
|
+
type RelationTarget<TField> = TField extends RelationDecoratedSchema<z.ZodTypeAny, DecoratedFieldKind, infer TTarget, string | undefined, string | undefined> ? TTarget : never;
|
|
28
|
+
type RelationConfiguredName<TField> = TField extends RelationDecoratedSchema<z.ZodTypeAny, DecoratedFieldKind, AnyModel, infer TName, string | undefined> ? TName : undefined;
|
|
29
|
+
type RelationConfiguredRelatedName<TField> = TField extends RelationDecoratedSchema<z.ZodTypeAny, DecoratedFieldKind, AnyModel, string | undefined, infer TRelatedName> ? TRelatedName : undefined;
|
|
30
|
+
type RelationKindOf<TField> = TField extends RelationDecoratedSchema<z.ZodTypeAny, infer TKind, AnyModel, string | undefined, string | undefined> ? TKind : never;
|
|
31
|
+
export type ForwardSingleRelations<TSourceModel> = HasStrictModelKey<TSourceModel> extends true ? {
|
|
32
|
+
[TKey in keyof ModelShape<TSourceModel> as TKey extends string ? [
|
|
33
|
+
RelationKindOf<ModelShape<TSourceModel>[TKey]>
|
|
34
|
+
] extends [never] ? never : RelationKindOf<ModelShape<TSourceModel>[TKey]> extends typeof InternalDecoratedFieldKind.FOREIGN_KEY | typeof InternalDecoratedFieldKind.ONE_TO_ONE ? RelationTarget<ModelShape<TSourceModel>[TKey]> extends AnyModel ? RelationName<TKey, RelationConfiguredName<ModelShape<TSourceModel>[TKey]>> : never : never : never]: {
|
|
35
|
+
kind: typeof InternalDecoratedFieldKind.FOREIGN_KEY;
|
|
36
|
+
target: RelationTarget<ModelShape<TSourceModel>[TKey]>;
|
|
37
|
+
};
|
|
38
|
+
} : Record<string, {
|
|
39
|
+
kind: typeof InternalDecoratedFieldKind.FOREIGN_KEY;
|
|
40
|
+
target: AnyModel;
|
|
41
|
+
}>;
|
|
42
|
+
export type ReverseSingleRelations<TSourceModel, TTargetModel> = HasStrictModelKey<TSourceModel> extends true ? HasStrictModelKey<TTargetModel> extends true ? {
|
|
43
|
+
[TKey in keyof ModelShape<TTargetModel> as [RelationKindOf<ModelShape<TTargetModel>[TKey]>] extends [
|
|
44
|
+
never
|
|
45
|
+
] ? never : RelationKindOf<ModelShape<TTargetModel>[TKey]> extends typeof InternalDecoratedFieldKind.ONE_TO_ONE ? ModelKeysMatch<RelationTarget<ModelShape<TTargetModel>[TKey]>, TSourceModel> extends true ? RelatedName<RelationConfiguredRelatedName<ModelShape<TTargetModel>[TKey]>> : never : never]: {
|
|
46
|
+
kind: typeof InternalDecoratedFieldKind.ONE_TO_ONE;
|
|
47
|
+
target: TTargetModel;
|
|
48
|
+
};
|
|
49
|
+
} : {} : Record<string, {
|
|
50
|
+
kind: typeof InternalDecoratedFieldKind.ONE_TO_ONE;
|
|
51
|
+
target: AnyModel;
|
|
52
|
+
}>;
|
|
53
|
+
export type ReverseCollectionRelations<TSourceModel, TTargetModel> = HasStrictModelKey<TSourceModel> extends true ? HasStrictModelKey<TTargetModel> extends true ? {
|
|
54
|
+
[TKey in keyof ModelShape<TTargetModel> as [RelationKindOf<ModelShape<TTargetModel>[TKey]>] extends [
|
|
55
|
+
never
|
|
56
|
+
] ? never : RelationKindOf<ModelShape<TTargetModel>[TKey]> extends typeof InternalDecoratedFieldKind.FOREIGN_KEY ? ModelKeysMatch<RelationTarget<ModelShape<TTargetModel>[TKey]>, TSourceModel> extends true ? RelatedName<RelationConfiguredRelatedName<ModelShape<TTargetModel>[TKey]>> : never : never]: {
|
|
57
|
+
kind: typeof InternalDecoratedFieldKind.FOREIGN_KEY;
|
|
58
|
+
target: TTargetModel;
|
|
59
|
+
};
|
|
60
|
+
} : {} : Record<string, {
|
|
61
|
+
kind: typeof InternalDecoratedFieldKind.FOREIGN_KEY;
|
|
62
|
+
target: AnyModel;
|
|
63
|
+
}>;
|
|
64
|
+
export type SelectRelatedRelations<TSourceModel, TTargetModel> = [TTargetModel] extends [undefined] ? ForwardSingleRelations<TSourceModel> : // Target generic supplied: include reverse hasOne relations discovered on that target model.
|
|
65
|
+
ForwardSingleRelations<TSourceModel> & ReverseSingleRelations<TSourceModel, TTargetModel>;
|
|
66
|
+
export type PrefetchRelatedRelations<TSourceModel, TTargetModel> = ReverseCollectionRelations<TSourceModel, TTargetModel>;
|
|
67
|
+
export type RelationKeys<TRelations> = Extract<keyof TRelations, string>;
|
|
68
|
+
export type HydratedRelationMap<TRelations, TKeys extends string, TCardinality extends RelationHydrationCardinality> = {
|
|
69
|
+
[TKey in TKeys]: TKey extends keyof TRelations ? TRelations[TKey] extends {
|
|
70
|
+
target: infer TTarget;
|
|
71
|
+
} ? TCardinality extends typeof InternalRelationHydrationCardinality.SINGLE ? ModelRow<TTarget> | null : ModelRow<TTarget>[] : never : never;
|
|
72
|
+
};
|
|
73
|
+
export type MaybeHydratedRelationMap<TSourceModel, TRelations, TKeys extends string, TCardinality extends RelationHydrationCardinality> = HasStrictModelKey<TSourceModel> extends true ? HydratedRelationMap<TRelations, TKeys, TCardinality> : Record<never, never>;
|
|
74
|
+
export {};
|
|
@@ -14,5 +14,7 @@ export type { QNode } from './QNode';
|
|
|
14
14
|
export type { QueryResult } from './QueryResult';
|
|
15
15
|
export type { QuerySetState } from './QuerySetState';
|
|
16
16
|
export type { RelationMeta } from './RelationMeta';
|
|
17
|
+
export type { ForwardSingleRelations, HydratedQueryResult, HydratedRelationMap, ManyRelationHydrationCardinality, MaybeHydratedRelationMap, PrefetchRelatedRelations, RelationKeys, RelationHydrationCardinality, ReverseCollectionRelations, ReverseSingleRelations, SelectRelatedRelations, SingleRelationHydrationCardinality, } from './RelationTyping';
|
|
18
|
+
export { InternalRelationHydrationCardinality } from './RelationTyping';
|
|
17
19
|
export type { TableMeta } from './TableMeta';
|
|
18
20
|
export type { WhereClause } from './WhereClause';
|
package/dist/query/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { QBuilder, QueryCompiler, QuerySet, compiler_exports, domain_exports } from "../query-
|
|
1
|
+
import { QBuilder, QueryCompiler, QuerySet, compiler_exports, domain_exports } from "../query-6GeNOf-w.js";
|
|
2
2
|
|
|
3
3
|
export { QBuilder as Q, QBuilder, QueryCompiler, QuerySet, compiler_exports as compiler, domain_exports as domain };
|