pipework 0.136.0 → 0.137.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 +9 -0
- package/REFERENCE.md +14 -0
- package/dist/data/db/expressions.d.ts +29 -1
- package/dist/data/db/expressions.d.ts.map +1 -1
- package/dist/data/db/expressions.js +84 -2
- package/dist/data/db/expressions.js.map +1 -1
- package/dist/data/db/filter.d.ts +13 -2
- package/dist/data/db/filter.d.ts.map +1 -1
- package/dist/data/db/filter.js +13 -2
- package/dist/data/db/filter.js.map +1 -1
- package/dist/data/db/namespace.d.ts +11 -0
- package/dist/data/db/namespace.d.ts.map +1 -1
- package/dist/data/jsonb/namespace.d.ts +3 -1
- package/dist/data/jsonb/namespace.d.ts.map +1 -1
- package/dist/data/jsonb/namespace.js +3 -1
- package/dist/data/jsonb/namespace.js.map +1 -1
- package/dist/data/jsonb/query.d.ts +6 -0
- package/dist/data/jsonb/query.d.ts.map +1 -1
- package/dist/data/jsonb/query.js +14 -0
- package/dist/data/jsonb/query.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.137.0
|
|
4
|
+
|
|
5
|
+
- **Added: text tests that never read the needle as a pattern** (#647). `filter.strpos(a, b)`, `textContains(a, b)` (`strpos > 0`), `startsWith(a, prefix)` (`starts_with`), `left(a, n)`, `right(a, n)`, `length(a)`. Strings are bound as `$n::text`, so `%`, `_` and `\` match only themselves.
|
|
6
|
+
- **Added: `filter.concat(...parts)`, text built with `||`** (#648). Each part a string (bound), a column or an expression (`scalar(...)` for a subquery); usable in `.set()`, `.values()` and `.where()`. A null part makes the result null, as SQL `||` does; wrap it in `coalesce` if not wanted. Fewer than two parts throws.
|
|
7
|
+
- **Added: `filter.arrayReplace(col, from, to)` and `filter.arrayHas(col, value)`** (#649). `array_replace` and `value = ANY(col)`, values bound and cast to the column's element type; a non-array column throws.
|
|
8
|
+
- **Added: `jsonb.merge(col, object)` (also `filter.jsonbMerge`)** (#650). `coalesce(col, '{}'::jsonb) || $::jsonb` in the statement, so a null column counts as `{}` and concurrent merges of different keys both survive. A non-object value throws.
|
|
9
|
+
- **Added: `filter.clockTimestamp()`** (#651). `clock_timestamp()`, the wall-clock time, which moves within a transaction where `now()` does not.
|
|
10
|
+
- **Changed: `filter.interval(n, unit)` binds `n`** (#652). It renders `($1::double precision * interval '1 <unit>')` instead of splicing the number into the statement; same signature and same values. A non-finite amount now throws.
|
|
11
|
+
|
|
3
12
|
## 0.136.0
|
|
4
13
|
|
|
5
14
|
- **Added: `untrustedFetch.get(url, options)`, fetching one URL a stranger gave** (#640). Only `http:` and `https:`; the name is resolved and every address it resolves to is checked, and the connection goes to a checked address (pinned, with Host and TLS name kept as the hostname). Refused: loopback, private ranges, link-local (cloud metadata included), CGNAT, reserved, multicast, unspecified, unique-local, site-local and documentation IPv6, IPv4-mapped, IPv4-compatible and NAT64 forms of these, and literal IP URLs in them. Redirects are followed up to `maxRedirects`, each hop checked as the first, and the app's `headers` go only to the first origin. `maxBytes` stops the body the moment it is passed, whatever Content-Length says; `timeoutMs` covers the whole fetch; `accept({ status, contentType, firstBytes })` sees the first 1024 bytes before the body is kept. The three limits are required. A refusal is returned, not thrown, as `{ ok: false, reason, message }` with `reason` one of `scheme`, `address`, `redirects`, `too_large`, `timeout`, `status`, `rejected`, `network`, and a plain message that never carries an address or what a server sent. Traced as `pipework/fetch:get` (host; the full URL only with `urlIsSafeToTrace`) with a child `pipework/fetch:outcome` holding host, status, bytes and reason. `resolve` and `connect` options let a test say what a name resolves to and where the connection goes; the address check still runs.
|
package/REFERENCE.md
CHANGED
|
@@ -707,6 +707,16 @@ The system channel — deliberate cross-tenant access for pre-tenant surfaces (a
|
|
|
707
707
|
|
|
708
708
|
Query operators and aggregates — eq, gt, lt, and, or, count, sum, etc.
|
|
709
709
|
|
|
710
|
+
Expression helpers for `.set()`, `.values()` and `.where()` (a string or number argument is always a bound parameter):
|
|
711
|
+
|
|
712
|
+
- `filter.clockTimestamp()` — `clock_timestamp()`, the wall-clock time; unlike `now()` it advances within a transaction.
|
|
713
|
+
- `filter.interval(amount, unit)` — `($1::double precision * interval '1 <unit>')`, `amount` bound; a non-finite amount throws.
|
|
714
|
+
- `filter.strpos(a, b)`, `filter.textContains(a, b)`, `filter.startsWith(a, prefix)` — exact-text tests, no `%`/`_`/backslash wildcards (unlike `like`). `a`, `b`, `prefix` take a column, expression or string.
|
|
715
|
+
- `filter.left(a, n)`, `filter.right(a, n)`, `filter.length(a)` — text slices and length.
|
|
716
|
+
- `filter.concat(...parts)` — `(p1 || p2 || ...)`, at least two parts, each a string, column or expression (`scalar(...)` for a subquery). A null part makes the result null; wrap it in `coalesce` if not wanted.
|
|
717
|
+
- `filter.arrayReplace(col, from, to)` — `array_replace`, every `from` becomes `to`; `filter.arrayHas(col, value)` — `$value = ANY(col)`. `col` must be an array column; values are cast to its element type.
|
|
718
|
+
- `filter.jsonbMerge(col, object)` — same as `jsonb.merge`.
|
|
719
|
+
|
|
710
720
|
### `pipe.aliasedRelation`
|
|
711
721
|
|
|
712
722
|
|
|
@@ -846,6 +856,10 @@ JSONB query operators — typed helpers for PostgreSQL JSONB containment, key ch
|
|
|
846
856
|
|
|
847
857
|
The @> containment operator — tests whether a JSONB column contains the given value.
|
|
848
858
|
|
|
859
|
+
### `jsonb.merge`
|
|
860
|
+
|
|
861
|
+
Merges an object into a JSONB column in `.set()`: `coalesce(col, '{}'::jsonb) || value::jsonb`. Top-level keys of `value` overwrite, other keys are kept, a null column becomes `value`. The merge runs in the statement, so concurrent updates of different keys both survive. A value that is not a plain object (array, null, primitive) throws. Also `filter.jsonbMerge`.
|
|
862
|
+
|
|
849
863
|
### `jsonb.containedBy`
|
|
850
864
|
|
|
851
865
|
The <@ contained-by operator — tests whether a JSONB column is contained by the given value.
|
|
@@ -18,8 +18,35 @@ export declare function scalar<T>(subquery: SQLWrapper): SQL<T>;
|
|
|
18
18
|
export type IntervalUnit = 'microseconds' | 'milliseconds' | 'seconds' | 'minutes' | 'hours' | 'days' | 'weeks' | 'months' | 'years';
|
|
19
19
|
/** PostgreSQL type cast: `expression::pgType`. */
|
|
20
20
|
export declare function cast<T = unknown>(expression: SQL | Column | SQLWrapper, pgType: string): SQL<T>;
|
|
21
|
-
/** PostgreSQL interval
|
|
21
|
+
/** PostgreSQL interval of `amount` units, `amount` bound as a parameter: `($1::double precision * interval '1 minute')`. Throws for a non-finite amount. */
|
|
22
22
|
export declare function interval(amount: number, unit: IntervalUnit): SQL;
|
|
23
|
+
/** PostgreSQL `clock_timestamp()` — the actual wall-clock time, which advances within a transaction (unlike `now()`). */
|
|
24
|
+
export declare function clockTimestamp(): SQL<Date>;
|
|
25
|
+
/** A text operand: a column, an expression, or a string (bound as `$n::text`). */
|
|
26
|
+
export type TextArg = Column | SQL | string;
|
|
27
|
+
/** PostgreSQL `strpos(a, b)` — 1-based position of `b` in `a`, 0 when absent. Strings are bound as text, so `%`, `_` and `\` are plain characters. */
|
|
28
|
+
export declare function strpos(a: TextArg, b: TextArg): SQL<number>;
|
|
29
|
+
/** True when `a` contains the exact text `b`: `strpos(a, b) > 0`. Unlike `like`, no character in `b` is a wildcard. */
|
|
30
|
+
export declare function textContains(a: TextArg, b: TextArg): SQL<boolean>;
|
|
31
|
+
/** PostgreSQL `starts_with(a, prefix)` — true when `a` begins with the exact text `prefix`; no wildcards. */
|
|
32
|
+
export declare function startsWith(a: TextArg, prefix: TextArg): SQL<boolean>;
|
|
33
|
+
/** PostgreSQL `left(a, n)` — the first `n` characters of `a`. */
|
|
34
|
+
export declare function left(a: TextArg, n: number | Column | SQL): SQL<string>;
|
|
35
|
+
/** PostgreSQL `right(a, n)` — the last `n` characters of `a`. */
|
|
36
|
+
export declare function right(a: TextArg, n: number | Column | SQL): SQL<string>;
|
|
37
|
+
/** PostgreSQL `length(a)` — the number of characters in `a`. */
|
|
38
|
+
export declare function length(a: TextArg): SQL<number>;
|
|
39
|
+
/**
|
|
40
|
+
* Text concatenation: `(p1 || p2 || ...)`. Strings are bound as text. A null part makes
|
|
41
|
+
* the whole result null (SQL `||`); wrap such a part in `coalesce` if that is not wanted.
|
|
42
|
+
* Wrap a subquery with `scalar(...)`.
|
|
43
|
+
*/
|
|
44
|
+
export declare function concat(...parts: Array<string | Column | SQL>): SQL<string>;
|
|
45
|
+
type ElementOf<C extends Column> = C['_']['data'] extends ReadonlyArray<infer E> ? E : never;
|
|
46
|
+
/** PostgreSQL `array_replace(col, from, to)` — every element equal to `from` becomes `to`. `from`/`to` are bound and cast to the column's element type. */
|
|
47
|
+
export declare function arrayReplace<C extends Column>(col: C, from: ElementOf<C>, to: ElementOf<C>): SQL<C['_']['data']>;
|
|
48
|
+
/** True when the array column holds `value`: `$value::<element> = ANY(col)`. `value` is bound and cast to the column's element type. */
|
|
49
|
+
export declare function arrayHas<C extends Column>(col: C, value: ElementOf<C>): SQL<boolean>;
|
|
23
50
|
/** PostgreSQL `date_trunc('unit', column)` — truncates a timestamp to the given precision. */
|
|
24
51
|
export declare function dateTrunc(unit: 'microseconds' | 'milliseconds' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year' | 'decade' | 'century' | 'millennium', column: Column | SQL): SQL<Date>;
|
|
25
52
|
/** PostgreSQL `ROW_NUMBER()` window function. Use with `over()` to apply a window specification. */
|
|
@@ -56,4 +83,5 @@ export declare function walCurrentLsn(): SQL<string>;
|
|
|
56
83
|
export declare function walReplayLsn(): SQL<string | null>;
|
|
57
84
|
/** PostgreSQL `pg_last_wal_replay_lsn() >= lsn::pg_lsn` — true once a replica has replayed up to the given LSN. Yields NULL (not true) on a primary, where there is no replay position. */
|
|
58
85
|
export declare function replicaFresh(createdLsn: string | Column | SQL): SQL<boolean | null>;
|
|
86
|
+
export {};
|
|
59
87
|
//# sourceMappingURL=expressions.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../../../src/data/db/expressions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAErD,uEAAuE;AACvE,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAE3E;AAED,mGAAmG;AACnG,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAE3E;AAED,oGAAoG;AACpG,wBAAgB,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAEhF;AAED,oGAAoG;AACpG,wBAAgB,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAErF;AAED,8FAA8F;AAC9F,wBAAgB,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,GAAG,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAE7E;AAED,2FAA2F;AAC3F,wBAAgB,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAE/B;AAED,gGAAgG;AAChG,wBAAgB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,UAAU,GAAG,GAAG,CAAC,CAAC,CAAC,CAEtD;AAED,+EAA+E;AAC/E,MAAM,MAAM,YAAY,GAAG,cAAc,GAAG,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAA;AAEpI,kDAAkD;AAClD,wBAAgB,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,UAAU,EAAE,GAAG,GAAG,MAAM,GAAG,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAE/F;
|
|
1
|
+
{"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../../../src/data/db/expressions.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,9 +31,91 @@ export function scalar(subquery) {
|
|
|
31
31
|
export function cast(expression, pgType) {
|
|
32
32
|
return sql `(${expression})::${sql.raw(pgType)}`;
|
|
33
33
|
}
|
|
34
|
-
|
|
34
|
+
const INTERVAL_UNIT_SINGULAR = {
|
|
35
|
+
microseconds: 'microsecond',
|
|
36
|
+
milliseconds: 'millisecond',
|
|
37
|
+
seconds: 'second',
|
|
38
|
+
minutes: 'minute',
|
|
39
|
+
hours: 'hour',
|
|
40
|
+
days: 'day',
|
|
41
|
+
weeks: 'week',
|
|
42
|
+
months: 'month',
|
|
43
|
+
years: 'year',
|
|
44
|
+
};
|
|
45
|
+
/** PostgreSQL interval of `amount` units, `amount` bound as a parameter: `($1::double precision * interval '1 minute')`. Throws for a non-finite amount. */
|
|
35
46
|
export function interval(amount, unit) {
|
|
36
|
-
|
|
47
|
+
if (!Number.isFinite(amount)) {
|
|
48
|
+
throw new Error(`[pipework] interval() needs a finite amount, got ${String(amount)}.\n\n` +
|
|
49
|
+
' NaN and Infinity are not valid interval amounts.\n' +
|
|
50
|
+
" Fix: pass a finite number: interval(5, 'minutes').\n");
|
|
51
|
+
}
|
|
52
|
+
return sql `(${amount}::double precision * interval '1 ${sql.raw(INTERVAL_UNIT_SINGULAR[unit])}')`;
|
|
53
|
+
}
|
|
54
|
+
/** PostgreSQL `clock_timestamp()` — the actual wall-clock time, which advances within a transaction (unlike `now()`). */
|
|
55
|
+
export function clockTimestamp() {
|
|
56
|
+
return sql `clock_timestamp()`;
|
|
57
|
+
}
|
|
58
|
+
function textArg(value) {
|
|
59
|
+
return typeof value === 'string' ? sql `${value}::text` : sql `${value}`;
|
|
60
|
+
}
|
|
61
|
+
function intArg(value) {
|
|
62
|
+
return typeof value === 'number' ? sql `${value}::int` : sql `${value}`;
|
|
63
|
+
}
|
|
64
|
+
/** PostgreSQL `strpos(a, b)` — 1-based position of `b` in `a`, 0 when absent. Strings are bound as text, so `%`, `_` and `\` are plain characters. */
|
|
65
|
+
export function strpos(a, b) {
|
|
66
|
+
return sql `strpos(${textArg(a)}, ${textArg(b)})`;
|
|
67
|
+
}
|
|
68
|
+
/** True when `a` contains the exact text `b`: `strpos(a, b) > 0`. Unlike `like`, no character in `b` is a wildcard. */
|
|
69
|
+
export function textContains(a, b) {
|
|
70
|
+
return sql `${strpos(a, b)} > 0`;
|
|
71
|
+
}
|
|
72
|
+
/** PostgreSQL `starts_with(a, prefix)` — true when `a` begins with the exact text `prefix`; no wildcards. */
|
|
73
|
+
export function startsWith(a, prefix) {
|
|
74
|
+
return sql `starts_with(${textArg(a)}, ${textArg(prefix)})`;
|
|
75
|
+
}
|
|
76
|
+
/** PostgreSQL `left(a, n)` — the first `n` characters of `a`. */
|
|
77
|
+
export function left(a, n) {
|
|
78
|
+
return sql `left(${textArg(a)}, ${intArg(n)})`;
|
|
79
|
+
}
|
|
80
|
+
/** PostgreSQL `right(a, n)` — the last `n` characters of `a`. */
|
|
81
|
+
export function right(a, n) {
|
|
82
|
+
return sql `right(${textArg(a)}, ${intArg(n)})`;
|
|
83
|
+
}
|
|
84
|
+
/** PostgreSQL `length(a)` — the number of characters in `a`. */
|
|
85
|
+
export function length(a) {
|
|
86
|
+
return sql `length(${textArg(a)})`;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Text concatenation: `(p1 || p2 || ...)`. Strings are bound as text. A null part makes
|
|
90
|
+
* the whole result null (SQL `||`); wrap such a part in `coalesce` if that is not wanted.
|
|
91
|
+
* Wrap a subquery with `scalar(...)`.
|
|
92
|
+
*/
|
|
93
|
+
export function concat(...parts) {
|
|
94
|
+
if (parts.length < 2) {
|
|
95
|
+
throw new Error(`[pipework] concat() needs at least two parts, got ${parts.length}.\n\n` +
|
|
96
|
+
' A concatenation of fewer than two parts is not a concatenation.\n' +
|
|
97
|
+
" Fix: pass two or more parts: concat('prefix: ', column).\n");
|
|
98
|
+
}
|
|
99
|
+
return sql `(${sql.join(parts.map(textArg), sql ` || `)})`;
|
|
100
|
+
}
|
|
101
|
+
function elementType(column, helper) {
|
|
102
|
+
const type = column.getSQLType();
|
|
103
|
+
if (!type.endsWith('[]')) {
|
|
104
|
+
throw new Error(`[pipework] ${helper}() needs an array column, got "${column.name}" of type ${type}.\n\n` +
|
|
105
|
+
' The element type is read from the column, so it must be an array column.\n' +
|
|
106
|
+
` Fix: pass an array column (for example uuid('ids').array()) to ${helper}().\n`);
|
|
107
|
+
}
|
|
108
|
+
return type.slice(0, -2);
|
|
109
|
+
}
|
|
110
|
+
/** PostgreSQL `array_replace(col, from, to)` — every element equal to `from` becomes `to`. `from`/`to` are bound and cast to the column's element type. */
|
|
111
|
+
export function arrayReplace(col, from, to) {
|
|
112
|
+
const el = sql.raw(elementType(col, 'arrayReplace'));
|
|
113
|
+
return sql `array_replace(${col}, ${from}::${el}, ${to}::${el})`;
|
|
114
|
+
}
|
|
115
|
+
/** True when the array column holds `value`: `$value::<element> = ANY(col)`. `value` is bound and cast to the column's element type. */
|
|
116
|
+
export function arrayHas(col, value) {
|
|
117
|
+
const el = sql.raw(elementType(col, 'arrayHas'));
|
|
118
|
+
return sql `${value}::${el} = ANY(${col})`;
|
|
37
119
|
}
|
|
38
120
|
/** PostgreSQL `date_trunc('unit', column)` — truncates a timestamp to the given precision. */
|
|
39
121
|
export function dateTrunc(unit, column) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expressions.js","sourceRoot":"","sources":["../../../src/data/db/expressions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAI9B,uEAAuE;AACvE,MAAM,UAAU,SAAS,CAAC,MAAoB,EAAE,MAAc;IAC5D,OAAO,GAAG,CAAQ,GAAG,MAAM,MAAM,MAAM,EAAE,CAAA;AAC3C,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,SAAS,CAAC,MAAoB,EAAE,MAAc;IAC5D,OAAO,GAAG,CAAQ,GAAG,MAAM,MAAM,MAAM,EAAE,CAAA;AAC3C,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,GAAG,CAAc,IAAkB,EAAE,KAAmB;IACtE,OAAO,GAAG,CAAG,GAAG,IAAI,MAAM,KAAK,EAAE,CAAA;AACnC,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,QAAQ,CAAc,IAAkB,EAAE,KAAmB;IAC3E,OAAO,GAAG,CAAG,GAAG,IAAI,MAAM,KAAK,EAAE,CAAA;AACnC,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,QAAQ,CAAI,UAAwB,EAAE,YAAe;IACnE,OAAO,GAAG,CAAG,YAAY,UAAU,KAAK,YAAY,GAAG,CAAA;AACzD,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,GAAG;IACjB,OAAO,GAAG,CAAM,OAAO,CAAA;AACzB,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,MAAM,CAAI,QAAoB;IAC5C,OAAO,GAAG,CAAG,IAAI,QAAQ,GAAG,CAAA;AAC9B,CAAC;AAKD,kDAAkD;AAClD,MAAM,UAAU,IAAI,CAAc,UAAqC,EAAE,MAAc;IACrF,OAAO,GAAG,CAAG,IAAI,UAAU,MAAM,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAA;AACpD,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"expressions.js","sourceRoot":"","sources":["../../../src/data/db/expressions.ts"],"names":[],"mappings":"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"}
|
package/dist/data/db/filter.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { and, arrayContained, arrayContains, arrayOverlaps, asc, between, desc, exists, ilike, inArray, is, isNotNull, isNull, like, not, notBetween, notExists, notIlike, notInArray, notLike, or, avg, avgDistinct, count, countDistinct, max, min, sum, sumDistinct } from '../query/index.js';
|
|
2
|
-
import { increment, decrement, add, subtract, coalesce, now, scalar, cast, interval, dateTrunc, rowNumber, rank, denseRank, over, identifier, withRecursive, caseWhen, walCurrentLsn, walReplayLsn, replicaFresh } from './expressions.js';
|
|
2
|
+
import { increment, decrement, add, subtract, coalesce, now, scalar, cast, interval, clockTimestamp, strpos, textContains, startsWith, left, right, length, concat, arrayReplace, arrayHas, dateTrunc, rowNumber, rank, denseRank, over, identifier, withRecursive, caseWhen, walCurrentLsn, walReplayLsn, replicaFresh } from './expressions.js';
|
|
3
3
|
import { ago, castUuid, castJsonb, castTimestamp, castBoolean, castNumeric, castInteger, castText, nextSequence } from './composed.js';
|
|
4
|
-
import { json as jsonbExtract, pathText as jsonbExtractText, contains as jsonbContains } from '../jsonb/query.js';
|
|
4
|
+
import { json as jsonbExtract, pathText as jsonbExtractText, contains as jsonbContains, merge as jsonbMerge } from '../jsonb/query.js';
|
|
5
5
|
export declare const filter: {
|
|
6
6
|
readonly and: typeof and;
|
|
7
7
|
readonly arrayContained: typeof arrayContained;
|
|
@@ -53,6 +53,16 @@ export declare const filter: {
|
|
|
53
53
|
readonly scalar: typeof scalar;
|
|
54
54
|
readonly cast: typeof cast;
|
|
55
55
|
readonly interval: typeof interval;
|
|
56
|
+
readonly clockTimestamp: typeof clockTimestamp;
|
|
57
|
+
readonly strpos: typeof strpos;
|
|
58
|
+
readonly textContains: typeof textContains;
|
|
59
|
+
readonly startsWith: typeof startsWith;
|
|
60
|
+
readonly left: typeof left;
|
|
61
|
+
readonly right: typeof right;
|
|
62
|
+
readonly length: typeof length;
|
|
63
|
+
readonly concat: typeof concat;
|
|
64
|
+
readonly arrayReplace: typeof arrayReplace;
|
|
65
|
+
readonly arrayHas: typeof arrayHas;
|
|
56
66
|
readonly dateTrunc: typeof dateTrunc;
|
|
57
67
|
readonly rowNumber: typeof rowNumber;
|
|
58
68
|
readonly rank: typeof rank;
|
|
@@ -76,5 +86,6 @@ export declare const filter: {
|
|
|
76
86
|
readonly jsonbExtract: typeof jsonbExtract;
|
|
77
87
|
readonly jsonbExtractText: typeof jsonbExtractText;
|
|
78
88
|
readonly jsonbContains: typeof jsonbContains;
|
|
89
|
+
readonly jsonbMerge: typeof jsonbMerge;
|
|
79
90
|
};
|
|
80
91
|
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../../src/data/db/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAM,MAAM,EACjF,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAe,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAC9F,UAAU,EAAE,OAAO,EAAE,EAAE,EACvB,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EACnE,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../../src/data/db/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAM,MAAM,EACjF,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAe,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAC9F,UAAU,EAAE,OAAO,EAAE,EAAE,EACvB,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EACnE,MAAM,mBAAmB,CAAA;AAE1B,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACjV,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACtI,OAAO,EAAE,IAAI,IAAI,YAAY,EAAE,QAAQ,IAAI,gBAAgB,EAAE,QAAQ,IAAI,aAAa,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEtI,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiDT,CAAA"}
|
package/dist/data/db/filter.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { and, arrayContained, arrayContains, arrayOverlaps, asc, between, desc, eq, exists, gt, gte, ilike, inArray, is, isNotNull, isNull, like, lt, lte, ne, not, notBetween, notExists, notIlike, notInArray, notLike, or, avg, avgDistinct, count, countDistinct, max, min, sum, sumDistinct, } from '../query/index.js';
|
|
2
2
|
import { except, exceptAll, intersect, intersectAll, union, unionAll } from '../query/pg-core/index.js';
|
|
3
|
-
import { increment, decrement, add, subtract, coalesce, now, scalar, cast, interval, dateTrunc, rowNumber, rank, denseRank, over, identifier, withRecursive, caseWhen, walCurrentLsn, walReplayLsn, replicaFresh } from './expressions.js';
|
|
3
|
+
import { increment, decrement, add, subtract, coalesce, now, scalar, cast, interval, clockTimestamp, strpos, textContains, startsWith, left, right, length, concat, arrayReplace, arrayHas, dateTrunc, rowNumber, rank, denseRank, over, identifier, withRecursive, caseWhen, walCurrentLsn, walReplayLsn, replicaFresh } from './expressions.js';
|
|
4
4
|
import { ago, castUuid, castJsonb, castTimestamp, castBoolean, castNumeric, castInteger, castText, nextSequence } from './composed.js';
|
|
5
|
-
import { json as jsonbExtract, pathText as jsonbExtractText, contains as jsonbContains } from '../jsonb/query.js';
|
|
5
|
+
import { json as jsonbExtract, pathText as jsonbExtractText, contains as jsonbContains, merge as jsonbMerge } from '../jsonb/query.js';
|
|
6
6
|
export const filter = {
|
|
7
7
|
and, arrayContained, arrayContains, arrayOverlaps, asc, between, desc, eq, exists, gt, gte,
|
|
8
8
|
ilike, inArray, is, isNotNull, isNull, like, lt, lte, ne, not, notBetween, notExists, notIlike,
|
|
@@ -18,6 +18,16 @@ export const filter = {
|
|
|
18
18
|
scalar,
|
|
19
19
|
cast,
|
|
20
20
|
interval,
|
|
21
|
+
clockTimestamp,
|
|
22
|
+
strpos,
|
|
23
|
+
textContains,
|
|
24
|
+
startsWith,
|
|
25
|
+
left,
|
|
26
|
+
right,
|
|
27
|
+
length,
|
|
28
|
+
concat,
|
|
29
|
+
arrayReplace,
|
|
30
|
+
arrayHas,
|
|
21
31
|
dateTrunc,
|
|
22
32
|
rowNumber,
|
|
23
33
|
rank,
|
|
@@ -41,5 +51,6 @@ export const filter = {
|
|
|
41
51
|
jsonbExtract,
|
|
42
52
|
jsonbExtractText,
|
|
43
53
|
jsonbContains,
|
|
54
|
+
jsonbMerge,
|
|
44
55
|
};
|
|
45
56
|
//# sourceMappingURL=filter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../src/data/db/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAC1F,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAC9F,UAAU,EAAE,OAAO,EAAE,EAAE,EACvB,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,GACnE,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACvG,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"filter.js","sourceRoot":"","sources":["../../../src/data/db/filter.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAC1F,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAC9F,UAAU,EAAE,OAAO,EAAE,EAAE,EACvB,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,GACnE,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AACvG,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AACjV,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACtI,OAAO,EAAE,IAAI,IAAI,YAAY,EAAE,QAAQ,IAAI,gBAAgB,EAAE,QAAQ,IAAI,aAAa,EAAE,KAAK,IAAI,UAAU,EAAE,MAAM,mBAAmB,CAAA;AAEtI,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,GAAG,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG;IAC1F,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ;IAC9F,UAAU,EAAE,OAAO,EAAE,EAAE;IACvB,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW;IAClE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ;IAC3D,SAAS;IACT,SAAS;IACT,GAAG;IACH,QAAQ;IACR,QAAQ;IACR,GAAG;IACH,MAAM;IACN,IAAI;IACJ,QAAQ;IACR,cAAc;IACd,MAAM;IACN,YAAY;IACZ,UAAU;IACV,IAAI;IACJ,KAAK;IACL,MAAM;IACN,MAAM;IACN,YAAY;IACZ,QAAQ;IACR,SAAS;IACT,SAAS;IACT,IAAI;IACJ,SAAS;IACT,IAAI;IACJ,UAAU;IACV,aAAa;IACb,GAAG;IACH,QAAQ;IACR,SAAS;IACT,aAAa;IACb,WAAW;IACX,WAAW;IACX,WAAW;IACX,QAAQ;IACR,YAAY;IACZ,QAAQ;IACR,aAAa;IACb,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,gBAAgB;IAChB,aAAa;IACb,UAAU;CACF,CAAA"}
|
|
@@ -70,6 +70,16 @@ export declare const pipe: typeof getDb & {
|
|
|
70
70
|
readonly scalar: typeof import("./expressions.js").scalar;
|
|
71
71
|
readonly cast: typeof import("./expressions.js").cast;
|
|
72
72
|
readonly interval: typeof import("./expressions.js").interval;
|
|
73
|
+
readonly clockTimestamp: typeof import("./expressions.js").clockTimestamp;
|
|
74
|
+
readonly strpos: typeof import("./expressions.js").strpos;
|
|
75
|
+
readonly textContains: typeof import("./expressions.js").textContains;
|
|
76
|
+
readonly startsWith: typeof import("./expressions.js").startsWith;
|
|
77
|
+
readonly left: typeof import("./expressions.js").left;
|
|
78
|
+
readonly right: typeof import("./expressions.js").right;
|
|
79
|
+
readonly length: typeof import("./expressions.js").length;
|
|
80
|
+
readonly concat: typeof import("./expressions.js").concat;
|
|
81
|
+
readonly arrayReplace: typeof import("./expressions.js").arrayReplace;
|
|
82
|
+
readonly arrayHas: typeof import("./expressions.js").arrayHas;
|
|
73
83
|
readonly dateTrunc: typeof import("./expressions.js").dateTrunc;
|
|
74
84
|
readonly rowNumber: typeof import("./expressions.js").rowNumber;
|
|
75
85
|
readonly rank: typeof import("./expressions.js").rank;
|
|
@@ -93,6 +103,7 @@ export declare const pipe: typeof getDb & {
|
|
|
93
103
|
readonly jsonbExtract: typeof import("../jsonb/query.js").json;
|
|
94
104
|
readonly jsonbExtractText: typeof import("../jsonb/query.js").pathText;
|
|
95
105
|
readonly jsonbContains: typeof import("../jsonb/query.js").contains;
|
|
106
|
+
readonly jsonbMerge: typeof import("../jsonb/query.js").merge;
|
|
96
107
|
};
|
|
97
108
|
/** Raw statement tag — for a statement pipework does not model. Interpolated values are parameters; `sql.raw` is not. Runs on the caller's connection, so inside a request it is the request transaction. Writes still go through pipe.update / insert / delete, which is what audit hooks. */
|
|
98
109
|
sql: typeof sql;
|
|
@@ -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,MAAM,SAAS,CAAA;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,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,MAAM,oBAAoB,CAAA;AAG/D,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,6EAA6E
|
|
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,MAAM,SAAS,CAAA;AACnD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAE5D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,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,MAAM,oBAAoB,CAAA;AAG/D,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,6EAA6E;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAG7E,+RAA+R;;;;;;;;;;;;;IAkB/R,oDAAoD;;IAEpD,mDAAmD;;IAGnD,6EAA6E;;IAG7E,gFAAgF;;IAGhF,kHAAkH;;IAGlH,2GAA2G;;IAG3G,0GAA0G;;IAG1G,8EAA8E;;;;;;;;;;;;;;;;;;;;;;;IAE9E,qMAAqM;;IAErM,6DAA6D;;IAG7D,2GAA2G;;IAE3G,kNAAkN;;IAElN,gHAAgH;;IAEhH,kQAAkQ;;CAElQ,CAAA"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { contains, containedBy, hasKey, text, json, path, pathText } from './query.js';
|
|
1
|
+
import { contains, merge, containedBy, hasKey, text, json, path, pathText } from './query.js';
|
|
2
2
|
import { boolean, number, integer } from './composed.js';
|
|
3
3
|
/** JSONB query operators — typed helpers for PostgreSQL JSONB containment, key checks, and field extraction. */
|
|
4
4
|
export declare const jsonb: {
|
|
5
5
|
/** The @> containment operator — tests whether a JSONB column contains the given value. */
|
|
6
6
|
contains: typeof contains;
|
|
7
|
+
/** Merges an object into a JSONB column in `.set()`: `coalesce(col, '{}') || value`. Top-level keys overwrite; others are kept. */
|
|
8
|
+
merge: typeof merge;
|
|
7
9
|
/** The <@ contained-by operator — tests whether a JSONB column is contained by the given value. */
|
|
8
10
|
containedBy: typeof containedBy;
|
|
9
11
|
/** The ? key-existence operator — tests whether a JSONB column has the given top-level key. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../../src/data/jsonb/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../../src/data/jsonb/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC7F,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAExD,gHAAgH;AAChH,eAAO,MAAM,KAAK;IAChB,2FAA2F;;IAE3F,mIAAmI;;IAEnI,mGAAmG;;IAEnG,+FAA+F;;IAE/F,sFAAsF;;IAEtF,8FAA8F;;IAE9F,wEAAwE;;IAExE,uGAAuG;;IAEvG,8EAA8E;;IAE9E,6EAA6E;;IAE7E,+EAA+E;;CAEhF,CAAA"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { contains, containedBy, hasKey, text, json, path, pathText } from './query.js';
|
|
1
|
+
import { contains, merge, containedBy, hasKey, text, json, path, pathText } from './query.js';
|
|
2
2
|
import { boolean, number, integer } from './composed.js';
|
|
3
3
|
/** JSONB query operators — typed helpers for PostgreSQL JSONB containment, key checks, and field extraction. */
|
|
4
4
|
export const jsonb = {
|
|
5
5
|
/** The @> containment operator — tests whether a JSONB column contains the given value. */
|
|
6
6
|
contains,
|
|
7
|
+
/** Merges an object into a JSONB column in `.set()`: `coalesce(col, '{}') || value`. Top-level keys overwrite; others are kept. */
|
|
8
|
+
merge,
|
|
7
9
|
/** The <@ contained-by operator — tests whether a JSONB column is contained by the given value. */
|
|
8
10
|
containedBy,
|
|
9
11
|
/** The ? key-existence operator — tests whether a JSONB column has the given top-level key. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../../src/data/jsonb/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../../src/data/jsonb/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC7F,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAExD,gHAAgH;AAChH,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,2FAA2F;IAC3F,QAAQ;IACR,mIAAmI;IACnI,KAAK;IACL,mGAAmG;IACnG,WAAW;IACX,+FAA+F;IAC/F,MAAM;IACN,sFAAsF;IACtF,IAAI;IACJ,8FAA8F;IAC9F,IAAI;IACJ,wEAAwE;IACxE,IAAI;IACJ,uGAAuG;IACvG,QAAQ;IACR,8EAA8E;IAC9E,OAAO;IACP,6EAA6E;IAC7E,MAAM;IACN,+EAA+E;IAC/E,OAAO;CACR,CAAA"}
|
|
@@ -10,4 +10,10 @@ export declare function json(column: Column | SQL, key: string): SQL;
|
|
|
10
10
|
export declare function path(column: Column | SQL, ...keys: string[]): SQL;
|
|
11
11
|
/** Extracts a nested text value: `column->'a'->>'b'`. Intermediate keys use `->`, final key uses `->>`. */
|
|
12
12
|
export declare function pathText(column: Column | SQL, ...keys: string[]): SQL<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Merges `value` into a JSONB column for `.set()`: `coalesce(col, '{}'::jsonb) || value::jsonb`. Top-level keys
|
|
15
|
+
* in `value` overwrite; others are kept; a null column becomes `value`. The merge happens in the statement,
|
|
16
|
+
* so concurrent updates that touch different keys both survive.
|
|
17
|
+
*/
|
|
18
|
+
export declare function merge(column: Column | SQL, value: Record<string, unknown>): SQL;
|
|
13
19
|
//# sourceMappingURL=query.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/data/jsonb/query.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEjD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,CAE3E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,CAE9E;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAEtE;AAED,4HAA4H;AAC5H,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAEnE;AAED,4HAA4H;AAC5H,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAE3D;AAED,yGAAyG;AACzG,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAOjE;AAED,2GAA2G;AAC3G,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAO7E"}
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/data/jsonb/query.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEjD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,CAE3E;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,CAE9E;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAEtE;AAED,4HAA4H;AAC5H,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAEnE;AAED,4HAA4H;AAC5H,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CAE3D;AAED,yGAAyG;AACzG,wBAAgB,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAOjE;AAED,2GAA2G;AAC3G,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAO7E;AAED;;;;GAIG;AACH,wBAAgB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,GAAG,CAU/E"}
|
package/dist/data/jsonb/query.js
CHANGED
|
@@ -37,4 +37,18 @@ export function pathText(column, ...keys) {
|
|
|
37
37
|
const intermediate = path(column, ...intermediateKeys);
|
|
38
38
|
return text(intermediate, finalKey);
|
|
39
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Merges `value` into a JSONB column for `.set()`: `coalesce(col, '{}'::jsonb) || value::jsonb`. Top-level keys
|
|
42
|
+
* in `value` overwrite; others are kept; a null column becomes `value`. The merge happens in the statement,
|
|
43
|
+
* so concurrent updates that touch different keys both survive.
|
|
44
|
+
*/
|
|
45
|
+
export function merge(column, value) {
|
|
46
|
+
const checked = value;
|
|
47
|
+
if (typeof checked !== 'object' || checked === null || Array.isArray(checked)) {
|
|
48
|
+
throw new Error(`[pipework] jsonb.merge() needs a plain object, got ${checked === null ? 'null' : Array.isArray(checked) ? 'an array' : typeof checked}.\n\n` +
|
|
49
|
+
' Only an object can be merged into an object.\n' +
|
|
50
|
+
" Fix: pass an object: jsonb.merge(col, { key: 'value' }).\n");
|
|
51
|
+
}
|
|
52
|
+
return sql `coalesce(${column}, '{}'::jsonb) || ${JSON.stringify(value)}::jsonb`;
|
|
53
|
+
}
|
|
40
54
|
//# sourceMappingURL=query.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/data/jsonb/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAGlC,MAAM,UAAU,QAAQ,CAAC,MAAoB,EAAE,KAAc;IAC3D,OAAO,GAAG,CAAS,GAAG,MAAM,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAA;AACnE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAoB,EAAE,KAAc;IAC9D,OAAO,GAAG,CAAS,GAAG,MAAM,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAA;AACnE,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,MAAoB,EAAE,GAAW;IACtD,OAAO,GAAG,CAAS,GAAG,MAAM,MAAM,GAAG,EAAE,CAAA;AACzC,CAAC;AAED,4HAA4H;AAC5H,MAAM,UAAU,IAAI,CAAC,MAAoB,EAAE,GAAW;IACpD,OAAO,GAAG,CAAQ,GAAG,MAAM,MAAM,GAAG,EAAE,CAAA;AACxC,CAAC;AAED,4HAA4H;AAC5H,MAAM,UAAU,IAAI,CAAC,MAAoB,EAAE,GAAW;IACpD,OAAO,GAAG,CAAA,GAAG,MAAM,KAAK,GAAG,EAAE,CAAA;AAC/B,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,IAAI,CAAC,MAAoB,EAAE,GAAG,IAAc;IAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAA,GAAG,MAAM,EAAE,CAAA;IAC5C,IAAI,MAAM,GAAQ,GAAG,CAAA,GAAG,MAAM,EAAE,CAAA;IAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,CAAA,GAAG,MAAM,KAAK,GAAG,EAAE,CAAA;IACjC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,QAAQ,CAAC,MAAoB,EAAE,GAAG,IAAc;IAC9D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAQ,GAAG,MAAM,EAAE,CAAA;IACpD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,CAAA;IACpD,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAA;IACvC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,gBAAgB,CAAC,CAAA;IACtD,OAAO,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;AACrC,CAAC"}
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/data/jsonb/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAGlC,MAAM,UAAU,QAAQ,CAAC,MAAoB,EAAE,KAAc;IAC3D,OAAO,GAAG,CAAS,GAAG,MAAM,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAA;AACnE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAoB,EAAE,KAAc;IAC9D,OAAO,GAAG,CAAS,GAAG,MAAM,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAA;AACnE,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,MAAoB,EAAE,GAAW;IACtD,OAAO,GAAG,CAAS,GAAG,MAAM,MAAM,GAAG,EAAE,CAAA;AACzC,CAAC;AAED,4HAA4H;AAC5H,MAAM,UAAU,IAAI,CAAC,MAAoB,EAAE,GAAW;IACpD,OAAO,GAAG,CAAQ,GAAG,MAAM,MAAM,GAAG,EAAE,CAAA;AACxC,CAAC;AAED,4HAA4H;AAC5H,MAAM,UAAU,IAAI,CAAC,MAAoB,EAAE,GAAW;IACpD,OAAO,GAAG,CAAA,GAAG,MAAM,KAAK,GAAG,EAAE,CAAA;AAC/B,CAAC;AAED,yGAAyG;AACzG,MAAM,UAAU,IAAI,CAAC,MAAoB,EAAE,GAAG,IAAc;IAC1D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAA,GAAG,MAAM,EAAE,CAAA;IAC5C,IAAI,MAAM,GAAQ,GAAG,CAAA,GAAG,MAAM,EAAE,CAAA;IAChC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,CAAA,GAAG,MAAM,KAAK,GAAG,EAAE,CAAA;IACjC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,2GAA2G;AAC3G,MAAM,UAAU,QAAQ,CAAC,MAAoB,EAAE,GAAG,IAAc;IAC9D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAQ,GAAG,MAAM,EAAE,CAAA;IACpD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAE,CAAC,CAAA;IACpD,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAE,CAAA;IACvC,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,gBAAgB,CAAC,CAAA;IACtD,OAAO,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAA;AACrC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,KAAK,CAAC,MAAoB,EAAE,KAA8B;IACxE,MAAM,OAAO,GAAY,KAAK,CAAA;IAC9B,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9E,MAAM,IAAI,KAAK,CACb,sDAAsD,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,OAAO,OAAO;YAC7I,kDAAkD;YAClD,8DAA8D,CAC/D,CAAA;IACH,CAAC;IACD,OAAO,GAAG,CAAA,YAAY,MAAM,qBAAqB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAA;AACjF,CAAC"}
|