{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":121422793,"defaultBranch":"master","name":"store","ownerLogin":"ngxs","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2018-02-13T18:55:44.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/37132593?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1726841917.0","currentOid":""},"activityList":{"items":[{"before":"8a7cca6e7a7d1df5378dab888f9bfe89e39b5549","after":"927ea8c76a4d0b10d9993897ed65cf40de200800","ref":"refs/heads/perf/states-map","pushedAt":"2024-09-21T21:59:55.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"arturovt","name":"Artur","path":"/arturovt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7337691?s=80&v=4"},"commit":{"message":"perf(store): avoid going over states list every time action is dispatched\n\nIn this commit, I'm working on optimizing how we handle action dispatches by avoiding\nrepeated traversal of the `states` list. Instead, we prepare a map each time a new state\nis added, allowing us to perform O(1) lookups by action type in the future. This approach\nreduces complexity and improves performance.\n\nI've tested it with benchmark.js, and here are the results:\n\n```\nclass Increment {\n static readonly type = 'Increment';\n}\n\nconst states = Array.from({ length: 50 }).map((_, index) => {\n @State({\n name: `counter_${index + 1}`,\n defaults: 0,\n })\n @Injectable()\n class CounterState {\n @Action(Increment)\n increment(ctx: StateContext) {\n ctx.setState((counter) => counter + 1);\n }\n }\n\n return CounterState;\n});\n\nstore.dispatch() before changes x 3,435 ops/sec ±0.45% (65 runs sampled)\nstore.dispatch() after changes x 3,942 ops/sec ±1.21% (25 runs sampled)\n```","shortMessageHtmlLink":"perf(store): avoid going over states list every time action is dispat…"}},{"before":"8dbba4098f9fe7d2302f6dc232f4d70b2d668fe4","after":"f805b295a822d504b1cf4d7975474e8eda3d28c9","ref":"refs/heads/renovate/all","pushedAt":"2024-09-21T10:08:09.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}},{"before":"c7a938c3d15b0caaa1b11f2858ee15c788db13b3","after":"8dbba4098f9fe7d2302f6dc232f4d70b2d668fe4","ref":"refs/heads/renovate/all","pushedAt":"2024-09-21T06:05:03.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}},{"before":"f95439836fae3a86d77498473350f17d2f5ee451","after":"c7a938c3d15b0caaa1b11f2858ee15c788db13b3","ref":"refs/heads/renovate/all","pushedAt":"2024-09-20T14:19:04.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}},{"before":"646c244607996814668ee7e8e4e8f5f9095ac5a8","after":"ae1eab0a7d6197efa19165a8643dcba514022a1b","ref":"refs/heads/renovate/typescript-5.x","pushedAt":"2024-09-20T14:18:46.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update dependency typescript to v5.6.2","shortMessageHtmlLink":"chore(deps): update dependency typescript to v5.6.2"}},{"before":null,"after":"2f577d64fc6bc6a5856fe9dc9d91423c5a4ce192","ref":"refs/heads/renovate/npm-express-vulnerability","pushedAt":"2024-09-20T14:18:37.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update dependency express to v4.20.0 [security]","shortMessageHtmlLink":"chore(deps): update dependency express to v4.20.0 [security]"}},{"before":"c0e25d3a321f255f5add0d753c843c0863c1e3fd","after":null,"ref":"refs/heads/fp/tutorial-kit","pushedAt":"2024-09-20T11:42:35.000Z","pushType":"branch_deletion","commitsCount":0,"pusher":{"login":"markwhitfeld","name":"Mark Whitfeld","path":"/markwhitfeld","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1948265?s=80&v=4"}},{"before":"bd43d3316c20a7ccde6fa409a7467a5d5ceb3587","after":"76347efb2c9a2238d4b6272f58110b13fb8346aa","ref":"refs/heads/master","pushedAt":"2024-09-20T11:42:34.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"markwhitfeld","name":"Mark Whitfeld","path":"/markwhitfeld","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1948265?s=80&v=4"},"commit":{"message":"docs(tutorial): create todo app tutorial based on tutorial kit (#2213)\n\n* docs(tutorial): create todo app tutorial based on tutorial kit\r\n\r\n* chore: action to install tutorial deps\r\n\r\n* chore: codeclimate and eslintignore settings\r\n\r\n---------\r\n\r\nCo-authored-by: Mark Whitfeld ","shortMessageHtmlLink":"docs(tutorial): create todo app tutorial based on tutorial kit (#2213)"}},{"before":"f8535cbb00b6524208100c260409bc027ff92e03","after":"c0e25d3a321f255f5add0d753c843c0863c1e3fd","ref":"refs/heads/fp/tutorial-kit","pushedAt":"2024-09-20T11:36:42.000Z","pushType":"push","commitsCount":2,"pusher":{"login":"markwhitfeld","name":"Mark Whitfeld","path":"/markwhitfeld","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1948265?s=80&v=4"},"commit":{"message":"Merge branch 'master' into fp/tutorial-kit","shortMessageHtmlLink":"Merge branch 'master' into fp/tutorial-kit"}},{"before":"7da34c09f7745fae1d2f0594bd75136ab598af3f","after":"f95439836fae3a86d77498473350f17d2f5ee451","ref":"refs/heads/renovate/all","pushedAt":"2024-09-20T11:04:53.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}},{"before":"436ddc81fc2394745c1867c46ac7ad740437e479","after":"7da34c09f7745fae1d2f0594bd75136ab598af3f","ref":"refs/heads/renovate/all","pushedAt":"2024-09-19T08:25:59.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}},{"before":"99a231dd011a4e130694de52245af306fc37bab6","after":"436ddc81fc2394745c1867c46ac7ad740437e479","ref":"refs/heads/renovate/all","pushedAt":"2024-09-19T01:59:21.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}},{"before":"c262fe1239868978929221f78573aecd3234ff6d","after":"99a231dd011a4e130694de52245af306fc37bab6","ref":"refs/heads/renovate/all","pushedAt":"2024-09-18T15:57:06.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}},{"before":"48afa410b1a7ce8a08d1ee82213619f5065b3e2c","after":"8a7cca6e7a7d1df5378dab888f9bfe89e39b5549","ref":"refs/heads/perf/states-map","pushedAt":"2024-09-17T11:12:43.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"arturovt","name":"Artur","path":"/arturovt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7337691?s=80&v=4"},"commit":{"message":"perf(store): avoid going over states list every time action is dispatched\n\nIn this commit, I'm working on optimizing how we handle action dispatches by avoiding\nrepeated traversal of the `states` list. Instead, we prepare a map each time a new state\nis added, allowing us to perform O(1) lookups by action type in the future. This approach\nreduces complexity and improves performance.\n\nI've tested it with benchmark.js, and here are the results:\n\n```\nclass Increment {\n static readonly type = 'Increment';\n}\n\nconst states = Array.from({ length: 50 }).map((_, index) => {\n @State({\n name: `counter_${index + 1}`,\n defaults: 0,\n })\n @Injectable()\n class CounterState {\n @Action(Increment)\n increment(ctx: StateContext) {\n ctx.setState((counter) => counter + 1);\n }\n }\n\n return CounterState;\n});\n\nstore.dispatch() before changes x 3,435 ops/sec ±0.45% (65 runs sampled)\nstore.dispatch() after changes x 3,942 ops/sec ±1.21% (25 runs sampled)\n```","shortMessageHtmlLink":"perf(store): avoid going over states list every time action is dispat…"}},{"before":"dc59934150740539ef1a65f4b5b8b3099a2466c1","after":"48afa410b1a7ce8a08d1ee82213619f5065b3e2c","ref":"refs/heads/perf/states-map","pushedAt":"2024-09-17T08:48:41.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"arturovt","name":"Artur","path":"/arturovt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7337691?s=80&v=4"},"commit":{"message":"perf(store): avoid going over states list every time action is dispatched\n\nIn this commit, I'm working on optimizing how we handle action dispatches by avoiding\nrepeated traversal of the `states` list. Instead, we prepare a map each time a new state\nis added, allowing us to perform O(1) lookups by action type in the future. This approach\nreduces complexity and improves performance.","shortMessageHtmlLink":"perf(store): avoid going over states list every time action is dispat…"}},{"before":"6c5f804e26bbb595a5fe686fcd1a78769ca0eef6","after":"dc59934150740539ef1a65f4b5b8b3099a2466c1","ref":"refs/heads/perf/states-map","pushedAt":"2024-09-17T08:32:12.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"arturovt","name":"Artur","path":"/arturovt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7337691?s=80&v=4"},"commit":{"message":"perf(store): avoid going over states list every time action is dispatched\n\nIn this commit, I'm working on optimizing how we handle action dispatches by avoiding\nrepeated traversal of the `states` list. Instead, we prepare a map each time a new state\nis added, allowing us to perform O(1) lookups by action type in the future. This approach\nreduces complexity and improves performance.","shortMessageHtmlLink":"perf(store): avoid going over states list every time action is dispat…"}},{"before":null,"after":"6c5f804e26bbb595a5fe686fcd1a78769ca0eef6","ref":"refs/heads/perf/states-map","pushedAt":"2024-09-17T08:31:25.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"arturovt","name":"Artur","path":"/arturovt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7337691?s=80&v=4"},"commit":{"message":"perf(store): avoid going over states list every time action is dispatched\n\nIn this commit, I'm working on optimizing how we handle action dispatches by avoiding\nrepeated traversal of the `states` list. Instead, we prepare a map each time a new state\nis added, allowing us to perform O(1) lookups by action type in the future. This approach\nreduces complexity and improves performance.","shortMessageHtmlLink":"perf(store): avoid going over states list every time action is dispat…"}},{"before":"7c795b8529f736b8ec0cf4850a18d9959918c354","after":"412f160c438bec040051ea8043a226d53f8eb7a0","ref":"refs/heads/feat/state-as-extends","pushedAt":"2024-09-14T06:13:11.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"arturovt","name":"Artur","path":"/arturovt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7337691?s=80&v=4"},"commit":{"message":"feat(store): allow extending `State({...})` instead of decorating","shortMessageHtmlLink":"feat(store): allow extending State({...}) instead of decorating"}},{"before":"fae1b4ea1869e5b4c6ef49a033928248f35bfb45","after":"7c795b8529f736b8ec0cf4850a18d9959918c354","ref":"refs/heads/feat/state-as-extends","pushedAt":"2024-09-14T06:13:01.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"arturovt","name":"Artur","path":"/arturovt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7337691?s=80&v=4"},"commit":{"message":"feat(store): allow extending `State({...})` instead of decorating","shortMessageHtmlLink":"feat(store): allow extending State({...}) instead of decorating"}},{"before":"2ca67e3eb7b2007577ed5e8e3aa94e1d32360e76","after":"fae1b4ea1869e5b4c6ef49a033928248f35bfb45","ref":"refs/heads/feat/state-as-extends","pushedAt":"2024-09-14T06:12:18.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"arturovt","name":"Artur","path":"/arturovt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7337691?s=80&v=4"},"commit":{"message":"feat(store): allow extending `State({...})` instead of decorating","shortMessageHtmlLink":"feat(store): allow extending State({...}) instead of decorating"}},{"before":null,"after":"2ca67e3eb7b2007577ed5e8e3aa94e1d32360e76","ref":"refs/heads/feat/state-as-extends","pushedAt":"2024-09-13T14:30:00.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"arturovt","name":"Artur","path":"/arturovt","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/7337691?s=80&v=4"},"commit":{"message":"feat(store): allow extending `State({...})` instead of decorating","shortMessageHtmlLink":"feat(store): allow extending State({...}) instead of decorating"}},{"before":"958023c4ff18dc6098b92a472a7e3ca901365496","after":"c262fe1239868978929221f78573aecd3234ff6d","ref":"refs/heads/renovate/all","pushedAt":"2024-09-13T00:49:09.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}},{"before":"b052ecf9514fbde4f664ed1676c6dc2e03cf4ce1","after":"958023c4ff18dc6098b92a472a7e3ca901365496","ref":"refs/heads/renovate/all","pushedAt":"2024-09-12T17:40:36.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}},{"before":"c4c1bcd6c6104c956bded6ce3620725f5d1e3158","after":"b052ecf9514fbde4f664ed1676c6dc2e03cf4ce1","ref":"refs/heads/renovate/all","pushedAt":"2024-09-12T14:38:53.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}},{"before":"662f549beb774570d8fb80c331cae8f097a7492c","after":"c4c1bcd6c6104c956bded6ce3620725f5d1e3158","ref":"refs/heads/renovate/all","pushedAt":"2024-09-12T10:16:45.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}},{"before":"1bacb58b5702d42034f7d0f463e9ce56aca7d342","after":"662f549beb774570d8fb80c331cae8f097a7492c","ref":"refs/heads/renovate/all","pushedAt":"2024-09-12T00:58:28.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}},{"before":"be311c97e301da20e4090daff8019a50a70967d2","after":"1bacb58b5702d42034f7d0f463e9ce56aca7d342","ref":"refs/heads/renovate/all","pushedAt":"2024-09-11T21:36:29.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}},{"before":"afa43c5685235d5d7f1b219cee267846cee28915","after":"be311c97e301da20e4090daff8019a50a70967d2","ref":"refs/heads/renovate/all","pushedAt":"2024-09-11T16:06:25.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}},{"before":"af4ba52213f1986eede46897ce9602a36cfd4b47","after":"afa43c5685235d5d7f1b219cee267846cee28915","ref":"refs/heads/renovate/all","pushedAt":"2024-09-10T16:50:02.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}},{"before":"449ecf1dae3b57789061ee2223a29ea67b631e5b","after":"af4ba52213f1986eede46897ce9602a36cfd4b47","ref":"refs/heads/renovate/all","pushedAt":"2024-09-10T14:20:22.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"renovate[bot]","name":null,"path":"/apps/renovate","primaryAvatarUrl":"https://avatars.githubusercontent.com/in/2740?s=80&v=4"},"commit":{"message":"chore(deps): update all dependencies","shortMessageHtmlLink":"chore(deps): update all dependencies"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOS0yMVQyMTo1OTo1NS4wMDAwMDBazwAAAAS85f-e","startCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOS0yMVQyMTo1OTo1NS4wMDAwMDBazwAAAAS85f-e","endCursor":"Y3Vyc29yOnYyOpK7MjAyNC0wOS0xMFQxNDoyMDoyMi4wMDAwMDBazwAAAASyJ_xk"}},"title":"Activity · ngxs/store"}