@rlabs-inc/signals 1.2.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/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';
@@ -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;AAM5E,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"}
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 source2.value;
994
+ return actualSource.value;
974
995
  },
975
996
  set value(v) {
976
- source2.value = v;
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 source2.value;
881
+ return actualSource.value;
862
882
  },
863
883
  set value(v) {
864
- source2.value = v;
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;AAMtE;;;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;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,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;AA6BvE;;;;;;;;;;;;;;;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"}
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.2.0",
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",