Skip to content
This repository was archived by the owner on Nov 24, 2021. It is now read-only.

Commit 4886896

Browse files
authored
Convert to Typescript (#15)
* WIP: add types * add types * added types in testcases * add more types :) * refactor * add vue types * Some more refactoring * Improve coverage
1 parent 3f1bd51 commit 4886896

23 files changed

+484
-1130
lines changed

.babelrc

-33
This file was deleted.

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
[![license](https://badgen.net/github/license/ankurk91/vue-web-storage)](https://yarnpkg.com/en/package/vue-web-storage)
77
[![tests](https://github.com/ankurk91/vue-web-storage/workflows/tests/badge.svg)](https://github.com/ankurk91/vue-web-storage/actions)
88
[![codecov](https://codecov.io/gh/ankurk91/vue-web-storage/branch/master/graph/badge.svg)](https://codecov.io/gh/ankurk91/vue-web-storage)
9-
![ts](https://badgen.net/badge/ready/TypeScript/blue)
9+
![ts](https://badgen.net/badge/Built%20With/TypeScript/blue)
1010

1111
A minimalistic Vue.js plugin for web storage
1212

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
// suppress all those red colored errors
2-
window.console.error = (e) => {
2+
window.console.error = (e: Error) => {
33
e instanceof Error && console.log(e.message)
44
};

__test__/storage-events.test.js __test__/storage-events.test.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import StorageWithEvents from '../src/storageWithEvents';
22

33
// js-dom does not support `StorageEvent`
4-
const mockStorageEvent = (key) => {
5-
let event = new Event('storage');
4+
const mockStorageEvent = (key: string) => {
5+
let event: any = new Event('storage');
66
event.key = key;
77
window.dispatchEvent(event)
88
};
99

1010
describe('Storage events', () => {
1111

12-
let ls;
12+
let ls: StorageWithEvents;
1313

1414
beforeEach(() => {
1515
ls = new StorageWithEvents(
@@ -74,7 +74,6 @@ describe('Storage events', () => {
7474
mockStorageEvent('app_logged_out');
7575
expect(mockFn).not.toHaveBeenCalled();
7676
expect(mockFn2).not.toHaveBeenCalled();
77-
7877
});
7978

8079
test('clear events for all keys', () => {
@@ -91,7 +90,6 @@ describe('Storage events', () => {
9190
mockStorageEvent('app_logged_in');
9291
expect(mockFn2).not.toHaveBeenCalled();
9392
expect(ls.events.listeners()['app_logged_in']).not.toBeDefined();
94-
9593
});
9694

9795
});
Original file line numberDiff line numberDiff line change
@@ -1,134 +1,141 @@
1-
import Storage from '../src/storage';
1+
import WebStorage from '../src/webStorage';
22

33
describe('Storage class', () => {
44

5-
let ls;
5+
let ws: WebStorage;
66

77
beforeEach(() => {
8-
ls = new Storage(
8+
ws = new WebStorage(
99
'app_',
1010
'local'
1111
);
1212
});
1313

1414
afterEach(() => {
15-
ls.clear(true);
15+
ws.clear(true);
1616
});
1717

1818
test('accepts prefix', () => {
19-
expect(ls.prefix).toEqual('app_');
19+
expect(ws.prefix).toEqual('app_');
2020
});
2121

2222
test('can store strings', () => {
2323
let key = 'name';
2424
let value = 'john';
2525

26-
ls.set(key, value);
27-
expect(ls.get(key)).toBe(value)
26+
ws.set(key, value);
27+
expect(ws.get(key)).toBe(value)
2828
});
2929

3030
test('can store boolean', () => {
3131
let key = 'flag';
3232
let value = true;
3333

34-
ls.set(key, value);
35-
expect(ls.get(key)).toBe(value)
34+
ws.set(key, value);
35+
expect(ws.get(key)).toBe(value)
3636
});
3737

3838
test('can store objects', () => {
3939
let key = 'cat';
4040
let value = {id: 12, name: 'kitten'};
4141

42-
ls.set(key, value);
43-
expect(ls.get(key)).toEqual(value)
42+
ws.set(key, value);
43+
expect(ws.get(key)).toEqual(value)
4444
});
4545

4646

4747
test('can store arrays', () => {
4848
let key = 'ids';
4949
let value = [123, 456, 789];
5050

51-
ls.set(key, value);
52-
expect(ls.get(key)).toEqual(value)
51+
ws.set(key, value);
52+
expect(ws.get(key)).toEqual(value)
5353
});
5454

5555
test('can store array of objects', () => {
5656
let key = 'cats';
5757
let value = [{id: 1, name: 'kitten'}, {id: 2, name: 'mum'}];
5858

59-
ls.set(key, value);
60-
expect(ls.get(key)).toEqual(value)
59+
ws.set(key, value);
60+
expect(ws.get(key)).toEqual(value)
6161
});
6262

6363
test('can store null', () => {
6464
let key = 'nullable';
6565
let value = null;
6666

67-
ls.set(key, value);
68-
expect(ls.get(key)).toBe(value)
67+
ws.set(key, value);
68+
expect(ws.get(key)).toBe(value)
6969
});
7070

7171
test('can store numbers', () => {
7272
let key = 'age';
7373
let value = 26;
7474

75-
ls.set(key, value);
76-
expect(ls.get(key)).toBe(value)
75+
ws.set(key, value);
76+
expect(ws.get(key)).toBe(value)
7777
});
7878

7979
test('can remove stored key', () => {
8080
let key = 'age';
8181
let value = 26;
8282

83-
ls.set(key, value);
84-
ls.remove(key);
85-
expect(ls.get(key)).toBe(null)
83+
ws.set(key, value);
84+
ws.remove(key);
85+
expect(ws.get(key)).toBe(null)
8686
});
8787

8888
test('can empty storage', () => {
89-
ls.set('name', 'jest');
90-
ls.set('age', 26);
91-
ls.clear();
89+
ws.set('name', 'jest');
90+
ws.set('age', 26);
91+
ws.clear();
9292

93-
expect(ls.get('age')).toBe(null);
94-
expect(ls.get('name')).toBe(null);
95-
expect(ls.length()).toEqual(0)
93+
expect(ws.get('age')).toBe(null);
94+
expect(ws.get('name')).toBe(null);
95+
expect(ws.length()).toEqual(0)
9696
});
9797

9898
test('can get stored key names', () => {
99-
ls.set('name', 'jest');
100-
ls.set('age', 26);
99+
ws.set('name', 'jest');
100+
ws.set('age', 26);
101101

102-
expect(ls.keys()).toEqual(['name', 'age'])
102+
expect(ws.keys()).toEqual(['name', 'age'])
103103
});
104104

105105
test('can check if key exits', () => {
106-
ls.set('name', 'jest');
106+
ws.set('name', 'jest');
107107

108-
expect(ls.hasKey('name')).toBe(true);
109-
expect(ls.hasKey('unknown')).toBe(false)
108+
expect(ws.hasKey('name')).toBe(true);
109+
expect(ws.hasKey('unknown')).toBe(false)
110110
});
111111

112112
test('returns stored value when fail to parse', () => {
113113
let value = 'was_stored_by_other_library_without_json_stringify';
114-
window.localStorage.setItem(ls.prefix + 'alien', value);
114+
window.localStorage.setItem(ws.prefix + 'alien', value);
115115
let spy = jest.spyOn(console, 'error');
116116

117-
expect(ls.get('alien')).toEqual(value);
117+
expect(ws.get('alien')).toEqual(value);
118118
expect(spy).toHaveBeenCalled();
119119
spy.mockReset();
120120
});
121121

122122
test('returns default value when key does not exists in storage', () => {
123-
let value = ls.get('keyThatDoesNotExists', 'defaultValue');
123+
let value = ws.get('keyThatDoesNotExists', 'defaultValue');
124124

125125
expect(value).toEqual('defaultValue');
126126
});
127127

128128
test('returns null when key does not exists in storage and default parameter not set', () => {
129-
let value = ls.get('keyThatDoesNotExists');
129+
let value = ws.get('keyThatDoesNotExists');
130130

131131
expect(value).toEqual(null);
132132
});
133133

134+
135+
test('it throw error for unknown driver type', () => {
136+
expect(() => {
137+
// @ts-ignore
138+
new WebStorage('app_', 'alien');
139+
}).toThrowError(/Unknown driver/);
140+
});
134141
});

__test__/vue-storage.test.js __test__/vue-storage.test.ts

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import {Storage, Plugin as VueWebStorage} from '../src/index';
1+
import {WebStorage, Plugin as VueWebStorage} from '../src';
22
// Lets import full build
3+
// @ts-ignore
34
import Vue from 'vue/dist/vue.common';
45

56
Vue.config.productionTip = false;
@@ -23,7 +24,7 @@ describe('Vue Storage plugin', () => {
2324
prefix: 'vue_'
2425
});
2526

26-
expect(localVue.$localStorage).toBeInstanceOf(Storage);
27+
expect(localVue.$localStorage).toBeInstanceOf(WebStorage);
2728
expect(localVue.$localStorage.prefix).toEqual('vue_');
2829
});
2930

@@ -38,8 +39,8 @@ describe('Vue Storage plugin', () => {
3839
expect(localVue.$sessionStorage.prefix).toEqual('app_');
3940

4041
// Both names should be registered
41-
expect(localVue.$localStorage).toBeInstanceOf(Storage);
42-
expect(localVue.$sessionStorage).toBeInstanceOf(Storage);
42+
expect(localVue.$localStorage).toBeInstanceOf(WebStorage);
43+
expect(localVue.$sessionStorage).toBeInstanceOf(WebStorage);
4344
});
4445

4546
});

jest.config.js

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
module.exports = {
2+
collectCoverage: true,
3+
testURL: "http://localhost",
4+
transform: {
5+
'^.+\\.tsx?$': 'ts-jest',
6+
},
7+
testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.tsx?$',
8+
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
9+
}

package.json

+10-28
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,12 @@
22
"name": "vue-web-storage",
33
"version": "4.0.3",
44
"description": "Vue.js plugin for localStorage and sessionStorage",
5-
"main": "dist/vue-web-storage.js",
6-
"browser": "dist/vue-web-storage.min.js",
7-
"typings": "types/main.d.ts",
5+
"main": "dist/index.umd.js",
6+
"module": "dist/esm/index.js",
7+
"typings": "dist/types/index.d.ts",
88
"files": [
99
"src",
10-
"dist",
11-
"types"
10+
"dist"
1211
],
1312
"repository": {
1413
"type": "git",
@@ -29,18 +28,18 @@
2928
"scripts": {
3029
"test": "jest",
3130
"test:watch": "yarn run test --watch --notify",
32-
"build": "cross-env NODE_ENV=production webpack --progress --mode production",
31+
"build:esm": "tsc -m es6 --outDir ./dist/esm",
32+
"build:umd": "cross-env NODE_ENV=production webpack --mode production",
33+
"build": "npm run build:umd && npm run build:esm",
3334
"prepublishOnly": "yarn run test && yarn run build"
3435
},
3536
"devDependencies": {
36-
"@babel/core": "^7.9.6",
37-
"@babel/plugin-transform-object-assign": "^7.8.3",
38-
"@babel/preset-env": "^7.9.6",
39-
"babel-jest": "^26.0.1",
40-
"babel-loader": "^8.1.0",
4137
"clean-webpack-plugin": "^3.0.0",
4238
"cross-env": "^7.0.2",
4339
"jest": "^26.0.1",
40+
"ts-jest": "^26.4.1",
41+
"ts-loader": "^8.0.4",
42+
"typescript": "^4.0.3",
4443
"unminified-webpack-plugin": "^2.0.0",
4544
"vue": "^2.6.11",
4645
"webpack": "^4.43.0",
@@ -49,23 +48,6 @@
4948
"peerDependencies": {
5049
"vue": "^2.0.0"
5150
},
52-
"jest": {
53-
"moduleFileExtensions": [
54-
"js",
55-
"json",
56-
"jsx",
57-
"node",
58-
"vue"
59-
],
60-
"setupFiles": [
61-
"<rootDir>/__test__/setup.js"
62-
],
63-
"transform": {
64-
"^.+\\.js$": "babel-jest"
65-
},
66-
"testURL": "http://localhost",
67-
"collectCoverage": true
68-
},
6951
"engines": {
7052
"node": ">=6.9.0",
7153
"npm": ">=3.10.0"

0 commit comments

Comments
 (0)