@inlang/sdk 0.28.2 → 0.28.3
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.
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solid.test.d.ts","sourceRoot":"","sources":["../../src/reactivity/solid.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { createSignal, createEffect, createMemo } from "./solid.js";
|
|
3
|
+
function sleep(ms) {
|
|
4
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
5
|
+
}
|
|
6
|
+
describe("solid", () => {
|
|
7
|
+
it("sets and gets", () => {
|
|
8
|
+
const [get, set] = createSignal(0);
|
|
9
|
+
expect(get()).toBe(0);
|
|
10
|
+
set(1);
|
|
11
|
+
expect(get()).toBe(1);
|
|
12
|
+
});
|
|
13
|
+
it("runs an effect whenn the signal value change", () => {
|
|
14
|
+
const [get, set] = createSignal(0);
|
|
15
|
+
let count = 0;
|
|
16
|
+
createEffect(() => {
|
|
17
|
+
count++;
|
|
18
|
+
get();
|
|
19
|
+
});
|
|
20
|
+
expect(count).toBe(1);
|
|
21
|
+
set(1);
|
|
22
|
+
expect(count).toBe(2);
|
|
23
|
+
set(1);
|
|
24
|
+
expect(count).toBe(2);
|
|
25
|
+
set(0);
|
|
26
|
+
expect(count).toBe(3);
|
|
27
|
+
});
|
|
28
|
+
it("runs an effect on a derived signal, when the underlying signal changes", () => {
|
|
29
|
+
const [get, set] = createSignal(0);
|
|
30
|
+
const derived = () => get() * 2;
|
|
31
|
+
let count = 0;
|
|
32
|
+
createEffect(() => {
|
|
33
|
+
count++;
|
|
34
|
+
derived();
|
|
35
|
+
});
|
|
36
|
+
expect(count).toBe(1);
|
|
37
|
+
set(1);
|
|
38
|
+
expect(count).toBe(2);
|
|
39
|
+
set(1);
|
|
40
|
+
expect(count).toBe(2);
|
|
41
|
+
set(0);
|
|
42
|
+
expect(count).toBe(3);
|
|
43
|
+
});
|
|
44
|
+
it("signal values are not deep diffed for equality", () => {
|
|
45
|
+
const [get, set] = createSignal({ a: 0, b: [1, 2, 3], c: { d: 4 } });
|
|
46
|
+
let count = 0;
|
|
47
|
+
createEffect(() => {
|
|
48
|
+
count++;
|
|
49
|
+
get();
|
|
50
|
+
});
|
|
51
|
+
expect(count).toBe(1);
|
|
52
|
+
set({ a: 0, b: [1, 2, 3], c: { d: 5 } });
|
|
53
|
+
expect(count).toBe(2);
|
|
54
|
+
set({ a: 0, b: [1, 2, 3], c: { d: 5 } });
|
|
55
|
+
expect(count).toBe(3);
|
|
56
|
+
set({ a: 0, b: [1, 2, 3], c: { d: 4 } });
|
|
57
|
+
expect(count).toBe(4);
|
|
58
|
+
});
|
|
59
|
+
it("await in effect prevents signal from being tracked", async () => {
|
|
60
|
+
const [get, set] = createSignal(0);
|
|
61
|
+
let count = 0;
|
|
62
|
+
// effect bumps count - depends on get() - never gets called again
|
|
63
|
+
createEffect(async () => {
|
|
64
|
+
count++;
|
|
65
|
+
await sleep(0);
|
|
66
|
+
get();
|
|
67
|
+
});
|
|
68
|
+
expect(count).toBe(1);
|
|
69
|
+
set(1);
|
|
70
|
+
expect(count).toBe(1);
|
|
71
|
+
await sleep(0);
|
|
72
|
+
set(2);
|
|
73
|
+
expect(count).toBe(1);
|
|
74
|
+
});
|
|
75
|
+
it("signal behind function call is tracked - same as derived", async () => {
|
|
76
|
+
const [get, set] = createSignal(0);
|
|
77
|
+
let count = 0;
|
|
78
|
+
const fn = () => get();
|
|
79
|
+
createEffect(async () => {
|
|
80
|
+
count++;
|
|
81
|
+
fn();
|
|
82
|
+
});
|
|
83
|
+
expect(count).toBe(1);
|
|
84
|
+
set(1);
|
|
85
|
+
expect(count).toBe(2);
|
|
86
|
+
});
|
|
87
|
+
it("memoizes values and updates them when signals change", () => {
|
|
88
|
+
const [get, set] = createSignal(0);
|
|
89
|
+
let count = 0;
|
|
90
|
+
const memo = createMemo(() => {
|
|
91
|
+
count++;
|
|
92
|
+
return `memo = ${2 * get()}`;
|
|
93
|
+
});
|
|
94
|
+
expect(count).toBe(1);
|
|
95
|
+
expect(memo()).toBe("memo = 0");
|
|
96
|
+
expect(count).toBe(1);
|
|
97
|
+
expect(memo()).toBe("memo = 0");
|
|
98
|
+
expect(count).toBe(1);
|
|
99
|
+
set(1);
|
|
100
|
+
expect(count).toBe(2);
|
|
101
|
+
expect(memo()).toBe("memo = 2");
|
|
102
|
+
set(1);
|
|
103
|
+
expect(count).toBe(2);
|
|
104
|
+
expect(memo()).toBe("memo = 2");
|
|
105
|
+
expect(count).toBe(2);
|
|
106
|
+
expect(memo()).toBe("memo = 2");
|
|
107
|
+
set(1000);
|
|
108
|
+
expect(count).toBe(3);
|
|
109
|
+
expect(memo()).toBe("memo = 2000");
|
|
110
|
+
});
|
|
111
|
+
});
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inlang/sdk",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.28.
|
|
4
|
+
"version": "0.28.3",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"publishConfig": {
|
|
7
7
|
"access": "public"
|
|
@@ -34,14 +34,14 @@
|
|
|
34
34
|
"throttle-debounce": "^5.0.0",
|
|
35
35
|
"@inlang/json-types": "1.1.0",
|
|
36
36
|
"@inlang/message": "2.1.0",
|
|
37
|
-
"@inlang/language-tag": "1.5.1",
|
|
38
37
|
"@inlang/message-lint-rule": "1.4.5",
|
|
38
|
+
"@inlang/language-tag": "1.5.1",
|
|
39
|
+
"@inlang/module": "1.2.9",
|
|
39
40
|
"@inlang/plugin": "2.4.9",
|
|
40
41
|
"@inlang/project-settings": "2.4.0",
|
|
41
|
-
"@inlang/module": "1.2.9",
|
|
42
|
-
"@inlang/translatable": "1.3.1",
|
|
43
42
|
"@inlang/result": "1.1.0",
|
|
44
|
-
"@
|
|
43
|
+
"@inlang/translatable": "1.3.1",
|
|
44
|
+
"@lix-js/client": "1.2.0",
|
|
45
45
|
"@lix-js/fs": "1.0.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
package/src/loadProject.ts
CHANGED
|
@@ -37,7 +37,7 @@ import { maybeCreateFirstProjectId } from "./migrations/maybeCreateFirstProjectI
|
|
|
37
37
|
|
|
38
38
|
import { capture } from "./telemetry/capture.js"
|
|
39
39
|
import { identifyProject } from "./telemetry/groupIdentify.js"
|
|
40
|
-
import type { NodeishStats } from "
|
|
40
|
+
import type { NodeishStats } from "@lix-js/fs"
|
|
41
41
|
|
|
42
42
|
import _debug from "debug"
|
|
43
43
|
const debug = _debug("loadProject")
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest"
|
|
2
|
+
import { createSignal, createEffect, createMemo } from "./solid.js"
|
|
3
|
+
|
|
4
|
+
function sleep(ms: number) {
|
|
5
|
+
return new Promise((resolve) => setTimeout(resolve, ms))
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
describe("solid", () => {
|
|
9
|
+
it("sets and gets", () => {
|
|
10
|
+
const [get, set] = createSignal(0)
|
|
11
|
+
|
|
12
|
+
expect(get()).toBe(0)
|
|
13
|
+
set(1)
|
|
14
|
+
expect(get()).toBe(1)
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
it("runs an effect whenn the signal value change", () => {
|
|
18
|
+
const [get, set] = createSignal(0)
|
|
19
|
+
let count = 0
|
|
20
|
+
createEffect(() => {
|
|
21
|
+
count++
|
|
22
|
+
get()
|
|
23
|
+
})
|
|
24
|
+
expect(count).toBe(1)
|
|
25
|
+
set(1)
|
|
26
|
+
expect(count).toBe(2)
|
|
27
|
+
set(1)
|
|
28
|
+
expect(count).toBe(2)
|
|
29
|
+
set(0)
|
|
30
|
+
expect(count).toBe(3)
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it("runs an effect on a derived signal, when the underlying signal changes", () => {
|
|
34
|
+
const [get, set] = createSignal(0)
|
|
35
|
+
const derived = () => get() * 2
|
|
36
|
+
let count = 0
|
|
37
|
+
createEffect(() => {
|
|
38
|
+
count++
|
|
39
|
+
derived()
|
|
40
|
+
})
|
|
41
|
+
expect(count).toBe(1)
|
|
42
|
+
set(1)
|
|
43
|
+
expect(count).toBe(2)
|
|
44
|
+
set(1)
|
|
45
|
+
expect(count).toBe(2)
|
|
46
|
+
set(0)
|
|
47
|
+
expect(count).toBe(3)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
it("signal values are not deep diffed for equality", () => {
|
|
51
|
+
const [get, set] = createSignal({ a: 0, b: [1, 2, 3], c: { d: 4 } })
|
|
52
|
+
let count = 0
|
|
53
|
+
createEffect(() => {
|
|
54
|
+
count++
|
|
55
|
+
get()
|
|
56
|
+
})
|
|
57
|
+
expect(count).toBe(1)
|
|
58
|
+
set({ a: 0, b: [1, 2, 3], c: { d: 5 } })
|
|
59
|
+
expect(count).toBe(2)
|
|
60
|
+
set({ a: 0, b: [1, 2, 3], c: { d: 5 } })
|
|
61
|
+
expect(count).toBe(3)
|
|
62
|
+
set({ a: 0, b: [1, 2, 3], c: { d: 4 } })
|
|
63
|
+
expect(count).toBe(4)
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
it("await in effect prevents signal from being tracked", async () => {
|
|
67
|
+
const [get, set] = createSignal(0)
|
|
68
|
+
let count = 0
|
|
69
|
+
// effect bumps count - depends on get() - never gets called again
|
|
70
|
+
createEffect(async () => {
|
|
71
|
+
count++
|
|
72
|
+
await sleep(0)
|
|
73
|
+
get()
|
|
74
|
+
})
|
|
75
|
+
expect(count).toBe(1)
|
|
76
|
+
set(1)
|
|
77
|
+
expect(count).toBe(1)
|
|
78
|
+
await sleep(0)
|
|
79
|
+
set(2)
|
|
80
|
+
expect(count).toBe(1)
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it("signal behind function call is tracked - same as derived", async () => {
|
|
84
|
+
const [get, set] = createSignal(0)
|
|
85
|
+
let count = 0
|
|
86
|
+
const fn = () => get()
|
|
87
|
+
createEffect(async () => {
|
|
88
|
+
count++
|
|
89
|
+
fn()
|
|
90
|
+
})
|
|
91
|
+
expect(count).toBe(1)
|
|
92
|
+
set(1)
|
|
93
|
+
expect(count).toBe(2)
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
it("memoizes values and updates them when signals change", () => {
|
|
97
|
+
const [get, set] = createSignal(0)
|
|
98
|
+
let count = 0
|
|
99
|
+
const memo = createMemo(() => {
|
|
100
|
+
count++
|
|
101
|
+
return `memo = ${2 * get()}`
|
|
102
|
+
})
|
|
103
|
+
expect(count).toBe(1)
|
|
104
|
+
expect(memo()).toBe("memo = 0")
|
|
105
|
+
expect(count).toBe(1)
|
|
106
|
+
expect(memo()).toBe("memo = 0")
|
|
107
|
+
expect(count).toBe(1)
|
|
108
|
+
set(1)
|
|
109
|
+
expect(count).toBe(2)
|
|
110
|
+
expect(memo()).toBe("memo = 2")
|
|
111
|
+
set(1)
|
|
112
|
+
expect(count).toBe(2)
|
|
113
|
+
expect(memo()).toBe("memo = 2")
|
|
114
|
+
expect(count).toBe(2)
|
|
115
|
+
expect(memo()).toBe("memo = 2")
|
|
116
|
+
set(1000)
|
|
117
|
+
expect(count).toBe(3)
|
|
118
|
+
expect(memo()).toBe("memo = 2000")
|
|
119
|
+
})
|
|
120
|
+
})
|