@firsthandjs/deep 0.2.0 → 0.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/README.md +1 -1
- package/dist/dev.d.ts +5 -0
- package/dist/dev.d.ts.map +1 -0
- package/dist/dev.prod.d.ts +4 -0
- package/dist/dev.prod.d.ts.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.dev.js +157 -0
- package/dist/index.js +1 -1
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -9,7 +9,7 @@ signal — the shape Vue calls `reactive()`.
|
|
|
9
9
|
npm install @firsthandjs/deep
|
|
10
10
|
```
|
|
11
11
|
|
|
12
|
-
0.
|
|
12
|
+
0.74 kB gzip. It depends on `@firsthandjs/core` and changes nothing about
|
|
13
13
|
`signal`.
|
|
14
14
|
|
|
15
15
|
```ts
|
package/dist/dev.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Records where a nested object sits, on the way out of the parent's trap. */
|
|
2
|
+
export declare function devRemember(parent: object, key: PropertyKey, child: object): void;
|
|
3
|
+
/** Names a version cell after the property it stands for. */
|
|
4
|
+
export declare function devLabelProperty(cell: object, target: object, key: PropertyKey): void;
|
|
5
|
+
//# sourceMappingURL=dev.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../src/dev.ts"],"names":[],"mappings":"AAyBA,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAMjF;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI,CAQrF"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Production stub for `dev.ts`. Aliased in by the build; see `dev.ts`. */
|
|
2
|
+
export declare function devRemember(_parent: object, _key: PropertyKey, _child: object): void;
|
|
3
|
+
export declare function devLabelProperty(_cell: object, _target: object, _key: PropertyKey): void;
|
|
4
|
+
//# sourceMappingURL=dev.prod.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev.prod.d.ts","sourceRoot":"","sources":["../src/dev.prod.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAE3E,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAEpF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAExF"}
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAmCA;;;;;;;;GAQG;AACH,MAAM,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,OAAO,EAAE,CAAC;AAuK5D;;;;;;;;;;;GAWG;AACH,wBAAgB,UAAU,CAAC,CAAC,SAAS,IAAI,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAStD;AAED;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAMlC;AAED,uDAAuD;AACvD,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAI9C"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
// packages/deep/src/index.ts
|
|
2
|
+
import { batch, signal } from "@firsthandjs/core";
|
|
3
|
+
|
|
4
|
+
// packages/deep/src/dev.ts
|
|
5
|
+
var paths = /* @__PURE__ */ new WeakMap();
|
|
6
|
+
function hook() {
|
|
7
|
+
const installed = globalThis.__FIRSTHAND_DEVTOOLS__;
|
|
8
|
+
return installed !== void 0 && installed.attached ? installed : void 0;
|
|
9
|
+
}
|
|
10
|
+
function devRemember(parent, key, child) {
|
|
11
|
+
if (hook() === void 0 || paths.has(child)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const prefix = paths.get(parent);
|
|
15
|
+
paths.set(child, prefix === void 0 ? String(key) : `${prefix}.${String(key)}`);
|
|
16
|
+
}
|
|
17
|
+
function devLabelProperty(cell, target, key) {
|
|
18
|
+
const prefix = paths.get(target);
|
|
19
|
+
const name = typeof key === "symbol" ? "keys" : String(key);
|
|
20
|
+
hook()?.label(cell, "signal", prefix === void 0 ? name : `${prefix}.${name}`);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// packages/deep/src/index.ts
|
|
24
|
+
var RAW = /* @__PURE__ */ Symbol.for("firsthand.deep.raw");
|
|
25
|
+
var proxies = /* @__PURE__ */ new WeakMap();
|
|
26
|
+
var versions = /* @__PURE__ */ new WeakMap();
|
|
27
|
+
var KEYS = /* @__PURE__ */ Symbol.for("firsthand.deep.keys");
|
|
28
|
+
function versionOf(target, key) {
|
|
29
|
+
let table = versions.get(target);
|
|
30
|
+
if (table === void 0) {
|
|
31
|
+
table = /* @__PURE__ */ new Map();
|
|
32
|
+
versions.set(target, table);
|
|
33
|
+
}
|
|
34
|
+
let cell = table.get(key);
|
|
35
|
+
if (cell === void 0) {
|
|
36
|
+
cell = signal(0);
|
|
37
|
+
devLabelProperty(cell, target, key);
|
|
38
|
+
table.set(key, cell);
|
|
39
|
+
}
|
|
40
|
+
return cell;
|
|
41
|
+
}
|
|
42
|
+
function track(target, key) {
|
|
43
|
+
versionOf(target, key).value;
|
|
44
|
+
}
|
|
45
|
+
function trigger(target, key) {
|
|
46
|
+
const cell = versions.get(target)?.get(key);
|
|
47
|
+
if (cell !== void 0) {
|
|
48
|
+
cell.value++;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function reactiveKind(value) {
|
|
52
|
+
if (typeof value !== "object" || value === null) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
if (Array.isArray(value)) {
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
const prototype = Object.getPrototypeOf(value);
|
|
59
|
+
return prototype === Object.prototype || prototype === null;
|
|
60
|
+
}
|
|
61
|
+
var MUTATORS = /* @__PURE__ */ new Set([
|
|
62
|
+
"push",
|
|
63
|
+
"pop",
|
|
64
|
+
"shift",
|
|
65
|
+
"unshift",
|
|
66
|
+
"splice",
|
|
67
|
+
"sort",
|
|
68
|
+
"reverse",
|
|
69
|
+
"fill",
|
|
70
|
+
"copyWithin"
|
|
71
|
+
]);
|
|
72
|
+
var handler = {
|
|
73
|
+
get(target, key, receiver) {
|
|
74
|
+
if (key === RAW) {
|
|
75
|
+
return target;
|
|
76
|
+
}
|
|
77
|
+
const value = Reflect.get(target, key, receiver);
|
|
78
|
+
if (typeof key === "symbol") {
|
|
79
|
+
return value;
|
|
80
|
+
}
|
|
81
|
+
if (Array.isArray(target) && typeof value === "function" && MUTATORS.has(key)) {
|
|
82
|
+
return function mutate(...args) {
|
|
83
|
+
return batch(() => value.apply(receiver, args));
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
track(target, key);
|
|
87
|
+
if (!reactiveKind(value)) {
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
devRemember(target, key, value);
|
|
91
|
+
return deepSignal(value);
|
|
92
|
+
},
|
|
93
|
+
set(target, key, next, receiver) {
|
|
94
|
+
const array = Array.isArray(target);
|
|
95
|
+
const had = Object.prototype.hasOwnProperty.call(target, key);
|
|
96
|
+
const previous = Reflect.get(target, key, receiver);
|
|
97
|
+
const lengthBefore = array ? target.length : 0;
|
|
98
|
+
const value = raw(next);
|
|
99
|
+
if (!Reflect.set(target, key, value, receiver)) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
if (!had) {
|
|
103
|
+
trigger(target, KEYS);
|
|
104
|
+
trigger(target, key);
|
|
105
|
+
} else if (!Object.is(previous, value)) {
|
|
106
|
+
trigger(target, key);
|
|
107
|
+
}
|
|
108
|
+
if (array && key !== "length" && target.length !== lengthBefore) {
|
|
109
|
+
trigger(target, "length");
|
|
110
|
+
}
|
|
111
|
+
return true;
|
|
112
|
+
},
|
|
113
|
+
deleteProperty(target, key) {
|
|
114
|
+
const had = Object.prototype.hasOwnProperty.call(target, key);
|
|
115
|
+
const deleted = Reflect.deleteProperty(target, key);
|
|
116
|
+
if (deleted && had) {
|
|
117
|
+
trigger(target, key);
|
|
118
|
+
trigger(target, KEYS);
|
|
119
|
+
}
|
|
120
|
+
return deleted;
|
|
121
|
+
},
|
|
122
|
+
has(target, key) {
|
|
123
|
+
if (typeof key !== "symbol") {
|
|
124
|
+
track(target, key);
|
|
125
|
+
}
|
|
126
|
+
return Reflect.has(target, key);
|
|
127
|
+
},
|
|
128
|
+
ownKeys(target) {
|
|
129
|
+
track(target, Array.isArray(target) ? "length" : KEYS);
|
|
130
|
+
return Reflect.ownKeys(target);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
function deepSignal(value) {
|
|
134
|
+
const target = raw(value);
|
|
135
|
+
const existing = proxies.get(target);
|
|
136
|
+
if (existing !== void 0) {
|
|
137
|
+
return existing;
|
|
138
|
+
}
|
|
139
|
+
const created = new Proxy(target, handler);
|
|
140
|
+
proxies.set(target, created);
|
|
141
|
+
return created;
|
|
142
|
+
}
|
|
143
|
+
function raw(value) {
|
|
144
|
+
if (typeof value !== "object" || value === null) {
|
|
145
|
+
return value;
|
|
146
|
+
}
|
|
147
|
+
const inner = value[RAW];
|
|
148
|
+
return inner === void 0 ? value : inner;
|
|
149
|
+
}
|
|
150
|
+
function isDeep(value) {
|
|
151
|
+
return typeof value === "object" && value !== null && value[RAW] !== void 0;
|
|
152
|
+
}
|
|
153
|
+
export {
|
|
154
|
+
deepSignal,
|
|
155
|
+
isDeep,
|
|
156
|
+
raw
|
|
157
|
+
};
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{batch as
|
|
1
|
+
import{batch as w,signal as h}from"@firsthandjs/core";var p=Symbol.for("firsthand.deep.raw"),y=new WeakMap,f=new WeakMap,c=Symbol.for("firsthand.deep.keys");function j(e,n){let t=f.get(e);t===void 0&&(t=new Map,f.set(e,t));let o=t.get(n);return o===void 0&&(o=h(0),t.set(n,o)),o}function u(e,n){j(e,n).value}function r(e,n){let t=f.get(e)?.get(n);t!==void 0&&t.value++}function m(e){if(typeof e!="object"||e===null)return!1;if(Array.isArray(e))return!0;let n=Object.getPrototypeOf(e);return n===Object.prototype||n===null}var P=new Set(["push","pop","shift","unshift","splice","sort","reverse","fill","copyWithin"]),R={get(e,n,t){if(n===p)return e;let o=Reflect.get(e,n,t);return typeof n=="symbol"?o:Array.isArray(e)&&typeof o=="function"&&P.has(n)?function(...s){return w(()=>o.apply(t,s))}:(u(e,n),m(o)?A(o):o)},set(e,n,t,o){let i=Array.isArray(e),s=Object.prototype.hasOwnProperty.call(e,n),b=Reflect.get(e,n,o),a=i?e.length:0,l=d(t);return Reflect.set(e,n,l,o)?(s?Object.is(b,l)||r(e,n):(r(e,c),r(e,n)),i&&n!=="length"&&e.length!==a&&r(e,"length"),!0):!1},deleteProperty(e,n){let t=Object.prototype.hasOwnProperty.call(e,n),o=Reflect.deleteProperty(e,n);return o&&t&&(r(e,n),r(e,c)),o},has(e,n){return typeof n!="symbol"&&u(e,n),Reflect.has(e,n)},ownKeys(e){return u(e,Array.isArray(e)?"length":c),Reflect.ownKeys(e)}};function A(e){let n=d(e),t=y.get(n);if(t!==void 0)return t;let o=new Proxy(n,R);return y.set(n,o),o}function d(e){if(typeof e!="object"||e===null)return e;let n=e[p];return n===void 0?e:n}function v(e){return typeof e=="object"&&e!==null&&e[p]!==void 0}export{A as deepSignal,v as isDeep,d as raw};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@firsthandjs/deep",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Deep reactivity for Firsthand: a proxy where every property, at any depth, is a signal.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
"exports": {
|
|
9
9
|
".": {
|
|
10
10
|
"types": "./dist/index.d.ts",
|
|
11
|
+
"development": "./dist/index.dev.js",
|
|
11
12
|
"default": "./dist/index.js"
|
|
12
13
|
}
|
|
13
14
|
},
|
|
@@ -19,7 +20,7 @@
|
|
|
19
20
|
"LICENSE"
|
|
20
21
|
],
|
|
21
22
|
"dependencies": {
|
|
22
|
-
"@firsthandjs/core": "0.
|
|
23
|
+
"@firsthandjs/core": "0.4.0"
|
|
23
24
|
},
|
|
24
25
|
"engines": {
|
|
25
26
|
"node": ">=20.11.0"
|