@evolu/common 8.7.0 → 8.8.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/Array.d.ts +21 -21
- package/dist/src/Array.js +5 -5
- package/dist/src/Assert.d.ts +478 -141
- package/dist/src/Assert.d.ts.map +1 -1
- package/dist/src/Assert.js +644 -99
- package/dist/src/{Buffer.d.ts → Binary.d.ts} +85 -12
- package/dist/src/Binary.d.ts.map +1 -0
- package/dist/src/{Buffer.js → Binary.js} +206 -24
- package/dist/src/Console.d.ts +2 -10
- package/dist/src/Console.d.ts.map +1 -1
- package/dist/src/Console.js +6 -12
- package/dist/src/Crypto.d.ts +5 -5
- package/dist/src/Crypto.js +1 -1
- package/dist/src/Eq.d.ts +35 -40
- package/dist/src/Eq.d.ts.map +1 -1
- package/dist/src/Eq.js +51 -87
- package/dist/src/Function.d.ts +9 -14
- package/dist/src/Function.d.ts.map +1 -1
- package/dist/src/Function.js +7 -9
- package/dist/src/Http.d.ts +6 -7
- package/dist/src/Http.d.ts.map +1 -1
- package/dist/src/LeakDetector.d.ts.map +1 -1
- package/dist/src/LeakDetector.js +1 -0
- package/dist/src/LockManager.d.ts +1 -1
- package/dist/src/LockManager.js +1 -1
- package/dist/src/Lookup.d.ts +3 -2
- package/dist/src/Lookup.d.ts.map +1 -1
- package/dist/src/Lookup.js +4 -3
- package/dist/src/Number.d.ts +1 -1
- package/dist/src/Number.d.ts.map +1 -1
- package/dist/src/Number.js +1 -1
- package/dist/src/Object.d.ts +4 -4
- package/dist/src/Object.d.ts.map +1 -1
- package/dist/src/Object.js +5 -4
- package/dist/src/Option.d.ts +1 -2
- package/dist/src/Option.d.ts.map +1 -1
- package/dist/src/Option.js +1 -2
- package/dist/src/Platform.js +2 -0
- package/dist/src/Polyfills.js +4 -1
- package/dist/src/Random.d.ts +1 -1
- package/dist/src/Result.d.ts +49 -54
- package/dist/src/Result.d.ts.map +1 -1
- package/dist/src/Result.js +17 -22
- package/dist/src/Set.d.ts +6 -6
- package/dist/src/Set.js +2 -2
- package/dist/src/Sqlite.js +1 -1
- package/dist/src/String.js +3 -2
- package/dist/src/Task.d.ts +32 -32
- package/dist/src/Task.d.ts.map +1 -1
- package/dist/src/Task.js +20 -22
- package/dist/src/Test.d.ts +31 -3
- package/dist/src/Test.d.ts.map +1 -1
- package/dist/src/Test.js +46 -3
- package/dist/src/Time.d.ts +3 -11
- package/dist/src/Time.d.ts.map +1 -1
- package/dist/src/Time.js +10 -18
- package/dist/src/Type.d.ts +87 -85
- package/dist/src/Type.d.ts.map +1 -1
- package/dist/src/Type.js +70 -63
- package/dist/src/Types.d.ts +12 -12
- package/dist/src/Types.js +1 -1
- package/dist/src/WebSocket.d.ts +4 -7
- package/dist/src/WebSocket.d.ts.map +1 -1
- package/dist/src/Worker.d.ts +1 -1
- package/dist/src/Worker.js +7 -7
- package/dist/src/index.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/intl/_en.d.ts.map +1 -1
- package/dist/src/intl/_en.js +1 -1
- package/dist/src/intl/ar.d.ts.map +1 -1
- package/dist/src/intl/ar.js +1 -1
- package/dist/src/intl/bn.d.ts.map +1 -1
- package/dist/src/intl/bn.js +1 -1
- package/dist/src/intl/ca.d.ts.map +1 -1
- package/dist/src/intl/ca.js +1 -1
- package/dist/src/intl/cs.d.ts.map +1 -1
- package/dist/src/intl/cs.js +1 -1
- package/dist/src/intl/da.d.ts.map +1 -1
- package/dist/src/intl/da.js +1 -1
- package/dist/src/intl/de.d.ts.map +1 -1
- package/dist/src/intl/de.js +1 -1
- package/dist/src/intl/el.d.ts.map +1 -1
- package/dist/src/intl/el.js +1 -1
- package/dist/src/intl/es.d.ts.map +1 -1
- package/dist/src/intl/es.js +1 -1
- package/dist/src/intl/fa.d.ts.map +1 -1
- package/dist/src/intl/fa.js +1 -1
- package/dist/src/intl/fi.d.ts.map +1 -1
- package/dist/src/intl/fi.js +1 -1
- package/dist/src/intl/fil.d.ts.map +1 -1
- package/dist/src/intl/fil.js +1 -1
- package/dist/src/intl/fr.d.ts.map +1 -1
- package/dist/src/intl/fr.js +1 -1
- package/dist/src/intl/he.d.ts.map +1 -1
- package/dist/src/intl/he.js +1 -1
- package/dist/src/intl/hi.d.ts.map +1 -1
- package/dist/src/intl/hi.js +1 -1
- package/dist/src/intl/hr.d.ts.map +1 -1
- package/dist/src/intl/hr.js +1 -1
- package/dist/src/intl/hu.d.ts.map +1 -1
- package/dist/src/intl/hu.js +1 -1
- package/dist/src/intl/id.d.ts.map +1 -1
- package/dist/src/intl/id.js +1 -1
- package/dist/src/intl/it.d.ts.map +1 -1
- package/dist/src/intl/it.js +1 -1
- package/dist/src/intl/ja.d.ts.map +1 -1
- package/dist/src/intl/ja.js +1 -1
- package/dist/src/intl/ko.d.ts.map +1 -1
- package/dist/src/intl/ko.js +1 -1
- package/dist/src/intl/ml.d.ts.map +1 -1
- package/dist/src/intl/ml.js +1 -1
- package/dist/src/intl/mr.d.ts.map +1 -1
- package/dist/src/intl/mr.js +1 -1
- package/dist/src/intl/ms.d.ts.map +1 -1
- package/dist/src/intl/ms.js +1 -1
- package/dist/src/intl/nb.d.ts.map +1 -1
- package/dist/src/intl/nb.js +1 -1
- package/dist/src/intl/nl.d.ts.map +1 -1
- package/dist/src/intl/nl.js +1 -1
- package/dist/src/intl/pa.d.ts.map +1 -1
- package/dist/src/intl/pa.js +1 -1
- package/dist/src/intl/pl.d.ts.map +1 -1
- package/dist/src/intl/pl.js +1 -1
- package/dist/src/intl/pt-BR.d.ts.map +1 -1
- package/dist/src/intl/pt-BR.js +1 -1
- package/dist/src/intl/pt.d.ts.map +1 -1
- package/dist/src/intl/pt.js +1 -1
- package/dist/src/intl/ro.d.ts.map +1 -1
- package/dist/src/intl/ro.js +1 -1
- package/dist/src/intl/sk.d.ts.map +1 -1
- package/dist/src/intl/sk.js +1 -1
- package/dist/src/intl/sl.d.ts.map +1 -1
- package/dist/src/intl/sl.js +1 -1
- package/dist/src/intl/sv.d.ts.map +1 -1
- package/dist/src/intl/sv.js +1 -1
- package/dist/src/intl/sw.d.ts.map +1 -1
- package/dist/src/intl/sw.js +1 -1
- package/dist/src/intl/ta.d.ts.map +1 -1
- package/dist/src/intl/ta.js +1 -1
- package/dist/src/intl/te.d.ts.map +1 -1
- package/dist/src/intl/te.js +1 -1
- package/dist/src/intl/th.d.ts.map +1 -1
- package/dist/src/intl/th.js +1 -1
- package/dist/src/intl/tr.d.ts.map +1 -1
- package/dist/src/intl/tr.js +1 -1
- package/dist/src/intl/uk.d.ts.map +1 -1
- package/dist/src/intl/uk.js +1 -1
- package/dist/src/intl/ur.d.ts.map +1 -1
- package/dist/src/intl/ur.js +1 -1
- package/dist/src/intl/vi.d.ts.map +1 -1
- package/dist/src/intl/vi.js +1 -1
- package/dist/src/intl/zh-CN.d.ts.map +1 -1
- package/dist/src/intl/zh-CN.js +1 -1
- package/dist/src/intl/zh-TW.d.ts.map +1 -1
- package/dist/src/intl/zh-TW.js +1 -1
- package/dist/src/local-first/Evolu.d.ts +12 -12
- package/dist/src/local-first/Evolu.d.ts.map +1 -1
- package/dist/src/local-first/Evolu.js +2 -2
- package/dist/src/local-first/Protocol.d.ts +14 -76
- package/dist/src/local-first/Protocol.d.ts.map +1 -1
- package/dist/src/local-first/Protocol.js +29 -206
- package/dist/src/local-first/Query.d.ts +11 -11
- package/dist/src/local-first/Query.js +6 -6
- package/dist/src/local-first/Relay.d.ts +2 -2
- package/dist/src/local-first/Schema.d.ts +3 -5
- package/dist/src/local-first/Schema.d.ts.map +1 -1
- package/dist/src/local-first/Schema.js +2 -4
- package/dist/src/local-first/Shared.d.ts.map +1 -1
- package/dist/src/local-first/Shared.js +5 -5
- package/dist/src/local-first/Storage.js +4 -4
- package/dist/src/local-first/Timestamp.d.ts +9 -0
- package/dist/src/local-first/Timestamp.d.ts.map +1 -1
- package/dist/src/local-first/Timestamp.js +13 -10
- package/package.json +7 -4
- package/src/Array.test.ts +809 -0
- package/src/Array.ts +21 -21
- package/src/Assert.test.ts +1181 -0
- package/src/Assert.ts +971 -227
- package/src/BigInt.test.ts +28 -0
- package/src/Binary.test.ts +1128 -0
- package/src/{Buffer.ts → Binary.ts} +273 -46
- package/src/Brand.test.ts +90 -0
- package/src/Cache.test.ts +183 -0
- package/src/Callbacks.test.ts +66 -0
- package/src/Console.test.ts +809 -0
- package/src/Console.ts +9 -17
- package/src/Crypto.test.ts +138 -0
- package/src/Crypto.ts +5 -5
- package/src/Eq.test.ts +333 -0
- package/src/Eq.ts +110 -176
- package/src/Error.test.ts +118 -0
- package/src/Function.test.ts +204 -0
- package/src/Function.ts +10 -15
- package/src/Http.test.ts +816 -0
- package/src/Http.ts +6 -7
- package/src/LeakDetector.test.ts +210 -0
- package/src/LeakDetector.ts +1 -0
- package/src/LockManager.ts +2 -2
- package/src/Lookup.test.ts +418 -0
- package/src/Lookup.ts +4 -3
- package/src/Microtask.test.ts +140 -0
- package/src/Number.test.ts +218 -0
- package/src/Number.ts +2 -2
- package/src/Object.test.ts +293 -0
- package/src/Object.ts +5 -4
- package/src/Option.test.ts +104 -0
- package/src/Option.ts +1 -2
- package/src/Order.test.ts +56 -0
- package/src/Platform.ts +2 -0
- package/src/Polyfills.ts +3 -4
- package/src/Random.test.ts +89 -0
- package/src/Random.ts +1 -1
- package/src/Ref.test.ts +139 -0
- package/src/RefCount.test.ts +184 -0
- package/src/Relation.test.ts +505 -0
- package/src/Resource.test.ts +4623 -0
- package/src/Result.test.ts +1829 -0
- package/src/Result.ts +49 -54
- package/src/Schedule.test.ts +1554 -0
- package/src/Set.test.ts +279 -0
- package/src/Set.ts +6 -6
- package/src/Sqlite.ts +1 -1
- package/src/Store.test.ts +288 -0
- package/src/String.test.ts +54 -0
- package/src/String.ts +3 -3
- package/src/Task.test.ts +10820 -0
- package/src/Task.ts +38 -43
- package/src/Test.test.ts +88 -0
- package/src/Test.ts +49 -3
- package/src/Time.test.ts +926 -0
- package/src/Time.ts +13 -21
- package/src/Type.base64.test.ts +88 -0
- package/src/Type.test.ts +20465 -0
- package/src/Type.ts +114 -111
- package/src/Types.test.ts +324 -0
- package/src/Types.ts +13 -13
- package/src/WebSocket.ts +4 -7
- package/src/Worker.test.ts +755 -0
- package/src/Worker.ts +13 -18
- package/src/index.ts +1 -1
- package/src/intl/_en.ts +1 -1
- package/src/intl/ar.ts +1 -1
- package/src/intl/bn.ts +1 -1
- package/src/intl/ca.ts +1 -1
- package/src/intl/cs.ts +1 -1
- package/src/intl/da.ts +1 -1
- package/src/intl/de.ts +1 -1
- package/src/intl/el.ts +1 -1
- package/src/intl/es.ts +1 -1
- package/src/intl/fa.ts +1 -1
- package/src/intl/fi.ts +1 -1
- package/src/intl/fil.ts +1 -1
- package/src/intl/fr.ts +1 -1
- package/src/intl/he.ts +1 -1
- package/src/intl/hi.ts +1 -1
- package/src/intl/hr.ts +1 -1
- package/src/intl/hu.ts +1 -1
- package/src/intl/id.ts +1 -1
- package/src/intl/intl.test.ts +3106 -0
- package/src/intl/it.ts +1 -1
- package/src/intl/ja.ts +1 -1
- package/src/intl/ko.ts +1 -1
- package/src/intl/ml.ts +1 -1
- package/src/intl/mr.ts +1 -1
- package/src/intl/ms.ts +1 -1
- package/src/intl/nb.ts +1 -1
- package/src/intl/nl.ts +1 -1
- package/src/intl/pa.ts +1 -1
- package/src/intl/pl.ts +1 -1
- package/src/intl/pt-BR.ts +1 -1
- package/src/intl/pt.ts +1 -1
- package/src/intl/ro.ts +1 -1
- package/src/intl/sk.ts +1 -1
- package/src/intl/sl.ts +1 -1
- package/src/intl/sv.ts +1 -1
- package/src/intl/sw.ts +1 -1
- package/src/intl/ta.ts +1 -1
- package/src/intl/te.ts +1 -1
- package/src/intl/th.ts +1 -1
- package/src/intl/tr.ts +1 -1
- package/src/intl/uk.ts +1 -1
- package/src/intl/ur.ts +1 -1
- package/src/intl/vi.ts +1 -1
- package/src/intl/zh-CN.ts +1 -1
- package/src/intl/zh-TW.ts +1 -1
- package/src/local-first/Evolu.test.ts +1921 -0
- package/src/local-first/Evolu.ts +18 -14
- package/src/local-first/Owner.test.ts +83 -0
- package/src/local-first/Protocol.test.ts +1037 -0
- package/src/local-first/Protocol.ts +58 -261
- package/src/local-first/Query.test.ts +349 -0
- package/src/local-first/Query.ts +11 -11
- package/src/local-first/Relay.ts +2 -2
- package/src/local-first/Schema.ts +3 -5
- package/src/local-first/Shared.test.ts +1828 -0
- package/src/local-first/Shared.ts +9 -8
- package/src/local-first/Storage.ts +4 -4
- package/src/local-first/Timestamp.test.ts +374 -0
- package/src/local-first/Timestamp.ts +22 -10
- package/dist/src/Buffer.d.ts.map +0 -1
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import { assertFalse, assertTrue } from "./Assert.ts";
|
|
3
|
+
import { assertType } from "./Type.ts";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
type Callback,
|
|
7
|
+
type CallbackWithTeardown,
|
|
8
|
+
type Predicate,
|
|
9
|
+
type PredicateWithIndex,
|
|
10
|
+
type Refinement,
|
|
11
|
+
type RefinementWithIndex,
|
|
12
|
+
type Instance,
|
|
13
|
+
instance,
|
|
14
|
+
isInstance,
|
|
15
|
+
type NullablePartial,
|
|
16
|
+
type Literal,
|
|
17
|
+
type WidenLiteral,
|
|
18
|
+
type Writable,
|
|
19
|
+
type Simplify,
|
|
20
|
+
type PartialProp,
|
|
21
|
+
type Awaitable,
|
|
22
|
+
isPromiseLike,
|
|
23
|
+
type CompileTimeError,
|
|
24
|
+
type IsSameType,
|
|
25
|
+
type IsUnion,
|
|
26
|
+
type KeysOfUnion,
|
|
27
|
+
type UnionToIntersection,
|
|
28
|
+
type ParameterIntersection,
|
|
29
|
+
type DistributiveOmit,
|
|
30
|
+
} from "./Types.ts";
|
|
31
|
+
|
|
32
|
+
test("Callback", () => {
|
|
33
|
+
assertType<Callback<string>, (value: string) => void>();
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
test("CallbackWithTeardown", () => {
|
|
37
|
+
assertType<
|
|
38
|
+
CallbackWithTeardown<string>,
|
|
39
|
+
(value: string) => void | (() => void)
|
|
40
|
+
>();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
test("Predicate", () => {
|
|
44
|
+
assertType<Predicate<string>, (value: string) => boolean>();
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test("PredicateWithIndex", () => {
|
|
48
|
+
assertType<
|
|
49
|
+
PredicateWithIndex<string>,
|
|
50
|
+
(value: string, index: number) => boolean
|
|
51
|
+
>();
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
test("Refinement", () => {
|
|
55
|
+
interface Animal {
|
|
56
|
+
readonly name: string;
|
|
57
|
+
}
|
|
58
|
+
interface Dog extends Animal {
|
|
59
|
+
readonly breed: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
assertType<Refinement<Animal, Dog>, (value: Animal) => value is Dog>();
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test("RefinementWithIndex", () => {
|
|
66
|
+
interface Animal {
|
|
67
|
+
readonly name: string;
|
|
68
|
+
}
|
|
69
|
+
interface Dog extends Animal {
|
|
70
|
+
readonly breed: string;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
assertType<
|
|
74
|
+
RefinementWithIndex<Animal, Dog>,
|
|
75
|
+
(value: Animal, index: number) => value is Dog
|
|
76
|
+
>();
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
test("Instance", () => {
|
|
80
|
+
interface Foo extends Instance<"Foo"> {
|
|
81
|
+
readonly value: string;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const foo: Foo = {
|
|
85
|
+
...instance("Foo"),
|
|
86
|
+
value: "value",
|
|
87
|
+
};
|
|
88
|
+
const isFoo = isInstance<Foo>("Foo");
|
|
89
|
+
|
|
90
|
+
{
|
|
91
|
+
const actual = instance("Foo");
|
|
92
|
+
assertType<typeof actual, Instance<"Foo">>();
|
|
93
|
+
}
|
|
94
|
+
assertTrue(Object.keys(foo).includes("~evolu/instance"));
|
|
95
|
+
assertTrue(isFoo(foo));
|
|
96
|
+
|
|
97
|
+
const value: unknown = foo;
|
|
98
|
+
if (isFoo(value)) assertType<typeof value, Foo>();
|
|
99
|
+
|
|
100
|
+
const compileTimeAssertions = () => {
|
|
101
|
+
// @ts-expect-error The runtime name must match the interface name.
|
|
102
|
+
isInstance<Foo>("Bar");
|
|
103
|
+
};
|
|
104
|
+
assertType<
|
|
105
|
+
typeof compileTimeAssertions extends (...args: Array<never>) => unknown
|
|
106
|
+
? true
|
|
107
|
+
: false,
|
|
108
|
+
true
|
|
109
|
+
>();
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test("isInstance checks its own marker", () => {
|
|
113
|
+
const isFoo = isInstance<Instance<"Foo">>("Foo");
|
|
114
|
+
const nullPrototype = Object.assign(
|
|
115
|
+
Object.create(null) as object,
|
|
116
|
+
instance("Foo"),
|
|
117
|
+
);
|
|
118
|
+
|
|
119
|
+
assertTrue(isFoo(nullPrototype));
|
|
120
|
+
assertFalse(isFoo(null));
|
|
121
|
+
assertFalse(isFoo("Foo"));
|
|
122
|
+
assertFalse(isFoo({}));
|
|
123
|
+
assertFalse(isFoo(instance("Bar")));
|
|
124
|
+
assertFalse(isFoo(Object.create(instance("Foo"))));
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
test("NullablePartial", () => {
|
|
128
|
+
assertType<
|
|
129
|
+
NullablePartial<{
|
|
130
|
+
readonly required: string;
|
|
131
|
+
readonly nullable: string | null;
|
|
132
|
+
readonly nullOnly: null;
|
|
133
|
+
readonly existingOptional?: number;
|
|
134
|
+
}>,
|
|
135
|
+
{
|
|
136
|
+
readonly required: string;
|
|
137
|
+
readonly nullable?: string | null;
|
|
138
|
+
readonly nullOnly?: null;
|
|
139
|
+
readonly existingOptional?: number;
|
|
140
|
+
}
|
|
141
|
+
>();
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test("Literal", () => {
|
|
145
|
+
assertType<Literal, string | number | bigint | boolean | undefined | null>();
|
|
146
|
+
});
|
|
147
|
+
|
|
148
|
+
test("WidenLiteral", () => {
|
|
149
|
+
assertType<WidenLiteral<"foo">, string>();
|
|
150
|
+
assertType<WidenLiteral<42>, number>();
|
|
151
|
+
assertType<WidenLiteral<42n>, bigint>();
|
|
152
|
+
assertType<WidenLiteral<true>, boolean>();
|
|
153
|
+
assertType<WidenLiteral<undefined>, undefined>();
|
|
154
|
+
assertType<WidenLiteral<null>, null>();
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
test("Writable", () => {
|
|
158
|
+
assertType<
|
|
159
|
+
Writable<{
|
|
160
|
+
readonly value: string;
|
|
161
|
+
readonly nested: { readonly value: number };
|
|
162
|
+
}>,
|
|
163
|
+
{
|
|
164
|
+
value: string;
|
|
165
|
+
nested: { readonly value: number };
|
|
166
|
+
}
|
|
167
|
+
>();
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
test("Simplify", () => {
|
|
171
|
+
assertType<
|
|
172
|
+
Simplify<{ readonly text: string } & { readonly count: number }>,
|
|
173
|
+
{
|
|
174
|
+
readonly text: string;
|
|
175
|
+
readonly count: number;
|
|
176
|
+
}
|
|
177
|
+
>();
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
test("PartialProp", () => {
|
|
181
|
+
type Actual = PartialProp<
|
|
182
|
+
{ readonly required: string; readonly optional: number },
|
|
183
|
+
"optional"
|
|
184
|
+
>;
|
|
185
|
+
interface Expected {
|
|
186
|
+
readonly required: string;
|
|
187
|
+
readonly optional?: number;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
assertType<Actual extends Expected ? true : false, true>();
|
|
191
|
+
assertType<Expected extends Actual ? true : false, true>();
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
test("Awaitable", () => {
|
|
195
|
+
assertType<Awaitable<string>, string | PromiseLike<string>>();
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
test("isPromiseLike", () => {
|
|
199
|
+
assertTrue(isPromiseLike(Promise.resolve("value")));
|
|
200
|
+
// oxlint-disable-next-line unicorn/no-thenable -- Intentionally tests a thenable object.
|
|
201
|
+
assertTrue(isPromiseLike({ then: () => undefined }));
|
|
202
|
+
// oxlint-disable-next-line unicorn/no-thenable -- Intentionally tests a non-callable then property.
|
|
203
|
+
assertFalse(isPromiseLike({ then: "not a function" }));
|
|
204
|
+
assertFalse(isPromiseLike(null));
|
|
205
|
+
assertFalse(isPromiseLike(undefined));
|
|
206
|
+
assertFalse(isPromiseLike("value"));
|
|
207
|
+
|
|
208
|
+
const narrow = (value: Awaitable<string>) => {
|
|
209
|
+
if (isPromiseLike(value)) {
|
|
210
|
+
assertType<typeof value, PromiseLike<string>>();
|
|
211
|
+
} else {
|
|
212
|
+
assertType<typeof value, string>();
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
assertType<
|
|
216
|
+
typeof narrow extends (...args: Array<never>) => unknown ? true : false,
|
|
217
|
+
true
|
|
218
|
+
>();
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
test("CompileTimeError", () => {
|
|
222
|
+
assertType<
|
|
223
|
+
CompileTimeError<"Type", "Something went wrong">,
|
|
224
|
+
"⛔ Type error: Something went wrong"
|
|
225
|
+
>();
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
test("IsSameType", () => {
|
|
229
|
+
assertType<IsSameType<string, string>, true>();
|
|
230
|
+
assertType<IsSameType<"value", string>, false>();
|
|
231
|
+
assertType<IsSameType<any, unknown>, false>();
|
|
232
|
+
assertType<IsSameType<unknown, unknown>, true>();
|
|
233
|
+
assertType<IsSameType<never, never>, true>();
|
|
234
|
+
assertType<IsSameType<never, unknown>, false>();
|
|
235
|
+
assertType<
|
|
236
|
+
IsSameType<{ readonly value: string }, { value: string }>,
|
|
237
|
+
false
|
|
238
|
+
>();
|
|
239
|
+
assertType<
|
|
240
|
+
IsSameType<
|
|
241
|
+
{ readonly value?: string },
|
|
242
|
+
{ readonly value: string | undefined }
|
|
243
|
+
>,
|
|
244
|
+
false
|
|
245
|
+
>();
|
|
246
|
+
assertType<
|
|
247
|
+
IsSameType<
|
|
248
|
+
{ readonly first: 1 } & { readonly second: 2 },
|
|
249
|
+
{ readonly first: 1; readonly second: 2 }
|
|
250
|
+
>,
|
|
251
|
+
false
|
|
252
|
+
>();
|
|
253
|
+
assertType<
|
|
254
|
+
IsSameType<
|
|
255
|
+
Simplify<{ readonly first: 1 } & { readonly second: 2 }>,
|
|
256
|
+
{ readonly first: 1; readonly second: 2 }
|
|
257
|
+
>,
|
|
258
|
+
true
|
|
259
|
+
>();
|
|
260
|
+
});
|
|
261
|
+
|
|
262
|
+
test("IsUnion", () => {
|
|
263
|
+
assertType<IsUnion<string>, false>();
|
|
264
|
+
assertType<IsUnion<string | number>, true>();
|
|
265
|
+
assertType<IsUnion<never>, false>();
|
|
266
|
+
assertType<IsUnion<any>, false>();
|
|
267
|
+
assertType<IsUnion<unknown>, false>();
|
|
268
|
+
assertType<IsUnion<boolean>, true>();
|
|
269
|
+
assertType<IsUnion<"a" | "b">, true>();
|
|
270
|
+
// oxlint-disable-next-line typescript/no-redundant-type-constituents -- Verifies IsUnion after TypeScript normalizes a string literal into string.
|
|
271
|
+
assertType<IsUnion<string | "a">, false>();
|
|
272
|
+
// oxlint-disable-next-line typescript/no-redundant-type-constituents -- Verifies IsUnion after TypeScript removes never from a union.
|
|
273
|
+
assertType<IsUnion<string | never>, false>();
|
|
274
|
+
assertType<IsUnion<{ readonly a: string } | { readonly b: number }>, true>();
|
|
275
|
+
assertType<IsUnion<[string | number]>, false>();
|
|
276
|
+
});
|
|
277
|
+
|
|
278
|
+
test("KeysOfUnion", () => {
|
|
279
|
+
assertType<
|
|
280
|
+
KeysOfUnion<
|
|
281
|
+
| { readonly id: string; readonly name: string }
|
|
282
|
+
| { readonly id: string; readonly count: number }
|
|
283
|
+
>,
|
|
284
|
+
"id" | "name" | "count"
|
|
285
|
+
>();
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
test("UnionToIntersection", () => {
|
|
289
|
+
assertType<
|
|
290
|
+
UnionToIntersection<
|
|
291
|
+
{ readonly first: string } | { readonly second: number }
|
|
292
|
+
>,
|
|
293
|
+
{ readonly first: string } & { readonly second: number }
|
|
294
|
+
>();
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
test("ParameterIntersection", () => {
|
|
298
|
+
type First = (value: { readonly first: string }) => void;
|
|
299
|
+
type Second = (value: { readonly second: number }) => void;
|
|
300
|
+
type Unknown = (value: unknown) => void;
|
|
301
|
+
|
|
302
|
+
assertType<
|
|
303
|
+
ParameterIntersection<First | Second>,
|
|
304
|
+
{ readonly first: string } & { readonly second: number }
|
|
305
|
+
>();
|
|
306
|
+
assertType<
|
|
307
|
+
ParameterIntersection<First | Second | Unknown>,
|
|
308
|
+
{ readonly first: string } & { readonly second: number }
|
|
309
|
+
>();
|
|
310
|
+
});
|
|
311
|
+
|
|
312
|
+
test("DistributiveOmit", () => {
|
|
313
|
+
type Event =
|
|
314
|
+
| { readonly type: "a"; readonly a: string; readonly shared: number }
|
|
315
|
+
| { readonly type: "b"; readonly b: number; readonly shared: number };
|
|
316
|
+
|
|
317
|
+
type Payload = DistributiveOmit<Event, "shared">;
|
|
318
|
+
|
|
319
|
+
assertType<
|
|
320
|
+
Payload,
|
|
321
|
+
| { readonly type: "a"; readonly a: string }
|
|
322
|
+
| { readonly type: "b"; readonly b: number }
|
|
323
|
+
>();
|
|
324
|
+
});
|
package/src/Types.ts
CHANGED
|
@@ -113,7 +113,7 @@ export type PredicateWithIndex<T> = (value: T, index: number) => boolean;
|
|
|
113
113
|
* ### Narrowing a value
|
|
114
114
|
*
|
|
115
115
|
* ```ts
|
|
116
|
-
* import {
|
|
116
|
+
* import { assertEqual, assertTrue, type Refinement } from "@evolu/common";
|
|
117
117
|
*
|
|
118
118
|
* interface Animal {
|
|
119
119
|
* readonly name: string;
|
|
@@ -126,7 +126,7 @@ export type PredicateWithIndex<T> = (value: T, index: number) => boolean;
|
|
|
126
126
|
* "breed" in animal;
|
|
127
127
|
* const dog: Dog = { name: "Dog", breed: "Beagle" };
|
|
128
128
|
* const animal: Animal = dog;
|
|
129
|
-
*
|
|
129
|
+
* assertTrue(isDog(animal));
|
|
130
130
|
*
|
|
131
131
|
* assertEqual(animal.breed, "Beagle");
|
|
132
132
|
* ```
|
|
@@ -166,7 +166,7 @@ export type Refinement<in A, out B extends A> = (a: A) => a is B;
|
|
|
166
166
|
* ];
|
|
167
167
|
* const [numbers, others] = partitionArray(items, isNumberItem);
|
|
168
168
|
*
|
|
169
|
-
* assertType<ReadonlyArray<NumberItem
|
|
169
|
+
* assertType<typeof numbers, ReadonlyArray<NumberItem>>();
|
|
170
170
|
* assertTrue(numbers[0]?.value === 2);
|
|
171
171
|
* assertTrue(others[0]?.value === 1);
|
|
172
172
|
* ```
|
|
@@ -248,7 +248,7 @@ export const isInstance =
|
|
|
248
248
|
(value: unknown): value is Value =>
|
|
249
249
|
value !== null &&
|
|
250
250
|
typeof value === "object" &&
|
|
251
|
-
|
|
251
|
+
Object.hasOwn(value, "~evolu/instance") &&
|
|
252
252
|
(value as Instance<string>)["~evolu/instance"] === name;
|
|
253
253
|
|
|
254
254
|
/**
|
|
@@ -268,11 +268,11 @@ export const isInstance =
|
|
|
268
268
|
* };
|
|
269
269
|
*
|
|
270
270
|
* assertType<
|
|
271
|
+
* NullablePartial<Example>,
|
|
271
272
|
* {
|
|
272
273
|
* required: string;
|
|
273
274
|
* optionalWithNull?: string | null;
|
|
274
|
-
* }
|
|
275
|
-
* NullablePartial<Example>
|
|
275
|
+
* }
|
|
276
276
|
* >();
|
|
277
277
|
* ```
|
|
278
278
|
*/
|
|
@@ -336,11 +336,11 @@ export type Writable<T> = {
|
|
|
336
336
|
* type B = Simplify<A>;
|
|
337
337
|
*
|
|
338
338
|
* assertType<
|
|
339
|
+
* B,
|
|
339
340
|
* {
|
|
340
341
|
* a: string;
|
|
341
342
|
* b: number;
|
|
342
|
-
* }
|
|
343
|
-
* B
|
|
343
|
+
* }
|
|
344
344
|
* >();
|
|
345
345
|
* ```
|
|
346
346
|
*/
|
|
@@ -434,10 +434,10 @@ export type CompileTimeError<
|
|
|
434
434
|
* import { assertType, type IsSameType } from "@evolu/common";
|
|
435
435
|
*
|
|
436
436
|
* assertType<
|
|
437
|
-
*
|
|
438
|
-
*
|
|
437
|
+
* IsSameType<{ readonly id: string }, { readonly id: string }>,
|
|
438
|
+
* true
|
|
439
439
|
* >();
|
|
440
|
-
* assertType<
|
|
440
|
+
* assertType<IsSameType<"ready", string>, false>();
|
|
441
441
|
* ```
|
|
442
442
|
*/
|
|
443
443
|
export type IsSameType<A, B> =
|
|
@@ -496,8 +496,8 @@ export type ParameterIntersection<T> = [T] extends [(value: infer I) => void]
|
|
|
496
496
|
* type Payload = DistributiveOmit<Event, "shared">;
|
|
497
497
|
*
|
|
498
498
|
* assertType<
|
|
499
|
-
*
|
|
500
|
-
*
|
|
499
|
+
* Payload,
|
|
500
|
+
* { type: "a"; a: string } | { type: "b"; b: number }
|
|
501
501
|
* >();
|
|
502
502
|
* ```
|
|
503
503
|
*/
|
package/src/WebSocket.ts
CHANGED
|
@@ -53,10 +53,10 @@ import { ArrayBuffer, String, Uint8Array, type Typed } from "./Type.ts";
|
|
|
53
53
|
*
|
|
54
54
|
* ```ts
|
|
55
55
|
* import {
|
|
56
|
-
* assert,
|
|
57
56
|
* assertEqual,
|
|
57
|
+
* assertLength,
|
|
58
58
|
* assertOk,
|
|
59
|
-
*
|
|
59
|
+
* assertSame,
|
|
60
60
|
* createRun,
|
|
61
61
|
* createWebSocket,
|
|
62
62
|
* testCreateWebSocket,
|
|
@@ -83,12 +83,9 @@ import { ArrayBuffer, String, Uint8Array, type Typed } from "./Type.ts";
|
|
|
83
83
|
* await using run = createRun();
|
|
84
84
|
*
|
|
85
85
|
* assertOk(await run(connectAndSend(socketFactory)), undefined);
|
|
86
|
-
*
|
|
86
|
+
* assertLength(socketFactory.sentMessages, 1);
|
|
87
87
|
* const message = socketFactory.sentMessages[0];
|
|
88
|
-
*
|
|
89
|
-
* message !== undefined && typeof message.data === "string",
|
|
90
|
-
* "Expected a text message.",
|
|
91
|
-
* );
|
|
88
|
+
* assertSame(typeof message.data, "string");
|
|
92
89
|
* assertEqual(
|
|
93
90
|
* { url: message.url, data: message.data },
|
|
94
91
|
* { url: "wss://example.com", data: "Hello" },
|