pipework 0.135.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 +13 -0
- package/REFERENCE.md +37 -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/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/infra/fetch/address.d.ts +7 -0
- package/dist/infra/fetch/address.d.ts.map +1 -0
- package/dist/infra/fetch/address.js +99 -0
- package/dist/infra/fetch/address.js.map +1 -0
- package/dist/infra/fetch/handle.d.ts +60 -0
- package/dist/infra/fetch/handle.d.ts.map +1 -0
- package/dist/infra/fetch/handle.js +239 -0
- package/dist/infra/fetch/handle.js.map +1 -0
- package/dist/infra/fetch/index.d.ts +4 -0
- package/dist/infra/fetch/index.d.ts.map +1 -0
- package/dist/infra/fetch/index.js +3 -0
- package/dist/infra/fetch/index.js.map +1 -0
- package/dist/infra/fetch/namespace.d.ts +31 -0
- package/dist/infra/fetch/namespace.d.ts.map +1 -0
- package/dist/infra/fetch/namespace.js +31 -0
- package/dist/infra/fetch/namespace.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
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
|
+
|
|
12
|
+
## 0.136.0
|
|
13
|
+
|
|
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.
|
|
15
|
+
|
|
3
16
|
## 0.135.0
|
|
4
17
|
|
|
5
18
|
- **Added: a rate-limit window across every caller of a class, and several windows per key** (#641). A limit class takes `total` — counted across all callers of the class, refused like the others with `onRefused` told `limit: 'total'`, `key: '*'` — and `perUser`, `perTenant`, `perAddress` and `total` each take one window or an array of windows with distinct `windowSeconds` (say 10 an hour and 30 a day per address). A request is counted against every window of a key and refused if any is over; each window over gets its own `onRefused` event, and the 429's `Retry-After` is the longest of their waits. Keys are counted perUser, perTenant, perAddress, total in turn, stopping at the first key that refuses, so a caller over its own limit does not spend the total; counting is still after auth. A key with a single window keeps its count row, so existing counts carry over. An empty array, or two windows of the same length in one key, throw at startup.
|
package/REFERENCE.md
CHANGED
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
- [mail — Transactional Email](#mail-transactional-email)
|
|
31
31
|
- [accessLinks — Access Links](#accesslinks-access-links)
|
|
32
32
|
- [credits — Prepaid Usage Credits](#credits-prepaid-usage-credits)
|
|
33
|
+
- [untrustedFetch — Fetch a URL a Stranger Gave](#untrustedfetch-fetch-a-url-a-stranger-gave)
|
|
33
34
|
- [storage — File Storage](#storage-file-storage)
|
|
34
35
|
- [alerts — Operator Alerts](#alerts-operator-alerts)
|
|
35
36
|
- [support — Support Tickets](#support-support-tickets)
|
|
@@ -706,6 +707,16 @@ The system channel — deliberate cross-tenant access for pre-tenant surfaces (a
|
|
|
706
707
|
|
|
707
708
|
Query operators and aggregates — eq, gt, lt, and, or, count, sum, etc.
|
|
708
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
|
+
|
|
709
720
|
### `pipe.aliasedRelation`
|
|
710
721
|
|
|
711
722
|
|
|
@@ -845,6 +856,10 @@ JSONB query operators — typed helpers for PostgreSQL JSONB containment, key ch
|
|
|
845
856
|
|
|
846
857
|
The @> containment operator — tests whether a JSONB column contains the given value.
|
|
847
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
|
+
|
|
848
863
|
### `jsonb.containedBy`
|
|
849
864
|
|
|
850
865
|
The <@ contained-by operator — tests whether a JSONB column is contained by the given value.
|
|
@@ -1438,6 +1453,28 @@ export const stripeWebhook = webhook.defineInbound<StripeEvent>(
|
|
|
1438
1453
|
|
|
1439
1454
|
`sourceRef: event.id` makes Stripe's redelivery of the same event credit once.
|
|
1440
1455
|
|
|
1456
|
+
## untrustedFetch — Fetch a URL a Stranger Gave
|
|
1457
|
+
|
|
1458
|
+
No blueprint key. `untrustedFetch.get(url, options)` fetches one URL with GET and never lets it reach the app's private network. The rules cannot be switched off:
|
|
1459
|
+
|
|
1460
|
+
- Only `http:` and `https:`; anything else is refused as `scheme` before any connection.
|
|
1461
|
+
- The name is resolved, every address is checked, and the connection goes to a checked address. Refused: loopback, private, link-local (cloud metadata), CGNAT, unique-local and site-local IPv6, multicast, reserved and unspecified addresses, IPv4-mapped and NAT64 forms of these, and literal IP URLs in those ranges (`address`).
|
|
1462
|
+
- Redirects up to `maxRedirects`, each hop checked as the first (`redirects`); the app's `headers` go to the first origin only.
|
|
1463
|
+
- Stops the moment the body passes `maxBytes`, whatever Content-Length says (`too_large`); `timeoutMs` covers the whole fetch (`timeout`); a non-2xx answer is `status`.
|
|
1464
|
+
- `accept({ status, contentType, firstBytes })` sees up to 1024 bytes before the body is kept; return false, or your own message string, to refuse (`rejected`).
|
|
1465
|
+
|
|
1466
|
+
`maxBytes`, `timeoutMs` and `maxRedirects` are required. A refusal is returned, not thrown: `{ ok: false, reason, message, status? }`, and the message never contains an address or anything a server sent. Success is `{ ok: true, url, status, contentType, body, bytes }`.
|
|
1467
|
+
|
|
1468
|
+
```typescript
|
|
1469
|
+
const got = await untrustedFetch.get(pasted, { maxBytes: 5_000_000, timeoutMs: 10_000, maxRedirects: 3,
|
|
1470
|
+
accept: h => h.firstBytes[0] === 0x25 || 'That does not look like a PDF.' })
|
|
1471
|
+
if (!got.ok) return tell(got.message)
|
|
1472
|
+
```
|
|
1473
|
+
|
|
1474
|
+
Traced as the step `pipework/fetch:get` (host; the full URL only with `urlIsSafeToTrace: true`) with a child step `pipework/fetch:outcome` (host, status, bytes, reason).
|
|
1475
|
+
|
|
1476
|
+
For tests: `resolve(hostname)` replaces DNS and `connect({ address, port, hostname, protocol })` replaces the socket after the address check passed, so a fake public name can be sent to a local server. The check always runs on what `resolve` returns.
|
|
1477
|
+
|
|
1441
1478
|
## storage — File Storage
|
|
1442
1479
|
|
|
1443
1480
|
Tenant-scoped, content-addressed file storage over S3-compatible object storage (AWS S3, MinIO, R2) or local disk. No AWS SDK: requests are SigV4-signed `fetch` calls. A file is a metadata row (`storage_file`, under forced RLS) pointing at an object keyed `tenants/<tenantId>/sha256/<hex>`. The same bytes stored again by a tenant add a row and no object; tenants never share objects, so one cannot confirm another holds a given file.
|
|
@@ -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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -88,6 +88,8 @@ export type { Support, SupportConfig, TicketApi as SupportTicketApi, Ticket as S
|
|
|
88
88
|
export type { Sink, SinkDelivery } from './infra/outbox/core.js';
|
|
89
89
|
export { storage } from './infra/storage/namespace.js';
|
|
90
90
|
export type { Storage, StorageConfig, StoredFile, PutOptions as StoragePutOptions, FindOptions as StorageFindOptions, SignedUrlOptions as StorageSignedUrlOptions, SweepOptions as StorageSweepOptions, SweepResult as StorageSweepResult, StorageBackend, S3Config, S3Encryption, LocalConfig as StorageLocalConfig } from './infra/storage/index.js';
|
|
91
|
+
export { untrustedFetch } from './infra/fetch/namespace.js';
|
|
92
|
+
export type { UntrustedFetchOptions, UntrustedFetchResult, FetchHead, FetchTarget, FetchRefusal } from './infra/fetch/index.js';
|
|
91
93
|
export { accessLinks } from './infra/access-links/namespace.js';
|
|
92
94
|
export type { AccessLinks, AccessLinksConfig, AccessLink, PublicLink, AccessLinkUse, AccessLinkTarget, AccessLinkListed, AccessLinkPage, AccessLinkCheck, AccessLinkCheckArgs, LinkOptions, ResolveResult, BeginUseResult, CompleteUseResult, AbandonUseResult, PersonCheck, PersonCheckConfig, PersonChallenge, PersonPass } from './infra/access-links/index.js';
|
|
93
95
|
export { surface } from './core/surface/namespace.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,KAAK,eAAe,EAAE,KAAK,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC/G,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAA;AACxE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,iBAAiB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAE5H,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AAC/D,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AACvF,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAKpE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACvC,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAC1E,YAAY,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAA;AAE5F,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,SAAS,EAAE,aAAa,EACxH,cAAc,EAAE,cAAc,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAC9E,oBAAoB,EAAE,aAAa,EAAE,iBAAiB,EACtD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAE/E,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,YAAY,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAC5D,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAE3D,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AACxD,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClO,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAC3G,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAExF,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,cAAc,EAAE,eAAe,EACrE,sBAAsB,EAAE,cAAc,EAAE,eAAe,EAAE,gBAAgB,EAAE,kBAAkB,EAC7F,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAChG,YAAY,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAC9D,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAE5E,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAExE,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AAC/C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC5F,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACzF,YAAY,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AAClF,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAChH,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACzD,YAAY,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACtG,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAC/F,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,kBAAkB,EAChE,mBAAmB,EAAE,eAAe,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAErH,OAAO,EAAE,IAAI,EAAE,MAAM,6BAA6B,CAAA;AAClD,YAAY,EAAE,IAAI,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AAEzF,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AAEjG,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AAC/C,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,kBAAkB,EAAE,KAAK,EACtE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAEpG,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAA;AAClF,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,cAAc,EAClF,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAC7C,YAAY,EAAE,cAAc,EAAE,eAAe,EAAE,qBAAqB,EAAE,kBAAkB,EACtF,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAEnD,OAAO,EAAE,IAAI,EAAE,MAAM,2BAA2B,CAAA;AAChD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACzF,YAAY,EAAE,iBAAiB,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,eAAe,EAAE,SAAS,EAAE,aAAa,EAC/J,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAC/E,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE/D,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,YAAY,EAAE,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAC/G,cAAc,EAAE,cAAc,IAAI,kBAAkB,EAAE,aAAa,IAAI,iBAAiB,EAAE,WAAW,IAAI,eAAe,EACxH,UAAU,IAAI,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,IAAI,aAAa,EAAE,QAAQ,IAAI,YAAY,EAAE,gBAAgB,IAAI,oBAAoB,EAAE,aAAa,IAAI,iBAAiB,EACtL,gBAAgB,EAAE,iBAAiB,IAAI,qBAAqB,EAAE,gBAAgB,IAAI,oBAAoB,EACtG,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAC3D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAE7D,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,iBAAiB,EAAE,gBAAgB,EAC/E,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAE7C,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AACxD,YAAY,EAAE,QAAQ,EAAE,kBAAkB,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,EACpF,gBAAgB,EAAE,iBAAiB,EAAE,UAAU,EAAE,sBAAsB,EACvE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAA;AAE7E,OAAO,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAA;AACvD,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,YAAY,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAEvI,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAE7D,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AAEjD,OAAO,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAA;AACjD,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,YAAY,EACnF,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAC/D,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EACtE,aAAa,EAAE,gBAAgB,EAAE,aAAa,EAC9C,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EACrE,oBAAoB,EAAE,kBAAkB,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAC5F,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EACtE,UAAU,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAEzG,OAAO,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAA;AACxD,YAAY,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EACzE,cAAc,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAE/E,OAAO,EAAE,KAAK,EAAE,MAAM,oCAAoC,CAAA;AAC1D,YAAY,EAAE,kBAAkB,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAClF,YAAY,EAAE,MAAM,gCAAgC,CAAA;AAEtD,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAA;AAC1D,YAAY,EAAE,cAAc,EAAE,uBAAuB,EAAE,qBAAqB,EAC1E,0BAA0B,EAAE,MAAM,6BAA6B,CAAA;AAEjE,OAAO,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAA;AACxD,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAE9E,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AACzD,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EACnE,iBAAiB,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAEpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAA;AAChE,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAEjI,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAA;AACtF,YAAY,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,iBAAiB,EAC1E,qBAAqB,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EACxE,aAAa,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAA;AAE1E,OAAO,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACvD,YAAY,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAClF,YAAY,EAAE,eAAe,EAAE,SAAS,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5G,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,aAAa,EAC5G,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACjG,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAA;AACpD,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,IAAI,iBAAiB,EAAE,WAAW,IAAI,gBAAgB,EACxI,UAAU,IAAI,gBAAgB,EAAE,SAAS,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,eAAe,EAAE,WAAW,EAC/J,cAAc,EAAE,WAAW,EAAE,SAAS,IAAI,cAAc,EAAE,eAAe,EAAE,IAAI,IAAI,SAAS,EAAE,WAAW,EAAE,cAAc,IAAI,mBAAmB,EAChJ,cAAc,IAAI,mBAAmB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAA;AAChH,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC1D,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,IAAI,gBAAgB,EAAE,MAAM,IAAI,aAAa,EAAE,aAAa,IAAI,cAAc,EAC3H,UAAU,IAAI,WAAW,EAAE,YAAY,IAAI,mBAAmB,EAAE,WAAW,IAAI,kBAAkB,EAAE,WAAW,IAAI,kBAAkB,EACpI,QAAQ,IAAI,eAAe,EAAE,UAAU,IAAI,iBAAiB,EAAE,aAAa,IAAI,oBAAoB,EAAE,YAAY,IAAI,mBAAmB,EACxI,gBAAgB,EAAE,mBAAmB,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,IAAI,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AAC9I,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAChE,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,IAAI,iBAAiB,EAAE,WAAW,IAAI,kBAAkB,EAAE,gBAAgB,IAAI,uBAAuB,EAC/J,YAAY,IAAI,mBAAmB,EAAE,WAAW,IAAI,kBAAkB,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAC9G,WAAW,IAAI,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,mCAAmC,CAAA;AAC/D,YAAY,EAAE,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,cAAc,EACrI,eAAe,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAChF,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAEzI,OAAO,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAA;AACrD,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,cAAc,EAAE,UAAU,EAC5F,iBAAiB,EAAE,kBAAkB,EAAE,UAAU,EACjD,mBAAmB,EAAE,QAAQ,EAAE,WAAW,EAAE,mBAAmB,EAAE,aAAa,EAC9E,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAE9C,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,aAAa,EAAE,iBAAiB,EAAE,cAAc,EAAE,qBAAqB,EAC9G,eAAe,EAAE,aAAa,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAA;AAEhK,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AACnD,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,SAAS,EAAE,cAAc,EAC9F,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,YAAY,EAC7E,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEpD,OAAO,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAA;AACjD,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAElH,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAA;AACzD,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAEhE,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAA;AAC1F,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -40,6 +40,7 @@ export { alerts } from './infra/alerts/namespace.js';
|
|
|
40
40
|
export { support } from './infra/support/namespace.js';
|
|
41
41
|
export { DraftStateError } from './infra/support/index.js';
|
|
42
42
|
export { storage } from './infra/storage/namespace.js';
|
|
43
|
+
export { untrustedFetch } from './infra/fetch/namespace.js';
|
|
43
44
|
export { accessLinks } from './infra/access-links/namespace.js';
|
|
44
45
|
export { surface } from './core/surface/namespace.js';
|
|
45
46
|
export { errors } from './core/errors/namespace.js';
|
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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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* True when `address` (IPv4 or IPv6 text, no brackets) is a public address the fetch may connect to.
|
|
3
|
+
* Anything that is not an IP address, and every private, loopback, link-local, CGNAT, unique-local, site-local,
|
|
4
|
+
* multicast, reserved, unspecified, documentation or IPv4-embedded form of those, is not public.
|
|
5
|
+
*/
|
|
6
|
+
export declare function isPublicAddress(address: string): boolean;
|
|
7
|
+
//# sourceMappingURL=address.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../../src/infra/fetch/address.ts"],"names":[],"mappings":"AA8DA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAoBxD"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { isIP } from 'node:net';
|
|
2
|
+
/** IPv4 ranges a stranger's URL may not reach: [first address as uint32, prefix length]. */
|
|
3
|
+
const REFUSED_V4 = [
|
|
4
|
+
[0x00000000, 8], [0x0a000000, 8], [0x64400000, 10], [0x7f000000, 8], [0xa9fe0000, 16],
|
|
5
|
+
[0xac100000, 12], [0xc0000000, 24], [0xc0a80000, 16], [0xc6120000, 15], [0xe0000000, 4], [0xf0000000, 4],
|
|
6
|
+
];
|
|
7
|
+
function parseV4(text) {
|
|
8
|
+
const parts = text.split('.');
|
|
9
|
+
if (parts.length !== 4)
|
|
10
|
+
return null;
|
|
11
|
+
const out = [];
|
|
12
|
+
for (const p of parts) {
|
|
13
|
+
if (!/^\d{1,3}$/.test(p))
|
|
14
|
+
return null;
|
|
15
|
+
const n = Number(p);
|
|
16
|
+
if (n > 255)
|
|
17
|
+
return null;
|
|
18
|
+
out.push(n);
|
|
19
|
+
}
|
|
20
|
+
return out;
|
|
21
|
+
}
|
|
22
|
+
/** The 16 bytes of an IPv6 address (dotted tail and zone id allowed), or null when it is not one. */
|
|
23
|
+
function parseV6(input) {
|
|
24
|
+
let text = input;
|
|
25
|
+
const zone = text.indexOf('%');
|
|
26
|
+
if (zone !== -1)
|
|
27
|
+
text = text.slice(0, zone);
|
|
28
|
+
let tail = [];
|
|
29
|
+
const lastColon = text.lastIndexOf(':');
|
|
30
|
+
if (text.includes('.')) {
|
|
31
|
+
const v4 = parseV4(text.slice(lastColon + 1));
|
|
32
|
+
if (v4 === null)
|
|
33
|
+
return null;
|
|
34
|
+
tail = v4;
|
|
35
|
+
text = text.slice(0, lastColon + 1) + '0:0';
|
|
36
|
+
}
|
|
37
|
+
const halves = text.split('::');
|
|
38
|
+
if (halves.length > 2)
|
|
39
|
+
return null;
|
|
40
|
+
const groups = (s) => (s === '' ? [] : s.split(':'));
|
|
41
|
+
const head = groups(halves[0]);
|
|
42
|
+
const rest = halves.length === 2 ? groups(halves[1]) : [];
|
|
43
|
+
const missing = 8 - head.length - rest.length;
|
|
44
|
+
if (halves.length === 2 ? missing < 1 : missing !== 0)
|
|
45
|
+
return null;
|
|
46
|
+
const all = [...head, ...(halves.length === 2 ? new Array(missing).fill('0') : []), ...rest];
|
|
47
|
+
const bytes = [];
|
|
48
|
+
for (const g of all) {
|
|
49
|
+
if (!/^[0-9a-f]{1,4}$/i.test(g))
|
|
50
|
+
return null;
|
|
51
|
+
const n = parseInt(g, 16);
|
|
52
|
+
bytes.push(n >> 8, n & 0xff);
|
|
53
|
+
}
|
|
54
|
+
if (tail.length === 4)
|
|
55
|
+
bytes.splice(12, 4, ...tail);
|
|
56
|
+
return bytes;
|
|
57
|
+
}
|
|
58
|
+
function v4Refused(b) {
|
|
59
|
+
const n = ((b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]) >>> 0;
|
|
60
|
+
return REFUSED_V4.some(([base, len]) => {
|
|
61
|
+
const mask = len === 0 ? 0 : (0xffffffff << (32 - len)) >>> 0;
|
|
62
|
+
return ((n & mask) >>> 0) === base;
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* True when `address` (IPv4 or IPv6 text, no brackets) is a public address the fetch may connect to.
|
|
67
|
+
* Anything that is not an IP address, and every private, loopback, link-local, CGNAT, unique-local, site-local,
|
|
68
|
+
* multicast, reserved, unspecified, documentation or IPv4-embedded form of those, is not public.
|
|
69
|
+
*/
|
|
70
|
+
export function isPublicAddress(address) {
|
|
71
|
+
const kind = isIP(address);
|
|
72
|
+
if (kind === 4) {
|
|
73
|
+
const b = parseV4(address);
|
|
74
|
+
return b !== null && !v4Refused(b);
|
|
75
|
+
}
|
|
76
|
+
if (kind !== 6)
|
|
77
|
+
return false;
|
|
78
|
+
const b = parseV6(address);
|
|
79
|
+
if (b === null)
|
|
80
|
+
return false;
|
|
81
|
+
const first96Zero = b.slice(0, 12).every(x => x === 0);
|
|
82
|
+
if (first96Zero)
|
|
83
|
+
return false; // ::, ::1 and the deprecated IPv4-compatible block
|
|
84
|
+
const mapped = b.slice(0, 10).every(x => x === 0) && b[10] === 0xff && b[11] === 0xff;
|
|
85
|
+
const nat64 = b[0] === 0 && b[1] === 0x64 && b[2] === 0xff && b[3] === 0x9b && b.slice(4, 12).every(x => x === 0);
|
|
86
|
+
if (mapped || nat64)
|
|
87
|
+
return !v4Refused(b.slice(12, 16));
|
|
88
|
+
const hi = b[0];
|
|
89
|
+
if (hi === 0xff)
|
|
90
|
+
return false; // ff00::/8
|
|
91
|
+
if ((hi & 0xfe) === 0xfc)
|
|
92
|
+
return false; // fc00::/7
|
|
93
|
+
if (hi === 0xfe && (b[1] & 0xc0) >= 0x80)
|
|
94
|
+
return false; // fe80::/10 and fec0::/10
|
|
95
|
+
if (hi === 0x20 && b[1] === 0x01 && b[2] === 0x0d && b[3] === 0xb8)
|
|
96
|
+
return false; // 2001:db8::/32
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.js","sourceRoot":"","sources":["../../../src/infra/fetch/address.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { type Socket } from 'node:net';
|
|
2
|
+
/** What the app is shown of a response before the body is kept. */
|
|
3
|
+
export interface FetchHead {
|
|
4
|
+
status: number;
|
|
5
|
+
contentType: string | null;
|
|
6
|
+
/** The first bytes of the body: up to 1024, fewer when the body is shorter. */
|
|
7
|
+
firstBytes: Uint8Array;
|
|
8
|
+
}
|
|
9
|
+
/** The connection the fetch is about to open, after the address check passed. */
|
|
10
|
+
export interface FetchTarget {
|
|
11
|
+
address: string;
|
|
12
|
+
port: number;
|
|
13
|
+
hostname: string;
|
|
14
|
+
protocol: 'http:' | 'https:';
|
|
15
|
+
}
|
|
16
|
+
/** Options for `untrustedFetch.get`. The three limits are required: the app says. */
|
|
17
|
+
export interface UntrustedFetchOptions {
|
|
18
|
+
/** The most body bytes kept; the fetch stops the moment the total passes it. */
|
|
19
|
+
maxBytes: number;
|
|
20
|
+
/** One time limit for the whole fetch, DNS and redirects included. */
|
|
21
|
+
timeoutMs: number;
|
|
22
|
+
/** The most redirects followed. */
|
|
23
|
+
maxRedirects: number;
|
|
24
|
+
/** Called with the status, content type and first bytes before the rest of the body is kept. Return false, or a message string, to refuse. */
|
|
25
|
+
accept?: (head: FetchHead) => boolean | string;
|
|
26
|
+
/** Headers sent to the first URL's origin only, never to another origin after a redirect. */
|
|
27
|
+
headers?: Record<string, string>;
|
|
28
|
+
/** When true the full URL is recorded in the trace step; otherwise only scheme and host. */
|
|
29
|
+
urlIsSafeToTrace?: boolean;
|
|
30
|
+
/** For tests: replaces DNS. Its answer is still address-checked. */
|
|
31
|
+
resolve?: (hostname: string) => Promise<string[]>;
|
|
32
|
+
/** For tests: replaces the socket, after the address check passed for `target.address`. */
|
|
33
|
+
connect?: (target: FetchTarget) => Socket;
|
|
34
|
+
}
|
|
35
|
+
export type FetchRefusal = 'scheme' | 'address' | 'redirects' | 'too_large' | 'timeout' | 'status' | 'rejected' | 'network';
|
|
36
|
+
/** A fetched body, or the rule that refused. Never thrown. */
|
|
37
|
+
export type UntrustedFetchResult = {
|
|
38
|
+
ok: true;
|
|
39
|
+
url: string;
|
|
40
|
+
status: number;
|
|
41
|
+
contentType: string | null;
|
|
42
|
+
body: Uint8Array;
|
|
43
|
+
bytes: number;
|
|
44
|
+
} | {
|
|
45
|
+
ok: false;
|
|
46
|
+
reason: FetchRefusal;
|
|
47
|
+
message: string;
|
|
48
|
+
status?: number;
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Fetches one URL a stranger gave, with GET: http(s) only, public addresses only (every address the name resolves
|
|
52
|
+
* to is checked and the connection goes to a checked one), redirects up to `maxRedirects` with each hop checked
|
|
53
|
+
* as the first, a byte limit stopped the moment it is passed, one time limit for the whole fetch, and the
|
|
54
|
+
* content type and first bytes shown to `accept` before the body is kept. A refusal is returned with the rule
|
|
55
|
+
* that refused (`reason`) and a plain message that never carries an address or anything the server sent; it is
|
|
56
|
+
* not thrown. Recorded as the trace step `pipework/fetch:get` with a child step `pipework/fetch:outcome`
|
|
57
|
+
* holding host, status, bytes and reason; the full URL only when `urlIsSafeToTrace` is true.
|
|
58
|
+
*/
|
|
59
|
+
export declare function untrustedGet(url: string, options: UntrustedFetchOptions): Promise<UntrustedFetchResult>;
|
|
60
|
+
//# sourceMappingURL=handle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle.d.ts","sourceRoot":"","sources":["../../../src/infra/fetch/handle.ts"],"names":[],"mappings":"AAGA,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,UAAU,CAAA;AAK5C,mEAAmE;AACnE,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,+EAA+E;IAC/E,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,iFAAiF;AACjF,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAA;CAC7B;AAED,qFAAqF;AACrF,MAAM,WAAW,qBAAqB;IACpC,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,SAAS,EAAE,MAAM,CAAA;IACjB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAA;IACpB,8IAA8I;IAC9I,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,OAAO,GAAG,MAAM,CAAA;IAC9C,6FAA6F;IAC7F,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,4FAA4F;IAC5F,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAC1B,oEAAoE;IACpE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACjD,2FAA2F;IAC3F,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM,CAAA;CAC1C;AAED,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAA;AAE3H,8DAA8D;AAC9D,MAAM,MAAM,oBAAoB,GAC5B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACtG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAiNzE;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAUvG"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import { request as httpRequest } from 'node:http';
|
|
2
|
+
import { request as httpsRequest } from 'node:https';
|
|
3
|
+
import { lookup as dnsLookup } from 'node:dns/promises';
|
|
4
|
+
import { isIP } from 'node:net';
|
|
5
|
+
import { connect as tlsConnect } from 'node:tls';
|
|
6
|
+
import { __flowStep } from '../../trace/runtime/flow-step.js';
|
|
7
|
+
import { isPublicAddress } from './address.js';
|
|
8
|
+
const REDIRECTS = new Set([301, 302, 303, 307, 308]);
|
|
9
|
+
const HEAD_BYTES = 1024;
|
|
10
|
+
class Refusal extends Error {
|
|
11
|
+
reason;
|
|
12
|
+
status;
|
|
13
|
+
constructor(reason, message, status) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.reason = reason;
|
|
16
|
+
this.status = status;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
const MESSAGES = {
|
|
20
|
+
scheme: 'Only http and https links can be fetched.',
|
|
21
|
+
address: 'The link points to a private network address.',
|
|
22
|
+
redirects: 'The link redirects too many times.',
|
|
23
|
+
too_large: 'The file is larger than allowed.',
|
|
24
|
+
timeout: 'The server took too long to answer.',
|
|
25
|
+
network: 'The server could not be reached.',
|
|
26
|
+
};
|
|
27
|
+
async function defaultResolve(hostname) {
|
|
28
|
+
return (await dnsLookup(hostname, { all: true, verbatim: true })).map(a => a.address);
|
|
29
|
+
}
|
|
30
|
+
function bareHost(url) {
|
|
31
|
+
return url.hostname.startsWith('[') ? url.hostname.slice(1, -1) : url.hostname;
|
|
32
|
+
}
|
|
33
|
+
async function fetchOnce(run, url, options, headers) {
|
|
34
|
+
const hostname = bareHost(url);
|
|
35
|
+
const protocol = url.protocol;
|
|
36
|
+
let addresses;
|
|
37
|
+
if (isIP(hostname) !== 0) {
|
|
38
|
+
addresses = [hostname];
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
try {
|
|
42
|
+
addresses = await (options.resolve ?? defaultResolve)(hostname);
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
throw new Refusal('network', MESSAGES.network);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (run.aborted)
|
|
49
|
+
throw new Refusal('timeout', MESSAGES.timeout);
|
|
50
|
+
if (addresses.length === 0)
|
|
51
|
+
throw new Refusal('network', MESSAGES.network);
|
|
52
|
+
if (!addresses.every(isPublicAddress))
|
|
53
|
+
throw new Refusal('address', MESSAGES.address);
|
|
54
|
+
const address = addresses[0];
|
|
55
|
+
const port = url.port === '' ? (protocol === 'https:' ? 443 : 80) : Number(url.port);
|
|
56
|
+
const base = {
|
|
57
|
+
method: 'GET', hostname, port, path: url.pathname + url.search,
|
|
58
|
+
headers: { 'accept-encoding': 'identity', ...headers, host: url.host },
|
|
59
|
+
};
|
|
60
|
+
const doRequest = protocol === 'https:' ? httpsRequest : httpRequest;
|
|
61
|
+
const req = options.connect !== undefined
|
|
62
|
+
? doRequest({
|
|
63
|
+
...base, agent: undefined,
|
|
64
|
+
createConnection: () => {
|
|
65
|
+
const socket = options.connect({ address, port, hostname, protocol });
|
|
66
|
+
return protocol === 'https:' ? tlsConnect({ socket, ...(isIP(hostname) === 0 ? { servername: hostname } : {}) }) : socket;
|
|
67
|
+
},
|
|
68
|
+
})
|
|
69
|
+
: doRequest({
|
|
70
|
+
...base, agent: false,
|
|
71
|
+
lookup: (_h, opts, cb) => {
|
|
72
|
+
const entry = { address, family: isIP(address) };
|
|
73
|
+
if (opts.all === true)
|
|
74
|
+
cb(null, [entry]);
|
|
75
|
+
else
|
|
76
|
+
cb(null, address, entry.family);
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
run.current = req;
|
|
80
|
+
return await new Promise((resolve, reject) => {
|
|
81
|
+
req.on('error', () => { reject(run.aborted ? new Refusal('timeout', MESSAGES.timeout) : new Refusal('network', MESSAGES.network)); });
|
|
82
|
+
req.on('response', res => {
|
|
83
|
+
const status = res.statusCode ?? 0;
|
|
84
|
+
const location = res.headers['location'];
|
|
85
|
+
if (REDIRECTS.has(status) && typeof location === 'string') {
|
|
86
|
+
res.destroy();
|
|
87
|
+
req.destroy();
|
|
88
|
+
resolve({ redirect: location });
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
resolve({ final: res, req });
|
|
92
|
+
});
|
|
93
|
+
req.end();
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async function readBody(res, req, options, run) {
|
|
97
|
+
const status = res.statusCode ?? 0;
|
|
98
|
+
const rawType = res.headers['content-type'];
|
|
99
|
+
const contentType = typeof rawType === 'string' ? rawType : null;
|
|
100
|
+
const stop = (refusal) => { req.destroy(); res.destroy(); throw refusal; };
|
|
101
|
+
if (status < 200 || status > 299)
|
|
102
|
+
return stop(new Refusal('status', `The server answered with HTTP status ${status}.`, status));
|
|
103
|
+
const declared = Number(res.headers['content-length']);
|
|
104
|
+
if (Number.isFinite(declared) && declared > options.maxBytes)
|
|
105
|
+
return stop(new Refusal('too_large', MESSAGES.too_large));
|
|
106
|
+
return await new Promise((resolve, reject) => {
|
|
107
|
+
const chunks = [];
|
|
108
|
+
let total = 0;
|
|
109
|
+
let accepted = options.accept === undefined;
|
|
110
|
+
const fail = (r) => { reject(r); req.destroy(); res.destroy(); };
|
|
111
|
+
const runAccept = () => {
|
|
112
|
+
accepted = true;
|
|
113
|
+
const first = Buffer.concat(chunks).subarray(0, HEAD_BYTES);
|
|
114
|
+
let verdict;
|
|
115
|
+
try {
|
|
116
|
+
verdict = options.accept({ status, contentType, firstBytes: new Uint8Array(first) });
|
|
117
|
+
}
|
|
118
|
+
catch (err) {
|
|
119
|
+
reject(err);
|
|
120
|
+
req.destroy();
|
|
121
|
+
res.destroy();
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
if (verdict === true)
|
|
125
|
+
return true;
|
|
126
|
+
fail(new Refusal('rejected', typeof verdict === 'string' ? verdict : 'The file was not accepted.'));
|
|
127
|
+
return false;
|
|
128
|
+
};
|
|
129
|
+
res.on('data', (chunk) => {
|
|
130
|
+
total += chunk.length;
|
|
131
|
+
if (total > options.maxBytes) {
|
|
132
|
+
fail(new Refusal('too_large', MESSAGES.too_large));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
chunks.push(chunk);
|
|
136
|
+
if (!accepted && total >= HEAD_BYTES)
|
|
137
|
+
runAccept();
|
|
138
|
+
});
|
|
139
|
+
res.on('end', () => {
|
|
140
|
+
if (!accepted && !runAccept())
|
|
141
|
+
return;
|
|
142
|
+
resolve({ body: new Uint8Array(Buffer.concat(chunks)), contentType });
|
|
143
|
+
});
|
|
144
|
+
const broken = () => reject(run.aborted ? new Refusal('timeout', MESSAGES.timeout) : new Refusal('network', MESSAGES.network));
|
|
145
|
+
res.on('error', broken);
|
|
146
|
+
res.on('aborted', broken);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
async function runFetch(run, rawUrl, options) {
|
|
150
|
+
let url;
|
|
151
|
+
try {
|
|
152
|
+
url = new URL(rawUrl);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
throw new Refusal('scheme', MESSAGES.scheme);
|
|
156
|
+
}
|
|
157
|
+
if (url.protocol !== 'http:' && url.protocol !== 'https:')
|
|
158
|
+
throw new Refusal('scheme', MESSAGES.scheme);
|
|
159
|
+
const firstOrigin = url.origin;
|
|
160
|
+
for (let hops = 0;; hops++) {
|
|
161
|
+
const headers = url.origin === firstOrigin ? (options.headers ?? {}) : {};
|
|
162
|
+
const step = await fetchOnce(run, url, options, headers);
|
|
163
|
+
if ('final' in step) {
|
|
164
|
+
const status = step.final.statusCode ?? 0;
|
|
165
|
+
const { body, contentType } = await readBody(step.final, step.req, options, run);
|
|
166
|
+
return { ok: true, url: url.href, status, contentType, body, bytes: body.length };
|
|
167
|
+
}
|
|
168
|
+
if (hops >= options.maxRedirects)
|
|
169
|
+
throw new Refusal('redirects', MESSAGES.redirects);
|
|
170
|
+
let next;
|
|
171
|
+
try {
|
|
172
|
+
next = new URL(step.redirect, url);
|
|
173
|
+
}
|
|
174
|
+
catch {
|
|
175
|
+
throw new Refusal('scheme', MESSAGES.scheme);
|
|
176
|
+
}
|
|
177
|
+
if (next.protocol !== 'http:' && next.protocol !== 'https:')
|
|
178
|
+
throw new Refusal('scheme', MESSAGES.scheme);
|
|
179
|
+
url = next;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/** Records the outcome as the captured input of a child step: a step's own capture is limited to its arguments. */
|
|
183
|
+
const recordOutcome = __flowStep({ ref: 'pipework/fetch:outcome', capture: [null] }, (o) => o);
|
|
184
|
+
/** Fail-closed projection: the raw URL and options are never captured. */
|
|
185
|
+
const DROP = () => undefined;
|
|
186
|
+
const tracedGet = __flowStep({ ref: 'pipework/fetch:get', capture: [null, DROP, DROP] }, async (info, rawUrl, options) => {
|
|
187
|
+
const run = { aborted: false, current: null };
|
|
188
|
+
let timer;
|
|
189
|
+
const timedOut = new Promise((_, reject) => {
|
|
190
|
+
timer = setTimeout(() => {
|
|
191
|
+
run.aborted = true;
|
|
192
|
+
run.current?.destroy();
|
|
193
|
+
reject(new Refusal('timeout', MESSAGES.timeout));
|
|
194
|
+
}, options.timeoutMs);
|
|
195
|
+
});
|
|
196
|
+
let result;
|
|
197
|
+
try {
|
|
198
|
+
const work = runFetch(run, rawUrl, options);
|
|
199
|
+
work.catch(() => undefined);
|
|
200
|
+
result = await Promise.race([work, timedOut]);
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
if (!(err instanceof Refusal))
|
|
204
|
+
throw err;
|
|
205
|
+
result = { ok: false, reason: err.reason, message: err.message, ...(err.status !== undefined ? { status: err.status } : {}) };
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
clearTimeout(timer);
|
|
209
|
+
}
|
|
210
|
+
recordOutcome({
|
|
211
|
+
host: info.host,
|
|
212
|
+
status: result.ok ? result.status : (result.status ?? null),
|
|
213
|
+
bytes: result.ok ? result.bytes : null,
|
|
214
|
+
reason: result.ok ? null : result.reason,
|
|
215
|
+
});
|
|
216
|
+
return result;
|
|
217
|
+
});
|
|
218
|
+
/**
|
|
219
|
+
* Fetches one URL a stranger gave, with GET: http(s) only, public addresses only (every address the name resolves
|
|
220
|
+
* to is checked and the connection goes to a checked one), redirects up to `maxRedirects` with each hop checked
|
|
221
|
+
* as the first, a byte limit stopped the moment it is passed, one time limit for the whole fetch, and the
|
|
222
|
+
* content type and first bytes shown to `accept` before the body is kept. A refusal is returned with the rule
|
|
223
|
+
* that refused (`reason`) and a plain message that never carries an address or anything the server sent; it is
|
|
224
|
+
* not thrown. Recorded as the trace step `pipework/fetch:get` with a child step `pipework/fetch:outcome`
|
|
225
|
+
* holding host, status, bytes and reason; the full URL only when `urlIsSafeToTrace` is true.
|
|
226
|
+
*/
|
|
227
|
+
export function untrustedGet(url, options) {
|
|
228
|
+
let host = null;
|
|
229
|
+
try {
|
|
230
|
+
const parsed = new URL(url);
|
|
231
|
+
host = parsed.host;
|
|
232
|
+
}
|
|
233
|
+
catch { /* the fetch refuses it as scheme */ }
|
|
234
|
+
const info = options.urlIsSafeToTrace === true
|
|
235
|
+
? { host, url }
|
|
236
|
+
: { host };
|
|
237
|
+
return tracedGet(info, url, options);
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=handle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handle.js","sourceRoot":"","sources":["../../../src/infra/fetch/handle.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/infra/fetch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAC9C,YAAY,EACV,qBAAqB,EAAE,oBAAoB,EAAE,SAAS,EAAE,WAAW,EAAE,YAAY,GAClF,MAAM,aAAa,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/infra/fetch/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { untrustedGet } from './handle.js';
|
|
2
|
+
/** Untrusted fetch — fetch one URL a stranger gave without letting them reach the app's private network. */
|
|
3
|
+
export declare const untrustedFetch: {
|
|
4
|
+
/**
|
|
5
|
+
* Fetches `url` with GET and returns `{ ok: true, url, status, contentType, body, bytes }`, or `{ ok: false, reason, message }`
|
|
6
|
+
* naming the rule that refused: `scheme`, `address`, `redirects`, `too_large`, `timeout`, `status`, `rejected` or `network`.
|
|
7
|
+
* It does not throw for these.
|
|
8
|
+
*
|
|
9
|
+
* Rules, none of which can be switched off: only `http:` and `https:`; the name is resolved and every address is checked
|
|
10
|
+
* (loopback, private, link-local including cloud metadata, CGNAT, unique-local and site-local IPv6, multicast, reserved,
|
|
11
|
+
* unspecified, and IPv4-mapped or NAT64 forms of these; literal IP URLs likewise) and the connection goes to a checked
|
|
12
|
+
* address; redirects are followed up to `maxRedirects` and each hop is checked as the first, and the app's `headers` go only to the first origin;
|
|
13
|
+
* the body is stopped the moment it passes `maxBytes`, whatever Content-Length says; `timeoutMs` covers the whole fetch.
|
|
14
|
+
* `accept({ status, contentType, firstBytes })` sees the first 1024 bytes before the body is kept: return false, or a string
|
|
15
|
+
* (your own message), to refuse with `rejected`. Messages never contain an address or anything a server sent.
|
|
16
|
+
*
|
|
17
|
+
* `resolve` and `connect` are for tests: `resolve(hostname)` replaces DNS and `connect(target)` replaces the socket after the
|
|
18
|
+
* address check passed, so a test sends a fake public address to a local server. The address check always runs on what `resolve` returns.
|
|
19
|
+
*
|
|
20
|
+
* The call is the trace step `pipework/fetch:get`; its child `pipework/fetch:outcome` carries host, status, bytes and reason.
|
|
21
|
+
* The full URL is recorded only when `urlIsSafeToTrace` is true; otherwise only the host.
|
|
22
|
+
*
|
|
23
|
+
* ```ts
|
|
24
|
+
* const got = await untrustedFetch.get(pasted, { maxBytes: 5_000_000, timeoutMs: 10_000, maxRedirects: 3,
|
|
25
|
+
* accept: h => h.firstBytes[0] === 0x25 || 'That does not look like a PDF.' })
|
|
26
|
+
* if (!got.ok) return tell(got.message)
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
readonly get: typeof untrustedGet;
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=namespace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespace.d.ts","sourceRoot":"","sources":["../../../src/infra/fetch/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,4GAA4G;AAC5G,eAAO,MAAM,cAAc;IACzB;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;;CAEK,CAAA"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { untrustedGet } from './handle.js';
|
|
2
|
+
/** Untrusted fetch — fetch one URL a stranger gave without letting them reach the app's private network. */
|
|
3
|
+
export const untrustedFetch = {
|
|
4
|
+
/**
|
|
5
|
+
* Fetches `url` with GET and returns `{ ok: true, url, status, contentType, body, bytes }`, or `{ ok: false, reason, message }`
|
|
6
|
+
* naming the rule that refused: `scheme`, `address`, `redirects`, `too_large`, `timeout`, `status`, `rejected` or `network`.
|
|
7
|
+
* It does not throw for these.
|
|
8
|
+
*
|
|
9
|
+
* Rules, none of which can be switched off: only `http:` and `https:`; the name is resolved and every address is checked
|
|
10
|
+
* (loopback, private, link-local including cloud metadata, CGNAT, unique-local and site-local IPv6, multicast, reserved,
|
|
11
|
+
* unspecified, and IPv4-mapped or NAT64 forms of these; literal IP URLs likewise) and the connection goes to a checked
|
|
12
|
+
* address; redirects are followed up to `maxRedirects` and each hop is checked as the first, and the app's `headers` go only to the first origin;
|
|
13
|
+
* the body is stopped the moment it passes `maxBytes`, whatever Content-Length says; `timeoutMs` covers the whole fetch.
|
|
14
|
+
* `accept({ status, contentType, firstBytes })` sees the first 1024 bytes before the body is kept: return false, or a string
|
|
15
|
+
* (your own message), to refuse with `rejected`. Messages never contain an address or anything a server sent.
|
|
16
|
+
*
|
|
17
|
+
* `resolve` and `connect` are for tests: `resolve(hostname)` replaces DNS and `connect(target)` replaces the socket after the
|
|
18
|
+
* address check passed, so a test sends a fake public address to a local server. The address check always runs on what `resolve` returns.
|
|
19
|
+
*
|
|
20
|
+
* The call is the trace step `pipework/fetch:get`; its child `pipework/fetch:outcome` carries host, status, bytes and reason.
|
|
21
|
+
* The full URL is recorded only when `urlIsSafeToTrace` is true; otherwise only the host.
|
|
22
|
+
*
|
|
23
|
+
* ```ts
|
|
24
|
+
* const got = await untrustedFetch.get(pasted, { maxBytes: 5_000_000, timeoutMs: 10_000, maxRedirects: 3,
|
|
25
|
+
* accept: h => h.firstBytes[0] === 0x25 || 'That does not look like a PDF.' })
|
|
26
|
+
* if (!got.ok) return tell(got.message)
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
get: untrustedGet,
|
|
30
|
+
};
|
|
31
|
+
//# sourceMappingURL=namespace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"namespace.js","sourceRoot":"","sources":["../../../src/infra/fetch/namespace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,4GAA4G;AAC5G,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B;;;;;;;;;;;;;;;;;;;;;;;;OAwBG;IACH,GAAG,EAAE,YAAY;CACT,CAAA"}
|