@zeroxsolutions/db 10.4.1 → 10.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,13 @@
1
+ ## 10.5.0 (2026-11-06)
2
+
3
+ ### 🚀 Features
4
+
5
+ - **db:** let READS place a sort's NULL rows first or last ([3a92840](https://github.com/zeroxsolutions/zeroxsolutions/commit/3a92840))
6
+
7
+ ### ❤️ Thank You
8
+
9
+ - luongvantuit
10
+
1
11
  ## 10.4.1 (2026-10-29)
2
12
 
3
13
  ### 🩹 Fixes
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @zeroxsolutions/db
2
2
 
3
- A shared database library providing base entities, repository patterns, and query utilities built on top of [Drizzle ORM](https://orm.drizzle.team/). Supports both **PostgreSQL** (via `postgres-js`) and **Cloudflare D1** (SQLite).
3
+ A shared database library providing base entities, repository patterns, and query utilities built on top of [Drizzle ORM](https://orm.drizzle.team/). Supports both **PostgreSQL**, on any drizzle Postgres driver (`postgres-js`, `node-postgres`, ...), and **Cloudflare D1** (SQLite).
4
4
 
5
5
  ## Features
6
6
 
@@ -10,8 +10,8 @@ A shared database library providing base entities, repository patterns, and quer
10
10
  - `BaseViewRepository` for PostgreSQL materialized views, reading with the options a table repository takes
11
11
  - Reads that name what they load: a `read` of columns and nested relations, a `filter` tree, an `orderBy` with the
12
12
  primary key appended, and a page window only when one is given
13
- - `READS` (`defineReads`), declared once per context: each table's order as a relation and its `virtual` filter and
14
- order names; `relationsOf` for the relationships a permit list names; `withoutRelation` for a relation a finder
13
+ - `READS` (`defineReads`), declared once per context: each table's order as a relation, its `virtual` filter and
14
+ order names, and where a sort puts NULL rows; `relationsOf` for the relationships a permit list names; `withoutRelation` for a relation a finder
15
15
  loads through one of its own
16
16
  - The filter vocabulary the wire toolkit is generic over: `filterOperatorSchema` / `FilterOperator` (15 operators),
17
17
  `filterValueSchema`, and typed refusals (`UnknownQueryField`, `UnknownReadName`)
@@ -83,13 +83,12 @@ Extend `BaseRepository`; a read or a write keyed by anything but the id is a fin
83
83
 
84
84
  ```ts
85
85
  import { eq } from 'drizzle-orm';
86
- import { BaseRepository, type FindAllOptions } from '@zeroxsolutions/db/postgres';
87
- import type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';
86
+ import { BaseRepository, type Database, type FindAllOptions } from '@zeroxsolutions/db/postgres';
88
87
  import * as schema from './schema';
89
88
  import { READS, usersTable } from './schema';
90
89
 
91
90
  export class UserRepository extends BaseRepository<typeof usersTable, typeof schema, 'usersTable'> {
92
- constructor(db: PostgresJsDatabase<typeof schema>) {
91
+ constructor(db: Database<typeof schema>) {
93
92
  super(db, usersTable, 'usersTable', READS); // the export name, and the context's READS
94
93
  }
95
94
 
@@ -193,8 +192,10 @@ export const READS = defineReads<typeof schema, PlaceReadContext>(schema, {
193
192
  },
194
193
  distance: {
195
194
  order: ({ context }) => sql`<the distance from ${context?.origin.lat}, ${context?.origin.lng} to the place>`,
195
+ nulls: 'last',
196
196
  },
197
197
  },
198
+ nulls: { featuredAt: 'last' },
198
199
  },
199
200
  });
200
201
 
@@ -209,6 +210,11 @@ A `virtual` name receives `at` and the finder's `context`, typed by `defineReads
209
210
  does not check `context`, and hands `undefined` where the caller passed none, so a name reading it decides what it
210
211
  means without one. A count reads `context` as the page does, so a total and its page match the same rows.
211
212
 
213
+ `nulls` puts the rows whose value is NULL `first` or `last` in both directions, rendered as `asc nulls last` or
214
+ `desc nulls last`; where it is absent the database decides, which on Postgres is last on `asc` and first on `desc`.
215
+ A column's placement sits in the table's `nulls`, keyed by its own columns alone, so a misspelled name fails to compile
216
+ and throws when `defineReads` runs. A `virtual` name declares its own beside its `order`.
217
+
212
218
  #### Nullify FK
213
219
 
214
220
  `nullifyBy` sets a foreign key column to `null` where it matches a given value, from inside a named method:
@@ -234,12 +240,12 @@ await db.transaction(async (tx) => {
234
240
  ### BaseViewRepository (Materialized Views)
235
241
 
236
242
  ```ts
237
- import { BaseViewRepository } from '@zeroxsolutions/db/postgres';
243
+ import { BaseViewRepository, type Database } from '@zeroxsolutions/db/postgres';
238
244
  import { userSummaryView } from './views';
239
245
 
240
246
  // The same schema-typed client the service's table repositories take.
241
247
  export class UserSummaryViewRepository extends BaseViewRepository<typeof userSummaryView, typeof schema> {
242
- constructor(db: PostgresJsDatabase<typeof schema>) {
248
+ constructor(db: Database<typeof schema>) {
243
249
  super(db, userSummaryView, ['tenantId']); // the columns of the view's unique index
244
250
  }
245
251
  }
@@ -479,7 +485,7 @@ Everything it imports is an **optional** peer dependency, so a service that neve
479
485
  subpath installs none of it. A package whose tests do want it declares all three:
480
486
 
481
487
  ```sh
482
- pnpm add -D @testcontainers/postgresql drizzle-kit postgres
488
+ pnpm add -D @testcontainers/postgresql drizzle-kit pg @types/pg
483
489
  ```
484
490
 
485
491
  ```ts
@@ -513,11 +519,11 @@ This package names no engine for you, and exports no constant standing in as tha
513
519
  major you run is your deployment's own fact, so `image` takes no default: a forgotten argument is a
514
520
  typecheck failure rather than a suite that quietly passed on a major you do not deploy.
515
521
 
516
- | Export | What it is |
517
- | ---------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
518
- | `startDisposablePostgres(schema, image)` | Starts the container, creates `schema` in it, and returns a Drizzle client typed against it, the `connectionString` it dialled, and the `stop()` that tears it down. A server `WARNING` prints as one line on `console.warn`; lower severities are dropped |
519
- | `CONTAINER_TIMEOUT_MS` | 180s, for the hook that starts a container: an image pull on a cold machine outruns vitest's 5s default |
520
- | `fakeUuidV7` | Random bits in a v7 layout: it passes a v7 check, and is not time-ordered like a minted id |
522
+ | Export | What it is |
523
+ | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
524
+ | `startDisposablePostgres(schema, image)` | Starts the container, creates `schema` in it, and returns a node-postgres Drizzle client typed against it (a raw `execute` answers a `QueryResult`, rows under `.rows`), the `connectionString` it dialled, and the `stop()` that tears it down. A server `WARNING` prints as one line on `console.warn`; lower severities are dropped |
525
+ | `CONTAINER_TIMEOUT_MS` | 180s, for the hook that starts a container: an image pull on a cold machine outruns vitest's 5s default |
526
+ | `fakeUuidV7` | Random bits in a v7 layout: it passes a v7 check, and is not time-ordered like a minted id |
521
527
 
522
528
  ### Waiting until one backend blocks another
523
529
 
@@ -1,17 +1,22 @@
1
1
  import type { ExtractTablesWithRelations, InferInsertModel, InferSelectViewModel, SQL } from 'drizzle-orm';
2
2
  import { type InferSelectModel } from 'drizzle-orm';
3
- import type { PgTable, PgTransaction, TableConfig } from 'drizzle-orm/pg-core';
3
+ import type { PgDatabase, PgQueryResultHKT, PgTable, PgTransaction, TableConfig } from 'drizzle-orm/pg-core';
4
4
  import { type PgMaterializedView } from 'drizzle-orm/pg-core';
5
- import type { PostgresJsDatabase, PostgresJsQueryResultHKT } from 'drizzle-orm/postgres-js';
6
5
  import { type FilterNode } from '../../utils/filter.js';
7
6
  import { type ColumnName, type MatchOptions, type OrderEntry, type Read } from '../../utils/read.js';
8
7
  import type { Reads } from '../../utils/reads.js';
9
8
  /** The tables-with-relations view a drizzle schema expands into, for typing relational queries. */
10
9
  export type RelationalSchema<TSchema extends Record<string, unknown>> = ExtractTablesWithRelations<TSchema>;
11
- /** A `postgres-js` transaction handle bound to a full schema and its relations. */
12
- export type Transaction<TFullSchema extends Record<string, unknown> = Record<string, unknown>> = PgTransaction<PostgresJsQueryResultHKT, TFullSchema, ExtractTablesWithRelations<TFullSchema>>;
10
+ /**
11
+ * A Postgres database connection bound to a full schema and its relations, on any drizzle Postgres driver
12
+ * (`postgres-js`, `node-postgres`, ...). What a raw `execute` returns is the driver's own shape, so through this type
13
+ * its result is `unknown`; every query a repository runs reads rows through the query builder instead.
14
+ */
15
+ export type Database<TFullSchema extends Record<string, unknown> = Record<string, unknown>> = PgDatabase<PgQueryResultHKT, TFullSchema, ExtractTablesWithRelations<TFullSchema>>;
16
+ /** A transaction handle bound to a full schema and its relations, on any drizzle Postgres driver. */
17
+ export type Transaction<TFullSchema extends Record<string, unknown> = Record<string, unknown>> = PgTransaction<PgQueryResultHKT, TFullSchema, ExtractTablesWithRelations<TFullSchema>>;
13
18
  /** Whatever runs a given query: a standalone database connection, or an open transaction. */
14
- export type Executor<TFullSchema extends Record<string, unknown> = Record<string, unknown>> = PostgresJsDatabase<TFullSchema> | Transaction<TFullSchema>;
19
+ export type Executor<TFullSchema extends Record<string, unknown> = Record<string, unknown>> = Database<TFullSchema> | Transaction<TFullSchema>;
15
20
  /** A read of one row: what it loads, whether marked rows match, and the instant a `virtual` name is decided at. */
16
21
  export type FindOneOptions<TSchema extends Record<string, unknown> = Record<string, unknown>, TTableName extends keyof RelationalSchema<TSchema> = keyof RelationalSchema<TSchema>> = {
17
22
  read?: Read<ColumnName<TSchema, TTableName>>;
@@ -80,7 +85,7 @@ export interface IBaseRepository<TTable extends PgTable<TableConfig>, TSchema ex
80
85
  }
81
86
  /** A Postgres repository over `TTable`: reads that name what they load, soft delete, and writes keyed by id. */
82
87
  export declare abstract class BaseRepository<TTable extends PgTable<TableConfig>, TSchema extends Record<string, unknown> = Record<string, unknown>, TTableName extends keyof RelationalSchema<TSchema> = keyof RelationalSchema<TSchema>> implements IBaseRepository<TTable, TSchema, TTableName> {
83
- protected db: PostgresJsDatabase<TSchema>;
88
+ protected db: Database<TSchema>;
84
89
  protected table: TTable;
85
90
  protected queryKey?: Extract<TTableName, string> | undefined;
86
91
  protected reads: Reads<TSchema>;
@@ -88,7 +93,7 @@ export declare abstract class BaseRepository<TTable extends PgTable<TableConfig>
88
93
  * @param queryKey - the table's EXPORT name in the schema; omitted, a read that loads a relation throws
89
94
  * @param reads - the context's `READS`: each table's order as a relation, and its `virtual` names
90
95
  */
91
- constructor(db: PostgresJsDatabase<TSchema>, table: TTable, queryKey?: Extract<TTableName, string> | undefined, reads?: Reads<TSchema>);
96
+ constructor(db: Database<TSchema>, table: TTable, queryKey?: Extract<TTableName, string> | undefined, reads?: Reads<TSchema>);
92
97
  protected getExecutor(tx?: Transaction<TSchema>): Executor<TSchema>;
93
98
  private get source();
94
99
  private idColumn;
@@ -168,11 +173,11 @@ export interface IBaseViewRepository<ViewTable extends PgMaterializedView, TSche
168
173
  * is read back with no order of its own, so every order ends on the columns of its unique index.
169
174
  */
170
175
  export declare abstract class BaseViewRepository<ViewTable extends PgMaterializedView, TSchema extends Record<string, unknown> = Record<string, unknown>> implements IBaseViewRepository<ViewTable, TSchema> {
171
- protected db: PostgresJsDatabase<TSchema>;
176
+ protected db: Database<TSchema>;
172
177
  protected viewTable: ViewTable;
173
178
  protected key: readonly ViewColumnName<ViewTable>[];
174
179
  /** @param key - the columns of the view's unique index, appended to every order as a table's primary key is */
175
- constructor(db: PostgresJsDatabase<TSchema>, viewTable: ViewTable, key: readonly ViewColumnName<ViewTable>[]);
180
+ constructor(db: Database<TSchema>, viewTable: ViewTable, key: readonly ViewColumnName<ViewTable>[]);
176
181
  protected getExecutor(tx?: Transaction<TSchema>): Executor<TSchema>;
177
182
  /** The view's selected fields, which a filter and an order resolve against. */
178
183
  private get selectable();
@@ -1 +1 @@
1
- {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/base/postgres/repository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"repository.d.ts","sourceRoot":"","sources":["../../../src/base/postgres/repository.ts"],"names":[],"mappings":"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"}
@@ -170,7 +170,13 @@ export class BaseRepository {
170
170
  }
171
171
  /** Updates the rows matching `where`, answering the first. */
172
172
  async updateWhere(where, data, options) {
173
- const rows = await this.getExecutor(options?.tx).update(this.table).set(data).where(where).returning();
173
+ // Over a table type still generic here, drizzle types `returning()` as the driver's raw result, which the generic
174
+ // driver leaves `unknown`; what it resolves to is the returned rows.
175
+ const rows = (await this.getExecutor(options?.tx)
176
+ .update(this.table)
177
+ .set(data)
178
+ .where(where)
179
+ .returning());
174
180
  return rows[0] ?? null;
175
181
  }
176
182
  /** Removes the rows matching `where`. */
@@ -231,6 +237,7 @@ export class BaseViewRepository {
231
237
  columns: this.selectable,
232
238
  relationKeys: {},
233
239
  virtual: {},
240
+ nulls: {},
234
241
  at: new Date(),
235
242
  context: undefined,
236
243
  caseInsensitiveOperator: true,
@@ -1,15 +1,14 @@
1
1
  import type { IUnitOfWork } from '@zeroxsolutions/cosmic';
2
- import type { PostgresJsDatabase } from 'drizzle-orm/postgres-js';
3
- import type { Transaction } from './repository.js';
2
+ import type { Database, Transaction } from './repository.js';
4
3
  /**
5
- * The `postgres-js` unit of work: runs a piece of work inside one `db.transaction`, handing it whatever
4
+ * The Postgres unit of work, on any drizzle Postgres driver: runs a piece of work inside one `db.transaction`, handing it whatever
6
5
  * `makeRepositories` binds to that transaction. Commits when the work resolves, rolls back if it throws.
7
6
  * Implements the driver-agnostic {@link IUnitOfWork} port from `@zeroxsolutions/cosmic`.
8
7
  */
9
8
  export declare class DrizzleUnitOfWork<TSchema extends Record<string, unknown>, TRepositories> implements IUnitOfWork<TRepositories> {
10
9
  private readonly db;
11
10
  private readonly makeRepositories;
12
- constructor(db: PostgresJsDatabase<TSchema>, makeRepositories: (tx: Transaction<TSchema>) => TRepositories);
11
+ constructor(db: Database<TSchema>, makeRepositories: (tx: Transaction<TSchema>) => TRepositories);
13
12
  run<T>(work: (repositories: TRepositories) => Promise<T>): Promise<T>;
14
13
  }
15
14
  //# sourceMappingURL=unit-of-work.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"unit-of-work.d.ts","sourceRoot":"","sources":["../../../src/base/postgres/unit-of-work.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD;;;;GAIG;AACH,qBAAa,iBAAiB,CAC5B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,aAAa,CACb,YAAW,WAAW,CAAC,aAAa,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBADhB,EAAE,EAAE,kBAAkB,CAAC,OAAO,CAAC,EAC/B,gBAAgB,EAAE,CAAC,EAAE,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,aAAa;IAGhF,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAGtE"}
1
+ {"version":3,"file":"unit-of-work.d.ts","sourceRoot":"","sources":["../../../src/base/postgres/unit-of-work.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAE7D;;;;GAIG;AACH,qBAAa,iBAAiB,CAC5B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvC,aAAa,CACb,YAAW,WAAW,CAAC,aAAa,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,gBAAgB;gBADhB,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,EACrB,gBAAgB,EAAE,CAAC,EAAE,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,aAAa;IAGhF,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,YAAY,EAAE,aAAa,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAGtE"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * The `postgres-js` unit of work: runs a piece of work inside one `db.transaction`, handing it whatever
2
+ * The Postgres unit of work, on any drizzle Postgres driver: runs a piece of work inside one `db.transaction`, handing it whatever
3
3
  * `makeRepositories` binds to that transaction. Commits when the work resolves, rolls back if it throws.
4
4
  * Implements the driver-agnostic {@link IUnitOfWork} port from `@zeroxsolutions/cosmic`.
5
5
  */
@@ -1 +1 @@
1
- {"version":3,"file":"read-engine.d.ts","sourceRoot":"","sources":["../../src/base/read-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsD,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAGvG,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,IAAI,EACT,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EAExB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC;IACxD,2DAA2D;IAC3D,uBAAuB,EAAE,OAAO,CAAC;CAClC;AAED,0GAA0G;AAC1G,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CAM5E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAOvD;AAiBD,uGAAuG;AACvG,wBAAgB,cAAc,CAC5B,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC,GAAG,SAAS,GACxD,YAAY,CAUd;AAED,4GAA4G;AAC5G,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,GAAG,SAAS,GAAG,GAAG,GAAG,SAAS,CAG7F;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CACzB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,GAAG,GAAG,SAAS,EACtB,OAAO,EAAE,YAAY,GAAG,SAAS,GAChC,GAAG,GAAG,SAAS,CAGjB;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAC5B,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,OAAO,EACjB,OAAO,EACH,CAAC;IAAE,OAAO,CAAC,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC,CAAC,GAC9G,SAAS,GACZ,GAAG,EAAE,CAEP;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,OAAO,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,OAAO,EACjB,IAAI,EAAE,IAAI,GAAG,SAAS,GACrB,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,MAAM,CAAC,CAS5C;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAKzF"}
1
+ {"version":3,"file":"read-engine.d.ts","sourceRoot":"","sources":["../../src/base/read-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsD,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AAGvG,OAAO,EAAoB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACzE,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,IAAI,EACT,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EAExB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC;IACxD,2DAA2D;IAC3D,uBAAuB,EAAE,OAAO,CAAC;CAClC;AAED,0GAA0G;AAC1G,wBAAgB,UAAU,CAAC,QAAQ,EAAE,OAAO,GAAG,kBAAkB,GAAG,SAAS,CAM5E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE,CAOvD;AAiBD,uGAAuG;AACvG,wBAAgB,cAAc,CAC5B,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,OAAO,EACjB,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC,GAAG,SAAS,GACxD,YAAY,CAWd;AAED,4GAA4G;AAC5G,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,GAAG,SAAS,GAAG,GAAG,GAAG,SAAS,CAG7F;AAED,yFAAyF;AACzF,wBAAgB,WAAW,CACzB,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,OAAO,EACjB,KAAK,EAAE,GAAG,GAAG,SAAS,EACtB,OAAO,EAAE,YAAY,GAAG,SAAS,GAChC,GAAG,GAAG,SAAS,CAGjB;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAC5B,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,OAAO,EACjB,OAAO,EACH,CAAC;IAAE,OAAO,CAAC,EAAE,SAAS;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,SAAS,CAAC,CAAC,GAC9G,SAAS,GACZ,GAAG,EAAE,CAEP;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,OAAO,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,OAAO,EACjB,IAAI,EAAE,IAAI,GAAG,SAAS,GACrB,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,MAAM,CAAC,CAS5C;AAED,yFAAyF;AACzF,wBAAgB,eAAe,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,CAKzF"}
@@ -48,6 +48,7 @@ export function fieldContextOf(source, executor, options) {
48
48
  columns: getTableColumns(source.table),
49
49
  relationKeys: relationKeysOf(source, metadata),
50
50
  virtual: (source.queryKey !== undefined ? source.reads[source.queryKey]?.virtual : undefined) ?? {},
51
+ nulls: (source.queryKey !== undefined ? source.reads[source.queryKey]?.nulls : undefined) ?? {},
51
52
  at: options?.at ?? new Date(),
52
53
  context: options?.context,
53
54
  caseInsensitiveOperator: source.caseInsensitiveOperator,
@@ -1,9 +1,9 @@
1
- import { type PostgresJsDatabase } from 'drizzle-orm/postgres-js';
1
+ import { type NodePgDatabase } from 'drizzle-orm/node-postgres';
2
2
  /** Pulling the image on a cold machine costs far more than vitest's 5s default timeout. */
3
3
  export declare const CONTAINER_TIMEOUT_MS = 180000;
4
4
  /** A throwaway Postgres carrying one schema, and the handle that tears its container down. */
5
5
  export interface DisposablePostgres<TSchema extends Record<string, unknown>> {
6
- db: PostgresJsDatabase<TSchema>;
6
+ db: NodePgDatabase<TSchema>;
7
7
  /**
8
8
  * The address this container answers on, for a caller the client cannot serve: a worker suite
9
9
  * reaches its database through a Hyperdrive binding, and what a test pool overrides is the URL.
@@ -1 +1 @@
1
- {"version":3,"file":"disposable-postgres.d.ts","sourceRoot":"","sources":["../../src/testing/disposable-postgres.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAI3E,2FAA2F;AAC3F,eAAO,MAAM,oBAAoB,SAAU,CAAC;AAE5C,8FAA8F;AAC9F,MAAM,WAAW,kBAAkB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACzE,EAAE,EAAE,kBAAkB,CAAC,OAAO,CAAC,CAAC;IAChC;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnF,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAiBtC"}
1
+ {"version":3,"file":"disposable-postgres.d.ts","sourceRoot":"","sources":["../../src/testing/disposable-postgres.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIzE,2FAA2F;AAC3F,eAAO,MAAM,oBAAoB,SAAU,CAAC;AAE5C,8FAA8F;AAC9F,MAAM,WAAW,kBAAkB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACzE,EAAE,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC;IAC5B;;;OAGG;IACH,gBAAgB,EAAE,MAAM,CAAC;IACzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED;;;;;;;GAOG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnF,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAkBtC"}
@@ -1,7 +1,7 @@
1
1
  import { PostgreSqlContainer } from '@testcontainers/postgresql';
2
2
  import { generateDrizzleJson, generateMigration } from 'drizzle-kit/api';
3
- import { drizzle } from 'drizzle-orm/postgres-js';
4
- import postgres from 'postgres';
3
+ import { drizzle } from 'drizzle-orm/node-postgres';
4
+ import { Pool } from 'pg';
5
5
  import { removeContainer } from '../containers/index.js';
6
6
  /** Pulling the image on a cold machine costs far more than vitest's 5s default timeout. */
7
7
  export const CONTAINER_TIMEOUT_MS = 180_000;
@@ -16,25 +16,26 @@ export const CONTAINER_TIMEOUT_MS = 180_000;
16
16
  export async function startDisposablePostgres(schema, image) {
17
17
  const container = await new PostgreSqlContainer(image).start();
18
18
  const connectionString = container.getConnectionUri();
19
- const client = postgres(connectionString, { onnotice: reportNotice });
19
+ const pool = new Pool({ connectionString });
20
+ pool.on('connect', (client) => client.on('notice', reportNotice));
20
21
  // Applied statement by statement rather than through drizzle-kit's pushSchema, which swallows its
21
22
  // failure into a spinner and calls process.exit(1) (drizzle-kit@0.31.10).
22
23
  for (const statement of await generateMigration(generateDrizzleJson({}), generateDrizzleJson(schema))) {
23
- await client.unsafe(statement);
24
+ await pool.query(statement);
24
25
  }
25
26
  return {
26
- db: drizzle(client, { schema }),
27
+ db: drizzle(pool, { schema }),
27
28
  connectionString,
28
29
  async stop() {
29
- await client.end();
30
+ await pool.end();
30
31
  await removeContainer(container);
31
32
  },
32
33
  };
33
34
  }
34
35
  /**
35
- * Prints a server WARNING as one line and drops every lower severity. Left to its default, postgres.js
36
- * prints each notice as a raw object, and a full-text search for a stop word alone raises two per
37
- * statement, so a suite's real failure scrolls past between them.
36
+ * Prints a server WARNING as one line and drops every lower severity. A full-text search for a stop
37
+ * word alone raises two NOTICEs per statement, so printing every notice lets a suite's real failure
38
+ * scroll past between them.
38
39
  */
39
40
  function reportNotice(notice) {
40
41
  if (notice.severity === 'WARNING')
@@ -98,13 +98,22 @@ export interface VirtualContext<TContext = unknown> {
98
98
  export interface VirtualField<TContext = unknown> {
99
99
  filter?(condition: FilterValue, context: VirtualContext<TContext>): SQL | undefined;
100
100
  order?(context: VirtualContext<TContext>): SQL | Column;
101
+ /**
102
+ * Puts the rows whose `order` value is NULL first or last, whether the sort is ascending or descending. When omitted,
103
+ * the database decides: last on ascending, first on descending.
104
+ */
105
+ nulls?: NullsPlacement;
101
106
  }
107
+ /** Whether rows with a NULL value sort first or last. */
108
+ export type NullsPlacement = 'first' | 'last';
102
109
  /** What resolving a field needs: the table's columns, its relations to one row by their key, and its `virtual` names. */
103
110
  export interface FieldContext {
104
111
  columns: Readonly<Record<string, Column>>;
105
112
  /** Each relation to one row, keyed by its name, mapped to the one column holding the related row's key. */
106
113
  relationKeys: Readonly<Record<string, Column>>;
107
114
  virtual: Readonly<Record<string, VirtualField>>;
115
+ /** Where each column's NULL rows sort, as `READS` declares it. */
116
+ nulls: Readonly<Partial<Record<string, NullsPlacement>>>;
108
117
  at: Date;
109
118
  context: unknown;
110
119
  /** Postgres matches text case-insensitively with `ILIKE`; SQLite has no `ILIKE`, and its `LIKE` already is. */
@@ -1 +1 @@
1
- {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/utils/filter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAmB/C,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,uGAAuG;AACvG,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;EAgB/B,CAAC;AAIH,iHAAiH;AACjH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+BAiC5B,CAAC;AAEH,gGAAgG;AAChG,MAAM,MAAM,WAAW,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;AAEvD,wEAAwE;AACxE,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;AAEjD,eAAO,MAAM,iBAAiB,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAKnD,CAAC;AAEH,kFAAkF;AAClF,eAAO,MAAM,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAmD,CAAC;AAEvG,mEAAmE;AACnE,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,IAAI,WAAW,CAEnE;AAED,qEAAqE;AACrE,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAClE,uEAAuE;AACvE,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAW5D;;;GAGG;AACH,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,KAAK,EAAE,MAAM;CAG1B;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc,CAAC,QAAQ,GAAG,OAAO;IAChD,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY,CAAC,QAAQ,GAAG,OAAO;IAG9C,MAAM,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,SAAS,CAAC;IACpF,KAAK,CAAC,CAAC,OAAO,EAAE,cAAc,CAAC,QAAQ,CAAC,GAAG,GAAG,GAAG,MAAM,CAAC;CACzD;AAED,yHAAyH;AACzH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,2GAA2G;IAC3G,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC/C,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IAChD,EAAE,EAAE,IAAI,CAAC;IACT,OAAO,EAAE,OAAO,CAAC;IACjB,+GAA+G;IAC/G,uBAAuB,EAAE,OAAO,CAAC;CAClC;AA+FD;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,GAAG,GAAG,GAAG,SAAS,CAIzG;AAED;;;;;;GAMG;AACH,wBAAgB,OAAO,CACrB,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,SAAS;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAA;CAAE,EAAE,GAAG,SAAS,EAC5E,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,GAAG,EAAE,CAeP"}
1
+ {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/utils/filter.ts"],"names":[],"mappings":"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"}
@@ -203,10 +203,17 @@ export function orderOf(context, orderBy, primaryKey) {
203
203
  ];
204
204
  return entries.map((entry) => {
205
205
  const virtual = Object.hasOwn(context.virtual, entry.field) ? context.virtual[entry.field] : undefined;
206
- const expression = virtual?.order?.({ at: context.at, context: context.context }) ??
207
- (Object.hasOwn(context.columns, entry.field) ? context.columns[entry.field] : undefined);
206
+ const virtualOrder = virtual?.order?.({ at: context.at, context: context.context });
207
+ const expression = virtualOrder ?? (Object.hasOwn(context.columns, entry.field) ? context.columns[entry.field] : undefined);
208
208
  if (!expression)
209
209
  throw new UnknownQueryField(entry.field);
210
- return entry.direction === 'desc' ? desc(expression) : asc(expression);
210
+ const ordered = entry.direction === 'desc' ? desc(expression) : asc(expression);
211
+ const nulls = virtualOrder
212
+ ? virtual?.nulls
213
+ : Object.hasOwn(context.nulls, entry.field)
214
+ ? context.nulls[entry.field]
215
+ : undefined;
216
+ // Raw, because a placement is a keyword and not a value; the type admits only its two literals.
217
+ return nulls === undefined ? ordered : sql `${ordered} nulls ${sql.raw(nulls)}`;
211
218
  });
212
219
  }
@@ -1,4 +1,4 @@
1
- export { filterGroupSchema, filterNodeSchema, filterOperatorSchema, filterValueSchema, isFilterGroup, UnknownQueryField, type FilterGroup, type FilterNode, type FilterOperator, type FilterValue, type VirtualContext, type VirtualField, } from './filter.js';
1
+ export { filterGroupSchema, filterNodeSchema, filterOperatorSchema, filterValueSchema, isFilterGroup, UnknownQueryField, type FilterGroup, type FilterNode, type FilterOperator, type FilterValue, type NullsPlacement, type VirtualContext, type VirtualField, } from './filter.js';
2
2
  export * from './omit.js';
3
3
  export { UnknownReadName, type ColumnName, type MatchOptions, type OrderEntry, type Read, type RelationRead, } from './read.js';
4
4
  export * from './reads.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AACrB,cAAc,WAAW,CAAC;AAC1B,OAAO,EACL,eAAe,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,IAAI,EACT,KAAK,YAAY,GAClB,MAAM,WAAW,CAAC;AACnB,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,aAAa,CAAC;AACrB,cAAc,WAAW,CAAC;AAC1B,OAAO,EACL,eAAe,EACf,KAAK,UAAU,EACf,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,IAAI,EACT,KAAK,YAAY,GAClB,MAAM,WAAW,CAAC;AACnB,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,uBAAuB,CAAC"}
@@ -1,30 +1,35 @@
1
1
  import { type ExtractTablesWithRelations } from 'drizzle-orm';
2
- import type { VirtualField } from './filter.js';
2
+ import type { NullsPlacement, VirtualField } from './filter.js';
3
3
  import type { ColumnName, OrderEntry } from './read.js';
4
4
  /** What holds for one table whichever read reaches it. */
5
- export interface TableReads<TColumn extends string = string, TContext = unknown> {
5
+ export interface TableReads<TColumn extends string = string, TContext = unknown, TOwnColumn extends string = string> {
6
6
  /** The order its rows load in as a relation that holds many; a relation's own `orderBy` replaces it. */
7
7
  orderBy?: readonly OrderEntry<TColumn>[];
8
8
  /** The filter and order names no column of it holds, each with the expression it becomes. */
9
9
  virtual?: Readonly<Record<string, VirtualField<TContext>>>;
10
+ /**
11
+ * Puts each listed column's NULL rows first or last, whether the sort is ascending or descending. Only the table's
12
+ * own columns are accepted, so a misspelled name fails to compile; a `virtual` name declares its own `nulls`.
13
+ */
14
+ nulls?: Readonly<Partial<Record<TOwnColumn, NullsPlacement>>>;
10
15
  }
11
16
  /**
12
17
  * A context's reads, keyed by each table's EXPORT name in the schema. `TContext` types the request values its `virtual`
13
18
  * names are decided against.
14
19
  */
15
20
  export type Reads<TSchema extends Record<string, unknown> = Record<string, unknown>, TContext = unknown> = {
16
- readonly [K in keyof ExtractTablesWithRelations<TSchema> & string]?: TableReads<ColumnName<TSchema, K>, TContext>;
21
+ readonly [K in keyof ExtractTablesWithRelations<TSchema> & string]?: TableReads<ColumnName<TSchema, K>, TContext, keyof ExtractTablesWithRelations<TSchema>[K]['columns'] & string>;
17
22
  };
18
23
  /**
19
24
  * Declares, once per context, what holds for each table whichever read reaches it: the order its rows load in as a
20
- * relation, and its `virtual` filter and order names. Every repository of the context hands the same value to its base.
25
+ * relation, its `virtual` filter and order names, and where its columns' NULL rows sort. Every repository of the context hands the same value to its base.
21
26
  *
22
27
  * `TContext` is the shape of the `context` a finder is handed for its `virtual` names; each receives it, or
23
28
  * `undefined` where the caller handed none.
24
29
  *
25
30
  * @param schema - the schema barrel the repositories are typed by; each key is checked against it
26
- * @throws Error at declaration on a key that is no table export of `schema`, or an order naming a column its table
27
- * does not hold
31
+ * @throws Error at declaration on a key that is no table export of `schema`, or an order or a `nulls` naming a column
32
+ * its table does not hold
28
33
  */
29
34
  export declare function defineReads<TSchema extends Record<string, unknown>, TContext = unknown>(schema: TSchema, reads: Reads<TSchema, TContext>): Reads<TSchema, TContext>;
30
35
  //# sourceMappingURL=reads.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reads.d.ts","sourceRoot":"","sources":["../../src/utils/reads.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAExD,0DAA0D;AAC1D,MAAM,WAAW,UAAU,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,QAAQ,GAAG,OAAO;IAC7E,wGAAwG;IACxG,OAAO,CAAC,EAAE,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IACzC,6FAA6F;IAC7F,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;CAC5D;AAED;;;GAGG;AACH,MAAM,MAAM,KAAK,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,IAAI;IACzG,QAAQ,EAAE,CAAC,IAAI,MAAM,0BAA0B,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,QAAQ,CAAC;CAClH,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,EACrF,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,GAC9B,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAY1B"}
1
+ {"version":3,"file":"reads.d.ts","sourceRoot":"","sources":["../../src/utils/reads.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAExD,0DAA0D;AAC1D,MAAM,WAAW,UAAU,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EAAE,QAAQ,GAAG,OAAO,EAAE,UAAU,SAAS,MAAM,GAAG,MAAM;IACjH,wGAAwG;IACxG,OAAO,CAAC,EAAE,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;IACzC,6FAA6F;IAC7F,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC3D;;;OAGG;IACH,KAAK,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;CAC/D;AAED;;;GAGG;AACH,MAAM,MAAM,KAAK,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,IAAI;IACzG,QAAQ,EAAE,CAAC,IAAI,MAAM,0BAA0B,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,UAAU,CAC7E,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,EACtB,QAAQ,EACR,MAAM,0BAA0B,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,MAAM,CACjE;CACF,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAgB,WAAW,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,GAAG,OAAO,EACrF,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,GAC9B,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAiB1B"}
@@ -1,14 +1,14 @@
1
1
  import { createTableRelationsHelpers, extractTablesRelationalConfig, } from 'drizzle-orm';
2
2
  /**
3
3
  * Declares, once per context, what holds for each table whichever read reaches it: the order its rows load in as a
4
- * relation, and its `virtual` filter and order names. Every repository of the context hands the same value to its base.
4
+ * relation, its `virtual` filter and order names, and where its columns' NULL rows sort. Every repository of the context hands the same value to its base.
5
5
  *
6
6
  * `TContext` is the shape of the `context` a finder is handed for its `virtual` names; each receives it, or
7
7
  * `undefined` where the caller handed none.
8
8
  *
9
9
  * @param schema - the schema barrel the repositories are typed by; each key is checked against it
10
- * @throws Error at declaration on a key that is no table export of `schema`, or an order naming a column its table
11
- * does not hold
10
+ * @throws Error at declaration on a key that is no table export of `schema`, or an order or a `nulls` naming a column
11
+ * its table does not hold
12
12
  */
13
13
  export function defineReads(schema, reads) {
14
14
  const { tables } = extractTablesRelationalConfig(schema, createTableRelationsHelpers);
@@ -21,6 +21,11 @@ export function defineReads(schema, reads) {
21
21
  throw new Error(`"${key}" holds no column "${entry.field}" to order by.`);
22
22
  }
23
23
  }
24
+ for (const field of Object.keys(declared?.nulls ?? {})) {
25
+ if (!Object.hasOwn(table.columns, field)) {
26
+ throw new Error(`"${key}" holds no column "${field}" to place NULLs for.`);
27
+ }
28
+ }
24
29
  }
25
30
  return reads;
26
31
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zeroxsolutions/db",
3
- "version": "10.4.1",
4
- "description": "Generic Drizzle toolkit - the id column and audit timestamps a table takes, a base repository, the unit-of-work and transactional outbox impls, and the filter/sort/pagination query helpers, for PostgreSQL (postgres-js) and Cloudflare D1; ships no domain schema. Shared across ZeroXSolutions services.",
3
+ "version": "10.6.0",
4
+ "description": "Generic Drizzle toolkit - the id column and audit timestamps a table takes, a base repository, the unit-of-work and transactional outbox impls, and the filter/sort/pagination query helpers, for PostgreSQL (any drizzle Postgres driver) and Cloudflare D1; ships no domain schema. Shared across ZeroXSolutions services.",
5
5
  "private": false,
6
6
  "type": "module",
7
7
  "sideEffects": false,
@@ -49,7 +49,7 @@
49
49
  "@testcontainers/postgresql": "^12.1.0",
50
50
  "drizzle-kit": "^0.31.10",
51
51
  "drizzle-orm": "^0.45.1",
52
- "postgres": "^3.4.9",
52
+ "pg": "^8.23.1",
53
53
  "zod": "^4.3.6"
54
54
  },
55
55
  "peerDependenciesMeta": {
@@ -59,14 +59,16 @@
59
59
  "drizzle-kit": {
60
60
  "optional": true
61
61
  },
62
- "postgres": {
62
+ "pg": {
63
63
  "optional": true
64
64
  }
65
65
  },
66
66
  "devDependencies": {
67
67
  "@testcontainers/postgresql": "^12.1.0",
68
+ "@types/pg": "^8.23.1",
68
69
  "drizzle-kit": "^0.31.10",
69
70
  "drizzle-orm": "^0.45.1",
71
+ "pg": "^8.23.1",
70
72
  "postgres": "^3.4.9",
71
73
  "zod": "^4.3.6"
72
74
  },