@shivaedev/errors 0.4.1 → 0.5.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 +19 -0
- package/README.md +3 -1
- package/dist/redactBrowserText.d.ts +3 -0
- package/dist/redactBrowserText.d.ts.map +1 -0
- package/dist/redactBrowserText.js +6 -0
- package/dist/redactBrowserText.js.map +1 -0
- package/dist/rpcBoundaryHandlers.d.ts +1 -1
- package/dist/rpcBoundaryHandlers.d.ts.map +1 -1
- package/dist/rpcBoundaryHandlers.js +12 -4
- package/dist/rpcBoundaryHandlers.js.map +1 -1
- package/dist/schemaFieldScope.d.ts.map +1 -1
- package/dist/schemaFieldScope.js +24 -13
- package/dist/schemaFieldScope.js.map +1 -1
- package/dist/sensitive.d.ts.map +1 -1
- package/dist/sensitive.js +4 -2
- package/dist/sensitive.js.map +1 -1
- package/dist/taxonomy.d.ts +3 -1
- package/dist/taxonomy.d.ts.map +1 -1
- package/dist/taxonomy.js +5 -1
- package/dist/taxonomy.js.map +1 -1
- package/package.json +3 -4
- package/src/redactBrowserText.ts +6 -0
- package/src/rpcBoundaryHandlers.ts +16 -9
- package/src/schemaFieldScope.ts +29 -13
- package/src/sensitive.ts +5 -2
- package/src/taxonomy.ts +5 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.0 - 2026-11-02
|
|
4
|
+
|
|
5
|
+
### Added
|
|
6
|
+
|
|
7
|
+
- Add `redactBrowserText` to mask quoted browser literals, including escaped quotes and multiline content, while preserving diagnostic shape and the existing server text policy.
|
|
8
|
+
- Add opt-in `browserErrors` settings for an Error log per report, signed-in `user.id` attribution and session enforcement. The starter enables all three.
|
|
9
|
+
- `@shivaedev/errors`' shared `TooManyRequests` accepts optional `key` and `retryAt` fields, preserving rate-limit details across RPC while still accepting message-only failures.
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Mask browser report messages and stacks before they reach diagnostic sinks and record reports at Error severity.
|
|
14
|
+
- Reject sensitivity conflicts through public encoded field names when registering an RPC's diagnostic policy.
|
|
15
|
+
- Map throws during RPC handler construction through the group boundary for unary and streaming handlers, including native RPC wrappers.
|
|
16
|
+
- Redact complete single- and double-quoted credential assignments, including spaces, escaped quotes and multiline values, while preserving surrounding public text.
|
|
17
|
+
|
|
18
|
+
### Breaking
|
|
19
|
+
|
|
20
|
+
- `@shivaedev/rate-limit` now fails with the shared `TooManyRequests`. Replace imports from `@shivaedev/rate-limit/TooManyRequests.ts` with `@shivaedev/errors/taxonomy.ts` and add `@shivaedev/errors` as a dependency. Use that shared schema in contract rejections and custom stores. Its `key` and `retryAt` fields are optional because other callers can create message-only failures; check for their presence before using them. The limiter continues to supply both fields. The old module is removed without an alias.
|
|
21
|
+
|
|
3
22
|
## 0.4.1 - 2026-11-01
|
|
4
23
|
|
|
5
24
|
### Fixed
|
package/README.md
CHANGED
|
@@ -23,7 +23,7 @@ There are two kinds of failure. Expected failures are part of an operation's con
|
|
|
23
23
|
|
|
24
24
|
### Expected failures
|
|
25
25
|
|
|
26
|
-
`taxonomy.ts` exports `NotFound`, `Unauthorized`, `Forbidden`, `BadRequest`, `Conflict`, `PreconditionFailed`, `TooManyRequests`, `AuthUnavailable`, `InternalServerError` and `ServiceUnavailable`. Each class is a Schema tagged error with a string `message`; `BadRequest` and `Conflict` also accept an optional string `field`. Declare only the failures an operation can return:
|
|
26
|
+
`taxonomy.ts` exports `NotFound`, `Unauthorized`, `Forbidden`, `BadRequest`, `Conflict`, `PreconditionFailed`, `TooManyRequests`, `AuthUnavailable`, `InternalServerError` and `ServiceUnavailable`. Each class is a Schema tagged error with a string `message`; `BadRequest` and `Conflict` also accept an optional string `field`. `TooManyRequests` accepts an optional string `key` and numeric `retryAt` (Unix epoch milliseconds), supplied by the rate-limit stores. Declare only the failures an operation can return:
|
|
27
27
|
|
|
28
28
|
```ts
|
|
29
29
|
import { Schema } from "effect";
|
|
@@ -88,6 +88,8 @@ The group supplies payload and result types. Each RPC must declare the boundary'
|
|
|
88
88
|
|
|
89
89
|
`sensitive.ts` decides which names are secret. `isSensitiveKey(key)` matches credential-shaped names whatever their casing or separator, such as `sessionId`, `bearerToken`, `access_key_id` or `cardNumber`, and database diagnostic keys `db.user`, `db.user.name` and `db.connection_string`. A `SensitiveKey` is any `(key: string) => boolean`, so an application can widen the policy with its own names. `redactText(text, sensitive, maxLength?, key?)` masks credential-shaped text and `key=value` assignments inside a string, URL user information, query values and fragments, and cuts it at 2,048 characters by default; passing `Infinity` keeps complete public text. The optional `key` supplies context for standalone URL components such as `url.query`. `redactUrl(value, key?)` from `sensitive.ts` applies just the URL rules, including nested JSON strings. Masked values become `REDACTED`, the string `<redacted>`.
|
|
90
90
|
|
|
91
|
+
`redactBrowserText(text, sensitive?)` from `redactBrowserText.ts` additionally masks single-quoted, double-quoted and backtick literals in browser diagnostics, including escaped quotes and multiline content, before applying the text policy. It preserves quote delimiters and text outside literals. Use it for browser messages and stacks that can quote user input; server-side `redactText` keeps its existing scope.
|
|
92
|
+
|
|
91
93
|
Schema diagnostics receive additional masking: `redactText` masks rejected values after `got` or `Expected …, actual …`, before URL masking and truncation. Expected types and schema paths remain readable. Structured redaction also masks the native Schema issue tree's reported `input` values, so those values do not reappear in error reports.
|
|
92
94
|
|
|
93
95
|
`redact.ts` applies that policy to structured values. `redact(value, sensitive?)` masks values under sensitive keys and credential text inside strings, summarises large collections and binary data, and stops cyclic payloads at a depth limit; use it for diagnostics. `redactRecord(values, sensitive?)` masks every top-level record entry without limiting the number of keys, while applying diagnostic limits within each value. `redactWire(value, sensitive?)` applies the same masking without summaries or truncation; use it for failure data sent to a client.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redactBrowserText.d.ts","sourceRoot":"","sources":["../src/redactBrowserText.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwC,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAExF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,GAAE,YAA6B,GAAG,MAAM,CAGhG"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { isSensitiveKey, REDACTED, redactText } from "#sensitive.ts";
|
|
2
|
+
export function redactBrowserText(text, sensitive = isSensitiveKey) {
|
|
3
|
+
const masked = text.replaceAll(/(?<quote>["`]|(?<![\p{L}\p{N}_])')(?:\\[\s\S]|(?!\k<quote>)[^\\])*\k<quote>/gu, `$<quote>${REDACTED}$<quote>`);
|
|
4
|
+
return redactText(masked, sensitive);
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=redactBrowserText.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redactBrowserText.js","sourceRoot":"","sources":["../src/redactBrowserText.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAqB,MAAM,eAAe,CAAC;AAExF,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,SAAS,GAAiB,cAAc;IACvF,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,+EAA+E,EAAE,WAAW,QAAQ,UAAU,CAAC,CAAC;IAC/I,OAAO,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Effect, Stream } from "effect";
|
|
2
|
-
import { Rpc, type RpcGroup,
|
|
2
|
+
import { Rpc, type RpcGroup, RpcSchema } from "effect/rpc";
|
|
3
3
|
type Handlers<R extends Rpc.Any> = {
|
|
4
4
|
readonly [TRpc in R as TRpc["_tag"]]: (...args: Parameters<Rpc.ToHandlerFn<TRpc>>) => Rpc.WrapperOr<TRpc extends {
|
|
5
5
|
readonly successSchema: RpcSchema.Stream<infer TSuccess, infer _E>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpcBoundaryHandlers.d.ts","sourceRoot":"","sources":["../src/rpcBoundaryHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"rpcBoundaryHandlers.d.ts","sourceRoot":"","sources":["../src/rpcBoundaryHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,GAAG,EAAE,KAAK,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAG3D,KAAK,QAAQ,CAAC,CAAC,SAAS,GAAG,CAAC,GAAG,IAAI;IAClC,QAAQ,EAAE,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CACrC,GAAG,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KACtC,GAAG,CAAC,SAAS,CACjB,IAAI,SAAS;QAAE,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC,MAAM,CAAC,MAAM,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAA;KAAE,GAChF,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,GACjD,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CACrD;CACD,CAAC;AAEF,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,IAChB,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,GAChD,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACtB,CAAC,SAAS,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,GAClD,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GACtB,CAAC,SAAS,GAAG,CAAC,OAAO,CAAC,MAAM,MAAM,CAAC,GAClC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAC/B,KAAK,CAAC;AAEZ,KAAK,eAAe,CAAC,SAAS,EAAE,CAAC,IAAI;IACpC,QAAQ,EAAE,IAAI,IAAI,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,KAAK,KAAK,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,KAAK;CACnJ,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,CAAC,EAAE,SAAS,SAAS,QAAQ,CAAC,KAAK,CAAC,EAC9F,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,EAC/B,QAAQ,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACvF,QAAQ,EAAE,SAAS,GACjB,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC"}
|
|
@@ -1,9 +1,17 @@
|
|
|
1
|
-
import { Effect, Stream } from "effect";
|
|
2
|
-
import { Rpc } from "effect/rpc";
|
|
3
|
-
export function rpcBoundaryHandlers(
|
|
1
|
+
import { Effect, Result, Stream } from "effect";
|
|
2
|
+
import { Rpc, RpcSchema } from "effect/rpc";
|
|
3
|
+
export function rpcBoundaryHandlers(group, boundary, handlers) {
|
|
4
4
|
return Object.fromEntries(Object.entries(handlers).map(([tag, handler]) => [
|
|
5
5
|
tag,
|
|
6
|
-
(...args) =>
|
|
6
|
+
(...args) => {
|
|
7
|
+
const constructed = Result.try(() => handler(...args));
|
|
8
|
+
if (Result.isFailure(constructed)) {
|
|
9
|
+
const failure = boundary(Effect.die(constructed.failure));
|
|
10
|
+
const rpc = group.requests.get(tag);
|
|
11
|
+
return Rpc.isRpc(rpc) && RpcSchema.isStreamSchema(rpc.successSchema) ? Stream.fromEffect(failure) : failure;
|
|
12
|
+
}
|
|
13
|
+
return Rpc.wrapMap(constructed.success, (result) => Effect.isEffect(result) ? boundary(result) : Stream.catchCause(result, (cause) => Stream.fromEffect(boundary(Effect.failCause(cause)))));
|
|
14
|
+
},
|
|
7
15
|
]));
|
|
8
16
|
}
|
|
9
17
|
//# sourceMappingURL=rpcBoundaryHandlers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpcBoundaryHandlers.js","sourceRoot":"","sources":["../src/rpcBoundaryHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"rpcBoundaryHandlers.js","sourceRoot":"","sources":["../src/rpcBoundaryHandlers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,GAAG,EAAiB,SAAS,EAAE,MAAM,YAAY,CAAC;AA+B3D,MAAM,UAAU,mBAAmB,CAClC,KAAiC,EACjC,QAA6F,EAC7F,QAAsF;IAEtF,OAAO,MAAM,CAAC,WAAW,CACxB,MAAM,CAAC,OAAO,CAAqD,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;QACpG,GAAG;QACH,CAAC,GAAG,IAAa,EAAE,EAAE;YACpB,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YACvD,IAAI,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;gBACnC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;gBAC1D,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACpC,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC7G,CAAC;YACD,OAAO,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,CAClD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CACvI,CAAC;QACH,CAAC;KACD,CAAC,CACF,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemaFieldScope.d.ts","sourceRoot":"","sources":["../src/schemaFieldScope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAIxD,wBAAgB,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,eAe3E;;;;;;;
|
|
1
|
+
{"version":3,"file":"schemaFieldScope.d.ts","sourceRoot":"","sources":["../src/schemaFieldScope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,SAAS,EAAE,MAAM,QAAQ,CAAC;AAIxD,wBAAgB,eAAe,CAAC,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,eAe3E;;;;;;;AAyED,qBAAa,sBAAuB,SAAQ,2BAK1C;CAAG;AAEL,eAAO,MAAM,kBAAkB;kBACI,SAAS,CAAC,GAAG;mBAAiB,MAAM;yFAmBrE,CAAC"}
|
package/dist/schemaFieldScope.js
CHANGED
|
@@ -19,44 +19,55 @@ export function schemaFieldKeys(ast, extra) {
|
|
|
19
19
|
}
|
|
20
20
|
function fieldsOf(ast, schema, extra, candidates) {
|
|
21
21
|
const fields = [];
|
|
22
|
-
function visitIndex(index, path, hidden, seen) {
|
|
22
|
+
function visitIndex(index, path, hidden, seen, encoded) {
|
|
23
23
|
const accepts = Schema.is(Schema.make(index.parameter));
|
|
24
24
|
for (const key of candidates) {
|
|
25
25
|
if (accepts(key)) {
|
|
26
|
-
fields.push({ key, path: `${path}[${key}]`, sensitive: hidden || extra.includes(key) || isSensitiveKey(key) });
|
|
26
|
+
fields.push({ key, path: `${path}[${key}]`, sensitive: hidden || encoded.has(key) || extra.includes(key) || isSensitiveKey(key) });
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
|
-
visit(index.type, `${path}[value]`, hidden, seen);
|
|
29
|
+
visit(index.type, `${path}[value]`, hidden, seen, encoded);
|
|
30
30
|
}
|
|
31
|
-
function visitObject(node, path, hidden, seen) {
|
|
31
|
+
function visitObject(node, path, hidden, seen, encoded) {
|
|
32
32
|
for (const property of node.propertySignatures) {
|
|
33
33
|
if (typeof property.name !== "string") {
|
|
34
34
|
continue;
|
|
35
35
|
}
|
|
36
|
-
const sensitive = hidden
|
|
36
|
+
const sensitive = hidden
|
|
37
|
+
|| encoded.has(property.name)
|
|
38
|
+
|| extra.includes(property.name)
|
|
39
|
+
|| isSensitiveKey(property.name)
|
|
40
|
+
|| maskedValue(property.type, schemaFieldKeys(property.type, []));
|
|
37
41
|
const fieldPath = `${path}.${property.name}`;
|
|
38
42
|
fields.push({ key: property.name, path: fieldPath, sensitive });
|
|
39
|
-
visit(property.type, fieldPath, sensitive, seen);
|
|
43
|
+
visit(property.type, fieldPath, sensitive, seen, encoded);
|
|
40
44
|
}
|
|
41
45
|
for (const index of node.indexSignatures) {
|
|
42
|
-
visitIndex(index, path, hidden, seen);
|
|
46
|
+
visitIndex(index, path, hidden, seen, encoded);
|
|
43
47
|
}
|
|
44
48
|
}
|
|
45
|
-
function visit(node, path, hidden, ancestors) {
|
|
49
|
+
function visit(node, path, hidden, ancestors, encoded) {
|
|
46
50
|
if (ancestors.has(node)) {
|
|
47
51
|
return;
|
|
48
52
|
}
|
|
49
53
|
const seen = new Set(ancestors).add(node);
|
|
50
54
|
const masked = hidden || marked(node);
|
|
51
55
|
if (node._tag === "Objects") {
|
|
52
|
-
visitObject(node, path, masked, seen);
|
|
53
|
-
|
|
56
|
+
visitObject(node, path, masked, seen, encoded);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
for (const [index, child] of children(node).entries()) {
|
|
60
|
+
visit(child, `${path}[${index}]`, masked, seen, encoded);
|
|
61
|
+
}
|
|
54
62
|
}
|
|
55
|
-
|
|
56
|
-
|
|
63
|
+
if (node.encoding !== undefined) {
|
|
64
|
+
const keys = new Set([...encoded, ...schemaFieldKeys(node, [])]);
|
|
65
|
+
for (const link of node.encoding) {
|
|
66
|
+
visit(link.to, `${path}.encoded`, masked, seen, keys);
|
|
67
|
+
}
|
|
57
68
|
}
|
|
58
69
|
}
|
|
59
|
-
visit(ast, schema, false, new Set());
|
|
70
|
+
visit(ast, schema, false, new Set(), new Set());
|
|
60
71
|
for (const key of schemaFieldKeys(ast, [])) {
|
|
61
72
|
if (!fields.some((field) => field.key === key && field.sensitive)) {
|
|
62
73
|
fields.push({ key, path: `${schema}.encoded.${key}`, sensitive: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemaFieldScope.js","sourceRoot":"","sources":["../src/schemaFieldScope.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAkB,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACtH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,UAAU,eAAe,CAAC,GAAkB,EAAE,KAAwB;IAC3E,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAiB,CAAC;IACvC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACpB,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1G,gBAAgB,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,YAAoB,CAAC;IACzB,GAAG,CAAC;QACH,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC;QACzB,gBAAgB,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACtE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YAC1B,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;IACF,CAAC,QAAQ,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE;IACrC,OAAO,IAAI,CAAC;AACb,CAAC;AAQD,SAAS,QAAQ,CAAC,GAAkB,EAAE,MAAc,EAAE,KAAwB,EAAE,UAA+B;IAC9G,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,SAAS,UAAU,
|
|
1
|
+
{"version":3,"file":"schemaFieldScope.js","sourceRoot":"","sources":["../src/schemaFieldScope.ts"],"names":[],"mappings":"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"}
|
package/dist/sensitive.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sensitive.d.ts","sourceRoot":"","sources":["../src/sensitive.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,eAAe,CAAC;AAwBrC,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;AAQpD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD;
|
|
1
|
+
{"version":3,"file":"sensitive.d.ts","sourceRoot":"","sources":["../src/sensitive.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,eAAe,CAAC;AAwBrC,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;AAQpD,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOnD;AAiCD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,SAAa,EAAE,GAAG,SAAK,GAAG,MAAM,CAG1G;AACD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAK1F;AA8BD,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,MAAM,CAkBzD"}
|
package/dist/sensitive.js
CHANGED
|
@@ -40,14 +40,16 @@ const AUTH_SCHEME = /\b(?<scheme>Bearer|Basic)\s+[A-Za-z0-9%._~+/-]+=*/giu;
|
|
|
40
40
|
const JWT = /\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*/gu;
|
|
41
41
|
const PRIVATE_KEY = /-----BEGIN (?<kind>(?:[A-Z0-9]+ )*PRIVATE KEY)-----[\s\S]*?-----END \k<kind>-----/gu;
|
|
42
42
|
function redactAssignments(text, sensitive) {
|
|
43
|
-
const matcher = /(?<key>[A-Za-z][\w.-]*)(?<separator>["']?\s*[=:]\s*["']
|
|
43
|
+
const matcher = /(?<key>[A-Za-z][\w.-]*)(?<separator>["']?\s*[=:]\s*)(?<value>(?<quote>["'])(?:\\[\s\S]?|(?!\k<quote>)[^\\])*(?<closingQuote>\k<quote>|$)|[^\s"'&,;]+)/gu;
|
|
44
44
|
let result = "";
|
|
45
45
|
let cursor = 0;
|
|
46
46
|
for (let match = matcher.exec(text); match !== null; match = matcher.exec(text)) {
|
|
47
47
|
const key = match[1] ?? "";
|
|
48
48
|
const separator = match[2] ?? "";
|
|
49
49
|
if (sensitive(key)) {
|
|
50
|
-
|
|
50
|
+
const quote = match.groups?.quote ?? "";
|
|
51
|
+
const closingQuote = match.groups?.closingQuote ?? "";
|
|
52
|
+
result += `${text.slice(cursor, match.index)}${key}${separator}${quote}${REDACTED}${closingQuote}`;
|
|
51
53
|
cursor = matcher.lastIndex;
|
|
52
54
|
}
|
|
53
55
|
else if (match[3]?.includes("=")) {
|
package/dist/sensitive.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sensitive.js","sourceRoot":"","sources":["../src/sensitive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAExC,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC;AACrC,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB,MAAM,eAAe,GAAG;IACvB,UAAU;IACV,YAAY;IACZ,QAAQ;IACR,OAAO;IACP,eAAe;IACf,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,KAAK;IACL,QAAQ;IACR,WAAW;IACX,WAAW;IACX,YAAY;IACZ,eAAe;IACf,MAAM;IACN,MAAM;CACN,CAAC;AACF,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACpE,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,qBAAqB,CAAC,CAAC;AAEpG,SAAS,OAAO,CAAC,GAAW;IAC3B,OAAO,GAAG;SACR,UAAU,CAAC,qCAAqC,EAAE,mBAAmB,CAAC;SACtE,UAAU,CAAC,wCAAwC,EAAE,oBAAoB,CAAC;SAC1E,WAAW,EAAE;SACb,KAAK,CAAC,UAAU,CAAC,CAAC;AACrB,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,GAAW;IACzC,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC9D,OAAO,CACN,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC;WACjC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;WACzD,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAC9D,CAAC;AACH,CAAC;AACD,MAAM,WAAW,GAAG,sDAAsD,CAAC;AAC3E,MAAM,GAAG,GAAG,uDAAuD,CAAC;AACpE,MAAM,WAAW,GAAG,qFAAqF,CAAC;AAC1G,SAAS,iBAAiB,CAAC,IAAY,EAAE,SAAuB;IAC/D,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"sensitive.js","sourceRoot":"","sources":["../src/sensitive.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAExC,MAAM,CAAC,MAAM,QAAQ,GAAG,YAAY,CAAC;AACrC,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB,MAAM,eAAe,GAAG;IACvB,UAAU;IACV,YAAY;IACZ,QAAQ;IACR,OAAO;IACP,eAAe;IACf,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,YAAY;IACZ,YAAY;IACZ,KAAK;IACL,QAAQ;IACR,WAAW;IACX,WAAW;IACX,YAAY;IACZ,eAAe;IACf,MAAM;IACN,MAAM;CACN,CAAC;AACF,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACpE,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,qBAAqB,CAAC,CAAC;AAEpG,SAAS,OAAO,CAAC,GAAW;IAC3B,OAAO,GAAG;SACR,UAAU,CAAC,qCAAqC,EAAE,mBAAmB,CAAC;SACtE,UAAU,CAAC,wCAAwC,EAAE,oBAAoB,CAAC;SAC1E,WAAW,EAAE;SACb,KAAK,CAAC,UAAU,CAAC,CAAC;AACrB,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,GAAW;IACzC,MAAM,UAAU,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC9D,OAAO,CACN,eAAe,CAAC,QAAQ,CAAC,UAAU,CAAC;WACjC,eAAe,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;WACzD,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAC9D,CAAC;AACH,CAAC;AACD,MAAM,WAAW,GAAG,sDAAsD,CAAC;AAC3E,MAAM,GAAG,GAAG,uDAAuD,CAAC;AACpE,MAAM,WAAW,GAAG,qFAAqF,CAAC;AAC1G,SAAS,iBAAiB,CAAC,IAAY,EAAE,SAAuB;IAC/D,MAAM,OAAO,GACZ,yJAAyJ,CAAC;IAC3J,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,IAAI,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACjF,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;YACpB,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC;YACxC,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,EAAE,YAAY,IAAI,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,YAAY,EAAE,CAAC;YACnG,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;QAC5B,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,6FAA6F;YAC7F,OAAO,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;QACjE,CAAC;IACF,CAAC;IACD,OAAO,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC;AACD,SAAS,KAAK,CAAC,IAAY,EAAE,SAAuB;IACnD,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,aAAa,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtI,OAAO,iBAAiB,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;AAClD,CAAC;AACD,SAAS,kBAAkB,CAAC,IAAY;IACvC,OAAO,IAAI;SACT,UAAU,CAAC,6FAA6F,EAAE,cAAc,QAAQ,EAAE,CAAC;SACnI,UAAU,CAAC,qCAAqC,EAAE,OAAO,QAAQ,EAAE,CAAC,CAAC;AACxE,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,SAAuB,EAAE,SAAS,GAAG,UAAU,EAAE,GAAG,GAAG,EAAE;IACjG,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC,kBAAkB,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5E,OAAO,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,QAAQ,CAAC,MAAM,GAAG,SAAS,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/H,CAAC;AACD,MAAM,UAAU,gBAAgB,CAAC,KAAY,EAAE,SAAuB;IACrE,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO,SAAS,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;AACnH,CAAC;AAED,SAAS,KAAK,CAAC,KAAa;IAC3B,OAAO,KAAK;SACV,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;SAC5E,IAAI,CAAC,GAAG,CAAC,CAAC;AACb,CAAC;AAED,SAAS,GAAG,CAAC,KAAa;IACzB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,OAAO,CACN,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,CAChH,wDAAwD,EACxD,eAAe,QAAQ,GAAG,CAC1B,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC,CAC3C,CAAC;AACH,CAAC;AAED,MAAM,aAAa,GAAG,MAAM,CAAC,mBAAmB,CAC/C,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,OAAO,EAAE;IACrC,OAAO,EAAE,CAAC,GAAW,EAAE,IAAa,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;CACjG,CAAC,CACF,CAAC;AACF,SAAS,UAAU,CAAC,KAAa;IAChC,OAAO,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAa,EAAE,GAAG,GAAG,EAAE;IAChD,IAAI,uDAAuD,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACvE,OAAO,QAAQ,CAAC;IACjB,CAAC;IACD,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,OAAO,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,4CAA4C,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,oDAAoD,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9H,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC5B,OAAO,QAAQ,CAAC;QACjB,CAAC;IACF,CAAC;IACD,iGAAiG;IACjG,OAAO,KAAK,CAAC,UAAU,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC;AACxE,CAAC"}
|
package/dist/taxonomy.d.ts
CHANGED
|
@@ -32,7 +32,9 @@ declare const PreconditionFailed_base: Schema.Class<PreconditionFailed, Schema.T
|
|
|
32
32
|
export declare class PreconditionFailed extends PreconditionFailed_base {
|
|
33
33
|
}
|
|
34
34
|
declare const TooManyRequests_base: Schema.Class<TooManyRequests, Schema.TaggedStruct<"TooManyRequests", {
|
|
35
|
-
message: Schema.String;
|
|
35
|
+
readonly message: Schema.String;
|
|
36
|
+
readonly key: Schema.optionalKey<Schema.String>;
|
|
37
|
+
readonly retryAt: Schema.optionalKey<Schema.Number>;
|
|
36
38
|
}>, import("effect/Cause").YieldableError>;
|
|
37
39
|
export declare class TooManyRequests extends TooManyRequests_base {
|
|
38
40
|
}
|
package/dist/taxonomy.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"taxonomy.d.ts","sourceRoot":"","sources":["../src/taxonomy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;AAIhC,qBAAa,QAAS,SAAQ,aAAqD;CAAG;;;;AACtF,qBAAa,YAAa,SAAQ,iBAA6D;CAAG;;;;AAClG,qBAAa,SAAU,SAAQ,cAAuD;CAAG;;;;;AACzF,qBAAa,UAAW,SAAQ,eAAwD;CAAG;;;;;AAC3F,qBAAa,QAAS,SAAQ,aAAoD;CAAG;;;;AACrF,qBAAa,kBAAmB,SAAQ,uBAAyE;CAAG
|
|
1
|
+
{"version":3,"file":"taxonomy.d.ts","sourceRoot":"","sources":["../src/taxonomy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;;;;AAIhC,qBAAa,QAAS,SAAQ,aAAqD;CAAG;;;;AACtF,qBAAa,YAAa,SAAQ,iBAA6D;CAAG;;;;AAClG,qBAAa,SAAU,SAAQ,cAAuD;CAAG;;;;;AACzF,qBAAa,UAAW,SAAQ,eAAwD;CAAG;;;;;AAC3F,qBAAa,QAAS,SAAQ,aAAoD;CAAG;;;;AACrF,qBAAa,kBAAmB,SAAQ,uBAAyE;CAAG;;;;;;AACpH,qBAAa,eAAgB,SAAQ,oBAInC;CAAG;;;;AACL,qBAAa,eAAgB,SAAQ,oBAAmE;CAAG;;;;AAC3G,qBAAa,mBAAoB,SAAQ,wBAA2E;CAAG;;;;AACvH,qBAAa,kBAAmB,SAAQ,uBAAyE;CAAG;AAEpH,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D;AACD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AACD,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAE9D;AACD,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,UAAU,CAEhE;AACD,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CAE5D;AACD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEhF;AACD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AACD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,eAAe,CAE1E;AACD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,mBAAmB,CAElF;AACD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB,CAEhF"}
|
package/dist/taxonomy.js
CHANGED
|
@@ -13,7 +13,11 @@ export class Conflict extends Schema.TaggedError()("Conflict", perField) {
|
|
|
13
13
|
}
|
|
14
14
|
export class PreconditionFailed extends Schema.TaggedError()("PreconditionFailed", described) {
|
|
15
15
|
}
|
|
16
|
-
export class TooManyRequests extends Schema.TaggedError()("TooManyRequests",
|
|
16
|
+
export class TooManyRequests extends Schema.TaggedError()("TooManyRequests", {
|
|
17
|
+
...described,
|
|
18
|
+
key: Schema.optionalKey(Schema.String),
|
|
19
|
+
retryAt: Schema.optionalKey(Schema.Number),
|
|
20
|
+
}) {
|
|
17
21
|
}
|
|
18
22
|
export class AuthUnavailable extends Schema.TaggedError()("AuthUnavailable", described) {
|
|
19
23
|
}
|
package/dist/taxonomy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"taxonomy.js","sourceRoot":"","sources":["../src/taxonomy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAC7C,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACtF,MAAM,OAAO,QAAS,SAAQ,MAAM,CAAC,WAAW,EAAY,CAAC,UAAU,EAAE,SAAS,CAAC;CAAG;AACtF,MAAM,OAAO,YAAa,SAAQ,MAAM,CAAC,WAAW,EAAgB,CAAC,cAAc,EAAE,SAAS,CAAC;CAAG;AAClG,MAAM,OAAO,SAAU,SAAQ,MAAM,CAAC,WAAW,EAAa,CAAC,WAAW,EAAE,SAAS,CAAC;CAAG;AACzF,MAAM,OAAO,UAAW,SAAQ,MAAM,CAAC,WAAW,EAAc,CAAC,YAAY,EAAE,QAAQ,CAAC;CAAG;AAC3F,MAAM,OAAO,QAAS,SAAQ,MAAM,CAAC,WAAW,EAAY,CAAC,UAAU,EAAE,QAAQ,CAAC;CAAG;AACrF,MAAM,OAAO,kBAAmB,SAAQ,MAAM,CAAC,WAAW,EAAsB,CAAC,oBAAoB,EAAE,SAAS,CAAC;CAAG;AACpH,MAAM,OAAO,eAAgB,SAAQ,MAAM,CAAC,WAAW,EAAmB,CAAC,iBAAiB,EAAE,SAAS,CAAC;CAAG;
|
|
1
|
+
{"version":3,"file":"taxonomy.js","sourceRoot":"","sources":["../src/taxonomy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,SAAS,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AAC7C,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACtF,MAAM,OAAO,QAAS,SAAQ,MAAM,CAAC,WAAW,EAAY,CAAC,UAAU,EAAE,SAAS,CAAC;CAAG;AACtF,MAAM,OAAO,YAAa,SAAQ,MAAM,CAAC,WAAW,EAAgB,CAAC,cAAc,EAAE,SAAS,CAAC;CAAG;AAClG,MAAM,OAAO,SAAU,SAAQ,MAAM,CAAC,WAAW,EAAa,CAAC,WAAW,EAAE,SAAS,CAAC;CAAG;AACzF,MAAM,OAAO,UAAW,SAAQ,MAAM,CAAC,WAAW,EAAc,CAAC,YAAY,EAAE,QAAQ,CAAC;CAAG;AAC3F,MAAM,OAAO,QAAS,SAAQ,MAAM,CAAC,WAAW,EAAY,CAAC,UAAU,EAAE,QAAQ,CAAC;CAAG;AACrF,MAAM,OAAO,kBAAmB,SAAQ,MAAM,CAAC,WAAW,EAAsB,CAAC,oBAAoB,EAAE,SAAS,CAAC;CAAG;AACpH,MAAM,OAAO,eAAgB,SAAQ,MAAM,CAAC,WAAW,EAAmB,CAAC,iBAAiB,EAAE;IAC7F,GAAG,SAAS;IACZ,GAAG,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC;CAC1C,CAAC;CAAG;AACL,MAAM,OAAO,eAAgB,SAAQ,MAAM,CAAC,WAAW,EAAmB,CAAC,iBAAiB,EAAE,SAAS,CAAC;CAAG;AAC3G,MAAM,OAAO,mBAAoB,SAAQ,MAAM,CAAC,WAAW,EAAuB,CAAC,qBAAqB,EAAE,SAAS,CAAC;CAAG;AACvH,MAAM,OAAO,kBAAmB,SAAQ,MAAM,CAAC,WAAW,EAAsB,CAAC,oBAAoB,EAAE,SAAS,CAAC;CAAG;AAEpH,MAAM,UAAU,UAAU,CAAC,KAAc;IACxC,OAAO,KAAK,YAAY,QAAQ,CAAC;AAClC,CAAC;AACD,MAAM,UAAU,cAAc,CAAC,KAAc;IAC5C,OAAO,KAAK,YAAY,YAAY,CAAC;AACtC,CAAC;AACD,MAAM,UAAU,WAAW,CAAC,KAAc;IACzC,OAAO,KAAK,YAAY,SAAS,CAAC;AACnC,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,KAAc;IAC1C,OAAO,KAAK,YAAY,UAAU,CAAC;AACpC,CAAC;AACD,MAAM,UAAU,UAAU,CAAC,KAAc;IACxC,OAAO,KAAK,YAAY,QAAQ,CAAC;AAClC,CAAC;AACD,MAAM,UAAU,oBAAoB,CAAC,KAAc;IAClD,OAAO,KAAK,YAAY,kBAAkB,CAAC;AAC5C,CAAC;AACD,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC/C,OAAO,KAAK,YAAY,eAAe,CAAC;AACzC,CAAC;AACD,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC/C,OAAO,KAAK,YAAY,eAAe,CAAC;AACzC,CAAC;AACD,MAAM,UAAU,qBAAqB,CAAC,KAAc;IACnD,OAAO,KAAK,YAAY,mBAAmB,CAAC;AAC7C,CAAC;AACD,MAAM,UAAU,oBAAoB,CAAC,KAAc;IAClD,OAAO,KAAK,YAAY,kBAAkB,CAAC;AAC5C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shivaedev/errors",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Typed expected failures and secret-safe failure reporting for Effect applications",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"effect"
|
|
@@ -45,9 +45,8 @@
|
|
|
45
45
|
"README.md"
|
|
46
46
|
],
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@shivaedev/quality": "0.
|
|
49
|
-
"@shivaedev/test": "0.
|
|
50
|
-
"@shivaedev/test-story": "0.31.4",
|
|
48
|
+
"@shivaedev/quality": "0.55.0",
|
|
49
|
+
"@shivaedev/test-story": "0.33.0",
|
|
51
50
|
"@types/node": "24.19.2",
|
|
52
51
|
"effect": "4.0.6",
|
|
53
52
|
"typescript": "7.0.2",
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { isSensitiveKey, REDACTED, redactText, type SensitiveKey } from "#sensitive.ts";
|
|
2
|
+
|
|
3
|
+
export function redactBrowserText(text: string, sensitive: SensitiveKey = isSensitiveKey): string {
|
|
4
|
+
const masked = text.replaceAll(/(?<quote>["`]|(?<![\p{L}\p{N}_])')(?:\\[\s\S]|(?!\k<quote>)[^\\])*\k<quote>/gu, `$<quote>${REDACTED}$<quote>`);
|
|
5
|
+
return redactText(masked, sensitive);
|
|
6
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { Effect, Stream } from "effect";
|
|
2
|
-
import { Rpc, type RpcGroup,
|
|
1
|
+
import { Effect, Result, Stream } from "effect";
|
|
2
|
+
import { Rpc, type RpcGroup, RpcSchema } from "effect/rpc";
|
|
3
3
|
|
|
4
|
-
type
|
|
4
|
+
type HandlerResult = Effect.Effect<unknown, unknown, unknown> | Stream.Stream<unknown, unknown, unknown>;
|
|
5
5
|
type Handlers<R extends Rpc.Any> = {
|
|
6
6
|
readonly [TRpc in R as TRpc["_tag"]]: (
|
|
7
7
|
...args: Parameters<Rpc.ToHandlerFn<TRpc>>
|
|
@@ -31,17 +31,24 @@ export function rpcBoundaryHandlers<TRpcs extends Rpc.Any, E, THandlers extends
|
|
|
31
31
|
handlers: THandlers,
|
|
32
32
|
): BoundedHandlers<THandlers, E>;
|
|
33
33
|
export function rpcBoundaryHandlers(
|
|
34
|
-
|
|
34
|
+
group: RpcGroup.RpcGroup<Rpc.Any>,
|
|
35
35
|
boundary: <A, TError, R>(effect: Effect.Effect<A, TError, R>) => Effect.Effect<A, unknown, R>,
|
|
36
|
-
handlers: Readonly<Record<string, (...args: never[]) => Rpc.WrapperOr<
|
|
36
|
+
handlers: Readonly<Record<string, (...args: never[]) => Rpc.WrapperOr<HandlerResult>>>,
|
|
37
37
|
) {
|
|
38
38
|
return Object.fromEntries(
|
|
39
|
-
Object.entries<(...args: never[]) => Rpc.WrapperOr<
|
|
39
|
+
Object.entries<(...args: never[]) => Rpc.WrapperOr<HandlerResult>>(handlers).map(([tag, handler]) => [
|
|
40
40
|
tag,
|
|
41
|
-
(...args: never[]) =>
|
|
42
|
-
|
|
41
|
+
(...args: never[]) => {
|
|
42
|
+
const constructed = Result.try(() => handler(...args));
|
|
43
|
+
if (Result.isFailure(constructed)) {
|
|
44
|
+
const failure = boundary(Effect.die(constructed.failure));
|
|
45
|
+
const rpc = group.requests.get(tag);
|
|
46
|
+
return Rpc.isRpc(rpc) && RpcSchema.isStreamSchema(rpc.successSchema) ? Stream.fromEffect(failure) : failure;
|
|
47
|
+
}
|
|
48
|
+
return Rpc.wrapMap(constructed.success, (result) =>
|
|
43
49
|
Effect.isEffect(result) ? boundary(result) : Stream.catchCause(result, (cause) => Stream.fromEffect(boundary(Effect.failCause(cause)))),
|
|
44
|
-
)
|
|
50
|
+
);
|
|
51
|
+
},
|
|
45
52
|
]),
|
|
46
53
|
);
|
|
47
54
|
}
|
package/src/schemaFieldScope.ts
CHANGED
|
@@ -27,45 +27,61 @@ interface Field {
|
|
|
27
27
|
|
|
28
28
|
function fieldsOf(ast: SchemaAST.AST, schema: string, extra: readonly string[], candidates: ReadonlySet<string>): Field[] {
|
|
29
29
|
const fields: Field[] = [];
|
|
30
|
-
function visitIndex(
|
|
30
|
+
function visitIndex(
|
|
31
|
+
index: SchemaAST.IndexSignature,
|
|
32
|
+
path: string,
|
|
33
|
+
hidden: boolean,
|
|
34
|
+
seen: ReadonlySet<SchemaAST.AST>,
|
|
35
|
+
encoded: ReadonlySet<string>,
|
|
36
|
+
) {
|
|
31
37
|
const accepts = Schema.is(Schema.make(index.parameter));
|
|
32
38
|
for (const key of candidates) {
|
|
33
39
|
if (accepts(key)) {
|
|
34
|
-
fields.push({ key, path: `${path}[${key}]`, sensitive: hidden || extra.includes(key) || isSensitiveKey(key) });
|
|
40
|
+
fields.push({ key, path: `${path}[${key}]`, sensitive: hidden || encoded.has(key) || extra.includes(key) || isSensitiveKey(key) });
|
|
35
41
|
}
|
|
36
42
|
}
|
|
37
|
-
visit(index.type, `${path}[value]`, hidden, seen);
|
|
43
|
+
visit(index.type, `${path}[value]`, hidden, seen, encoded);
|
|
38
44
|
}
|
|
39
|
-
function visitObject(node: SchemaAST.Objects, path: string, hidden: boolean, seen: ReadonlySet<SchemaAST.AST>) {
|
|
45
|
+
function visitObject(node: SchemaAST.Objects, path: string, hidden: boolean, seen: ReadonlySet<SchemaAST.AST>, encoded: ReadonlySet<string>) {
|
|
40
46
|
for (const property of node.propertySignatures) {
|
|
41
47
|
if (typeof property.name !== "string") {
|
|
42
48
|
continue;
|
|
43
49
|
}
|
|
44
50
|
const sensitive =
|
|
45
|
-
hidden
|
|
51
|
+
hidden
|
|
52
|
+
|| encoded.has(property.name)
|
|
53
|
+
|| extra.includes(property.name)
|
|
54
|
+
|| isSensitiveKey(property.name)
|
|
55
|
+
|| maskedValue(property.type, schemaFieldKeys(property.type, []));
|
|
46
56
|
const fieldPath = `${path}.${property.name}`;
|
|
47
57
|
fields.push({ key: property.name, path: fieldPath, sensitive });
|
|
48
|
-
visit(property.type, fieldPath, sensitive, seen);
|
|
58
|
+
visit(property.type, fieldPath, sensitive, seen, encoded);
|
|
49
59
|
}
|
|
50
60
|
for (const index of node.indexSignatures) {
|
|
51
|
-
visitIndex(index, path, hidden, seen);
|
|
61
|
+
visitIndex(index, path, hidden, seen, encoded);
|
|
52
62
|
}
|
|
53
63
|
}
|
|
54
|
-
function visit(node: SchemaAST.AST, path: string, hidden: boolean, ancestors: ReadonlySet<SchemaAST.AST>) {
|
|
64
|
+
function visit(node: SchemaAST.AST, path: string, hidden: boolean, ancestors: ReadonlySet<SchemaAST.AST>, encoded: ReadonlySet<string>) {
|
|
55
65
|
if (ancestors.has(node)) {
|
|
56
66
|
return;
|
|
57
67
|
}
|
|
58
68
|
const seen = new Set(ancestors).add(node);
|
|
59
69
|
const masked = hidden || marked(node);
|
|
60
70
|
if (node._tag === "Objects") {
|
|
61
|
-
visitObject(node, path, masked, seen);
|
|
62
|
-
|
|
71
|
+
visitObject(node, path, masked, seen, encoded);
|
|
72
|
+
} else {
|
|
73
|
+
for (const [index, child] of children(node).entries()) {
|
|
74
|
+
visit(child, `${path}[${index}]`, masked, seen, encoded);
|
|
75
|
+
}
|
|
63
76
|
}
|
|
64
|
-
|
|
65
|
-
|
|
77
|
+
if (node.encoding !== undefined) {
|
|
78
|
+
const keys = new Set([...encoded, ...schemaFieldKeys(node, [])]);
|
|
79
|
+
for (const link of node.encoding) {
|
|
80
|
+
visit(link.to, `${path}.encoded`, masked, seen, keys);
|
|
81
|
+
}
|
|
66
82
|
}
|
|
67
83
|
}
|
|
68
|
-
visit(ast, schema, false, new Set());
|
|
84
|
+
visit(ast, schema, false, new Set(), new Set());
|
|
69
85
|
for (const key of schemaFieldKeys(ast, [])) {
|
|
70
86
|
if (!fields.some((field) => field.key === key && field.sensitive)) {
|
|
71
87
|
fields.push({ key, path: `${schema}.encoded.${key}`, sensitive: true });
|
package/src/sensitive.ts
CHANGED
|
@@ -44,14 +44,17 @@ const AUTH_SCHEME = /\b(?<scheme>Bearer|Basic)\s+[A-Za-z0-9%._~+/-]+=*/giu;
|
|
|
44
44
|
const JWT = /\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*/gu;
|
|
45
45
|
const PRIVATE_KEY = /-----BEGIN (?<kind>(?:[A-Z0-9]+ )*PRIVATE KEY)-----[\s\S]*?-----END \k<kind>-----/gu;
|
|
46
46
|
function redactAssignments(text: string, sensitive: SensitiveKey): string {
|
|
47
|
-
const matcher =
|
|
47
|
+
const matcher =
|
|
48
|
+
/(?<key>[A-Za-z][\w.-]*)(?<separator>["']?\s*[=:]\s*)(?<value>(?<quote>["'])(?:\\[\s\S]?|(?!\k<quote>)[^\\])*(?<closingQuote>\k<quote>|$)|[^\s"'&,;]+)/gu;
|
|
48
49
|
let result = "";
|
|
49
50
|
let cursor = 0;
|
|
50
51
|
for (let match = matcher.exec(text); match !== null; match = matcher.exec(text)) {
|
|
51
52
|
const key = match[1] ?? "";
|
|
52
53
|
const separator = match[2] ?? "";
|
|
53
54
|
if (sensitive(key)) {
|
|
54
|
-
|
|
55
|
+
const quote = match.groups?.quote ?? "";
|
|
56
|
+
const closingQuote = match.groups?.closingQuote ?? "";
|
|
57
|
+
result += `${text.slice(cursor, match.index)}${key}${separator}${quote}${REDACTED}${closingQuote}`;
|
|
55
58
|
cursor = matcher.lastIndex;
|
|
56
59
|
} else if (match[3]?.includes("=")) {
|
|
57
60
|
// Revisit embedded parameters without parsing URL and source-location colons as assignments.
|
package/src/taxonomy.ts
CHANGED
|
@@ -8,7 +8,11 @@ export class Forbidden extends Schema.TaggedError<Forbidden>()("Forbidden", desc
|
|
|
8
8
|
export class BadRequest extends Schema.TaggedError<BadRequest>()("BadRequest", perField) {}
|
|
9
9
|
export class Conflict extends Schema.TaggedError<Conflict>()("Conflict", perField) {}
|
|
10
10
|
export class PreconditionFailed extends Schema.TaggedError<PreconditionFailed>()("PreconditionFailed", described) {}
|
|
11
|
-
export class TooManyRequests extends Schema.TaggedError<TooManyRequests>()("TooManyRequests",
|
|
11
|
+
export class TooManyRequests extends Schema.TaggedError<TooManyRequests>()("TooManyRequests", {
|
|
12
|
+
...described,
|
|
13
|
+
key: Schema.optionalKey(Schema.String),
|
|
14
|
+
retryAt: Schema.optionalKey(Schema.Number),
|
|
15
|
+
}) {}
|
|
12
16
|
export class AuthUnavailable extends Schema.TaggedError<AuthUnavailable>()("AuthUnavailable", described) {}
|
|
13
17
|
export class InternalServerError extends Schema.TaggedError<InternalServerError>()("InternalServerError", described) {}
|
|
14
18
|
export class ServiceUnavailable extends Schema.TaggedError<ServiceUnavailable>()("ServiceUnavailable", described) {}
|