@evolu/common 8.9.0 → 8.11.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/Bytes.d.ts +647 -0
- package/dist/src/Bytes.d.ts.map +1 -0
- package/dist/src/{Binary.js → Bytes.js} +266 -16
- package/dist/src/Config.d.ts +142 -0
- package/dist/src/Config.d.ts.map +1 -0
- package/dist/src/Config.js +181 -0
- package/dist/src/Console.d.ts +62 -7
- package/dist/src/Console.d.ts.map +1 -1
- package/dist/src/Console.js +20 -4
- package/dist/src/Crypto.d.ts +76 -4
- package/dist/src/Crypto.d.ts.map +1 -1
- package/dist/src/Crypto.js +55 -4
- package/dist/src/Error.d.ts +45 -0
- package/dist/src/Error.d.ts.map +1 -1
- package/dist/src/Error.js +69 -0
- package/dist/src/Fs.d.ts +376 -0
- package/dist/src/Fs.d.ts.map +1 -0
- package/dist/src/Fs.js +113 -0
- package/dist/src/Identicon.d.ts +2 -2
- package/dist/src/Identicon.js +2 -2
- package/dist/src/LeakDetector.d.ts +22 -3
- package/dist/src/LeakDetector.d.ts.map +1 -1
- package/dist/src/LeakDetector.js +12 -2
- package/dist/src/LockManager.d.ts +8 -0
- package/dist/src/LockManager.d.ts.map +1 -1
- package/dist/src/LockManager.js +6 -0
- package/dist/src/Number.d.ts +50 -7
- package/dist/src/Number.d.ts.map +1 -1
- package/dist/src/Number.js +47 -8
- package/dist/src/Object.d.ts +32 -0
- package/dist/src/Object.d.ts.map +1 -1
- package/dist/src/Object.js +46 -0
- package/dist/src/Platform.d.ts +47 -7
- package/dist/src/Platform.d.ts.map +1 -1
- package/dist/src/Platform.js +24 -5
- package/dist/src/Random.d.ts +25 -2
- package/dist/src/Random.d.ts.map +1 -1
- package/dist/src/Random.js +14 -2
- package/dist/src/Resource.d.ts +156 -1
- package/dist/src/Resource.d.ts.map +1 -1
- package/dist/src/Resource.js +201 -72
- package/dist/src/Schedule.d.ts +11 -10
- package/dist/src/Schedule.d.ts.map +1 -1
- package/dist/src/Schedule.js +1 -1
- package/dist/src/Sqlite.d.ts +132 -16
- package/dist/src/Sqlite.d.ts.map +1 -1
- package/dist/src/Sqlite.js +64 -10
- package/dist/src/Task.d.ts +15 -4
- package/dist/src/Task.d.ts.map +1 -1
- package/dist/src/Task.js +41 -15
- package/dist/src/Test.d.ts +9 -0
- package/dist/src/Test.d.ts.map +1 -1
- package/dist/src/Test.js +4 -0
- package/dist/src/Time.d.ts +179 -20
- package/dist/src/Time.d.ts.map +1 -1
- package/dist/src/Time.js +95 -6
- package/dist/src/Type.d.ts +3056 -1539
- package/dist/src/Type.d.ts.map +1 -1
- package/dist/src/Type.js +2548 -584
- package/dist/src/WebSocket.d.ts +164 -13
- package/dist/src/WebSocket.d.ts.map +1 -1
- package/dist/src/WebSocket.js +133 -24
- package/dist/src/Worker.d.ts +90 -8
- package/dist/src/Worker.d.ts.map +1 -1
- package/dist/src/Worker.js +28 -2
- package/dist/src/index.d.ts +9 -8
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -4
- package/dist/src/intl/_en.d.ts +24 -1
- package/dist/src/intl/_en.d.ts.map +1 -1
- package/dist/src/intl/_en.js +20 -0
- package/dist/src/intl/ar.d.ts +24 -1
- package/dist/src/intl/ar.d.ts.map +1 -1
- package/dist/src/intl/ar.js +20 -0
- package/dist/src/intl/bn.d.ts +24 -1
- package/dist/src/intl/bn.d.ts.map +1 -1
- package/dist/src/intl/bn.js +20 -0
- package/dist/src/intl/ca.d.ts +24 -1
- package/dist/src/intl/ca.d.ts.map +1 -1
- package/dist/src/intl/ca.js +20 -0
- package/dist/src/intl/cs.d.ts +24 -1
- package/dist/src/intl/cs.d.ts.map +1 -1
- package/dist/src/intl/cs.js +20 -0
- package/dist/src/intl/da.d.ts +24 -1
- package/dist/src/intl/da.d.ts.map +1 -1
- package/dist/src/intl/da.js +20 -0
- package/dist/src/intl/de.d.ts +24 -1
- package/dist/src/intl/de.d.ts.map +1 -1
- package/dist/src/intl/de.js +20 -0
- package/dist/src/intl/el.d.ts +24 -1
- package/dist/src/intl/el.d.ts.map +1 -1
- package/dist/src/intl/el.js +20 -0
- package/dist/src/intl/es.d.ts +24 -1
- package/dist/src/intl/es.d.ts.map +1 -1
- package/dist/src/intl/es.js +20 -0
- package/dist/src/intl/fa.d.ts +24 -1
- package/dist/src/intl/fa.d.ts.map +1 -1
- package/dist/src/intl/fa.js +20 -0
- package/dist/src/intl/fi.d.ts +24 -1
- package/dist/src/intl/fi.d.ts.map +1 -1
- package/dist/src/intl/fi.js +20 -0
- package/dist/src/intl/fil.d.ts +24 -1
- package/dist/src/intl/fil.d.ts.map +1 -1
- package/dist/src/intl/fil.js +20 -0
- package/dist/src/intl/fr.d.ts +24 -1
- package/dist/src/intl/fr.d.ts.map +1 -1
- package/dist/src/intl/fr.js +20 -0
- package/dist/src/intl/he.d.ts +24 -1
- package/dist/src/intl/he.d.ts.map +1 -1
- package/dist/src/intl/he.js +20 -0
- package/dist/src/intl/hi.d.ts +24 -1
- package/dist/src/intl/hi.d.ts.map +1 -1
- package/dist/src/intl/hi.js +20 -0
- package/dist/src/intl/hr.d.ts +24 -1
- package/dist/src/intl/hr.d.ts.map +1 -1
- package/dist/src/intl/hr.js +20 -0
- package/dist/src/intl/hu.d.ts +22 -1
- package/dist/src/intl/hu.d.ts.map +1 -1
- package/dist/src/intl/hu.js +18 -0
- package/dist/src/intl/id.d.ts +24 -1
- package/dist/src/intl/id.d.ts.map +1 -1
- package/dist/src/intl/id.js +20 -0
- package/dist/src/intl/it.d.ts +24 -1
- package/dist/src/intl/it.d.ts.map +1 -1
- package/dist/src/intl/it.js +20 -0
- package/dist/src/intl/ja.d.ts +24 -1
- package/dist/src/intl/ja.d.ts.map +1 -1
- package/dist/src/intl/ja.js +20 -0
- package/dist/src/intl/ko.d.ts +24 -1
- package/dist/src/intl/ko.d.ts.map +1 -1
- package/dist/src/intl/ko.js +20 -0
- package/dist/src/intl/ml.d.ts +24 -1
- package/dist/src/intl/ml.d.ts.map +1 -1
- package/dist/src/intl/ml.js +20 -0
- package/dist/src/intl/mr.d.ts +24 -1
- package/dist/src/intl/mr.d.ts.map +1 -1
- package/dist/src/intl/mr.js +20 -0
- package/dist/src/intl/ms.d.ts +24 -1
- package/dist/src/intl/ms.d.ts.map +1 -1
- package/dist/src/intl/ms.js +20 -0
- package/dist/src/intl/nb.d.ts +22 -1
- package/dist/src/intl/nb.d.ts.map +1 -1
- package/dist/src/intl/nb.js +18 -0
- package/dist/src/intl/nl.d.ts +24 -1
- package/dist/src/intl/nl.d.ts.map +1 -1
- package/dist/src/intl/nl.js +20 -0
- package/dist/src/intl/pa.d.ts +24 -1
- package/dist/src/intl/pa.d.ts.map +1 -1
- package/dist/src/intl/pa.js +20 -0
- package/dist/src/intl/pl.d.ts +23 -0
- package/dist/src/intl/pl.d.ts.map +1 -1
- package/dist/src/intl/pl.js +20 -0
- package/dist/src/intl/pt-BR.d.ts +24 -1
- package/dist/src/intl/pt-BR.d.ts.map +1 -1
- package/dist/src/intl/pt-BR.js +20 -0
- package/dist/src/intl/pt.d.ts +24 -1
- package/dist/src/intl/pt.d.ts.map +1 -1
- package/dist/src/intl/pt.js +20 -0
- package/dist/src/intl/ro.d.ts +24 -1
- package/dist/src/intl/ro.d.ts.map +1 -1
- package/dist/src/intl/ro.js +20 -0
- package/dist/src/intl/sk.d.ts +24 -1
- package/dist/src/intl/sk.d.ts.map +1 -1
- package/dist/src/intl/sk.js +20 -0
- package/dist/src/intl/sl.d.ts +24 -1
- package/dist/src/intl/sl.d.ts.map +1 -1
- package/dist/src/intl/sl.js +20 -0
- package/dist/src/intl/sv.d.ts +24 -1
- package/dist/src/intl/sv.d.ts.map +1 -1
- package/dist/src/intl/sv.js +20 -0
- package/dist/src/intl/sw.d.ts +21 -0
- package/dist/src/intl/sw.d.ts.map +1 -1
- package/dist/src/intl/sw.js +18 -0
- package/dist/src/intl/ta.d.ts +24 -1
- package/dist/src/intl/ta.d.ts.map +1 -1
- package/dist/src/intl/ta.js +20 -0
- package/dist/src/intl/te.d.ts +24 -1
- package/dist/src/intl/te.d.ts.map +1 -1
- package/dist/src/intl/te.js +20 -0
- package/dist/src/intl/th.d.ts +24 -1
- package/dist/src/intl/th.d.ts.map +1 -1
- package/dist/src/intl/th.js +20 -0
- package/dist/src/intl/tr.d.ts +24 -1
- package/dist/src/intl/tr.d.ts.map +1 -1
- package/dist/src/intl/tr.js +20 -0
- package/dist/src/intl/uk.d.ts +80 -57
- package/dist/src/intl/uk.d.ts.map +1 -1
- package/dist/src/intl/uk.js +174 -149
- package/dist/src/intl/ur.d.ts +24 -1
- package/dist/src/intl/ur.d.ts.map +1 -1
- package/dist/src/intl/ur.js +20 -0
- package/dist/src/intl/vi.d.ts +24 -1
- package/dist/src/intl/vi.d.ts.map +1 -1
- package/dist/src/intl/vi.js +20 -0
- package/dist/src/intl/zh-CN.d.ts +24 -1
- package/dist/src/intl/zh-CN.d.ts.map +1 -1
- package/dist/src/intl/zh-CN.js +20 -0
- package/dist/src/intl/zh-TW.d.ts +24 -1
- package/dist/src/intl/zh-TW.d.ts.map +1 -1
- package/dist/src/intl/zh-TW.js +20 -0
- package/dist/src/local-first/Db.d.ts +52 -3
- package/dist/src/local-first/Db.d.ts.map +1 -1
- package/dist/src/local-first/Db.js +412 -137
- package/dist/src/local-first/Evolu.d.ts +336 -211
- package/dist/src/local-first/Evolu.d.ts.map +1 -1
- package/dist/src/local-first/Evolu.js +102 -15
- package/dist/src/local-first/Owner.d.ts +13 -30
- package/dist/src/local-first/Owner.d.ts.map +1 -1
- package/dist/src/local-first/Owner.js +13 -30
- package/dist/src/local-first/Protocol.d.ts +95 -17
- package/dist/src/local-first/Protocol.d.ts.map +1 -1
- package/dist/src/local-first/Protocol.js +119 -39
- package/dist/src/local-first/Query.d.ts +8 -15
- package/dist/src/local-first/Query.d.ts.map +1 -1
- package/dist/src/local-first/Schema.d.ts +345 -21
- package/dist/src/local-first/Schema.d.ts.map +1 -1
- package/dist/src/local-first/Schema.js +214 -17
- package/dist/src/local-first/Shared.d.ts +537 -22
- package/dist/src/local-first/Shared.d.ts.map +1 -1
- package/dist/src/local-first/Shared.js +1437 -234
- package/dist/src/local-first/Storage.d.ts +192 -14
- package/dist/src/local-first/Storage.d.ts.map +1 -1
- package/dist/src/local-first/Storage.js +82 -21
- package/dist/src/local-first/Timestamp.d.ts +392 -41
- package/dist/src/local-first/Timestamp.d.ts.map +1 -1
- package/dist/src/local-first/Timestamp.js +404 -82
- package/dist/src/local-first/index.d.ts +0 -1
- package/dist/src/local-first/index.d.ts.map +1 -1
- package/dist/src/local-first/index.js +0 -1
- package/package.json +1 -1
- package/src/Assert.test.ts +2 -5
- package/src/{Binary.test.ts → Bytes.test.ts} +286 -1
- package/src/{Binary.ts → Bytes.ts} +652 -21
- package/src/Config.test.ts +668 -0
- package/src/Config.ts +410 -0
- package/src/Console.ts +62 -7
- package/src/Crypto.ts +76 -4
- package/src/Eq.test.ts +2 -3
- package/src/Error.test.ts +76 -3
- package/src/Error.ts +71 -0
- package/src/Fs.test.ts +105 -0
- package/src/Fs.ts +488 -0
- package/src/Identicon.ts +2 -2
- package/src/LeakDetector.ts +22 -3
- package/src/LockManager.ts +8 -0
- package/src/Number.test.ts +82 -18
- package/src/Number.ts +76 -8
- package/src/Object.test.ts +139 -10
- package/src/Object.ts +49 -0
- package/src/Platform.ts +50 -8
- package/src/Random.ts +25 -2
- package/src/Resource.test.ts +837 -0
- package/src/Resource.ts +235 -15
- package/src/Schedule.test.ts +50 -12
- package/src/Schedule.ts +24 -14
- package/src/Sqlite.ts +138 -18
- package/src/Task.test.ts +189 -8
- package/src/Task.ts +56 -17
- package/src/Test.ts +9 -0
- package/src/Time.test.ts +82 -11
- package/src/Time.ts +246 -24
- package/src/Type.test.ts +3994 -1119
- package/src/Type.ts +7258 -3842
- package/src/Types.test.ts +4 -14
- package/src/WebSocket.ts +313 -40
- package/src/Worker.ts +90 -8
- package/src/index.ts +18 -7
- package/src/intl/_en.ts +70 -0
- package/src/intl/ar.ts +71 -0
- package/src/intl/bn.ts +70 -0
- package/src/intl/ca.ts +70 -0
- package/src/intl/cs.ts +70 -0
- package/src/intl/da.ts +70 -0
- package/src/intl/de.ts +70 -0
- package/src/intl/el.ts +70 -0
- package/src/intl/es.ts +70 -0
- package/src/intl/fa.ts +70 -0
- package/src/intl/fi.ts +70 -0
- package/src/intl/fil.ts +70 -0
- package/src/intl/fr.ts +70 -0
- package/src/intl/he.ts +70 -0
- package/src/intl/hi.ts +70 -0
- package/src/intl/hr.ts +70 -0
- package/src/intl/hu.ts +69 -0
- package/src/intl/id.ts +70 -0
- package/src/intl/intl.test.ts +819 -1
- package/src/intl/it.ts +70 -0
- package/src/intl/ja.ts +70 -0
- package/src/intl/ko.ts +68 -0
- package/src/intl/ml.ts +70 -0
- package/src/intl/mr.ts +70 -0
- package/src/intl/ms.ts +71 -0
- package/src/intl/nb.ts +69 -0
- package/src/intl/nl.ts +70 -0
- package/src/intl/pa.ts +70 -0
- package/src/intl/pl.ts +63 -0
- package/src/intl/pt-BR.ts +70 -0
- package/src/intl/pt.ts +71 -0
- package/src/intl/ro.ts +70 -0
- package/src/intl/sk.ts +71 -0
- package/src/intl/sl.ts +70 -0
- package/src/intl/sv.ts +70 -0
- package/src/intl/sw.ts +62 -0
- package/src/intl/ta.ts +70 -0
- package/src/intl/te.ts +70 -0
- package/src/intl/th.ts +68 -0
- package/src/intl/tr.ts +70 -0
- package/src/intl/uk.ts +228 -155
- package/src/intl/ur.ts +70 -0
- package/src/intl/vi.ts +70 -0
- package/src/intl/zh-CN.ts +68 -0
- package/src/intl/zh-TW.ts +68 -0
- package/src/local-first/Db.ts +644 -339
- package/src/local-first/Evolu.test.ts +686 -21
- package/src/local-first/Evolu.ts +450 -228
- package/src/local-first/Owner.ts +13 -30
- package/src/local-first/Protocol.test.ts +618 -11
- package/src/local-first/Protocol.ts +197 -73
- package/src/local-first/Query.ts +8 -15
- package/src/local-first/Schema.test.ts +143 -0
- package/src/local-first/Schema.ts +374 -24
- package/src/local-first/Shared.test.ts +7731 -559
- package/src/local-first/Shared.ts +2036 -267
- package/src/local-first/Storage.ts +219 -33
- package/src/local-first/Timestamp.test.ts +344 -70
- package/src/local-first/Timestamp.ts +435 -119
- package/src/local-first/index.ts +0 -1
- package/dist/src/Binary.d.ts +0 -254
- package/dist/src/Binary.d.ts.map +0 -1
- package/dist/src/local-first/Error.d.ts +0 -12
- package/dist/src/local-first/Error.d.ts.map +0 -1
- package/dist/src/local-first/Error.js +0 -6
- package/dist/src/local-first/LocalAuth.d.ts +0 -150
- package/dist/src/local-first/LocalAuth.d.ts.map +0 -1
- package/dist/src/local-first/LocalAuth.js +0 -179
- package/src/local-first/Error.ts +0 -17
- package/src/local-first/LocalAuth.ts +0 -457
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strict configuration Types with explicit application policy.
|
|
3
|
+
*
|
|
4
|
+
* Decode configuration at startup, then pass validated values to constructors
|
|
5
|
+
* or Tasks. The application decides how to load configuration, combine sources,
|
|
6
|
+
* and apply defaults. Declare defaults with {@link withDefault}, or use `??`
|
|
7
|
+
* where a value is consumed. Invalid supplied values still fail decoding.
|
|
8
|
+
*
|
|
9
|
+
* Resolve source precedence before replacing absence with defaults. If a source
|
|
10
|
+
* Type already provides defaults and later composition needs to distinguish
|
|
11
|
+
* them from supplied values, use `strategy: "preserve"` and inspect
|
|
12
|
+
* `defaultUsed` explicitly. Preserving this evidence does not choose a merging
|
|
13
|
+
* policy: the application still decides which source wins.
|
|
14
|
+
*
|
|
15
|
+
* {@link env} creates a pure, reversible codec. It does not read global state,
|
|
16
|
+
* load files, merge sources, or introduce a Run dependency. Tests can pass
|
|
17
|
+
* ordinary objects; a Node.js entry point can pass `process.env`.
|
|
18
|
+
*
|
|
19
|
+
* @module
|
|
20
|
+
*/
|
|
21
|
+
import { assert } from "./Assert.js";
|
|
22
|
+
import { createMutableRecord, filterObjectKeys, isPlainObject, } from "./Object.js";
|
|
23
|
+
import { ok } from "./Result.js";
|
|
24
|
+
import { CamelCaseIdentifier, camelCaseToConstantCase, ConstantCaseIdentifier, EvoluType, maxLength, object, objectKeys, String, transform, Unknown, } from "./Type.js";
|
|
25
|
+
/**
|
|
26
|
+
* An environment variable name in Evolu's configuration convention.
|
|
27
|
+
*
|
|
28
|
+
* Names are {@link ConstantCaseIdentifier}s of at most 255 characters, including
|
|
29
|
+
* the application prefix. This is an Evolu convention, not an operating-system
|
|
30
|
+
* limit. Double underscores do not introduce nesting.
|
|
31
|
+
*
|
|
32
|
+
* ### Example
|
|
33
|
+
*
|
|
34
|
+
* ```ts
|
|
35
|
+
* import { assertErr, assertOk, EnvName } from "@evolu/common";
|
|
36
|
+
*
|
|
37
|
+
* assertOk(
|
|
38
|
+
* EnvName.fromUnknown("APP_MAX_OWNER_BYTES"),
|
|
39
|
+
* "APP_MAX_OWNER_BYTES",
|
|
40
|
+
* );
|
|
41
|
+
* assertErr(EnvName.fromUnknown("APP_maxOwnerBytes"));
|
|
42
|
+
* assertErr(EnvName.fromUnknown("APP_DB__PORT"));
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export const EnvName = /*#__PURE__*/ maxLength(255)(ConstantCaseIdentifier);
|
|
46
|
+
/**
|
|
47
|
+
* Creates a reversible environment-variable codec with a flat decoded output.
|
|
48
|
+
*
|
|
49
|
+
* Declare camelCase fields directly, or put them in one-level CONSTANT_CASE
|
|
50
|
+
* namespace groups. A direct `port` field reads `PORT`; a `maxOwnerBytes` field
|
|
51
|
+
* in an `EVOLU_RELAY` group reads `EVOLU_RELAY_MAX_OWNER_BYTES`. Groups affect
|
|
52
|
+
* external names only. Duplicate decoded fields or encoded names are rejected
|
|
53
|
+
* during construction, even when their Types are identical.
|
|
54
|
+
*
|
|
55
|
+
* Selects exact declared unprefixed names and all keys within declared
|
|
56
|
+
* namespaces. Namespace selection ignores casing so incorrectly cased names
|
|
57
|
+
* fail validation instead of being ignored. Selected names must match their
|
|
58
|
+
* exact declared spelling. Unrelated variables are ignored; misspelled
|
|
59
|
+
* unprefixed names or namespace prefixes can therefore still look absent.
|
|
60
|
+
*
|
|
61
|
+
* Field Types must encode to strings. Optional fields may be absent, but
|
|
62
|
+
* explicit `undefined` values are rejected. Empty strings remain present and
|
|
63
|
+
* must satisfy the field Type. Compose {@link withDefault} to supply defaults.
|
|
64
|
+
* Encoding emits canonical external names and string values, preserving absence
|
|
65
|
+
* when the field codec does. Errors retain external names and nested paths.
|
|
66
|
+
*
|
|
67
|
+
* Reads own string properties from any non-null object, including
|
|
68
|
+
* `process.env`. Selected properties must be enumerable data properties;
|
|
69
|
+
* getters are never read. Prototypes and internal contents such as Map entries
|
|
70
|
+
* are ignored. Non-object inputs fail with standard object errors. Schema names
|
|
71
|
+
* must satisfy {@link EnvName}; groups cannot be nested. Loading and source
|
|
72
|
+
* precedence remain explicit application code.
|
|
73
|
+
*
|
|
74
|
+
* ### Example
|
|
75
|
+
*
|
|
76
|
+
* ```ts
|
|
77
|
+
* import {
|
|
78
|
+
* assertEqual,
|
|
79
|
+
* assertErr,
|
|
80
|
+
* assertOk,
|
|
81
|
+
* assertType,
|
|
82
|
+
* ByteSizeLiteral,
|
|
83
|
+
* env,
|
|
84
|
+
* optional,
|
|
85
|
+
* Port,
|
|
86
|
+
* PortFromString,
|
|
87
|
+
* withDefault,
|
|
88
|
+
* } from "@evolu/common";
|
|
89
|
+
*
|
|
90
|
+
* const RelayEnv = env({
|
|
91
|
+
* port: withDefault(optional(PortFromString), Port.orThrow(4000)),
|
|
92
|
+
* EVOLU_RELAY: {
|
|
93
|
+
* maxOwnerBytes: optional(ByteSizeLiteral),
|
|
94
|
+
* },
|
|
95
|
+
* });
|
|
96
|
+
*
|
|
97
|
+
* const result = RelayEnv.fromUnknown({
|
|
98
|
+
* PORT: "04000",
|
|
99
|
+
* EVOLU_RELAY_MAX_OWNER_BYTES: "512KiB",
|
|
100
|
+
* HOME: "/home/evolu",
|
|
101
|
+
* });
|
|
102
|
+
*
|
|
103
|
+
* assertOk(result, { port: 4000, maxOwnerBytes: "512KiB" });
|
|
104
|
+
* assertType<typeof result.value.port, Port>();
|
|
105
|
+
* assertEqual(RelayEnv.to(result.value), {
|
|
106
|
+
* PORT: "4000",
|
|
107
|
+
* EVOLU_RELAY_MAX_OWNER_BYTES: "512KiB",
|
|
108
|
+
* });
|
|
109
|
+
*
|
|
110
|
+
* assertOk(RelayEnv.fromUnknown({}), { port: 4000 });
|
|
111
|
+
* assertErr(RelayEnv.fromUnknown({ PORT: "" }));
|
|
112
|
+
* assertErr(RelayEnv.fromUnknown({ EVOLU_RELAY_MAX_OWENR_BYTES: "1MiB" }));
|
|
113
|
+
* assertErr(RelayEnv.fromUnknown({ evolu_relay_max_owner_bytes: "1MiB" }));
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
export const env = (props, ..._validation) => {
|
|
117
|
+
assert(isPlainObject(props), "Environment properties must be a plain object.");
|
|
118
|
+
const flat = createMutableRecord();
|
|
119
|
+
const inputNameByOutputName = new Map();
|
|
120
|
+
const outputNameByInputName = new Map();
|
|
121
|
+
const prefixes = [];
|
|
122
|
+
const unprefixedNames = new Set();
|
|
123
|
+
for (const rootName of Reflect.ownKeys(props)) {
|
|
124
|
+
const descriptor = Object.getOwnPropertyDescriptor(props, rootName);
|
|
125
|
+
assert(typeof rootName === "string" &&
|
|
126
|
+
descriptor.enumerable &&
|
|
127
|
+
"value" in descriptor, "Environment properties must be enumerable string data properties.");
|
|
128
|
+
const grouped = ConstantCaseIdentifier.is(rootName);
|
|
129
|
+
assert(grouped || CamelCaseIdentifier.is(rootName), `Invalid environment schema name ${JSON.stringify(rootName)}. Expected a camelCase field or CONSTANT_CASE namespace.`);
|
|
130
|
+
const rootValue = descriptor.value;
|
|
131
|
+
const fields = grouped ? rootValue : { [rootName]: rootValue };
|
|
132
|
+
assert(isPlainObject(fields) && !EvoluType.is(fields), "Environment groups must be plain objects containing fields.");
|
|
133
|
+
if (grouped) {
|
|
134
|
+
assert(EnvName.is(rootName + "_A"), `Invalid environment namespace ${JSON.stringify(rootName)}. Names must fit within 255 characters.`);
|
|
135
|
+
prefixes.push(rootName + "_");
|
|
136
|
+
}
|
|
137
|
+
for (const name of Reflect.ownKeys(fields)) {
|
|
138
|
+
const field = Object.getOwnPropertyDescriptor(fields, name);
|
|
139
|
+
assert(typeof name === "string" && field.enumerable && "value" in field, "Environment fields must be enumerable string data properties.");
|
|
140
|
+
assert(CamelCaseIdentifier.is(name), `Invalid environment field ${JSON.stringify(name)}. Expected a camelCase identifier; groups cannot be nested.`);
|
|
141
|
+
assert(!inputNameByOutputName.has(name), `Duplicate environment field ${JSON.stringify(name)}.`);
|
|
142
|
+
const encoded = (grouped ? rootName + "_" : "") + camelCaseToConstantCase(name);
|
|
143
|
+
assert(EnvName.is(encoded), `Invalid environment schema name ${JSON.stringify(encoded)}. Expected a CONSTANT_CASE identifier of at most 255 characters.`);
|
|
144
|
+
assert(!outputNameByInputName.has(encoded), `Duplicate environment variable ${JSON.stringify(encoded)}.`);
|
|
145
|
+
const property = field.value;
|
|
146
|
+
const fieldType = EvoluType.is(property)
|
|
147
|
+
? property
|
|
148
|
+
: isPlainObject(property)
|
|
149
|
+
? Object.getOwnPropertyDescriptor(property, "type")?.value
|
|
150
|
+
: undefined;
|
|
151
|
+
assert(EvoluType.is(fieldType), `Invalid environment field ${JSON.stringify(name)}. Expected a Type or optional/defaulted property; groups must use CONSTANT_CASE names.`);
|
|
152
|
+
flat[name] = property;
|
|
153
|
+
inputNameByOutputName.set(name, encoded);
|
|
154
|
+
outputNameByInputName.set(encoded, name);
|
|
155
|
+
if (!grouped)
|
|
156
|
+
unprefixedNames.add(encoded);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
// Runtime construction validates the flattened fields; the public signature
|
|
160
|
+
// checks their concrete Types and string encodings before flattening.
|
|
161
|
+
const output = object(flat);
|
|
162
|
+
const key = transform("EnvKey", String, CamelCaseIdentifier, {
|
|
163
|
+
// Identity fallback keeps this exposed codec round-trippable for other
|
|
164
|
+
// valid camelCase identifiers. objectKeys accepts only declared fields.
|
|
165
|
+
from: (value) => ok(outputNameByInputName.get(value) ?? value),
|
|
166
|
+
to: (value) => inputNameByOutputName.get(value) ?? value,
|
|
167
|
+
});
|
|
168
|
+
const withKeys = objectKeys(key)(output);
|
|
169
|
+
const type = transform("Env", Unknown, withKeys, {
|
|
170
|
+
from: (value) => {
|
|
171
|
+
if (typeof value !== "object" || value === null)
|
|
172
|
+
return ok(value);
|
|
173
|
+
return ok(filterObjectKeys(value, (key) => unprefixedNames.has(key) ||
|
|
174
|
+
prefixes.some((prefix) => key.toUpperCase().startsWith(prefix))));
|
|
175
|
+
},
|
|
176
|
+
to: (value) => value,
|
|
177
|
+
});
|
|
178
|
+
// The maps preserve each field's name and codec; only the static flattening
|
|
179
|
+
// cannot be expressed by the runtime loops above.
|
|
180
|
+
return type;
|
|
181
|
+
};
|
package/dist/src/Console.d.ts
CHANGED
|
@@ -82,6 +82,7 @@ import { type Millis, type TimeDep } from "./Time.ts";
|
|
|
82
82
|
* For testing, use {@link testCreateConsole} which creates a {@link TestConsole}
|
|
83
83
|
* with array output and snapshot helpers.
|
|
84
84
|
*
|
|
85
|
+
* @group Core
|
|
85
86
|
* @see {@link createConsole}
|
|
86
87
|
*/
|
|
87
88
|
export interface Console {
|
|
@@ -145,6 +146,11 @@ export interface Console {
|
|
|
145
146
|
*/
|
|
146
147
|
readonly write: (entry: ConsoleEntry) => void;
|
|
147
148
|
}
|
|
149
|
+
/**
|
|
150
|
+
* Dependency wrapper for {@link Console}.
|
|
151
|
+
*
|
|
152
|
+
* @group Core
|
|
153
|
+
*/
|
|
148
154
|
export interface ConsoleDep {
|
|
149
155
|
readonly console: Console;
|
|
150
156
|
}
|
|
@@ -161,6 +167,8 @@ export interface ConsoleDep {
|
|
|
161
167
|
* - `"warn"` — Recoverable issues that may need attention
|
|
162
168
|
* - `"error"` — Failures requiring immediate attention
|
|
163
169
|
* - `"silent"` — Disables all logging
|
|
170
|
+
*
|
|
171
|
+
* @group Core
|
|
164
172
|
*/
|
|
165
173
|
export type ConsoleLevel = "trace" | "debug" | "log" | "info" | "warn" | "error" | "silent";
|
|
166
174
|
/**
|
|
@@ -168,6 +176,8 @@ export type ConsoleLevel = "trace" | "debug" | "log" | "info" | "warn" | "error"
|
|
|
168
176
|
*
|
|
169
177
|
* Contains all information needed for outputs to route the log: method for
|
|
170
178
|
* routing, path for context, and the original arguments.
|
|
179
|
+
*
|
|
180
|
+
* @group Core
|
|
171
181
|
*/
|
|
172
182
|
export interface ConsoleEntry {
|
|
173
183
|
/** The console method that was called. */
|
|
@@ -182,6 +192,8 @@ export interface ConsoleEntry {
|
|
|
182
192
|
*
|
|
183
193
|
* Used in {@link ConsoleEntry} to identify which console method was invoked.
|
|
184
194
|
* Outputs can route or format differently based on the method.
|
|
195
|
+
*
|
|
196
|
+
* @group Core
|
|
185
197
|
*/
|
|
186
198
|
export type ConsoleMethod = "trace" | "debug" | "log" | "info" | "warn" | "error" | "dir" | "table" | "time" | "timeLog" | "timeEnd" | "count" | "countReset";
|
|
187
199
|
/**
|
|
@@ -191,6 +203,8 @@ export type ConsoleMethod = "trace" | "debug" | "log" | "info" | "warn" | "error
|
|
|
191
203
|
* array for testing, etc.).
|
|
192
204
|
*
|
|
193
205
|
* Use {@link createNativeConsoleOutput} for native console output.
|
|
206
|
+
*
|
|
207
|
+
* @group Output
|
|
194
208
|
*/
|
|
195
209
|
export interface ConsoleOutput {
|
|
196
210
|
/** Write a log entry to this output. */
|
|
@@ -201,9 +215,15 @@ export interface ConsoleOutput {
|
|
|
201
215
|
*
|
|
202
216
|
* Used by {@link ConsoleConfig.formatter} and {@link ConsoleOutput.write}. Create
|
|
203
217
|
* one with {@link createConsoleFormatter}.
|
|
218
|
+
*
|
|
219
|
+
* @group Output
|
|
204
220
|
*/
|
|
205
221
|
export type ConsoleFormatter = (entry: ConsoleEntry) => ReadonlyArray<unknown>;
|
|
206
|
-
/**
|
|
222
|
+
/**
|
|
223
|
+
* Configuration for {@link createConsole}.
|
|
224
|
+
*
|
|
225
|
+
* @group Core
|
|
226
|
+
*/
|
|
207
227
|
export interface ConsoleConfig {
|
|
208
228
|
/** Name of this console. Defaults to empty string. */
|
|
209
229
|
readonly name?: string;
|
|
@@ -225,7 +245,11 @@ export interface ConsoleConfig {
|
|
|
225
245
|
*/
|
|
226
246
|
readonly formatter?: ConsoleFormatter;
|
|
227
247
|
}
|
|
228
|
-
/**
|
|
248
|
+
/**
|
|
249
|
+
* Configuration for {@link createConsoleFormatter}.
|
|
250
|
+
*
|
|
251
|
+
* @group Output
|
|
252
|
+
*/
|
|
229
253
|
export interface ConsoleFormatterConfig {
|
|
230
254
|
/**
|
|
231
255
|
* Timestamp format to prepend to log messages.
|
|
@@ -244,7 +268,11 @@ export interface ConsoleFormatterConfig {
|
|
|
244
268
|
*/
|
|
245
269
|
readonly startTime?: Millis;
|
|
246
270
|
}
|
|
247
|
-
/**
|
|
271
|
+
/**
|
|
272
|
+
* Timestamp format for {@link ConsoleFormatterConfig}.
|
|
273
|
+
*
|
|
274
|
+
* @group Output
|
|
275
|
+
*/
|
|
248
276
|
export type ConsoleEntryTimestampFormat = "relative" | "absolute" | "iso" | "none";
|
|
249
277
|
/**
|
|
250
278
|
* A {@link ConsoleOutput} that stores the latest entry in a
|
|
@@ -279,6 +307,8 @@ export type ConsoleEntryTimestampFormat = "relative" | "absolute" | "iso" | "non
|
|
|
279
307
|
* args: ["connected"],
|
|
280
308
|
* });
|
|
281
309
|
* ```
|
|
310
|
+
*
|
|
311
|
+
* @group Output
|
|
282
312
|
*/
|
|
283
313
|
export interface ConsoleStoreOutput extends ConsoleOutput {
|
|
284
314
|
/** Latest entry written to this output. */
|
|
@@ -287,6 +317,8 @@ export interface ConsoleStoreOutput extends ConsoleOutput {
|
|
|
287
317
|
/**
|
|
288
318
|
* Dependency providing the latest {@link ConsoleEntry} from a
|
|
289
319
|
* {@link ConsoleStoreOutput}.
|
|
320
|
+
*
|
|
321
|
+
* @group Output
|
|
290
322
|
*/
|
|
291
323
|
export interface ConsoleStoreOutputEntryDep {
|
|
292
324
|
readonly consoleStoreOutputEntry: ReadonlyStore<ConsoleEntry | null>;
|
|
@@ -295,6 +327,8 @@ export interface ConsoleStoreOutputEntryDep {
|
|
|
295
327
|
* A test console that captures all output for assertions.
|
|
296
328
|
*
|
|
297
329
|
* Use as a drop-in replacement for {@link Console} in tests.
|
|
330
|
+
*
|
|
331
|
+
* @group Testing
|
|
298
332
|
*/
|
|
299
333
|
export interface TestConsole extends Console {
|
|
300
334
|
/** Gets all captured entries and clears the internal buffer. */
|
|
@@ -302,10 +336,19 @@ export interface TestConsole extends Console {
|
|
|
302
336
|
/** Clears all captured entries. */
|
|
303
337
|
readonly clearEntries: () => void;
|
|
304
338
|
}
|
|
339
|
+
/**
|
|
340
|
+
* Dependency wrapper for {@link TestConsole}.
|
|
341
|
+
*
|
|
342
|
+
* @group Testing
|
|
343
|
+
*/
|
|
305
344
|
export interface TestConsoleDep {
|
|
306
345
|
readonly console: TestConsole;
|
|
307
346
|
}
|
|
308
|
-
/**
|
|
347
|
+
/**
|
|
348
|
+
* Creates a {@link Console}.
|
|
349
|
+
*
|
|
350
|
+
* @group Core
|
|
351
|
+
*/
|
|
309
352
|
export declare const createConsole: ({ name, level, output, path, formatter, }?: ConsoleConfig) => Console;
|
|
310
353
|
/**
|
|
311
354
|
* Creates a {@link ConsoleOutput} that writes to `globalThis.console`.
|
|
@@ -318,7 +361,6 @@ export declare const createConsole: ({ name, level, output, path, formatter, }?:
|
|
|
318
361
|
*
|
|
319
362
|
* ```ts
|
|
320
363
|
* import {
|
|
321
|
-
* assertEqual,
|
|
322
364
|
* assertType,
|
|
323
365
|
* createNativeConsoleOutput,
|
|
324
366
|
* type ConsoleOutput,
|
|
@@ -327,8 +369,9 @@ export declare const createConsole: ({ name, level, output, path, formatter, }?:
|
|
|
327
369
|
* const output = createNativeConsoleOutput();
|
|
328
370
|
*
|
|
329
371
|
* assertType<typeof output, ConsoleOutput>();
|
|
330
|
-
* assertEqual(typeof output.write, "function");
|
|
331
372
|
* ```
|
|
373
|
+
*
|
|
374
|
+
* @group Output
|
|
332
375
|
*/
|
|
333
376
|
export declare const createNativeConsoleOutput: () => ConsoleOutput;
|
|
334
377
|
/**
|
|
@@ -379,9 +422,15 @@ export declare const createNativeConsoleOutput: () => ConsoleOutput;
|
|
|
379
422
|
* assertType(Data, absolute);
|
|
380
423
|
* assertEqual(absolute, ["14:30:15.123 [relay]", "connected"]);
|
|
381
424
|
* ```
|
|
425
|
+
*
|
|
426
|
+
* @group Output
|
|
382
427
|
*/
|
|
383
428
|
export declare const createConsoleFormatter: ({ time }?: Partial<TimeDep>) => (config?: ConsoleFormatterConfig) => ConsoleFormatter;
|
|
384
|
-
/**
|
|
429
|
+
/**
|
|
430
|
+
* Creates a {@link ConsoleStoreOutput}.
|
|
431
|
+
*
|
|
432
|
+
* @group Output
|
|
433
|
+
*/
|
|
385
434
|
export declare const createConsoleStoreOutput: () => ConsoleStoreOutput;
|
|
386
435
|
/**
|
|
387
436
|
* Creates a {@link ConsoleOutput} that captures entries to an array.
|
|
@@ -408,6 +457,8 @@ export declare const createConsoleStoreOutput: () => ConsoleStoreOutput;
|
|
|
408
457
|
* { method: "info", path: [], args: ["connected"] },
|
|
409
458
|
* ]);
|
|
410
459
|
* ```
|
|
460
|
+
*
|
|
461
|
+
* @group Output
|
|
411
462
|
*/
|
|
412
463
|
export declare const createConsoleArrayOutput: (entries: Array<ConsoleEntry>) => ConsoleOutput;
|
|
413
464
|
/**
|
|
@@ -445,6 +496,8 @@ export declare const createConsoleArrayOutput: (entries: Array<ConsoleEntry>) =>
|
|
|
445
496
|
* assertType(Data, entries[0]);
|
|
446
497
|
* assertEqual(storedEntry, entries[0]);
|
|
447
498
|
* ```
|
|
499
|
+
*
|
|
500
|
+
* @group Output
|
|
448
501
|
*/
|
|
449
502
|
export declare const createMultiOutput: (outputs: ReadonlyArray<ConsoleOutput>) => ConsoleOutput;
|
|
450
503
|
/**
|
|
@@ -466,6 +519,8 @@ export declare const createMultiOutput: (outputs: ReadonlyArray<ConsoleOutput>)
|
|
|
466
519
|
* { method: "info", path: ["relay"], args: ["connected"] },
|
|
467
520
|
* ]);
|
|
468
521
|
* ```
|
|
522
|
+
*
|
|
523
|
+
* @group Testing
|
|
469
524
|
*/
|
|
470
525
|
export declare const testCreateConsole: ({ level, }?: {
|
|
471
526
|
level?: ConsoleLevel;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Console.d.ts","sourceRoot":"","sources":["../../src/Console.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,OAAO,EAIL,KAAK,MAAM,EACX,KAAK,OAAO,EACb,MAAM,WAAW,CAAC;AAEnB
|
|
1
|
+
{"version":3,"file":"Console.d.ts","sourceRoot":"","sources":["../../src/Console.ts"],"names":[],"mappings":"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"}
|
package/dist/src/Console.js
CHANGED
|
@@ -15,7 +15,11 @@ const levelOrder = {
|
|
|
15
15
|
error: 5,
|
|
16
16
|
silent: 6,
|
|
17
17
|
};
|
|
18
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* Creates a {@link Console}.
|
|
20
|
+
*
|
|
21
|
+
* @group Core
|
|
22
|
+
*/
|
|
19
23
|
export const createConsole = ({ name = "", level = "log", output = createNativeConsoleOutput(), path = [], formatter, } = {}) => {
|
|
20
24
|
const childrenSet = new Set();
|
|
21
25
|
let ownLevel = null;
|
|
@@ -63,7 +67,6 @@ export const createConsole = ({ name = "", level = "log", output = createNativeC
|
|
|
63
67
|
*
|
|
64
68
|
* ```ts
|
|
65
69
|
* import {
|
|
66
|
-
* assertEqual,
|
|
67
70
|
* assertType,
|
|
68
71
|
* createNativeConsoleOutput,
|
|
69
72
|
* type ConsoleOutput,
|
|
@@ -72,8 +75,9 @@ export const createConsole = ({ name = "", level = "log", output = createNativeC
|
|
|
72
75
|
* const output = createNativeConsoleOutput();
|
|
73
76
|
*
|
|
74
77
|
* assertType<typeof output, ConsoleOutput>();
|
|
75
|
-
* assertEqual(typeof output.write, "function");
|
|
76
78
|
* ```
|
|
79
|
+
*
|
|
80
|
+
* @group Output
|
|
77
81
|
*/
|
|
78
82
|
export const createNativeConsoleOutput = () => ({
|
|
79
83
|
write: (entry, formatter) => {
|
|
@@ -131,6 +135,8 @@ export const createNativeConsoleOutput = () => ({
|
|
|
131
135
|
* assertType(Data, absolute);
|
|
132
136
|
* assertEqual(absolute, ["14:30:15.123 [relay]", "connected"]);
|
|
133
137
|
* ```
|
|
138
|
+
*
|
|
139
|
+
* @group Output
|
|
134
140
|
*/
|
|
135
141
|
export const createConsoleFormatter = ({ time = createTime() } = {}) => (config = {}) => {
|
|
136
142
|
const format = config.timestampFormat ?? "none";
|
|
@@ -158,7 +164,11 @@ export const createConsoleFormatter = ({ time = createTime() } = {}) => (config
|
|
|
158
164
|
return prefix ? [prefix, ...entry.args] : entry.args;
|
|
159
165
|
};
|
|
160
166
|
};
|
|
161
|
-
/**
|
|
167
|
+
/**
|
|
168
|
+
* Creates a {@link ConsoleStoreOutput}.
|
|
169
|
+
*
|
|
170
|
+
* @group Output
|
|
171
|
+
*/
|
|
162
172
|
export const createConsoleStoreOutput = () => {
|
|
163
173
|
const entry = createStore(null);
|
|
164
174
|
return {
|
|
@@ -191,6 +201,8 @@ export const createConsoleStoreOutput = () => {
|
|
|
191
201
|
* { method: "info", path: [], args: ["connected"] },
|
|
192
202
|
* ]);
|
|
193
203
|
* ```
|
|
204
|
+
*
|
|
205
|
+
* @group Output
|
|
194
206
|
*/
|
|
195
207
|
export const createConsoleArrayOutput = (entries) => ({
|
|
196
208
|
write: (entry) => {
|
|
@@ -232,6 +244,8 @@ export const createConsoleArrayOutput = (entries) => ({
|
|
|
232
244
|
* assertType(Data, entries[0]);
|
|
233
245
|
* assertEqual(storedEntry, entries[0]);
|
|
234
246
|
* ```
|
|
247
|
+
*
|
|
248
|
+
* @group Output
|
|
235
249
|
*/
|
|
236
250
|
export const createMultiOutput = (outputs) => ({
|
|
237
251
|
write: (entry, formatter) => {
|
|
@@ -258,6 +272,8 @@ export const createMultiOutput = (outputs) => ({
|
|
|
258
272
|
* { method: "info", path: ["relay"], args: ["connected"] },
|
|
259
273
|
* ]);
|
|
260
274
|
* ```
|
|
275
|
+
*
|
|
276
|
+
* @group Testing
|
|
261
277
|
*/
|
|
262
278
|
export const testCreateConsole = ({ level = "trace", } = {}) => {
|
|
263
279
|
const entries = [];
|
package/dist/src/Crypto.d.ts
CHANGED
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
import type { RandomLibDep } from "./Random.ts";
|
|
11
11
|
import type { Result } from "./Result.ts";
|
|
12
12
|
import { NonNegativeInt, type Typed } from "./Type.ts";
|
|
13
|
+
/**
|
|
14
|
+
* Cryptographically secure random bytes with length-branded results.
|
|
15
|
+
*
|
|
16
|
+
* @group Random bytes
|
|
17
|
+
*/
|
|
13
18
|
export interface RandomBytes {
|
|
14
19
|
/**
|
|
15
20
|
* Creates cryptographically secure random bytes with type-safe length
|
|
@@ -62,42 +67,89 @@ export interface RandomBytes {
|
|
|
62
67
|
create(bytesLength: 64): Entropy64;
|
|
63
68
|
create(bytesLength: number): Entropy;
|
|
64
69
|
}
|
|
70
|
+
/**
|
|
71
|
+
* Dependency wrapper for {@link RandomBytes}.
|
|
72
|
+
*
|
|
73
|
+
* @group Random bytes
|
|
74
|
+
*/
|
|
65
75
|
export interface RandomBytesDep {
|
|
66
76
|
readonly randomBytes: RandomBytes;
|
|
67
77
|
}
|
|
68
78
|
declare const Entropy: import("./Type.ts").BrandType<import("./Type.ts").Type<"Uint8Array", Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, import("./Type.ts").ObjectTagError<"Uint8Array">, null, import("./Type.ts").ObjectTagError<"Uint8Array">, never, Uint8Array<ArrayBufferLike>, true>, "Entropy", never>;
|
|
69
79
|
type Entropy = typeof Entropy.Output;
|
|
80
|
+
/**
|
|
81
|
+
* Cryptographic entropy of exactly 16 bytes.
|
|
82
|
+
*
|
|
83
|
+
* @group Random bytes
|
|
84
|
+
*/
|
|
70
85
|
export declare const Entropy16: import("./Type.ts").BrandType<import("./Type.ts").BrandType<import("./Type.ts").Type<"Uint8Array", Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, import("./Type.ts").ObjectTagError<"Uint8Array">, null, import("./Type.ts").ObjectTagError<"Uint8Array">, never, Uint8Array<ArrayBufferLike>, true>, "Entropy", never>, "Length16", import("./Type.ts").LengthError<16>>;
|
|
71
86
|
export type Entropy16 = typeof Entropy16.Output;
|
|
87
|
+
/**
|
|
88
|
+
* Cryptographic entropy of exactly 24 bytes.
|
|
89
|
+
*
|
|
90
|
+
* @group Random bytes
|
|
91
|
+
*/
|
|
72
92
|
export declare const Entropy24: import("./Type.ts").BrandType<import("./Type.ts").BrandType<import("./Type.ts").Type<"Uint8Array", Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, import("./Type.ts").ObjectTagError<"Uint8Array">, null, import("./Type.ts").ObjectTagError<"Uint8Array">, never, Uint8Array<ArrayBufferLike>, true>, "Entropy", never>, "Length24", import("./Type.ts").LengthError<24>>;
|
|
73
93
|
export type Entropy24 = typeof Entropy24.Output;
|
|
94
|
+
/**
|
|
95
|
+
* Cryptographic entropy of exactly 32 bytes.
|
|
96
|
+
*
|
|
97
|
+
* @group Random bytes
|
|
98
|
+
*/
|
|
74
99
|
export declare const Entropy32: import("./Type.ts").BrandType<import("./Type.ts").BrandType<import("./Type.ts").Type<"Uint8Array", Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, import("./Type.ts").ObjectTagError<"Uint8Array">, null, import("./Type.ts").ObjectTagError<"Uint8Array">, never, Uint8Array<ArrayBufferLike>, true>, "Entropy", never>, "Length32", import("./Type.ts").LengthError<32>>;
|
|
75
100
|
export type Entropy32 = typeof Entropy32.Output;
|
|
101
|
+
/**
|
|
102
|
+
* Cryptographic entropy of exactly 64 bytes.
|
|
103
|
+
*
|
|
104
|
+
* @group Random bytes
|
|
105
|
+
*/
|
|
76
106
|
export declare const Entropy64: import("./Type.ts").BrandType<import("./Type.ts").BrandType<import("./Type.ts").Type<"Uint8Array", Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, import("./Type.ts").ObjectTagError<"Uint8Array">, null, import("./Type.ts").ObjectTagError<"Uint8Array">, never, Uint8Array<ArrayBufferLike>, true>, "Entropy", never>, "Length64", import("./Type.ts").LengthError<64>>;
|
|
77
107
|
export type Entropy64 = typeof Entropy64.Output;
|
|
108
|
+
/**
|
|
109
|
+
* Creates {@link RandomBytes} backed by the platform's secure random number
|
|
110
|
+
* generator.
|
|
111
|
+
*
|
|
112
|
+
* @group Random bytes
|
|
113
|
+
*/
|
|
78
114
|
export declare const createRandomBytes: () => RandomBytes;
|
|
79
|
-
/**
|
|
115
|
+
/**
|
|
116
|
+
* Creates seeded random bytes for deterministic tests.
|
|
117
|
+
*
|
|
118
|
+
* @group Testing
|
|
119
|
+
*/
|
|
80
120
|
export declare const testCreateRandomBytes: (deps: RandomLibDep) => RandomBytes;
|
|
81
121
|
/**
|
|
82
122
|
* SLIP21.
|
|
83
123
|
*
|
|
84
124
|
* https://github.com/satoshilabs/slips/blob/master/slip-0021.md
|
|
125
|
+
*
|
|
126
|
+
* @group Key derivation
|
|
85
127
|
*/
|
|
86
128
|
export declare const createSlip21: (seed: Entropy16 | Entropy32 | Entropy64, path: ReadonlyArray<string | number>) => Entropy32;
|
|
87
129
|
/**
|
|
88
130
|
* Derives a single node in the SLIP-21 hierarchical key derivation.
|
|
89
131
|
*
|
|
132
|
+
* @group Key derivation
|
|
90
133
|
* @see {@link createSlip21}
|
|
91
134
|
*/
|
|
92
135
|
export declare const deriveSlip21Node: (label: string, parentNode: Entropy64) => Entropy64;
|
|
93
|
-
/**
|
|
136
|
+
/**
|
|
137
|
+
* The encryption key for symmetric encryption.
|
|
138
|
+
*
|
|
139
|
+
* @group Encryption
|
|
140
|
+
*/
|
|
94
141
|
export declare const EncryptionKey: import("./Type.ts").BrandType<import("./Type.ts").BrandType<import("./Type.ts").BrandType<import("./Type.ts").Type<"Uint8Array", Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, import("./Type.ts").ObjectTagError<"Uint8Array">, null, import("./Type.ts").ObjectTagError<"Uint8Array">, never, Uint8Array<ArrayBufferLike>, true>, "Entropy", never>, "Length32", import("./Type.ts").LengthError<32>>, "EncryptionKey", never>;
|
|
95
142
|
export type EncryptionKey = typeof EncryptionKey.Output;
|
|
96
|
-
/**
|
|
143
|
+
/**
|
|
144
|
+
* The nonce length for XChaCha20-Poly1305 encryption.
|
|
145
|
+
*
|
|
146
|
+
* @group Encryption
|
|
147
|
+
*/
|
|
97
148
|
export declare const xChaCha20Poly1305NonceLength = 24;
|
|
98
149
|
/**
|
|
99
150
|
* Branded Uint8Array for XChaCha20-Poly1305 encryption.
|
|
100
151
|
*
|
|
152
|
+
* @group Encryption
|
|
101
153
|
* @see {@link encryptWithXChaCha20Poly1305}
|
|
102
154
|
*/
|
|
103
155
|
export declare const XChaCha20Poly1305Ciphertext: import("./Type.ts").BrandType<import("./Type.ts").Type<"Uint8Array", Uint8Array<ArrayBufferLike>, Uint8Array<ArrayBufferLike>, import("./Type.ts").ObjectTagError<"Uint8Array">, null, import("./Type.ts").ObjectTagError<"Uint8Array">, never, Uint8Array<ArrayBufferLike>, true>, "XChaCha20Poly1305Ciphertext", never>;
|
|
@@ -131,9 +183,15 @@ export type XChaCha20Poly1305Ciphertext = typeof XChaCha20Poly1305Ciphertext.Out
|
|
|
131
183
|
* assertEqual(nonce.length, 24);
|
|
132
184
|
* ```
|
|
133
185
|
*
|
|
186
|
+
* @group Encryption
|
|
134
187
|
* @see https://github.com/paulmillr/noble-ciphers
|
|
135
188
|
*/
|
|
136
189
|
export declare const encryptWithXChaCha20Poly1305: (deps: RandomBytesDep) => (plaintext: Uint8Array, encryptionKey: EncryptionKey) => [XChaCha20Poly1305Ciphertext, Entropy24];
|
|
190
|
+
/**
|
|
191
|
+
* Error returned by {@link decryptWithXChaCha20Poly1305} when decryption fails.
|
|
192
|
+
*
|
|
193
|
+
* @group Encryption
|
|
194
|
+
*/
|
|
137
195
|
export interface DecryptWithXChaCha20Poly1305Error extends Typed<"DecryptWithXChaCha20Poly1305Error"> {
|
|
138
196
|
readonly error: unknown;
|
|
139
197
|
}
|
|
@@ -176,6 +234,8 @@ export interface DecryptWithXChaCha20Poly1305Error extends Typed<"DecryptWithXCh
|
|
|
176
234
|
*
|
|
177
235
|
* assertOk(decryptMessage(), "secret message");
|
|
178
236
|
* ```
|
|
237
|
+
*
|
|
238
|
+
* @group Encryption
|
|
179
239
|
*/
|
|
180
240
|
export declare const decryptWithXChaCha20Poly1305: (ciphertext: XChaCha20Poly1305Ciphertext, nonce: Entropy24, encryptionKey: EncryptionKey) => Result<Uint8Array, DecryptWithXChaCha20Poly1305Error>;
|
|
181
241
|
/**
|
|
@@ -185,18 +245,30 @@ export declare const decryptWithXChaCha20Poly1305: (ciphertext: XChaCha20Poly130
|
|
|
185
245
|
* wide range of encrypted data sizes.
|
|
186
246
|
*
|
|
187
247
|
* See the PURBs paper for details: https://bford.info/pub/sec/purb.pdf
|
|
248
|
+
*
|
|
249
|
+
* @group Padding
|
|
188
250
|
*/
|
|
189
251
|
export declare const createPadmePaddedLength: (length: NonNegativeInt) => NonNegativeInt;
|
|
190
|
-
/**
|
|
252
|
+
/**
|
|
253
|
+
* Creates a PADMÉ padding array of zeros for the given input length.
|
|
254
|
+
*
|
|
255
|
+
* @group Padding
|
|
256
|
+
*/
|
|
191
257
|
export declare const createPadmePadding: (length: NonNegativeInt) => Uint8Array;
|
|
192
258
|
/**
|
|
193
259
|
* Performs a timing-safe comparison of two Uint8Arrays. Returns true if they
|
|
194
260
|
* are equal, false otherwise. Takes constant time regardless of where the
|
|
195
261
|
* arrays differ.
|
|
196
262
|
*
|
|
263
|
+
* @group Comparison
|
|
197
264
|
* @see https://nodejs.org/api/crypto.html#cryptotimingsafeequala-b
|
|
198
265
|
*/
|
|
199
266
|
export type TimingSafeEqual = (a: Uint8Array, b: Uint8Array) => boolean;
|
|
267
|
+
/**
|
|
268
|
+
* Dependency wrapper for {@link TimingSafeEqual}.
|
|
269
|
+
*
|
|
270
|
+
* @group Comparison
|
|
271
|
+
*/
|
|
200
272
|
export interface TimingSafeEqualDep {
|
|
201
273
|
readonly timingSafeEqual: TimingSafeEqual;
|
|
202
274
|
}
|
package/dist/src/Crypto.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Crypto.d.ts","sourceRoot":"","sources":["../../src/Crypto.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAGL,cAAc,EAEd,KAAK,KAAK,EAEX,MAAM,WAAW,CAAC;AAEnB,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4CG;IACH,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC;AAED,QAAA,MAAM,OAAO,uSAA6C,CAAC;AAC3D,KAAK,OAAO,GAAG,OAAO,OAAO,CAAC,MAAM,CAAC;AAErC,eAAO,MAAM,SAAS,uXAAoC,CAAC;AAC3D,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAEhD,eAAO,MAAM,SAAS,uXAAoC,CAAC;AAC3D,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAEhD,eAAO,MAAM,SAAS,uXAAoC,CAAC;AAC3D,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAEhD,eAAO,MAAM,SAAS,uXAAoC,CAAC;AAC3D,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAEhD,eAAO,MAAM,iBAAiB,QAAO,WAEnC,CAAC;AAEH
|
|
1
|
+
{"version":3,"file":"Crypto.d.ts","sourceRoot":"","sources":["../../src/Crypto.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,OAAO,EAGL,cAAc,EAEd,KAAK,KAAK,EAEX,MAAM,WAAW,CAAC;AAEnB;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4CG;IACH,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,SAAS,CAAC;IACnC,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;CACtC;AAED;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;CACnC;AAED,QAAA,MAAM,OAAO,uSAA6C,CAAC;AAC3D,KAAK,OAAO,GAAG,OAAO,OAAO,CAAC,MAAM,CAAC;AAErC;;;;GAIG;AACH,eAAO,MAAM,SAAS,uXAAoC,CAAC;AAC3D,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,SAAS,uXAAoC,CAAC;AAC3D,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,SAAS,uXAAoC,CAAC;AAC3D,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAEhD;;;;GAIG;AACH,eAAO,MAAM,SAAS,uXAAoC,CAAC;AAC3D,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC,MAAM,CAAC;AAEhD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,QAAO,WAEnC,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,SAAU,YAAY,KAAG,WAMxC,CAAC;AAEpB;;;;;;GAMG;AACH,eAAO,MAAM,YAAY,SACjB,SAAS,GAAG,SAAS,GAAG,SAAS,QACjC,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,KACnC,SAaF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,UACpB,MAAM,cACD,SAAS,KACpB,SAMF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,8aAAkD,CAAC;AAC7E,MAAM,MAAM,aAAa,GAAG,OAAO,aAAa,CAAC,MAAM,CAAC;AAExD;;;;GAIG;AACH,eAAO,MAAM,4BAA4B,KAAK,CAAC;AAE/C;;;;;GAKG;AACH,eAAO,MAAM,2BAA2B,2TAGvC,CAAC;AACF,MAAM,MAAM,2BAA2B,GACrC,OAAO,2BAA2B,CAAC,MAAM,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,4BAA4B,SAChC,cAAc,iBAER,UAAU,iBACN,aAAa,KAC3B,CAAC,2BAA2B,EAAE,SAAS,CAMzC,CAAC;AAEJ;;;;GAIG;AACH,MAAM,WAAW,iCAAkC,SAAQ,KAAK,CAAC,mCAAmC,CAAC;IACnG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,eAAO,MAAM,4BAA4B,eAC3B,2BAA2B,SAChC,SAAS,iBACD,aAAa,KAC3B,MAAM,CAAC,UAAU,EAAE,iCAAiC,CAOpD,CAAC;AAEJ;;;;;;;;;GASG;AACH,eAAO,MAAM,uBAAuB,WAC1B,cAAc,KACrB,cAOF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,WAAY,cAAc,KAAG,UAI3D,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,KAAK,OAAO,CAAC;AAExE;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAC;CAC3C"}
|