@danceroutine/tango-orm 0.1.0 → 1.0.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 (79) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +104 -0
  3. package/dist/{PostgresAdapter-_X36-mLL.js → PostgresAdapter-C9a1XJRx.js} +31 -7
  4. package/dist/PostgresAdapter-C9a1XJRx.js.map +1 -0
  5. package/dist/PostgresAdapter-CBc1u8eT.js +3 -0
  6. package/dist/SqliteAdapter-BJKNxCvS.js +3 -0
  7. package/dist/SqliteAdapter-Dp6VRXmz.js +118 -0
  8. package/dist/SqliteAdapter-Dp6VRXmz.js.map +1 -0
  9. package/dist/connection/adapters/Adapter.d.ts +9 -0
  10. package/dist/connection/adapters/AdapterRegistry.d.ts +28 -1
  11. package/dist/connection/adapters/dialects/PostgresAdapter.d.ts +10 -1
  12. package/dist/connection/adapters/dialects/SqliteAdapter.d.ts +11 -1
  13. package/dist/connection/clients/DBClient.d.ts +8 -0
  14. package/dist/connection/clients/dialects/PostgresClient.d.ts +22 -1
  15. package/dist/connection/clients/dialects/SqliteClient.d.ts +26 -1
  16. package/dist/connection/index.js +3 -3
  17. package/dist/{connection-DytAsjC9.js → connection-CVvycXus.js} +21 -6
  18. package/dist/connection-CVvycXus.js.map +1 -0
  19. package/dist/index.d.ts +7 -4
  20. package/dist/index.js +9 -8
  21. package/dist/manager/ManagerLike.d.ts +15 -0
  22. package/dist/manager/ModelManager.d.ts +48 -0
  23. package/dist/manager/index.d.ts +6 -0
  24. package/dist/manager/index.js +8 -0
  25. package/dist/manager/internal/MutationCompiler.d.ts +15 -0
  26. package/dist/manager/internal/RuntimeBoundClient.d.ts +16 -0
  27. package/dist/manager/registerModelObjects.d.ts +5 -0
  28. package/dist/manager-D6tU8xTO.js +13 -0
  29. package/dist/manager-D6tU8xTO.js.map +1 -0
  30. package/dist/query/QBuilder.d.ts +18 -0
  31. package/dist/query/QuerySet.d.ts +60 -9
  32. package/dist/query/compiler/QueryCompiler.d.ts +19 -2
  33. package/dist/query/domain/{RepositoryMeta.d.ts → TableMeta.d.ts} +1 -1
  34. package/dist/query/domain/index.d.ts +1 -1
  35. package/dist/query/index.d.ts +2 -2
  36. package/dist/query/index.js +1 -2
  37. package/dist/query-wnl4h2o7.js +671 -0
  38. package/dist/query-wnl4h2o7.js.map +1 -0
  39. package/dist/registerModelObjects-emX7Hja9.js +354 -0
  40. package/dist/registerModelObjects-emX7Hja9.js.map +1 -0
  41. package/dist/runtime/TangoRuntime.d.ts +34 -0
  42. package/dist/runtime/defaultRuntime.d.ts +13 -0
  43. package/dist/runtime/index.d.ts +13 -0
  44. package/dist/runtime/index.js +8 -0
  45. package/dist/runtime-7U5_XDad.js +17 -0
  46. package/dist/runtime-7U5_XDad.js.map +1 -0
  47. package/dist/transaction/UnitOfWork.d.ts +21 -3
  48. package/dist/transaction/index.js +1 -1
  49. package/dist/{transaction-DIGJnp19.js → transaction-DooTMuAl.js} +29 -11
  50. package/dist/transaction-DooTMuAl.js.map +1 -0
  51. package/dist/validation/OrmSqlSafetyAdapter.d.ts +22 -0
  52. package/dist/validation/SQLValidationEngine.d.ts +51 -0
  53. package/dist/validation/SqlValidationPlan.d.ts +42 -0
  54. package/dist/validation/index.d.ts +3 -0
  55. package/package.json +81 -74
  56. package/dist/PostgresAdapter-DCF8T4vh.js +0 -3
  57. package/dist/PostgresAdapter-_X36-mLL.js.map +0 -1
  58. package/dist/QuerySet-BzR5QzGi.js +0 -411
  59. package/dist/QuerySet-BzR5QzGi.js.map +0 -1
  60. package/dist/SqliteAdapter-CBnxCznk.js +0 -3
  61. package/dist/SqliteAdapter-J03fEjmr.js +0 -70
  62. package/dist/SqliteAdapter-J03fEjmr.js.map +0 -1
  63. package/dist/connection/clients/DBClient.js +0 -1
  64. package/dist/connection/clients/dialects/PostgresClient.js +0 -32
  65. package/dist/connection/clients/dialects/SqliteClient.js +0 -44
  66. package/dist/connection-DytAsjC9.js.map +0 -1
  67. package/dist/query/QuerySet.js +0 -108
  68. package/dist/query/compiler/QueryCompiler.js +0 -183
  69. package/dist/query/domain/CompiledQuery.js +0 -1
  70. package/dist/query/domain/WhereClause.js +0 -1
  71. package/dist/query-CQbvLeuh.js +0 -21
  72. package/dist/query-CQbvLeuh.js.map +0 -1
  73. package/dist/repository/Repository.d.ts +0 -40
  74. package/dist/repository/Repository.js +0 -100
  75. package/dist/repository/index.d.ts +0 -4
  76. package/dist/repository/index.js +0 -4
  77. package/dist/repository-DaRvsfjs.js +0 -78
  78. package/dist/repository-DaRvsfjs.js.map +0 -1
  79. package/dist/transaction-DIGJnp19.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection-CVvycXus.js","names":["value: unknown","adapter: Adapter","name: string","config: AdapterConfig & { adapter: string }","registry?: AdapterRegistry"],"sources":["../src/connection/adapters/dialects/index.ts","../src/connection/adapters/AdapterRegistry.ts","../src/connection/adapters/index.ts","../src/connection/clients/dialects/index.ts","../src/connection/clients/index.ts","../src/connection/index.ts"],"sourcesContent":["/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { PostgresAdapter } from './PostgresAdapter';\nexport { SqliteAdapter } from './SqliteAdapter';\n","import type { Adapter, AdapterConfig } from './Adapter';\nimport type { DBClient } from '../clients/DBClient';\n\n/**\n * Runtime registry for database adapters.\n *\n * Use a custom instance when tests or applications need explicit control\n * over supported adapters; use `getDefaultRegistry()` for the built-in set.\n */\nexport class AdapterRegistry {\n static readonly BRAND = 'tango.orm.adapter_registry' as const;\n private static defaultRegistryInstance: AdapterRegistry | undefined;\n readonly __tangoBrand: typeof AdapterRegistry.BRAND = AdapterRegistry.BRAND;\n private adapters = new Map<string, Adapter>();\n\n /**\n * Narrow an unknown value to `AdapterRegistry`.\n */\n static isAdapterRegistry(value: unknown): value is AdapterRegistry {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === AdapterRegistry.BRAND\n );\n }\n\n /**\n * Return a lazily-initialized registry preloaded with built-in adapters.\n */\n static async getDefaultRegistry(): Promise<AdapterRegistry> {\n if (AdapterRegistry.defaultRegistryInstance) {\n return AdapterRegistry.defaultRegistryInstance;\n }\n\n AdapterRegistry.defaultRegistryInstance = new AdapterRegistry();\n\n const { PostgresAdapter } = await import('./dialects/PostgresAdapter');\n const { SqliteAdapter } = await import('./dialects/SqliteAdapter');\n\n AdapterRegistry.defaultRegistryInstance.register(new PostgresAdapter());\n AdapterRegistry.defaultRegistryInstance.register(new SqliteAdapter());\n\n return AdapterRegistry.defaultRegistryInstance;\n }\n\n /**\n * Register an adapter under its declared `name`.\n */\n register(adapter: Adapter): this {\n this.adapters.set(adapter.name, adapter);\n return this;\n }\n\n /**\n * Resolve an adapter by name, or throw a descriptive error.\n */\n get(name: string): Adapter {\n const adapter = this.adapters.get(name);\n if (!adapter) {\n const available = [...this.adapters.keys()].join(', ');\n throw new Error(`Unknown adapter: ${name}. Available adapters: ${available || 'none'}`);\n }\n return adapter;\n }\n\n /**\n * Check whether an adapter has been registered.\n */\n has(name: string): boolean {\n return this.adapters.has(name);\n }\n}\n\n/**\n * Connect to a database by adapter name using the provided (or default) registry.\n */\nexport async function connectDB(\n config: AdapterConfig & { adapter: string },\n registry?: AdapterRegistry\n): Promise<DBClient> {\n const effectiveRegistry = registry ?? (await AdapterRegistry.getDefaultRegistry());\n const adapter = effectiveRegistry.get(config.adapter);\n return adapter.connect(config);\n}\n\n/**\n * Convenience helper that exposes the singleton default adapter registry.\n */\nexport async function getDefaultAdapterRegistry(): Promise<AdapterRegistry> {\n return AdapterRegistry.getDefaultRegistry();\n}\n","/**\n * Domain boundary barrel: exposes namespaced exports for Django-style drill-down\n * imports and curated flat exports for TS-native ergonomics.\n */\n\nexport * as dialects from './dialects/index';\n\nexport { AdapterRegistry, connectDB, getDefaultAdapterRegistry } from './AdapterRegistry';\nexport type { Adapter, AdapterConfig } from './Adapter';\nexport { PostgresAdapter, SqliteAdapter } from './dialects/index';\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\n\nexport { PostgresClient } from './PostgresClient';\nexport { SqliteClient } from './SqliteClient';\n","/**\n * Domain boundary barrel: exposes namespaced exports for Django-style drill-down\n * imports and curated flat exports for TS-native ergonomics.\n */\n\nexport * as dialects from './dialects/index';\n\nexport type { DBClient } from './DBClient';\nexport { PostgresClient, SqliteClient } from './dialects/index';\n","/**\n * Domain boundary barrel: exposes namespaced exports for Django-style drill-down\n * imports and curated flat exports for TS-native ergonomics.\n */\n\nexport * as adapters from './adapters/index';\nexport * as clients from './clients/index';\n\nexport { AdapterRegistry, connectDB, getDefaultAdapterRegistry } from './adapters/index';\nexport type { Adapter, AdapterConfig } from './adapters/index';\nexport type { DBClient } from './clients/DBClient';\nexport { PostgresAdapter, SqliteAdapter } from './adapters/index';\nexport { PostgresClient, SqliteClient } from './clients/index';\n"],"mappings":";;;;;;;;;;;;;ICSa,kBAAN,MAAM,gBAAgB;CACzB,OAAgB,QAAQ;CACxB,OAAe;CACf,eAAsD,gBAAgB;CACtE,WAAmB,IAAI;;;;CAKvB,OAAO,kBAAkBA,OAA0C;AAC/D,gBACW,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB,gBAAgB;CAE9E;;;;CAKD,aAAa,qBAA+C;AACxD,MAAI,gBAAgB,wBAChB,QAAO,gBAAgB;AAG3B,kBAAgB,0BAA0B,IAAI;EAE9C,MAAM,EAAE,oCAAiB,GAAG,MAAM,OAAO;EACzC,MAAM,EAAE,gCAAe,GAAG,MAAM,OAAO;AAEvC,kBAAgB,wBAAwB,SAAS,IAAI,oBAAkB;AACvE,kBAAgB,wBAAwB,SAAS,IAAI,kBAAgB;AAErE,SAAO,gBAAgB;CAC1B;;;;CAKD,SAASC,SAAwB;AAC7B,OAAK,SAAS,IAAI,QAAQ,MAAM,QAAQ;AACxC,SAAO;CACV;;;;CAKD,IAAIC,MAAuB;EACvB,MAAM,UAAU,KAAK,SAAS,IAAI,KAAK;AACvC,OAAK,SAAS;GACV,MAAM,YAAY,CAAC,GAAG,KAAK,SAAS,MAAM,AAAC,EAAC,KAAK,KAAK;AACtD,SAAM,IAAI,OAAO,mBAAmB,KAAK,wBAAwB,aAAa,OAAO;EACxF;AACD,SAAO;CACV;;;;CAKD,IAAIA,MAAuB;AACvB,SAAO,KAAK,SAAS,IAAI,KAAK;CACjC;AACJ;AAKM,eAAe,UAClBC,QACAC,UACiB;CACjB,MAAM,oBAAoB,YAAa,MAAM,gBAAgB,oBAAoB;CACjF,MAAM,UAAU,kBAAkB,IAAI,OAAO,QAAQ;AACrD,QAAO,QAAQ,QAAQ,OAAO;AACjC;AAKM,eAAe,4BAAsD;AACxE,QAAO,gBAAgB,oBAAoB;AAC9C"}
package/dist/index.d.ts CHANGED
@@ -2,8 +2,9 @@
2
2
  * Bundled exports for Django users who are used to Django domain-drill-down imports
3
3
  */
4
4
  export * as connection from './connection/index';
5
+ export * as manager from './manager/index';
5
6
  export * as query from './query/index';
6
- export * as repository from './repository/index';
7
+ export * as runtime from './runtime/index';
7
8
  export * as transaction from './transaction/index';
8
9
  /**
9
10
  * Unbundled exports for more TS native developers
@@ -11,8 +12,10 @@ export * as transaction from './transaction/index';
11
12
  export { AdapterRegistry, connectDB, getDefaultAdapterRegistry } from './connection/index';
12
13
  export type { Adapter, AdapterConfig, DBClient } from './connection/index';
13
14
  export { PostgresAdapter, SqliteAdapter } from './connection/index';
15
+ export { ModelManager } from './manager/index';
16
+ export type { ManagerLike } from './manager/index';
14
17
  export { Q, QBuilder, QueryCompiler, QuerySet } from './query/index';
15
- export type { RepositoryLike } from './query/index';
16
- export type { CompiledQuery, Dialect, Direction, FilterInput, FilterKey, FilterValue, LookupType, OrderSpec, OrderToken, QNode, QueryResult, QuerySetState, RelationMeta, RepoMeta, WhereClause, } from './query/domain/index';
17
- export { Repository } from './repository/index';
18
+ export type { QueryExecutor } from './query/index';
19
+ export type { CompiledQuery, Dialect, Direction, FilterInput, FilterKey, FilterValue, LookupType, OrderSpec, OrderToken, QNode, QueryResult, QuerySetState, RelationMeta, TableMeta, WhereClause, } from './query/domain/index';
20
+ export { getTangoRuntime, initializeTangoRuntime, resetTangoRuntime, TangoRuntime } from './runtime/index';
18
21
  export { UnitOfWork } from './transaction/index';
package/dist/index.js CHANGED
@@ -1,9 +1,10 @@
1
- import { PostgresAdapter } from "./PostgresAdapter-_X36-mLL.js";
2
- import { SqliteAdapter } from "./SqliteAdapter-J03fEjmr.js";
3
- import { AdapterRegistry, connectDB, connection_exports, getDefaultAdapterRegistry } from "./connection-DytAsjC9.js";
4
- import { QBuilder, QueryCompiler, QuerySet } from "./QuerySet-BzR5QzGi.js";
5
- import { query_exports } from "./query-CQbvLeuh.js";
6
- import { Repository, repository_exports } from "./repository-DaRvsfjs.js";
7
- import { UnitOfWork, transaction_exports } from "./transaction-DIGJnp19.js";
1
+ import { PostgresAdapter } from "./PostgresAdapter-C9a1XJRx.js";
2
+ import { SqliteAdapter } from "./SqliteAdapter-Dp6VRXmz.js";
3
+ import { AdapterRegistry, connectDB, connection_exports, getDefaultAdapterRegistry } from "./connection-CVvycXus.js";
4
+ import { QBuilder, QueryCompiler, QuerySet, query_exports } from "./query-wnl4h2o7.js";
5
+ import { ModelManager, TangoRuntime, getTangoRuntime, initializeTangoRuntime, resetTangoRuntime } from "./registerModelObjects-emX7Hja9.js";
6
+ import { manager_exports } from "./manager-D6tU8xTO.js";
7
+ import { runtime_exports } from "./runtime-7U5_XDad.js";
8
+ import { UnitOfWork, transaction_exports } from "./transaction-DooTMuAl.js";
8
9
 
9
- export { AdapterRegistry, PostgresAdapter, QBuilder as Q, QBuilder, QueryCompiler, QuerySet, Repository, SqliteAdapter, UnitOfWork, connectDB, connection_exports as connection, getDefaultAdapterRegistry, query_exports as query, repository_exports as repository, transaction_exports as transaction };
10
+ export { AdapterRegistry, ModelManager, PostgresAdapter, QBuilder as Q, QBuilder, QueryCompiler, QuerySet, SqliteAdapter, TangoRuntime, UnitOfWork, connectDB, connection_exports as connection, getDefaultAdapterRegistry, getTangoRuntime, initializeTangoRuntime, manager_exports as manager, query_exports as query, resetTangoRuntime, runtime_exports as runtime, transaction_exports as transaction };
@@ -0,0 +1,15 @@
1
+ import type { QuerySet } from '../query/index';
2
+ import type { TableMeta } from '../query/domain/index';
3
+ /**
4
+ * Public manager contract consumed by Tango resources and applications.
5
+ */
6
+ export interface ManagerLike<T extends Record<string, unknown>> {
7
+ readonly meta: TableMeta;
8
+ query(): QuerySet<T>;
9
+ findById(id: T[keyof T]): Promise<T | null>;
10
+ getOrThrow(id: T[keyof T]): Promise<T>;
11
+ create(input: Partial<T>): Promise<T>;
12
+ update(id: T[keyof T], patch: Partial<T>): Promise<T>;
13
+ delete(id: T[keyof T]): Promise<void>;
14
+ bulkCreate(inputs: Partial<T>[]): Promise<T[]>;
15
+ }
@@ -0,0 +1,48 @@
1
+ import type { ModelWriteHooks } from '@danceroutine/tango-schema';
2
+ import type { TableMeta } from '../query/domain/index';
3
+ import type { QuerySet } from '../query/index';
4
+ import type { TangoRuntime } from '../runtime/TangoRuntime';
5
+ import type { ManagerLike } from './ManagerLike';
6
+ type FieldLike = {
7
+ name: string;
8
+ type: string;
9
+ primaryKey?: boolean;
10
+ };
11
+ type ModelLike<T extends Record<string, unknown>> = {
12
+ metadata: {
13
+ name: string;
14
+ table: string;
15
+ fields: FieldLike[];
16
+ };
17
+ schema: {
18
+ parse(input: unknown): T;
19
+ };
20
+ hooks?: ModelWriteHooks<T>;
21
+ };
22
+ /**
23
+ * Model-backed data access API exposed as `Model.objects`.
24
+ */
25
+ export declare class ModelManager<T extends Record<string, unknown>> implements ManagerLike<T> {
26
+ static readonly BRAND: "tango.orm.model_manager";
27
+ readonly __tangoBrand: typeof ModelManager.BRAND;
28
+ readonly meta: TableMeta;
29
+ private readonly queryExecutor;
30
+ private readonly mutationCompiler;
31
+ private readonly model;
32
+ constructor(model: ModelLike<T>, runtime: TangoRuntime);
33
+ /**
34
+ * Narrow an unknown value to `ModelManager`.
35
+ */
36
+ static isModelManager<T extends Record<string, unknown>>(value: unknown): value is ModelManager<T>;
37
+ private static createTableMeta;
38
+ query(): QuerySet<T>;
39
+ findById(id: T[keyof T]): Promise<T | null>;
40
+ getOrThrow(id: T[keyof T]): Promise<T>;
41
+ create(input: Partial<T>): Promise<T>;
42
+ update(id: T[keyof T], patch: Partial<T>): Promise<T>;
43
+ delete(id: T[keyof T]): Promise<void>;
44
+ bulkCreate(inputs: Partial<T>[]): Promise<T[]>;
45
+ private runBeforeCreate;
46
+ private runBeforeUpdate;
47
+ }
48
+ export {};
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Domain boundary barrel: centralizes manager-first ORM APIs.
3
+ */
4
+ export type { ManagerLike } from './ManagerLike';
5
+ export { ModelManager } from './ModelManager';
6
+ export { registerModelObjects } from './registerModelObjects';
@@ -0,0 +1,8 @@
1
+ import "../PostgresAdapter-C9a1XJRx.js";
2
+ import "../SqliteAdapter-Dp6VRXmz.js";
3
+ import "../connection-CVvycXus.js";
4
+ import "../query-wnl4h2o7.js";
5
+ import { ModelManager, registerModelObjects } from "../registerModelObjects-emX7Hja9.js";
6
+ import "../manager-D6tU8xTO.js";
7
+
8
+ export { ModelManager, registerModelObjects };
@@ -0,0 +1,15 @@
1
+ import type { CompiledQuery, Dialect } from '../../query/domain/index';
2
+ import type { ValidatedDeleteSqlPlan, ValidatedInsertSqlPlan, ValidatedUpdateSqlPlan } from '../../validation/SQLValidationEngine';
3
+ /**
4
+ * Internal compiler for manager-owned INSERT/UPDATE/DELETE statements.
5
+ */
6
+ export declare class MutationCompiler {
7
+ private readonly dialect;
8
+ constructor(dialect: Dialect);
9
+ compileInsert(plan: ValidatedInsertSqlPlan, values: readonly unknown[]): CompiledQuery;
10
+ compileUpdate(plan: ValidatedUpdateSqlPlan, values: readonly unknown[], id: unknown): CompiledQuery;
11
+ compileDelete(plan: ValidatedDeleteSqlPlan, id: unknown): CompiledQuery;
12
+ compileBulkInsert(plan: ValidatedInsertSqlPlan, valueRows: ReadonlyArray<ReadonlyArray<unknown>>): CompiledQuery;
13
+ private buildValuePlaceholders;
14
+ private placeholder;
15
+ }
@@ -0,0 +1,16 @@
1
+ import type { DBClient } from '../../connection/index';
2
+ import type { TangoRuntime } from '../../runtime/index';
3
+ /**
4
+ * DB client proxy that resolves the real Tango runtime client lazily.
5
+ */
6
+ export declare class RuntimeBoundClient implements DBClient {
7
+ private readonly runtime;
8
+ constructor(runtime: TangoRuntime);
9
+ query<T = unknown>(sql: string, params?: readonly unknown[]): Promise<{
10
+ rows: T[];
11
+ }>;
12
+ begin(): Promise<void>;
13
+ commit(): Promise<void>;
14
+ rollback(): Promise<void>;
15
+ close(): Promise<void>;
16
+ }
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Install the schema model augmentor that exposes `Model.objects`.
3
+ * This registration is idempotent so multiple Tango entrypoints can safely call it.
4
+ */
5
+ export declare function registerModelObjects(): void;
@@ -0,0 +1,13 @@
1
+ import { __export } from "./chunk-DLY2FNSh.js";
2
+ import { ModelManager, registerModelObjects } from "./registerModelObjects-emX7Hja9.js";
3
+
4
+ //#region src/manager/index.ts
5
+ var manager_exports = {};
6
+ __export(manager_exports, {
7
+ ModelManager: () => ModelManager,
8
+ registerModelObjects: () => registerModelObjects
9
+ });
10
+
11
+ //#endregion
12
+ export { manager_exports };
13
+ //# sourceMappingURL=manager-D6tU8xTO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager-D6tU8xTO.js","names":[],"sources":["../src/manager/index.ts"],"sourcesContent":["/**\n * Domain boundary barrel: centralizes manager-first ORM APIs.\n */\nexport type { ManagerLike } from './ManagerLike';\nexport { ModelManager } from './ModelManager';\nexport { registerModelObjects } from './registerModelObjects';\n"],"mappings":""}
@@ -1,11 +1,29 @@
1
1
  import type { QNode } from './domain/QNode';
2
2
  import type { FilterInput } from './domain/FilterInput';
3
+ /**
4
+ * Static builder for composing boolean query expressions.
5
+ *
6
+ * This mirrors Django's `Q(...)` composition patterns and is intended
7
+ * for ergonomic construction of nested `AND`/`OR`/`NOT` trees.
8
+ */
3
9
  export declare class QBuilder {
4
10
  static readonly BRAND: "tango.orm.q_builder";
5
11
  readonly __tangoBrand: typeof QBuilder.BRAND;
12
+ /**
13
+ * Narrow an unknown value to `QBuilder`.
14
+ */
6
15
  static isQBuilder(value: unknown): value is QBuilder;
16
+ /**
17
+ * Combine multiple filter fragments using logical `AND`.
18
+ */
7
19
  static and<T>(...nodes: Array<FilterInput<T> | QNode<T>>): QNode<T>;
20
+ /**
21
+ * Combine multiple filter fragments using logical `OR`.
22
+ */
8
23
  static or<T>(...nodes: Array<FilterInput<T> | QNode<T>>): QNode<T>;
24
+ /**
25
+ * Negate a filter fragment using logical `NOT`.
26
+ */
9
27
  static not<T>(node: FilterInput<T> | QNode<T>): QNode<T>;
10
28
  private static wrapNode;
11
29
  }
@@ -1,19 +1,21 @@
1
1
  import type { DBClient } from '../connection/clients/DBClient';
2
2
  import type { Dialect } from './domain/Dialect';
3
3
  import type { QuerySetState } from './domain/QuerySetState';
4
- import type { RepositoryMeta } from './domain/RepositoryMeta';
4
+ import type { TableMeta } from './domain/TableMeta';
5
5
  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
9
  /**
10
- * Interface for repository-like objects that can execute queries.
11
- * Used internally by QuerySet to remain decoupled from specific repository implementations.
10
+ * Query execution seam consumed by `QuerySet`.
11
+ *
12
+ * Application code usually reaches this through `Model.objects` or testing
13
+ * fixtures rather than implementing it directly.
12
14
  *
13
15
  * @template T - The model type
14
16
  */
15
- export interface RepositoryLike<T> {
16
- meta: RepositoryMeta;
17
+ export interface QueryExecutor<T> {
18
+ meta: TableMeta;
17
19
  client: DBClient;
18
20
  dialect: Dialect;
19
21
  run(compiled: {
@@ -29,36 +31,85 @@ export interface RepositoryLike<T> {
29
31
  *
30
32
  * @example
31
33
  * ```typescript
32
- * const users = await repository
34
+ * const users = await TodoModel.objects
33
35
  * .query()
34
36
  * .filter({ active: true })
35
37
  * .filter(Q.or({ role: 'admin' }, { role: 'moderator' }))
36
38
  * .orderBy('-createdAt')
37
39
  * .limit(10)
38
- * .fetchAll();
40
+ * .fetch();
39
41
  * ```
40
42
  */
41
43
  export declare class QuerySet<T extends Record<string, unknown>> {
42
- private repo;
44
+ private executor;
43
45
  private state;
44
46
  static readonly BRAND: "tango.orm.query_set";
45
47
  readonly __tangoBrand: typeof QuerySet.BRAND;
48
+ constructor(executor: QueryExecutor<T>, state?: QuerySetState<T>);
49
+ /**
50
+ * Narrow an unknown value to `QuerySet`.
51
+ */
46
52
  static isQuerySet<T extends Record<string, unknown>>(value: unknown): value is QuerySet<T>;
47
- constructor(repo: RepositoryLike<T>, state?: QuerySetState<T>);
53
+ /**
54
+ * Add a filter expression to the query.
55
+ *
56
+ * Multiple `filter()` calls are composed with `AND`.
57
+ */
48
58
  filter(q: FilterInput<T> | QNode<T>): QuerySet<T>;
59
+ /**
60
+ * Add an exclusion expression to the query.
61
+ *
62
+ * Exclusions are translated to `NOT (...)` predicates.
63
+ */
49
64
  exclude(q: FilterInput<T> | QNode<T>): QuerySet<T>;
65
+ /**
66
+ * Apply ordering tokens such as `'name'` or `'-createdAt'`.
67
+ */
50
68
  orderBy(...tokens: OrderToken<T>[]): QuerySet<T>;
69
+ /**
70
+ * Limit the maximum number of rows returned.
71
+ */
51
72
  limit(n: number): QuerySet<T>;
73
+ /**
74
+ * Skip the first `n` rows.
75
+ */
52
76
  offset(n: number): QuerySet<T>;
77
+ /**
78
+ * Restrict selected columns.
79
+ */
53
80
  select(cols: (keyof T)[]): QuerySet<T>;
81
+ /**
82
+ * Request SQL joins for related data when supported by relation metadata.
83
+ */
54
84
  selectRelated(...rels: string[]): QuerySet<T>;
85
+ /**
86
+ * Register relation names for prefetch behavior.
87
+ *
88
+ * Prefetch orchestration is adapter-specific.
89
+ */
55
90
  prefetchRelated(...rels: string[]): QuerySet<T>;
91
+ /**
92
+ * Execute the query and optionally shape each row.
93
+ */
56
94
  fetch<Out = T>(shape?: ((r: T) => Out) | {
57
95
  parse: (r: T) => Out;
58
96
  }): Promise<QueryResult<Out>>;
97
+ /**
98
+ * Execute the query and return the first row, or `null`.
99
+ */
59
100
  fetchOne<Out = T>(shape?: ((r: T) => Out) | {
60
101
  parse: (r: T) => Out;
61
102
  }): Promise<Out | null>;
103
+ /**
104
+ * Execute a `COUNT(*)` query for the current filtered state.
105
+ */
62
106
  count(): Promise<number>;
107
+ /**
108
+ * Return whether at least one row matches the current query state.
109
+ */
63
110
  exists(): Promise<boolean>;
111
+ private normalizeRowsForSchemaParsing;
112
+ private isBooleanColumnType;
113
+ private normalizeSqliteBoolean;
114
+ private normalizeBooleanColumns;
64
115
  }
@@ -1,14 +1,29 @@
1
1
  import type { QuerySetState } from '../domain/QuerySetState';
2
- import type { RepositoryMeta } from '../domain/RepositoryMeta';
2
+ import type { TableMeta } from '../domain/TableMeta';
3
3
  import type { CompiledQuery } from '../domain/CompiledQuery';
4
4
  import type { Dialect } from '../domain/Dialect';
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`.
10
+ */
5
11
  export declare class QueryCompiler {
6
12
  private meta;
7
13
  private dialect;
8
14
  static readonly BRAND: "tango.orm.query_compiler";
9
15
  readonly __tangoBrand: typeof QueryCompiler.BRAND;
16
+ /**
17
+ * Build a compiler for the given repository metadata and SQL dialect.
18
+ */
19
+ constructor(meta: TableMeta, dialect?: Dialect);
20
+ /**
21
+ * Narrow an unknown value to `QueryCompiler`.
22
+ */
10
23
  static isQueryCompiler(value: unknown): value is QueryCompiler;
11
- constructor(meta: RepositoryMeta, dialect?: Dialect);
24
+ /**
25
+ * Compile a query state tree into a SQL statement and bound parameters.
26
+ */
12
27
  compile<T>(state: QuerySetState<T>): CompiledQuery;
13
28
  private compileQNode;
14
29
  private compileAtom;
@@ -17,4 +32,6 @@ export declare class QueryCompiler {
17
32
  private compileNot;
18
33
  private lookupToSQL;
19
34
  private normalizeParam;
35
+ private collectStateFilterKeys;
36
+ private collectNodeFilterKeys;
20
37
  }
@@ -1,5 +1,5 @@
1
1
  import type { RelationMeta } from './RelationMeta';
2
- export interface RepositoryMeta {
2
+ export interface TableMeta {
3
3
  table: string;
4
4
  pk: string;
5
5
  columns: Record<string, string>;
@@ -14,5 +14,5 @@ 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 { RepositoryMeta as RepoMeta } from './RepositoryMeta';
17
+ export type { TableMeta } from './TableMeta';
18
18
  export type { WhereClause } from './WhereClause';
@@ -5,8 +5,8 @@
5
5
  export * as compiler from './compiler/index';
6
6
  export * as domain from './domain/index';
7
7
  export type * from './domain/index';
8
- export type { RepoMeta } from './domain/index';
8
+ export type { TableMeta } from './domain/index';
9
9
  export { QuerySet } from './QuerySet';
10
- export type { RepositoryLike } from './QuerySet';
10
+ export type { QueryExecutor } from './QuerySet';
11
11
  export { QBuilder, QBuilder as Q } from './QBuilder';
12
12
  export { QueryCompiler } from './compiler/index';
@@ -1,4 +1,3 @@
1
- import { QBuilder, QueryCompiler, QuerySet, compiler_exports } from "../QuerySet-BzR5QzGi.js";
2
- import { domain_exports } from "../query-CQbvLeuh.js";
1
+ import { QBuilder, QueryCompiler, QuerySet, compiler_exports, domain_exports } from "../query-wnl4h2o7.js";
3
2
 
4
3
  export { QBuilder as Q, QBuilder, QueryCompiler, QuerySet, compiler_exports as compiler, domain_exports as domain };