Browse Source

Merge pull request #78 from ryangjchandler/feature/persistence-drivers

feature: persistence drivers
Ryan Chandler 4 năm trước cách đây
mục cha
commit
0c98e07b76

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
dist/spruce.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
dist/spruce.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
dist/spruce.module.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
dist/spruce.module.js.map


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
dist/spruce.umd.js


Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 0 - 0
dist/spruce.umd.js.map


+ 20 - 2
src/index.js

@@ -4,6 +4,8 @@ import { createObservable } from './observable'
 const Spruce = {
     stores: {},
 
+    persistenceDriver: window.localStorage,
+
     persisted: [],
 
     subscribers: [],
@@ -95,13 +97,13 @@ const Spruce = {
     },
 
     retrieveFromLocalStorage(name, methods = {}) {
-        const storage = JSON.parse(window.localStorage.getItem(`__spruce:${name}`))
+        const storage = JSON.parse(this.persistenceDriver.getItem(`__spruce:${name}`))
 
         return storage ? Object.assign(methods, storage) : null
     },
 
     updateLocalStorage(name) {
-        window.localStorage.setItem(`__spruce:${name}`, JSON.stringify(this.store(name)))
+        this.persistenceDriver.setItem(`__spruce:${name}`, JSON.stringify(this.store(name)))
     },
 
     watch(name, callback) {
@@ -134,6 +136,22 @@ const Spruce = {
                     return comparison[part]
                 }, stores)
             })
+    },
+
+    persistUsing(driver) {
+        if (this.persisted.length > 0) {
+            console.warn('[Spruce] You have already initialised a persisted store. Changing the driver may cause issues.')
+        }
+
+        if (typeof driver.getItem !== 'function') {
+            throw new Error('[Spruce] The persistence driver must have a `getItem(key)` method.')
+        }
+
+        if (typeof driver.setItem !== 'function') {
+            throw new Error('[Spruce] The persistence driver must have a `setItem(key, value)` method.')
+        }
+
+        this.persistenceDriver = driver
     }
 }
 

+ 21 - 0
tests/cypress/fixtures/persistence/drivers.html

@@ -0,0 +1,21 @@
+<html>
+    <head>
+        <script src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.x.x/dist/alpine.js" defer></script>
+    </head>
+    <body>
+        <div x-data>
+            <p x-text="$store.persisted.foo"></p>
+            <button @click="$store.persisted.foo = 'car'"></button>
+        </div>
+
+        <script src="/dist/spruce.umd.js"></script>
+
+        <script>
+            Spruce.persistUsing(window.sessionStorage)
+            
+            Spruce.store('persisted', {
+                foo: 'bar'
+            }, true)
+        </script>
+    </body>
+</html>

+ 14 - 1
tests/cypress/integration/persistence.spec.js

@@ -1,4 +1,4 @@
-/* global describe, it, cy */
+/// <reference types="cypress" />
 
 describe('persisted stores', () => {
     it('should not fail when persisted store is initialised', () => {
@@ -20,6 +20,19 @@ describe('persisted stores', () => {
         cy.get('p').should('have.text', 'car')
     })
 
+    it('should persist data between visits using a custom driver', () => {
+        cy.visit('/tests/cypress/fixtures/persistence/check-persisted.html')
+
+        cy.get('p').should('have.text', 'bar')
+
+        cy.get('button').click()
+        cy.get('p').should('have.text', 'car')
+
+        cy.reload()
+
+        cy.get('p').should('have.text', 'car')
+    })
+
     it('should be able to call store methods when persisted', () => {
         cy.visit('/tests/cypress/fixtures/persistence/store-methods.html')
 

+ 1 - 1
tests/cypress/integration/watchers.spec.js

@@ -1,4 +1,4 @@
-/* global describe, it, cy */
+/// <reference types="cypress" />
 
 describe('watchers', () => {
     it('can watch for changes on a store', () => {

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác