├── .gitignore ├── types ├── tsconfig.json ├── tests.ts └── index.d.ts ├── .dependabot └── config.yml ├── .travis.yml ├── lib └── index.js ├── package.json ├── test └── index.js └── README.md /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | dist 3 | node_modules -------------------------------------------------------------------------------- /types/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "lib": ["es6"], 5 | "noEmit": true 6 | }, 7 | "files": [ 8 | "index.d.ts", 9 | "tests.ts" 10 | ] 11 | } 12 | -------------------------------------------------------------------------------- /.dependabot/config.yml: -------------------------------------------------------------------------------- 1 | version: 1 2 | update_configs: 3 | # Keep package.json (& lockfiles) secure and up-to-date, 4 | # batching pull requests daily 5 | - package_manager: "javascript" 6 | directory: "/" 7 | update_schedule: "daily" 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '10' 4 | - '8' 5 | 6 | addons: 7 | apt: 8 | packages: 9 | - xvfb 10 | 11 | install: 12 | - export DISPLAY=':99.0' 13 | - Xvfb :99 -screen 0 1024x768x24 > /dev/null 2>&1 & 14 | - npm install 15 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | const Store = require('electron-store') 3 | 4 | module.exports = ({ electronStore, electronStoreOpts } = {}) => { 5 | const store = electronStore || new Store(electronStoreOpts || {}) 6 | 7 | return { 8 | getItem: (key) => { 9 | return new Promise((resolve) => { 10 | resolve(store.get(key)) 11 | }) 12 | }, 13 | setItem: (key, item) => { 14 | return new Promise((resolve) => { 15 | resolve(store.set(key, item)) 16 | }) 17 | }, 18 | removeItem: (key) => { 19 | return new Promise((resolve) => { 20 | resolve(store.delete(key)) 21 | }) 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /types/tests.ts: -------------------------------------------------------------------------------- 1 | import createElectronStorage = require('..') 2 | import ElectronStore = require('electron-store') 3 | 4 | createElectronStorage({ 5 | electronStore: new ElectronStore() 6 | }) 7 | 8 | createElectronStorage({ 9 | electronStoreOpts: { 10 | defaults: {}, 11 | name: 'myConfiguration', 12 | cwd: 'unicorn' 13 | } 14 | }) 15 | 16 | const storage = createElectronStorage() 17 | storage.getItem('foo') 18 | storage.setItem('foo', 'bar') 19 | storage.removeItem('foo') 20 | 21 | interface SampleStorage { 22 | enabled: boolean 23 | interval: number 24 | } 25 | 26 | const typedStorage = createElectronStorage() 27 | const enabled: Promise = typedStorage.getItem('enabled') 28 | const interval: Promise = typedStorage.getItem('interval') 29 | -------------------------------------------------------------------------------- /types/index.d.ts: -------------------------------------------------------------------------------- 1 | // Type definitions for redux-persist-electron-storage 2.0.0 2 | // Project: https://github.com/psperber/redux-persist-electron-storage 3 | // Definitions by: Bob Matcuk 4 | // TypeScript Version: 2.8 5 | 6 | import ElectronStore = require("electron-store"); 7 | 8 | type GetConstructorArgument = C extends { new(arg: infer A): any } ? A : never; 9 | 10 | interface StorageOptions { 11 | electronStore?: ElectronStore; 12 | electronStoreOpts?: GetConstructorArgument; 13 | } 14 | 15 | interface ElectronStorage { 16 | getItem(key: K): Promise; 17 | getItem(key: string): Promise; 18 | 19 | setItem(key: K, item: T[K]): Promise; 20 | setItem(key: string, item: any): Promise; 21 | 22 | removeItem(key: K): Promise; 23 | removeItem(key: string): Promise; 24 | } 25 | 26 | declare function createElectronStorage(options?: StorageOptions): ElectronStorage; 27 | 28 | export = createElectronStorage; 29 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "redux-persist-electron-storage", 3 | "version": "2.1.0", 4 | "description": "Redux persist adapter for electon-store", 5 | "main": "lib/index.js", 6 | "types": "./types/index.d.ts", 7 | "repository": { 8 | "url": "https://github.com/psperber/redux-persist-electron-storage", 9 | "type": "git" 10 | }, 11 | "author": "Philipp Sperber", 12 | "license": "MIT", 13 | "scripts": { 14 | "test": "electron-mocha", 15 | "lint": "eslint lib test" 16 | }, 17 | "peerDependencies": { 18 | "electron-store": "*" 19 | }, 20 | "devDependencies": { 21 | "@types/electron-store": "^3.2.0", 22 | "chai": "^4.2.0", 23 | "electron": "^9.4.0", 24 | "electron-mocha": "^8.1.2", 25 | "electron-store": "^5.1.0", 26 | "eslint": "^6.7.2", 27 | "eslint-config-standard": "^14.1.0", 28 | "eslint-plugin-import": "^2.19.1", 29 | "eslint-plugin-node": "^11.0.0", 30 | "eslint-plugin-promise": "^4.2.1", 31 | "eslint-plugin-standard": "^4.0.1", 32 | "typescript": "^3.7.3" 33 | }, 34 | "eslintConfig": { 35 | "extends": "standard", 36 | "globals": { 37 | "describe": false, 38 | "it": false 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /test/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const createElectronStorage = require('../lib/index') 4 | const assert = require('chai').assert 5 | 6 | describe('Initialisation', function () { 7 | it('no args', function () { 8 | const storage = createElectronStorage() 9 | assert.isObject(storage, 'created storage is not an object') 10 | }) 11 | 12 | describe('args', function () { 13 | it('encryptionKey', function () { 14 | const storage = createElectronStorage({ 15 | electronStoreOpts: { 16 | encryptionKey: 'a' 17 | } 18 | }) 19 | assert.isObject(storage, 'created storage is not an object') 20 | }) 21 | 22 | it('electronStore', function () { 23 | const ElectronStore = require('electron-store') 24 | const electronStore = new ElectronStore() 25 | const storage = createElectronStorage({ electronStore }) 26 | assert.isObject(storage, 'created storage is not an object') 27 | }) 28 | }) 29 | }) 30 | 31 | describe('Functions', function () { 32 | const storage = createElectronStorage() 33 | 34 | it('setItem', function () { 35 | return storage.setItem('key', 'value') 36 | }) 37 | 38 | it('getItem', function (done) { 39 | storage.getItem('key') 40 | .then(function (value) { 41 | assert.equal(value, 'value') 42 | done() 43 | }) 44 | }) 45 | 46 | it('removeItem', function (done) { 47 | storage.removeItem('key') 48 | .then(storage.getItem('key')) 49 | .then(function (value) { 50 | assert.isUndefined(value) 51 | done() 52 | }) 53 | }) 54 | }) 55 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # redux-persist-electron-storage 2 | 3 | [![npm version](https://img.shields.io/npm/v/redux-persist-electron-storage.svg?style=flat-square)](https://www.npmjs.com/package/redux-persist-electron-storage) 4 | [![npm downloads](https://img.shields.io/npm/dt/redux-persist-electron-storage.svg?style=flat-square)](https://www.npmjs.com/package/redux-persist-electron-storage) 5 | [![Build Status](https://travis-ci.org/psperber/redux-persist-electron-storage.svg?branch=master)](https://travis-ci.org/psperber/redux-persist-electron-storage) 6 | [![Greenkeeper badge](https://badges.greenkeeper.io/psperber/redux-persist-electron-storage.svg)](https://greenkeeper.io/) 7 | 8 | Storage adapter to use [electron-store](https://github.com/sindresorhus/electron-store) with [redux-persist](https://github.com/rt2zz/redux-persist) 9 | 10 | ## Installation 11 | ### npm 12 | ```bash 13 | npm i -S electron-store redux-persist-electron-storage 14 | ``` 15 | ### yarn 16 | ```bash 17 | yarn add electron-store redux-persist-electron-storage 18 | ``` 19 | 20 | ## Usage 21 | 22 | To use redux-persist-electron-storage, configure redux-persist according to [its documentation](https://github.com/rt2zz/redux-persist#redux-persist). 23 | 24 | Modify the classic redux-persist configuration as follows: 25 | 26 | - Do **not** import `redux-persist/lib/storage` anymore, as we use an alternative storage. 27 | - Import `redux-persist-electron-storage`: 28 | 29 | ```js 30 | import createElectronStorage from "redux-persist-electron-storage"; 31 | ``` 32 | 33 | - Modify the options for `persistReducer` in order to use the storage dedicated to Electron: 34 | 35 | ```js 36 | const persistConfig = { 37 | key: 'root', 38 | storage: createElectronStorage() 39 | } 40 | 41 | const persistedReducer = persistReducer(persistConfig, rootReducer) 42 | ``` 43 | 44 | You can either pass an instance of `electron-store` or pass options like below: 45 | 46 | ```js 47 | const electronStore = new ElectronStore() 48 | createElectronStorage({ 49 | electronStore 50 | }) 51 | ``` 52 | 53 | ```js 54 | createElectronStorage({ 55 | electronStoreOpts: { 56 | encryptionKey: 'MY_ENCRYPTION_KEY' 57 | } 58 | }) 59 | ``` 60 | 61 | **Hint**: The passed instance is preferred over passed options 62 | --------------------------------------------------------------------------------