@danceroutine/tango-orm 1.4.0 → 1.5.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 +2 -2
- package/dist/manager/ModelManager.d.ts +11 -11
- package/dist/manager/index.js +2 -2
- package/dist/manager-C6oJ2tAF.js +1 -1
- package/dist/query/QuerySet.d.ts +17 -13
- package/dist/query/compiler/QueryCompiler.d.ts +14 -21
- package/dist/query/domain/CompiledQuery.d.ts +26 -9
- package/dist/query/domain/RelationMeta.d.ts +37 -0
- package/dist/query/domain/RelationTyping.d.ts +42 -0
- package/dist/query/domain/TableMeta.d.ts +9 -0
- package/dist/query/domain/TableMetaFactory.d.ts +23 -0
- package/dist/query/domain/index.d.ts +2 -1
- package/dist/query/index.js +1 -1
- package/dist/query/planning/QueryPlanner.d.ts +16 -0
- package/dist/query/planning/domain/QueryHydrationPlan.d.ts +20 -0
- package/dist/query/planning/index.d.ts +2 -0
- package/dist/{query-CWZ1cfjo.js → query-DYiJ5m_B.js} +434 -165
- package/dist/query-DYiJ5m_B.js.map +1 -0
- package/dist/{registerModelObjects-Bva_f-Qh.js → registerModelObjects-B1VzZ072.js} +4 -28
- package/dist/registerModelObjects-B1VzZ072.js.map +1 -0
- package/dist/runtime/index.js +2 -2
- package/dist/runtime-ByXbpVBS.js +1 -1
- package/package.json +6 -6
- package/dist/query-CWZ1cfjo.js.map +0 -1
- package/dist/registerModelObjects-Bva_f-Qh.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -3,9 +3,9 @@ import { PostgresAdapter } from "./PostgresAdapter-CMiEpHya.js";
|
|
|
3
3
|
import "./SqliteClient-CjOK9-ki.js";
|
|
4
4
|
import { SqliteAdapter } from "./SqliteAdapter-CeqhyrPC.js";
|
|
5
5
|
import { AdapterRegistry, connectDB, connection_exports, getDefaultAdapterRegistry } from "./connection-B_K2ZAf7.js";
|
|
6
|
-
import { QBuilder, QueryCompiler, QuerySet, query_exports } from "./query-
|
|
6
|
+
import { QBuilder, QueryCompiler, QuerySet, query_exports } from "./query-DYiJ5m_B.js";
|
|
7
7
|
import { TangoRuntime, getTangoRuntime, initializeTangoRuntime, resetTangoRuntime } from "./defaultRuntime-BPK9kWEW.js";
|
|
8
|
-
import { ModelManager } from "./registerModelObjects-
|
|
8
|
+
import { ModelManager } from "./registerModelObjects-B1VzZ072.js";
|
|
9
9
|
import { manager_exports } from "./manager-C6oJ2tAF.js";
|
|
10
10
|
import { runtime_exports } from "./runtime-ByXbpVBS.js";
|
|
11
11
|
import { UnitOfWork, atomic, transaction_exports } from "./transaction-Cs0Z9tbW.js";
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ModelWriteHooks } from '@danceroutine/tango-schema';
|
|
2
|
+
import type { Model as SchemaModel } from '@danceroutine/tango-schema/domain';
|
|
2
3
|
import type { TableMeta } from '../query/domain/index';
|
|
3
4
|
import type { QuerySet } from '../query/index';
|
|
4
5
|
import type { TangoRuntime } from '../runtime/TangoRuntime';
|
|
5
6
|
import type { ManagerLike } from './ManagerLike';
|
|
6
|
-
type
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
type ModelMetadataLike = Omit<SchemaModel['metadata'], 'key' | 'namespace' | 'fields'> & {
|
|
8
|
+
key?: string;
|
|
9
|
+
namespace?: string;
|
|
10
|
+
fields: Array<{
|
|
11
|
+
name: string;
|
|
12
|
+
type: string;
|
|
13
|
+
primaryKey?: boolean;
|
|
14
|
+
}>;
|
|
10
15
|
};
|
|
11
16
|
type ModelLike<TModelRow extends Record<string, unknown>> = {
|
|
12
|
-
metadata:
|
|
13
|
-
key?: string;
|
|
14
|
-
name: string;
|
|
15
|
-
table: string;
|
|
16
|
-
fields: FieldLike[];
|
|
17
|
-
};
|
|
17
|
+
metadata: ModelMetadataLike;
|
|
18
18
|
schema: {
|
|
19
19
|
parse(input: unknown): TModelRow;
|
|
20
20
|
};
|
package/dist/manager/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import "../PostgresClient-BQJZfEOT.js";
|
|
2
2
|
import "../SqliteClient-CjOK9-ki.js";
|
|
3
|
-
import "../query-
|
|
3
|
+
import "../query-DYiJ5m_B.js";
|
|
4
4
|
import "../defaultRuntime-BPK9kWEW.js";
|
|
5
|
-
import { ModelManager, registerModelObjects } from "../registerModelObjects-
|
|
5
|
+
import { ModelManager, registerModelObjects } from "../registerModelObjects-B1VzZ072.js";
|
|
6
6
|
import "../manager-C6oJ2tAF.js";
|
|
7
7
|
|
|
8
8
|
export { ModelManager, registerModelObjects };
|
package/dist/manager-C6oJ2tAF.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __export } from "./chunk-DLY2FNSh.js";
|
|
2
|
-
import { ModelManager, registerModelObjects } from "./registerModelObjects-
|
|
2
|
+
import { ModelManager, registerModelObjects } from "./registerModelObjects-B1VzZ072.js";
|
|
3
3
|
|
|
4
4
|
//#region src/manager/index.ts
|
|
5
5
|
var manager_exports = {};
|
package/dist/query/QuerySet.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ import type { QueryResult } from './domain/QueryResult';
|
|
|
7
7
|
import type { OrderToken } from './domain/OrderToken';
|
|
8
8
|
import type { FilterInput } from './domain/FilterInput';
|
|
9
9
|
import type { CompiledQuery } from './domain/CompiledQuery';
|
|
10
|
-
import type { HydratedQueryResult, ManyRelationHydrationCardinality, MaybeHydratedRelationMap, PrefetchRelatedRelations, RelationKeys, SelectRelatedRelations, SingleRelationHydrationCardinality } from './domain/RelationTyping';
|
|
10
|
+
import type { GeneratedHydratedRelationMap, GeneratedPrefetchRelatedPathKeys, GeneratedSelectRelatedPathKeys, HydratedQueryResult, ManyRelationHydrationCardinality, MaybeHydratedRelationMap, PrefetchRelatedRelations, RelationKeys, SelectRelatedRelations, SingleRelationHydrationCardinality } from './domain/RelationTyping';
|
|
11
11
|
/**
|
|
12
12
|
* Query execution seam consumed by `QuerySet`.
|
|
13
13
|
*
|
|
@@ -32,7 +32,7 @@ type ProjectedResult<TModel extends Record<string, unknown>, TKeys extends reado
|
|
|
32
32
|
/**
|
|
33
33
|
* Django-inspired query builder for constructing and executing database queries.
|
|
34
34
|
* Provides a fluent API for filtering, ordering, pagination, projection, and
|
|
35
|
-
*
|
|
35
|
+
* nested relation hydration.
|
|
36
36
|
*
|
|
37
37
|
* @template TModel - The full model row type used for query composition
|
|
38
38
|
* @template TBaseResult - The selected base-row shape returned by execution methods
|
|
@@ -95,21 +95,24 @@ export declare class QuerySet<TModel extends Record<string, unknown>, TBaseResul
|
|
|
95
95
|
select<const TKeys extends readonly (keyof TModel)[]>(fields: TKeys): QuerySet<TModel, ProjectedResult<TModel, TKeys>, TSourceModel, THydrated>;
|
|
96
96
|
select(fields: readonly (keyof TModel)[]): QuerySet<TModel, ProjectedResult<TModel, readonly (keyof TModel)[]>, TSourceModel, THydrated>;
|
|
97
97
|
/**
|
|
98
|
-
* Hydrate single-valued
|
|
98
|
+
* Hydrate single-valued relation paths through SQL joins.
|
|
99
99
|
*
|
|
100
100
|
* Forward `belongsTo` relations can be inferred from the source model's
|
|
101
101
|
* field-authored relation metadata. Reverse `hasOne` relations can be
|
|
102
102
|
* selected with a target model generic when the target model points back to
|
|
103
|
-
* the source model.
|
|
103
|
+
* the source model. Generated relation typing also enables nested `__`
|
|
104
|
+
* path keys for applications that keep the app-local registry current.
|
|
104
105
|
*/
|
|
105
|
-
selectRelated<TTargetModel = undefined, const TRelationName extends RelationKeys<SelectRelatedRelations<TSourceModel, NoInfer<TTargetModel>>> = RelationKeys<SelectRelatedRelations<TSourceModel, NoInfer<TTargetModel
|
|
106
|
+
selectRelated<TTargetModel = undefined, const TRelationName extends RelationKeys<SelectRelatedRelations<TSourceModel, NoInfer<TTargetModel>>> | GeneratedSelectRelatedPathKeys<TSourceModel> = RelationKeys<SelectRelatedRelations<TSourceModel, NoInfer<TTargetModel>>> | GeneratedSelectRelatedPathKeys<TSourceModel>>(...rels: readonly TRelationName[]): QuerySet<TModel, TBaseResult, TSourceModel, THydrated & MaybeHydratedRelationMap<TSourceModel, SelectRelatedRelations<TSourceModel, NoInfer<TTargetModel>>, Extract<TRelationName, RelationKeys<SelectRelatedRelations<TSourceModel, NoInfer<TTargetModel>>>>, SingleRelationHydrationCardinality> & GeneratedHydratedRelationMap<TSourceModel, Extract<TRelationName, GeneratedSelectRelatedPathKeys<TSourceModel>>>>;
|
|
106
107
|
/**
|
|
107
|
-
* Hydrate collection
|
|
108
|
+
* Hydrate collection-rooted relation paths with follow-up queries.
|
|
108
109
|
*
|
|
109
110
|
* Reverse `hasMany` relations can be prefetched with a target model generic
|
|
110
|
-
* when the target model points back to the source model.
|
|
111
|
+
* when the target model points back to the source model. Generated relation
|
|
112
|
+
* typing also enables nested `__` path keys for applications that keep the
|
|
113
|
+
* app-local registry current.
|
|
111
114
|
*/
|
|
112
|
-
prefetchRelated<TTargetModel = undefined, const TRelationName extends RelationKeys<PrefetchRelatedRelations<TSourceModel, NoInfer<TTargetModel>>> = RelationKeys<PrefetchRelatedRelations<TSourceModel, NoInfer<TTargetModel
|
|
115
|
+
prefetchRelated<TTargetModel = undefined, const TRelationName extends RelationKeys<PrefetchRelatedRelations<TSourceModel, NoInfer<TTargetModel>>> | GeneratedPrefetchRelatedPathKeys<TSourceModel> = RelationKeys<PrefetchRelatedRelations<TSourceModel, NoInfer<TTargetModel>>> | GeneratedPrefetchRelatedPathKeys<TSourceModel>>(...rels: readonly TRelationName[]): QuerySet<TModel, TBaseResult, TSourceModel, THydrated & MaybeHydratedRelationMap<TSourceModel, PrefetchRelatedRelations<TSourceModel, NoInfer<TTargetModel>>, Extract<TRelationName, RelationKeys<PrefetchRelatedRelations<TSourceModel, NoInfer<TTargetModel>>>>, ManyRelationHydrationCardinality> & GeneratedHydratedRelationMap<TSourceModel, Extract<TRelationName, GeneratedPrefetchRelatedPathKeys<TSourceModel>>>>;
|
|
113
116
|
/**
|
|
114
117
|
* Execute the query and optionally shape each row.
|
|
115
118
|
*
|
|
@@ -139,15 +142,16 @@ export declare class QuerySet<TModel extends Record<string, unknown>, TBaseResul
|
|
|
139
142
|
*/
|
|
140
143
|
exists(): Promise<boolean>;
|
|
141
144
|
private normalizeRowsForSchemaParsing;
|
|
142
|
-
private validateHydrationState;
|
|
143
145
|
private hydrateRows;
|
|
144
|
-
private
|
|
145
|
-
private
|
|
146
|
-
private
|
|
146
|
+
private hydrateJoinNodesForOwner;
|
|
147
|
+
private hydratePrefetchNode;
|
|
148
|
+
private groupOwnersByAccessor;
|
|
149
|
+
private canonicalizeEntity;
|
|
147
150
|
private normalizeTargetRow;
|
|
148
|
-
private
|
|
151
|
+
private normalizeColumnValue;
|
|
149
152
|
private isBooleanColumnType;
|
|
150
153
|
private normalizeSqliteBoolean;
|
|
151
154
|
private normalizeBooleanColumns;
|
|
155
|
+
private withoutHydrationState;
|
|
152
156
|
}
|
|
153
157
|
export {};
|
|
@@ -1,39 +1,32 @@
|
|
|
1
1
|
import type { QuerySetState } from '../domain/QuerySetState';
|
|
2
2
|
import type { TableMeta } from '../domain/TableMeta';
|
|
3
|
-
import type {
|
|
3
|
+
import type { CompiledHydrationNode, CompiledPrefetchQuery, CompiledQuery } from '../domain/CompiledQuery';
|
|
4
4
|
import type { Dialect } from '../domain/Dialect';
|
|
5
5
|
/**
|
|
6
|
-
* Compiles immutable `QuerySet` state into parameterized SQL
|
|
7
|
-
*
|
|
8
|
-
* The compiler is intentionally stateless with respect to execution and only
|
|
9
|
-
* produces SQL + params artifacts that can be executed by a `DBClient`.
|
|
6
|
+
* Compiles immutable `QuerySet` state into parameterized SQL and recursive
|
|
7
|
+
* hydration execution artifacts.
|
|
10
8
|
*/
|
|
11
9
|
export declare class QueryCompiler {
|
|
12
10
|
private meta;
|
|
13
11
|
private dialect;
|
|
14
12
|
static readonly BRAND: "tango.orm.query_compiler";
|
|
15
13
|
readonly __tangoBrand: typeof QueryCompiler.BRAND;
|
|
16
|
-
/**
|
|
17
|
-
* Build a compiler for the given repository metadata and SQL dialect.
|
|
18
|
-
*/
|
|
19
14
|
constructor(meta: TableMeta, dialect?: Dialect);
|
|
20
|
-
/**
|
|
21
|
-
* Narrow an unknown value to `QueryCompiler`.
|
|
22
|
-
*/
|
|
23
15
|
static isQueryCompiler(value: unknown): value is QueryCompiler;
|
|
24
|
-
/**
|
|
25
|
-
* Compile a query state tree into a SQL statement and bound parameters.
|
|
26
|
-
*/
|
|
27
16
|
compile<T>(state: QuerySetState<T>): CompiledQuery;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
17
|
+
compilePrefetch(node: CompiledHydrationNode, sourceValues: readonly (string | number)[]): CompiledPrefetchQuery;
|
|
18
|
+
private compileHydrationNode;
|
|
19
|
+
private validateHydrationRelation;
|
|
20
|
+
private buildRootHiddenSelects;
|
|
21
|
+
private validatePrefetchTarget;
|
|
22
|
+
private collectNestedJoinSql;
|
|
23
|
+
private validatePrefetchJoinTarget;
|
|
24
|
+
private validateInternalAlias;
|
|
25
|
+
private buildJoinAlias;
|
|
26
|
+
private buildPrefetchBaseAlias;
|
|
35
27
|
private buildHydrationColumnAlias;
|
|
36
28
|
private buildPrefetchSourceAlias;
|
|
29
|
+
private sanitizeRelationPath;
|
|
37
30
|
private assertInternalAliasDoesNotCollide;
|
|
38
31
|
private compileQNode;
|
|
39
32
|
private compileAtom;
|
|
@@ -1,21 +1,38 @@
|
|
|
1
|
+
import type { RelationHydrationLoadMode } from './RelationMeta';
|
|
2
|
+
import type { RelationHydrationCardinality } from './RelationTyping';
|
|
1
3
|
export interface CompiledQuery {
|
|
2
4
|
sql: string;
|
|
3
5
|
params: readonly unknown[];
|
|
4
|
-
|
|
5
|
-
prefetches?: readonly CompiledPrefetchHydration[];
|
|
6
|
+
hydrationPlan?: CompiledHydrationPlanRoot;
|
|
6
7
|
}
|
|
7
|
-
export interface
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
export interface CompiledHydrationPlanRoot {
|
|
9
|
+
requestedPaths: readonly string[];
|
|
10
|
+
hiddenRootAliases: readonly string[];
|
|
11
|
+
joinNodes: readonly CompiledHydrationNode[];
|
|
12
|
+
prefetchNodes: readonly CompiledHydrationNode[];
|
|
11
13
|
}
|
|
12
|
-
export interface
|
|
14
|
+
export interface CompiledHydrationNode {
|
|
15
|
+
nodeId: string;
|
|
13
16
|
relationName: string;
|
|
17
|
+
relationPath: string;
|
|
18
|
+
ownerModelKey: string;
|
|
19
|
+
targetModelKey: string;
|
|
20
|
+
loadMode: RelationHydrationLoadMode;
|
|
21
|
+
cardinality: RelationHydrationCardinality;
|
|
14
22
|
sourceKey: string;
|
|
15
|
-
|
|
16
|
-
table: string;
|
|
23
|
+
ownerSourceAccessor: string;
|
|
17
24
|
targetKey: string;
|
|
25
|
+
targetTable: string;
|
|
26
|
+
targetPrimaryKey: string;
|
|
18
27
|
targetColumns: Record<string, string>;
|
|
28
|
+
provenance: readonly string[];
|
|
29
|
+
joinChildren: readonly CompiledHydrationNode[];
|
|
30
|
+
prefetchChildren: readonly CompiledHydrationNode[];
|
|
31
|
+
join?: CompiledJoinHydrationDescriptor;
|
|
32
|
+
}
|
|
33
|
+
export interface CompiledJoinHydrationDescriptor {
|
|
34
|
+
alias: string;
|
|
35
|
+
columns: Record<string, string>;
|
|
19
36
|
}
|
|
20
37
|
export interface CompiledPrefetchQuery {
|
|
21
38
|
sql: string;
|
|
@@ -1,10 +1,47 @@
|
|
|
1
1
|
import type { InternalRelationKind } from './internal/InternalRelationKind';
|
|
2
|
+
import type { RelationHydrationCardinality } from './RelationTyping';
|
|
3
|
+
import type { TableMeta } from './TableMeta';
|
|
2
4
|
export type RelationKind = (typeof InternalRelationKind)[keyof typeof InternalRelationKind];
|
|
5
|
+
export declare const InternalRelationHydrationLoadMode: {
|
|
6
|
+
readonly JOIN: "join";
|
|
7
|
+
readonly PREFETCH: "prefetch";
|
|
8
|
+
};
|
|
9
|
+
export type RelationHydrationLoadMode = (typeof InternalRelationHydrationLoadMode)[keyof typeof InternalRelationHydrationLoadMode];
|
|
10
|
+
export interface RelationHydrationCapabilities {
|
|
11
|
+
queryable: boolean;
|
|
12
|
+
hydratable: boolean;
|
|
13
|
+
joinable: boolean;
|
|
14
|
+
prefetchable: boolean;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Runtime relation metadata consumed by validation, planning, compilation, and
|
|
18
|
+
* hydration.
|
|
19
|
+
*/
|
|
3
20
|
export interface RelationMeta {
|
|
21
|
+
/** Stable edge identity from the resolved relation graph. */
|
|
22
|
+
edgeId: string;
|
|
23
|
+
/** Model key that owns the public relation name. */
|
|
24
|
+
sourceModelKey: string;
|
|
25
|
+
/** Model key reached by traversing this relation. */
|
|
26
|
+
targetModelKey: string;
|
|
27
|
+
/** Public relation kind such as belongsTo or hasMany. */
|
|
4
28
|
kind: RelationKind;
|
|
29
|
+
/** Hydration cardinality used by eager-loading APIs. */
|
|
30
|
+
cardinality: RelationHydrationCardinality;
|
|
31
|
+
/** Capability flags distilled from the resolved relation graph. */
|
|
32
|
+
capabilities: RelationHydrationCapabilities;
|
|
33
|
+
/** Physical table storing the target model rows. */
|
|
5
34
|
table: string;
|
|
35
|
+
/** Owner-side column used to attach or query related rows. */
|
|
6
36
|
sourceKey: string;
|
|
37
|
+
/** Target-side column matched against the source key. */
|
|
7
38
|
targetKey: string;
|
|
39
|
+
/** Primary key column for the target model. */
|
|
40
|
+
targetPrimaryKey: string;
|
|
41
|
+
/** Target model columns and their storage types. */
|
|
8
42
|
targetColumns: Record<string, string>;
|
|
43
|
+
/** Deterministic alias base used by join compilation. */
|
|
9
44
|
alias: string;
|
|
45
|
+
/** Recursive target metadata used for nested planning. */
|
|
46
|
+
targetMeta?: TableMeta;
|
|
10
47
|
}
|
|
@@ -11,12 +11,54 @@ export type ManyRelationHydrationCardinality = typeof InternalRelationHydrationC
|
|
|
11
11
|
export type HydratedQueryResult<TBase extends Record<string, unknown>, THydrated extends Record<string, unknown>> = [
|
|
12
12
|
keyof THydrated
|
|
13
13
|
] extends [never] ? TBase : Omit<TBase, keyof THydrated> & THydrated;
|
|
14
|
+
declare global {
|
|
15
|
+
interface TangoGeneratedRelationRegistry {
|
|
16
|
+
}
|
|
17
|
+
}
|
|
14
18
|
type AnyModel = Model<z.ZodObject<z.ZodRawShape>, string>;
|
|
15
19
|
type ModelSchema<TModel> = TModel extends Model<infer TSchema extends z.ZodObject<z.ZodRawShape>, string> ? TSchema : never;
|
|
16
20
|
type ModelShape<TModel> = ModelSchema<TModel> extends z.ZodObject<infer TShape> ? TShape : never;
|
|
17
21
|
type ModelRow<TModel> = TModel extends Model<infer TSchema extends z.ZodObject<z.ZodRawShape>, string> ? PersistedModelOutput<TSchema> : never;
|
|
18
22
|
type IsLiteralString<TValue> = TValue extends string ? (string extends TValue ? false : true) : false;
|
|
19
23
|
type HasStrictModelKey<TModel> = TModel extends Model<z.ZodObject<z.ZodRawShape>, infer TKey> ? IsLiteralString<TKey> : false;
|
|
24
|
+
type ModelKey<TModel> = TModel extends Model<z.ZodObject<z.ZodRawShape>, infer TKey extends string> ? TKey : never;
|
|
25
|
+
type UnionToIntersection<TValue> = (TValue extends unknown ? (value: TValue) => void : never) extends (value: infer TIntersection) => void ? TIntersection : never;
|
|
26
|
+
type JoinPathSegments<TSegments extends readonly string[]> = TSegments extends readonly [
|
|
27
|
+
infer THead extends string,
|
|
28
|
+
...infer TRest extends string[]
|
|
29
|
+
] ? TRest['length'] extends 0 ? THead : `${THead}__${JoinPathSegments<TRest>}` : never;
|
|
30
|
+
type SplitPath<TPath extends string> = TPath extends `${infer THead}__${infer TRest}` ? [THead, ...SplitPath<TRest>] : [TPath];
|
|
31
|
+
type TailTuple<TTuple extends readonly unknown[]> = TTuple extends readonly [unknown, ...infer TRest] ? TRest : [];
|
|
32
|
+
type DefaultGeneratedCycleBudget = readonly [1, 1, 1, 1];
|
|
33
|
+
type GeneratedRelationRegistry = TangoGeneratedRelationRegistry;
|
|
34
|
+
type GeneratedRelationKeys<TSourceModel> = Extract<keyof GeneratedRelations<TSourceModel>, string>;
|
|
35
|
+
type GeneratedRelations<TSourceModel> = HasStrictModelKey<TSourceModel> extends true ? ModelKey<TSourceModel> extends keyof GeneratedRelationRegistry ? GeneratedRelationRegistry[ModelKey<TSourceModel>] : {} : {};
|
|
36
|
+
type NextSeenModels<TSeen extends readonly string[], TTargetModel> = ModelKey<TTargetModel> extends string ? [...TSeen, ModelKey<TTargetModel>] : TSeen;
|
|
37
|
+
type CanTraverseGeneratedTarget<TTargetModel, TSeen extends readonly string[], TCycleBudget extends readonly unknown[]> = ModelKey<TTargetModel> extends TSeen[number] ? (TCycleBudget extends [] ? false : true) : true;
|
|
38
|
+
type NextGeneratedCycleBudget<TTargetModel, TSeen extends readonly string[], TCycleBudget extends readonly unknown[]> = ModelKey<TTargetModel> extends TSeen[number] ? TailTuple<TCycleBudget> : TCycleBudget;
|
|
39
|
+
type GeneratedCardinalityIncludesMany<TCardinality extends RelationHydrationCardinality> = TCardinality extends typeof InternalRelationHydrationCardinality.MANY ? true : false;
|
|
40
|
+
export type GeneratedSelectRelatedPathKeys<TSourceModel, TSeen extends readonly string[] = [ModelKey<TSourceModel>], TCycleBudget extends readonly unknown[] = DefaultGeneratedCycleBudget> = {
|
|
41
|
+
[TKey in GeneratedRelationKeys<TSourceModel>]: GeneratedRelations<TSourceModel>[TKey] extends {
|
|
42
|
+
target: infer TTarget extends AnyModel;
|
|
43
|
+
cardinality: typeof InternalRelationHydrationCardinality.SINGLE;
|
|
44
|
+
} ? TKey | (CanTraverseGeneratedTarget<TTarget, TSeen, TCycleBudget> extends true ? `${TKey}__${GeneratedSelectRelatedPathKeys<TTarget, NextSeenModels<TSeen, TTarget>, NextGeneratedCycleBudget<TTarget, TSeen, TCycleBudget>>}` : never) : never;
|
|
45
|
+
}[GeneratedRelationKeys<TSourceModel>];
|
|
46
|
+
export type GeneratedPrefetchRelatedPathKeys<TSourceModel, THasMany extends boolean = false, TSeen extends readonly string[] = [ModelKey<TSourceModel>], TCycleBudget extends readonly unknown[] = DefaultGeneratedCycleBudget> = {
|
|
47
|
+
[TKey in GeneratedRelationKeys<TSourceModel>]: GeneratedRelations<TSourceModel>[TKey] extends {
|
|
48
|
+
target: infer TTarget extends AnyModel;
|
|
49
|
+
cardinality: infer TCardinality extends RelationHydrationCardinality;
|
|
50
|
+
} ? (THasMany extends true ? TKey : GeneratedCardinalityIncludesMany<TCardinality> extends true ? TKey : never) | (CanTraverseGeneratedTarget<TTarget, TSeen, TCycleBudget> extends true ? `${TKey}__${GeneratedPrefetchRelatedPathKeys<TTarget, THasMany extends true ? true : GeneratedCardinalityIncludesMany<TCardinality>, NextSeenModels<TSeen, TTarget>, NextGeneratedCycleBudget<TTarget, TSeen, TCycleBudget>>}` : never) : never;
|
|
51
|
+
}[GeneratedRelationKeys<TSourceModel>];
|
|
52
|
+
type GeneratedHydratedTarget<TDescriptor, TPath extends string | never> = TDescriptor extends {
|
|
53
|
+
target: infer TTarget extends AnyModel;
|
|
54
|
+
} ? [TPath] extends [never] ? ModelRow<TTarget> : HydratedQueryResult<ModelRow<TTarget>, GeneratedHydratedRelationMap<TTarget, TPath>> : never;
|
|
55
|
+
type GeneratedHydratedValue<TDescriptor, TPath extends string | never> = TDescriptor extends {
|
|
56
|
+
cardinality: infer TCardinality extends RelationHydrationCardinality;
|
|
57
|
+
} ? TCardinality extends typeof InternalRelationHydrationCardinality.SINGLE ? GeneratedHydratedTarget<TDescriptor, TPath> | null : GeneratedHydratedTarget<TDescriptor, TPath>[] : never;
|
|
58
|
+
type GeneratedHydrationForPath<TSourceModel, TPath extends string> = SplitPath<TPath> extends [infer THead extends string, ...infer TRest extends string[]] ? THead extends GeneratedRelationKeys<TSourceModel> ? {
|
|
59
|
+
[TKey in THead]: GeneratedHydratedValue<GeneratedRelations<TSourceModel>[THead], JoinPathSegments<TRest>>;
|
|
60
|
+
} : {} : {};
|
|
61
|
+
export type GeneratedHydratedRelationMap<TSourceModel, TPaths extends string | never> = ([TPaths] extends [never] ? Record<never, never> : UnionToIntersection<TPaths extends string ? GeneratedHydrationForPath<TSourceModel, TPaths> : never>) & Record<never, never>;
|
|
20
62
|
export type HasStrictRelationTyping<TSourceModel> = HasStrictModelKey<TSourceModel>;
|
|
21
63
|
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
64
|
TCandidateKey
|
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
import type { RelationMeta } from './RelationMeta';
|
|
2
|
+
/**
|
|
3
|
+
* SQL-facing model metadata visible to the ORM layer.
|
|
4
|
+
*/
|
|
2
5
|
export interface TableMeta {
|
|
6
|
+
/** Stable model key when the table comes from a registered Tango model. */
|
|
7
|
+
modelKey?: string;
|
|
8
|
+
/** Physical table name used in compiled SQL. */
|
|
3
9
|
table: string;
|
|
10
|
+
/** Primary key column name. */
|
|
4
11
|
pk: string;
|
|
12
|
+
/** Base columns and their storage types. */
|
|
5
13
|
columns: Record<string, string>;
|
|
14
|
+
/** Relation metadata keyed by public relation name. */
|
|
6
15
|
relations?: Record<string, RelationMeta>;
|
|
7
16
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Model as SchemaModel } from '@danceroutine/tango-schema/domain';
|
|
2
|
+
import type { TableMeta } from './TableMeta';
|
|
3
|
+
type ModelMetadataLike = Omit<SchemaModel['metadata'], 'key' | 'namespace' | 'fields'> & {
|
|
4
|
+
key?: string;
|
|
5
|
+
namespace?: string;
|
|
6
|
+
fields: Array<{
|
|
7
|
+
name: string;
|
|
8
|
+
type: string;
|
|
9
|
+
primaryKey?: boolean;
|
|
10
|
+
}>;
|
|
11
|
+
};
|
|
12
|
+
type TableMetaModel = {
|
|
13
|
+
metadata: ModelMetadataLike;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Build registry-backed recursive table metadata for query planning and
|
|
17
|
+
* hydration execution.
|
|
18
|
+
*/
|
|
19
|
+
export declare class TableMetaFactory {
|
|
20
|
+
static create(model: TableMetaModel): TableMeta;
|
|
21
|
+
private static createWithCache;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
@@ -14,7 +14,8 @@ 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';
|
|
17
|
+
export type { ForwardSingleRelations, GeneratedHydratedRelationMap, GeneratedPrefetchRelatedPathKeys, GeneratedSelectRelatedPathKeys, HydratedQueryResult, HydratedRelationMap, ManyRelationHydrationCardinality, MaybeHydratedRelationMap, PrefetchRelatedRelations, RelationKeys, RelationHydrationCardinality, ReverseCollectionRelations, ReverseSingleRelations, SelectRelatedRelations, SingleRelationHydrationCardinality, } from './RelationTyping';
|
|
18
18
|
export { InternalRelationHydrationCardinality } from './RelationTyping';
|
|
19
19
|
export type { TableMeta } from './TableMeta';
|
|
20
|
+
export { TableMetaFactory } from './TableMetaFactory';
|
|
20
21
|
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-DYiJ5m_B.js";
|
|
2
2
|
|
|
3
3
|
export { QBuilder as Q, QBuilder, QueryCompiler, QuerySet, compiler_exports as compiler, domain_exports as domain };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { QuerySetState } from '../domain/QuerySetState';
|
|
2
|
+
import type { TableMeta } from '../domain/TableMeta';
|
|
3
|
+
import type { QueryHydrationPlanRoot } from './domain/QueryHydrationPlan';
|
|
4
|
+
/**
|
|
5
|
+
* Parse, validate, normalize, and plan recursive relation hydration paths.
|
|
6
|
+
*/
|
|
7
|
+
export declare class QueryPlanner {
|
|
8
|
+
private readonly meta;
|
|
9
|
+
static readonly BRAND: "tango.orm.query_planner";
|
|
10
|
+
readonly __tangoBrand: typeof QueryPlanner.BRAND;
|
|
11
|
+
constructor(meta: TableMeta);
|
|
12
|
+
static isQueryPlanner(value: unknown): value is QueryPlanner;
|
|
13
|
+
plan<T>(state: QuerySetState<T>): QueryHydrationPlanRoot;
|
|
14
|
+
private addPath;
|
|
15
|
+
private buildPlannedChildren;
|
|
16
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { RelationHydrationLoadMode, RelationMeta } from '../../domain/RelationMeta';
|
|
2
|
+
export type QueryHydrationLoadMode = RelationHydrationLoadMode;
|
|
3
|
+
export interface QueryHydrationPlanRoot {
|
|
4
|
+
joinNodes: readonly QueryHydrationPlanNode[];
|
|
5
|
+
prefetchNodes: readonly QueryHydrationPlanNode[];
|
|
6
|
+
requestedPaths: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
export interface QueryHydrationPlanNode {
|
|
9
|
+
nodeId: string;
|
|
10
|
+
relationName: string;
|
|
11
|
+
relationPath: string;
|
|
12
|
+
ownerModelKey: string;
|
|
13
|
+
relationEdge: RelationMeta;
|
|
14
|
+
targetModelKey: string;
|
|
15
|
+
loadMode: QueryHydrationLoadMode;
|
|
16
|
+
cardinality: RelationMeta['cardinality'];
|
|
17
|
+
provenance: readonly string[];
|
|
18
|
+
joinChildren: readonly QueryHydrationPlanNode[];
|
|
19
|
+
prefetchChildren: readonly QueryHydrationPlanNode[];
|
|
20
|
+
}
|