@rlabs-inc/signals 1.4.4 → 1.5.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/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, signals } from './primitives/bind.js';
4
+ export { bind, bindReadonly, isBinding, unwrap, signals, disconnectBinding, bindingHasInternalSource } from './primitives/bind.js';
5
5
  export { linkedSignal, isLinkedSignal } from './primitives/linked.js';
6
6
  export { createSelector } from './primitives/selector.js';
7
7
  export { effectScope, getCurrentScope, onScopeDispose } from './primitives/scope.js';
@@ -12,7 +12,7 @@ export { equals, safeEquals, safeNotEqual, shallowEquals, createEquals, neverEqu
12
12
  export { ReactiveMap } from './collections/map.js';
13
13
  export { ReactiveSet } from './collections/set.js';
14
14
  export { ReactiveDate } from './collections/date.js';
15
- export { get, set, isDirty, setSignalStatus, markReactions, updateReaction, removeReactions, } from './reactivity/tracking.js';
15
+ export { get, set, isDirty, setSignalStatus, markReactions, updateReaction, removeReactions, disconnectSource, } from './reactivity/tracking.js';
16
16
  export { DERIVED, EFFECT, RENDER_EFFECT, ROOT_EFFECT, BRANCH_EFFECT, USER_EFFECT, BLOCK_EFFECT, CLEAN, DIRTY, MAYBE_DIRTY, REACTION_IS_UPDATING, DESTROYED, INERT, EFFECT_RAN, EFFECT_PRESERVED, UNOWNED, DISCONNECTED, UNINITIALIZED, STALE_REACTION, STATE_SYMBOL, REACTIVE_MARKER, BINDING_SYMBOL, LINKED_SYMBOL, } from './core/constants.js';
17
17
  export { activeReaction, activeEffect, untracking, writeVersion, readVersion, batchDepth, setActiveReaction, setActiveEffect, setUntracking, incrementWriteVersion, incrementReadVersion, incrementBatchDepth, decrementBatchDepth, getReadVersion, getWriteVersion, getBatchDepth, } from './core/globals.js';
18
18
  export type { Signal, Source, Reaction, Derived, Effect, Value, ReadableSignal, WritableSignal, DerivedSignal, DisposeFn, CleanupFn, EffectFn, Equals, Uninitialized, ExtractInner, } from './core/types.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,OAAO,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAMpF,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,EACf,cAAc,EACd,aAAa,GACd,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,EACb,YAAY,GACb,MAAM,iBAAiB,CAAA;AAExB,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACpE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AACrF,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,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,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAA;AAClI,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAMpF,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,EACf,gBAAgB,GACjB,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,EACf,cAAc,EACd,aAAa,GACd,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,EACb,YAAY,GACb,MAAM,iBAAiB,CAAA;AAExB,YAAY,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AACpE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAA;AACrF,YAAY,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AAC1D,YAAY,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA"}
package/dist/index.js CHANGED
@@ -75,7 +75,9 @@ __export(exports_src, {
75
75
  equals: () => equals,
76
76
  effectScope: () => effectScope,
77
77
  effect: () => effect,
78
+ disconnectSource: () => disconnectSource,
78
79
  disconnectDerived: () => disconnectDerived,
80
+ disconnectBinding: () => disconnectBinding,
79
81
  destroyEffect: () => destroyEffect,
80
82
  derived: () => derived,
81
83
  decrementBatchDepth: () => decrementBatchDepth,
@@ -83,6 +85,7 @@ __export(exports_src, {
83
85
  createEquals: () => createEquals,
84
86
  createEffect: () => createEffect,
85
87
  createDerived: () => createDerived,
88
+ bindingHasInternalSource: () => bindingHasInternalSource,
86
89
  bindReadonly: () => bindReadonly,
87
90
  bind: () => bind,
88
91
  batchDepth: () => batchDepth,
@@ -592,6 +595,26 @@ function updateDerived(derived) {
592
595
  function setUpdateDerivedImpl(impl) {
593
596
  updateDerivedImpl = impl;
594
597
  }
598
+ function disconnectSource(source) {
599
+ const reactions = source.reactions;
600
+ if (reactions !== null) {
601
+ for (let i = 0;i < reactions.length; i++) {
602
+ const reaction = reactions[i];
603
+ const deps = reaction.deps;
604
+ if (deps !== null) {
605
+ const idx = deps.indexOf(source);
606
+ if (idx !== -1) {
607
+ const last = deps.length - 1;
608
+ if (idx !== last) {
609
+ deps[idx] = deps[last];
610
+ }
611
+ deps.pop();
612
+ }
613
+ }
614
+ }
615
+ source.reactions = null;
616
+ }
617
+ }
595
618
  function removeReactions(reaction, start) {
596
619
  const deps = reaction.deps;
597
620
  if (deps === null)
@@ -1246,8 +1269,9 @@ effect.tracking = function effectTracking() {
1246
1269
  return activeEffect !== null;
1247
1270
  };
1248
1271
  // src/primitives/bind.ts
1272
+ var BINDING_SOURCE_SYMBOL = Symbol("binding.source");
1249
1273
  var bindingCleanup = new FinalizationRegistry((internalSource) => {
1250
- internalSource.reactions = null;
1274
+ disconnectSource(internalSource);
1251
1275
  });
1252
1276
  function isBinding(value) {
1253
1277
  return value !== null && typeof value === "object" && BINDING_SYMBOL in value;
@@ -1258,31 +1282,59 @@ function isSignal(value) {
1258
1282
  function isGetter(value) {
1259
1283
  return typeof value === "function";
1260
1284
  }
1285
+ function isStaticPrimitive(value) {
1286
+ const type = typeof value;
1287
+ return value === null || value === undefined || type === "number" || type === "string" || type === "boolean";
1288
+ }
1261
1289
  function bind(source2) {
1262
1290
  if (isGetter(source2)) {
1263
- return {
1291
+ const getterBinding = {
1264
1292
  [BINDING_SYMBOL]: true,
1293
+ [BINDING_SOURCE_SYMBOL]: null,
1265
1294
  get value() {
1266
1295
  return source2();
1267
1296
  }
1268
1297
  };
1298
+ return getterBinding;
1269
1299
  }
1270
- let actualSource;
1271
- let internalSource = null;
1272
1300
  if (isBinding(source2) || isSignal(source2)) {
1273
- actualSource = source2;
1274
- } else {
1275
- const sig = signal(source2);
1276
- actualSource = sig;
1277
- internalSource = getSource(sig) ?? null;
1301
+ const actualSource = source2;
1302
+ const forwardBinding = {
1303
+ [BINDING_SYMBOL]: true,
1304
+ [BINDING_SOURCE_SYMBOL]: null,
1305
+ get value() {
1306
+ return actualSource.value;
1307
+ },
1308
+ set value(v) {
1309
+ actualSource.value = v;
1310
+ }
1311
+ };
1312
+ return forwardBinding;
1313
+ }
1314
+ if (isStaticPrimitive(source2)) {
1315
+ let staticValue = source2;
1316
+ const staticBinding = {
1317
+ [BINDING_SYMBOL]: true,
1318
+ [BINDING_SOURCE_SYMBOL]: null,
1319
+ get value() {
1320
+ return staticValue;
1321
+ },
1322
+ set value(v) {
1323
+ staticValue = v;
1324
+ }
1325
+ };
1326
+ return staticBinding;
1278
1327
  }
1328
+ const sig = signal(source2);
1329
+ const internalSource = getSource(sig) ?? null;
1279
1330
  const binding = {
1280
1331
  [BINDING_SYMBOL]: true,
1332
+ [BINDING_SOURCE_SYMBOL]: internalSource,
1281
1333
  get value() {
1282
- return actualSource.value;
1334
+ return sig.value;
1283
1335
  },
1284
1336
  set value(v) {
1285
- actualSource.value = v;
1337
+ sig.value = v;
1286
1338
  }
1287
1339
  };
1288
1340
  if (internalSource !== null) {
@@ -1290,6 +1342,18 @@ function bind(source2) {
1290
1342
  }
1291
1343
  return binding;
1292
1344
  }
1345
+ function disconnectBinding(binding) {
1346
+ if (binding === null || binding === undefined)
1347
+ return;
1348
+ const internalSource = binding[BINDING_SOURCE_SYMBOL];
1349
+ if (internalSource !== null && internalSource !== undefined) {
1350
+ disconnectSource(internalSource);
1351
+ }
1352
+ }
1353
+ function bindingHasInternalSource(binding) {
1354
+ const internalSource = binding[BINDING_SOURCE_SYMBOL];
1355
+ return internalSource !== null && internalSource !== undefined;
1356
+ }
1293
1357
  function bindReadonly(source2) {
1294
1358
  return {
1295
1359
  [BINDING_SYMBOL]: true,
package/dist/index.mjs CHANGED
@@ -471,6 +471,26 @@ function updateDerived(derived) {
471
471
  function setUpdateDerivedImpl(impl) {
472
472
  updateDerivedImpl = impl;
473
473
  }
474
+ function disconnectSource(source) {
475
+ const reactions = source.reactions;
476
+ if (reactions !== null) {
477
+ for (let i = 0;i < reactions.length; i++) {
478
+ const reaction = reactions[i];
479
+ const deps = reaction.deps;
480
+ if (deps !== null) {
481
+ const idx = deps.indexOf(source);
482
+ if (idx !== -1) {
483
+ const last = deps.length - 1;
484
+ if (idx !== last) {
485
+ deps[idx] = deps[last];
486
+ }
487
+ deps.pop();
488
+ }
489
+ }
490
+ }
491
+ source.reactions = null;
492
+ }
493
+ }
474
494
  function removeReactions(reaction, start) {
475
495
  const deps = reaction.deps;
476
496
  if (deps === null)
@@ -1125,8 +1145,9 @@ effect.tracking = function effectTracking() {
1125
1145
  return activeEffect !== null;
1126
1146
  };
1127
1147
  // src/primitives/bind.ts
1148
+ var BINDING_SOURCE_SYMBOL = Symbol("binding.source");
1128
1149
  var bindingCleanup = new FinalizationRegistry((internalSource) => {
1129
- internalSource.reactions = null;
1150
+ disconnectSource(internalSource);
1130
1151
  });
1131
1152
  function isBinding(value) {
1132
1153
  return value !== null && typeof value === "object" && BINDING_SYMBOL in value;
@@ -1137,31 +1158,59 @@ function isSignal(value) {
1137
1158
  function isGetter(value) {
1138
1159
  return typeof value === "function";
1139
1160
  }
1161
+ function isStaticPrimitive(value) {
1162
+ const type = typeof value;
1163
+ return value === null || value === undefined || type === "number" || type === "string" || type === "boolean";
1164
+ }
1140
1165
  function bind(source2) {
1141
1166
  if (isGetter(source2)) {
1142
- return {
1167
+ const getterBinding = {
1143
1168
  [BINDING_SYMBOL]: true,
1169
+ [BINDING_SOURCE_SYMBOL]: null,
1144
1170
  get value() {
1145
1171
  return source2();
1146
1172
  }
1147
1173
  };
1174
+ return getterBinding;
1148
1175
  }
1149
- let actualSource;
1150
- let internalSource = null;
1151
1176
  if (isBinding(source2) || isSignal(source2)) {
1152
- actualSource = source2;
1153
- } else {
1154
- const sig = signal(source2);
1155
- actualSource = sig;
1156
- internalSource = getSource(sig) ?? null;
1177
+ const actualSource = source2;
1178
+ const forwardBinding = {
1179
+ [BINDING_SYMBOL]: true,
1180
+ [BINDING_SOURCE_SYMBOL]: null,
1181
+ get value() {
1182
+ return actualSource.value;
1183
+ },
1184
+ set value(v) {
1185
+ actualSource.value = v;
1186
+ }
1187
+ };
1188
+ return forwardBinding;
1189
+ }
1190
+ if (isStaticPrimitive(source2)) {
1191
+ let staticValue = source2;
1192
+ const staticBinding = {
1193
+ [BINDING_SYMBOL]: true,
1194
+ [BINDING_SOURCE_SYMBOL]: null,
1195
+ get value() {
1196
+ return staticValue;
1197
+ },
1198
+ set value(v) {
1199
+ staticValue = v;
1200
+ }
1201
+ };
1202
+ return staticBinding;
1157
1203
  }
1204
+ const sig = signal(source2);
1205
+ const internalSource = getSource(sig) ?? null;
1158
1206
  const binding = {
1159
1207
  [BINDING_SYMBOL]: true,
1208
+ [BINDING_SOURCE_SYMBOL]: internalSource,
1160
1209
  get value() {
1161
- return actualSource.value;
1210
+ return sig.value;
1162
1211
  },
1163
1212
  set value(v) {
1164
- actualSource.value = v;
1213
+ sig.value = v;
1165
1214
  }
1166
1215
  };
1167
1216
  if (internalSource !== null) {
@@ -1169,6 +1218,18 @@ function bind(source2) {
1169
1218
  }
1170
1219
  return binding;
1171
1220
  }
1221
+ function disconnectBinding(binding) {
1222
+ if (binding === null || binding === undefined)
1223
+ return;
1224
+ const internalSource = binding[BINDING_SOURCE_SYMBOL];
1225
+ if (internalSource !== null && internalSource !== undefined) {
1226
+ disconnectSource(internalSource);
1227
+ }
1228
+ }
1229
+ function bindingHasInternalSource(binding) {
1230
+ const internalSource = binding[BINDING_SOURCE_SYMBOL];
1231
+ return internalSource !== null && internalSource !== undefined;
1232
+ }
1172
1233
  function bindReadonly(source2) {
1173
1234
  return {
1174
1235
  [BINDING_SYMBOL]: true,
@@ -1871,7 +1932,9 @@ export {
1871
1932
  equals,
1872
1933
  effectScope,
1873
1934
  effect,
1935
+ disconnectSource,
1874
1936
  disconnectDerived,
1937
+ disconnectBinding,
1875
1938
  destroyEffect,
1876
1939
  derived,
1877
1940
  decrementBatchDepth,
@@ -1879,6 +1942,7 @@ export {
1879
1942
  createEquals,
1880
1943
  createEffect,
1881
1944
  createDerived,
1945
+ bindingHasInternalSource,
1882
1946
  bindReadonly,
1883
1947
  bind,
1884
1948
  batchDepth,
@@ -24,6 +24,30 @@ export declare function bind<T>(source: Binding<T>): Binding<T>;
24
24
  export declare function bind<T>(source: ReadonlyBinding<T>): ReadonlyBinding<T>;
25
25
  export declare function bind<T>(source: () => T): ReadonlyBinding<T>;
26
26
  export declare function bind<T>(source: T): Binding<ExtractInner<T>>;
27
+ /**
28
+ * Disconnect a binding from the reactive graph.
29
+ *
30
+ * In most cases, this is NOT needed because:
31
+ * 1. Static primitives (numbers, strings, booleans) don't create internal signals
32
+ * 2. Bindings to existing signals forward to them (no internal source)
33
+ * 3. FinalizationRegistry handles cleanup when objects are GC'd
34
+ *
35
+ * Use this ONLY when you have circular references that prevent GC,
36
+ * such as when a binding's internal source is tracked by a long-lived derived.
37
+ *
38
+ * @example
39
+ * ```ts
40
+ * const binding = bind(someNonPrimitiveValue)
41
+ * // ... later, when cleaning up:
42
+ * disconnectBinding(binding) // Breaks reactive links, allows GC
43
+ * ```
44
+ */
45
+ export declare function disconnectBinding(binding: Binding<unknown> | ReadonlyBinding<unknown> | null | undefined): void;
46
+ /**
47
+ * Check if a binding has an internal source that may need cleanup.
48
+ * Static primitives and forwarding bindings return false.
49
+ */
50
+ export declare function bindingHasInternalSource(binding: Binding<unknown> | ReadonlyBinding<unknown>): boolean;
27
51
  /**
28
52
  * Create an explicitly read-only binding.
29
53
  * Attempting to write will throw an error at runtime.
@@ -1 +1 @@
1
- {"version":3,"file":"bind.d.ts","sourceRoot":"","sources":["../../src/primitives/bind.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAU,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAsB5F;;;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;AAED;;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,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;AA2D5D;;;;;;;;;;;;;;;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,CAUvE;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"}
1
+ {"version":3,"file":"bind.d.ts","sourceRoot":"","sources":["../../src/primitives/bind.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAU,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAoC5F;;;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;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,OAAO,CAAC,OAAO,CAAC,CAEnE;AAyED,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,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;AAoF5D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAO/G;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO,CAGtG;AAMD;;;;;;;;;;;;;;;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,CAUvE;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"}
@@ -39,6 +39,14 @@ export declare function setSignalStatus(signal: {
39
39
  export declare function isDirty(reaction: Reaction): boolean;
40
40
  export declare function updateDerived(derived: Derived): void;
41
41
  export declare function setUpdateDerivedImpl(impl: (derived: Derived) => void): void;
42
+ /**
43
+ * Disconnect a source from all its reactions.
44
+ * This breaks the circular reference between Source.reactions and Reaction.deps,
45
+ * allowing both to be garbage collected.
46
+ *
47
+ * Use this when disposing of a signal/binding that was tracked by deriveds/effects.
48
+ */
49
+ export declare function disconnectSource(source: Source): void;
42
50
  /**
43
51
  * Remove a reaction from its dependencies, starting at the given index
44
52
  * Uses swap-and-pop for O(1) removal
@@ -1 +1 @@
1
- {"version":3,"file":"tracking.d.ts","sourceRoot":"","sources":["../../src/reactivity/tracking.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAkCjE;;;;;;;;GAQG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAiD3C;AAoGD;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CA8BrD;AAMD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA8BlE;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAE3E;AAMD;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAoGnD;AAWD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEpD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAE3E;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAOvE;AA8BD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAmG1D"}
1
+ {"version":3,"file":"tracking.d.ts","sourceRoot":"","sources":["../../src/reactivity/tracking.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAkCjE;;;;;;;;GAQG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAiD3C;AAoGD;;GAEG;AACH,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CA8BrD;AAMD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CA8BlE;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAE3E;AAMD;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAoGnD;AAWD,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAEpD;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAE3E;AAMD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAsBrD;AAMD;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAOvE;AA8BD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAmG1D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rlabs-inc/signals",
3
- "version": "1.4.4",
3
+ "version": "1.5.0",
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",