@danceroutine/tango-orm 1.2.0 → 1.4.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.
Files changed (71) hide show
  1. package/dist/PostgresAdapter-BFdo_nIt.js +4 -0
  2. package/dist/{PostgresAdapter-C9a1XJRx.js → PostgresAdapter-CMiEpHya.js} +4 -52
  3. package/dist/PostgresAdapter-CMiEpHya.js.map +1 -0
  4. package/dist/PostgresClient-BQJZfEOT.js +68 -0
  5. package/dist/PostgresClient-BQJZfEOT.js.map +1 -0
  6. package/dist/SqliteAdapter-A-P9zUhP.js +4 -0
  7. package/dist/SqliteAdapter-CeqhyrPC.js +44 -0
  8. package/dist/SqliteAdapter-CeqhyrPC.js.map +1 -0
  9. package/dist/{SqliteAdapter-Dp6VRXmz.js → SqliteClient-CjOK9-ki.js} +20 -41
  10. package/dist/SqliteClient-CjOK9-ki.js.map +1 -0
  11. package/dist/connection/clients/DBClient.d.ts +6 -0
  12. package/dist/connection/clients/dialects/PostgresClient.d.ts +21 -5
  13. package/dist/connection/clients/dialects/SqliteClient.d.ts +13 -1
  14. package/dist/connection/index.js +5 -3
  15. package/dist/{connection-CVvycXus.js → connection-B_K2ZAf7.js} +7 -5
  16. package/dist/{connection-CVvycXus.js.map → connection-B_K2ZAf7.js.map} +1 -1
  17. package/dist/defaultRuntime-BPK9kWEW.js +447 -0
  18. package/dist/defaultRuntime-BPK9kWEW.js.map +1 -0
  19. package/dist/index.d.ts +2 -1
  20. package/dist/index.js +12 -9
  21. package/dist/manager/ManagerLike.d.ts +8 -8
  22. package/dist/manager/ModelManager.d.ts +15 -13
  23. package/dist/manager/index.js +6 -6
  24. package/dist/manager/internal/RuntimeBoundClient.d.ts +5 -1
  25. package/dist/{manager-CKUy1CIt.js → manager-C6oJ2tAF.js} +2 -2
  26. package/dist/{manager-CKUy1CIt.js.map → manager-C6oJ2tAF.js.map} +1 -1
  27. package/dist/query/QuerySet.d.ts +45 -30
  28. package/dist/query/compiler/QueryCompiler.d.ts +11 -1
  29. package/dist/query/domain/CompiledQuery.d.ts +21 -0
  30. package/dist/query/domain/RelationMeta.d.ts +3 -3
  31. package/dist/query/domain/RelationTyping.d.ts +74 -0
  32. package/dist/query/domain/index.d.ts +2 -0
  33. package/dist/query/index.js +1 -1
  34. package/dist/{query-BKt2nKIt.js → query-CWZ1cfjo.js} +221 -28
  35. package/dist/query-CWZ1cfjo.js.map +1 -0
  36. package/dist/{registerModelObjects-vsX6GzCN.js → registerModelObjects-Bva_f-Qh.js} +34 -134
  37. package/dist/registerModelObjects-Bva_f-Qh.js.map +1 -0
  38. package/dist/runtime/TangoRuntime.d.ts +17 -4
  39. package/dist/runtime/index.d.ts +3 -3
  40. package/dist/runtime/index.js +6 -6
  41. package/dist/runtime/internal/DBClientProvider.d.ts +12 -0
  42. package/dist/runtime/internal/PostgresDBClientProvider.d.ts +12 -0
  43. package/dist/runtime/internal/SqliteDBClientProvider.d.ts +16 -0
  44. package/dist/runtime/internal/createDBClientProvider.d.ts +5 -0
  45. package/dist/{runtime-BUpil272.js → runtime-ByXbpVBS.js} +3 -2
  46. package/dist/runtime-ByXbpVBS.js.map +1 -0
  47. package/dist/transaction/AtomicTransaction.d.ts +32 -0
  48. package/dist/transaction/UnitOfWork.d.ts +3 -0
  49. package/dist/transaction/atomic.d.ts +2 -0
  50. package/dist/transaction/index.d.ts +2 -0
  51. package/dist/transaction/index.js +5 -2
  52. package/dist/transaction/internal/context/AsyncLocalTransactionEngine.d.ts +21 -0
  53. package/dist/transaction/internal/context/CallbackRecord.d.ts +5 -0
  54. package/dist/transaction/internal/context/FrameBoundTransaction.d.ts +20 -0
  55. package/dist/transaction/internal/context/FrameTransactionHandle.d.ts +4 -0
  56. package/dist/transaction/internal/context/TransactionEngine.d.ts +16 -0
  57. package/dist/transaction/internal/context/TransactionFrame.d.ts +7 -0
  58. package/dist/transaction/internal/context/TransactionState.d.ts +10 -0
  59. package/dist/transaction/internal/context/index.d.ts +1 -0
  60. package/dist/{transaction-DooTMuAl.js → transaction-Cs0Z9tbW.js} +15 -3
  61. package/dist/transaction-Cs0Z9tbW.js.map +1 -0
  62. package/dist/validation/SQLValidationEngine.d.ts +3 -3
  63. package/package.json +6 -6
  64. package/dist/PostgresAdapter-C9a1XJRx.js.map +0 -1
  65. package/dist/PostgresAdapter-CBc1u8eT.js +0 -3
  66. package/dist/SqliteAdapter-BJKNxCvS.js +0 -3
  67. package/dist/SqliteAdapter-Dp6VRXmz.js.map +0 -1
  68. package/dist/query-BKt2nKIt.js.map +0 -1
  69. package/dist/registerModelObjects-vsX6GzCN.js.map +0 -1
  70. package/dist/runtime-BUpil272.js.map +0 -1
  71. package/dist/transaction-DooTMuAl.js.map +0 -1
@@ -1,7 +1,8 @@
1
1
  import type { DBClient } from '../../connection/index';
2
2
  import type { TangoRuntime } from '../../runtime/index';
3
3
  /**
4
- * DB client proxy that resolves the real Tango runtime client lazily.
4
+ * DB client proxy that resolves either the active transaction lease or the
5
+ * runtime autocommit path lazily.
5
6
  */
6
7
  export declare class RuntimeBoundClient implements DBClient {
7
8
  private readonly runtime;
@@ -12,5 +13,8 @@ export declare class RuntimeBoundClient implements DBClient {
12
13
  begin(): Promise<void>;
13
14
  commit(): Promise<void>;
14
15
  rollback(): Promise<void>;
16
+ createSavepoint(_name: string): Promise<void>;
17
+ releaseSavepoint(_name: string): Promise<void>;
18
+ rollbackToSavepoint(_name: string): Promise<void>;
15
19
  close(): Promise<void>;
16
20
  }
@@ -1,5 +1,5 @@
1
1
  import { __export } from "./chunk-DLY2FNSh.js";
2
- import { ModelManager, registerModelObjects } from "./registerModelObjects-vsX6GzCN.js";
2
+ import { ModelManager, registerModelObjects } from "./registerModelObjects-Bva_f-Qh.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-CKUy1CIt.js.map
13
+ //# sourceMappingURL=manager-C6oJ2tAF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager-CKUy1CIt.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":""}
1
+ {"version":3,"file":"manager-C6oJ2tAF.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":""}
@@ -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 T - The model type
17
+ * @template TModel - The model row type returned by the database client
16
18
  */
17
- export interface QueryExecutor<T> {
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 eager loading.
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 TResult - The fetched row shape returned by execution methods
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>, TResult extends Record<string, unknown> = TModel> {
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, TResult>;
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, TResult>;
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, TResult>;
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, TResult>;
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, TResult>;
86
+ offset(n: number): QuerySet<TModel, TBaseResult, TSourceModel, THydrated>;
85
87
  /**
86
- * Restrict selected columns and narrow the fetched row type when the
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)[]>(cols: TKeys): QuerySet<TModel, ProjectedResult<TModel, TKeys>>;
94
- select(cols: readonly (keyof TModel)[]): QuerySet<TModel, TModel>;
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
- * Request SQL joins for related data when supported by relation metadata.
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: string[]): QuerySet<TModel, TResult>;
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
- * Register relation names for prefetch behavior.
107
+ * Hydrate collection relations with a follow-up query.
101
108
  *
102
- * Prefetch orchestration is adapter-specific.
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: string[]): QuerySet<TModel, TResult>;
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<TResult>>;
112
- fetch<Out>(shape: QueryShapeFunction<TResult, Out>): Promise<QueryResult<Out>>;
113
- fetch<Out>(shape: QueryShapeParser<TResult, Out>): Promise<QueryResult<Out>>;
114
- fetch<TShape extends QueryShape<TResult> | undefined>(shape: TShape): Promise<QueryResult<TResult | QueryShapeOutput<TResult, NonNullable<TShape>>>>;
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<TResult | null>;
122
- fetchOne<Out>(shape: QueryShapeFunction<TResult, Out>): Promise<Out | null>;
123
- fetchOne<Out>(shape: QueryShapeParser<TResult, Out>): Promise<Out | null>;
124
- fetchOne<TShape extends QueryShape<TResult> | undefined>(shape: TShape): Promise<TResult | QueryShapeOutput<TResult, NonNullable<TShape>> | null>;
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
- targetPk: string;
7
- localKey?: string;
8
- foreignKey?: string;
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';
@@ -1,3 +1,3 @@
1
- import { QBuilder, QueryCompiler, QuerySet, compiler_exports, domain_exports } from "../query-BKt2nKIt.js";
1
+ import { QBuilder, QueryCompiler, QuerySet, compiler_exports, domain_exports } from "../query-CWZ1cfjo.js";
2
2
 
3
3
  export { QBuilder as Q, QBuilder, QueryCompiler, QuerySet, compiler_exports as compiler, domain_exports as domain };