{"_id":"@adamringhede/signal","_rev":"3-627f0576a045bb045e45619e59db6aec","name":"@adamringhede/signal","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"@adamringhede/signal","version":"1.0.0","main":"dist/index.js","scripts":{"build":"tsup --dts","test":"vitest run","start":"vitest"},"author":"","license":"ISC","description":"A reactive primitive for updating state in an application.","devDependencies":{"tsup":"^7.1.0","vitest":"^0.34.6"},"tsup":{"entry":["src/index.ts"],"splitting":false,"sourcemap":true,"clean":true},"types":"./dist/index.d.ts","_id":"@adamringhede/signal@1.0.0","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-b00thbbkrZ5Tn1HvWPwpx2+PTNsfiNEEkgXwUCBcF8xatf32nf9OsUOSnvfxfThJU230mMvSnoNMGfoDAHRA+w==","shasum":"3ba0124b4f0fe8cc82bc566d349722c23707276a","tarball":"https://registry.npmjs.org/@adamringhede/signal/-/signal-1.0.0.tgz","fileCount":9,"unpackedSize":16868,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCruXwghF28sV0VUhLgP9qWKoP2X5x7A54jqqE4P8V8ZwIhAO38g1wok0iLIwuijbZECBAs+Na+FsfWe8fKntYREj6R"}]},"_npmUser":{"name":"adamringhede","email":"adamringhede@live.com"},"directories":{},"maintainers":[{"name":"adamringhede","email":"adamringhede@live.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/signal_1.0.0_1697041623969_0.44035402756867126"},"_hasShrinkwrap":false},"1.0.1":{"name":"@adamringhede/signal","version":"1.0.1","main":"dist/index.js","repository":{"type":"git","url":"git+https://github.com/adamringhede/signal.git"},"scripts":{"build":"tsup --dts","test":"vitest run","start":"vitest"},"author":"","license":"ISC","description":"A reactive primitive for updating state in an application.","devDependencies":{"tsup":"^7.1.0","vitest":"^0.34.6"},"tsup":{"entry":["src/index.ts"],"splitting":false,"sourcemap":true,"clean":true},"types":"./dist/index.d.ts","gitHead":"dae97aaeb8cf6287bae53926eab96aa4d58a251b","bugs":{"url":"https://github.com/adamringhede/signal/issues"},"homepage":"https://github.com/adamringhede/signal#readme","_id":"@adamringhede/signal@1.0.1","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-XvGgUP6DuoAI8ccOmQPv8n0p4+E+i/9DdIzMj/B1nGMmIs4DntrOs7hzQoi+yNPzGZjHZx6d+nOlRzeNbHtk5g==","shasum":"d2844a0dc4a49b288cc0f7194de539d867f615e1","tarball":"https://registry.npmjs.org/@adamringhede/signal/-/signal-1.0.1.tgz","fileCount":9,"unpackedSize":19512,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEWzz+9FJtMkxzCInbJke/qzBepRW8nQ6s2WHZooXjnCAiEA5ht489M/NVXxMuSZ4yL9MFp5oq9HOUXTeRUpmnCvvLU="}]},"_npmUser":{"name":"adamringhede","email":"adamringhede@live.com"},"directories":{},"maintainers":[{"name":"adamringhede","email":"adamringhede@live.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/signal_1.0.1_1697044119940_0.4470299285481141"},"_hasShrinkwrap":false},"1.0.2":{"name":"@adamringhede/signal","version":"1.0.2","main":"dist/index.js","repository":{"type":"git","url":"git+https://github.com/adamringhede/signal.git"},"scripts":{"build":"tsup --dts","test":"vitest run","start":"vitest"},"author":"","license":"ISC","description":"A reactive primitive for updating state in an application.","devDependencies":{"tsup":"^7.1.0","vitest":"^0.34.6"},"tsup":{"entry":["src/index.ts"],"splitting":false,"sourcemap":true,"clean":true},"types":"./dist/index.d.ts","gitHead":"ef72816e16267165ecf1f4c28e7fe4e3bba14233","bugs":{"url":"https://github.com/adamringhede/signal/issues"},"homepage":"https://github.com/adamringhede/signal#readme","_id":"@adamringhede/signal@1.0.2","_nodeVersion":"16.15.1","_npmVersion":"8.11.0","dist":{"integrity":"sha512-FFpjbXl9gYsrs1DtwBggknNvZn4WB7LX12ACnTriHxuJh1hYN/7O2mj/t26z2aB91g5D9LPe8WwHtkVhgQCBLQ==","shasum":"1fe68a6e2db97f071e48b53b839c1cb4c00c7861","tarball":"https://registry.npmjs.org/@adamringhede/signal/-/signal-1.0.2.tgz","fileCount":9,"unpackedSize":21928,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIG8ocgNfiL8D/aWgk1PcmxzIHZAFRkeaKrcdM1UQp2cjAiBK+QAzmTUHpJbXqzk9gWdNPdM+OGL7h0/QL9dF+l0+0g=="}]},"_npmUser":{"name":"adamringhede","email":"adamringhede@live.com"},"directories":{},"maintainers":[{"name":"adamringhede","email":"adamringhede@live.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/signal_1.0.2_1697131526841_0.16478561926644408"},"_hasShrinkwrap":false},"1.0.3":{"name":"@adamringhede/signal","version":"1.0.3","main":"dist/index.js","repository":{"type":"git","url":"git+https://github.com/adamringhede/signal.git"},"scripts":{"build":"tsup --dts","test":"vitest run","start":"vitest"},"author":"","license":"ISC","description":"A reactive primitive for updating state in an application.","devDependencies":{"tsup":"^7.1.0","vitest":"^0.34.6"},"tsup":{"entry":["src/index.ts"],"splitting":false,"sourcemap":true,"clean":true},"_id":"@adamringhede/signal@1.0.3","gitHead":"5aaf5fcf1813b763d7354c96de631981bcc209b8","types":"./dist/index.d.ts","bugs":{"url":"https://github.com/adamringhede/signal/issues"},"homepage":"https://github.com/adamringhede/signal#readme","_nodeVersion":"18.18.2","_npmVersion":"9.8.1","dist":{"integrity":"sha512-/DBhDjrzlo89lClehUkgRHPKPlHkoU5/YwJhrPl2ZEr15f9orpiEKgupRN8DQqPShWl6WlRUhwk+/96YWo7nUA==","shasum":"b1887bac353adac92cc6cca5e50c9073bd135618","tarball":"https://registry.npmjs.org/@adamringhede/signal/-/signal-1.0.3.tgz","fileCount":9,"unpackedSize":26779,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDRHfrdQpg1Txqrbq+Xl5kM1BmxCTXXrRFquX12Uz6vBgIhAJf5vqP3ontERk7alpkTAkPNHLLU0mf/nv6U/xkVFlyS"}]},"_npmUser":{"name":"adamringhede","email":"adamringhede@live.com"},"directories":{},"maintainers":[{"name":"adamringhede","email":"adamringhede@live.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/signal_1.0.3_1697390557892_0.8432714786348439"},"_hasShrinkwrap":false}},"time":{"created":"2023-10-11T16:27:03.901Z","1.0.0":"2023-10-11T16:27:04.195Z","modified":"2023-10-15T17:22:38.234Z","1.0.1":"2023-10-11T17:08:40.241Z","1.0.2":"2023-10-12T17:25:27.016Z","1.0.3":"2023-10-15T17:22:38.056Z"},"maintainers":[{"name":"adamringhede","email":"adamringhede@live.com"}],"description":"A reactive primitive for updating state in an application.","license":"ISC","readme":"# Signal\r\n\r\nA reactive primitive for updating state in an application. \r\n\r\nSignals represent state which can be derived using computations. \r\nThese computations will hold on to the last computed value until signals it depend\r\non change value. Signals and the reuslt of computations are functions that can be\r\ncalled to return their current value. \r\n\r\nEffects can be used to subscribe to signals or computations and be triggered \r\nautomatically whenever signals it or any of its upstream computations depend on\r\nchange value. \r\n\r\nThe syntax is inspired by [Angular Signals](https://angular.io/guide/signals).\r\n\r\n## Install\r\n\r\n```\r\nnpm i @adamringhede/signal\r\n```\r\n\r\n## Usage\r\n\r\n### Creating signals\r\nSignals are created using the `signal<T>(value: T)` function. This returns a function. \r\n\r\n### Reading signals\r\nThe value from a signal can be extrated by invoking the signal function. \r\n\r\n```ts\r\nconst amount = signal(5)\r\namount() // 5\r\n```\r\n\r\n### Updating signals\r\nThe signal can \r\n\r\n```ts\r\nconst amount = signal(5)\r\namount.set(10)\r\namount() // 10\r\n```\r\n\r\nThe signal can also be updated with regards to its current value using the `.update(updateFn: (value) => T)` method.\r\n\r\n```ts\r\nconst amount = signal(5)\r\namount.update(value => value + 1)\r\namount() // 6\r\n```\r\n\r\nIf the signal contains an object that you just want to update, you can use the `.mutate(mutateFn: (value) => void)` method to change the value. Note that this will not trigger effects to be called. \r\n\r\n```ts\r\nconst amount = signal({a: 1})\r\namount.update(value => value.a += 1)\r\namount().a // 2\r\n```\r\n\r\n### Computations\r\nYou can apply computations on one or more signals or even other computations by using the `compute(fn: () => void)` function. The computation will hold on to the most recently computed value.\r\n\r\n### Effects\r\nYou can trigger any kind of side effect whenever any upstream signal changes value. This is illustrated in the code below. \r\n\r\n```ts\r\nconst a = signal(1)\r\nconst b = signal(2)\r\nconst c = computed(() => a() + b())\r\n\r\nlet effectResult: number[] = []\r\nconst e = effect(() => effectResult.push(c()))\r\n\r\nexpect(effectResult).toEqual([3])\r\n\r\na.set(3)\r\nb.set(4)\r\nexpect(effectResult).toEqual([3,5,7])\r\n\r\ne.destroy()\r\n```\r\nRemember to destroy effects when you want it to stop reacting to changes in signals. ","readmeFilename":"README.md","homepage":"https://github.com/adamringhede/signal#readme","repository":{"type":"git","url":"git+https://github.com/adamringhede/signal.git"},"bugs":{"url":"https://github.com/adamringhede/signal/issues"}}