@vielzeug/ripple 2.0.1 → 2.2.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.
Files changed (62) hide show
  1. package/README.md +4 -2
  2. package/dist/_async.cjs +1 -1
  3. package/dist/_async.cjs.map +1 -1
  4. package/dist/_async.d.ts +1 -1
  5. package/dist/_async.d.ts.map +1 -1
  6. package/dist/_async.js +15 -15
  7. package/dist/_async.js.map +1 -1
  8. package/dist/_default.cjs +2 -0
  9. package/dist/_default.cjs.map +1 -0
  10. package/dist/_default.d.ts +26 -0
  11. package/dist/_default.d.ts.map +1 -0
  12. package/dist/_default.js +25 -0
  13. package/dist/_default.js.map +1 -0
  14. package/dist/_watch.cjs.map +1 -1
  15. package/dist/_watch.d.ts +1 -1
  16. package/dist/_watch.d.ts.map +1 -1
  17. package/dist/_watch.js.map +1 -1
  18. package/dist/errors.cjs +1 -1
  19. package/dist/errors.cjs.map +1 -1
  20. package/dist/errors.d.ts +2 -0
  21. package/dist/errors.d.ts.map +1 -1
  22. package/dist/errors.js +2 -2
  23. package/dist/errors.js.map +1 -1
  24. package/dist/index.cjs +1 -1
  25. package/dist/index.cjs.map +1 -1
  26. package/dist/index.d.ts +12 -30
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +5 -21
  29. package/dist/index.js.map +1 -1
  30. package/dist/ripple.cjs +1 -1
  31. package/dist/ripple.cjs.map +1 -1
  32. package/dist/ripple.iife.js +1 -1
  33. package/dist/ripple.iife.js.map +1 -1
  34. package/dist/ripple.js +1 -1
  35. package/dist/ripple.js.map +1 -1
  36. package/dist/runtime.cjs +1 -1
  37. package/dist/runtime.cjs.map +1 -1
  38. package/dist/runtime.d.ts +6 -4
  39. package/dist/runtime.d.ts.map +1 -1
  40. package/dist/runtime.js +40 -29
  41. package/dist/runtime.js.map +1 -1
  42. package/dist/types.d.ts +2 -1
  43. package/dist/types.d.ts.map +1 -1
  44. package/package.json +18 -47
  45. package/dist/_store.cjs +0 -2
  46. package/dist/_store.cjs.map +0 -1
  47. package/dist/_store.d.ts +0 -20
  48. package/dist/_store.d.ts.map +0 -1
  49. package/dist/_store.js +0 -24
  50. package/dist/_store.js.map +0 -1
  51. package/dist/async.cjs +0 -1
  52. package/dist/async.d.ts +0 -3
  53. package/dist/async.d.ts.map +0 -1
  54. package/dist/async.js +0 -2
  55. package/dist/store.cjs +0 -1
  56. package/dist/store.d.ts +0 -3
  57. package/dist/store.d.ts.map +0 -1
  58. package/dist/store.js +0 -2
  59. package/dist/watch.cjs +0 -1
  60. package/dist/watch.d.ts +0 -3
  61. package/dist/watch.d.ts.map +0 -1
  62. package/dist/watch.js +0 -2
package/README.md CHANGED
@@ -32,7 +32,7 @@ stop.dispose();
32
32
  ripple.dispose();
33
33
  ```
34
34
 
35
- Use default exports (`signal`, `computed`, `effect`, `batch`) only when application has one graph for full lifetime.
35
+ `ripple.dispose()` is terminal: create a new graph instead of reusing a disposed one. Use default exports (`signal`, `computed`, `effect`, `batch`, `watch`, `resource`) only when application has one graph for full lifetime.
36
36
 
37
37
  ## Bound helpers
38
38
 
@@ -40,10 +40,12 @@ Every `Ripple` instance provides bound helpers:
40
40
 
41
41
  ```ts
42
42
  const user = ripple.resource(() => userId.value, loadUser);
43
- const cart = ripple.createStore({ items: 0 });
43
+ const cart = ripple.signal({ items: 0 });
44
44
  const stop = ripple.watch(() => cart.value.items, renderItems);
45
45
  ```
46
46
 
47
+ Resource source and loader failures are handled through `resource.value.status === 'error'`; `onError` receives broken runtime callbacks, cleanup, listeners, and observers.
48
+
47
49
  Nested effects and resources created inside an effect automatically dispose before parent effect reruns:
48
50
 
49
51
  ```ts
package/dist/_async.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=e=>(t,n,r)=>{let i=e.signal({status:`pending`},{name:r?.name}),a=e.signal(0),o=new AbortController,s,c=!1,l=()=>{a.value,s?.abort();let e=i.peek(),r=e.status===`success`?e.value:`previous`in e?e.previous:void 0,o;try{o=t()}catch(e){i.value=r===void 0?{error:e,status:`error`}:{error:e,previous:r,status:`error`};return}let l=new AbortController;s=l,i.value=r===void 0?{status:`pending`}:{previous:r,status:`pending`};let u;try{u=Promise.resolve(n(o,{signal:l.signal}))}catch(e){u=Promise.reject(e)}u.then(e=>{!c&&!l.signal.aborted&&(i.value={status:`success`,value:e})},e=>{!c&&!l.signal.aborted&&(i.value=r===void 0?{error:e,status:`error`}:{error:e,previous:r,status:`error`})})},u=e.effect(()=>(l(),()=>s?.abort()),{name:r?.name});return u.disposalSignal.addEventListener(`abort`,()=>{c=!0,o.abort()},{once:!0}),{get disposalSignal(){return o.signal},dispose:()=>u.dispose(),get disposed(){return c},get name(){return i.name},peek:()=>i.peek(),reload:()=>{c||(a.value=a.peek()+1)},subscribe:e=>i.subscribe(e),[Symbol.dispose](){this.dispose()},get value(){return i.value}}};exports.createResource=e;
1
+ var e=e=>(t,n,r)=>{let i=e.signal({status:`pending`},{name:r?.name}),a=e.signal(0),o,s=!1,c=()=>{a.value,o?.abort();let e=i.peek(),r=e.status===`success`?e.value:`previous`in e?e.previous:void 0,c;try{c=t()}catch(e){i.value=r===void 0?{error:e,status:`error`}:{error:e,previous:r,status:`error`};return}let l=new AbortController;o=l,i.value=r===void 0?{status:`pending`}:{previous:r,status:`pending`};let u;try{u=Promise.resolve(n(c,{signal:l.signal}))}catch(e){u=Promise.reject(e)}u.then(e=>{!s&&!l.signal.aborted&&(i.value={status:`success`,value:e})},e=>{!s&&!l.signal.aborted&&(i.value=r===void 0?{error:e,status:`error`}:{error:e,previous:r,status:`error`})})},l=e.effect(()=>(c(),()=>o?.abort()),{name:r?.name});return l.disposalSignal.addEventListener(`abort`,()=>{s=!0},{once:!0}),{get disposalSignal(){return l.disposalSignal},dispose:()=>l.dispose(),get disposed(){return s},get name(){return i.name},peek:()=>i.peek(),reload:()=>{s||(a.value=a.peek()+1)},subscribe:e=>i.subscribe(e),[Symbol.dispose](){this.dispose()},get value(){return i.value}}};exports.createResource=e;
2
2
  //# sourceMappingURL=_async.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"_async.cjs","names":[],"sources":["../src/_async.ts"],"sourcesContent":["import type { EffectHandle, Signal } from './types';\n\nexport type AsyncState<T> =\n | { readonly previous?: T; readonly status: 'pending' }\n | { readonly status: 'success'; readonly value: T }\n | { readonly error: unknown; readonly previous?: T; readonly status: 'error' };\n\nexport type Resource<T> = {\n [Symbol.dispose](): void;\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n readonly name?: string;\n peek(): AsyncState<T>;\n reload(): void;\n subscribe(listener: () => void): () => void;\n readonly value: AsyncState<T>;\n};\n\nexport type ResourceOptions = {\n name?: string;\n};\n\ntype AsyncRuntime = {\n effect(callback: () => void | (() => void), options?: { name?: string }): EffectHandle;\n signal<T>(initial: T, options?: { name?: string }): Signal<T>;\n};\n\n/** Resource only depends on primitive runtime methods; graph binding stays private. */\nexport const createResource =\n (runtime: AsyncRuntime) =>\n <Source, Value>(\n source: () => Source,\n loader: (source: Source, context: { readonly signal: AbortSignal }) => Promise<Value>,\n options?: ResourceOptions,\n ): Resource<Value> => {\n const state = runtime.signal<AsyncState<Value>>({ status: 'pending' }, { name: options?.name });\n const reloadEpoch = runtime.signal(0);\n const controller = new AbortController();\n let active: AbortController | undefined;\n let disposed = false;\n\n const run = (): void => {\n void reloadEpoch.value;\n active?.abort();\n\n const current = state.peek();\n const previous =\n current.status === 'success' ? current.value : 'previous' in current ? current.previous : undefined;\n let input: Source;\n\n try {\n input = source();\n } catch (error) {\n state.value = previous === undefined ? { error, status: 'error' } : { error, previous, status: 'error' };\n\n return;\n }\n\n const next = new AbortController();\n\n active = next;\n state.value = previous === undefined ? { status: 'pending' } : { previous, status: 'pending' };\n\n let request: Promise<Value>;\n\n try {\n request = Promise.resolve(loader(input, { signal: next.signal }));\n } catch (error) {\n request = Promise.reject(error);\n }\n\n void request.then(\n (value) => {\n if (!disposed && !next.signal.aborted) state.value = { status: 'success', value };\n },\n (error: unknown) => {\n if (!disposed && !next.signal.aborted) {\n state.value = previous === undefined ? { error, status: 'error' } : { error, previous, status: 'error' };\n }\n },\n );\n };\n\n const stop = runtime.effect(\n () => {\n run();\n\n return () => active?.abort();\n },\n { name: options?.name },\n );\n\n stop.disposalSignal.addEventListener(\n 'abort',\n () => {\n disposed = true;\n controller.abort();\n },\n { once: true },\n );\n\n return {\n get disposalSignal() {\n return controller.signal;\n },\n dispose: () => stop.dispose(),\n get disposed() {\n return disposed;\n },\n get name() {\n return state.name;\n },\n peek: () => state.peek(),\n reload: () => {\n if (disposed) return;\n\n reloadEpoch.value = reloadEpoch.peek() + 1;\n },\n subscribe: (listener) => state.subscribe(listener),\n [Symbol.dispose]() {\n this.dispose();\n },\n get value() {\n return state.value;\n },\n };\n };\n"],"mappings":"AA6BA,IAAa,EACV,IAEC,EACA,EACA,IACoB,CACpB,IAAM,EAAQ,EAAQ,OAA0B,CAAE,OAAQ,SAAU,EAAG,CAAE,KAAM,GAAS,IAAK,CAAC,EACxF,EAAc,EAAQ,OAAO,CAAC,EAC9B,EAAa,IAAI,gBACnB,EACA,EAAW,GAET,MAAkB,CACtB,EAAiB,MACjB,GAAQ,MAAM,EAEd,IAAM,EAAU,EAAM,KAAK,EACrB,EACJ,EAAQ,SAAW,UAAY,EAAQ,MAAQ,aAAc,EAAU,EAAQ,SAAW,IAAA,GACxF,EAEJ,GAAI,CACF,EAAQ,EAAO,CACjB,OAAS,EAAO,CACd,EAAM,MAAQ,IAAa,IAAA,GAAY,CAAE,QAAO,OAAQ,OAAQ,EAAI,CAAE,QAAO,WAAU,OAAQ,OAAQ,EAEvG,MACF,CAEA,IAAM,EAAO,IAAI,gBAEjB,EAAS,EACT,EAAM,MAAQ,IAAa,IAAA,GAAY,CAAE,OAAQ,SAAU,EAAI,CAAE,WAAU,OAAQ,SAAU,EAE7F,IAAI,EAEJ,GAAI,CACF,EAAU,QAAQ,QAAQ,EAAO,EAAO,CAAE,OAAQ,EAAK,MAAO,CAAC,CAAC,CAClE,OAAS,EAAO,CACd,EAAU,QAAQ,OAAO,CAAK,CAChC,CAEA,EAAa,KACV,GAAU,CACL,CAAC,GAAY,CAAC,EAAK,OAAO,UAAS,EAAM,MAAQ,CAAE,OAAQ,UAAW,OAAM,EAClF,EACC,GAAmB,CACd,CAAC,GAAY,CAAC,EAAK,OAAO,UAC5B,EAAM,MAAQ,IAAa,IAAA,GAAY,CAAE,QAAO,OAAQ,OAAQ,EAAI,CAAE,QAAO,WAAU,OAAQ,OAAQ,EAE3G,CACF,CACF,EAEM,EAAO,EAAQ,YAEjB,EAAI,MAES,GAAQ,MAAM,GAE7B,CAAE,KAAM,GAAS,IAAK,CACxB,EAWA,OATA,EAAK,eAAe,iBAClB,YACM,CACJ,EAAW,GACX,EAAW,MAAM,CACnB,EACA,CAAE,KAAM,EAAK,CACf,EAEO,CACL,IAAI,gBAAiB,CACnB,OAAO,EAAW,MACpB,EACA,YAAe,EAAK,QAAQ,EAC5B,IAAI,UAAW,CACb,OAAO,CACT,EACA,IAAI,MAAO,CACT,OAAO,EAAM,IACf,EACA,SAAY,EAAM,KAAK,EACvB,WAAc,CACR,IAEJ,EAAY,MAAQ,EAAY,KAAK,EAAI,EAC3C,EACA,UAAY,GAAa,EAAM,UAAU,CAAQ,EACjD,CAAC,OAAO,UAAW,CACjB,KAAK,QAAQ,CACf,EACA,IAAI,OAAQ,CACV,OAAO,EAAM,KACf,CACF,CACF"}
1
+ {"version":3,"file":"_async.cjs","names":[],"sources":["../src/_async.ts"],"sourcesContent":["import type { EffectHandle, Signal } from './types';\n\nexport type AsyncState<T> =\n | { readonly previous?: T; readonly status: 'pending' }\n | { readonly status: 'success'; readonly value: T }\n | { readonly error: unknown; readonly previous?: T; readonly status: 'error' };\n\nexport type Resource<T> = {\n [Symbol.dispose](): void;\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n readonly name?: string;\n peek(): AsyncState<T>;\n reload(): void;\n subscribe(listener: () => void): () => void;\n readonly value: AsyncState<T>;\n};\n\nexport type ResourceOptions = {\n name?: string;\n};\n\ntype AsyncRuntime = {\n effect(callback: () => undefined | (() => void), options?: { name?: string }): EffectHandle;\n signal<T>(initial: T, options?: { name?: string }): Signal<T>;\n};\n\n/** Resource only depends on primitive runtime methods; graph binding stays private. */\nexport const createResource =\n (runtime: AsyncRuntime) =>\n <Source, Value>(\n source: () => Source,\n loader: (source: Source, context: { readonly signal: AbortSignal }) => Promise<Value>,\n options?: ResourceOptions,\n ): Resource<Value> => {\n const state = runtime.signal<AsyncState<Value>>({ status: 'pending' }, { name: options?.name });\n const reloadEpoch = runtime.signal(0);\n let active: AbortController | undefined;\n let disposed = false;\n\n const run = (): void => {\n void reloadEpoch.value;\n active?.abort();\n\n const current = state.peek();\n const previous =\n current.status === 'success' ? current.value : 'previous' in current ? current.previous : undefined;\n let input: Source;\n\n try {\n input = source();\n } catch (error) {\n state.value = previous === undefined ? { error, status: 'error' } : { error, previous, status: 'error' };\n\n return;\n }\n\n const next = new AbortController();\n\n active = next;\n state.value = previous === undefined ? { status: 'pending' } : { previous, status: 'pending' };\n\n let request: Promise<Value>;\n\n try {\n request = Promise.resolve(loader(input, { signal: next.signal }));\n } catch (error) {\n request = Promise.reject(error);\n }\n\n void request.then(\n (value) => {\n if (!disposed && !next.signal.aborted) state.value = { status: 'success', value };\n },\n (error: unknown) => {\n if (!disposed && !next.signal.aborted) {\n state.value = previous === undefined ? { error, status: 'error' } : { error, previous, status: 'error' };\n }\n },\n );\n };\n\n const stop = runtime.effect(\n () => {\n run();\n\n return () => active?.abort();\n },\n { name: options?.name },\n );\n\n stop.disposalSignal.addEventListener(\n 'abort',\n () => {\n disposed = true;\n },\n { once: true },\n );\n\n return {\n get disposalSignal() {\n return stop.disposalSignal;\n },\n dispose: () => stop.dispose(),\n get disposed() {\n return disposed;\n },\n get name() {\n return state.name;\n },\n peek: () => state.peek(),\n reload: () => {\n if (disposed) return;\n\n reloadEpoch.value = reloadEpoch.peek() + 1;\n },\n subscribe: (listener) => state.subscribe(listener),\n [Symbol.dispose]() {\n this.dispose();\n },\n get value() {\n return state.value;\n },\n };\n };\n"],"mappings":"AA6BA,IAAa,EACV,IAEC,EACA,EACA,IACoB,CACpB,IAAM,EAAQ,EAAQ,OAA0B,CAAE,OAAQ,SAAU,EAAG,CAAE,KAAM,GAAS,IAAK,CAAC,EACxF,EAAc,EAAQ,OAAO,CAAC,EAChC,EACA,EAAW,GAET,MAAkB,CACtB,EAAiB,MACjB,GAAQ,MAAM,EAEd,IAAM,EAAU,EAAM,KAAK,EACrB,EACJ,EAAQ,SAAW,UAAY,EAAQ,MAAQ,aAAc,EAAU,EAAQ,SAAW,IAAA,GACxF,EAEJ,GAAI,CACF,EAAQ,EAAO,CACjB,OAAS,EAAO,CACd,EAAM,MAAQ,IAAa,IAAA,GAAY,CAAE,QAAO,OAAQ,OAAQ,EAAI,CAAE,QAAO,WAAU,OAAQ,OAAQ,EAEvG,MACF,CAEA,IAAM,EAAO,IAAI,gBAEjB,EAAS,EACT,EAAM,MAAQ,IAAa,IAAA,GAAY,CAAE,OAAQ,SAAU,EAAI,CAAE,WAAU,OAAQ,SAAU,EAE7F,IAAI,EAEJ,GAAI,CACF,EAAU,QAAQ,QAAQ,EAAO,EAAO,CAAE,OAAQ,EAAK,MAAO,CAAC,CAAC,CAClE,OAAS,EAAO,CACd,EAAU,QAAQ,OAAO,CAAK,CAChC,CAEA,EAAa,KACV,GAAU,CACL,CAAC,GAAY,CAAC,EAAK,OAAO,UAAS,EAAM,MAAQ,CAAE,OAAQ,UAAW,OAAM,EAClF,EACC,GAAmB,CACd,CAAC,GAAY,CAAC,EAAK,OAAO,UAC5B,EAAM,MAAQ,IAAa,IAAA,GAAY,CAAE,QAAO,OAAQ,OAAQ,EAAI,CAAE,QAAO,WAAU,OAAQ,OAAQ,EAE3G,CACF,CACF,EAEM,EAAO,EAAQ,YAEjB,EAAI,MAES,GAAQ,MAAM,GAE7B,CAAE,KAAM,GAAS,IAAK,CACxB,EAUA,OARA,EAAK,eAAe,iBAClB,YACM,CACJ,EAAW,EACb,EACA,CAAE,KAAM,EAAK,CACf,EAEO,CACL,IAAI,gBAAiB,CACnB,OAAO,EAAK,cACd,EACA,YAAe,EAAK,QAAQ,EAC5B,IAAI,UAAW,CACb,OAAO,CACT,EACA,IAAI,MAAO,CACT,OAAO,EAAM,IACf,EACA,SAAY,EAAM,KAAK,EACvB,WAAc,CACR,IAEJ,EAAY,MAAQ,EAAY,KAAK,EAAI,EAC3C,EACA,UAAY,GAAa,EAAM,UAAU,CAAQ,EACjD,CAAC,OAAO,UAAW,CACjB,KAAK,QAAQ,CACf,EACA,IAAI,OAAQ,CACV,OAAO,EAAM,KACf,CACF,CACF"}
package/dist/_async.d.ts CHANGED
@@ -25,7 +25,7 @@ export type ResourceOptions = {
25
25
  name?: string;
26
26
  };
27
27
  type AsyncRuntime = {
28
- effect(callback: () => void | (() => void), options?: {
28
+ effect(callback: () => undefined | (() => void), options?: {
29
29
  name?: string;
30
30
  }): EffectHandle;
31
31
  signal<T>(initial: T, options?: {
@@ -1 +1 @@
1
- {"version":3,"file":"_async.d.ts","sourceRoot":"","sources":["../src/_async.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEpD,MAAM,MAAM,UAAU,CAAC,CAAC,IACpB;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjF,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;IACxB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,IAAI,IAAI,CAAC;IACf,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,CAAC;IACvF,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;CAC/D,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,cAAc,GACxB,SAAS,YAAY,MACrB,MAAM,EAAE,KAAK,EACZ,QAAQ,MAAM,MAAM,EACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,KAAK,OAAO,CAAC,KAAK,CAAC,EACrF,UAAU,eAAe,KACxB,QAAQ,CAAC,KAAK,CA4FhB,CAAC"}
1
+ {"version":3,"file":"_async.d.ts","sourceRoot":"","sources":["../src/_async.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEpD,MAAM,MAAM,UAAU,CAAC,CAAC,IACpB;IAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjF,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;IACxB,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,WAAW,CAAC;IACrC,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,IAAI,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,IAAI,IAAI,CAAC;IACf,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,MAAM,CAAC,QAAQ,EAAE,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,CAAC;IAC5F,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;CAC/D,CAAC;AAEF,uFAAuF;AACvF,eAAO,MAAM,cAAc,GACxB,SAAS,YAAY,MACrB,MAAM,EAAE,KAAK,EACZ,QAAQ,MAAM,MAAM,EACpB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,KAAK,OAAO,CAAC,KAAK,CAAC,EACrF,UAAU,eAAe,KACxB,QAAQ,CAAC,KAAK,CA0FhB,CAAC"}
package/dist/_async.js CHANGED
@@ -1,10 +1,10 @@
1
1
  //#region src/_async.ts
2
2
  var e = (e) => (t, n, r) => {
3
- let i = e.signal({ status: "pending" }, { name: r?.name }), a = e.signal(0), o = new AbortController(), s, c = !1, l = () => {
4
- a.value, s?.abort();
5
- let e = i.peek(), r = e.status === "success" ? e.value : "previous" in e ? e.previous : void 0, o;
3
+ let i = e.signal({ status: "pending" }, { name: r?.name }), a = e.signal(0), o, s = !1, c = () => {
4
+ a.value, o?.abort();
5
+ let e = i.peek(), r = e.status === "success" ? e.value : "previous" in e ? e.previous : void 0, c;
6
6
  try {
7
- o = t();
7
+ c = t();
8
8
  } catch (e) {
9
9
  i.value = r === void 0 ? {
10
10
  error: e,
@@ -17,23 +17,23 @@ var e = (e) => (t, n, r) => {
17
17
  return;
18
18
  }
19
19
  let l = new AbortController();
20
- s = l, i.value = r === void 0 ? { status: "pending" } : {
20
+ o = l, i.value = r === void 0 ? { status: "pending" } : {
21
21
  previous: r,
22
22
  status: "pending"
23
23
  };
24
24
  let u;
25
25
  try {
26
- u = Promise.resolve(n(o, { signal: l.signal }));
26
+ u = Promise.resolve(n(c, { signal: l.signal }));
27
27
  } catch (e) {
28
28
  u = Promise.reject(e);
29
29
  }
30
30
  u.then((e) => {
31
- !c && !l.signal.aborted && (i.value = {
31
+ !s && !l.signal.aborted && (i.value = {
32
32
  status: "success",
33
33
  value: e
34
34
  });
35
35
  }, (e) => {
36
- !c && !l.signal.aborted && (i.value = r === void 0 ? {
36
+ !s && !l.signal.aborted && (i.value = r === void 0 ? {
37
37
  error: e,
38
38
  status: "error"
39
39
  } : {
@@ -42,23 +42,23 @@ var e = (e) => (t, n, r) => {
42
42
  status: "error"
43
43
  });
44
44
  });
45
- }, u = e.effect(() => (l(), () => s?.abort()), { name: r?.name });
46
- return u.disposalSignal.addEventListener("abort", () => {
47
- c = !0, o.abort();
45
+ }, l = e.effect(() => (c(), () => o?.abort()), { name: r?.name });
46
+ return l.disposalSignal.addEventListener("abort", () => {
47
+ s = !0;
48
48
  }, { once: !0 }), {
49
49
  get disposalSignal() {
50
- return o.signal;
50
+ return l.disposalSignal;
51
51
  },
52
- dispose: () => u.dispose(),
52
+ dispose: () => l.dispose(),
53
53
  get disposed() {
54
- return c;
54
+ return s;
55
55
  },
56
56
  get name() {
57
57
  return i.name;
58
58
  },
59
59
  peek: () => i.peek(),
60
60
  reload: () => {
61
- c || (a.value = a.peek() + 1);
61
+ s || (a.value = a.peek() + 1);
62
62
  },
63
63
  subscribe: (e) => i.subscribe(e),
64
64
  [Symbol.dispose]() {
@@ -1 +1 @@
1
- {"version":3,"file":"_async.js","names":[],"sources":["../src/_async.ts"],"sourcesContent":["import type { EffectHandle, Signal } from './types';\n\nexport type AsyncState<T> =\n | { readonly previous?: T; readonly status: 'pending' }\n | { readonly status: 'success'; readonly value: T }\n | { readonly error: unknown; readonly previous?: T; readonly status: 'error' };\n\nexport type Resource<T> = {\n [Symbol.dispose](): void;\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n readonly name?: string;\n peek(): AsyncState<T>;\n reload(): void;\n subscribe(listener: () => void): () => void;\n readonly value: AsyncState<T>;\n};\n\nexport type ResourceOptions = {\n name?: string;\n};\n\ntype AsyncRuntime = {\n effect(callback: () => void | (() => void), options?: { name?: string }): EffectHandle;\n signal<T>(initial: T, options?: { name?: string }): Signal<T>;\n};\n\n/** Resource only depends on primitive runtime methods; graph binding stays private. */\nexport const createResource =\n (runtime: AsyncRuntime) =>\n <Source, Value>(\n source: () => Source,\n loader: (source: Source, context: { readonly signal: AbortSignal }) => Promise<Value>,\n options?: ResourceOptions,\n ): Resource<Value> => {\n const state = runtime.signal<AsyncState<Value>>({ status: 'pending' }, { name: options?.name });\n const reloadEpoch = runtime.signal(0);\n const controller = new AbortController();\n let active: AbortController | undefined;\n let disposed = false;\n\n const run = (): void => {\n void reloadEpoch.value;\n active?.abort();\n\n const current = state.peek();\n const previous =\n current.status === 'success' ? current.value : 'previous' in current ? current.previous : undefined;\n let input: Source;\n\n try {\n input = source();\n } catch (error) {\n state.value = previous === undefined ? { error, status: 'error' } : { error, previous, status: 'error' };\n\n return;\n }\n\n const next = new AbortController();\n\n active = next;\n state.value = previous === undefined ? { status: 'pending' } : { previous, status: 'pending' };\n\n let request: Promise<Value>;\n\n try {\n request = Promise.resolve(loader(input, { signal: next.signal }));\n } catch (error) {\n request = Promise.reject(error);\n }\n\n void request.then(\n (value) => {\n if (!disposed && !next.signal.aborted) state.value = { status: 'success', value };\n },\n (error: unknown) => {\n if (!disposed && !next.signal.aborted) {\n state.value = previous === undefined ? { error, status: 'error' } : { error, previous, status: 'error' };\n }\n },\n );\n };\n\n const stop = runtime.effect(\n () => {\n run();\n\n return () => active?.abort();\n },\n { name: options?.name },\n );\n\n stop.disposalSignal.addEventListener(\n 'abort',\n () => {\n disposed = true;\n controller.abort();\n },\n { once: true },\n );\n\n return {\n get disposalSignal() {\n return controller.signal;\n },\n dispose: () => stop.dispose(),\n get disposed() {\n return disposed;\n },\n get name() {\n return state.name;\n },\n peek: () => state.peek(),\n reload: () => {\n if (disposed) return;\n\n reloadEpoch.value = reloadEpoch.peek() + 1;\n },\n subscribe: (listener) => state.subscribe(listener),\n [Symbol.dispose]() {\n this.dispose();\n },\n get value() {\n return state.value;\n },\n };\n };\n"],"mappings":";AA6BA,IAAa,KACV,OAEC,GACA,GACA,MACoB;CACpB,IAAM,IAAQ,EAAQ,OAA0B,EAAE,QAAQ,UAAU,GAAG,EAAE,MAAM,GAAS,KAAK,CAAC,GACxF,IAAc,EAAQ,OAAO,CAAC,GAC9B,IAAa,IAAI,gBAAgB,GACnC,GACA,IAAW,IAET,UAAkB;EAEtB,AADA,EAAiB,OACjB,GAAQ,MAAM;EAEd,IAAM,IAAU,EAAM,KAAK,GACrB,IACJ,EAAQ,WAAW,YAAY,EAAQ,QAAQ,cAAc,IAAU,EAAQ,WAAW,KAAA,GACxF;EAEJ,IAAI;GACF,IAAQ,EAAO;EACjB,SAAS,GAAO;GACd,EAAM,QAAQ,MAAa,KAAA,IAAY;IAAE;IAAO,QAAQ;GAAQ,IAAI;IAAE;IAAO;IAAU,QAAQ;GAAQ;GAEvG;EACF;EAEA,IAAM,IAAO,IAAI,gBAAgB;EAGjC,AADA,IAAS,GACT,EAAM,QAAQ,MAAa,KAAA,IAAY,EAAE,QAAQ,UAAU,IAAI;GAAE;GAAU,QAAQ;EAAU;EAE7F,IAAI;EAEJ,IAAI;GACF,IAAU,QAAQ,QAAQ,EAAO,GAAO,EAAE,QAAQ,EAAK,OAAO,CAAC,CAAC;EAClE,SAAS,GAAO;GACd,IAAU,QAAQ,OAAO,CAAK;EAChC;EAEA,EAAa,MACV,MAAU;GACT,AAAI,CAAC,KAAY,CAAC,EAAK,OAAO,YAAS,EAAM,QAAQ;IAAE,QAAQ;IAAW;GAAM;EAClF,IACC,MAAmB;GAClB,AAAI,CAAC,KAAY,CAAC,EAAK,OAAO,YAC5B,EAAM,QAAQ,MAAa,KAAA,IAAY;IAAE;IAAO,QAAQ;GAAQ,IAAI;IAAE;IAAO;IAAU,QAAQ;GAAQ;EAE3G,CACF;CACF,GAEM,IAAO,EAAQ,cAEjB,EAAI,SAES,GAAQ,MAAM,IAE7B,EAAE,MAAM,GAAS,KAAK,CACxB;CAWA,OATA,EAAK,eAAe,iBAClB,eACM;EAEJ,AADA,IAAW,IACX,EAAW,MAAM;CACnB,GACA,EAAE,MAAM,GAAK,CACf,GAEO;EACL,IAAI,iBAAiB;GACnB,OAAO,EAAW;EACpB;EACA,eAAe,EAAK,QAAQ;EAC5B,IAAI,WAAW;GACb,OAAO;EACT;EACA,IAAI,OAAO;GACT,OAAO,EAAM;EACf;EACA,YAAY,EAAM,KAAK;EACvB,cAAc;GACR,MAEJ,EAAY,QAAQ,EAAY,KAAK,IAAI;EAC3C;EACA,YAAY,MAAa,EAAM,UAAU,CAAQ;EACjD,CAAC,OAAO,WAAW;GACjB,KAAK,QAAQ;EACf;EACA,IAAI,QAAQ;GACV,OAAO,EAAM;EACf;CACF;AACF"}
1
+ {"version":3,"file":"_async.js","names":[],"sources":["../src/_async.ts"],"sourcesContent":["import type { EffectHandle, Signal } from './types';\n\nexport type AsyncState<T> =\n | { readonly previous?: T; readonly status: 'pending' }\n | { readonly status: 'success'; readonly value: T }\n | { readonly error: unknown; readonly previous?: T; readonly status: 'error' };\n\nexport type Resource<T> = {\n [Symbol.dispose](): void;\n readonly disposalSignal: AbortSignal;\n dispose(): void;\n readonly disposed: boolean;\n readonly name?: string;\n peek(): AsyncState<T>;\n reload(): void;\n subscribe(listener: () => void): () => void;\n readonly value: AsyncState<T>;\n};\n\nexport type ResourceOptions = {\n name?: string;\n};\n\ntype AsyncRuntime = {\n effect(callback: () => undefined | (() => void), options?: { name?: string }): EffectHandle;\n signal<T>(initial: T, options?: { name?: string }): Signal<T>;\n};\n\n/** Resource only depends on primitive runtime methods; graph binding stays private. */\nexport const createResource =\n (runtime: AsyncRuntime) =>\n <Source, Value>(\n source: () => Source,\n loader: (source: Source, context: { readonly signal: AbortSignal }) => Promise<Value>,\n options?: ResourceOptions,\n ): Resource<Value> => {\n const state = runtime.signal<AsyncState<Value>>({ status: 'pending' }, { name: options?.name });\n const reloadEpoch = runtime.signal(0);\n let active: AbortController | undefined;\n let disposed = false;\n\n const run = (): void => {\n void reloadEpoch.value;\n active?.abort();\n\n const current = state.peek();\n const previous =\n current.status === 'success' ? current.value : 'previous' in current ? current.previous : undefined;\n let input: Source;\n\n try {\n input = source();\n } catch (error) {\n state.value = previous === undefined ? { error, status: 'error' } : { error, previous, status: 'error' };\n\n return;\n }\n\n const next = new AbortController();\n\n active = next;\n state.value = previous === undefined ? { status: 'pending' } : { previous, status: 'pending' };\n\n let request: Promise<Value>;\n\n try {\n request = Promise.resolve(loader(input, { signal: next.signal }));\n } catch (error) {\n request = Promise.reject(error);\n }\n\n void request.then(\n (value) => {\n if (!disposed && !next.signal.aborted) state.value = { status: 'success', value };\n },\n (error: unknown) => {\n if (!disposed && !next.signal.aborted) {\n state.value = previous === undefined ? { error, status: 'error' } : { error, previous, status: 'error' };\n }\n },\n );\n };\n\n const stop = runtime.effect(\n () => {\n run();\n\n return () => active?.abort();\n },\n { name: options?.name },\n );\n\n stop.disposalSignal.addEventListener(\n 'abort',\n () => {\n disposed = true;\n },\n { once: true },\n );\n\n return {\n get disposalSignal() {\n return stop.disposalSignal;\n },\n dispose: () => stop.dispose(),\n get disposed() {\n return disposed;\n },\n get name() {\n return state.name;\n },\n peek: () => state.peek(),\n reload: () => {\n if (disposed) return;\n\n reloadEpoch.value = reloadEpoch.peek() + 1;\n },\n subscribe: (listener) => state.subscribe(listener),\n [Symbol.dispose]() {\n this.dispose();\n },\n get value() {\n return state.value;\n },\n };\n };\n"],"mappings":";AA6BA,IAAa,KACV,OAEC,GACA,GACA,MACoB;CACpB,IAAM,IAAQ,EAAQ,OAA0B,EAAE,QAAQ,UAAU,GAAG,EAAE,MAAM,GAAS,KAAK,CAAC,GACxF,IAAc,EAAQ,OAAO,CAAC,GAChC,GACA,IAAW,IAET,UAAkB;EAEtB,AADA,EAAiB,OACjB,GAAQ,MAAM;EAEd,IAAM,IAAU,EAAM,KAAK,GACrB,IACJ,EAAQ,WAAW,YAAY,EAAQ,QAAQ,cAAc,IAAU,EAAQ,WAAW,KAAA,GACxF;EAEJ,IAAI;GACF,IAAQ,EAAO;EACjB,SAAS,GAAO;GACd,EAAM,QAAQ,MAAa,KAAA,IAAY;IAAE;IAAO,QAAQ;GAAQ,IAAI;IAAE;IAAO;IAAU,QAAQ;GAAQ;GAEvG;EACF;EAEA,IAAM,IAAO,IAAI,gBAAgB;EAGjC,AADA,IAAS,GACT,EAAM,QAAQ,MAAa,KAAA,IAAY,EAAE,QAAQ,UAAU,IAAI;GAAE;GAAU,QAAQ;EAAU;EAE7F,IAAI;EAEJ,IAAI;GACF,IAAU,QAAQ,QAAQ,EAAO,GAAO,EAAE,QAAQ,EAAK,OAAO,CAAC,CAAC;EAClE,SAAS,GAAO;GACd,IAAU,QAAQ,OAAO,CAAK;EAChC;EAEA,EAAa,MACV,MAAU;GACT,AAAI,CAAC,KAAY,CAAC,EAAK,OAAO,YAAS,EAAM,QAAQ;IAAE,QAAQ;IAAW;GAAM;EAClF,IACC,MAAmB;GAClB,AAAI,CAAC,KAAY,CAAC,EAAK,OAAO,YAC5B,EAAM,QAAQ,MAAa,KAAA,IAAY;IAAE;IAAO,QAAQ;GAAQ,IAAI;IAAE;IAAO;IAAU,QAAQ;GAAQ;EAE3G,CACF;CACF,GAEM,IAAO,EAAQ,cAEjB,EAAI,SAES,GAAQ,MAAM,IAE7B,EAAE,MAAM,GAAS,KAAK,CACxB;CAUA,OARA,EAAK,eAAe,iBAClB,eACM;EACJ,IAAW;CACb,GACA,EAAE,MAAM,GAAK,CACf,GAEO;EACL,IAAI,iBAAiB;GACnB,OAAO,EAAK;EACd;EACA,eAAe,EAAK,QAAQ;EAC5B,IAAI,WAAW;GACb,OAAO;EACT;EACA,IAAI,OAAO;GACT,OAAO,EAAM;EACf;EACA,YAAY,EAAM,KAAK;EACvB,cAAc;GACR,MAEJ,EAAY,QAAQ,EAAY,KAAK,IAAI;EAC3C;EACA,YAAY,MAAa,EAAM,UAAU,CAAQ;EACjD,CAAC,OAAO,WAAW;GACjB,KAAK,QAAQ;EACf;EACA,IAAI,QAAQ;GACV,OAAO,EAAM;EACf;CACF;AACF"}
@@ -0,0 +1,2 @@
1
+ const e=require("./_async.cjs"),t=require("./_watch.cjs"),n=require("./runtime.cjs");var r=r=>{let i=new n.ReactiveRuntime(r),a=e.createResource(i);return{batch:i.batch,computed:i.computed,createScope:i.createScope,dispose:()=>i.dispose(),get disposed(){return i.disposed},effect:i.effect,resource:a,signal:i.signal,untrack:i.untrack,watch:t.createWatch(i)}},i=r();exports.createRipple=r,exports.defaultRipple=i;
2
+ //# sourceMappingURL=_default.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_default.cjs","names":[],"sources":["../src/_default.ts"],"sourcesContent":["import { createResource, type Resource, type ResourceOptions } from './_async';\nimport { createWatch, type WatchOptions } from './_watch';\nimport { ReactiveRuntime } from './runtime';\nimport type {\n Cleanup,\n ComputedOptions,\n EffectHandle,\n EffectOptions,\n Readable,\n RippleOptions,\n Scope,\n Signal,\n SignalOptions,\n} from './types';\n\nexport interface Ripple {\n batch<T>(fn: () => T): T;\n computed<T>(derive: () => T, options?: ComputedOptions<T>): Readable<T>;\n createScope(name?: string): Scope;\n dispose(): void;\n readonly disposed: boolean;\n effect(callback: () => Cleanup | undefined, options?: EffectOptions): EffectHandle;\n resource<Source, Value>(\n source: () => Source,\n loader: (source: Source, context: { readonly signal: AbortSignal }) => Promise<Value>,\n options?: ResourceOptions,\n ): Resource<Value>;\n signal<T>(initial: T, options?: SignalOptions<T>): Signal<T>;\n untrack<T>(fn: () => T): T;\n watch<T>(\n source: Readable<T> | (() => T),\n callback: (value: T, previous: T | undefined) => void,\n options?: WatchOptions<T>,\n ): EffectHandle;\n}\n\n/** Creates one complete reactive graph. All factories on the object share its runtime. */\nexport const createRipple = (options?: RippleOptions): Ripple => {\n const runtime = new ReactiveRuntime(options);\n const resource = createResource(runtime);\n\n return {\n batch: runtime.batch,\n computed: runtime.computed,\n createScope: runtime.createScope,\n dispose: () => runtime.dispose(),\n get disposed() {\n return runtime.disposed;\n },\n effect: runtime.effect,\n resource,\n signal: runtime.signal,\n untrack: runtime.untrack,\n watch: createWatch(runtime),\n };\n};\n\n/**\n * The shared default reactive graph. Private — `signal`, `computed`, `effect`, `batch`,\n * `createScope`, `untrack`, `watch`, and `resource` are re-exported from the package root\n * as bound methods on this single graph instance.\n */\nexport const defaultRipple = createRipple();\n"],"mappings":"qFAqCA,IAAa,EAAgB,GAAoC,CAC/D,IAAM,EAAU,IAAI,EAAA,gBAAgB,CAAO,EACrC,EAAW,EAAA,eAAe,CAAO,EAEvC,MAAO,CACL,MAAO,EAAQ,MACf,SAAU,EAAQ,SAClB,YAAa,EAAQ,YACrB,YAAe,EAAQ,QAAQ,EAC/B,IAAI,UAAW,CACb,OAAO,EAAQ,QACjB,EACA,OAAQ,EAAQ,OAChB,WACA,OAAQ,EAAQ,OAChB,QAAS,EAAQ,QACjB,MAAO,EAAA,YAAY,CAAO,CAC5B,CACF,EAOa,EAAgB,EAAa"}
@@ -0,0 +1,26 @@
1
+ import { type Resource, type ResourceOptions } from './_async';
2
+ import { type WatchOptions } from './_watch';
3
+ import type { Cleanup, ComputedOptions, EffectHandle, EffectOptions, Readable, RippleOptions, Scope, Signal, SignalOptions } from './types';
4
+ export interface Ripple {
5
+ batch<T>(fn: () => T): T;
6
+ computed<T>(derive: () => T, options?: ComputedOptions<T>): Readable<T>;
7
+ createScope(name?: string): Scope;
8
+ dispose(): void;
9
+ readonly disposed: boolean;
10
+ effect(callback: () => Cleanup | undefined, options?: EffectOptions): EffectHandle;
11
+ resource<Source, Value>(source: () => Source, loader: (source: Source, context: {
12
+ readonly signal: AbortSignal;
13
+ }) => Promise<Value>, options?: ResourceOptions): Resource<Value>;
14
+ signal<T>(initial: T, options?: SignalOptions<T>): Signal<T>;
15
+ untrack<T>(fn: () => T): T;
16
+ watch<T>(source: Readable<T> | (() => T), callback: (value: T, previous: T | undefined) => void, options?: WatchOptions<T>): EffectHandle;
17
+ }
18
+ /** Creates one complete reactive graph. All factories on the object share its runtime. */
19
+ export declare const createRipple: (options?: RippleOptions) => Ripple;
20
+ /**
21
+ * The shared default reactive graph. Private — `signal`, `computed`, `effect`, `batch`,
22
+ * `createScope`, `untrack`, `watch`, and `resource` are re-exported from the package root
23
+ * as bound methods on this single graph instance.
24
+ */
25
+ export declare const defaultRipple: Ripple;
26
+ //# sourceMappingURL=_default.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_default.d.ts","sourceRoot":"","sources":["../src/_default.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAE1D,OAAO,KAAK,EACV,OAAO,EACP,eAAe,EACf,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,aAAa,EACb,KAAK,EACL,MAAM,EACN,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxE,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAClC,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,QAAQ,EAAE,MAAM,OAAO,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;IACnF,QAAQ,CAAC,MAAM,EAAE,KAAK,EACpB,MAAM,EAAE,MAAM,MAAM,EACpB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;KAAE,KAAK,OAAO,CAAC,KAAK,CAAC,EACrF,OAAO,CAAC,EAAE,eAAe,GACxB,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,KAAK,CAAC,CAAC,EACL,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,EACrD,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACxB,YAAY,CAAC;CACjB;AAED,0FAA0F;AAC1F,eAAO,MAAM,YAAY,GAAI,UAAU,aAAa,KAAG,MAkBtD,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,QAAiB,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { createResource as e } from "./_async.js";
2
+ import { createWatch as t } from "./_watch.js";
3
+ import { ReactiveRuntime as n } from "./runtime.js";
4
+ //#region src/_default.ts
5
+ var r = (r) => {
6
+ let i = new n(r), a = e(i);
7
+ return {
8
+ batch: i.batch,
9
+ computed: i.computed,
10
+ createScope: i.createScope,
11
+ dispose: () => i.dispose(),
12
+ get disposed() {
13
+ return i.disposed;
14
+ },
15
+ effect: i.effect,
16
+ resource: a,
17
+ signal: i.signal,
18
+ untrack: i.untrack,
19
+ watch: t(i)
20
+ };
21
+ }, i = r();
22
+ //#endregion
23
+ export { r as createRipple, i as defaultRipple };
24
+
25
+ //# sourceMappingURL=_default.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_default.js","names":[],"sources":["../src/_default.ts"],"sourcesContent":["import { createResource, type Resource, type ResourceOptions } from './_async';\nimport { createWatch, type WatchOptions } from './_watch';\nimport { ReactiveRuntime } from './runtime';\nimport type {\n Cleanup,\n ComputedOptions,\n EffectHandle,\n EffectOptions,\n Readable,\n RippleOptions,\n Scope,\n Signal,\n SignalOptions,\n} from './types';\n\nexport interface Ripple {\n batch<T>(fn: () => T): T;\n computed<T>(derive: () => T, options?: ComputedOptions<T>): Readable<T>;\n createScope(name?: string): Scope;\n dispose(): void;\n readonly disposed: boolean;\n effect(callback: () => Cleanup | undefined, options?: EffectOptions): EffectHandle;\n resource<Source, Value>(\n source: () => Source,\n loader: (source: Source, context: { readonly signal: AbortSignal }) => Promise<Value>,\n options?: ResourceOptions,\n ): Resource<Value>;\n signal<T>(initial: T, options?: SignalOptions<T>): Signal<T>;\n untrack<T>(fn: () => T): T;\n watch<T>(\n source: Readable<T> | (() => T),\n callback: (value: T, previous: T | undefined) => void,\n options?: WatchOptions<T>,\n ): EffectHandle;\n}\n\n/** Creates one complete reactive graph. All factories on the object share its runtime. */\nexport const createRipple = (options?: RippleOptions): Ripple => {\n const runtime = new ReactiveRuntime(options);\n const resource = createResource(runtime);\n\n return {\n batch: runtime.batch,\n computed: runtime.computed,\n createScope: runtime.createScope,\n dispose: () => runtime.dispose(),\n get disposed() {\n return runtime.disposed;\n },\n effect: runtime.effect,\n resource,\n signal: runtime.signal,\n untrack: runtime.untrack,\n watch: createWatch(runtime),\n };\n};\n\n/**\n * The shared default reactive graph. Private — `signal`, `computed`, `effect`, `batch`,\n * `createScope`, `untrack`, `watch`, and `resource` are re-exported from the package root\n * as bound methods on this single graph instance.\n */\nexport const defaultRipple = createRipple();\n"],"mappings":";;;;AAqCA,IAAa,KAAgB,MAAoC;CAC/D,IAAM,IAAU,IAAI,EAAgB,CAAO,GACrC,IAAW,EAAe,CAAO;CAEvC,OAAO;EACL,OAAO,EAAQ;EACf,UAAU,EAAQ;EAClB,aAAa,EAAQ;EACrB,eAAe,EAAQ,QAAQ;EAC/B,IAAI,WAAW;GACb,OAAO,EAAQ;EACjB;EACA,QAAQ,EAAQ;EAChB;EACA,QAAQ,EAAQ;EAChB,SAAS,EAAQ;EACjB,OAAO,EAAY,CAAO;CAC5B;AACF,GAOa,IAAgB,EAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"_watch.cjs","names":[],"sources":["../src/_watch.ts"],"sourcesContent":["import type { EffectHandle, Equality, Readable } from './types';\n\nexport type WatchOptions<T> = {\n equals?: Equality<T>;\n immediate?: boolean;\n name?: string;\n once?: boolean;\n};\n\ntype WatchRuntime = {\n effect(callback: () => void | (() => void), options?: { name?: string }): EffectHandle;\n};\n\nexport const createWatch =\n (runtime: WatchRuntime) =>\n <T>(\n source: Readable<T> | (() => T),\n callback: (value: T, previous: T | undefined) => void,\n options?: WatchOptions<T>,\n ): EffectHandle => {\n const read = typeof source === 'function' ? source : () => source.value;\n const equals = options?.equals ?? Object.is;\n let initial = true;\n let previous: T | undefined;\n let stopAfterInitialRun = false;\n\n const handle = runtime.effect(\n () => {\n const value = read();\n\n if (initial) {\n initial = false;\n previous = value;\n\n if (options?.immediate) callback(value, undefined);\n\n stopAfterInitialRun = options?.once === true && options.immediate === true;\n\n return;\n }\n\n if (equals(previous as T, value)) return;\n\n const oldValue = previous;\n\n previous = value;\n callback(value, oldValue);\n\n if (options?.once) handle.dispose();\n },\n { name: options?.name },\n );\n\n if (stopAfterInitialRun) handle.dispose();\n\n return handle;\n };\n"],"mappings":"AAaA,IAAa,EACV,IAEC,EACA,EACA,IACiB,CACjB,IAAM,EAAO,OAAO,GAAW,WAAa,MAAe,EAAO,MAC5D,EAAS,GAAS,QAAU,OAAO,GACrC,EAAU,GACV,EACA,EAAsB,GAEpB,EAAS,EAAQ,WACf,CACJ,IAAM,EAAQ,EAAK,EAEnB,GAAI,EAAS,CACX,EAAU,GACV,EAAW,EAEP,GAAS,WAAW,EAAS,EAAO,IAAA,EAAS,EAEjD,EAAsB,GAAS,OAAS,IAAQ,EAAQ,YAAc,GAEtE,MACF,CAEA,GAAI,EAAO,EAAe,CAAK,EAAG,OAElC,IAAM,EAAW,EAEjB,EAAW,EACX,EAAS,EAAO,CAAQ,EAEpB,GAAS,MAAM,EAAO,QAAQ,CACpC,EACA,CAAE,KAAM,GAAS,IAAK,CACxB,EAIA,OAFI,GAAqB,EAAO,QAAQ,EAEjC,CACT"}
1
+ {"version":3,"file":"_watch.cjs","names":[],"sources":["../src/_watch.ts"],"sourcesContent":["import type { EffectHandle, Equality, Readable } from './types';\n\nexport type WatchOptions<T> = {\n equals?: Equality<T>;\n immediate?: boolean;\n name?: string;\n once?: boolean;\n};\n\ntype WatchRuntime = {\n effect(callback: () => undefined | (() => void), options?: { name?: string }): EffectHandle;\n};\n\nexport const createWatch =\n (runtime: WatchRuntime) =>\n <T>(\n source: Readable<T> | (() => T),\n callback: (value: T, previous: T | undefined) => void,\n options?: WatchOptions<T>,\n ): EffectHandle => {\n const read = typeof source === 'function' ? source : () => source.value;\n const equals = options?.equals ?? Object.is;\n let initial = true;\n let previous: T | undefined;\n let stopAfterInitialRun = false;\n\n const handle = runtime.effect(\n () => {\n const value = read();\n\n if (initial) {\n initial = false;\n previous = value;\n\n if (options?.immediate) callback(value, undefined);\n\n stopAfterInitialRun = options?.once === true && options.immediate === true;\n\n return;\n }\n\n if (equals(previous as T, value)) return;\n\n const oldValue = previous;\n\n previous = value;\n callback(value, oldValue);\n\n if (options?.once) handle.dispose();\n },\n { name: options?.name },\n );\n\n if (stopAfterInitialRun) handle.dispose();\n\n return handle;\n };\n"],"mappings":"AAaA,IAAa,EACV,IAEC,EACA,EACA,IACiB,CACjB,IAAM,EAAO,OAAO,GAAW,WAAa,MAAe,EAAO,MAC5D,EAAS,GAAS,QAAU,OAAO,GACrC,EAAU,GACV,EACA,EAAsB,GAEpB,EAAS,EAAQ,WACf,CACJ,IAAM,EAAQ,EAAK,EAEnB,GAAI,EAAS,CACX,EAAU,GACV,EAAW,EAEP,GAAS,WAAW,EAAS,EAAO,IAAA,EAAS,EAEjD,EAAsB,GAAS,OAAS,IAAQ,EAAQ,YAAc,GAEtE,MACF,CAEA,GAAI,EAAO,EAAe,CAAK,EAAG,OAElC,IAAM,EAAW,EAEjB,EAAW,EACX,EAAS,EAAO,CAAQ,EAEpB,GAAS,MAAM,EAAO,QAAQ,CACpC,EACA,CAAE,KAAM,GAAS,IAAK,CACxB,EAIA,OAFI,GAAqB,EAAO,QAAQ,EAEjC,CACT"}
package/dist/_watch.d.ts CHANGED
@@ -6,7 +6,7 @@ export type WatchOptions<T> = {
6
6
  once?: boolean;
7
7
  };
8
8
  type WatchRuntime = {
9
- effect(callback: () => void | (() => void), options?: {
9
+ effect(callback: () => undefined | (() => void), options?: {
10
10
  name?: string;
11
11
  }): EffectHandle;
12
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"_watch.d.ts","sourceRoot":"","sources":["../src/_watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAC5B,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,MAAM,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,CAAC;CACxF,CAAC;AAEF,eAAO,MAAM,WAAW,GACrB,SAAS,YAAY,MACrB,CAAC,EACA,QAAQ,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAC/B,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,EACrD,UAAU,YAAY,CAAC,CAAC,CAAC,KACxB,YAqCF,CAAC"}
1
+ {"version":3,"file":"_watch.d.ts","sourceRoot":"","sources":["../src/_watch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAEhE,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI;IAC5B,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,CAAC;AAEF,KAAK,YAAY,GAAG;IAClB,MAAM,CAAC,QAAQ,EAAE,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,YAAY,CAAC;CAC7F,CAAC;AAEF,eAAO,MAAM,WAAW,GACrB,SAAS,YAAY,MACrB,CAAC,EACA,QAAQ,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAC/B,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,EACrD,UAAU,YAAY,CAAC,CAAC,CAAC,KACxB,YAqCF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"_watch.js","names":[],"sources":["../src/_watch.ts"],"sourcesContent":["import type { EffectHandle, Equality, Readable } from './types';\n\nexport type WatchOptions<T> = {\n equals?: Equality<T>;\n immediate?: boolean;\n name?: string;\n once?: boolean;\n};\n\ntype WatchRuntime = {\n effect(callback: () => void | (() => void), options?: { name?: string }): EffectHandle;\n};\n\nexport const createWatch =\n (runtime: WatchRuntime) =>\n <T>(\n source: Readable<T> | (() => T),\n callback: (value: T, previous: T | undefined) => void,\n options?: WatchOptions<T>,\n ): EffectHandle => {\n const read = typeof source === 'function' ? source : () => source.value;\n const equals = options?.equals ?? Object.is;\n let initial = true;\n let previous: T | undefined;\n let stopAfterInitialRun = false;\n\n const handle = runtime.effect(\n () => {\n const value = read();\n\n if (initial) {\n initial = false;\n previous = value;\n\n if (options?.immediate) callback(value, undefined);\n\n stopAfterInitialRun = options?.once === true && options.immediate === true;\n\n return;\n }\n\n if (equals(previous as T, value)) return;\n\n const oldValue = previous;\n\n previous = value;\n callback(value, oldValue);\n\n if (options?.once) handle.dispose();\n },\n { name: options?.name },\n );\n\n if (stopAfterInitialRun) handle.dispose();\n\n return handle;\n };\n"],"mappings":";AAaA,IAAa,KACV,OAEC,GACA,GACA,MACiB;CACjB,IAAM,IAAO,OAAO,KAAW,aAAa,UAAe,EAAO,OAC5D,IAAS,GAAS,UAAU,OAAO,IACrC,IAAU,IACV,GACA,IAAsB,IAEpB,IAAS,EAAQ,aACf;EACJ,IAAM,IAAQ,EAAK;EAEnB,IAAI,GAAS;GAMX,AALA,IAAU,IACV,IAAW,GAEP,GAAS,aAAW,EAAS,GAAO,KAAA,CAAS,GAEjD,IAAsB,GAAS,SAAS,MAAQ,EAAQ,cAAc;GAEtE;EACF;EAEA,IAAI,EAAO,GAAe,CAAK,GAAG;EAElC,IAAM,IAAW;EAKjB,AAHA,IAAW,GACX,EAAS,GAAO,CAAQ,GAEpB,GAAS,QAAM,EAAO,QAAQ;CACpC,GACA,EAAE,MAAM,GAAS,KAAK,CACxB;CAIA,OAFI,KAAqB,EAAO,QAAQ,GAEjC;AACT"}
1
+ {"version":3,"file":"_watch.js","names":[],"sources":["../src/_watch.ts"],"sourcesContent":["import type { EffectHandle, Equality, Readable } from './types';\n\nexport type WatchOptions<T> = {\n equals?: Equality<T>;\n immediate?: boolean;\n name?: string;\n once?: boolean;\n};\n\ntype WatchRuntime = {\n effect(callback: () => undefined | (() => void), options?: { name?: string }): EffectHandle;\n};\n\nexport const createWatch =\n (runtime: WatchRuntime) =>\n <T>(\n source: Readable<T> | (() => T),\n callback: (value: T, previous: T | undefined) => void,\n options?: WatchOptions<T>,\n ): EffectHandle => {\n const read = typeof source === 'function' ? source : () => source.value;\n const equals = options?.equals ?? Object.is;\n let initial = true;\n let previous: T | undefined;\n let stopAfterInitialRun = false;\n\n const handle = runtime.effect(\n () => {\n const value = read();\n\n if (initial) {\n initial = false;\n previous = value;\n\n if (options?.immediate) callback(value, undefined);\n\n stopAfterInitialRun = options?.once === true && options.immediate === true;\n\n return;\n }\n\n if (equals(previous as T, value)) return;\n\n const oldValue = previous;\n\n previous = value;\n callback(value, oldValue);\n\n if (options?.once) handle.dispose();\n },\n { name: options?.name },\n );\n\n if (stopAfterInitialRun) handle.dispose();\n\n return handle;\n };\n"],"mappings":";AAaA,IAAa,KACV,OAEC,GACA,GACA,MACiB;CACjB,IAAM,IAAO,OAAO,KAAW,aAAa,UAAe,EAAO,OAC5D,IAAS,GAAS,UAAU,OAAO,IACrC,IAAU,IACV,GACA,IAAsB,IAEpB,IAAS,EAAQ,aACf;EACJ,IAAM,IAAQ,EAAK;EAEnB,IAAI,GAAS;GAMX,AALA,IAAU,IACV,IAAW,GAEP,GAAS,aAAW,EAAS,GAAO,KAAA,CAAS,GAEjD,IAAsB,GAAS,SAAS,MAAQ,EAAQ,cAAc;GAEtE;EACF;EAEA,IAAI,EAAO,GAAe,CAAK,GAAG;EAElC,IAAM,IAAW;EAKjB,AAHA,IAAW,GACX,EAAS,GAAO,CAAQ,GAEpB,GAAS,QAAM,EAAO,QAAQ;CACpC,GACA,EAAE,MAAM,GAAS,KAAK,CACxB;CAIA,OAFI,KAAqB,EAAO,QAAQ,GAEjC;AACT"}
package/dist/errors.cjs CHANGED
@@ -1,2 +1,2 @@
1
- var e=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},t=class extends e{},n=class extends e{},r=class extends e{};exports.RippleComputedCycleError=t,exports.RippleDisposedScopeError=n,exports.RippleError=e,exports.RippleInfiniteLoopError=r;
1
+ var e=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},t=class extends e{},n=class extends e{},r=class extends e{},i=class extends e{};exports.RippleComputedCycleError=t,exports.RippleDisposedRuntimeError=n,exports.RippleDisposedScopeError=r,exports.RippleError=e,exports.RippleInfiniteLoopError=i;
2
2
  //# sourceMappingURL=errors.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export class RippleError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n static is(error: unknown): error is RippleError {\n return error instanceof RippleError;\n }\n}\n\nexport class RippleComputedCycleError extends RippleError {}\nexport class RippleDisposedScopeError extends RippleError {}\nexport class RippleInfiniteLoopError extends RippleError {}\n"],"mappings":"AAAA,IAAa,EAAb,MAAa,UAAoB,KAAM,CACrC,YAAY,EAAiB,EAAwB,CACnD,MAAM,EAAS,CAAO,EACtB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CAEA,OAAO,GAAG,EAAsC,CAC9C,OAAO,aAAiB,CAC1B,CACF,EAEa,EAAb,cAA8C,CAAY,CAAC,EAC9C,EAAb,cAA8C,CAAY,CAAC,EAC9C,EAAb,cAA6C,CAAY,CAAC"}
1
+ {"version":3,"file":"errors.cjs","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export class RippleError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n static is(error: unknown): error is RippleError {\n return error instanceof RippleError;\n }\n}\n\nexport class RippleComputedCycleError extends RippleError {}\nexport class RippleDisposedRuntimeError extends RippleError {}\nexport class RippleDisposedScopeError extends RippleError {}\nexport class RippleInfiniteLoopError extends RippleError {}\n"],"mappings":"AAAA,IAAa,EAAb,MAAa,UAAoB,KAAM,CACrC,YAAY,EAAiB,EAAwB,CACnD,MAAM,EAAS,CAAO,EACtB,KAAK,KAAO,WAAW,KACvB,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CAEA,OAAO,GAAG,EAAsC,CAC9C,OAAO,aAAiB,CAC1B,CACF,EAEa,EAAb,cAA8C,CAAY,CAAC,EAC9C,EAAb,cAAgD,CAAY,CAAC,EAChD,EAAb,cAA8C,CAAY,CAAC,EAC9C,EAAb,cAA6C,CAAY,CAAC"}
package/dist/errors.d.ts CHANGED
@@ -4,6 +4,8 @@ export declare class RippleError extends Error {
4
4
  }
5
5
  export declare class RippleComputedCycleError extends RippleError {
6
6
  }
7
+ export declare class RippleDisposedRuntimeError extends RippleError {
8
+ }
7
9
  export declare class RippleDisposedScopeError extends RippleError {
8
10
  }
9
11
  export declare class RippleInfiniteLoopError extends RippleError {
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;IAMnD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW;CAGhD;AAED,qBAAa,wBAAyB,SAAQ,WAAW;CAAG;AAC5D,qBAAa,wBAAyB,SAAQ,WAAW;CAAG;AAC5D,qBAAa,uBAAwB,SAAQ,WAAW;CAAG"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;IAMnD,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW;CAGhD;AAED,qBAAa,wBAAyB,SAAQ,WAAW;CAAG;AAC5D,qBAAa,0BAA2B,SAAQ,WAAW;CAAG;AAC9D,qBAAa,wBAAyB,SAAQ,WAAW;CAAG;AAC5D,qBAAa,uBAAwB,SAAQ,WAAW;CAAG"}
package/dist/errors.js CHANGED
@@ -6,8 +6,8 @@ var e = class e extends Error {
6
6
  static is(t) {
7
7
  return t instanceof e;
8
8
  }
9
- }, t = class extends e {}, n = class extends e {}, r = class extends e {};
9
+ }, t = class extends e {}, n = class extends e {}, r = class extends e {}, i = class extends e {};
10
10
  //#endregion
11
- export { t as RippleComputedCycleError, n as RippleDisposedScopeError, e as RippleError, r as RippleInfiniteLoopError };
11
+ export { t as RippleComputedCycleError, n as RippleDisposedRuntimeError, r as RippleDisposedScopeError, e as RippleError, i as RippleInfiniteLoopError };
12
12
 
13
13
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export class RippleError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n static is(error: unknown): error is RippleError {\n return error instanceof RippleError;\n }\n}\n\nexport class RippleComputedCycleError extends RippleError {}\nexport class RippleDisposedScopeError extends RippleError {}\nexport class RippleInfiniteLoopError extends RippleError {}\n"],"mappings":";AAAA,IAAa,IAAb,MAAa,UAAoB,MAAM;CACrC,YAAY,GAAiB,GAAwB;EAGnD,AAFA,MAAM,GAAS,CAAO,GACtB,KAAK,OAAO,WAAW,MACvB,OAAO,eAAe,MAAM,WAAW,SAAS;CAClD;CAEA,OAAO,GAAG,GAAsC;EAC9C,OAAO,aAAiB;CAC1B;AACF,GAEa,IAAb,cAA8C,EAAY,CAAC,GAC9C,IAAb,cAA8C,EAAY,CAAC,GAC9C,IAAb,cAA6C,EAAY,CAAC"}
1
+ {"version":3,"file":"errors.js","names":[],"sources":["../src/errors.ts"],"sourcesContent":["export class RippleError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n static is(error: unknown): error is RippleError {\n return error instanceof RippleError;\n }\n}\n\nexport class RippleComputedCycleError extends RippleError {}\nexport class RippleDisposedRuntimeError extends RippleError {}\nexport class RippleDisposedScopeError extends RippleError {}\nexport class RippleInfiniteLoopError extends RippleError {}\n"],"mappings":";AAAA,IAAa,IAAb,MAAa,UAAoB,MAAM;CACrC,YAAY,GAAiB,GAAwB;EAGnD,AAFA,MAAM,GAAS,CAAO,GACtB,KAAK,OAAO,WAAW,MACvB,OAAO,eAAe,MAAM,WAAW,SAAS;CAClD;CAEA,OAAO,GAAG,GAAsC;EAC9C,OAAO,aAAiB;CAC1B;AACF,GAEa,IAAb,cAA8C,EAAY,CAAC,GAC9C,IAAb,cAAgD,EAAY,CAAC,GAChD,IAAb,cAA8C,EAAY,CAAC,GAC9C,IAAb,cAA6C,EAAY,CAAC"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./runtime.cjs"),n=require("./_async.cjs"),r=require("./_store.cjs"),i=require("./_watch.cjs");var a=e=>{let a=new t.ReactiveRuntime(e),o=n.createResource(a),s=r.createStore(a);return{batch:a.batch,computed:a.computed,createScope:a.createScope,createStore:s,dispose:()=>a.dispose(),effect:a.effect,resource:o,signal:a.signal,untrack:a.untrack,watch:i.createWatch(a)}},o=a(),s=o.signal,c=o.computed,l=o.effect,u=o.batch,d=o.createScope,f=o.createStore,p=o.resource,m=o.untrack,h=o.watch;exports.RippleComputedCycleError=e.RippleComputedCycleError,exports.RippleDisposedScopeError=e.RippleDisposedScopeError,exports.RippleError=e.RippleError,exports.RippleInfiniteLoopError=e.RippleInfiniteLoopError,exports.batch=u,exports.computed=c,exports.createRipple=a,exports.createScope=d,exports.createStore=f,exports.effect=l,exports.isReactive=t.isReactive,exports.resource=p,exports.signal=s,exports.untrack=m,exports.watch=h;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./errors.cjs"),t=require("./runtime.cjs"),n=require("./_default.cjs");var r=n.defaultRipple.signal,i=n.defaultRipple.computed,a=n.defaultRipple.effect,o=n.defaultRipple.batch,s=n.defaultRipple.createScope,c=n.defaultRipple.untrack,l=n.defaultRipple.watch,u=n.defaultRipple.resource;exports.RippleComputedCycleError=e.RippleComputedCycleError,exports.RippleDisposedRuntimeError=e.RippleDisposedRuntimeError,exports.RippleDisposedScopeError=e.RippleDisposedScopeError,exports.RippleError=e.RippleError,exports.RippleInfiniteLoopError=e.RippleInfiniteLoopError,exports.batch=o,exports.computed=i,exports.createRipple=n.createRipple,exports.createScope=s,exports.effect=a,exports.isReactive=t.isReactive,exports.resource=u,exports.signal=r,exports.untrack=c,exports.watch=l;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["export type {\n Cleanup,\n ComputedOptions,\n Disposable,\n EffectHandle,\n EffectOptions,\n Equality,\n ReactiveErrorContext,\n ReactiveEvent,\n ReactiveObserver,\n Readable,\n RippleOptions,\n Scope,\n Signal,\n SignalOptions,\n Unsubscribe,\n} from './types';\n\nexport { RippleComputedCycleError, RippleDisposedScopeError, RippleError, RippleInfiniteLoopError } from './errors';\nexport { isReactive } from './runtime';\n\nimport type {\n Cleanup,\n ComputedOptions,\n EffectHandle,\n EffectOptions,\n Readable,\n RippleOptions,\n Scope,\n Signal,\n SignalOptions,\n} from './types';\n\nimport { createResource, type Resource, type ResourceOptions } from './_async';\nimport { createStore as createStoreFactory, type Store, type StoreOptions } from './_store';\nimport { createWatch, type WatchOptions } from './_watch';\nimport { ReactiveRuntime } from './runtime';\n\nexport interface Ripple {\n batch<T>(fn: () => T): T;\n computed<T>(derive: () => T, options?: ComputedOptions<T>): Readable<T>;\n createScope(name?: string): Scope;\n createStore<T>(initial: T, options?: StoreOptions): Store<T>;\n dispose(): void;\n effect(callback: () => Cleanup | void, options?: EffectOptions): EffectHandle;\n resource<Source, Value>(\n source: () => Source,\n loader: (source: Source, context: { readonly signal: AbortSignal }) => Promise<Value>,\n options?: ResourceOptions,\n ): Resource<Value>;\n signal<T>(initial: T, options?: SignalOptions<T>): Signal<T>;\n untrack<T>(fn: () => T): T;\n watch<T>(\n source: Readable<T> | (() => T),\n callback: (value: T, previous: T | undefined) => void,\n options?: WatchOptions<T>,\n ): EffectHandle;\n}\n\n/** Creates one complete reactive graph. All factories on the object share its runtime. */\nexport const createRipple = (options?: RippleOptions): Ripple => {\n const runtime = new ReactiveRuntime(options);\n const resource = createResource(runtime);\n const createStore = createStoreFactory(runtime);\n\n return {\n batch: runtime.batch,\n computed: runtime.computed,\n createScope: runtime.createScope,\n createStore,\n dispose: () => runtime.dispose(),\n effect: runtime.effect,\n resource,\n signal: runtime.signal,\n untrack: runtime.untrack,\n watch: createWatch(runtime),\n };\n};\n\nconst defaultRipple = createRipple();\n\nexport const signal = defaultRipple.signal;\nexport const computed = defaultRipple.computed;\nexport const effect = defaultRipple.effect;\nexport const batch = defaultRipple.batch;\nexport const createScope = defaultRipple.createScope;\nexport const createStore = defaultRipple.createStore;\nexport const resource = defaultRipple.resource;\nexport const untrack = defaultRipple.untrack;\nexport const watch = defaultRipple.watch;\n"],"mappings":"4MA4DA,IAAa,EAAgB,GAAoC,CAC/D,IAAM,EAAU,IAAI,EAAA,gBAAgB,CAAO,EACrC,EAAW,EAAA,eAAe,CAAO,EACjC,EAAc,EAAA,YAAmB,CAAO,EAE9C,MAAO,CACL,MAAO,EAAQ,MACf,SAAU,EAAQ,SAClB,YAAa,EAAQ,YACrB,cACA,YAAe,EAAQ,QAAQ,EAC/B,OAAQ,EAAQ,OAChB,WACA,OAAQ,EAAQ,OAChB,QAAS,EAAQ,QACjB,MAAO,EAAA,YAAY,CAAO,CAC5B,CACF,EAEM,EAAgB,EAAa,EAEtB,EAAS,EAAc,OACvB,EAAW,EAAc,SACzB,EAAS,EAAc,OACvB,EAAQ,EAAc,MACtB,EAAc,EAAc,YAC5B,EAAc,EAAc,YAC5B,EAAW,EAAc,SACzB,EAAU,EAAc,QACxB,EAAQ,EAAc"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/index.ts"],"sourcesContent":["export type { AsyncState, Resource, ResourceOptions } from './_async';\nexport { createRipple, type Ripple } from './_default';\nexport type { WatchOptions } from './_watch';\nexport {\n RippleComputedCycleError,\n RippleDisposedRuntimeError,\n RippleDisposedScopeError,\n RippleError,\n RippleInfiniteLoopError,\n} from './errors';\nexport { isReactive } from './runtime';\nexport type {\n Cleanup,\n ComputedOptions,\n Disposable,\n EffectHandle,\n EffectOptions,\n Equality,\n ReactiveErrorContext,\n ReactiveEvent,\n ReactiveObserver,\n Readable,\n RippleOptions,\n Scope,\n Signal,\n SignalOptions,\n Unsubscribe,\n} from './types';\n\nimport { defaultRipple } from './_default';\n\nexport const signal = defaultRipple.signal;\nexport const computed = defaultRipple.computed;\nexport const effect = defaultRipple.effect;\nexport const batch = defaultRipple.batch;\nexport const createScope = defaultRipple.createScope;\nexport const untrack = defaultRipple.untrack;\nexport const watch = defaultRipple.watch;\nexport const resource = defaultRipple.resource;\n"],"mappings":"0JA+BA,IAAa,EAAS,EAAA,cAAc,OACvB,EAAW,EAAA,cAAc,SACzB,EAAS,EAAA,cAAc,OACvB,EAAQ,EAAA,cAAc,MACtB,EAAc,EAAA,cAAc,YAC5B,EAAU,EAAA,cAAc,QACxB,EAAQ,EAAA,cAAc,MACtB,EAAW,EAAA,cAAc"}
package/dist/index.d.ts CHANGED
@@ -1,35 +1,17 @@
1
- export type { Cleanup, ComputedOptions, Disposable, EffectHandle, EffectOptions, Equality, ReactiveErrorContext, ReactiveEvent, ReactiveObserver, Readable, RippleOptions, Scope, Signal, SignalOptions, Unsubscribe, } from './types';
2
- export { RippleComputedCycleError, RippleDisposedScopeError, RippleError, RippleInfiniteLoopError } from './errors';
1
+ export type { AsyncState, Resource, ResourceOptions } from './_async';
2
+ export { createRipple, type Ripple } from './_default';
3
+ export type { WatchOptions } from './_watch';
4
+ export { RippleComputedCycleError, RippleDisposedRuntimeError, RippleDisposedScopeError, RippleError, RippleInfiniteLoopError, } from './errors';
3
5
  export { isReactive } from './runtime';
4
- import type { Cleanup, ComputedOptions, EffectHandle, EffectOptions, Readable, RippleOptions, Scope, Signal, SignalOptions } from './types';
5
- import { type Resource, type ResourceOptions } from './_async';
6
- import { type Store, type StoreOptions } from './_store';
7
- import { type WatchOptions } from './_watch';
8
- export interface Ripple {
9
- batch<T>(fn: () => T): T;
10
- computed<T>(derive: () => T, options?: ComputedOptions<T>): Readable<T>;
11
- createScope(name?: string): Scope;
12
- createStore<T>(initial: T, options?: StoreOptions): Store<T>;
13
- dispose(): void;
14
- effect(callback: () => Cleanup | void, options?: EffectOptions): EffectHandle;
15
- resource<Source, Value>(source: () => Source, loader: (source: Source, context: {
16
- readonly signal: AbortSignal;
17
- }) => Promise<Value>, options?: ResourceOptions): Resource<Value>;
18
- signal<T>(initial: T, options?: SignalOptions<T>): Signal<T>;
19
- untrack<T>(fn: () => T): T;
20
- watch<T>(source: Readable<T> | (() => T), callback: (value: T, previous: T | undefined) => void, options?: WatchOptions<T>): EffectHandle;
21
- }
22
- /** Creates one complete reactive graph. All factories on the object share its runtime. */
23
- export declare const createRipple: (options?: RippleOptions) => Ripple;
24
- export declare const signal: <T>(initial: T, options?: SignalOptions<T>) => Signal<T>;
25
- export declare const computed: <T>(derive: () => T, options?: ComputedOptions<T>) => Readable<T>;
26
- export declare const effect: (callback: () => Cleanup | void, options?: EffectOptions) => EffectHandle;
6
+ export type { Cleanup, ComputedOptions, Disposable, EffectHandle, EffectOptions, Equality, ReactiveErrorContext, ReactiveEvent, ReactiveObserver, Readable, RippleOptions, Scope, Signal, SignalOptions, Unsubscribe, } from './types';
7
+ export declare const signal: <T>(initial: T, options?: import("./types").SignalOptions<T>) => import("./types").Signal<T>;
8
+ export declare const computed: <T>(derive: () => T, options?: import("./types").ComputedOptions<T>) => import("./types").Readable<T>;
9
+ export declare const effect: (callback: () => import("./types").Cleanup | undefined, options?: import("./types").EffectOptions) => import("./types").EffectHandle;
27
10
  export declare const batch: <T>(fn: () => T) => T;
28
- export declare const createScope: (name?: string) => Scope;
29
- export declare const createStore: <T>(initial: T, options?: StoreOptions) => Store<T>;
11
+ export declare const createScope: (name?: string) => import("./types").Scope;
12
+ export declare const untrack: <T>(fn: () => T) => T;
13
+ export declare const watch: <T>(source: import("./types").Readable<T> | (() => T), callback: (value: T, previous: T | undefined) => void, options?: import("./_watch").WatchOptions<T>) => import("./types").EffectHandle;
30
14
  export declare const resource: <Source, Value>(source: () => Source, loader: (source: Source, context: {
31
15
  readonly signal: AbortSignal;
32
- }) => Promise<Value>, options?: ResourceOptions) => Resource<Value>;
33
- export declare const untrack: <T>(fn: () => T) => T;
34
- export declare const watch: <T>(source: Readable<T> | (() => T), callback: (value: T, previous: T | undefined) => void, options?: WatchOptions<T>) => EffectHandle;
16
+ }) => Promise<Value>, options?: import("./_async").ResourceOptions) => import("./_async").Resource<Value>;
35
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,OAAO,EACP,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,KAAK,EACL,MAAM,EACN,aAAa,EACb,WAAW,GACZ,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AACpH,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,OAAO,KAAK,EACV,OAAO,EACP,eAAe,EACf,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,aAAa,EACb,KAAK,EACL,MAAM,EACN,aAAa,EACd,MAAM,SAAS,CAAC;AAEjB,OAAO,EAAkB,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,EAAqC,KAAK,KAAK,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAC5F,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAG1D,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACzB,QAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACxE,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAClC,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,IAAI,IAAI,CAAC;IAChB,MAAM,CAAC,QAAQ,EAAE,MAAM,OAAO,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC;IAC9E,QAAQ,CAAC,MAAM,EAAE,KAAK,EACpB,MAAM,EAAE,MAAM,MAAM,EACpB,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;KAAE,KAAK,OAAO,CAAC,KAAK,CAAC,EACrF,OAAO,CAAC,EAAE,eAAe,GACxB,QAAQ,CAAC,KAAK,CAAC,CAAC;IACnB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7D,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IAC3B,KAAK,CAAC,CAAC,EACL,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAC/B,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,EACrD,OAAO,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,GACxB,YAAY,CAAC;CACjB;AAED,0FAA0F;AAC1F,eAAO,MAAM,YAAY,GAAI,UAAU,aAAa,KAAG,MAiBtD,CAAC;AAIF,eAAO,MAAM,MAAM,GA/BV,CAAC,WAAW,CAAC,YAAY,aAAa,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,CAAC,CA+BnB,CAAC;AAC3C,eAAO,MAAM,QAAQ,GA1CV,CAAC,UAAU,MAAM,CAAC,YAAY,eAAe,CAAC,CAAC,CAAC,KAAG,QAAQ,CAAC,CAAC,CA0C1B,CAAC;AAC/C,eAAO,MAAM,MAAM,aAvCA,MAAM,OAAO,GAAG,IAAI,YAAY,aAAa,KAAG,YAuCzB,CAAC;AAC3C,eAAO,MAAM,KAAK,GA7CV,CAAC,MAAM,MAAM,CAAC,KAAG,CA6Ce,CAAC;AACzC,eAAO,MAAM,WAAW,UA5CH,MAAM,KAAG,KA4CsB,CAAC;AACrD,eAAO,MAAM,WAAW,GA5CV,CAAC,WAAW,CAAC,YAAY,YAAY,KAAG,KAAK,CAAC,CAAC,CA4CT,CAAC;AACrD,eAAO,MAAM,QAAQ,GA1CV,MAAM,EAAE,KAAK,UACZ,MAAM,MAAM,UACZ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE;IAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,KAAK,OAAO,CAAC,KAAK,CAAC,YAC3E,eAAe,KACxB,QAAQ,CAAC,KAAK,CAsC2B,CAAC;AAC/C,eAAO,MAAM,OAAO,GArCV,CAAC,MAAM,MAAM,CAAC,KAAG,CAqCiB,CAAC;AAC7C,eAAO,MAAM,KAAK,GArCV,CAAC,UACG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,YACrB,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,YAC3C,YAAY,CAAC,CAAC,CAAC,KACxB,YAiCmC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EACL,wBAAwB,EACxB,0BAA0B,EAC1B,wBAAwB,EACxB,WAAW,EACX,uBAAuB,GACxB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EACV,OAAO,EACP,eAAe,EACf,UAAU,EACV,YAAY,EACZ,aAAa,EACb,QAAQ,EACR,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,aAAa,EACb,KAAK,EACL,MAAM,EACN,aAAa,EACb,WAAW,GACZ,MAAM,SAAS,CAAC;AAIjB,eAAO,MAAM,MAAM,8FAAuB,CAAC;AAC3C,eAAO,MAAM,QAAQ,uGAAyB,CAAC;AAC/C,eAAO,MAAM,MAAM,sIAAuB,CAAC;AAC3C,eAAO,MAAM,KAAK,uBAAsB,CAAC;AACzC,eAAO,MAAM,WAAW,4CAA4B,CAAC;AACrD,eAAO,MAAM,OAAO,uBAAwB,CAAC;AAC7C,eAAO,MAAM,KAAK,+LAAsB,CAAC;AACzC,eAAO,MAAM,QAAQ;;yGAAyB,CAAC"}
package/dist/index.js CHANGED
@@ -1,25 +1,9 @@
1
- import { RippleComputedCycleError as e, RippleDisposedScopeError as t, RippleError as n, RippleInfiniteLoopError as r } from "./errors.js";
2
- import { ReactiveRuntime as i, isReactive as a } from "./runtime.js";
3
- import { createResource as o } from "./_async.js";
4
- import { createStore as s } from "./_store.js";
5
- import { createWatch as c } from "./_watch.js";
1
+ import { RippleComputedCycleError as e, RippleDisposedRuntimeError as t, RippleDisposedScopeError as n, RippleError as r, RippleInfiniteLoopError as i } from "./errors.js";
2
+ import { isReactive as a } from "./runtime.js";
3
+ import { createRipple as o, defaultRipple as s } from "./_default.js";
6
4
  //#region src/index.ts
7
- var l = (e) => {
8
- let t = new i(e), n = o(t), r = s(t);
9
- return {
10
- batch: t.batch,
11
- computed: t.computed,
12
- createScope: t.createScope,
13
- createStore: r,
14
- dispose: () => t.dispose(),
15
- effect: t.effect,
16
- resource: n,
17
- signal: t.signal,
18
- untrack: t.untrack,
19
- watch: c(t)
20
- };
21
- }, u = l(), d = u.signal, f = u.computed, p = u.effect, m = u.batch, h = u.createScope, g = u.createStore, _ = u.resource, v = u.untrack, y = u.watch;
5
+ var c = s.signal, l = s.computed, u = s.effect, d = s.batch, f = s.createScope, p = s.untrack, m = s.watch, h = s.resource;
22
6
  //#endregion
23
- export { e as RippleComputedCycleError, t as RippleDisposedScopeError, n as RippleError, r as RippleInfiniteLoopError, m as batch, f as computed, l as createRipple, h as createScope, g as createStore, p as effect, a as isReactive, _ as resource, d as signal, v as untrack, y as watch };
7
+ export { e as RippleComputedCycleError, t as RippleDisposedRuntimeError, n as RippleDisposedScopeError, r as RippleError, i as RippleInfiniteLoopError, d as batch, l as computed, o as createRipple, f as createScope, u as effect, a as isReactive, h as resource, c as signal, p as untrack, m as watch };
24
8
 
25
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export type {\n Cleanup,\n ComputedOptions,\n Disposable,\n EffectHandle,\n EffectOptions,\n Equality,\n ReactiveErrorContext,\n ReactiveEvent,\n ReactiveObserver,\n Readable,\n RippleOptions,\n Scope,\n Signal,\n SignalOptions,\n Unsubscribe,\n} from './types';\n\nexport { RippleComputedCycleError, RippleDisposedScopeError, RippleError, RippleInfiniteLoopError } from './errors';\nexport { isReactive } from './runtime';\n\nimport type {\n Cleanup,\n ComputedOptions,\n EffectHandle,\n EffectOptions,\n Readable,\n RippleOptions,\n Scope,\n Signal,\n SignalOptions,\n} from './types';\n\nimport { createResource, type Resource, type ResourceOptions } from './_async';\nimport { createStore as createStoreFactory, type Store, type StoreOptions } from './_store';\nimport { createWatch, type WatchOptions } from './_watch';\nimport { ReactiveRuntime } from './runtime';\n\nexport interface Ripple {\n batch<T>(fn: () => T): T;\n computed<T>(derive: () => T, options?: ComputedOptions<T>): Readable<T>;\n createScope(name?: string): Scope;\n createStore<T>(initial: T, options?: StoreOptions): Store<T>;\n dispose(): void;\n effect(callback: () => Cleanup | void, options?: EffectOptions): EffectHandle;\n resource<Source, Value>(\n source: () => Source,\n loader: (source: Source, context: { readonly signal: AbortSignal }) => Promise<Value>,\n options?: ResourceOptions,\n ): Resource<Value>;\n signal<T>(initial: T, options?: SignalOptions<T>): Signal<T>;\n untrack<T>(fn: () => T): T;\n watch<T>(\n source: Readable<T> | (() => T),\n callback: (value: T, previous: T | undefined) => void,\n options?: WatchOptions<T>,\n ): EffectHandle;\n}\n\n/** Creates one complete reactive graph. All factories on the object share its runtime. */\nexport const createRipple = (options?: RippleOptions): Ripple => {\n const runtime = new ReactiveRuntime(options);\n const resource = createResource(runtime);\n const createStore = createStoreFactory(runtime);\n\n return {\n batch: runtime.batch,\n computed: runtime.computed,\n createScope: runtime.createScope,\n createStore,\n dispose: () => runtime.dispose(),\n effect: runtime.effect,\n resource,\n signal: runtime.signal,\n untrack: runtime.untrack,\n watch: createWatch(runtime),\n };\n};\n\nconst defaultRipple = createRipple();\n\nexport const signal = defaultRipple.signal;\nexport const computed = defaultRipple.computed;\nexport const effect = defaultRipple.effect;\nexport const batch = defaultRipple.batch;\nexport const createScope = defaultRipple.createScope;\nexport const createStore = defaultRipple.createStore;\nexport const resource = defaultRipple.resource;\nexport const untrack = defaultRipple.untrack;\nexport const watch = defaultRipple.watch;\n"],"mappings":";;;;;;AA4DA,IAAa,KAAgB,MAAoC;CAC/D,IAAM,IAAU,IAAI,EAAgB,CAAO,GACrC,IAAW,EAAe,CAAO,GACjC,IAAc,EAAmB,CAAO;CAE9C,OAAO;EACL,OAAO,EAAQ;EACf,UAAU,EAAQ;EAClB,aAAa,EAAQ;EACrB;EACA,eAAe,EAAQ,QAAQ;EAC/B,QAAQ,EAAQ;EAChB;EACA,QAAQ,EAAQ;EAChB,SAAS,EAAQ;EACjB,OAAO,EAAY,CAAO;CAC5B;AACF,GAEM,IAAgB,EAAa,GAEtB,IAAS,EAAc,QACvB,IAAW,EAAc,UACzB,IAAS,EAAc,QACvB,IAAQ,EAAc,OACtB,IAAc,EAAc,aAC5B,IAAc,EAAc,aAC5B,IAAW,EAAc,UACzB,IAAU,EAAc,SACxB,IAAQ,EAAc"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["export type { AsyncState, Resource, ResourceOptions } from './_async';\nexport { createRipple, type Ripple } from './_default';\nexport type { WatchOptions } from './_watch';\nexport {\n RippleComputedCycleError,\n RippleDisposedRuntimeError,\n RippleDisposedScopeError,\n RippleError,\n RippleInfiniteLoopError,\n} from './errors';\nexport { isReactive } from './runtime';\nexport type {\n Cleanup,\n ComputedOptions,\n Disposable,\n EffectHandle,\n EffectOptions,\n Equality,\n ReactiveErrorContext,\n ReactiveEvent,\n ReactiveObserver,\n Readable,\n RippleOptions,\n Scope,\n Signal,\n SignalOptions,\n Unsubscribe,\n} from './types';\n\nimport { defaultRipple } from './_default';\n\nexport const signal = defaultRipple.signal;\nexport const computed = defaultRipple.computed;\nexport const effect = defaultRipple.effect;\nexport const batch = defaultRipple.batch;\nexport const createScope = defaultRipple.createScope;\nexport const untrack = defaultRipple.untrack;\nexport const watch = defaultRipple.watch;\nexport const resource = defaultRipple.resource;\n"],"mappings":";;;;AA+BA,IAAa,IAAS,EAAc,QACvB,IAAW,EAAc,UACzB,IAAS,EAAc,QACvB,IAAQ,EAAc,OACtB,IAAc,EAAc,aAC5B,IAAU,EAAc,SACxB,IAAQ,EAAc,OACtB,IAAW,EAAc"}
package/dist/ripple.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},t=class extends e{},n=class extends e{},r=class extends e{},i=Symbol(`ripple.reactive`),a=Symbol(`ripple.signal`),o=Symbol(`ripple.computed`),s=100,c=Symbol(`ripple.unset`),l=class{[i]=!0;dependents=new Set;name;runtime;constructor(e,t){this.runtime=e,this.name=t}subscribe(e){this.peek();let t={dependencies:new Set,onDependencyChanged:()=>this.runtime.enqueueListener(e)};return this.dependents.add(t),()=>this.dependents.delete(t)}notify(){for(let e of[...this.dependents])e.onDependencyChanged()}},u=class extends l{[a]=!0;current;equals;constructor(e,t,n){super(e,n?.name),this.current=t,this.equals=n?.equals??Object.is}get value(){return this.runtime.track(this),this.current}set value(e){if(this.equals(this.current,e))return;let t=this.current;this.current=e,this.runtime.emit({kind:`write`,name:this.name,next:e,previous:t}),this.runtime.propagate(()=>this.notify())}peek(){return this.current}},d=class extends l{[o]=!0;dependencies=new Set;computing=!1;disposed=!1;dirty=!0;current=c;derive;equals;constructor(e,t,n){super(e,n?.name),this.derive=t,this.equals=n?.equals??Object.is}get value(){return this.refresh(),this.runtime.track(this),this.current}peek(){return this.refresh(),this.current}onDependencyChanged(){this.disposed||(this.dirty||=!0,this.dependents.size>0&&this.refresh()&&this.notify())}dispose(){this.disposed||(this.disposed=!0,this.runtime.clearDependencies(this),this.dependents.clear())}refresh(){if(!this.dirty||this.disposed)return!1;if(this.computing)throw new t(`computed cycle detected${this.name===void 0?``:` "${this.name}"`}`);this.computing=!0,this.runtime.emit({kind:`compute`,name:this.name});try{let e=this.runtime.collect(this,this.derive),t=this.current===c||!this.equals(this.current,e);return this.current=e,this.dirty=!1,t}finally{this.computing=!1}}},f=class{disposalController=new AbortController;owned=new Set;name;isDisposed=!1;runtime;constructor(e,t){this.runtime=e,this.name=t}get disposed(){return this.isDisposed}get disposalSignal(){return this.disposalController.signal}run(e){if(this.isDisposed)throw new n(`Cannot run a disposed scope.`);return this.runtime.withScope(this,e)}dispose(){if(!this.isDisposed){this.isDisposed=!0;for(let e of[...this.owned].reverse())e.dispose();this.owned.clear(),this.disposalController.abort(),this.runtime.emit({kind:`dispose`,name:this.name,node:`scope`})}}[Symbol.dispose](){this.dispose()}},p=class{dependencies=new Set;disposalController=new AbortController;cleanup;isDisposed=!1;owner;scheduled=!1;callback;options;runtime;constructor(e,t,n){this.runtime=e,this.callback=t,this.options=n}get disposed(){return this.isDisposed}get disposalSignal(){return this.disposalController.signal}onDependencyChanged(){if(!this.isDisposed){if(this.options?.scheduler===`microtask`){if(this.scheduled)return;this.scheduled=!0,queueMicrotask(()=>{this.scheduled=!1,this.isDisposed||this.runtime.enqueue(this)});return}this.runtime.enqueue(this)}}run(){if(this.isDisposed)return;this.owner?.dispose(),this.owner=void 0,this.runCleanup(),this.runtime.emit({kind:`effect`,name:this.options?.name});let e=new f(this.runtime);try{let t=this.runtime.withEffectScope(e,()=>this.runtime.collectEffect(this,this.callback));this.owner=e,this.cleanup=typeof t==`function`?t:void 0}catch(t){e.dispose(),this.runtime.report(t,{kind:`effect`,name:this.options?.name})}}dispose(){this.isDisposed||(this.isDisposed=!0,this.owner?.dispose(),this.owner=void 0,this.runtime.clearDependencies(this),this.runCleanup(),this.disposalController.abort(),this.runtime.emit({kind:`dispose`,name:this.options?.name,node:`effect`}))}[Symbol.dispose](){this.dispose()}runCleanup(){let e=this.cleanup;if(this.cleanup=void 0,e!==void 0)try{e()}catch(e){this.runtime.report(e,{kind:`cleanup`,name:this.options?.name})}}},m=class{activeEffectScope;activeObserver;activeScope;flushDepth=0;flushing=!1;pending=new Set;listeners=new Set;rootScope;observer;onError;constructor(e){this.observer=e?.observer,this.onError=e?.onError??(e=>{queueMicrotask(()=>{throw e})}),this.rootScope=new f(this,`runtime`),this.activeScope=this.rootScope}signal=(e,t)=>new u(this,e,t);computed=(e,t)=>{let n=new d(this,e,t);return(this.activeEffectScope??this.activeScope).owned.add(n),n};effect=(e,t)=>{let n=new p(this,e,t);return(this.activeEffectScope??this.activeScope).owned.add(n),n.run(),n};createScope=e=>{let t=new f(this,e);return this.activeScope.owned.add(t),t};batch=e=>this.propagate(e);untrack=e=>this.withObserver(void 0,e);dispose(){this.rootScope.dispose()}track(e){let t=this.activeObserver;t?.collecting!==void 0&&t.collecting.add(e)}clearDependencies(e){for(let t of e.dependencies)t.dependents.delete(e);e.dependencies.clear()}collect(e,t){return this.collectWith(e,t,!1)}collectEffect(e,t){return this.collectWith(e,t,!0)}withEffectScope(e,t){let n=this.activeEffectScope;this.activeEffectScope=e;try{return t()}finally{this.activeEffectScope=n}}withObserver(e,t){let n=this.activeObserver;this.activeObserver=e;try{return t()}finally{this.activeObserver=n}}withScope(e,t){let n=this.activeEffectScope,r=this.activeScope;this.activeEffectScope=void 0,this.activeScope=e;try{return t()}finally{this.activeEffectScope=n,this.activeScope=r}}enqueue(e){this.pending.add(e),this.flushDepth===0&&this.flush()}enqueueListener(e){this.listeners.add(e),this.flushDepth===0&&this.flush()}propagate(e){this.flushDepth++;try{return e()}finally{this.flushDepth--,this.flushDepth===0&&this.flush()}}emit(e){try{this.observer?.(e)}catch(t){this.report(t,{kind:`observer`,name:e.name})}}report(e,t){try{this.onError(e,t)}catch(e){queueMicrotask(()=>{throw e})}}collectWith(e,t,n){let r=this.activeObserver,i=new Set;e.collecting=i,this.activeObserver=e;try{let n=t();return this.commitDependencies(e,i),n}catch(t){throw n&&this.commitDependencies(e,i),t}finally{e.collecting=void 0,this.activeObserver=r}}commitDependencies(e,t){for(let n of e.dependencies)t.has(n)||n.dependents.delete(e);for(let n of t)e.dependencies.has(n)||n.dependents.add(e);e.dependencies.clear();for(let n of t)e.dependencies.add(n)}flush(){if(this.flushing)return;this.flushing=!0;let e=0;try{for(;this.pending.size>0||this.listeners.size>0;){if(++e>s)throw new r(`infinite reactive flush (>${s} iterations)`);let t=[...this.pending],n=[...this.listeners];this.pending.clear(),this.listeners.clear();for(let e of t)e.run();for(let e of n)try{e()}catch(e){this.report(e,{kind:`listener`})}}}finally{this.flushing=!1}}},h=e=>typeof e==`object`&&!!e&&i in e,g=e=>(t,n,r)=>{let i=e.signal({status:`pending`},{name:r?.name}),a=e.signal(0),o=new AbortController,s,c=!1,l=()=>{a.value,s?.abort();let e=i.peek(),r=e.status===`success`?e.value:`previous`in e?e.previous:void 0,o;try{o=t()}catch(e){i.value=r===void 0?{error:e,status:`error`}:{error:e,previous:r,status:`error`};return}let l=new AbortController;s=l,i.value=r===void 0?{status:`pending`}:{previous:r,status:`pending`};let u;try{u=Promise.resolve(n(o,{signal:l.signal}))}catch(e){u=Promise.reject(e)}u.then(e=>{!c&&!l.signal.aborted&&(i.value={status:`success`,value:e})},e=>{!c&&!l.signal.aborted&&(i.value=r===void 0?{error:e,status:`error`}:{error:e,previous:r,status:`error`})})},u=e.effect(()=>(l(),()=>s?.abort()),{name:r?.name});return u.disposalSignal.addEventListener(`abort`,()=>{c=!0,o.abort()},{once:!0}),{get disposalSignal(){return o.signal},dispose:()=>u.dispose(),get disposed(){return c},get name(){return i.name},peek:()=>i.peek(),reload:()=>{c||(a.value=a.peek()+1)},subscribe:e=>i.subscribe(e),[Symbol.dispose](){this.dispose()},get value(){return i.value}}},_=e=>(t,n)=>{let r=e.signal(t,{name:n?.name});return{get name(){return r.name},peek:()=>r.peek(),set:e=>{r.value=e},subscribe:e=>r.subscribe(e),update:e=>{r.value=e(r.peek())},get value(){return r.value}}},v=e=>(t,n,r)=>{let i=typeof t==`function`?t:()=>t.value,a=r?.equals??Object.is,o=!0,s,c=!1,l=e.effect(()=>{let e=i();if(o){o=!1,s=e,r?.immediate&&n(e,void 0),c=r?.once===!0&&r.immediate===!0;return}if(a(s,e))return;let t=s;s=e,n(e,t),r?.once&&l.dispose()},{name:r?.name});return c&&l.dispose(),l},y=e=>{let t=new m(e),n=g(t),r=_(t);return{batch:t.batch,computed:t.computed,createScope:t.createScope,createStore:r,dispose:()=>t.dispose(),effect:t.effect,resource:n,signal:t.signal,untrack:t.untrack,watch:v(t)}},b=y(),x=b.signal,S=b.computed,C=b.effect,w=b.batch,T=b.createScope,E=b.createStore,D=b.resource,O=b.untrack,k=b.watch;exports.RippleComputedCycleError=t,exports.RippleDisposedScopeError=n,exports.RippleError=e,exports.RippleInfiniteLoopError=r,exports.batch=w,exports.computed=S,exports.createRipple=y,exports.createScope=T,exports.createStore=E,exports.effect=C,exports.isReactive=h,exports.resource=D,exports.signal=x,exports.untrack=O,exports.watch=k;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=e=>(t,n,r)=>{let i=e.signal({status:`pending`},{name:r?.name}),a=e.signal(0),o,s=!1,c=()=>{a.value,o?.abort();let e=i.peek(),r=e.status===`success`?e.value:`previous`in e?e.previous:void 0,c;try{c=t()}catch(e){i.value=r===void 0?{error:e,status:`error`}:{error:e,previous:r,status:`error`};return}let l=new AbortController;o=l,i.value=r===void 0?{status:`pending`}:{previous:r,status:`pending`};let u;try{u=Promise.resolve(n(c,{signal:l.signal}))}catch(e){u=Promise.reject(e)}u.then(e=>{!s&&!l.signal.aborted&&(i.value={status:`success`,value:e})},e=>{!s&&!l.signal.aborted&&(i.value=r===void 0?{error:e,status:`error`}:{error:e,previous:r,status:`error`})})},l=e.effect(()=>(c(),()=>o?.abort()),{name:r?.name});return l.disposalSignal.addEventListener(`abort`,()=>{s=!0},{once:!0}),{get disposalSignal(){return l.disposalSignal},dispose:()=>l.dispose(),get disposed(){return s},get name(){return i.name},peek:()=>i.peek(),reload:()=>{s||(a.value=a.peek()+1)},subscribe:e=>i.subscribe(e),[Symbol.dispose](){this.dispose()},get value(){return i.value}}},t=e=>(t,n,r)=>{let i=typeof t==`function`?t:()=>t.value,a=r?.equals??Object.is,o=!0,s,c=!1,l=e.effect(()=>{let e=i();if(o){o=!1,s=e,r?.immediate&&n(e,void 0),c=r?.once===!0&&r.immediate===!0;return}if(a(s,e))return;let t=s;s=e,n(e,t),r?.once&&l.dispose()},{name:r?.name});return c&&l.dispose(),l},n=class e extends Error{constructor(e,t){super(e,t),this.name=new.target.name,Object.setPrototypeOf(this,new.target.prototype)}static is(t){return t instanceof e}},r=class extends n{},i=class extends n{},a=class extends n{},o=class extends n{},s=Symbol(`ripple.reactive`),c=100,l=Symbol(`ripple.unset`),u=class{[s]=!0;dependents=new Set;name;runtime;constructor(e,t){this.runtime=e,this.name=t}subscribe(e){this.runtime.assertActive(),this.peek();let t={dependencies:new Set,onDependencyChanged:()=>this.runtime.enqueueListener(e)};return this.dependents.add(t),()=>this.dependents.delete(t)}notify(){for(let e of[...this.dependents])e.onDependencyChanged()}},d=class extends u{current;equals;constructor(e,t,n){super(e,n?.name),this.current=t,this.equals=n?.equals??Object.is}get value(){return this.runtime.track(this),this.current}set value(e){if(this.runtime.assertActive(),this.equals(this.current,e))return;let t=this.current;this.current=e,this.runtime.emit({kind:`write`,name:this.name,next:e,previous:t}),this.runtime.propagate(()=>this.notify())}peek(){return this.current}update(e){this.value=e(this.current)}},f=class extends u{dependencies=new Set;computing=!1;disposed=!1;dirty=!0;current=l;derive;equals;constructor(e,t,n){super(e,n?.name),this.derive=t,this.equals=n?.equals??Object.is}get value(){return this.refresh(),this.runtime.track(this),this.current}peek(){return this.refresh(),this.current}onDependencyChanged(){this.disposed||(this.dirty||=!0,this.dependents.size>0&&this.refresh()&&this.notify())}dispose(){this.disposed||(this.disposed=!0,this.runtime.clearDependencies(this),this.dependents.clear())}refresh(){if(!this.dirty||this.disposed)return!1;if(this.computing)throw new r(`computed cycle detected${this.name===void 0?``:` "${this.name}"`}`);this.computing=!0,this.runtime.emit({kind:`compute`,name:this.name});try{let e=this.runtime.collect(this,this.derive),t=this.current===l||!this.equals(this.current,e);return this.current=e,this.dirty=!1,t}finally{this.computing=!1}}},p=class{disposalController=new AbortController;owned=new Set;name;isDisposed=!1;runtime;constructor(e,t){this.runtime=e,this.name=t}get disposed(){return this.isDisposed}get disposalSignal(){return this.disposalController.signal}run(e){if(this.isDisposed)throw new a(`Cannot run a disposed scope.`);return this.runtime.withScope(this,e)}dispose(){if(!this.isDisposed){this.isDisposed=!0;for(let e of[...this.owned].reverse())e.dispose();this.owned.clear(),this.disposalController.abort(),this.runtime.emit({kind:`dispose`,name:this.name,node:`scope`})}}[Symbol.dispose](){this.dispose()}},m=class{dependencies=new Set;disposalController=new AbortController;cleanup;isDisposed=!1;owner;scheduled=!1;callback;options;runtime;constructor(e,t,n){this.runtime=e,this.callback=t,this.options=n}get disposed(){return this.isDisposed}get disposalSignal(){return this.disposalController.signal}onDependencyChanged(){if(!this.isDisposed){if(this.options?.scheduler===`microtask`){if(this.scheduled)return;this.scheduled=!0,queueMicrotask(()=>{this.scheduled=!1,this.isDisposed||this.runtime.enqueue(this)});return}this.runtime.enqueue(this)}}run(){if(this.isDisposed)return;this.owner?.dispose(),this.owner=void 0,this.runCleanup(),this.runtime.emit({kind:`effect`,name:this.options?.name});let e=new p(this.runtime);try{let t=this.runtime.withEffectScope(e,()=>this.runtime.collectEffect(this,this.callback));this.owner=e,this.cleanup=typeof t==`function`?t:void 0}catch(t){e.dispose(),this.runtime.report(t,{kind:`effect`,name:this.options?.name})}}dispose(){this.isDisposed||(this.isDisposed=!0,this.owner?.dispose(),this.owner=void 0,this.runtime.clearDependencies(this),this.runCleanup(),this.disposalController.abort(),this.runtime.emit({kind:`dispose`,name:this.options?.name,node:`effect`}))}[Symbol.dispose](){this.dispose()}runCleanup(){let e=this.cleanup;if(this.cleanup=void 0,e!==void 0)try{e()}catch(e){this.runtime.report(e,{kind:`cleanup`,name:this.options?.name})}}},h=class{activeEffectScope;activeObserver;activeScope;isDisposed=!1;flushDepth=0;flushing=!1;pending=new Set;listeners=new Set;rootScope;observer;onError;constructor(e){this.observer=e?.observer,this.onError=e?.onError??(e=>{queueMicrotask(()=>{throw e})}),this.rootScope=new p(this,`runtime`),this.activeScope=this.rootScope}get disposed(){return this.isDisposed}signal=(e,t)=>(this.assertActive(),new d(this,e,t));computed=(e,t)=>{this.assertActive();let n=new f(this,e,t);return(this.activeEffectScope??this.activeScope).owned.add(n),n};effect=(e,t)=>{this.assertActive();let n=new m(this,e,t);return(this.activeEffectScope??this.activeScope).owned.add(n),n.run(),n};createScope=e=>{this.assertActive();let t=new p(this,e);return this.activeScope.owned.add(t),t};batch=e=>(this.assertActive(),this.propagate(e));untrack=e=>(this.assertActive(),this.withObserver(void 0,e));dispose(){this.isDisposed||(this.isDisposed=!0,this.rootScope.dispose())}assertActive(){if(this.isDisposed)throw new i(`Cannot use a disposed Ripple runtime.`)}track(e){let t=this.activeObserver;t?.collecting!==void 0&&t.collecting.add(e)}clearDependencies(e){for(let t of e.dependencies)t.dependents.delete(e);e.dependencies.clear()}collect(e,t){return this.collectWith(e,t,!1)}collectEffect(e,t){return this.collectWith(e,t,!0)}withEffectScope(e,t){let n=this.activeEffectScope;this.activeEffectScope=e;try{return t()}finally{this.activeEffectScope=n}}withObserver(e,t){let n=this.activeObserver;this.activeObserver=e;try{return t()}finally{this.activeObserver=n}}withScope(e,t){let n=this.activeEffectScope,r=this.activeScope;this.activeEffectScope=void 0,this.activeScope=e;try{return t()}finally{this.activeEffectScope=n,this.activeScope=r}}enqueue(e){this.pending.add(e),this.flushDepth===0&&this.flush()}enqueueListener(e){this.listeners.add(e),this.flushDepth===0&&this.flush()}propagate(e){this.flushDepth++;try{return e()}finally{this.flushDepth--,this.flushDepth===0&&this.flush()}}emit(e){try{this.observer?.(e)}catch(t){this.report(t,{kind:`observer`,name:e.name})}}report(e,t){try{this.onError(e,t)}catch(e){queueMicrotask(()=>{throw e})}}collectWith(e,t,n){let r=this.activeObserver,i=new Set;e.collecting=i,this.activeObserver=e;try{let n=t();return this.commitDependencies(e,i),n}catch(t){throw n&&this.commitDependencies(e,i),t}finally{e.collecting=void 0,this.activeObserver=r}}commitDependencies(e,t){for(let n of e.dependencies)t.has(n)||n.dependents.delete(e);for(let n of t)e.dependencies.has(n)||n.dependents.add(e);e.dependencies.clear();for(let n of t)e.dependencies.add(n)}flush(){if(this.flushing)return;this.flushing=!0;let e=0;try{for(;this.pending.size>0||this.listeners.size>0;){if(++e>c)throw new o(`infinite reactive flush (>${c} iterations)`);let t=[...this.pending],n=[...this.listeners];this.pending.clear(),this.listeners.clear();for(let e of t)e.run();for(let e of n)try{e()}catch(e){this.report(e,{kind:`listener`})}}}finally{this.flushing=!1}}},g=e=>typeof e==`object`&&!!e&&s in e,_=n=>{let r=new h(n),i=e(r);return{batch:r.batch,computed:r.computed,createScope:r.createScope,dispose:()=>r.dispose(),get disposed(){return r.disposed},effect:r.effect,resource:i,signal:r.signal,untrack:r.untrack,watch:t(r)}},v=_(),y=v.signal,b=v.computed,x=v.effect,S=v.batch,C=v.createScope,w=v.untrack,T=v.watch,E=v.resource;exports.RippleComputedCycleError=r,exports.RippleDisposedRuntimeError=i,exports.RippleDisposedScopeError=a,exports.RippleError=n,exports.RippleInfiniteLoopError=o,exports.batch=S,exports.computed=b,exports.createRipple=_,exports.createScope=C,exports.effect=x,exports.isReactive=g,exports.resource=E,exports.signal=y,exports.untrack=w,exports.watch=T;
2
2
  //# sourceMappingURL=ripple.cjs.map