Sfoglia il codice sorgente

feature(Spruce.reset())

Ryan Chandler 5 anni fa
parent
commit
7c677df4dd

File diff suppressed because it is too large
+ 0 - 0
dist/spruce.js


File diff suppressed because it is too large
+ 0 - 0
dist/spruce.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/spruce.module.js


File diff suppressed because it is too large
+ 0 - 0
dist/spruce.module.js.map


File diff suppressed because it is too large
+ 0 - 0
dist/spruce.umd.js


File diff suppressed because it is too large
+ 0 - 0
dist/spruce.umd.js.map


+ 8 - 2
src/index.js

@@ -27,7 +27,7 @@ const Spruce = {
             set: (target, key, value, oldValue) => {
                 this.events.runWatchers(this.stores, target, key, oldValue)
 
-                this.updateSubscribers(key, value)
+                this.updateSubscribers()
             }
         })
 
@@ -50,13 +50,19 @@ const Spruce = {
         return this.stores[name]
     },
 
+    reset: function (name, state) {
+        this.stores[name] = state
+
+        this.updateSubscribers()
+    },
+
     subscribe(el) {
         this.subscribers.push(el)
 
         return this.stores
     },
 
-    updateSubscribers(key, value) {
+    updateSubscribers() {
         this.subscribers.forEach(el => {
             if (el.__x !== undefined) {
                 el.__x.updateElements(el)

+ 58 - 0
tests/reset.spec.js

@@ -0,0 +1,58 @@
+import Spruce from '../dist/spruce'
+import Alpine from 'alpinejs'
+import { waitFor } from '@testing-library/dom'
+
+beforeEach(() => {
+    Spruce.stores = {}
+})
+
+beforeAll(() => {
+    window.Spruce = Spruce
+})
+
+test('.reset() > will overwrite existing properties', () => {
+    Spruce.store('example', {
+        foo: 'bar'
+    })
+
+    expect(Spruce.stores.example.foo).toEqual('bar')
+
+    Spruce.reset('example', {
+        foo: 'bob'
+    })
+
+    expect(Spruce.stores.example.foo).toEqual('bob')
+})
+
+test('.reset() > will make nested objects reactive', async () => {
+    document.body.innerHTML = `
+        <div x-data x-subscribe>
+            <span x-text="$store.example.foo.bob"></span>
+        </div>
+    `
+    
+    Spruce.store('example', {
+        foo: {
+            bob: 'bar'
+        }
+    })
+
+    expect(Spruce.stores.example.foo.bob).toEqual('bar')
+
+    await Spruce.start()
+
+    Alpine.start()
+
+    expect(document.querySelector('span').innerText).toEqual('bar')
+
+    Spruce.reset('example', {
+        foo: {
+            bob: 'car'
+        }
+    })
+
+    await waitFor(() => {
+        expect(Spruce.stores.example.foo.bob).toEqual('car')
+        expect(document.querySelector('span').innerText).toEqual('car')
+    })
+})

Some files were not shown because too many files changed in this diff