pipework 0.280.0 → 0.282.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.
@@ -1 +1 @@
1
- {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../../src/data/db/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAGnM,OAAO,EAAS,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAGzE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE3E,6EAA6E;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,6EAA6E;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,mJAAmJ;AACnJ,eAAO,MAAM,IAAI;IACf,iQAAiQ;;IAGjQ,6QAA6Q;;IAG7Q,6EAA6E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAG7E,mPAAmP;;IAGnP,+RAA+R;;;;;;;;;;;;;IAkB/R,oDAAoD;;IAEpD,mDAAmD;;IAGnD,6EAA6E;;IAG7E,gFAAgF;;IAGhF,qHAAqH;;IAGrH,kHAAkH;;IAGlH,oMAAoM;;IAGpM,2GAA2G;;IAG3G,0GAA0G;;IAG1G,uNAAuN;;IAGvN,8EAA8E;;;;;;;;;;;;;;;;;;;;;;;IAE9E,qMAAqM;;IAErM,6DAA6D;;IAE7D,+LAA+L;;IAG/L,2GAA2G;;IAE3G,kNAAkN;;IAElN,gHAAgH;;IAEhH,kQAAkQ;;CAElQ,CAAA"}
1
+ {"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../../src/data/db/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAGnM,OAAO,EAAS,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAGzE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AAE3E,6EAA6E;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,6EAA6E;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,mJAAmJ;AACnJ,eAAO,MAAM,IAAI;IACf,iQAAiQ;;IAGjQ,6QAA6Q;;IAG7Q,6EAA6E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAG7E,mPAAmP;;IAGnP,+RAA+R;;;;;;;;;;;;;IAkB/R,oDAAoD;;IAEpD,mDAAmD;;IAGnD,6EAA6E;;IAG7E,gFAAgF;;IAGhF,qHAAqH;;IAGrH,kHAAkH;;IAGlH,oMAAoM;;IAGpM,2GAA2G;;IAG3G,0GAA0G;;IAG1G,uVAAuV;;IAGvV,uNAAuN;;IAGvN,8EAA8E;;;;;;;;;;;;;;;;;;;;;;;IAE9E,qMAAqM;;IAErM,6DAA6D;;IAE7D,+LAA+L;;IAG/L,2GAA2G;;IAE3G,kNAAkN;;IAElN,gHAAgH;;IAEhH,kQAAkQ;;CAElQ,CAAA"}
@@ -9,6 +9,7 @@ import { serializable } from './serializable.js';
9
9
  import { withTimeouts } from './timeouts.js';
10
10
  import { bulkSet } from './bulk-set.js';
11
11
  import { values } from './values.js';
12
+ import { rows } from './rows.js';
12
13
  import { fn } from './function-source.js';
13
14
  import { update, insert, remove, upsert } from '../write/index.js';
14
15
  import { aliasedRelation, aliasedTable, aliasedTableColumn, getTableColumns, getTableName, getViewName, getViewSelectedFields, isTable, createMany, createOne, relations } from '../query/index.js';
@@ -61,6 +62,8 @@ export const pipe = Object.assign(getDb, {
61
62
  bulkSet,
62
63
  /** Produces a typed VALUES clause for bulk operations — the base primitive for bulkSet and bulkUpsert. */
63
64
  values,
65
+ /** A typed rowset from parallel array parameters, one parameter per column whatever the row count, as a source for `.from()` and joins — `pipe.rows({ g: 'text', id: 'int' }, { g: [...], id: [...] })` renders `unnest($1::text[], $2::int[]) AS rows(g, id)`. For composite-key matches that would otherwise be a union or a JS-side tuple match. */
66
+ rows,
64
67
  /** A set-returning SQL function as a typed source for `.from()` and joins — `pipe.fn('schema.f', { args: [field.uuid()], columns: { path: field.text() } })`. Arguments are bound and cast to their declared types. */
65
68
  fn,
66
69
  /** Field builders for domain definitions — uuid(), text(), integer(), etc. */
@@ -1 +1 @@
1
- {"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../../src/data/db/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAEnM,qBAAqB;AACrB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAKzE,6EAA6E;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,6EAA6E;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,mJAAmJ;AACnJ,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;IACvC,iQAAiQ;IACjQ,MAAM,EAAE,UAAU;IAElB,6QAA6Q;IAC7Q,IAAI,EAAE,QAAQ;IAEd,6EAA6E;IAC7E,MAAM;IAEN,mPAAmP;IACnP,QAAQ;IAER,+RAA+R;IAC/R,GAAG;IAEH,kGAAkG;IAClG,eAAe;IACf,YAAY;IACZ,kBAAkB;IAClB,eAAe;IACf,YAAY;IACZ,WAAW;IACX,qBAAqB;IACrB,OAAO;IAEP,qDAAqD;IACrD,UAAU;IACV,SAAS;IACT,SAAS;IAET,oDAAoD;IACpD,OAAO,EAAE,UAAU;IACnB,mDAAmD;IACnD,UAAU;IAEV,6EAA6E;IAC7E,QAAQ;IAER,gFAAgF;IAChF,YAAY;IAEZ,qHAAqH;IACrH,eAAe;IAEf,kHAAkH;IAClH,YAAY;IAEZ,oMAAoM;IACpM,YAAY;IAEZ,2GAA2G;IAC3G,OAAO;IAEP,0GAA0G;IAC1G,MAAM;IAEN,uNAAuN;IACvN,EAAE;IAEF,8EAA8E;IAC9E,KAAK;IACL,qMAAqM;IACrM,MAAM;IACN,6DAA6D;IAC7D,WAAW;IACX,+LAA+L;IAC/L,QAAQ;IAER,2GAA2G;IAC3G,MAAM;IACN,kNAAkN;IAClN,MAAM;IACN,gHAAgH;IAChH,MAAM,EAAE,MAAM;IACd,kQAAkQ;IAClQ,MAAM;CACP,CAAC,CAAA"}
1
+ {"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../../src/data/db/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAA;AAC7D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAC5D,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,EAAE,EAAE,MAAM,sBAAsB,CAAA;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,kBAAkB,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,qBAAqB,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAA;AAEnM,qBAAqB;AACrB,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAKzE,6EAA6E;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,6EAA6E;AAC7E,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAExC,mJAAmJ;AACnJ,MAAM,CAAC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;IACvC,iQAAiQ;IACjQ,MAAM,EAAE,UAAU;IAElB,6QAA6Q;IAC7Q,IAAI,EAAE,QAAQ;IAEd,6EAA6E;IAC7E,MAAM;IAEN,mPAAmP;IACnP,QAAQ;IAER,+RAA+R;IAC/R,GAAG;IAEH,kGAAkG;IAClG,eAAe;IACf,YAAY;IACZ,kBAAkB;IAClB,eAAe;IACf,YAAY;IACZ,WAAW;IACX,qBAAqB;IACrB,OAAO;IAEP,qDAAqD;IACrD,UAAU;IACV,SAAS;IACT,SAAS;IAET,oDAAoD;IACpD,OAAO,EAAE,UAAU;IACnB,mDAAmD;IACnD,UAAU;IAEV,6EAA6E;IAC7E,QAAQ;IAER,gFAAgF;IAChF,YAAY;IAEZ,qHAAqH;IACrH,eAAe;IAEf,kHAAkH;IAClH,YAAY;IAEZ,oMAAoM;IACpM,YAAY;IAEZ,2GAA2G;IAC3G,OAAO;IAEP,0GAA0G;IAC1G,MAAM;IAEN,uVAAuV;IACvV,IAAI;IAEJ,uNAAuN;IACvN,EAAE;IAEF,8EAA8E;IAC9E,KAAK;IACL,qMAAqM;IACrM,MAAM;IACN,6DAA6D;IAC7D,WAAW;IACX,+LAA+L;IAC/L,QAAQ;IAER,2GAA2G;IAC3G,MAAM;IACN,kNAAkN;IAClN,MAAM;IACN,gHAAgH;IAChH,MAAM,EAAE,MAAM;IACd,kQAAkQ;IAClQ,MAAM;CACP,CAAC,CAAA"}
@@ -0,0 +1,35 @@
1
+ import type { SQL } from './types.js';
2
+ import { Subquery } from '../query/subquery.js';
3
+ type TextLike = 'text' | 'uuid' | 'varchar' | 'char' | 'citext';
4
+ type NumberLike = 'int' | 'integer' | 'int4' | 'smallint' | 'int2' | 'real' | 'float4' | 'double precision' | 'float8';
5
+ type DateLike = 'timestamptz' | 'timestamp' | 'date';
6
+ /** The JS type a column of this SQL type reads as: text and uuid as string, ints and floats as number, bigint and numeric as string (as postgres.js returns them), dates as Date, boolean as boolean; any other type name as unknown. A cell may be null. */
7
+ export type RowsColumnValue<T extends string> = T extends TextLike ? string : T extends NumberLike ? number : T extends 'bigint' | 'int8' | 'numeric' ? string : T extends 'boolean' | 'bool' ? boolean : T extends DateLike ? Date | string : unknown;
8
+ /** Column name to SQL type name: `{ g: 'text', id: 'int' }`. */
9
+ export type RowsColumns = Readonly<Record<string, string>>;
10
+ /** One array per column, all the same length: `{ g: ['a', 'b'], id: [1, 2] }` is two rows. */
11
+ export type RowsData<TColumns extends RowsColumns> = {
12
+ readonly [K in keyof TColumns]: ReadonlyArray<RowsColumnValue<TColumns[K]> | null>;
13
+ };
14
+ type RowsFields<TColumns extends RowsColumns> = {
15
+ [K in keyof TColumns]: SQL<RowsColumnValue<TColumns[K]> | null>;
16
+ };
17
+ /** A rowset usable in `.from()` and joins; its columns are properties of it. */
18
+ export type RowsSource<TAlias extends string, TColumns extends RowsColumns> = Subquery<TAlias, RowsFields<TColumns>> & RowsFields<TColumns> & {
19
+ /** The same rowset under another alias, to use it twice in a query. */
20
+ as<TNew extends string>(alias: TNew): RowsSource<TNew, TColumns>;
21
+ };
22
+ /**
23
+ * A typed rowset from parallel array parameters, as a source for `.from()` and joins:
24
+ * `rows({ g: 'text', id: 'int' }, { g: ['a', 'b'], id: [1, 2] })` renders
25
+ * `(select * from unnest($1::text[], $2::int[]) as "rows"("g", "id")) "rows"`, one parameter per column
26
+ * whatever the row count, so a 5,000-row key list is two parameters. Each column is read by name, like a
27
+ * table's: `rs.g`. Nulls in an array are NULL cells. Zero rows is valid and returns no rows. Each column
28
+ * is sent as one array-literal text parameter, so any element type Postgres can parse works: Dates as ISO text,
29
+ * objects as JSON (for jsonb). Column names are used as written (not snake-cased); the default alias is `rows`, change it with `.as()`.
30
+ * Throws when the columns are empty, a type is not a plain type name, the data and columns name different keys,
31
+ * or the arrays differ in length.
32
+ */
33
+ export declare function rows<const TColumns extends RowsColumns>(columns: TColumns, data: RowsData<TColumns>): RowsSource<'rows', TColumns>;
34
+ export {};
35
+ //# sourceMappingURL=rows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rows.d.ts","sourceRoot":"","sources":["../../../src/data/db/rows.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAM/C,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAA;AAC/D,KAAK,UAAU,GAAG,KAAK,GAAG,SAAS,GAAG,MAAM,GAAG,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,kBAAkB,GAAG,QAAQ,CAAA;AACtH,KAAK,QAAQ,GAAG,aAAa,GAAG,WAAW,GAAG,MAAM,CAAA;AAEpD,6PAA6P;AAC7P,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,IAC1C,CAAC,SAAS,QAAQ,GAAG,MAAM,GACzB,CAAC,SAAS,UAAU,GAAG,MAAM,GAC7B,CAAC,SAAS,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAChD,CAAC,SAAS,SAAS,GAAG,MAAM,GAAG,OAAO,GACtC,CAAC,SAAS,QAAQ,GAAG,IAAI,GAAG,MAAM,GAClC,OAAO,CAAA;AAEX,gEAAgE;AAChE,MAAM,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;AAE1D,8FAA8F;AAC9F,MAAM,MAAM,QAAQ,CAAC,QAAQ,SAAS,WAAW,IAAI;IAAE,QAAQ,EAAE,CAAC,IAAI,MAAM,QAAQ,GAAG,aAAa,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;CAAE,CAAA;AAE3I,KAAK,UAAU,CAAC,QAAQ,SAAS,WAAW,IAAI;KAC7C,CAAC,IAAI,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;CAChE,CAAA;AAED,gFAAgF;AAChF,MAAM,MAAM,UAAU,CAAC,MAAM,SAAS,MAAM,EAAE,QAAQ,SAAS,WAAW,IACtE,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,GACtC,UAAU,CAAC,QAAQ,CAAC,GACpB;IACA,uEAAuE;IACvE,EAAE,CAAC,IAAI,SAAS,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;CACjE,CAAA;AAyBH;;;;;;;;;;GAUG;AACH,wBAAgB,IAAI,CAAC,KAAK,CAAC,QAAQ,SAAS,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,CA6ClI"}
@@ -0,0 +1,91 @@
1
+ import { sql } from './sql.js';
2
+ import { Subquery } from '../query/subquery.js';
3
+ import { SelectionProxyHandler } from '../query/selection-proxy.js';
4
+ const CAST = /^[a-z_][a-z0-9_]*( [a-z_][a-z0-9_]*)*(\([0-9, ]+\))?$/i;
5
+ const COLUMN_NAME = /^[a-z_][a-z0-9_]*$/i;
6
+ function fail(problem, fix) {
7
+ throw new Error(`[pipework] rows: ${problem}\n\n Fix: ${fix}\n`);
8
+ }
9
+ function quote(name) {
10
+ return `"${name.replace(/"/g, '""')}"`;
11
+ }
12
+ // One column as a Postgres array literal, sent as a single text parameter and cast to `T[]`. postgres.js
13
+ // serialises a JS array only for the few element types it knows (text, int, uuid ...), so a `timestamptz[]`
14
+ // parameter would throw; a literal string is parsed by Postgres for any type.
15
+ function arrayLiteral(cells) {
16
+ const item = (v) => {
17
+ if (v === null || v === undefined)
18
+ return 'NULL';
19
+ const text = v instanceof Date ? v.toISOString()
20
+ : typeof v === 'string' ? v
21
+ : typeof v === 'number' || typeof v === 'bigint' || typeof v === 'boolean' ? String(v)
22
+ : JSON.stringify(v);
23
+ return `"${text.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
24
+ };
25
+ return `{${cells.map(item).join(',')}}`;
26
+ }
27
+ /**
28
+ * A typed rowset from parallel array parameters, as a source for `.from()` and joins:
29
+ * `rows({ g: 'text', id: 'int' }, { g: ['a', 'b'], id: [1, 2] })` renders
30
+ * `(select * from unnest($1::text[], $2::int[]) as "rows"("g", "id")) "rows"`, one parameter per column
31
+ * whatever the row count, so a 5,000-row key list is two parameters. Each column is read by name, like a
32
+ * table's: `rs.g`. Nulls in an array are NULL cells. Zero rows is valid and returns no rows. Each column
33
+ * is sent as one array-literal text parameter, so any element type Postgres can parse works: Dates as ISO text,
34
+ * objects as JSON (for jsonb). Column names are used as written (not snake-cased); the default alias is `rows`, change it with `.as()`.
35
+ * Throws when the columns are empty, a type is not a plain type name, the data and columns name different keys,
36
+ * or the arrays differ in length.
37
+ */
38
+ export function rows(columns, data) {
39
+ const names = Object.keys(columns);
40
+ if (names.length === 0)
41
+ fail('the column spec is empty.', "declare at least one column, e.g. { id: 'uuid' }.");
42
+ for (const name of names) {
43
+ if (!COLUMN_NAME.test(name) || name === 'as' || name === '_') {
44
+ fail(`column name "${name}" is not usable.`, 'use letters, digits and underscores, not starting with a digit, and not "as" or "_".');
45
+ }
46
+ const type = columns[name];
47
+ if (typeof type !== 'string' || type === '')
48
+ fail(`column "${name}" has no type.`, `give it a type name: { ${name}: 'text' }.`);
49
+ if (!CAST.test(type))
50
+ fail(`column "${name}" has type "${type}", which is not a plain type name.`, "pass a type name such as 'uuid' or 'int'.");
51
+ }
52
+ const given = Object.keys(data);
53
+ const unknownKeys = given.filter(k => !names.includes(k));
54
+ if (unknownKeys.length > 0)
55
+ fail(`values for ${unknownKeys.map(k => `"${k}"`).join(', ')} have no column in the spec.`, 'add the column to the spec or drop its values.');
56
+ const missing = names.filter(k => !given.includes(k));
57
+ if (missing.length > 0)
58
+ fail(`the spec names ${missing.map(k => `"${k}"`).join(', ')} but the data has no values for it.`, 'pass an array for every column, [] for none.');
59
+ const lengths = new Set();
60
+ for (const name of names) {
61
+ const col = data[name];
62
+ if (!Array.isArray(col))
63
+ fail(`values for "${name}" are not an array.`, 'pass one array per column.');
64
+ lengths.add(col.length);
65
+ }
66
+ if (lengths.size > 1) {
67
+ const detail = names.map(n => `${n}: ${(data[n]).length}`).join(', ');
68
+ fail(`the column arrays differ in length (${detail}).`, 'pass arrays of one length; row i is the i-th element of each.');
69
+ }
70
+ const build = (alias) => {
71
+ const arrays = names.map(n => {
72
+ return sql `${sql.param(arrayLiteral(data[n]))}::${sql.raw(columns[n])}[]`;
73
+ });
74
+ const nameList = sql.raw(names.map(quote).join(', '));
75
+ const inner = sql `select * from unnest(${sql.join(arrays, sql `, `)}) as ${sql.raw(quote(alias))}(${nameList})`;
76
+ const fields = {};
77
+ for (const n of names)
78
+ fields[n] = sql.raw(`${quote(alias)}.${quote(n)}`);
79
+ const subquery = new Subquery(inner, fields, alias);
80
+ const selection = new SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' });
81
+ return new Proxy(subquery, {
82
+ get(target, prop) {
83
+ if (prop === 'as')
84
+ return (next) => build(next);
85
+ return selection.get(target, prop);
86
+ },
87
+ });
88
+ };
89
+ return build('rows');
90
+ }
91
+ //# sourceMappingURL=rows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rows.js","sourceRoot":"","sources":["../../../src/data/db/rows.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@ export type { DB, SQL, Table, Column, TransactionConfig } from './data/db/namesp
8
8
  export type { WindowSpec, WindowFrame, FrameBound } from './data/db/expressions.js';
9
9
  export type { Aggregate, EmptyableAggregate, AggregateOptions, JsonOf } from './data/db/aggregates.js';
10
10
  export type { ValueColumnDef } from './data/db/values.js';
11
+ export type { RowsColumns, RowsData, RowsSource, RowsColumnValue } from './data/db/rows.js';
11
12
  export type { ArraySource, ElementOf, JsonbElements } from './data/db/array-elements.js';
12
13
  export type { FunctionSpec, FunctionSource, FunctionSourceFields } from './data/db/function-source.js';
13
14
  export type { SerializableOptions } from './data/db/serializable.js';
@@ -55,7 +56,7 @@ export type { AuditChainHead, AuditChainBreak, AuditChainBreakReason, AuditVerif
55
56
  export { jobs } from './async/jobs/namespace.js';
56
57
  export { JobAbortedError, JobLaterError, JobPermanentError } from './async/jobs/index.js';
57
58
  export { serializeError } from './async/jobs/serialize-error.js';
58
- export type { ExecuteJobOptions, Queue, QueueConfig, EnqueueOptions, ClaimedJob, JobClaim, JobClaimReason, ReapedJob, FailedAttempt, QueueTotals, QueueTypeTotals, JobResult, BackoffConfig, WaitOptions, WaitResult, ListenClient, ListenHandle, CronSchedule, ScheduleSpec, ScheduleInfo, SchedulerOptions } from './async/jobs/index.js';
59
+ export type { ExecuteJobOptions, Queue, QueueConfig, EnqueueOptions, ClaimedJob, JobClaim, JobClaimReason, ReapedJob, FailedAttempt, FailOptions, QueueTotals, QueueTypeTotals, JobResult, BackoffConfig, WaitOptions, WaitResult, ListenClient, ListenHandle, CronSchedule, ScheduleSpec, ScheduleInfo, SchedulerOptions } from './async/jobs/index.js';
59
60
  export { steps } from './async/steps/namespace.js';
60
61
  export type { GraphConfig, GraphStepDefinition, GraphStepContext, GraphForEachContext, GraphRunInfo, GraphFailure, GraphRunStatus, RequestOptions as StepRequestOptions, RequestResult as StepRequestResult, PlanOptions as StepPlanOptions, PlanResult as StepPlanResult, StepPlan, StepCounts, TaskState as StepTaskState, RunTask as StepRunTask, RunStatus as StepRunStatus, EndedRun as StepEndedRun, EndedRunsOptions as StepEndedRunsOptions, DecideOptions as StepDecideOptions, StepResultRecord, RemoveItemOptions as StepRemoveItemOptions, RemoveItemResult as StepRemoveItemResult, StepGraph, GraphSelection } from './async/steps/index.js';
61
62
  export { StepItemRunningError } from './async/steps/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pipework",
3
- "version": "0.280.0",
3
+ "version": "0.282.0",
4
4
  "description": "TypeScript framework for multi-tenant SaaS applications. PostgreSQL-only.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -9,7 +9,12 @@ import type { SQL } from '../../data/db/index.js'
9
9
 
10
10
  export type JobClaimReason = 'completed' | 'failed' | 'shutdown-returned' | 'reaped-stale' | 'later' | 'cancelled'
11
11
 
12
- /** One claim of a job. `releasedAt`, `reason` and `progressMark` are null while the claim is held. */
12
+ /**
13
+ * One claim of a job. `releasedAt`, `reason` and `progressMark` are null while the claim is held.
14
+ * A failed claim may also carry keys its caller added through `fail(..., { claim })`, such as `errorClass`; they read
15
+ * as `unknown` through a cast (`(claim as Record<string, unknown>)['errorClass']`), since an index signature here
16
+ * would loosen every typed field.
17
+ */
13
18
  export interface JobClaim {
14
19
  readonly claimedAt: string
15
20
  readonly workerId: string
@@ -20,6 +25,11 @@ export interface JobClaim {
20
25
  readonly progressMark: unknown
21
26
  /** Why a cancelled claim was cancelled; set only when `reason` is 'cancelled'. */
22
27
  readonly cancel?: { readonly reason: string; readonly message: string }
28
+ /**
29
+ * Why the attempt failed (`fail`/`failAttempt`, including a superseded one). `message` is cut to the queue's
30
+ * `claimErrorMessageMaxChars`; `code` is the error's own string `code`, else the nearest one on its `cause` chain.
31
+ */
32
+ readonly error?: { readonly name: string; readonly message: string; readonly code?: string }
23
33
  }
24
34
 
25
35
  /** The SET fragment that appends the claim being made. */
@@ -2,7 +2,7 @@ export { executeJob } from './execute.js'
2
2
  export type { ExecuteJobOptions } from './execute.js'
3
3
  export { JobAbortedError, JobLaterError, JobPermanentError } from './errors.js'
4
4
  export { createQueue } from './queue.js'
5
- export type { Queue, QueueConfig, EnqueueOptions, EnqueueExclusion, ClaimedJob, JobClaim, JobClaimReason, ClaimedExclusion, DeadLetterInfo, ReapedJob, FailedAttempt, QueueTotals, QueueTypeTotals, JobResult, BackoffConfig } from './queue.js'
5
+ export type { Queue, QueueConfig, EnqueueOptions, EnqueueExclusion, ClaimedJob, JobClaim, JobClaimReason, ClaimedExclusion, DeadLetterInfo, ReapedJob, FailedAttempt, FailOptions, QueueTotals, QueueTypeTotals, JobResult, BackoffConfig } from './queue.js'
6
6
  export type { ExclusionConfig } from './exclusion.js'
7
7
  export type { WaitOptions, WaitResult, ListenClient, ListenHandle } from './listener.js'
8
8
  export { parseCron, nextTick } from './cron.js'
@@ -13,7 +13,7 @@ import type { ExclusionConfig } from './exclusion.js'
13
13
  import type { JobLaterError } from './errors.js'
14
14
  import { openClaim, closeClaim, parseClaims } from './claims.js'
15
15
  import type { JobClaim, JobClaimReason } from './claims.js'
16
- import { serializeError } from './serialize-error.js'
16
+ import { serializeError, cutText } from './serialize-error.js'
17
17
  import { queueDefinition, registerProgressColumn, liveKeyIndexName, LIVE_KEY_TENANT_EXPR, LIVE_KEY_PREDICATE, pendingKeyIndexName, PENDING_KEY_TENANT_EXPR, PENDING_KEY_PREDICATE } from './table.js'
18
18
  import { queueDoorName } from './queue-door.js'
19
19
  import { unscopedExecutor, requireUnscopedExecutor } from '../../auth/tenant/scoped-db.js'
@@ -39,6 +39,11 @@ export interface QueueConfig {
39
39
  readonly backoff?: BackoffConfig
40
40
  /** An app-added column on the queue table whose value is recorded as each claim's `progressMark` when the claim is released. */
41
41
  readonly progressColumn?: string
42
+ /**
43
+ * The most characters of a failed attempt's error message a claim keeps in its `claims` history; longer messages end
44
+ * `…[truncated N chars]`. A positive integer; default 500. The full serialized error stays in `error_payload`.
45
+ */
46
+ readonly claimErrorMessageMaxChars?: number
42
47
  /** Cross-job exclusion gate — overlap/blocks-all/tenant columns checked against claimed/running jobs at claim time. */
43
48
  readonly exclusion?: ExclusionConfig
44
49
  }
@@ -158,6 +163,22 @@ export interface ReapedJob {
158
163
  readonly flow: ClaimedFlow
159
164
  }
160
165
 
166
+ /** Claim keys the queue owns; `FailOptions.claim` may not set them. */
167
+ const RESERVED_CLAIM_KEYS = [
168
+ 'claimedAt', 'workerId', 'workerRelease', 'releasedAt', 'reason', 'progressMark', 'error', 'cancel',
169
+ ] as const
170
+
171
+ /** Options of `fail` / `failAttempt`. */
172
+ export interface FailOptions {
173
+ /** Dead-letter now, whatever attempts remain. */
174
+ readonly permanent?: boolean
175
+ /**
176
+ * A small JSON object merged into the closed claim (for example `{ errorClass: 'connection-fault' }`), the way `cancel`
177
+ * adds `cancel`. It may not set claimedAt, workerId, workerRelease, releasedAt, reason, progressMark, error or cancel.
178
+ */
179
+ readonly claim?: Readonly<Record<string, unknown>>
180
+ }
181
+
161
182
  /** What `failAttempt` did: `outcome` and the error as stored in the row's `error_payload`. */
162
183
  export interface FailedAttempt {
163
184
  readonly outcome: 'retry' | 'dead_letter' | 'superseded'
@@ -202,10 +223,19 @@ export interface Queue {
202
223
  */
203
224
  heartbeat(db: DB, jobId: string, claimToken?: string): Promise<boolean>
204
225
  complete(db: DB, jobId: string, output?: unknown, claimToken?: string): Promise<boolean>
205
- /** Counts the attempt as failed: retried with backoff while attempts remain, dead-lettered after. One transaction, row locked. */
206
- fail(db: DB, jobId: string, error: unknown, claimToken?: string, opts?: { permanent?: boolean }): Promise<boolean>
207
- /** `fail` that says what it did: null when the claim no longer holds the row, else the outcome and the stored error. */
208
- failAttempt(db: DB, jobId: string, error: unknown, claimToken?: string, opts?: { permanent?: boolean }): Promise<FailedAttempt | null>
226
+ /**
227
+ * Counts the attempt as failed: retried with backoff while attempts remain, dead-lettered after. One transaction, row locked.
228
+ * The closed claim keeps the cause as `error: { name, message, code? }` (message cut to `claimErrorMessageMaxChars`;
229
+ * `code` is the error's own string `code`, else the nearest one on its `cause` chain), and `opts.claim` merged in,
230
+ * so the claims history says why each attempt failed even after `error_payload` is overwritten.
231
+ */
232
+ fail(db: DB, jobId: string, error: unknown, claimToken?: string, opts?: FailOptions): Promise<boolean>
233
+ /**
234
+ * `fail` that says what it did: null when the claim no longer holds the row, else the outcome and the stored error.
235
+ * A failed attempt whose return to pending is superseded by a pendingKey twin closes its claim 'cancelled' with both
236
+ * `cancel` and the attempt's `error`.
237
+ */
238
+ failAttempt(db: DB, jobId: string, error: unknown, claimToken?: string, opts?: FailOptions): Promise<FailedAttempt | null>
209
239
  /** Returns a claimed job to pending after the error's `delayMs` (else the backoff, at least 1 s) without counting the attempt. False when the claim no longer holds the row. */
210
240
  later(db: DB, jobId: string, error: JobLaterError, claimToken: string): Promise<boolean>
211
241
  /** Returns a claimed job to pending without counting the attempt. False when the claim no longer holds the row. */
@@ -291,6 +321,13 @@ export function createQueue(config: QueueConfig = {}): Queue {
291
321
  const channel = config.notifyChannel ?? 'pipework_job_complete'
292
322
  const maxAttempts = config.maxAttempts ?? 1
293
323
  const backoff = config.backoff
324
+ const claimErrorMaxChars = config.claimErrorMessageMaxChars ?? 500
325
+ if (!Number.isInteger(claimErrorMaxChars) || claimErrorMaxChars < 1) {
326
+ throw new Error(
327
+ `[pipework] createQueue() received claimErrorMessageMaxChars ${String(config.claimErrorMessageMaxChars)} for queue "${config.table ?? 'pipework_jobs'}".\n\n` +
328
+ ` It must be a positive integer (the most characters of an error message a claim keeps).`
329
+ )
330
+ }
294
331
 
295
332
  assertValidIdentifier(table, 'queue table')
296
333
  assertValidIdentifier(channel, 'notify channel')
@@ -664,10 +701,12 @@ export function createQueue(config: QueueConfig = {}): Queue {
664
701
  * The SET fragments that put a claimed job back to pending — unless a newer pending job holds its
665
702
  * pendingKey, in which case the job is cancelled instead (claim closed as 'cancelled' with `cancel`
666
703
  * `{ reason: 'superseded', message }`, error_payload `{ reason: 'superseded', by: <twin id> }`), so the twin with the newer payload is the one that runs.
704
+ * `claimExtra` (a jsonb object SQL: the attempt's `error` and caller keys) is merged into the closed claim on
705
+ * both branches, so a superseded attempt keeps its cause beside `cancel`.
667
706
  * Decided inside the UPDATE, from the row as it is when the statement runs. Callers must hold
668
707
  * `lockPendingKeyOf` for the row first, in the same transaction, so a racing enqueue cannot add a twin unseen.
669
708
  */
670
- function returnToPending(reason: JobClaimReason, errorPayload: SQL): SQL {
709
+ function returnToPending(reason: JobClaimReason, errorPayload: SQL, claimExtra?: SQL): SQL {
671
710
  const twinId = sql`(SELECT twin.id::text FROM ${sql.raw(tableQ)} AS twin
672
711
  WHERE twin.pending_key = ${sql.raw(tableQ)}.pending_key
673
712
  AND coalesce(twin.flow_tenant, '') = coalesce(${sql.raw(tableQ)}.flow_tenant, '')
@@ -677,7 +716,7 @@ export function createQueue(config: QueueConfig = {}): Queue {
677
716
  const supersededClaim = sql`CASE WHEN ${superseded}
678
717
  THEN jsonb_build_object('cancel', jsonb_build_object('reason', 'superseded', 'message', 'superseded by ' || ${twinId}))
679
718
  ELSE '{}'::jsonb END`
680
- return sql`${closeClaim(sql`CASE WHEN ${superseded} THEN 'cancelled' ELSE ${reason}::text END`, progressQ, supersededClaim)},
719
+ return sql`${closeClaim(sql`CASE WHEN ${superseded} THEN 'cancelled' ELSE ${reason}::text END`, progressQ, claimExtra === undefined ? supersededClaim : sql`${supersededClaim} || ${claimExtra}`)},
681
720
  status = CASE WHEN ${superseded} THEN 'cancelled' ELSE 'pending' END,
682
721
  completed_at = CASE WHEN ${superseded} THEN now() ELSE completed_at END,
683
722
  error_payload = CASE WHEN ${superseded} THEN jsonb_build_object('reason', 'superseded', 'by', ${twinId}) ELSE ${errorPayload} END`
@@ -696,10 +735,11 @@ export function createQueue(config: QueueConfig = {}): Queue {
696
735
  * the caller's transaction. Shared by fail and reap so the two cannot drift.
697
736
  */
698
737
  async function retryOrDeadLetter(
699
- tx: DB, job: JobRow, errorJson: string, reason: 'failed' | 'reaped-stale', permanent = false,
738
+ tx: DB, job: JobRow, errorJson: string, reason: 'failed' | 'reaped-stale', claimKeys: Readonly<Record<string, unknown>>, permanent = false,
700
739
  ): Promise<'retry' | 'dead_letter' | 'superseded'> {
701
740
  const { jobId, attemptCount, maxAttempts: jobMaxAttempts } = job
702
741
  const nextAttempt = attemptCount + 1
742
+ const claimExtra = sql`${JSON.stringify(claimKeys)}::jsonb`
703
743
 
704
744
  if (!permanent && nextAttempt < jobMaxAttempts) {
705
745
  const delayMs = calculateDelay(attemptCount)
@@ -707,7 +747,7 @@ export function createQueue(config: QueueConfig = {}): Queue {
707
747
  await lockPendingKeyOf(tx, jobId)
708
748
  const rows = await tx.execute(
709
749
  sql`UPDATE ${sql.raw(tableQ)} SET
710
- ${returnToPending(reason, sql`${errorJson}::jsonb`)},
750
+ ${returnToPending(reason, sql`${errorJson}::jsonb`, claimExtra)},
711
751
  attempt_count = ${nextAttempt},
712
752
  next_retry_at = now() + ${delaySeconds}::interval,
713
753
  claimed_at = NULL,
@@ -721,7 +761,7 @@ export function createQueue(config: QueueConfig = {}): Queue {
721
761
  }
722
762
  await tx.execute(
723
763
  sql`UPDATE ${sql.raw(tableQ)} SET
724
- ${closeClaim(reason, progressQ)},
764
+ ${closeClaim(reason, progressQ, claimExtra)},
725
765
  status = 'dead_letter',
726
766
  attempt_count = ${nextAttempt},
727
767
  completed_at = now(),
@@ -747,16 +787,61 @@ export function createQueue(config: QueueConfig = {}): Queue {
747
787
  return 'dead_letter'
748
788
  }
749
789
 
750
- async function fail(db: DB, jobId: string, error: unknown, claimToken?: string, opts?: { permanent?: boolean }): Promise<boolean> {
790
+ /** The `error` a closed claim keeps, from the serialized error: name, bounded message, and the nearest string `code` on the cause chain. */
791
+ function claimError(serialized: unknown): { name: string; message: string; code?: string } {
792
+ let name = 'NonError'
793
+ let message: string
794
+ if (serialized !== null && typeof serialized === 'object' && typeof (serialized as { name?: unknown }).name === 'string'
795
+ && typeof (serialized as { message?: unknown }).message === 'string') {
796
+ name = (serialized as { name: string }).name
797
+ message = (serialized as { message: string }).message
798
+ } else if (typeof serialized === 'object' && serialized !== null) {
799
+ message = (() => { try { return JSON.stringify(serialized) } catch { return String(serialized) } })()
800
+ } else {
801
+ message = String(serialized)
802
+ }
803
+ let code: string | undefined
804
+ let at: unknown = serialized
805
+ for (let depth = 0; depth < 32 && at !== null && typeof at === 'object'; depth++) {
806
+ const c = (at as { code?: unknown }).code
807
+ if (typeof c === 'string') { code = c; break }
808
+ at = (at as { cause?: unknown }).cause
809
+ }
810
+ return { name, message: cutText(message, claimErrorMaxChars), ...(code === undefined ? {} : { code }) }
811
+ }
812
+
813
+ /** `fail`'s `claim` option as the keys to merge; refuses a non-object and any key the queue owns. */
814
+ function callerClaim(claim: FailOptions['claim']): Record<string, unknown> {
815
+ if (claim === undefined) return {}
816
+ if ((claim as unknown) === null || typeof claim !== 'object' || Array.isArray(claim)) {
817
+ throw new Error(
818
+ `[pipework] fail() on queue "${table}" received a claim option that is not a plain object.\n\n` +
819
+ ` Pass a small JSON object such as { errorClass: 'connection-fault' }.`
820
+ )
821
+ }
822
+ for (const key of RESERVED_CLAIM_KEYS) {
823
+ if (Object.hasOwn(claim, key)) {
824
+ throw new Error(
825
+ `[pipework] fail() on queue "${table}" received claim key "${key}", which the queue sets itself.\n\n` +
826
+ ` Reserved keys: ${RESERVED_CLAIM_KEYS.join(', ')}. Use another key name.`
827
+ )
828
+ }
829
+ }
830
+ return { ...claim }
831
+ }
832
+
833
+ async function fail(db: DB, jobId: string, error: unknown, claimToken?: string, opts?: FailOptions): Promise<boolean> {
751
834
  crossTenant(db, 'fail')
752
835
  return (await failAttempt(db, jobId, error, claimToken, opts)) !== null
753
836
  }
754
837
 
755
838
  async function failAttempt(
756
- handle: DB, jobId: string, error: unknown, claimToken?: string, opts?: { permanent?: boolean },
839
+ handle: DB, jobId: string, error: unknown, claimToken?: string, opts?: FailOptions,
757
840
  ): Promise<FailedAttempt | null> {
758
841
  const db = crossTenant(handle, 'failAttempt')
759
- const errorJson = JSON.stringify(serializeError(error))
842
+ const serialized = serializeError(error)
843
+ const errorJson = JSON.stringify(serialized)
844
+ const claimKeys = { ...callerClaim(opts?.claim), error: claimError(serialized) }
760
845
 
761
846
  return db.transaction(async (tx) => {
762
847
  const jobRows = await tx.execute(
@@ -776,7 +861,7 @@ export function createQueue(config: QueueConfig = {}): Queue {
776
861
  attemptCount: job['attempt_count'] as number,
777
862
  maxAttempts: job['max_attempts'] as number,
778
863
  flow: flowOf(job),
779
- }, errorJson, 'failed', opts?.permanent === true)
864
+ }, errorJson, 'failed', claimKeys, opts?.permanent === true)
780
865
  return { outcome, error: JSON.parse(errorJson) as unknown }
781
866
  })
782
867
  }
@@ -919,7 +1004,7 @@ export function createQueue(config: QueueConfig = {}): Queue {
919
1004
  attemptCount,
920
1005
  maxAttempts: jobMaxAttempts,
921
1006
  flow: flowOf(row),
922
- }, errorJson, 'reaped-stale')
1007
+ }, errorJson, 'reaped-stale', {})
923
1008
  reaped.push({
924
1009
  jobId: id,
925
1010
  type: row['job_type'] as string,
@@ -18,7 +18,8 @@ const DROPPED_KEYS = new Set(['params', 'parameters', 'args', 'types'])
18
18
  const MAX_QUERY_CHARS = 2_000
19
19
  const MAX_STRING_CHARS = 4_000
20
20
 
21
- function cut(text: string, max: number): string {
21
+ /** Cuts `text` to `max` characters, ending `…[truncated N chars]` when it was longer. */
22
+ export function cutText(text: string, max: number): string {
22
23
  return text.length <= max ? text : `${text.slice(0, max)}…[truncated ${String(text.length - max)} chars]`
23
24
  }
24
25
 
@@ -33,13 +34,13 @@ function serialize(value: unknown, seen: Set<Error>): unknown {
33
34
  const stack = typeof value.stack === 'string' && paramsAt !== -1 ? value.stack.replace(value.message, message) : value.stack
34
35
  const out: Record<string, unknown> = {
35
36
  name: value.name,
36
- message: cut(message, MAX_STRING_CHARS),
37
- stack: typeof stack === 'string' ? cut(stack, MAX_STRING_CHARS) : stack,
37
+ message: cutText(message, MAX_STRING_CHARS),
38
+ stack: typeof stack === 'string' ? cutText(stack, MAX_STRING_CHARS) : stack,
38
39
  }
39
40
  for (const key of Object.keys(value)) {
40
41
  if (key === 'name' || key === 'message' || key === 'stack' || key === 'cause' || DROPPED_KEYS.has(key)) continue
41
42
  const v = (value as unknown as Record<string, unknown>)[key]
42
- out[key] = typeof v === 'string' ? cut(v, key === 'query' ? MAX_QUERY_CHARS : MAX_STRING_CHARS) : v
43
+ out[key] = typeof v === 'string' ? cutText(v, key === 'query' ? MAX_QUERY_CHARS : MAX_STRING_CHARS) : v
43
44
  }
44
45
  if (value.cause !== undefined) {
45
46
  out['cause'] = serialize(value.cause, seen)
@@ -9,6 +9,7 @@ import { serializable } from './serializable.js'
9
9
  import { withTimeouts } from './timeouts.js'
10
10
  import { bulkSet } from './bulk-set.js'
11
11
  import { values } from './values.js'
12
+ import { rows } from './rows.js'
12
13
  import { fn } from './function-source.js'
13
14
  import { update, insert, remove, upsert } from '../write/index.js'
14
15
 
@@ -84,6 +85,9 @@ export const pipe = Object.assign(getDb, {
84
85
  /** Produces a typed VALUES clause for bulk operations — the base primitive for bulkSet and bulkUpsert. */
85
86
  values,
86
87
 
88
+ /** A typed rowset from parallel array parameters, one parameter per column whatever the row count, as a source for `.from()` and joins — `pipe.rows({ g: 'text', id: 'int' }, { g: [...], id: [...] })` renders `unnest($1::text[], $2::int[]) AS rows(g, id)`. For composite-key matches that would otherwise be a union or a JS-side tuple match. */
89
+ rows,
90
+
87
91
  /** A set-returning SQL function as a typed source for `.from()` and joins — `pipe.fn('schema.f', { args: [field.uuid()], columns: { path: field.text() } })`. Arguments are bound and cast to their declared types. */
88
92
  fn,
89
93