Skip to content

Commit 248ec89

Browse files
JesseRWeigelKrzysztof Borowy
authored andcommitted
[v2] Web Storage (#216)
Web storage supporting both localStorage and sessionStorage
1 parent 25dd568 commit 248ec89

File tree

15 files changed

+357
-49
lines changed

15 files changed

+357
-49
lines changed

base.tsconfig.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"compilerOptions": {
3+
"target": "ES2017",
4+
"module": "commonjs",
5+
"lib": ["es2017"],
6+
"noEmit": true,
7+
"strict": true,
8+
"noUnusedLocals": true,
9+
"noUnusedParameters": true,
10+
"noImplicitReturns": true,
11+
"noFallthroughCasesInSwitch": true,
12+
"moduleResolution": "node",
13+
"esModuleInterop": true
14+
}
15+
}

jest.config.js

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
const commonSettings = {
2-
globals: {
3-
__DEV__: true,
4-
},
5-
};
1+
function createPackageConfig(packageName) {
2+
return {
3+
transform: {
4+
'^.+\\.tsx?$': 'ts-jest',
5+
},
6+
globals: {
7+
__DEV__: true,
8+
'ts-jest': {
9+
tsConfig: `<rootDir>/packages/${packageName}/tsconfig.json`,
10+
},
11+
},
12+
displayName: packageName,
13+
roots: [`<rootDir>/packages/${packageName}`],
14+
testMatch: [`<rootDir>/packages/${packageName}/__tests__/*{.,-}test.ts`],
15+
};
16+
}
617

718
module.exports = {
8-
projects: [
9-
{
10-
...commonSettings,
11-
displayName: 'core',
12-
roots: ['<rootDir>/packages/core'],
13-
testMatch: ['<rootDir>/packages/core/__tests__/*{.,-}test.ts'],
14-
},
15-
],
19+
projects: [createPackageConfig('core'), createPackageConfig('storage-web')],
1620
};

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"clean": "lerna run clean",
2525
"test": "yarn test:lint && yarn test:unit && yarn test:types",
2626
"test:lint": "eslint packages/**/src/*.ts",
27-
"test:types": "tsc --noEmit --declaration false -emitDeclarationOnly false",
27+
"test:types": "lerna run test:types",
2828
"test:unit": "jest"
2929
},
3030
"devDependencies": {
@@ -41,6 +41,7 @@
4141
"eslint": "5.16.0",
4242
"jest": "24.8.0",
4343
"lerna": "3.15.0",
44+
"ts-jest": "24.1.0",
4445
"typescript": "3.5.2"
4546
},
4647
"keywords": [

packages/core/package.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@
88
"scripts": {
99
"build": "babel src --root-mode upward --out-dir build/ --extensions .ts --ignore build/**/* --ignore types/* --source-maps inline",
1010
"clean": "rm build -rf",
11-
"start": "yarn build:lib --watch",
12-
"prepublish": "yarn clean && yarn build"
11+
"start": "yarn build --watch",
12+
"prepublish": "yarn clean && yarn build",
13+
"test:types": "tsc",
14+
"test:lint": "eslint ./**/*.ts"
1315
}
1416
}

packages/core/tsconfig.json

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"extends": "../../base.tsconfig",
3+
"include": [
4+
"./src",
5+
"__tests__",
6+
"./types"
7+
],
8+
"exclude": [
9+
"node_modules"
10+
]
11+
}

packages/storage-legacy/package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,12 @@
88
"scripts": {
99
"build": "babel src --root-mode upward --out-dir build/ --extensions .ts --ignore build/**/* --ignore types/**/* --source-maps inline",
1010
"clean": "rm build -rf",
11-
"generate:types": "tsc src/index.ts --noEmit false --lib es2015 --declarationDir types/ -d true -emitDeclarationOnly true",
12-
"prepublish": "yarn clean && yarn build"
11+
"prepublish": "yarn clean && yarn build",
12+
"test:types": "tsc",
13+
"test:lint": "eslint ./**/*.ts"
1314
},
1415
"dependencies": {
15-
"@react-native-community/async-storage": "^2.0"
16+
"@react-native-community/async-storage": "^2.0.0"
1617
},
1718
"peerDependencies": {
1819
"react": "^16.0",
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"extends": "../../base.tsconfig",
3+
"include": [
4+
"./src",
5+
"__tests__",
6+
"./types"
7+
],
8+
"exclude": [
9+
"node_modules"
10+
]
11+
}

packages/storage-web/.npmignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Legacy storage backend
1+
# Web storage backend
22
node_modules
33
yarn.lock
44
# see https://github.com/yarnpkg/yarn/issues/7540
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import WebStorage from '../src';
2+
import 'jest-localstorage-mock';
3+
4+
describe.each([['sessionStorage', false], ['localStorage', true]])(
5+
'WebStorage using %s',
6+
(storageName, storageBool) => {
7+
const webStorage = new WebStorage(storageBool);
8+
const storage: any = storageBool
9+
? window.sessionStorage
10+
: window.localStorage;
11+
12+
beforeEach(() => {
13+
storage.clear();
14+
});
15+
describe(`main API with ${storageName}`, () => {
16+
it(`gets single item from ${storage}`, async () => {
17+
storage.setItem('key1', 'value1');
18+
expect(await webStorage.getSingle('key1')).toBe('value1');
19+
});
20+
21+
it(`saves single item to ${storageName}`, async () => {
22+
await webStorage.setSingle('key1', 'value1');
23+
expect(storage.__STORE__.key1).toBe('value1');
24+
});
25+
26+
it(`gets multiple items from ${storageName}`, async () => {
27+
storage.setItem('key1', 'value1');
28+
storage.setItem('key2', 'value2');
29+
expect(await webStorage.getMany(['key1', 'key2'])).toEqual({
30+
key1: 'value1',
31+
key2: 'value2',
32+
});
33+
});
34+
35+
it(`saves multiple items to ${storageName}`, async () => {
36+
await webStorage.setMany([{key1: 'value1'}, {key2: 'value2'}]);
37+
expect(storage.__STORE__).toEqual({key1: 'value1', key2: 'value2'});
38+
});
39+
40+
it(`removes single item from ${storageName}`, async () => {
41+
storage.setItem('key1', 'value1');
42+
storage.setItem('key2', 'value2');
43+
await webStorage.removeSingle('key1');
44+
expect(storage.__STORE__).toEqual({key2: 'value2'});
45+
});
46+
47+
it(`removes multiple items from ${storageName}`, async () => {
48+
storage.setItem('key1', 'value1');
49+
storage.setItem('key2', 'value2');
50+
storage.setItem('key3', 'value3');
51+
await webStorage.removeMany(['key1', 'key2']);
52+
expect(storage.__STORE__).toEqual({key3: 'value3'});
53+
});
54+
55+
it(`gets keys from ${storageName}`, async () => {
56+
storage.setItem('key1', 'value1');
57+
storage.setItem('key2', 'value2');
58+
expect(await webStorage.getKeys()).toEqual(['key1', 'key2']);
59+
});
60+
61+
it(`removes all keys from ${storageName}`, async () => {
62+
storage.setItem('key1', 'value1');
63+
storage.setItem('key2', 'value2');
64+
await webStorage.dropStorage();
65+
expect(storage.__STORE__).toEqual({});
66+
});
67+
});
68+
},
69+
);

packages/storage-web/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
"scripts": {
99
"build": "babel src --root-mode upward --out-dir build/ --extensions .ts --ignore build/**/* --ignore types/**/* --source-maps inline",
1010
"clean": "rm build -rf",
11-
"generate:types": "tsc src/index.ts --noEmit false --lib es2015 --declarationDir types/ -d true -emitDeclarationOnly true",
12-
"prepublish": "yarn clean && yarn build"
11+
"prepublish": "yarn clean && yarn build",
12+
"test:types": "tsc"
1313
},
1414
"dependencies": {
1515
"@react-native-community/async-storage": "^2.0"
@@ -19,6 +19,7 @@
1919
"react-native": ">=0.58"
2020
},
2121
"devDependencies": {
22+
"jest-localstorage-mock": "^2.4.0",
2223
"react": "^16.0",
2324
"react-native": ">=0.58"
2425
}

0 commit comments

Comments
 (0)