@rlabs-inc/signals 1.1.0 → 1.2.1
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 +72 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -2
- package/dist/index.mjs +32 -2
- package/dist/primitives/bind.d.ts +29 -38
- package/dist/primitives/bind.d.ts.map +1 -1
- package/package.json +4 -1
package/README.md
CHANGED
|
@@ -8,6 +8,7 @@ A complete standalone mirror of Svelte 5's reactivity system. No compiler needed
|
|
|
8
8
|
|
|
9
9
|
- **True Fine-Grained Reactivity** - Changes to deeply nested properties only trigger effects that read that exact path
|
|
10
10
|
- **Per-Property Tracking** - Proxy-based deep reactivity with lazy signal creation per property
|
|
11
|
+
- **Reactive Bindings** - Two-way data binding with `bind()` for connecting reactive values
|
|
11
12
|
- **Three-State Dirty Tracking** - Efficient CLEAN/MAYBE_DIRTY/DIRTY propagation
|
|
12
13
|
- **Automatic Cleanup** - Effects clean up when disposed, no memory leaks
|
|
13
14
|
- **Batching** - Group updates to prevent redundant effect runs
|
|
@@ -94,6 +95,76 @@ Deriveds are:
|
|
|
94
95
|
- **Cached** - Value is memoized until dependencies change
|
|
95
96
|
- **Pure** - Cannot write to signals inside (throws error)
|
|
96
97
|
|
|
98
|
+
### Bindings
|
|
99
|
+
|
|
100
|
+
#### `bind<T>(source: WritableSignal<T>): Binding<T>`
|
|
101
|
+
|
|
102
|
+
Create a reactive binding that forwards reads and writes to a source signal. Useful for two-way data binding and connecting reactive values across components.
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
const source = signal(0)
|
|
106
|
+
const binding = bind(source)
|
|
107
|
+
|
|
108
|
+
// Reading through binding reads from source
|
|
109
|
+
console.log(binding.value) // 0
|
|
110
|
+
|
|
111
|
+
// Writing through binding writes to source
|
|
112
|
+
binding.value = 42
|
|
113
|
+
console.log(source.value) // 42
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
**Use cases:**
|
|
117
|
+
- Two-way binding for form inputs
|
|
118
|
+
- Connecting parent state to child components
|
|
119
|
+
- Creating reactive links between signals
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
// Two-way binding example
|
|
123
|
+
const username = signal('')
|
|
124
|
+
const inputBinding = bind(username)
|
|
125
|
+
|
|
126
|
+
// When user types (e.g., in a UI framework):
|
|
127
|
+
inputBinding.value = 'alice' // Updates username signal!
|
|
128
|
+
|
|
129
|
+
// When username changes programmatically:
|
|
130
|
+
username.value = 'bob' // inputBinding.value is now 'bob'
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
#### `bindReadonly<T>(source: ReadableSignal<T>): ReadonlyBinding<T>`
|
|
134
|
+
|
|
135
|
+
Create a read-only binding. Attempting to write throws an error.
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
const source = signal(0)
|
|
139
|
+
const readonly = bindReadonly(source)
|
|
140
|
+
|
|
141
|
+
console.log(readonly.value) // 0
|
|
142
|
+
// readonly.value = 42 // Would throw at compile time
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
#### `isBinding(value): boolean`
|
|
146
|
+
|
|
147
|
+
Check if a value is a binding.
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
const binding = bind(signal(0))
|
|
151
|
+
console.log(isBinding(binding)) // true
|
|
152
|
+
console.log(isBinding(signal(0))) // false
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
#### `unwrap<T>(value: T | Binding<T>): T`
|
|
156
|
+
|
|
157
|
+
Get the value from a binding, or return the value directly if not a binding.
|
|
158
|
+
|
|
159
|
+
```typescript
|
|
160
|
+
const arr: (string | Binding<string>)[] = [
|
|
161
|
+
'static',
|
|
162
|
+
bind(signal('dynamic'))
|
|
163
|
+
]
|
|
164
|
+
|
|
165
|
+
arr.map(unwrap) // ['static', 'dynamic']
|
|
166
|
+
```
|
|
167
|
+
|
|
97
168
|
### Effects
|
|
98
169
|
|
|
99
170
|
#### `effect(fn: () => void | CleanupFn): DisposeFn`
|
|
@@ -367,6 +438,7 @@ This library is designed for performance:
|
|
|
367
438
|
| DOM integration | Yes | No |
|
|
368
439
|
| Fine-grained reactivity | Yes | Yes |
|
|
369
440
|
| Deep proxy reactivity | Yes | Yes |
|
|
441
|
+
| Reactive bindings | `bind:` directive | `bind()` function |
|
|
370
442
|
| Batching | Yes | Yes |
|
|
371
443
|
| Effect cleanup | Yes | Yes |
|
|
372
444
|
| TypeScript | Yes | Yes |
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export { signal, source, mutableSource, state, stateRaw } from './primitives/signal.js';
|
|
2
2
|
export { derived, createDerived, disconnectDerived } from './primitives/derived.js';
|
|
3
3
|
export { effect, createEffect, updateEffect, destroyEffect } from './primitives/effect.js';
|
|
4
|
-
export { bind, bindReadonly, isBinding, unwrap } from './primitives/bind.js';
|
|
4
|
+
export { bind, bindReadonly, isBinding, unwrap, signals } from './primitives/bind.js';
|
|
5
5
|
export { proxy, toRaw, isReactive } from './deep/proxy.js';
|
|
6
6
|
export { batch, untrack, peek } from './reactivity/batching.js';
|
|
7
7
|
export { flushSync, tick } from './reactivity/scheduling.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACvF,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AACnF,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC1F,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAoBA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAA;AACvF,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AACnF,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC1F,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAMrF,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAM1D,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,4BAA4B,CAAA;AAM5D,OAAO,EACL,MAAM,EACN,UAAU,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,WAAW,EACX,YAAY,GACb,MAAM,0BAA0B,CAAA;AAMjC,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAMpD,OAAO,EACL,GAAG,EACH,GAAG,EACH,OAAO,EACP,eAAe,EACf,aAAa,EACb,cAAc,EACd,eAAe,GAChB,MAAM,0BAA0B,CAAA;AAMjC,OAAO,EAEL,OAAO,EACP,MAAM,EACN,aAAa,EACb,WAAW,EACX,aAAa,EACb,WAAW,EACX,YAAY,EAGZ,KAAK,EACL,KAAK,EACL,WAAW,EACX,oBAAoB,EACpB,SAAS,EACT,KAAK,EACL,UAAU,EACV,gBAAgB,EAGhB,OAAO,EACP,YAAY,EAGZ,aAAa,EACb,cAAc,EACd,YAAY,EACZ,eAAe,GAChB,MAAM,qBAAqB,CAAA;AAM5B,OAAO,EACL,cAAc,EACd,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,WAAW,EACX,UAAU,EAGV,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EAGnB,cAAc,EACd,eAAe,EACf,aAAa,GACd,MAAM,mBAAmB,CAAA;AAM1B,YAAY,EAEV,MAAM,EACN,MAAM,EACN,QAAQ,EACR,OAAO,EACP,MAAM,EACN,KAAK,EAGL,cAAc,EACd,cAAc,EACd,aAAa,EACb,SAAS,EACT,SAAS,EACT,QAAQ,EAGR,MAAM,EACN,aAAa,GACd,MAAM,iBAAiB,CAAA;AAExB,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -40,6 +40,7 @@ __export(exports_src, {
|
|
|
40
40
|
stateRaw: () => stateRaw,
|
|
41
41
|
state: () => state,
|
|
42
42
|
source: () => source,
|
|
43
|
+
signals: () => signals,
|
|
43
44
|
signal: () => signal,
|
|
44
45
|
shallowEquals: () => shallowEquals,
|
|
45
46
|
setUntracking: () => setUntracking,
|
|
@@ -966,14 +967,34 @@ var BINDING_SYMBOL = Symbol("binding");
|
|
|
966
967
|
function isBinding(value) {
|
|
967
968
|
return value !== null && typeof value === "object" && BINDING_SYMBOL in value;
|
|
968
969
|
}
|
|
970
|
+
function isSignal(value) {
|
|
971
|
+
return value !== null && typeof value === "object" && "value" in value;
|
|
972
|
+
}
|
|
973
|
+
function isGetter(value) {
|
|
974
|
+
return typeof value === "function";
|
|
975
|
+
}
|
|
969
976
|
function bind(source2) {
|
|
977
|
+
if (isGetter(source2)) {
|
|
978
|
+
return {
|
|
979
|
+
[BINDING_SYMBOL]: true,
|
|
980
|
+
get value() {
|
|
981
|
+
return source2();
|
|
982
|
+
}
|
|
983
|
+
};
|
|
984
|
+
}
|
|
985
|
+
let actualSource;
|
|
986
|
+
if (isBinding(source2) || isSignal(source2)) {
|
|
987
|
+
actualSource = source2;
|
|
988
|
+
} else {
|
|
989
|
+
actualSource = signal(source2);
|
|
990
|
+
}
|
|
970
991
|
const binding = {
|
|
971
992
|
[BINDING_SYMBOL]: true,
|
|
972
993
|
get value() {
|
|
973
|
-
return
|
|
994
|
+
return actualSource.value;
|
|
974
995
|
},
|
|
975
996
|
set value(v) {
|
|
976
|
-
|
|
997
|
+
actualSource.value = v;
|
|
977
998
|
}
|
|
978
999
|
};
|
|
979
1000
|
return binding;
|
|
@@ -992,6 +1013,15 @@ function unwrap(value) {
|
|
|
992
1013
|
}
|
|
993
1014
|
return value;
|
|
994
1015
|
}
|
|
1016
|
+
function signals(initial) {
|
|
1017
|
+
const result = {};
|
|
1018
|
+
for (const key in initial) {
|
|
1019
|
+
if (Object.prototype.hasOwnProperty.call(initial, key)) {
|
|
1020
|
+
result[key] = signal(initial[key]);
|
|
1021
|
+
}
|
|
1022
|
+
}
|
|
1023
|
+
return result;
|
|
1024
|
+
}
|
|
995
1025
|
// src/reactivity/batching.ts
|
|
996
1026
|
function batch(fn) {
|
|
997
1027
|
incrementBatchDepth();
|
package/dist/index.mjs
CHANGED
|
@@ -854,14 +854,34 @@ var BINDING_SYMBOL = Symbol("binding");
|
|
|
854
854
|
function isBinding(value) {
|
|
855
855
|
return value !== null && typeof value === "object" && BINDING_SYMBOL in value;
|
|
856
856
|
}
|
|
857
|
+
function isSignal(value) {
|
|
858
|
+
return value !== null && typeof value === "object" && "value" in value;
|
|
859
|
+
}
|
|
860
|
+
function isGetter(value) {
|
|
861
|
+
return typeof value === "function";
|
|
862
|
+
}
|
|
857
863
|
function bind(source2) {
|
|
864
|
+
if (isGetter(source2)) {
|
|
865
|
+
return {
|
|
866
|
+
[BINDING_SYMBOL]: true,
|
|
867
|
+
get value() {
|
|
868
|
+
return source2();
|
|
869
|
+
}
|
|
870
|
+
};
|
|
871
|
+
}
|
|
872
|
+
let actualSource;
|
|
873
|
+
if (isBinding(source2) || isSignal(source2)) {
|
|
874
|
+
actualSource = source2;
|
|
875
|
+
} else {
|
|
876
|
+
actualSource = signal(source2);
|
|
877
|
+
}
|
|
858
878
|
const binding = {
|
|
859
879
|
[BINDING_SYMBOL]: true,
|
|
860
880
|
get value() {
|
|
861
|
-
return
|
|
881
|
+
return actualSource.value;
|
|
862
882
|
},
|
|
863
883
|
set value(v) {
|
|
864
|
-
|
|
884
|
+
actualSource.value = v;
|
|
865
885
|
}
|
|
866
886
|
};
|
|
867
887
|
return binding;
|
|
@@ -880,6 +900,15 @@ function unwrap(value) {
|
|
|
880
900
|
}
|
|
881
901
|
return value;
|
|
882
902
|
}
|
|
903
|
+
function signals(initial) {
|
|
904
|
+
const result = {};
|
|
905
|
+
for (const key in initial) {
|
|
906
|
+
if (Object.prototype.hasOwnProperty.call(initial, key)) {
|
|
907
|
+
result[key] = signal(initial[key]);
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
return result;
|
|
911
|
+
}
|
|
883
912
|
// src/reactivity/batching.ts
|
|
884
913
|
function batch(fn) {
|
|
885
914
|
incrementBatchDepth();
|
|
@@ -1369,6 +1398,7 @@ export {
|
|
|
1369
1398
|
stateRaw,
|
|
1370
1399
|
state,
|
|
1371
1400
|
source,
|
|
1401
|
+
signals,
|
|
1372
1402
|
signal,
|
|
1373
1403
|
shallowEquals,
|
|
1374
1404
|
setUntracking,
|
|
@@ -18,48 +18,12 @@ export interface ReadonlyBinding<T> {
|
|
|
18
18
|
* Check if a value is a binding created by bind()
|
|
19
19
|
*/
|
|
20
20
|
export declare function isBinding(value: unknown): value is Binding<unknown>;
|
|
21
|
-
/**
|
|
22
|
-
* Create a reactive binding to a signal or another binding.
|
|
23
|
-
*
|
|
24
|
-
* A binding is a "reactive pointer" - it forwards reads and writes to the source.
|
|
25
|
-
* This enables connecting user's reactive state to internal component state.
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* ```ts
|
|
29
|
-
* const source = signal(0)
|
|
30
|
-
* const binding = bind(source)
|
|
31
|
-
*
|
|
32
|
-
* // Reading through binding reads from source (creates dependency)
|
|
33
|
-
* console.log(binding.value) // → 0
|
|
34
|
-
*
|
|
35
|
-
* // Writing through binding writes to source (triggers reactivity)
|
|
36
|
-
* binding.value = 42
|
|
37
|
-
* console.log(source.value) // → 42
|
|
38
|
-
* ```
|
|
39
|
-
*
|
|
40
|
-
* @example Two-way binding for inputs
|
|
41
|
-
* ```ts
|
|
42
|
-
* const username = signal('')
|
|
43
|
-
* const inputBinding = bind(username)
|
|
44
|
-
*
|
|
45
|
-
* // When user types:
|
|
46
|
-
* inputBinding.value = 'alice' // Updates username signal!
|
|
47
|
-
* ```
|
|
48
|
-
*
|
|
49
|
-
* @example Chaining bindings
|
|
50
|
-
* ```ts
|
|
51
|
-
* const source = signal(0)
|
|
52
|
-
* const b1 = bind(source)
|
|
53
|
-
* const b2 = bind(b1) // Points to same source
|
|
54
|
-
*
|
|
55
|
-
* b2.value = 99
|
|
56
|
-
* console.log(source.value) // → 99
|
|
57
|
-
* ```
|
|
58
|
-
*/
|
|
59
21
|
export declare function bind<T>(source: WritableSignal<T>): Binding<T>;
|
|
60
22
|
export declare function bind<T>(source: ReadableSignal<T>): ReadonlyBinding<T>;
|
|
61
23
|
export declare function bind<T>(source: Binding<T>): Binding<T>;
|
|
62
24
|
export declare function bind<T>(source: ReadonlyBinding<T>): ReadonlyBinding<T>;
|
|
25
|
+
export declare function bind<T>(source: () => T): ReadonlyBinding<T>;
|
|
26
|
+
export declare function bind<T>(source: T): Binding<T>;
|
|
63
27
|
/**
|
|
64
28
|
* Create an explicitly read-only binding.
|
|
65
29
|
* Attempting to write will throw an error at runtime.
|
|
@@ -92,4 +56,31 @@ export declare function bindReadonly<T>(source: ReadableSignal<T> | Binding<T>):
|
|
|
92
56
|
* ```
|
|
93
57
|
*/
|
|
94
58
|
export declare function unwrap<T>(value: T | Binding<T> | ReadonlyBinding<T>): T;
|
|
59
|
+
/**
|
|
60
|
+
* Create multiple signals from an object.
|
|
61
|
+
* Returns an object with the same keys, where each value is a signal.
|
|
62
|
+
*
|
|
63
|
+
* This is a convenience helper for creating reactive props without
|
|
64
|
+
* declaring each signal individually.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```ts
|
|
68
|
+
* // Instead of:
|
|
69
|
+
* const content = signal('hello')
|
|
70
|
+
* const width = signal(40)
|
|
71
|
+
* const visible = signal(true)
|
|
72
|
+
*
|
|
73
|
+
* // Do this:
|
|
74
|
+
* const ui = signals({ content: 'hello', width: 40, visible: true })
|
|
75
|
+
*
|
|
76
|
+
* // Pass to components:
|
|
77
|
+
* text({ content: ui.content }) // ui.content IS a Signal<string>
|
|
78
|
+
*
|
|
79
|
+
* // Update:
|
|
80
|
+
* ui.content.value = 'updated' // Works!
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
export declare function signals<T extends Record<string, unknown>>(initial: T): {
|
|
84
|
+
[K in keyof T]: WritableSignal<T[K]>;
|
|
85
|
+
};
|
|
95
86
|
//# sourceMappingURL=bind.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bind.d.ts","sourceRoot":"","sources":["../../src/primitives/bind.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"bind.d.ts","sourceRoot":"","sources":["../../src/primitives/bind.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAOtE;;;GAGG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC;IACxB,IAAI,KAAK,IAAI,CAAC,CAAA;IACd,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,EAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe,CAAC,CAAC;IAChC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAClB;AAQD;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAEnE;AA0DD,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AAC9D,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;AACtE,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AACvD,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;AACvE,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;AAC5D,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AAiD9C;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAQ1F;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAKvE;AAMD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACvD,OAAO,EAAE,CAAC,GACT;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAU1C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rlabs-inc/signals",
|
|
3
|
-
"version": "1.1
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "Production-grade fine-grained reactivity for TypeScript. A complete standalone mirror of Svelte 5's reactivity system - signals, effects, derived values, deep reactivity, reactive collections, and reactive bindings.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -37,6 +37,9 @@
|
|
|
37
37
|
"derived",
|
|
38
38
|
"computed",
|
|
39
39
|
"observable",
|
|
40
|
+
"bind",
|
|
41
|
+
"binding",
|
|
42
|
+
"two-way-binding",
|
|
40
43
|
"svelte",
|
|
41
44
|
"typescript"
|
|
42
45
|
],
|