Git Product home page Git Product logo

svelte-syncable's Introduction

Svelte Store Storage plugin Build Status

Install

npm i -D svelte-syncable

or

yarn add -D svelte-syncable

How to use

Setting a prefix is optional, the default one is svelteStore

Create your syncable store value

// store.js
import { syncable, setPrefix } from 'svelte-syncable';

// All the syncable value will be stored as "foorbar-{name}"
setPrefix('foobar');

export const answer = syncable('answer', 42);
export const todos = syncable('todos', [
    { id: 1, text: 'Find the answer of life', done: false }
]);

Use your store value as every other svelte store observables

// Component.svelte
<script>
    import { answer, todos } from './store.js';
</script>

<ul>
    {#each $todos as todo, todo.id}
        <li>{todo.text}</li>
    {/each}
</ul>

The count is {$answer}

API

setPrefix(prefix: string): void

Set the localStorage prefix to {name} The function has to be called on the top of your store.js file.

syncable(name: string, value: any, hydrate: boolean = true): SvelteObservable

Create a svelte observable store value and synchronize it with the localStorage. The value will by hydrated from the localStorage by default, set hydrate to false to avoid this behavior. The hydrate parameter is optional and set to true by default.

import { syncable } from 'svelte-syncable';
import { writable } from 'svelte/store';

export const count = syncable('count', 0, false);

svelte-syncable's People

Contributors

chainlist avatar dependabot[bot] avatar paulmaly avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

svelte-syncable's Issues

The npm version seems to be outdated

Hi, so it seems that the npm version of the package is outdated (8 months ago vs 4 months ago) and without 0b7d527 sapper will not work cause SSR

Can the update be released on npm?

sapper compitable

please add

let storage;

if(process.browser){
storage = localStorage;
}

after working in sapper

Zero does not get synced

When I define
export const count = syncable('count', 2, false);
an then change the store to 0 I do get 2 back, when I read the store again. Maybe all localstores should be strings? How to deal with that.

Handle Safari SecurityError accessing localStorage

Hi! ๐Ÿ‘‹

Firstly, thanks for your work on this project! ๐Ÿ™‚

Today I used patch-package to patch [email protected] for the project I'm working on.

Safari throws an exception, and I've squashed it to at least this behavior โ€” returning a regular writable might be preferable, but this seemed like a good start.

Here is the diff that solved my problem:

diff --git a/node_modules/svelte-syncable/index.js b/node_modules/svelte-syncable/index.js
index 0b73f0d..df52347 100644
--- a/node_modules/svelte-syncable/index.js
+++ b/node_modules/svelte-syncable/index.js
@@ -3,17 +3,24 @@ import { writable } from 'svelte/store';
 let prefix = 'svelteStore';
 
 const get = (key) => {
-  if (typeof window === undefined || !localStorage) return undefined;
-  const value = localStorage.getItem(key);
-  return value === undefined
-    ? ""
-    : JSON.parse(value);
+  try {
+    if (typeof window === undefined || !localStorage) return undefined;
+    const value = localStorage.getItem(key);
+    return value === undefined ? "" : JSON.parse(value);
+  } catch (e) {
+    if (e.name == 'SecurityError') return undefined;
+    throw e;
+  }
 };
 
 const set = (key, value) => {
-  if (typeof window === undefined || !localStorage) return;
+  try {
+    if (typeof window === undefined || !localStorage) return;
 
-  localStorage.setItem(key, JSON.stringify(value));
+    localStorage.setItem(key, JSON.stringify(value));
+  } catch (e) {
+    if (e.name != 'SecurityError') throw e;
+  }
 };
 
 const syncValue = (key, observable) => {
@@ -38,3 +45,4 @@ export const syncable = (name, value, hydrate = true) => {
 
   return syncValue(key, writable(lastValue));
 };
+

This issue body was partially generated by patch-package.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.