Skip to content

Commit 803fd8b

Browse files
committed
✨ initial implementation
1 parent 2f3b2ec commit 803fd8b

6 files changed

+108
-18
lines changed

index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
export { default as createDeepMemo } from "./src/createDeepMemo";
2+
export { default as createDeepSignal } from "./src/createDeepSignal";

package.json

+19-4
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,25 @@
11
{
2-
"name": "{{data.name}}",
2+
"name": "create-deep",
33
"version": "0.1.0",
4-
"description": "{{data.description}}",
4+
"description": "Mimics SolidJS's `createSignal()` and `createMemo()` but with deep equality checks",
55
"license": "MIT",
6-
"repository": "astoilkov/{{data.name}}",
6+
"repository": "astoilkov/create-deep",
77
"funding": "https://github.com/sponsors/astoilkov",
88
"author": {
99
"name": "Antonio Stoilkov",
1010
"email": "hello@astoilkov.com",
1111
"url": "https://astoilkov.com"
1212
},
1313
"keywords": [
14-
"{{data.keywords}}"
14+
"SolidJS",
15+
"memo",
16+
"signal",
17+
"createMemo",
18+
"createSignal",
19+
"createDeepMemo",
20+
"createDeepSignal",
21+
"deep equality",
22+
"reactivity"
1523
],
1624
"type": "module",
1725
"exports": {
@@ -33,11 +41,18 @@
3341
"src/*.js",
3442
"src/*.d.ts"
3543
],
44+
"dependencies": {
45+
"dequal": "^2.0.3"
46+
},
47+
"peerDependencies": {
48+
"solid-js": ">=1.5"
49+
},
3650
"devDependencies": {
3751
"@vitest/coverage-v8": "^0.33.0",
3852
"jsdom": "^22.1.0",
3953
"np": "^8.0.4",
4054
"prettier": "^3.0.3",
55+
"solid-js": "^1.8.6",
4156
"typescript": "^5.2.2",
4257
"vitest": "^0.34.6"
4358
}

readme.md

+24-10
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,36 @@
1-
# `{{data.name}}`
1+
# `create-deep`
22

3-
> {{data.description}}
3+
> Mimics SolidJS's `createSignal()` and `createMemo()` but with deep equality checks.
44
5-
[![Gzipped Size](https://img.shields.io/bundlephobia/minzip/{{data.name}})](https://bundlephobia.com/result?p={{data.name}})
6-
[![Build Status](https://img.shields.io/github/actions/workflow/status/astoilkov/{{data.name}}/main.yml?branch=main)](https://github.com/astoilkov/{{data.name}}/actions/workflows/main.yml)
5+
[![Gzipped Size](https://img.shields.io/bundlephobia/minzip/create-deep)](https://bundlephobia.com/result?p=create-deep)
6+
[![Build Status](https://img.shields.io/github/actions/workflow/status/astoilkov/create-deep/main.yml?branch=main)](https://github.com/astoilkov/create-deep/actions/workflows/main.yml)
77

88
## Install
99

1010
```bash
11-
npm install {{data.name}}
11+
npm install create-deep
1212
```
1313

14-
## Why
14+
## API
1515

16-
## Usage
16+
[`dequal`](https://github.com/lukeed/dequal) is used for the deep equality checks.
1717

18-
## API
18+
#### `createDeepSignal<T>(value?: T)`
19+
20+
```ts
21+
function Component() {
22+
const [value, setValue] = createDeepSignal([1, 2, 3])
23+
}
24+
```
25+
26+
#### `createDeepMemo<T>(() => T)`
27+
28+
```ts
29+
function Component() {
30+
const value = createDeepMemo(() => {
31+
return items().filter(item => item.size > 0)
32+
})
33+
}
34+
```
1935

20-
## Alternatives
2136

22-
## Related

src/createDeepMemo.ts

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { dequal } from "dequal";
2+
import {
3+
Accessor,
4+
createMemo,
5+
EffectFunction,
6+
MemoOptions,
7+
NoInfer,
8+
} from "solid-js";
9+
10+
export default function createDeepMemo<Next extends Prev, Prev = Next>(
11+
fn: EffectFunction<undefined | NoInfer<Prev>, Next>,
12+
): Accessor<Next>;
13+
export default function createDeepMemo<
14+
Next extends Prev,
15+
Init = Next,
16+
Prev = Next,
17+
>(
18+
fn: EffectFunction<Init | Prev, Next>,
19+
value: Init,
20+
options?: MemoOptions<Next>,
21+
): Accessor<Next>;
22+
export default function createDeepMemo<
23+
Next extends Prev,
24+
Init = Next,
25+
Prev = Next,
26+
>(
27+
fn: EffectFunction<undefined | NoInfer<Prev> | Init | Prev, Next>,
28+
value?: Init,
29+
options?: MemoOptions<Next>,
30+
): Accessor<Next> {
31+
return createMemo(fn, value, {
32+
equals: dequal,
33+
...options,
34+
});
35+
}

src/createDeepSignal.ts

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { dequal } from "dequal";
2+
import { createSignal, Signal, SignalOptions } from "solid-js";
3+
4+
export default function createDeepSignal<T>(): Signal<T | undefined>;
5+
export default function createDeepSignal<T>(
6+
value: T,
7+
options?: SignalOptions<T>,
8+
): Signal<T>;
9+
export default function createDeepSignal<T>(
10+
value?: T,
11+
options?: SignalOptions<T | undefined>,
12+
): Signal<T | undefined> {
13+
return createSignal(value, {
14+
equals: dequal,
15+
...options,
16+
});
17+
}

test.ts

+11-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
1-
import { describe, expect, test } from "vitest";
1+
import { describe, test } from "vitest";
2+
import createDeepMemo from "./src/createDeepMemo";
3+
import createDeepSignal from "./src/createDeepSignal";
24

3-
describe("{{data.name}}", () => {
4-
test("", () => {
5-
expect(true).toBe(true);
5+
// for some reason, Solid reactivity doesn't work in tests
6+
describe("create-deep", () => {
7+
test("createDeepSignal()", () => {
8+
createDeepSignal(() => [1, 2, 3]);
9+
});
10+
11+
test("createDeepMemo()", () => {
12+
createDeepMemo(() => [1, 2, 3]);
613
});
714
});

0 commit comments

Comments
 (0)