@danceroutine/tango-orm 1.11.0 → 1.11.2

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 (131) hide show
  1. package/dist/Adapter-DKxAaL4l.d.ts +73 -0
  2. package/dist/DBClient-DuYcXolQ.d.ts +27 -0
  3. package/dist/{InternalDialect-ClSaUNso.js → InternalDialect-U3mwJjKA.js} +3 -4
  4. package/dist/InternalDialect-U3mwJjKA.js.map +1 -0
  5. package/dist/QuerySetState-CjyvAUBs.d.ts +1310 -0
  6. package/dist/SqliteAdapter-6oyUmoJf.js +279 -0
  7. package/dist/SqliteAdapter-6oyUmoJf.js.map +1 -0
  8. package/dist/chunk-8H4AJuhK.js +14 -0
  9. package/dist/connection/index.d.ts +4 -11
  10. package/dist/connection/index.js +3 -6
  11. package/dist/{connection-Dmhgx31M.js → connection-D-E6_Yf1.js} +28 -30
  12. package/dist/connection-D-E6_Yf1.js.map +1 -0
  13. package/dist/{defaultRuntime-DzqBQ9Hb.js → defaultRuntime-CdTX8cXm.js} +41 -35
  14. package/dist/defaultRuntime-CdTX8cXm.js.map +1 -0
  15. package/dist/index-B-aibguC.d.ts +226 -0
  16. package/dist/index-D9B6gKez.d.ts +70 -0
  17. package/dist/index-rjKca3U_.d.ts +31 -0
  18. package/dist/index-uuG57Y7C.d.ts +97 -0
  19. package/dist/index.d.ts +9 -22
  20. package/dist/index.js +9 -12
  21. package/dist/manager/index.d.ts +4 -12
  22. package/dist/manager/index.js +3 -9
  23. package/dist/{manager-DrDTiCAz.js → manager-CiYqAYpn.js} +7 -11
  24. package/dist/{manager-DrDTiCAz.js.map → manager-CiYqAYpn.js.map} +1 -1
  25. package/dist/query/index.d.ts +3 -14
  26. package/dist/query/index.js +2 -4
  27. package/dist/{query-DUZnBFhf.js → query-CP1UMIX6.js} +163 -121
  28. package/dist/query-CP1UMIX6.js.map +1 -0
  29. package/dist/registerModelObjects-C-MliIiM.d.ts +229 -0
  30. package/dist/{registerModelObjects-Djpt45KK.js → registerModelObjects-DZfZ20fa.js} +150 -69
  31. package/dist/registerModelObjects-DZfZ20fa.js.map +1 -0
  32. package/dist/runtime/index.d.ts +3 -15
  33. package/dist/runtime/index.js +15 -8
  34. package/dist/runtime/index.js.map +1 -0
  35. package/dist/transaction/index.d.ts +2 -6
  36. package/dist/transaction/index.js +2 -7
  37. package/dist/{transaction-ZhfDf-f8.js → transaction-2_2m7VUo.js} +26 -10
  38. package/dist/transaction-2_2m7VUo.js.map +1 -0
  39. package/package.json +8 -8
  40. package/dist/InternalDialect-ClSaUNso.js.map +0 -1
  41. package/dist/PostgresAdapter-CXKdKBG-.js +0 -4
  42. package/dist/PostgresAdapter-DySFW6vy.js +0 -128
  43. package/dist/PostgresAdapter-DySFW6vy.js.map +0 -1
  44. package/dist/SqliteAdapter-CDdOjRmW.js +0 -151
  45. package/dist/SqliteAdapter-CDdOjRmW.js.map +0 -1
  46. package/dist/SqliteAdapter-mjtXuVTg.js +0 -4
  47. package/dist/chunk-DLY2FNSh.js +0 -12
  48. package/dist/connection/adapters/Adapter.d.ts +0 -60
  49. package/dist/connection/adapters/AdapterRegistry.d.ts +0 -44
  50. package/dist/connection/adapters/dialects/PostgresAdapter.d.ts +0 -30
  51. package/dist/connection/adapters/dialects/SqliteAdapter.d.ts +0 -22
  52. package/dist/connection/adapters/dialects/index.d.ts +0 -5
  53. package/dist/connection/adapters/index.d.ts +0 -8
  54. package/dist/connection/clients/DBClient.d.ts +0 -23
  55. package/dist/connection/clients/dialects/PostgresClient.d.ts +0 -54
  56. package/dist/connection/clients/dialects/SqliteClient.d.ts +0 -54
  57. package/dist/connection/clients/dialects/index.d.ts +0 -5
  58. package/dist/connection/clients/index.d.ts +0 -7
  59. package/dist/connection-Dmhgx31M.js.map +0 -1
  60. package/dist/defaultRuntime-DzqBQ9Hb.js.map +0 -1
  61. package/dist/manager/ManagerLike.d.ts +0 -34
  62. package/dist/manager/ModelManager.d.ts +0 -97
  63. package/dist/manager/internal/MutationCompiler.d.ts +0 -23
  64. package/dist/manager/internal/RuntimeBoundClient.d.ts +0 -20
  65. package/dist/manager/registerModelObjects.d.ts +0 -5
  66. package/dist/manager/relations/ManyToManyRelatedManager.d.ts +0 -181
  67. package/dist/manager/relations/ManyToManyRelatedQuerySet.d.ts +0 -62
  68. package/dist/manager/relations/MaterializedModelRecord.d.ts +0 -28
  69. package/dist/manager/relations/index.d.ts +0 -9
  70. package/dist/manager/relations/internal/ThroughTableManager.d.ts +0 -85
  71. package/dist/query/ModelQuerySet.d.ts +0 -20
  72. package/dist/query/QBuilder.d.ts +0 -29
  73. package/dist/query/QuerySet.d.ts +0 -215
  74. package/dist/query/compiler/QueryCompiler.d.ts +0 -49
  75. package/dist/query/compiler/index.d.ts +0 -4
  76. package/dist/query/domain/CompiledQuery.d.ts +0 -209
  77. package/dist/query/domain/Dialect.d.ts +0 -2
  78. package/dist/query/domain/Direction.d.ts +0 -2
  79. package/dist/query/domain/FilterInput.d.ts +0 -3
  80. package/dist/query/domain/FilterKey.d.ts +0 -4
  81. package/dist/query/domain/FilterValue.d.ts +0 -1
  82. package/dist/query/domain/LookupType.d.ts +0 -2
  83. package/dist/query/domain/OrderSpec.d.ts +0 -5
  84. package/dist/query/domain/OrderToken.d.ts +0 -1
  85. package/dist/query/domain/QNode.d.ts +0 -9
  86. package/dist/query/domain/QueryResult.d.ts +0 -35
  87. package/dist/query/domain/QuerySetState.d.ts +0 -13
  88. package/dist/query/domain/RelationMeta.d.ts +0 -56
  89. package/dist/query/domain/RelationTyping.d.ts +0 -163
  90. package/dist/query/domain/TableMeta.d.ts +0 -16
  91. package/dist/query/domain/TableMetaFactory.d.ts +0 -10
  92. package/dist/query/domain/WhereClause.d.ts +0 -4
  93. package/dist/query/domain/index.d.ts +0 -21
  94. package/dist/query/domain/internal/InternalDialect.d.ts +0 -4
  95. package/dist/query/domain/internal/InternalDirection.d.ts +0 -4
  96. package/dist/query/domain/internal/InternalLookupType.d.ts +0 -15
  97. package/dist/query/domain/internal/InternalPrefetchQueryKind.d.ts +0 -20
  98. package/dist/query/domain/internal/InternalQNodeType.d.ts +0 -6
  99. package/dist/query/domain/internal/InternalRelationKind.d.ts +0 -6
  100. package/dist/query/internal/isQNodeLike.d.ts +0 -3
  101. package/dist/query/planning/QueryPlanner.d.ts +0 -16
  102. package/dist/query/planning/domain/QueryHydrationPlan.d.ts +0 -20
  103. package/dist/query/planning/index.d.ts +0 -2
  104. package/dist/query-DUZnBFhf.js.map +0 -1
  105. package/dist/registerModelObjects-Djpt45KK.js.map +0 -1
  106. package/dist/runtime/TangoRuntime.d.ts +0 -56
  107. package/dist/runtime/defaultRuntime.d.ts +0 -13
  108. package/dist/runtime/internal/DBClientProvider.d.ts +0 -12
  109. package/dist/runtime/internal/PostgresDBClientProvider.d.ts +0 -12
  110. package/dist/runtime/internal/SqliteDBClientProvider.d.ts +0 -19
  111. package/dist/runtime/internal/createDBClientProvider.d.ts +0 -5
  112. package/dist/runtime-1H88J3nN.js +0 -18
  113. package/dist/runtime-1H88J3nN.js.map +0 -1
  114. package/dist/transaction/AtomicTransaction.d.ts +0 -32
  115. package/dist/transaction/UnitOfWork.d.ts +0 -52
  116. package/dist/transaction/atomic.d.ts +0 -2
  117. package/dist/transaction/internal/context/AsyncLocalTransactionEngine.d.ts +0 -21
  118. package/dist/transaction/internal/context/CallbackRecord.d.ts +0 -5
  119. package/dist/transaction/internal/context/FrameBoundTransaction.d.ts +0 -20
  120. package/dist/transaction/internal/context/FrameTransactionHandle.d.ts +0 -4
  121. package/dist/transaction/internal/context/TransactionEngine.d.ts +0 -16
  122. package/dist/transaction/internal/context/TransactionFrame.d.ts +0 -7
  123. package/dist/transaction/internal/context/TransactionState.d.ts +0 -10
  124. package/dist/transaction/internal/context/index.d.ts +0 -1
  125. package/dist/transaction-ZhfDf-f8.js.map +0 -1
  126. package/dist/validation/OrmSqlSafetyAdapter.d.ts +0 -22
  127. package/dist/validation/SQLValidationEngine.d.ts +0 -68
  128. package/dist/validation/SqlValidationPlan.d.ts +0 -43
  129. package/dist/validation/index.d.ts +0 -3
  130. package/dist/validation/internal/InternalSqlValidationPlanKind.d.ts +0 -25
  131. package/dist/validation/internal/InternalValidatedFilterDescriptorKind.d.ts +0 -4
@@ -1,21 +1,33 @@
1
- import { __export } from "./chunk-DLY2FNSh.js";
2
- import { InternalDialect } from "./InternalDialect-ClSaUNso.js";
1
+ import { t as __exportAll } from "./chunk-8H4AJuhK.js";
2
+ import { t as InternalDialect } from "./InternalDialect-U3mwJjKA.js";
3
3
  import { MultipleObjectsReturned, NotFoundError, SqlSafetyEngine, getLogger, isError } from "@danceroutine/tango-core";
4
4
  import { ModelRegistry } from "@danceroutine/tango-schema";
5
-
6
5
  //#region src/query/domain/RelationMeta.ts
7
6
  const InternalRelationHydrationLoadMode = {
8
7
  JOIN: "join",
9
8
  PREFETCH: "prefetch"
10
9
  };
11
-
12
10
  //#endregion
13
11
  //#region src/query/domain/internal/InternalPrefetchQueryKind.ts
12
+ /**
13
+ * Discriminator strings for compiled prefetch hydration: how `QueryCompiler.compilePrefetch`
14
+ * batches related rows for hydration (`CompiledPrefetchQuery`).
15
+ */
14
16
  const InternalPrefetchQueryKind = {
17
+ /**
18
+ * Single-query prefetch against the related table (`SELECT … FROM target WHERE fk IN (...)`).
19
+ * Used when each related row is reachable from one physical table via a foreign key or
20
+ * symmetric join path (belongsTo, hasMany, hasOne, reverse one-to-one).
21
+ */
15
22
  DIRECT: "direct",
23
+ /**
24
+ * Two-phase many-to-many prefetch: first query reads join (through) rows pairing owner ids to
25
+ * target ids (`throughSql`), then target rows load by primary key (`compileManyToManyTargets`).
26
+ * Distinct from relation metadata’s `manyToMany` relation *kind* on an endpoint—this marks the
27
+ * compiled prefetch *strategy*, not the schema edge type.
28
+ */
16
29
  MANY_TO_MANY: "manyToMany"
17
30
  };
18
-
19
31
  //#endregion
20
32
  //#region src/query/domain/internal/InternalQNodeType.ts
21
33
  const InternalQNodeType = {
@@ -24,7 +36,6 @@ const InternalQNodeType = {
24
36
  OR: "or",
25
37
  NOT: "not"
26
38
  };
27
-
28
39
  //#endregion
29
40
  //#region src/query/domain/internal/InternalLookupType.ts
30
41
  const InternalLookupType = {
@@ -42,27 +53,47 @@ const InternalLookupType = {
42
53
  ENDSWITH: "endswith",
43
54
  IENDSWITH: "iendswith"
44
55
  };
45
-
46
56
  //#endregion
47
57
  //#region src/validation/internal/InternalSqlValidationPlanKind.ts
58
+ /**
59
+ * Discriminator strings for {@link SqlValidationPlan} / {@link ValidatedSqlPlan}: which validation
60
+ * branch {@link OrmSqlSafetyAdapter} runs before SQL is assembled or executed.
61
+ */
48
62
  const InternalSqlValidationPlanKind = {
63
+ /**
64
+ * Read/query validation: table metadata, projected columns, `WHERE` filter keys, ordering, and
65
+ * optional relation handles. Used when compiling selects (including M2M through-table selects
66
+ * issued inside prefetch compilation).
67
+ */
49
68
  SELECT: "select",
69
+ /**
70
+ * Insert validation: resolved write columns for `INSERT … VALUES`.
71
+ */
50
72
  INSERT: "insert",
73
+ /**
74
+ * Update validation: resolved write columns for `UPDATE … SET`.
75
+ */
51
76
  UPDATE: "update",
77
+ /**
78
+ * Delete validation: scope delete-by-primary-key against validated table metadata.
79
+ */
52
80
  DELETE: "delete"
53
81
  };
54
-
55
82
  //#endregion
56
83
  //#region src/validation/internal/InternalValidatedFilterDescriptorKind.ts
57
84
  const InternalValidatedFilterDescriptorKind = {
58
85
  COLUMN: "column",
59
86
  RELATION: "relation"
60
87
  };
61
-
62
88
  //#endregion
63
89
  //#region src/validation/OrmSqlSafetyAdapter.ts
64
90
  const ALLOWED_LOOKUPS = Object.values(InternalLookupType);
91
+ /**
92
+ * ORM-local adapter that translates query validation plans into the
93
+ * shared Tango SQL safety engine.
94
+ */
65
95
  var OrmSqlSafetyAdapter = class OrmSqlSafetyAdapter {
96
+ engine;
66
97
  static BRAND = "tango.orm.orm_sql_safety_adapter";
67
98
  __tangoBrand = OrmSqlSafetyAdapter.BRAND;
68
99
  constructor(engine = new SqlSafetyEngine()) {
@@ -205,13 +236,13 @@ var OrmSqlSafetyAdapter = class OrmSqlSafetyAdapter {
205
236
  allowed: ALLOWED_LOOKUPS
206
237
  }] });
207
238
  if (pathSegments.length === 1) {
208
- const field$1 = pathSegments[0];
239
+ const field = pathSegments[0];
209
240
  return {
210
241
  kind: InternalValidatedFilterDescriptorKind.COLUMN,
211
242
  rawKey,
212
- field: field$1,
243
+ field,
213
244
  lookup: validated.lookupTokens[rawKey].lookup,
214
- qualifiedColumn: `${meta.table}.${this.resolveColumn(meta, field$1)}`
245
+ qualifiedColumn: `${meta.table}.${this.resolveColumn(meta, field)}`
215
246
  };
216
247
  }
217
248
  const rootSegment = pathSegments[0];
@@ -252,17 +283,19 @@ var OrmSqlSafetyAdapter = class OrmSqlSafetyAdapter {
252
283
  return relation;
253
284
  }
254
285
  };
255
-
256
286
  //#endregion
257
287
  //#region src/query/domain/RelationTyping.ts
258
288
  const InternalRelationHydrationCardinality = {
259
289
  SINGLE: "single",
260
290
  MANY: "many"
261
291
  };
262
-
263
292
  //#endregion
264
293
  //#region src/query/planning/QueryPlanner.ts
294
+ /**
295
+ * Parse, validate, normalize, and plan recursive relation hydration paths.
296
+ */
265
297
  var QueryPlanner = class QueryPlanner {
298
+ meta;
266
299
  static BRAND = "tango.orm.query_planner";
267
300
  __tangoBrand = QueryPlanner.BRAND;
268
301
  constructor(meta) {
@@ -278,7 +311,7 @@ var QueryPlanner = class QueryPlanner {
278
311
  prefetchNodes: [],
279
312
  requestedPaths: []
280
313
  };
281
- const rootChildren = new Map();
314
+ const rootChildren = /* @__PURE__ */ new Map();
282
315
  for (const relationPath of new Set(state.selectRelated ?? [])) this.addPath(rootChildren, relationPath, "select");
283
316
  for (const relationPath of new Set(state.prefetchRelated ?? [])) this.addPath(rootChildren, relationPath, "prefetch");
284
317
  const { joinNodes, prefetchNodes } = this.buildPlannedChildren(rootChildren);
@@ -307,14 +340,13 @@ var QueryPlanner = class QueryPlanner {
307
340
  const targetMeta = relation.targetMeta;
308
341
  if (!targetMeta) throw new Error(`Relation path '${relationPath}' is missing target metadata.`);
309
342
  builtPath = builtPath.length > 0 ? `${builtPath}__${segment}` : segment;
310
- const existing = currentChildren.get(segment);
311
- const nextNode = existing ?? {
343
+ const nextNode = currentChildren.get(segment) ?? {
312
344
  segment,
313
345
  relationEdge: relation,
314
346
  relationPath: builtPath,
315
347
  targetMeta,
316
- provenance: new Set(),
317
- children: new Map()
348
+ provenance: /* @__PURE__ */ new Set(),
349
+ children: /* @__PURE__ */ new Map()
318
350
  };
319
351
  nextNode.provenance.add(relationPath);
320
352
  currentChildren.set(segment, nextNode);
@@ -341,7 +373,7 @@ var QueryPlanner = class QueryPlanner {
341
373
  prefetchChildren
342
374
  };
343
375
  if (plannedNode.loadMode === InternalRelationHydrationLoadMode.JOIN) joinNodes.push(plannedNode);
344
- else prefetchNodes.push(plannedNode);
376
+ else prefetchNodes.push(plannedNode);
345
377
  }
346
378
  return {
347
379
  joinNodes,
@@ -349,11 +381,16 @@ else prefetchNodes.push(plannedNode);
349
381
  };
350
382
  }
351
383
  };
352
-
353
384
  //#endregion
354
385
  //#region src/query/compiler/QueryCompiler.ts
355
386
  const sqlSafetyAdapter = new OrmSqlSafetyAdapter();
387
+ /**
388
+ * Compiles immutable `QuerySet` state into parameterized SQL and recursive
389
+ * hydration execution artifacts.
390
+ */
356
391
  var QueryCompiler = class QueryCompiler {
392
+ meta;
393
+ adapter;
357
394
  static BRAND = "tango.orm.query_compiler";
358
395
  __tangoBrand = QueryCompiler.BRAND;
359
396
  placeholders;
@@ -406,7 +443,7 @@ var QueryCompiler = class QueryCompiler {
406
443
  ownerMeta: this.meta,
407
444
  ownerAlias: table,
408
445
  collectRootJoins: true,
409
- rootSelectedFields: state.select?.map(String) ?? undefined,
446
+ rootSelectedFields: state.select?.map(String) ?? void 0,
410
447
  hiddenRootAliases,
411
448
  joinCollection
412
449
  }));
@@ -415,7 +452,7 @@ var QueryCompiler = class QueryCompiler {
415
452
  ownerMeta: this.meta,
416
453
  ownerAlias: table,
417
454
  collectRootJoins: false,
418
- rootSelectedFields: state.select?.map(String) ?? undefined,
455
+ rootSelectedFields: state.select?.map(String) ?? void 0,
419
456
  hiddenRootAliases,
420
457
  joinCollection
421
458
  }));
@@ -428,17 +465,15 @@ var QueryCompiler = class QueryCompiler {
428
465
  const orderSQL = ` ORDER BY ${state.order?.length ? state.order.map((order) => `${validatedPlan.orderFields[String(order.by)]} ${order.dir.toUpperCase()}`).join(", ") : `${table}.${validatedPlan.meta.pk} ASC`}`;
429
466
  const limitSQL = state.limit ? ` LIMIT ${state.limit}` : "";
430
467
  const offsetSQL = state.offset ? ` OFFSET ${state.offset}` : "";
431
- const sql = `SELECT ${select} FROM ${table}${joinCollection.joins.length ? ` ${joinCollection.joins.join(" ")}` : ""}${whereSQL}${orderSQL}${limitSQL}${offsetSQL}`;
432
- const compiledHydrationPlan = compiledJoinNodes.length > 0 || compiledPrefetchNodes.length > 0 ? {
433
- requestedPaths: hydrationPlan.requestedPaths,
434
- hiddenRootAliases: [...new Set(hiddenRootAliases)],
435
- joinNodes: compiledJoinNodes,
436
- prefetchNodes: compiledPrefetchNodes
437
- } : undefined;
438
468
  return {
439
- sql,
469
+ sql: `SELECT ${select} FROM ${table}${joinCollection.joins.length ? ` ${joinCollection.joins.join(" ")}` : ""}${whereSQL}${orderSQL}${limitSQL}${offsetSQL}`,
440
470
  params,
441
- hydrationPlan: compiledHydrationPlan
471
+ hydrationPlan: compiledJoinNodes.length > 0 || compiledPrefetchNodes.length > 0 ? {
472
+ requestedPaths: hydrationPlan.requestedPaths,
473
+ hiddenRootAliases: [...new Set(hiddenRootAliases)],
474
+ joinNodes: compiledJoinNodes,
475
+ prefetchNodes: compiledPrefetchNodes
476
+ } : void 0
442
477
  };
443
478
  }
444
479
  compilePrefetch(node, sourceValues) {
@@ -469,9 +504,8 @@ var QueryCompiler = class QueryCompiler {
469
504
  joins: []
470
505
  };
471
506
  for (const joinChild of node.joinChildren) this.collectNestedJoinSql(joinChild, baseAlias, validatedTarget.columns, joinCollection);
472
- const baseSelects = Object.keys(validatedTarget.columns).map((column) => `${baseAlias}.${column} AS ${column}`);
473
507
  return {
474
- sql: `SELECT ${[...baseSelects, ...joinCollection.selects].join(", ")} FROM ${validatedTarget.table} ${baseAlias}${joinCollection.joins.length ? ` ${joinCollection.joins.join(" ")}` : ""} WHERE ${baseAlias}.${validatedTarget.primaryKey} IN (${placeholders}) ORDER BY ${baseAlias}.${validatedTarget.primaryKey} ASC`,
508
+ sql: `SELECT ${[...Object.keys(validatedTarget.columns).map((column) => `${baseAlias}.${column} AS ${column}`), ...joinCollection.selects].join(", ")} FROM ${validatedTarget.table} ${baseAlias}${joinCollection.joins.length ? ` ${joinCollection.joins.join(" ")}` : ""} WHERE ${baseAlias}.${validatedTarget.primaryKey} IN (${placeholders}) ORDER BY ${baseAlias}.${validatedTarget.primaryKey} ASC`,
475
509
  params: targetIds
476
510
  };
477
511
  }
@@ -569,8 +603,7 @@ var QueryCompiler = class QueryCompiler {
569
603
  }
570
604
  buildRootHiddenSelects(nodes, table) {
571
605
  return nodes.flatMap((node) => {
572
- const select = node.ownerSourceAccessor !== node.sourceKey ? [`${table}.${node.sourceKey} AS ${node.ownerSourceAccessor}`] : [];
573
- return [...select, ...this.buildRootHiddenSelects(node.prefetchChildren, table)];
606
+ return [...node.ownerSourceAccessor !== node.sourceKey ? [`${table}.${node.sourceKey} AS ${node.ownerSourceAccessor}`] : [], ...this.buildRootHiddenSelects(node.prefetchChildren, table)];
574
607
  });
575
608
  }
576
609
  validatePrefetchTarget(node) {
@@ -650,8 +683,7 @@ var QueryCompiler = class QueryCompiler {
650
683
  }
651
684
  }
652
685
  compileAtom(where, paramIndex, filterKeys) {
653
- const entries = Object.entries(where).filter(([, value]) => value !== undefined);
654
- const { parts, params } = entries.reduce((accumulator, [key, value]) => {
686
+ const { parts, params } = Object.entries(where).filter(([, value]) => value !== void 0).reduce((accumulator, [key, value]) => {
655
687
  const descriptor = filterKeys[String(key)];
656
688
  const idx = paramIndex + accumulator.params.length;
657
689
  const clause = descriptor.kind === InternalValidatedFilterDescriptorKind.COLUMN ? this.lookupToSQL(descriptor.qualifiedColumn, descriptor.lookup, value, idx) : this.compileRelationFilter(descriptor, value, idx);
@@ -767,9 +799,8 @@ var QueryCompiler = class QueryCompiler {
767
799
  sql: "1=0",
768
800
  params: []
769
801
  };
770
- const placeholders = this.placeholders.listFromOffset(entries.length, paramIndex - 1);
771
802
  return {
772
- sql: `${col} IN (${placeholders})`,
803
+ sql: `${col} IN (${this.placeholders.listFromOffset(entries.length, paramIndex - 1)})`,
773
804
  params: entries
774
805
  };
775
806
  }
@@ -781,35 +812,26 @@ var QueryCompiler = class QueryCompiler {
781
812
  sql: `${col} LIKE ${placeholder}`,
782
813
  params: [`%${value}%`]
783
814
  };
784
- case InternalLookupType.ICONTAINS: {
785
- const lowerCol = this.adapter.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`;
786
- return {
787
- sql: `${lowerCol} LIKE ${placeholder}`,
788
- params: [`%${String(value).toLowerCase()}%`]
789
- };
790
- }
815
+ case InternalLookupType.ICONTAINS: return {
816
+ sql: `${this.adapter.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`} LIKE ${placeholder}`,
817
+ params: [`%${String(value).toLowerCase()}%`]
818
+ };
791
819
  case InternalLookupType.STARTSWITH: return {
792
820
  sql: `${col} LIKE ${placeholder}`,
793
821
  params: [`${value}%`]
794
822
  };
795
- case InternalLookupType.ISTARTSWITH: {
796
- const lowerCol = this.adapter.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`;
797
- return {
798
- sql: `${lowerCol} LIKE ${placeholder}`,
799
- params: [`${String(value).toLowerCase()}%`]
800
- };
801
- }
823
+ case InternalLookupType.ISTARTSWITH: return {
824
+ sql: `${this.adapter.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`} LIKE ${placeholder}`,
825
+ params: [`${String(value).toLowerCase()}%`]
826
+ };
802
827
  case InternalLookupType.ENDSWITH: return {
803
828
  sql: `${col} LIKE ${placeholder}`,
804
829
  params: [`%${value}`]
805
830
  };
806
- case InternalLookupType.IENDSWITH: {
807
- const lowerCol = this.adapter.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`;
808
- return {
809
- sql: `${lowerCol} LIKE ${placeholder}`,
810
- params: [`%${String(value).toLowerCase()}`]
811
- };
812
- }
831
+ case InternalLookupType.IENDSWITH: return {
832
+ sql: `${this.adapter.dialect === InternalDialect.POSTGRES ? `LOWER(${col})` : `${col}`} LIKE ${placeholder}`,
833
+ params: [`%${String(value).toLowerCase()}`]
834
+ };
813
835
  default: throw new Error(`Unknown lookup: ${lookup}`);
814
836
  }
815
837
  }
@@ -818,7 +840,7 @@ var QueryCompiler = class QueryCompiler {
818
840
  return value;
819
841
  }
820
842
  collectStateFilterKeys(state) {
821
- const filterKeys = new Set();
843
+ const filterKeys = /* @__PURE__ */ new Set();
822
844
  if (state.q) this.collectNodeFilterKeys(state.q, filterKeys);
823
845
  state.excludes?.forEach((exclude) => this.collectNodeFilterKeys(exclude, filterKeys));
824
846
  return [...filterKeys];
@@ -829,15 +851,17 @@ var QueryCompiler = class QueryCompiler {
829
851
  if (node.node) this.collectNodeFilterKeys(node.node, filterKeys);
830
852
  }
831
853
  };
832
-
833
854
  //#endregion
834
855
  //#region src/query/compiler/index.ts
835
- var compiler_exports = {};
836
- __export(compiler_exports, { QueryCompiler: () => QueryCompiler });
837
-
856
+ var compiler_exports = /* @__PURE__ */ __exportAll({ QueryCompiler: () => QueryCompiler });
838
857
  //#endregion
839
858
  //#region src/query/domain/QueryResult.ts
840
859
  let didWarnDeprecatedResults = false;
860
+ /**
861
+ * Values materialized by {@link QuerySet.fetch}, iterable like an array plus `length`, `map`, `at`, and `toArray`.
862
+ *
863
+ * Prefer iteration or `items` over the deprecated `results` getter, which warns once per process when accessed.
864
+ */
841
865
  var QueryResult = class QueryResult {
842
866
  static BRAND = "tango.orm.query_result";
843
867
  __tangoBrand = QueryResult.BRAND;
@@ -884,7 +908,6 @@ var QueryResult = class QueryResult {
884
908
  return this.items;
885
909
  }
886
910
  };
887
-
888
911
  //#endregion
889
912
  //#region src/query/domain/internal/InternalRelationKind.ts
890
913
  const InternalRelationKind = {
@@ -893,13 +916,16 @@ const InternalRelationKind = {
893
916
  HAS_ONE: "hasOne",
894
917
  MANY_TO_MANY: "manyToMany"
895
918
  };
896
-
897
919
  //#endregion
898
920
  //#region src/query/domain/TableMetaFactory.ts
921
+ /**
922
+ * Build registry-backed recursive table metadata for query planning and
923
+ * hydration execution.
924
+ */
899
925
  var TableMetaFactory = class TableMetaFactory {
900
926
  static create(model) {
901
- const owner = model.metadata.key ? ModelRegistry.getOwner(model) : undefined;
902
- const cache = new Map();
927
+ const owner = model.metadata.key ? ModelRegistry.getOwner(model) : void 0;
928
+ const cache = /* @__PURE__ */ new Map();
903
929
  return TableMetaFactory.createWithCache(model, owner, cache);
904
930
  }
905
931
  static createWithCache(model, owner, cache) {
@@ -965,23 +991,19 @@ var TableMetaFactory = class TableMetaFactory {
965
991
  return tableMeta;
966
992
  }
967
993
  };
968
-
969
994
  //#endregion
970
995
  //#region src/query/domain/index.ts
971
- var domain_exports = {};
972
- __export(domain_exports, {
996
+ var domain_exports = /* @__PURE__ */ __exportAll({
973
997
  InternalRelationHydrationCardinality: () => InternalRelationHydrationCardinality,
974
998
  QueryResult: () => QueryResult,
975
999
  TableMetaFactory: () => TableMetaFactory
976
1000
  });
977
-
978
1001
  //#endregion
979
1002
  //#region src/query/domain/internal/InternalDirection.ts
980
1003
  const InternalDirection = {
981
1004
  ASC: "asc",
982
1005
  DESC: "desc"
983
1006
  };
984
-
985
1007
  //#endregion
986
1008
  //#region src/query/internal/isQNodeLike.ts
987
1009
  function isQNodeLike(value) {
@@ -994,9 +1016,14 @@ function isQNodeLike(value) {
994
1016
  default: return false;
995
1017
  }
996
1018
  }
997
-
998
1019
  //#endregion
999
1020
  //#region src/query/QBuilder.ts
1021
+ /**
1022
+ * Static builder for composing boolean query expressions.
1023
+ *
1024
+ * This mirrors Django's `Q(...)` composition patterns and is intended
1025
+ * for ergonomic construction of nested `AND`/`OR`/`NOT` trees.
1026
+ */
1000
1027
  var QBuilder = class QBuilder {
1001
1028
  static BRAND = "tango.orm.q_builder";
1002
1029
  __tangoBrand = QBuilder.BRAND;
@@ -1041,10 +1068,32 @@ var QBuilder = class QBuilder {
1041
1068
  };
1042
1069
  }
1043
1070
  };
1044
-
1045
1071
  //#endregion
1046
1072
  //#region src/query/QuerySet.ts
1073
+ /**
1074
+ * Django-inspired query builder for constructing and executing database queries.
1075
+ * Provides a fluent API for filtering, ordering, pagination, projection, and
1076
+ * nested relation hydration.
1077
+ *
1078
+ * @template TModel - The full model row type used for query composition
1079
+ * @template TBaseResult - The selected base-row shape returned by execution methods
1080
+ * @template TSourceModel - The source Tango model used for typed relation metadata
1081
+ * @template THydrated - Relation properties accumulated by eager-loading calls
1082
+ *
1083
+ * @example
1084
+ * ```typescript
1085
+ * const users = await TodoModel.objects
1086
+ * .query()
1087
+ * .filter({ active: true })
1088
+ * .filter(Q.or({ role: 'admin' }, { role: 'moderator' }))
1089
+ * .orderBy('-createdAt')
1090
+ * .limit(10)
1091
+ * .fetch();
1092
+ * ```
1093
+ */
1047
1094
  var QuerySet = class QuerySet {
1095
+ executor;
1096
+ state;
1048
1097
  static BRAND = "tango.orm.query_set";
1049
1098
  __tangoBrand = QuerySet.BRAND;
1050
1099
  evaluationCache;
@@ -1186,8 +1235,7 @@ var QuerySet = class QuerySet {
1186
1235
  async fetch(shape) {
1187
1236
  const baseResult = await this.getOrCreateEvaluationCache();
1188
1237
  if (!shape) return baseResult;
1189
- const results = typeof shape === "function" ? baseResult.items.map(shape) : this.normalizeHydratedRowsForParserShape(baseResult.items).map((row) => shape.parse(row));
1190
- return new QueryResult(results);
1238
+ return new QueryResult(typeof shape === "function" ? baseResult.items.map(shape) : this.normalizeHydratedRowsForParserShape(baseResult.items).map((row) => shape.parse(row)));
1191
1239
  }
1192
1240
  /**
1193
1241
  * Async iterable surface for `for await (... of queryset)`.
@@ -1211,9 +1259,8 @@ var QuerySet = class QuerySet {
1211
1259
  return this.fetchOne(shape);
1212
1260
  }
1213
1261
  async last(shape) {
1214
- if (this.state.limit !== undefined || this.state.offset !== undefined) {
1215
- const page = await this.fetch();
1216
- const row = page.at(-1);
1262
+ if (this.state.limit !== void 0 || this.state.offset !== void 0) {
1263
+ const row = (await this.fetch()).at(-1);
1217
1264
  if (!row) return null;
1218
1265
  return this.shapeFetchedRow(row, shape);
1219
1266
  }
@@ -1222,16 +1269,13 @@ var QuerySet = class QuerySet {
1222
1269
  by: this.executor.meta.pk,
1223
1270
  dir: InternalDirection.DESC
1224
1271
  }];
1225
- const qs = this.spawn({
1272
+ return this.spawn({
1226
1273
  ...this.state,
1227
1274
  order: effectiveOrder
1228
- });
1229
- return qs.limit(1).fetchOne(shape);
1275
+ }).limit(1).fetchOne(shape);
1230
1276
  }
1231
1277
  async get(q, shape) {
1232
- const limited = this.filter(q).limit(2);
1233
- const page = await limited.fetch();
1234
- const rows = page.items;
1278
+ const rows = (await this.filter(q).limit(2).fetch()).items;
1235
1279
  if (rows.length === 0) throw new NotFoundError(`${this.executor.meta.table}: no matching record`);
1236
1280
  if (rows.length > 1) throw new MultipleObjectsReturned(`${this.executor.meta.table}: more than one matching record`);
1237
1281
  return this.shapeFetchedRow(rows[0], shape);
@@ -1240,8 +1284,7 @@ var QuerySet = class QuerySet {
1240
1284
  * Execute a `COUNT(*)` query for the current filtered state.
1241
1285
  */
1242
1286
  async count() {
1243
- const compiler = new QueryCompiler(this.executor.meta, this.executor.adapter);
1244
- const compiled = compiler.compile(this.withoutHydrationState());
1287
+ const compiled = new QueryCompiler(this.executor.meta, this.executor.adapter).compile(this.withoutHydrationState());
1245
1288
  const countQuery = `SELECT COUNT(*) as count FROM (${compiled.sql}) AS tango_count_subquery`;
1246
1289
  const rows = await this.executor.client.query(countQuery, compiled.params);
1247
1290
  return Number(rows.rows[0]?.count ?? 0);
@@ -1250,8 +1293,7 @@ var QuerySet = class QuerySet {
1250
1293
  * Return whether at least one row matches the current query state.
1251
1294
  */
1252
1295
  async exists() {
1253
- const count = await this.count();
1254
- return count > 0;
1296
+ return await this.count() > 0;
1255
1297
  }
1256
1298
  shapeFetchedRow(row, shape) {
1257
1299
  if (!shape) return row;
@@ -1261,20 +1303,18 @@ var QuerySet = class QuerySet {
1261
1303
  }
1262
1304
  getOrCreateEvaluationCache() {
1263
1305
  if (!this.evaluationCache) this.evaluationCache = this.evaluateRows().catch((error) => {
1264
- this.evaluationCache = undefined;
1306
+ this.evaluationCache = void 0;
1265
1307
  throw error;
1266
1308
  });
1267
1309
  return this.evaluationCache;
1268
1310
  }
1269
1311
  async evaluateRows() {
1270
- const compiler = new QueryCompiler(this.executor.meta, this.executor.adapter);
1271
- const compiled = compiler.compile(this.state);
1312
+ const compiled = new QueryCompiler(this.executor.meta, this.executor.adapter).compile(this.state);
1272
1313
  const rows = await this.executor.run(compiled);
1273
1314
  const normalizedRows = this.normalizeRowsForSchemaParsing(rows);
1274
1315
  const hydratedRows = await this.hydrateRows(normalizedRows, compiled);
1275
1316
  this.attachRootRecordAccessors(hydratedRows);
1276
- const projectedRows = hydratedRows;
1277
- return new QueryResult(projectedRows);
1317
+ return new QueryResult(hydratedRows);
1278
1318
  }
1279
1319
  normalizeRowsForSchemaParsing(rows) {
1280
1320
  if (this.executor.adapter.dialect !== InternalDialect.SQLITE) return [...rows];
@@ -1292,8 +1332,8 @@ var QuerySet = class QuerySet {
1292
1332
  if (!compiled.hydrationPlan) return rows;
1293
1333
  const hydratedRows = rows.map((row) => ({ ...row }));
1294
1334
  this.attachRootRecordAccessors(hydratedRows);
1295
- const canonicalEntities = new Map();
1296
- const queuedJoinPrefetchOwners = new Map();
1335
+ const canonicalEntities = /* @__PURE__ */ new Map();
1336
+ const queuedJoinPrefetchOwners = /* @__PURE__ */ new Map();
1297
1337
  const compiler = new QueryCompiler(this.executor.meta, this.executor.adapter);
1298
1338
  for (const row of hydratedRows) this.hydrateJoinNodesForOwner(row, row, compiled.hydrationPlan.joinNodes, canonicalEntities, queuedJoinPrefetchOwners);
1299
1339
  for (const node of compiled.hydrationPlan.prefetchNodes) await this.hydratePrefetchNode(node, hydratedRows, canonicalEntities, compiler);
@@ -1323,7 +1363,7 @@ var QuerySet = class QuerySet {
1323
1363
  const value = rawRow[alias];
1324
1364
  delete rawRow[alias];
1325
1365
  target[column] = this.normalizeColumnValue(node.targetColumns[column], value);
1326
- if (value !== null && value !== undefined) hasTargetValue = true;
1366
+ if (value !== null && value !== void 0) hasTargetValue = true;
1327
1367
  }
1328
1368
  if (!hasTargetValue) {
1329
1369
  owner[node.relationName] = null;
@@ -1346,14 +1386,13 @@ var QuerySet = class QuerySet {
1346
1386
  if (owners.length === 0) return;
1347
1387
  const groupedOwners = this.groupOwnersByAccessor(owners, node.ownerSourceAccessor);
1348
1388
  const sourceValues = [...groupedOwners.keys()];
1349
- const isManyToMany = !!node.throughTable;
1350
- if (!isManyToMany) for (const owner of owners) owner[node.relationName] = node.cardinality === InternalRelationHydrationCardinality.MANY ? [] : null;
1389
+ if (!!!node.throughTable) for (const owner of owners) owner[node.relationName] = node.cardinality === InternalRelationHydrationCardinality.MANY ? [] : null;
1351
1390
  if (sourceValues.length === 0) return;
1352
1391
  const sourceChunks = this.chunkValues(sourceValues, 500);
1353
1392
  const compiledPrefetch = compiler.compilePrefetch(node, sourceChunks[0]);
1354
1393
  if (compiledPrefetch.kind === InternalPrefetchQueryKind.MANY_TO_MANY) {
1355
- const idsByOwner = new Map();
1356
- const uniqueTargetIds = new Set();
1394
+ const idsByOwner = /* @__PURE__ */ new Map();
1395
+ const uniqueTargetIds = /* @__PURE__ */ new Set();
1357
1396
  for (const chunk of sourceChunks) {
1358
1397
  const chunkCompiled = compiler.compilePrefetch(node, chunk);
1359
1398
  const throughResult = await this.executor.client.query(chunkCompiled.throughSql, chunkCompiled.throughParams);
@@ -1380,22 +1419,22 @@ var QuerySet = class QuerySet {
1380
1419
  if (typeof primaryKey === "string" || typeof primaryKey === "number") targets[primaryKey] = canonical;
1381
1420
  }
1382
1421
  }
1383
- const canonicalChildren$1 = new Map();
1384
- const handledOwners = new Set();
1422
+ const canonicalChildren = /* @__PURE__ */ new Map();
1423
+ const handledOwners = /* @__PURE__ */ new Set();
1385
1424
  for (const [ownerId, ids] of idsByOwner.entries()) {
1386
1425
  const bucket = ids.map((id) => targets[id]).filter((value) => !!value);
1387
1426
  for (const owner of groupedOwners.get(ownerId) ?? []) {
1388
1427
  this.primeManyToManyOwnerCache(owner, node.relationName, bucket);
1389
1428
  handledOwners.add(owner);
1390
1429
  }
1391
- for (const child of bucket) canonicalChildren$1.set(child[node.targetPrimaryKey], child);
1430
+ for (const child of bucket) canonicalChildren.set(child[node.targetPrimaryKey], child);
1392
1431
  }
1393
1432
  for (const owner of owners) if (!handledOwners.has(owner)) this.primeManyToManyOwnerCache(owner, node.relationName, []);
1394
- const childOwners$1 = [...canonicalChildren$1.values()];
1395
- for (const childNode of node.prefetchChildren) await this.hydratePrefetchNode(childNode, childOwners$1, canonicalEntities, compiler);
1433
+ const childOwners = [...canonicalChildren.values()];
1434
+ for (const childNode of node.prefetchChildren) await this.hydratePrefetchNode(childNode, childOwners, canonicalEntities, compiler);
1396
1435
  return;
1397
1436
  }
1398
- const canonicalChildren = new Map();
1437
+ const canonicalChildren = /* @__PURE__ */ new Map();
1399
1438
  for (const chunk of sourceChunks) {
1400
1439
  const chunkCompiled = compiler.compilePrefetch(node, chunk);
1401
1440
  const result = await this.executor.client.query(chunkCompiled.sql, chunkCompiled.params);
@@ -1406,7 +1445,7 @@ var QuerySet = class QuerySet {
1406
1445
  const key = normalized[chunkCompiled.targetKey];
1407
1446
  if (typeof key !== "string" && typeof key !== "number") continue;
1408
1447
  for (const owner of groupedOwners.get(key) ?? []) if (node.cardinality === InternalRelationHydrationCardinality.MANY) owner[node.relationName].push(canonical);
1409
- else if (owner[node.relationName] === null) owner[node.relationName] = canonical;
1448
+ else if (owner[node.relationName] === null) owner[node.relationName] = canonical;
1410
1449
  const childPrimaryKey = canonical[node.targetPrimaryKey];
1411
1450
  if (typeof childPrimaryKey === "string" || typeof childPrimaryKey === "number") canonicalChildren.set(childPrimaryKey, canonical);
1412
1451
  }
@@ -1422,7 +1461,7 @@ else if (owner[node.relationName] === null) owner[node.relationName] = canonical
1422
1461
  return chunks;
1423
1462
  }
1424
1463
  groupOwnersByAccessor(owners, accessor) {
1425
- const grouped = new Map();
1464
+ const grouped = /* @__PURE__ */ new Map();
1426
1465
  for (const owner of owners) {
1427
1466
  const key = owner[accessor];
1428
1467
  if (typeof key !== "string" && typeof key !== "number") continue;
@@ -1435,7 +1474,7 @@ else if (owner[node.relationName] === null) owner[node.relationName] = canonical
1435
1474
  canonicalizeEntity(node, row, canonicalEntities) {
1436
1475
  const primaryKeyValue = row[node.targetPrimaryKey];
1437
1476
  if (typeof primaryKeyValue !== "string" && typeof primaryKeyValue !== "number") return row;
1438
- const byModel = canonicalEntities.get(node.targetModelKey) ?? new Map();
1477
+ const byModel = canonicalEntities.get(node.targetModelKey) ?? /* @__PURE__ */ new Map();
1439
1478
  const existing = byModel.get(primaryKeyValue);
1440
1479
  if (existing) {
1441
1480
  Object.assign(existing, row);
@@ -1481,13 +1520,18 @@ else if (owner[node.relationName] === null) owner[node.relationName] = canonical
1481
1520
  return normalized ?? row;
1482
1521
  }
1483
1522
  withoutHydrationState() {
1484
- const { selectRelated: _selectRelated, prefetchRelated: _prefetchRelated,...rest } = this.state;
1523
+ const { selectRelated: _selectRelated, prefetchRelated: _prefetchRelated, ...rest } = this.state;
1485
1524
  return rest;
1486
1525
  }
1487
1526
  };
1488
-
1489
1527
  //#endregion
1490
1528
  //#region src/query/ModelQuerySet.ts
1529
+ /**
1530
+ * Concrete `QuerySet` implementation returned by `Model.objects.query()`.
1531
+ *
1532
+ * It executes the accumulated queryset state directly against the bound
1533
+ * model executor.
1534
+ */
1491
1535
  var ModelQuerySet = class ModelQuerySet extends QuerySet {
1492
1536
  constructor(executor, state = {}) {
1493
1537
  super(executor, state);
@@ -1496,11 +1540,9 @@ var ModelQuerySet = class ModelQuerySet extends QuerySet {
1496
1540
  return new ModelQuerySet(this.executor, state);
1497
1541
  }
1498
1542
  };
1499
-
1500
1543
  //#endregion
1501
1544
  //#region src/query/index.ts
1502
- var query_exports = {};
1503
- __export(query_exports, {
1545
+ var query_exports = /* @__PURE__ */ __exportAll({
1504
1546
  ModelQuerySet: () => ModelQuerySet,
1505
1547
  Q: () => QBuilder,
1506
1548
  QBuilder: () => QBuilder,
@@ -1510,7 +1552,7 @@ __export(query_exports, {
1510
1552
  compiler: () => compiler_exports,
1511
1553
  domain: () => domain_exports
1512
1554
  });
1513
-
1514
1555
  //#endregion
1515
- export { InternalQNodeType, InternalRelationKind, InternalSqlValidationPlanKind, ModelQuerySet, OrmSqlSafetyAdapter, QBuilder, QueryCompiler, QueryResult, QuerySet, TableMetaFactory, compiler_exports, domain_exports, isQNodeLike, query_exports };
1516
- //# sourceMappingURL=query-DUZnBFhf.js.map
1556
+ export { isQNodeLike as a, InternalRelationKind as c, QueryCompiler as d, OrmSqlSafetyAdapter as f, QBuilder as i, QueryResult as l, InternalQNodeType as m, ModelQuerySet as n, domain_exports as o, InternalSqlValidationPlanKind as p, QuerySet as r, TableMetaFactory as s, query_exports as t, compiler_exports as u };
1557
+
1558
+ //# sourceMappingURL=query-CP1UMIX6.js.map