@evolu/common 7.2.3 → 7.4.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/dist/src/Buffer.d.ts +2 -1
- package/dist/src/Buffer.d.ts.map +1 -1
- package/dist/src/Buffer.js +1 -0
- package/dist/src/Callbacks.d.ts +1 -1
- package/dist/src/Callbacks.d.ts.map +1 -1
- package/dist/src/Callbacks.js +1 -1
- package/dist/src/Console.d.ts +1 -9
- package/dist/src/Console.d.ts.map +1 -1
- package/dist/src/Console.js +1 -41
- package/dist/src/Function.d.ts +61 -0
- package/dist/src/Function.d.ts.map +1 -1
- package/dist/src/Function.js +19 -0
- package/dist/src/Object.d.ts +16 -0
- package/dist/src/Object.d.ts.map +1 -1
- package/dist/src/Object.js +16 -0
- package/dist/src/Redacted.d.ts +89 -0
- package/dist/src/Redacted.d.ts.map +1 -0
- package/dist/src/Redacted.js +48 -0
- package/dist/src/Result.d.ts +36 -29
- package/dist/src/Result.d.ts.map +1 -1
- package/dist/src/Sqlite.d.ts +9 -7
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +8 -0
- package/dist/src/Task.d.ts.map +1 -1
- package/dist/src/Task.js +6 -4
- package/dist/src/Type.d.ts +34 -10
- package/dist/src/Type.d.ts.map +1 -1
- package/dist/src/Type.js +82 -202
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -0
- package/dist/src/local-first/Db.d.ts +1 -5
- package/dist/src/local-first/Db.d.ts.map +1 -1
- package/dist/src/local-first/Db.js +109 -108
- package/dist/src/local-first/Evolu.d.ts +3 -0
- package/dist/src/local-first/Evolu.d.ts.map +1 -1
- package/dist/src/local-first/Evolu.js +6 -7
- package/dist/src/local-first/LocalAuth.d.ts +2 -2
- package/dist/src/local-first/Owner.d.ts +7 -0
- package/dist/src/local-first/Owner.d.ts.map +1 -1
- package/dist/src/local-first/Protocol.d.ts.map +1 -1
- package/dist/src/local-first/Protocol.js +10 -10
- package/dist/src/local-first/Public.d.ts +6 -1
- package/dist/src/local-first/Public.d.ts.map +1 -1
- package/dist/src/local-first/Public.js +6 -1
- package/dist/src/local-first/PublicKysely.js +1 -1
- package/dist/src/local-first/Query.d.ts +54 -6
- package/dist/src/local-first/Query.d.ts.map +1 -1
- package/dist/src/local-first/Query.js +130 -11
- package/dist/src/local-first/Relay.d.ts.map +1 -1
- package/dist/src/local-first/Relay.js +17 -18
- package/dist/src/local-first/Schema.d.ts +15 -14
- package/dist/src/local-first/Schema.d.ts.map +1 -1
- package/dist/src/local-first/Schema.js +43 -51
- package/dist/src/local-first/Storage.d.ts +2 -2
- package/dist/src/local-first/Storage.d.ts.map +1 -1
- package/dist/src/local-first/Storage.js +2 -6
- package/dist/src/local-first/Sync.d.ts +9 -4
- package/dist/src/local-first/Sync.d.ts.map +1 -1
- package/dist/src/local-first/Sync.js +132 -59
- package/dist/src/local-first/index.d.ts +9 -2
- package/dist/src/local-first/index.d.ts.map +1 -1
- package/dist/src/local-first/index.js +9 -2
- package/package.json +3 -4
- package/src/Buffer.ts +2 -1
- package/src/Callbacks.ts +1 -1
- package/src/Console.ts +1 -10
- package/src/Function.ts +74 -0
- package/src/Object.ts +20 -0
- package/src/Redacted.ts +118 -0
- package/src/Result.ts +38 -29
- package/src/Sqlite.ts +18 -7
- package/src/Task.ts +6 -4
- package/src/Type.ts +148 -20
- package/src/index.ts +1 -0
- package/src/local-first/Db.ts +181 -209
- package/src/local-first/Evolu.ts +9 -6
- package/src/local-first/LocalAuth.ts +2 -2
- package/src/local-first/Owner.ts +8 -0
- package/src/local-first/Protocol.ts +10 -16
- package/src/local-first/Public.ts +6 -1
- package/src/local-first/PublicKysely.ts +1 -1
- package/src/local-first/Query.ts +216 -21
- package/src/local-first/Relay.ts +20 -24
- package/src/local-first/Schema.ts +83 -70
- package/src/local-first/Storage.ts +3 -8
- package/src/local-first/Sync.ts +190 -66
- package/src/local-first/index.ts +9 -2
- package/dist/src/local-first/Diff.d.ts +0 -43
- package/dist/src/local-first/Diff.d.ts.map +0 -1
- package/dist/src/local-first/Diff.js +0 -97
- package/src/local-first/Diff.ts +0 -144
package/dist/src/Buffer.d.ts
CHANGED
|
@@ -49,7 +49,7 @@ export declare class BufferError extends Error {
|
|
|
49
49
|
* https://blog.mozilla.org/nnethercote/2014/11/04/please-grow-your-buffers-exponentially
|
|
50
50
|
*/
|
|
51
51
|
export interface Buffer {
|
|
52
|
-
/** Returns the
|
|
52
|
+
/** Returns the current capacity of the buffer. */
|
|
53
53
|
getCapacity: () => NonNegativeInt;
|
|
54
54
|
/** Returns the current number of bytes stored in the buffer. */
|
|
55
55
|
getLength: () => NonNegativeInt;
|
|
@@ -88,5 +88,6 @@ export interface Buffer {
|
|
|
88
88
|
*/
|
|
89
89
|
unwrap: () => Uint8Array;
|
|
90
90
|
}
|
|
91
|
+
/** Creates a {@link Buffer} for efficient byte operations. */
|
|
91
92
|
export declare const createBuffer: (arrayLike?: Uint8Array | ArrayLike<number>) => Buffer;
|
|
92
93
|
//# sourceMappingURL=Buffer.d.ts.map
|
package/dist/src/Buffer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Buffer.d.ts","sourceRoot":"","sources":["../../src/Buffer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,WAAW,GACZ,MAAM,yBAAyB,CAAC;AAEjC;;;GAGG;AACH,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAM5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,WAAW,MAAM;IACrB,
|
|
1
|
+
{"version":3,"file":"Buffer.d.ts","sourceRoot":"","sources":["../../src/Buffer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EACL,UAAU,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,WAAW,GACZ,MAAM,yBAAyB,CAAC;AAEjC;;;GAGG;AACH,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAM5B;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,MAAM,WAAW,MAAM;IACrB,kDAAkD;IAClD,WAAW,EAAE,MAAM,cAAc,CAAC;IAElC,gEAAgE;IAChE,SAAS,EAAE,MAAM,cAAc,CAAC;IAEhC;;;OAGG;IACH,MAAM,EAAE,CAAC,GAAG,EAAE,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAEtD;;;OAGG;IACH,KAAK,EAAE,MAAM,cAAc,CAAC;IAE5B;;;OAGG;IACH,MAAM,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,UAAU,CAAC;IAE1C;;;OAGG;IACH,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAC;IAE3C;;;;;;OAMG;IACH,KAAK,EAAE,MAAM,IAAI,CAAC;IAElB;;;;OAIG;IACH,MAAM,EAAE,MAAM,UAAU,CAAC;CAC1B;AAED,8DAA8D;AAC9D,eAAO,MAAM,YAAY,GACvB,YAAY,UAAU,GAAG,SAAS,CAAC,MAAM,CAAC,KACzC,MA4DF,CAAC"}
|
package/dist/src/Buffer.js
CHANGED
|
@@ -11,6 +11,7 @@ export class BufferError extends Error {
|
|
|
11
11
|
Error.captureStackTrace(this, this.constructor);
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
+
/** Creates a {@link Buffer} for efficient byte operations. */
|
|
14
15
|
export const createBuffer = (arrayLike) => {
|
|
15
16
|
let value = arrayLike
|
|
16
17
|
? new globalThis.Uint8Array(arrayLike)
|
package/dist/src/Callbacks.d.ts
CHANGED
|
@@ -48,6 +48,6 @@ export interface Callbacks<T = undefined> {
|
|
|
48
48
|
}
|
|
49
49
|
/** Unique identifier for a callback in {@link Callbacks}. */
|
|
50
50
|
export type CallbackId = Id & Brand<"Callback">;
|
|
51
|
-
/** Creates a
|
|
51
|
+
/** Creates a {@link Callbacks} registry for managing callbacks. */
|
|
52
52
|
export declare const createCallbacks: <T = undefined>(deps: RandomBytesDep) => Callbacks<T>;
|
|
53
53
|
//# sourceMappingURL=Callbacks.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Callbacks.d.ts","sourceRoot":"","sources":["../../src/Callbacks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAY,EAAE,EAAE,MAAM,WAAW,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,SAAS;IACtC,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,KAAK,UAAU,CAAC;IAE9D,oEAAoE;IACpE,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,SAAS,GACjC,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,GAC7B,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC;CAC3C;AAED,6DAA6D;AAC7D,MAAM,MAAM,UAAU,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;AAEhD,
|
|
1
|
+
{"version":3,"file":"Callbacks.d.ts","sourceRoot":"","sources":["../../src/Callbacks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAY,EAAE,EAAE,MAAM,WAAW,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC,GAAG,SAAS;IACtC,6DAA6D;IAC7D,QAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,KAAK,UAAU,CAAC;IAE9D,oEAAoE;IACpE,QAAQ,CAAC,OAAO,EAAE,CAAC,SAAS,SAAS,GACjC,CAAC,EAAE,EAAE,UAAU,KAAK,SAAS,GAC7B,CAAC,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK,SAAS,CAAC;CAC3C;AAED,6DAA6D;AAC7D,MAAM,MAAM,UAAU,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;AAEhD,mEAAmE;AACnE,eAAO,MAAM,eAAe,GAAI,CAAC,GAAG,SAAS,EAC3C,MAAM,cAAc,KACnB,SAAS,CAAC,CAAC,CAsBb,CAAC"}
|
package/dist/src/Callbacks.js
CHANGED
package/dist/src/Console.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Cross-platform console
|
|
3
|
-
*
|
|
4
2
|
* Console abstraction for Chrome 123+, Firefox 125+, Safari 18.1+, Node.js
|
|
5
3
|
* 22.x+, and React Native 0.75+. Includes methods guaranteed to be available in
|
|
6
4
|
* these environments and expected to remain compatible in future versions.
|
|
@@ -35,12 +33,6 @@
|
|
|
35
33
|
* }
|
|
36
34
|
* }
|
|
37
35
|
* ```
|
|
38
|
-
*
|
|
39
|
-
* @module
|
|
40
|
-
*/
|
|
41
|
-
/**
|
|
42
|
-
* Cross-platform Console interface for Chrome 123+, Firefox 125+, Safari 18.1+,
|
|
43
|
-
* Node.js 22.x+, and React Native 0.75+
|
|
44
36
|
*/
|
|
45
37
|
export interface Console {
|
|
46
38
|
/** Controls whether console methods produce output (default: true) */
|
|
@@ -87,7 +79,7 @@ export interface ConsoleConfig {
|
|
|
87
79
|
*/
|
|
88
80
|
readonly enableLogging?: boolean;
|
|
89
81
|
}
|
|
90
|
-
/** Creates a
|
|
82
|
+
/** Creates a {@link Console} for logging with configurable output. */
|
|
91
83
|
export declare const createConsole: (config?: ConsoleConfig) => Console;
|
|
92
84
|
export interface ConsoleWithTimeConfig extends ConsoleConfig {
|
|
93
85
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Console.d.ts","sourceRoot":"","sources":["../../src/Console.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"Console.d.ts","sourceRoot":"","sources":["../../src/Console.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,WAAW,OAAO;IACtB,sEAAsE;IACtE,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,uCAAuC;IACvC,GAAG,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAEnC,2DAA2D;IAC3D,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAEpC,gCAAgC;IAChC,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAEpC,+BAA+B;IAC/B,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAErC,8BAA8B;IAC9B,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAErC,4CAA4C;IAC5C,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAE/B,0DAA0D;IAC1D,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAEvD,6CAA6C;IAC7C,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAElC,2DAA2D;IAC3D,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IAE1C,uCAAuC;IACvC,KAAK,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,UAAU,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAE9D,yEAAyE;IACzE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAEhC,6CAA6C;IAC7C,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAErC,qEAAqE;IACrE,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;IAE9E,oDAAoD;IACpD,KAAK,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,KAAK,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC;CAC/D;AAED,6DAA6D;AAC7D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,sEAAsE;AACtE,eAAO,MAAM,aAAa,GAAI,SAAQ,aAAkB,KAAG,OAgE1D,CAAC;AAEF,MAAM,WAAW,qBAAsB,SAAQ,aAAa;IAC1D;;;;;OAKG;IACH,QAAQ,CAAC,aAAa,EAAE,UAAU,GAAG,UAAU,CAAC;CACjD;AAED,0DAA0D;AAC1D,eAAO,MAAM,qBAAqB,GAChC,SAAQ,qBAAqD,KAC5D,OAmDF,CAAC"}
|
package/dist/src/Console.js
CHANGED
|
@@ -1,44 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cross-platform console
|
|
3
|
-
*
|
|
4
|
-
* Console abstraction for Chrome 123+, Firefox 125+, Safari 18.1+, Node.js
|
|
5
|
-
* 22.x+, and React Native 0.75+. Includes methods guaranteed to be available in
|
|
6
|
-
* these environments and expected to remain compatible in future versions.
|
|
7
|
-
* Output formatting may vary (e.g., interactive UI in browsers vs. text in
|
|
8
|
-
* Node.js/React Native), but functionality is consistent across platforms.
|
|
9
|
-
*
|
|
10
|
-
* **Convention**: Use a tag (e.g., `[db]`) as the first argument for log
|
|
11
|
-
* filtering.
|
|
12
|
-
*
|
|
13
|
-
* ### Example
|
|
14
|
-
*
|
|
15
|
-
* ```ts
|
|
16
|
-
* deps.console.log("[evolu]", "createEvoluInstance", { name });
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* **Tip**: In browser dev tools, you can filter logs by tag (e.g., `[db]`) to
|
|
20
|
-
* quickly find relevant messages. In Node.js, use `grep` to filter output:
|
|
21
|
-
*
|
|
22
|
-
* ```bash
|
|
23
|
-
* node app.js | grep "\[relay\]" # Show only relay logs
|
|
24
|
-
* node app.js | grep -E "\[db\]|\[sql\]" # Show db and sql logs
|
|
25
|
-
* node app.js | grep -v "\[debug\]" # Hide debug logs
|
|
26
|
-
* ```
|
|
27
|
-
*
|
|
28
|
-
* Or add to package.json scripts:
|
|
29
|
-
*
|
|
30
|
-
* ```json
|
|
31
|
-
* {
|
|
32
|
-
* "scripts": {
|
|
33
|
-
* "dev:relay": "node app.js | grep \"\\[relay\\]\"",
|
|
34
|
-
* "dev:db": "node app.js | grep -E \"\\[db\\]|\\[sql\\]\""
|
|
35
|
-
* }
|
|
36
|
-
* }
|
|
37
|
-
* ```
|
|
38
|
-
*
|
|
39
|
-
* @module
|
|
40
|
-
*/
|
|
41
|
-
/** Creates a console instance using the global console. */
|
|
1
|
+
/** Creates a {@link Console} for logging with configurable output. */
|
|
42
2
|
export const createConsole = (config = {}) => {
|
|
43
3
|
const instance = {
|
|
44
4
|
enabled: config.enableLogging ?? false,
|
package/dist/src/Function.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { NonEmptyArray, NonEmptyReadonlyArray } from "./Array.js";
|
|
2
|
+
import { ReadonlyRecord } from "./Object.js";
|
|
1
3
|
/**
|
|
2
4
|
* Helper function to ensure exhaustive matching in a switch statement. Throws
|
|
3
5
|
* an error if an unhandled case is encountered.
|
|
@@ -28,7 +30,66 @@
|
|
|
28
30
|
* ```
|
|
29
31
|
*/
|
|
30
32
|
export declare const exhaustiveCheck: (value: never) => never;
|
|
33
|
+
/**
|
|
34
|
+
* Returns the input value unchanged.
|
|
35
|
+
*
|
|
36
|
+
* Useful as a default transformation, placeholder callback, or when a function
|
|
37
|
+
* is required but no transformation is needed.
|
|
38
|
+
*
|
|
39
|
+
* ### Example
|
|
40
|
+
*
|
|
41
|
+
* ```ts
|
|
42
|
+
* const values = [1, 2, 3];
|
|
43
|
+
* const same = values.map(identity); // [1, 2, 3]
|
|
44
|
+
*
|
|
45
|
+
* const getTransform = (shouldDouble: boolean) =>
|
|
46
|
+
* shouldDouble ? (x: number) => x * 2 : identity;
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
31
49
|
export declare const identity: <A>(a: A) => A;
|
|
50
|
+
/**
|
|
51
|
+
* Casts an array, set, record, or map to its readonly counterpart.
|
|
52
|
+
*
|
|
53
|
+
* Zero runtime cost — returns the same value with a readonly type. Use this to
|
|
54
|
+
* enforce immutability at the type level. Preserves {@link NonEmptyArray} as
|
|
55
|
+
* {@link NonEmptyReadonlyArray}.
|
|
56
|
+
*
|
|
57
|
+
* ### Example
|
|
58
|
+
*
|
|
59
|
+
* ```ts
|
|
60
|
+
* // Array literals become NonEmptyReadonlyArray
|
|
61
|
+
* const items = readonly([1, 2, 3]);
|
|
62
|
+
* // Type: NonEmptyReadonlyArray<number>
|
|
63
|
+
*
|
|
64
|
+
* // NonEmptyArray is preserved as NonEmptyReadonlyArray
|
|
65
|
+
* const nonEmpty: NonEmptyArray<number> = [1, 2, 3];
|
|
66
|
+
* const readonlyNonEmpty = readonly(nonEmpty);
|
|
67
|
+
* // Type: NonEmptyReadonlyArray<number>
|
|
68
|
+
*
|
|
69
|
+
* // Regular arrays become ReadonlyArray
|
|
70
|
+
* const arr: Array<number> = getNumbers();
|
|
71
|
+
* const readonlyArr = readonly(arr);
|
|
72
|
+
* // Type: ReadonlyArray<number>
|
|
73
|
+
*
|
|
74
|
+
* // Sets, Records, and Maps
|
|
75
|
+
* const ids = readonly(new Set(["a", "b"]));
|
|
76
|
+
* // Type: ReadonlySet<string>
|
|
77
|
+
*
|
|
78
|
+
* const users: Record<UserId, string> = { ... };
|
|
79
|
+
* const readonlyUsers = readonly(users);
|
|
80
|
+
* // Type: ReadonlyRecord<UserId, string>
|
|
81
|
+
*
|
|
82
|
+
* const lookup = readonly(new Map([["key", "value"]]));
|
|
83
|
+
* // Type: ReadonlyMap<string, string>
|
|
84
|
+
* ```
|
|
85
|
+
*
|
|
86
|
+
* @experimental
|
|
87
|
+
*/
|
|
88
|
+
export declare function readonly<T>(array: NonEmptyArray<T>): NonEmptyReadonlyArray<T>;
|
|
89
|
+
export declare function readonly<T>(array: Array<T>): ReadonlyArray<T>;
|
|
90
|
+
export declare function readonly<T>(set: Set<T>): ReadonlySet<T>;
|
|
91
|
+
export declare function readonly<K, V>(map: Map<K, V>): ReadonlyMap<K, V>;
|
|
92
|
+
export declare function readonly<K extends keyof any, V>(record: Record<K, V>): ReadonlyRecord<K, V>;
|
|
32
93
|
/**
|
|
33
94
|
* A function that delays computation and returns a value of type T.
|
|
34
95
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Function.d.ts","sourceRoot":"","sources":["../../src/Function.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,KAAK,KAAG,KAE9C,CAAC;AAEF,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,GAAG,CAAC,KAAG,CAAM,CAAC;AAE1C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAEnC,eAAO,MAAM,SAAS,EAAE,SAAS,CAAC,IAAI,CAAmB,CAAC;AAC1D,eAAO,MAAM,cAAc,EAAE,SAAS,CAAC,SAAS,CAAmB,CAAC;AACpE,eAAO,MAAM,SAAS,EAAE,SAAS,CAAC,IAAI,CAAc,CAAC;AACrD,eAAO,MAAM,SAAS,EAAE,SAAS,CAAC,IAAI,CAAc,CAAC;AACrD,eAAO,MAAM,UAAU,EAAE,SAAS,CAAC,KAAK,CAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"Function.d.ts","sourceRoot":"","sources":["../../src/Function.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,eAAO,MAAM,eAAe,GAAI,OAAO,KAAK,KAAG,KAE9C,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,QAAQ,GAAI,CAAC,EAAE,GAAG,CAAC,KAAG,CAAM,CAAC;AAE1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;AAC/E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AAC/D,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AACzD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAClE,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,GAAG,EAAE,CAAC,EAC7C,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GACnB,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAWxB;;;;;;;;;;;;;;;GAeG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAEnC,eAAO,MAAM,SAAS,EAAE,SAAS,CAAC,IAAI,CAAmB,CAAC;AAC1D,eAAO,MAAM,cAAc,EAAE,SAAS,CAAC,SAAS,CAAmB,CAAC;AACpE,eAAO,MAAM,SAAS,EAAE,SAAS,CAAC,IAAI,CAAc,CAAC;AACrD,eAAO,MAAM,SAAS,EAAE,SAAS,CAAC,IAAI,CAAc,CAAC;AACrD,eAAO,MAAM,UAAU,EAAE,SAAS,CAAC,KAAK,CAAe,CAAC"}
|
package/dist/src/Function.js
CHANGED
|
@@ -30,7 +30,26 @@
|
|
|
30
30
|
export const exhaustiveCheck = (value) => {
|
|
31
31
|
throw new Error(`exhaustiveCheck unhandled case: ${JSON.stringify(value)}`);
|
|
32
32
|
};
|
|
33
|
+
/**
|
|
34
|
+
* Returns the input value unchanged.
|
|
35
|
+
*
|
|
36
|
+
* Useful as a default transformation, placeholder callback, or when a function
|
|
37
|
+
* is required but no transformation is needed.
|
|
38
|
+
*
|
|
39
|
+
* ### Example
|
|
40
|
+
*
|
|
41
|
+
* ```ts
|
|
42
|
+
* const values = [1, 2, 3];
|
|
43
|
+
* const same = values.map(identity); // [1, 2, 3]
|
|
44
|
+
*
|
|
45
|
+
* const getTransform = (shouldDouble: boolean) =>
|
|
46
|
+
* shouldDouble ? (x: number) => x * 2 : identity;
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
33
49
|
export const identity = (a) => a;
|
|
50
|
+
export function readonly(value) {
|
|
51
|
+
return value;
|
|
52
|
+
}
|
|
34
53
|
export const constVoid = () => undefined;
|
|
35
54
|
export const constUndefined = () => undefined;
|
|
36
55
|
export const constNull = () => null;
|
package/dist/src/Object.d.ts
CHANGED
|
@@ -52,5 +52,21 @@ export declare const excludeProp: <T extends object, K extends keyof T>(obj: T,
|
|
|
52
52
|
* ```
|
|
53
53
|
*/
|
|
54
54
|
export declare const createRecord: <K extends string = string, V = unknown>() => Record<K, V>;
|
|
55
|
+
/**
|
|
56
|
+
* Safely gets a property from a record, returning `undefined` if the key
|
|
57
|
+
* doesn't exist.
|
|
58
|
+
*
|
|
59
|
+
* TypeScript's `Record<K, V>` type assumes all keys exist, but at runtime
|
|
60
|
+
* accessing a non-existent key returns `undefined`. This helper provides proper
|
|
61
|
+
* typing for that case without needing a type assertion.
|
|
62
|
+
*
|
|
63
|
+
* ### Example
|
|
64
|
+
*
|
|
65
|
+
* ```ts
|
|
66
|
+
* const users: Record<string, User> = { alice: { name: "Alice" } };
|
|
67
|
+
* const user = getProperty(users, "bob"); // User | undefined
|
|
68
|
+
* ```
|
|
69
|
+
*/
|
|
70
|
+
export declare const getProperty: <K extends string, V>(record: ReadonlyRecord<K, V>, key: string) => V | undefined;
|
|
55
71
|
export {};
|
|
56
72
|
//# sourceMappingURL=Object.d.ts.map
|
package/dist/src/Object.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Object.d.ts","sourceRoot":"","sources":["../../src/Object.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,OAAO,KACb,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAC2B,CAAC;AAE9D;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,GAAG,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAG5E,KAAK,WAAW,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3D,QAAQ,CAAC,KACR,aAAa,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAGK,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAC9C,QAAQ,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAC5B,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAC1B,cAAc,CAAC,CAAC,EAAE,CAAC,CAMK,CAAC;AAE5B,wDAAwD;AACxD,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EAC7D,KAAK,CAAC,EACN,MAAM,CAAC,EACP,YAAY,OAAO,KAClB,OAAO,SAAS,SAAS,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAM/C,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,OAAO,OAAK,MAAM,CAC5E,CAAC,EACD,CAAC,CACqC,CAAC"}
|
|
1
|
+
{"version":3,"file":"Object.d.ts","sourceRoot":"","sources":["../../src/Object.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,aAAa,GACxB,OAAO,OAAO,KACb,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAC2B,CAAC;AAE9D;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,MAAM,GAAG,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAG5E,KAAK,WAAW,CAAC,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC3D,QAAQ,CAAC,KACR,aAAa,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAGK,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,EAC9C,QAAQ,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAC5B,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAC1B,cAAc,CAAC,CAAC,EAAE,CAAC,CAMK,CAAC;AAE5B,wDAAwD;AACxD,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,CAAC,EAC7D,KAAK,CAAC,EACN,MAAM,CAAC,EACP,YAAY,OAAO,KAClB,OAAO,SAAS,SAAS,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,CAAC,CAM/C,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,GAAG,OAAO,OAAK,MAAM,CAC5E,CAAC,EACD,CAAC,CACqC,CAAC;AAEzC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,GAAI,CAAC,SAAS,MAAM,EAAE,CAAC,EAC7C,QAAQ,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAC5B,KAAK,MAAM,KACV,CAAC,GAAG,SAA2D,CAAC"}
|
package/dist/src/Object.js
CHANGED
|
@@ -55,3 +55,19 @@ export const excludeProp = (obj, prop, condition) => {
|
|
|
55
55
|
* ```
|
|
56
56
|
*/
|
|
57
57
|
export const createRecord = () => Object.create(null);
|
|
58
|
+
/**
|
|
59
|
+
* Safely gets a property from a record, returning `undefined` if the key
|
|
60
|
+
* doesn't exist.
|
|
61
|
+
*
|
|
62
|
+
* TypeScript's `Record<K, V>` type assumes all keys exist, but at runtime
|
|
63
|
+
* accessing a non-existent key returns `undefined`. This helper provides proper
|
|
64
|
+
* typing for that case without needing a type assertion.
|
|
65
|
+
*
|
|
66
|
+
* ### Example
|
|
67
|
+
*
|
|
68
|
+
* ```ts
|
|
69
|
+
* const users: Record<string, User> = { alice: { name: "Alice" } };
|
|
70
|
+
* const user = getProperty(users, "bob"); // User | undefined
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export const getProperty = (record, key) => (key in record ? record[key] : undefined);
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import type { Brand } from "./Brand.js";
|
|
2
|
+
import type { Eq } from "./Eq.js";
|
|
3
|
+
/**
|
|
4
|
+
* A wrapper type that prevents sensitive values from being accidentally exposed
|
|
5
|
+
* through logging, serialization, or inspection.
|
|
6
|
+
*
|
|
7
|
+
* The wrapped value is hidden and can only be accessed explicitly via
|
|
8
|
+
* {@link revealRedacted}. All standard methods (`toString`, `toJSON`, and
|
|
9
|
+
* Node.js inspect) return `<redacted>`.
|
|
10
|
+
*
|
|
11
|
+
* For type-level distinction between different secrets, use branded types.
|
|
12
|
+
*
|
|
13
|
+
* The actual value lives in a `WeakMap`, so it never appears as a property and
|
|
14
|
+
* is automatically garbage collected when the wrapper is dropped. This is
|
|
15
|
+
* better than a class with a private field because private fields are still
|
|
16
|
+
* visible in devtools. Symbols can't be used because they don't support custom
|
|
17
|
+
* `toString`.
|
|
18
|
+
*
|
|
19
|
+
* Implements `Disposable` for automatic cleanup via the `using` syntax.
|
|
20
|
+
*
|
|
21
|
+
* ### Example
|
|
22
|
+
*
|
|
23
|
+
* ```ts
|
|
24
|
+
* // Define branded types for your secrets
|
|
25
|
+
* type ApiKey = string & Brand<"ApiKey">;
|
|
26
|
+
* type DbPassword = string & Brand<"DbPassword">;
|
|
27
|
+
*
|
|
28
|
+
* // Wrap them with Redacted for safe passing
|
|
29
|
+
* type RedactedApiKey = Redacted<ApiKey>;
|
|
30
|
+
* type RedactedDbPassword = Redacted<DbPassword>;
|
|
31
|
+
*
|
|
32
|
+
* // Create a redacted secret
|
|
33
|
+
* const apiKey: ApiKey = "secret-123" as ApiKey;
|
|
34
|
+
* const redactedKey: RedactedApiKey = createRedacted(apiKey);
|
|
35
|
+
*
|
|
36
|
+
* console.log(redactedKey); // <redacted>
|
|
37
|
+
* console.log(revealRedacted(redactedKey)); // secret-123
|
|
38
|
+
*
|
|
39
|
+
* // Type safety: RedactedApiKey ≠ RedactedDbPassword
|
|
40
|
+
* const fetchUser = (key: RedactedApiKey) => {
|
|
41
|
+
* const value: ApiKey = revealRedacted(key);
|
|
42
|
+
* // use value...
|
|
43
|
+
* };
|
|
44
|
+
*
|
|
45
|
+
* fetchUser(redactedKey); // ✅
|
|
46
|
+
* // fetchUser(createRedacted("x" as DbPassword)); // ❌ type error
|
|
47
|
+
*
|
|
48
|
+
* // Automatic cleanup with `using`
|
|
49
|
+
* {
|
|
50
|
+
* using secret = createRedacted("sensitive" as ApiKey);
|
|
51
|
+
* // ... use secret ...
|
|
52
|
+
* } // automatically wiped from memory
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
55
|
+
* @experimental
|
|
56
|
+
*/
|
|
57
|
+
export interface Redacted<A> extends Brand<"Redacted">, Disposable {
|
|
58
|
+
/** The inner type. Useful for inference via `typeof redacted.Type`. */
|
|
59
|
+
readonly Type: A;
|
|
60
|
+
}
|
|
61
|
+
/** Creates a {@link Redacted} wrapper for a sensitive value. */
|
|
62
|
+
export declare const createRedacted: <A>(value: A) => Redacted<A>;
|
|
63
|
+
/**
|
|
64
|
+
* Reveals the original value from a {@link Redacted} wrapper.
|
|
65
|
+
*
|
|
66
|
+
* This is a separate function rather than a method on {@link Redacted} to make
|
|
67
|
+
* access visually explicit and easy to grep in code reviews. Accessing
|
|
68
|
+
* sensitive values should feel intentional, not convenient.
|
|
69
|
+
*/
|
|
70
|
+
export declare const revealRedacted: <A>(redacted: Redacted<A>) => A;
|
|
71
|
+
/** Checks if a value is a {@link Redacted} wrapper. */
|
|
72
|
+
export declare const isRedacted: (value: unknown) => value is Redacted<unknown>;
|
|
73
|
+
/**
|
|
74
|
+
* Creates an {@link Eq} for {@link Redacted} values based on an equality function
|
|
75
|
+
* for the underlying type.
|
|
76
|
+
*
|
|
77
|
+
* ### Example
|
|
78
|
+
*
|
|
79
|
+
* ```ts
|
|
80
|
+
* type ApiKey = string & Brand<"ApiKey">;
|
|
81
|
+
* const eqRedactedApiKey = createEqRedacted<ApiKey>(eqString);
|
|
82
|
+
*
|
|
83
|
+
* const a = createRedacted("x" as ApiKey);
|
|
84
|
+
* const b = createRedacted("x" as ApiKey);
|
|
85
|
+
* eqRedactedApiKey(a, b); // true
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export declare const createEqRedacted: <A>(eq: Eq<A>) => Eq<Redacted<A>>;
|
|
89
|
+
//# sourceMappingURL=Redacted.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Redacted.d.ts","sourceRoot":"","sources":["../../src/Redacted.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC,CAAE,SAAQ,KAAK,CAAC,UAAU,CAAC,EAAE,UAAU;IAChE,uEAAuE;IACvE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CAClB;AAED,gEAAgE;AAChE,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,QAAQ,CAAC,CAAC,CAItD,CAAC;AAaF;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,UAAU,QAAQ,CAAC,CAAC,CAAC,KAAG,CAGzD,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,KAAG,KAAK,IAAI,QAAQ,CAAC,OAAO,CAG7B,CAAC;AAEzC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,gBAAgB,GAC1B,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAEY,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { assert } from "./Assert.js";
|
|
2
|
+
/** Creates a {@link Redacted} wrapper for a sensitive value. */
|
|
3
|
+
export const createRedacted = (value) => {
|
|
4
|
+
const redacted = Object.create(proto);
|
|
5
|
+
registry.set(redacted, value);
|
|
6
|
+
return redacted;
|
|
7
|
+
};
|
|
8
|
+
const proto = {
|
|
9
|
+
toString: () => redactedString,
|
|
10
|
+
toJSON: () => redactedString,
|
|
11
|
+
[Symbol.for("nodejs.util.inspect.custom")]: () => redactedString,
|
|
12
|
+
[Symbol.dispose]() {
|
|
13
|
+
registry.delete(this);
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
const redactedString = "<redacted>";
|
|
17
|
+
const registry = new WeakMap();
|
|
18
|
+
/**
|
|
19
|
+
* Reveals the original value from a {@link Redacted} wrapper.
|
|
20
|
+
*
|
|
21
|
+
* This is a separate function rather than a method on {@link Redacted} to make
|
|
22
|
+
* access visually explicit and easy to grep in code reviews. Accessing
|
|
23
|
+
* sensitive values should feel intentional, not convenient.
|
|
24
|
+
*/
|
|
25
|
+
export const revealRedacted = (redacted) => {
|
|
26
|
+
assert(registry.has(redacted), "Redacted value was not in registry");
|
|
27
|
+
return registry.get(redacted);
|
|
28
|
+
};
|
|
29
|
+
/** Checks if a value is a {@link Redacted} wrapper. */
|
|
30
|
+
export const isRedacted = (value) => typeof value === "object" &&
|
|
31
|
+
value !== null &&
|
|
32
|
+
Object.getPrototypeOf(value) === proto;
|
|
33
|
+
/**
|
|
34
|
+
* Creates an {@link Eq} for {@link Redacted} values based on an equality function
|
|
35
|
+
* for the underlying type.
|
|
36
|
+
*
|
|
37
|
+
* ### Example
|
|
38
|
+
*
|
|
39
|
+
* ```ts
|
|
40
|
+
* type ApiKey = string & Brand<"ApiKey">;
|
|
41
|
+
* const eqRedactedApiKey = createEqRedacted<ApiKey>(eqString);
|
|
42
|
+
*
|
|
43
|
+
* const a = createRedacted("x" as ApiKey);
|
|
44
|
+
* const b = createRedacted("x" as ApiKey);
|
|
45
|
+
* eqRedactedApiKey(a, b); // true
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
export const createEqRedacted = (eq) => (x, y) => eq(revealRedacted(x), revealRedacted(y));
|
package/dist/src/Result.d.ts
CHANGED
|
@@ -82,19 +82,22 @@
|
|
|
82
82
|
* };
|
|
83
83
|
* ```
|
|
84
84
|
*
|
|
85
|
+
* For lazy, cancellable async operations, see {@link Task}.
|
|
86
|
+
*
|
|
85
87
|
* ### Naming convention
|
|
86
88
|
*
|
|
87
|
-
* - For values
|
|
88
|
-
* - For
|
|
89
|
-
*
|
|
89
|
+
* - **For values you need:** use a name without Result suffix (`user`, `config`)
|
|
90
|
+
* - **For void operations:** use `result` (no value to name)
|
|
91
|
+
*
|
|
92
|
+
* For multiple void operations, use block scopes to avoid potentially long
|
|
93
|
+
* names like `createBaseTablesResult`, `createRelayTablesResult`, or counters
|
|
94
|
+
* like `result1`, `result2`:
|
|
90
95
|
*
|
|
91
96
|
* ```ts
|
|
92
97
|
* const processUser = () => {
|
|
93
|
-
* // we have a value
|
|
94
98
|
* const user = getUser();
|
|
95
99
|
* if (!user.ok) return user;
|
|
96
100
|
*
|
|
97
|
-
* // single void operation
|
|
98
101
|
* const result = saveToDatabase(user.value);
|
|
99
102
|
* if (!result.ok) return result;
|
|
100
103
|
*
|
|
@@ -102,12 +105,15 @@
|
|
|
102
105
|
* };
|
|
103
106
|
*
|
|
104
107
|
* const setupDatabase = () => {
|
|
105
|
-
* //
|
|
106
|
-
*
|
|
107
|
-
*
|
|
108
|
-
*
|
|
109
|
-
*
|
|
110
|
-
*
|
|
108
|
+
* // Multiple void operations - use block scopes to avoid name clash
|
|
109
|
+
* {
|
|
110
|
+
* const result = createBaseTables();
|
|
111
|
+
* if (!result.ok) return result;
|
|
112
|
+
* }
|
|
113
|
+
* {
|
|
114
|
+
* const result = createRelayTables();
|
|
115
|
+
* if (!result.ok) return result;
|
|
116
|
+
* }
|
|
111
117
|
*
|
|
112
118
|
* return ok();
|
|
113
119
|
* };
|
|
@@ -124,30 +130,31 @@
|
|
|
124
130
|
* schema, and initializes the database, stopping on the first error:
|
|
125
131
|
*
|
|
126
132
|
* ```ts
|
|
127
|
-
* const
|
|
128
|
-
* const
|
|
129
|
-
* if (!
|
|
133
|
+
* const result = deps.sqlite.transaction(() => {
|
|
134
|
+
* const result = dropAllTables(deps);
|
|
135
|
+
* if (!result.ok) return result;
|
|
130
136
|
*
|
|
131
137
|
* if (message.restore) {
|
|
132
138
|
* const dbSchema = getDbSchema(deps)();
|
|
133
139
|
* if (!dbSchema.ok) return dbSchema;
|
|
134
140
|
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
*
|
|
141
|
+
* {
|
|
142
|
+
* const result = ensureDbSchema(deps)(
|
|
143
|
+
* message.restore.dbSchema,
|
|
144
|
+
* dbSchema.value,
|
|
145
|
+
* );
|
|
146
|
+
* if (!result.ok) return result;
|
|
147
|
+
* }
|
|
148
|
+
* {
|
|
149
|
+
* const result = initializeDb(deps)(message.restore.mnemonic);
|
|
150
|
+
* if (!result.ok) return result;
|
|
151
|
+
* }
|
|
145
152
|
* }
|
|
146
153
|
* return ok();
|
|
147
154
|
* });
|
|
148
155
|
*
|
|
149
|
-
* if (!
|
|
150
|
-
* deps.postMessage({ type: "onError", error:
|
|
156
|
+
* if (!result.ok) {
|
|
157
|
+
* deps.postMessage({ type: "onError", error: result.error });
|
|
151
158
|
* return;
|
|
152
159
|
* }
|
|
153
160
|
* ```
|
|
@@ -254,13 +261,13 @@
|
|
|
254
261
|
* ```ts
|
|
255
262
|
* // ✅ Safe to return void - unsafe code is wrapped and error is handled
|
|
256
263
|
* const processData = (data: string): void => {
|
|
257
|
-
* const
|
|
264
|
+
* const result = trySync(
|
|
258
265
|
* () => JSON.parse(data),
|
|
259
266
|
* (error) => ({ type: "ParseError", message: String(error) }),
|
|
260
267
|
* );
|
|
261
268
|
*
|
|
262
|
-
* if (!
|
|
263
|
-
* logError(
|
|
269
|
+
* if (!result.ok) {
|
|
270
|
+
* logError(result.error);
|
|
264
271
|
* return;
|
|
265
272
|
* }
|
|
266
273
|
*
|
package/dist/src/Result.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Result.d.ts","sourceRoot":"","sources":["../../src/Result.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Result.d.ts","sourceRoot":"","sources":["../../src/Result.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqVG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAE1C,mCAAmC;AACnC,MAAM,WAAW,EAAE,CAAC,CAAC;IACnB,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAClB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,MAAM,WAAW,GAAG,CAAC,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB;AAED;;;;GAIG;AACH,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAC5C,CAAC,SAAS,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEpC;;;;GAIG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAC7C,CAAC,SAAS,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAErC;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,EAAE,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC;AAC/B,2DAA2D;AAC3D,wBAAgB,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;AAKvC;;;;;;;;;GASG;AACH,eAAO,MAAM,GAAG,GAAI,CAAC,EAAE,OAAO,CAAC,KAAG,GAAG,CAAC,CAAC,CAA2B,CAAC;AAEnE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,CAMvD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KAAG,CAAC,GAAG,IAC1B,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,OAAO,GAAI,CAAC,EAAE,CAAC,EAC1B,IAAI,MAAM,CAAC,EACX,UAAU,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,KAC9B,MAAM,CAAC,CAAC,EAAE,CAAC,CAMb,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,eAAO,MAAM,QAAQ,GAAU,CAAC,EAAE,CAAC,EACjC,WAAW,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,UAAU,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC,KAC9B,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAIpB,CAAC"}
|
package/dist/src/Sqlite.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Brand } from "./Brand.js";
|
|
2
2
|
import { ConsoleDep } from "./Console.js";
|
|
3
3
|
import { EncryptionKey } from "./Crypto.js";
|
|
4
|
+
import { Eq } from "./Eq.js";
|
|
4
5
|
import { TransferableError } from "./Error.js";
|
|
5
6
|
import { Result } from "./Result.js";
|
|
6
7
|
import { SimpleName } from "./Type.js";
|
|
@@ -18,8 +19,8 @@ export interface CreateSqliteDriverDep {
|
|
|
18
19
|
readonly createSqliteDriver: CreateSqliteDriver;
|
|
19
20
|
}
|
|
20
21
|
export interface SqliteDriverOptions {
|
|
21
|
-
memory?: boolean;
|
|
22
|
-
encryptionKey?: EncryptionKey | undefined;
|
|
22
|
+
readonly memory?: boolean;
|
|
23
|
+
readonly encryptionKey?: EncryptionKey | undefined;
|
|
23
24
|
}
|
|
24
25
|
/**
|
|
25
26
|
* Cross-platform SQLite abstraction.
|
|
@@ -49,7 +50,7 @@ export interface SqliteQuery {
|
|
|
49
50
|
readonly options?: SqliteQueryOptions;
|
|
50
51
|
}
|
|
51
52
|
/** A type representing a sanitized SQL string. */
|
|
52
|
-
export type SafeSql = string & Brand<"
|
|
53
|
+
export type SafeSql = string & Brand<"SafeSql">;
|
|
53
54
|
/**
|
|
54
55
|
* A value that can be stored in Sqlite.
|
|
55
56
|
*
|
|
@@ -58,6 +59,7 @@ export type SafeSql = string & Brand<"TimestampString">;
|
|
|
58
59
|
*/
|
|
59
60
|
export declare const SqliteValue: import("./Type.js").UnionType<[import("./Type.js").Type<"Null", null, null, import("./Type.js").NullError, null, import("./Type.js").NullError>, import("./Type.js").Type<"String", string, string, import("./Type.js").StringError, string, import("./Type.js").StringError>, import("./Type.js").Type<"Number", number, number, import("./Type.js").NumberError, number, import("./Type.js").NumberError>, import("./Type.js").Type<"Uint8Array", Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, import("./Type.js").Uint8ArrayError, Uint8Array<ArrayBufferLike>, import("./Type.js").Uint8ArrayError>]>;
|
|
60
61
|
export type SqliteValue = typeof SqliteValue.Type;
|
|
62
|
+
export declare const eqSqliteValue: Eq<SqliteValue>;
|
|
61
63
|
export interface SqliteQueryOptions {
|
|
62
64
|
/**
|
|
63
65
|
* If set to `true`, logs the time taken to execute the SQL query. Useful for
|
|
@@ -103,12 +105,12 @@ export interface PreparedStatements<P> extends Disposable {
|
|
|
103
105
|
}
|
|
104
106
|
export declare const createPreparedStatementsCache: <P>(factory: (sql: SafeSql) => P, disposeFn: (statement: P) => void) => PreparedStatements<P>;
|
|
105
107
|
export interface SqlIdentifier {
|
|
106
|
-
type: "SqlIdentifier";
|
|
107
|
-
sql: SafeSql;
|
|
108
|
+
readonly type: "SqlIdentifier";
|
|
109
|
+
readonly sql: SafeSql;
|
|
108
110
|
}
|
|
109
111
|
export interface RawSql {
|
|
110
|
-
type: "RawSql";
|
|
111
|
-
sql: string;
|
|
112
|
+
readonly type: "RawSql";
|
|
113
|
+
readonly sql: string;
|
|
112
114
|
}
|
|
113
115
|
export type SqlTemplateParam = SqliteValue | SqlIdentifier | RawSql;
|
|
114
116
|
/**
|
package/dist/src/Sqlite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../../src/Sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAA2B,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAW,MAAM,EAAqB,MAAM,aAAa,CAAC;AACjE,OAAO,EAIL,UAAU,EAIX,MAAM,WAAW,CAAC;AACnB,OAAO,EAAoB,SAAS,EAAE,MAAM,YAAY,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,YAAa,SAAQ,UAAU;IAC9C,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,KAAK,gBAAgB,CAAC;IAC7E,QAAQ,CAAC,MAAM,EAAE,MAAM,UAAU,CAAC;CACnC;AAED,MAAM,MAAM,kBAAkB,GAAG,CAC/B,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,mBAAmB,KAC1B,OAAO,CAAC,YAAY,CAAC,CAAC;AAE3B,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;CACjD;AAED,MAAM,WAAW,mBAAmB;IAClC,MAAM,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Sqlite.d.ts","sourceRoot":"","sources":["../../src/Sqlite.ts"],"names":[],"mappings":"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"}
|