@contentstack/persistence-plugin 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.txt +21 -0
- package/README.md +57 -0
- package/dist/legacy/index.cjs +180 -0
- package/dist/legacy/index.cjs.map +1 -0
- package/dist/legacy/index.d.ts +66 -0
- package/dist/legacy/index.js +176 -0
- package/dist/legacy/index.js.map +1 -0
- package/dist/modern/index.cjs +180 -0
- package/dist/modern/index.cjs.map +1 -0
- package/dist/modern/index.d.cts +66 -0
- package/dist/modern/index.d.ts +66 -0
- package/dist/modern/index.js +176 -0
- package/dist/modern/index.js.map +1 -0
- package/package.json +67 -0
package/LICENSE.txt
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2016-2026 Contentstack
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
[](https://www.contentstack.com/)
|
|
2
|
+
## Contentstack Persistence Plugin Typescript
|
|
3
|
+
|
|
4
|
+
Contentstack is a headless CMS with an API-first approach. It is a CMS that developers can use to build powerful cross-platform applications in their favorite languages. Build your application frontend, and Contentstack will take care of the rest. [Read More](https://www.contentstack.com/).
|
|
5
|
+
|
|
6
|
+
This repository contains the **Persistence Plugin** for the **TypeScript Delivery SDK** of [Contentstack](https://www.contentstack.com/). This plugin enables **caching support** for your Delivery SDK implementation by allowing you to persist API responses locally.
|
|
7
|
+
|
|
8
|
+
### Prerequisite
|
|
9
|
+
|
|
10
|
+
You need Node.js version 4.4.7 or later installed to use the Contentstack Persistence Plugin.
|
|
11
|
+
|
|
12
|
+
### Setup and Installation
|
|
13
|
+
|
|
14
|
+
Install the plugin via npm:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
npm i @contentstack/persistence-plugin
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
To import the plugin in your project, use the following command:
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import * as Persistence from '@contentstack/persistence-plugin'
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
To initialize the SDK, you will need to specify the API Key, Delivery Token, and Environment Name of your stack.
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
import contentstack from '@contentstack/delivery-sdk'
|
|
30
|
+
import * as Persistence from '@contentstack/persistence-plugin'
|
|
31
|
+
|
|
32
|
+
const stack = contentstack.stack({
|
|
33
|
+
apiKey: "apiKey",
|
|
34
|
+
deliveryToken: "deliveryToken",
|
|
35
|
+
environment: "environment"
|
|
36
|
+
cacheOptions: {
|
|
37
|
+
policy: Policy.CACHE_THEN_NETWORK,
|
|
38
|
+
persistence: Persistence.PersistenceStore()
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Helpful Links
|
|
44
|
+
|
|
45
|
+
- [Contentstack Website](https://www.contentstack.com)
|
|
46
|
+
- [Official Documentation](https://contentstack.com/docs)
|
|
47
|
+
- [Content Delivery API Docs](https://contentstack.com/docs/apis/content-delivery-api/)
|
|
48
|
+
|
|
49
|
+
### The MIT License (MIT)
|
|
50
|
+
|
|
51
|
+
Copyright © 2025 [Contentstack](https://www.contentstack.com). All Rights Reserved
|
|
52
|
+
|
|
53
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
54
|
+
|
|
55
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
56
|
+
|
|
57
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const iGlobal = typeof window !== "undefined" ? window : global;
|
|
4
|
+
|
|
5
|
+
const localStorage = {
|
|
6
|
+
name: "localStorage",
|
|
7
|
+
clear: clear$1,
|
|
8
|
+
each: each$1,
|
|
9
|
+
getItem: getItem$1,
|
|
10
|
+
removeItem: removeItem$1,
|
|
11
|
+
setItem: setItem$1
|
|
12
|
+
};
|
|
13
|
+
function _localStorage() {
|
|
14
|
+
return iGlobal.localStorage;
|
|
15
|
+
}
|
|
16
|
+
function clear$1() {
|
|
17
|
+
_localStorage().clear();
|
|
18
|
+
}
|
|
19
|
+
function each$1(callback) {
|
|
20
|
+
for (let i = _localStorage().length - 1; i >= 0; i--) {
|
|
21
|
+
const key = _localStorage().key(i);
|
|
22
|
+
if (key && getItem$1(key)) {
|
|
23
|
+
const value = getItem$1(key);
|
|
24
|
+
callback(value, key);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function setItem$1(key, value) {
|
|
29
|
+
if (!key) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
_localStorage().setItem(key, value);
|
|
33
|
+
}
|
|
34
|
+
function getItem$1(key) {
|
|
35
|
+
return _localStorage().getItem(key);
|
|
36
|
+
}
|
|
37
|
+
function removeItem$1(key) {
|
|
38
|
+
_localStorage().removeItem(key);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const memoryStorage = {
|
|
42
|
+
name: "memoryStorage",
|
|
43
|
+
clear,
|
|
44
|
+
each,
|
|
45
|
+
getItem,
|
|
46
|
+
removeItem,
|
|
47
|
+
setItem
|
|
48
|
+
};
|
|
49
|
+
let memory = {};
|
|
50
|
+
function clear() {
|
|
51
|
+
memory = {};
|
|
52
|
+
}
|
|
53
|
+
function each(callback) {
|
|
54
|
+
for (const key in memory) {
|
|
55
|
+
const value = getItem(key);
|
|
56
|
+
callback(value, key);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function setItem(key, value) {
|
|
60
|
+
if (!key) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
memory[key] = value;
|
|
64
|
+
}
|
|
65
|
+
function getItem(key) {
|
|
66
|
+
return memory[key];
|
|
67
|
+
}
|
|
68
|
+
function removeItem(key) {
|
|
69
|
+
delete memory[key];
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const MISSING_CUSTOM_STORAGE = "Missing storage for customStorage. Provide a storage object with get, set, and remove methods and try again.";
|
|
73
|
+
class PersistenceStore {
|
|
74
|
+
constructor(config) {
|
|
75
|
+
this.store = localStorage;
|
|
76
|
+
let defaultConfig = {
|
|
77
|
+
storeType: "localStorage",
|
|
78
|
+
maxAge: 1e3 * 60 * 60 * 24,
|
|
79
|
+
serializer: JSON.stringify,
|
|
80
|
+
deserializer: JSON.parse
|
|
81
|
+
};
|
|
82
|
+
defaultConfig = {
|
|
83
|
+
...defaultConfig,
|
|
84
|
+
...config
|
|
85
|
+
};
|
|
86
|
+
this.setStore(defaultConfig.storeType, defaultConfig.storage);
|
|
87
|
+
this.config = defaultConfig;
|
|
88
|
+
this.name = "";
|
|
89
|
+
}
|
|
90
|
+
setStore(type, store) {
|
|
91
|
+
switch (type) {
|
|
92
|
+
case "localStorage":
|
|
93
|
+
break;
|
|
94
|
+
case "memoryStorage":
|
|
95
|
+
this.store = memoryStorage;
|
|
96
|
+
break;
|
|
97
|
+
case "customStorage":
|
|
98
|
+
if (!store) {
|
|
99
|
+
throw new TypeError(MISSING_CUSTOM_STORAGE);
|
|
100
|
+
} else {
|
|
101
|
+
this.store = store;
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
setItem(key, value, contentTypeUid, maxAge) {
|
|
107
|
+
if (!key) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const generatedKey = this.generateCSKey(key, contentTypeUid);
|
|
111
|
+
if (!value) {
|
|
112
|
+
this.store.removeItem(generatedKey);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const expiry = this.calculateExpiry(maxAge);
|
|
116
|
+
let content = { value, expiry };
|
|
117
|
+
if (this.config.serializer) {
|
|
118
|
+
content = this.config.serializer(content);
|
|
119
|
+
}
|
|
120
|
+
this.store.setItem(generatedKey, content);
|
|
121
|
+
}
|
|
122
|
+
getItem(key, contentTypeUid) {
|
|
123
|
+
const generatedKey = this.generateCSKey(key, contentTypeUid);
|
|
124
|
+
const content = this.store.getItem(generatedKey);
|
|
125
|
+
if (content) {
|
|
126
|
+
if (this.config.deserializer) {
|
|
127
|
+
const item = this.config.deserializer(content);
|
|
128
|
+
if (!this.isExpire(item.expiry)) {
|
|
129
|
+
return item.value;
|
|
130
|
+
} else {
|
|
131
|
+
this.removeItem(key, contentTypeUid);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
removeItem(key, contentTypeUid) {
|
|
137
|
+
const generatedKey = this.generateCSKey(key, contentTypeUid);
|
|
138
|
+
this.store.removeItem(generatedKey);
|
|
139
|
+
}
|
|
140
|
+
clear(contentTypeUid) {
|
|
141
|
+
if (!contentTypeUid) {
|
|
142
|
+
this.store.clear();
|
|
143
|
+
} else {
|
|
144
|
+
this.store.each((_, key) => {
|
|
145
|
+
if (key.match(contentTypeUid)) {
|
|
146
|
+
this.store.removeItem(key);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
generateCSKey(key, contentTypeUid) {
|
|
152
|
+
let keyPrefix = "cs_store_js";
|
|
153
|
+
if (contentTypeUid) {
|
|
154
|
+
keyPrefix = contentTypeUid + "_" + keyPrefix;
|
|
155
|
+
}
|
|
156
|
+
keyPrefix = this.name + "_" + keyPrefix + "_" + key;
|
|
157
|
+
return keyPrefix;
|
|
158
|
+
}
|
|
159
|
+
calculateExpiry(maxAge) {
|
|
160
|
+
const now = /* @__PURE__ */ new Date();
|
|
161
|
+
const nowMSec = now.getTime();
|
|
162
|
+
if (maxAge) {
|
|
163
|
+
return nowMSec + maxAge;
|
|
164
|
+
} else if (this.config.maxAge) {
|
|
165
|
+
return nowMSec + this.config.maxAge;
|
|
166
|
+
}
|
|
167
|
+
return 0;
|
|
168
|
+
}
|
|
169
|
+
isExpire(dateTime) {
|
|
170
|
+
if (dateTime) {
|
|
171
|
+
return dateTime < (/* @__PURE__ */ new Date()).getTime();
|
|
172
|
+
}
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
exports.PersistenceStore = PersistenceStore;
|
|
178
|
+
exports.localStorage = localStorage;
|
|
179
|
+
exports.memoryStorage = memoryStorage;
|
|
180
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/helper/utils.ts","../../src/storages/local-storage.ts","../../src/storages/memory-storage.ts","../../src/persistence-store.ts"],"sourcesContent":["export type Callback = (value: string | null, key: string) => void;\n\nexport const iGlobal = typeof window !== 'undefined' ? window : global;\n","import type { Callback } from '../helper/utils';\nimport { iGlobal } from '../helper/utils';\nimport { Storage } from '../types/storage';\n\nexport const localStorage: Storage = {\n name: 'localStorage',\n clear: clear,\n each: each,\n getItem: getItem,\n removeItem: removeItem,\n setItem: setItem,\n};\n\nfunction _localStorage() {\n return (iGlobal as any).localStorage;\n}\n\nfunction clear() {\n _localStorage().clear();\n}\n\nfunction each(callback: Callback) {\n for (let i = _localStorage().length - 1; i >= 0; i--) {\n const key = _localStorage().key(i);\n if (key && getItem(key)) {\n const value = getItem(key);\n callback(value, key);\n }\n }\n}\n\nfunction setItem(key: string, value: string) {\n if (!key) {\n return;\n }\n _localStorage().setItem(key, value);\n}\n\nfunction getItem(key: string): string | null {\n return _localStorage().getItem(key);\n}\n\nfunction removeItem(key: string) {\n _localStorage().removeItem(key);\n}\n","import type { Callback } from '../helper/utils';\nimport { Storage } from '../types/storage';\n\nexport const memoryStorage: Storage = {\n name: 'memoryStorage',\n clear: clear,\n each: each,\n getItem: getItem,\n removeItem: removeItem,\n setItem: setItem,\n};\n\nlet memory: { [key: string]: string | null } = {};\n\nfunction clear() {\n memory = {};\n}\n\nfunction each(callback: Callback) {\n for (const key in memory) {\n const value = getItem(key);\n callback(value, key);\n }\n}\n\nfunction setItem(key: string, value: string) {\n if (!key) {\n return;\n }\n memory[key] = value;\n}\n\nfunction getItem(key: string): string | null {\n return memory[key];\n}\n\nfunction removeItem(key: string) {\n delete memory[key];\n}\n","import { Store, PersistenceStoreConfig } from './config/persistence-storage-config';\nimport { localStorage } from './storages/local-storage';\nimport { memoryStorage } from './storages/memory-storage';\nimport { Storage } from './types/storage';\nimport { StorageType } from './types/storage-type';\n\nconst MISSING_CUSTOM_STORAGE =\n 'Missing storage for customStorage. Provide a storage object with get, set, and remove methods and try again.';\n\n/**\n * Persistence store for caching data with expiration support\n * Supports localStorage, memoryStorage, and custom storage implementations\n */\nexport class PersistenceStore {\n protected store: Storage = localStorage;\n readonly config: PersistenceStoreConfig;\n protected name: string;\n\n constructor(config?: PersistenceStoreConfig) {\n let defaultConfig: PersistenceStoreConfig = {\n storeType: 'localStorage',\n maxAge: 1000 * 60 * 60 * 24,\n serializer: JSON.stringify,\n deserializer: JSON.parse,\n };\n defaultConfig = {\n ...defaultConfig,\n ...config,\n };\n this.setStore(defaultConfig.storeType, (defaultConfig as unknown as Store).storage);\n this.config = defaultConfig;\n this.name = '';\n }\n\n private setStore(type?: StorageType | 'customStorage', store?: Storage) {\n switch (type) {\n case 'localStorage':\n break;\n case 'memoryStorage':\n this.store = memoryStorage;\n break;\n case 'customStorage':\n if (!store) {\n throw new TypeError(MISSING_CUSTOM_STORAGE);\n } else {\n this.store = store;\n }\n break;\n }\n }\n\n setItem(key: string, value: any, contentTypeUid?: string, maxAge?: number) {\n if (!key) {\n return;\n }\n const generatedKey = this.generateCSKey(key, contentTypeUid);\n\n if (!value) {\n this.store.removeItem(generatedKey);\n return;\n }\n const expiry = this.calculateExpiry(maxAge);\n let content: any = { value, expiry };\n if (this.config.serializer) {\n content = this.config.serializer(content);\n }\n\n this.store.setItem(generatedKey, content);\n }\n\n getItem(key: string, contentTypeUid?: string): any {\n const generatedKey = this.generateCSKey(key, contentTypeUid);\n const content = this.store.getItem(generatedKey);\n\n if (content) {\n if (this.config.deserializer) {\n const item = this.config.deserializer(content);\n if (!this.isExpire(item.expiry)) {\n return item.value;\n } else {\n this.removeItem(key, contentTypeUid);\n }\n }\n }\n }\n\n removeItem(key: string, contentTypeUid?: string) {\n const generatedKey = this.generateCSKey(key, contentTypeUid);\n this.store.removeItem(generatedKey);\n }\n\n clear(contentTypeUid?: string) {\n if (!contentTypeUid) {\n this.store.clear();\n } else {\n this.store.each((_, key) => {\n if (key.match(contentTypeUid)) {\n this.store.removeItem(key);\n }\n });\n }\n }\n\n private generateCSKey(key: string, contentTypeUid?: string): string {\n let keyPrefix = 'cs_store_js';\n if (contentTypeUid) {\n keyPrefix = contentTypeUid + '_' + keyPrefix;\n }\n keyPrefix = this.name + '_' + keyPrefix + '_' + key;\n\n return keyPrefix;\n }\n\n private calculateExpiry(maxAge?: number): number {\n const now = new Date();\n const nowMSec = now.getTime();\n if (maxAge) {\n return nowMSec + maxAge;\n } else if (this.config.maxAge) {\n return nowMSec + this.config.maxAge;\n }\n\n return 0;\n }\n\n private isExpire(dateTime: number): boolean {\n if (dateTime) {\n return dateTime < new Date().getTime();\n }\n\n return true;\n }\n}\n"],"names":["clear","each","getItem","removeItem","setItem"],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
type Callback = (value: string | null, key: string) => void;
|
|
2
|
+
|
|
3
|
+
interface Storage {
|
|
4
|
+
name: string;
|
|
5
|
+
getItem: (key: string) => string | null;
|
|
6
|
+
setItem: (key: string, value: string) => void;
|
|
7
|
+
removeItem: (key: string) => void;
|
|
8
|
+
each: (callback: Callback) => void;
|
|
9
|
+
clear: () => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
type StorageType = 'localStorage' | 'memoryStorage';
|
|
13
|
+
|
|
14
|
+
declare const localStorage: Storage;
|
|
15
|
+
|
|
16
|
+
declare const memoryStorage: Storage;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Configuration type for persistence store
|
|
20
|
+
* Can be either a custom storage with Store interface or standard storage with PersistenceStoreOptions
|
|
21
|
+
*/
|
|
22
|
+
type PersistenceStoreConfig = (Store & PersistenceStoreOptions) | ({
|
|
23
|
+
storeType?: StorageType;
|
|
24
|
+
} & PersistenceStoreOptions);
|
|
25
|
+
/**
|
|
26
|
+
* Interface for custom storage configuration
|
|
27
|
+
*/
|
|
28
|
+
interface Store {
|
|
29
|
+
/** Custom storage implementation */
|
|
30
|
+
storage: Storage;
|
|
31
|
+
/** Storage type identifier */
|
|
32
|
+
storeType: 'customStorage';
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Options for persistence store configuration
|
|
36
|
+
*/
|
|
37
|
+
interface PersistenceStoreOptions {
|
|
38
|
+
/** Maximum age for cached items in milliseconds (default: 24 hours) */
|
|
39
|
+
maxAge?: number;
|
|
40
|
+
/** Serializer function for storing data (default: JSON.stringify) */
|
|
41
|
+
serializer?: (content: any) => string;
|
|
42
|
+
/** Deserializer function for retrieving data (default: JSON.parse) */
|
|
43
|
+
deserializer?: (cacheString: string) => any;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Persistence store for caching data with expiration support
|
|
48
|
+
* Supports localStorage, memoryStorage, and custom storage implementations
|
|
49
|
+
*/
|
|
50
|
+
declare class PersistenceStore {
|
|
51
|
+
protected store: Storage;
|
|
52
|
+
readonly config: PersistenceStoreConfig;
|
|
53
|
+
protected name: string;
|
|
54
|
+
constructor(config?: PersistenceStoreConfig);
|
|
55
|
+
private setStore;
|
|
56
|
+
setItem(key: string, value: any, contentTypeUid?: string, maxAge?: number): void;
|
|
57
|
+
getItem(key: string, contentTypeUid?: string): any;
|
|
58
|
+
removeItem(key: string, contentTypeUid?: string): void;
|
|
59
|
+
clear(contentTypeUid?: string): void;
|
|
60
|
+
private generateCSKey;
|
|
61
|
+
private calculateExpiry;
|
|
62
|
+
private isExpire;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export { PersistenceStore, localStorage, memoryStorage };
|
|
66
|
+
export type { Callback, PersistenceStoreConfig, PersistenceStoreOptions, Storage, StorageType, Store };
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
const iGlobal = typeof window !== "undefined" ? window : global;
|
|
2
|
+
|
|
3
|
+
const localStorage = {
|
|
4
|
+
name: "localStorage",
|
|
5
|
+
clear: clear$1,
|
|
6
|
+
each: each$1,
|
|
7
|
+
getItem: getItem$1,
|
|
8
|
+
removeItem: removeItem$1,
|
|
9
|
+
setItem: setItem$1
|
|
10
|
+
};
|
|
11
|
+
function _localStorage() {
|
|
12
|
+
return iGlobal.localStorage;
|
|
13
|
+
}
|
|
14
|
+
function clear$1() {
|
|
15
|
+
_localStorage().clear();
|
|
16
|
+
}
|
|
17
|
+
function each$1(callback) {
|
|
18
|
+
for (let i = _localStorage().length - 1; i >= 0; i--) {
|
|
19
|
+
const key = _localStorage().key(i);
|
|
20
|
+
if (key && getItem$1(key)) {
|
|
21
|
+
const value = getItem$1(key);
|
|
22
|
+
callback(value, key);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function setItem$1(key, value) {
|
|
27
|
+
if (!key) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
_localStorage().setItem(key, value);
|
|
31
|
+
}
|
|
32
|
+
function getItem$1(key) {
|
|
33
|
+
return _localStorage().getItem(key);
|
|
34
|
+
}
|
|
35
|
+
function removeItem$1(key) {
|
|
36
|
+
_localStorage().removeItem(key);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const memoryStorage = {
|
|
40
|
+
name: "memoryStorage",
|
|
41
|
+
clear,
|
|
42
|
+
each,
|
|
43
|
+
getItem,
|
|
44
|
+
removeItem,
|
|
45
|
+
setItem
|
|
46
|
+
};
|
|
47
|
+
let memory = {};
|
|
48
|
+
function clear() {
|
|
49
|
+
memory = {};
|
|
50
|
+
}
|
|
51
|
+
function each(callback) {
|
|
52
|
+
for (const key in memory) {
|
|
53
|
+
const value = getItem(key);
|
|
54
|
+
callback(value, key);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function setItem(key, value) {
|
|
58
|
+
if (!key) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
memory[key] = value;
|
|
62
|
+
}
|
|
63
|
+
function getItem(key) {
|
|
64
|
+
return memory[key];
|
|
65
|
+
}
|
|
66
|
+
function removeItem(key) {
|
|
67
|
+
delete memory[key];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const MISSING_CUSTOM_STORAGE = "Missing storage for customStorage. Provide a storage object with get, set, and remove methods and try again.";
|
|
71
|
+
class PersistenceStore {
|
|
72
|
+
constructor(config) {
|
|
73
|
+
this.store = localStorage;
|
|
74
|
+
let defaultConfig = {
|
|
75
|
+
storeType: "localStorage",
|
|
76
|
+
maxAge: 1e3 * 60 * 60 * 24,
|
|
77
|
+
serializer: JSON.stringify,
|
|
78
|
+
deserializer: JSON.parse
|
|
79
|
+
};
|
|
80
|
+
defaultConfig = {
|
|
81
|
+
...defaultConfig,
|
|
82
|
+
...config
|
|
83
|
+
};
|
|
84
|
+
this.setStore(defaultConfig.storeType, defaultConfig.storage);
|
|
85
|
+
this.config = defaultConfig;
|
|
86
|
+
this.name = "";
|
|
87
|
+
}
|
|
88
|
+
setStore(type, store) {
|
|
89
|
+
switch (type) {
|
|
90
|
+
case "localStorage":
|
|
91
|
+
break;
|
|
92
|
+
case "memoryStorage":
|
|
93
|
+
this.store = memoryStorage;
|
|
94
|
+
break;
|
|
95
|
+
case "customStorage":
|
|
96
|
+
if (!store) {
|
|
97
|
+
throw new TypeError(MISSING_CUSTOM_STORAGE);
|
|
98
|
+
} else {
|
|
99
|
+
this.store = store;
|
|
100
|
+
}
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
setItem(key, value, contentTypeUid, maxAge) {
|
|
105
|
+
if (!key) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const generatedKey = this.generateCSKey(key, contentTypeUid);
|
|
109
|
+
if (!value) {
|
|
110
|
+
this.store.removeItem(generatedKey);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const expiry = this.calculateExpiry(maxAge);
|
|
114
|
+
let content = { value, expiry };
|
|
115
|
+
if (this.config.serializer) {
|
|
116
|
+
content = this.config.serializer(content);
|
|
117
|
+
}
|
|
118
|
+
this.store.setItem(generatedKey, content);
|
|
119
|
+
}
|
|
120
|
+
getItem(key, contentTypeUid) {
|
|
121
|
+
const generatedKey = this.generateCSKey(key, contentTypeUid);
|
|
122
|
+
const content = this.store.getItem(generatedKey);
|
|
123
|
+
if (content) {
|
|
124
|
+
if (this.config.deserializer) {
|
|
125
|
+
const item = this.config.deserializer(content);
|
|
126
|
+
if (!this.isExpire(item.expiry)) {
|
|
127
|
+
return item.value;
|
|
128
|
+
} else {
|
|
129
|
+
this.removeItem(key, contentTypeUid);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
removeItem(key, contentTypeUid) {
|
|
135
|
+
const generatedKey = this.generateCSKey(key, contentTypeUid);
|
|
136
|
+
this.store.removeItem(generatedKey);
|
|
137
|
+
}
|
|
138
|
+
clear(contentTypeUid) {
|
|
139
|
+
if (!contentTypeUid) {
|
|
140
|
+
this.store.clear();
|
|
141
|
+
} else {
|
|
142
|
+
this.store.each((_, key) => {
|
|
143
|
+
if (key.match(contentTypeUid)) {
|
|
144
|
+
this.store.removeItem(key);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
generateCSKey(key, contentTypeUid) {
|
|
150
|
+
let keyPrefix = "cs_store_js";
|
|
151
|
+
if (contentTypeUid) {
|
|
152
|
+
keyPrefix = contentTypeUid + "_" + keyPrefix;
|
|
153
|
+
}
|
|
154
|
+
keyPrefix = this.name + "_" + keyPrefix + "_" + key;
|
|
155
|
+
return keyPrefix;
|
|
156
|
+
}
|
|
157
|
+
calculateExpiry(maxAge) {
|
|
158
|
+
const now = /* @__PURE__ */ new Date();
|
|
159
|
+
const nowMSec = now.getTime();
|
|
160
|
+
if (maxAge) {
|
|
161
|
+
return nowMSec + maxAge;
|
|
162
|
+
} else if (this.config.maxAge) {
|
|
163
|
+
return nowMSec + this.config.maxAge;
|
|
164
|
+
}
|
|
165
|
+
return 0;
|
|
166
|
+
}
|
|
167
|
+
isExpire(dateTime) {
|
|
168
|
+
if (dateTime) {
|
|
169
|
+
return dateTime < (/* @__PURE__ */ new Date()).getTime();
|
|
170
|
+
}
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export { PersistenceStore, localStorage, memoryStorage };
|
|
176
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/helper/utils.ts","../../src/storages/local-storage.ts","../../src/storages/memory-storage.ts","../../src/persistence-store.ts"],"sourcesContent":["export type Callback = (value: string | null, key: string) => void;\n\nexport const iGlobal = typeof window !== 'undefined' ? window : global;\n","import type { Callback } from '../helper/utils';\nimport { iGlobal } from '../helper/utils';\nimport { Storage } from '../types/storage';\n\nexport const localStorage: Storage = {\n name: 'localStorage',\n clear: clear,\n each: each,\n getItem: getItem,\n removeItem: removeItem,\n setItem: setItem,\n};\n\nfunction _localStorage() {\n return (iGlobal as any).localStorage;\n}\n\nfunction clear() {\n _localStorage().clear();\n}\n\nfunction each(callback: Callback) {\n for (let i = _localStorage().length - 1; i >= 0; i--) {\n const key = _localStorage().key(i);\n if (key && getItem(key)) {\n const value = getItem(key);\n callback(value, key);\n }\n }\n}\n\nfunction setItem(key: string, value: string) {\n if (!key) {\n return;\n }\n _localStorage().setItem(key, value);\n}\n\nfunction getItem(key: string): string | null {\n return _localStorage().getItem(key);\n}\n\nfunction removeItem(key: string) {\n _localStorage().removeItem(key);\n}\n","import type { Callback } from '../helper/utils';\nimport { Storage } from '../types/storage';\n\nexport const memoryStorage: Storage = {\n name: 'memoryStorage',\n clear: clear,\n each: each,\n getItem: getItem,\n removeItem: removeItem,\n setItem: setItem,\n};\n\nlet memory: { [key: string]: string | null } = {};\n\nfunction clear() {\n memory = {};\n}\n\nfunction each(callback: Callback) {\n for (const key in memory) {\n const value = getItem(key);\n callback(value, key);\n }\n}\n\nfunction setItem(key: string, value: string) {\n if (!key) {\n return;\n }\n memory[key] = value;\n}\n\nfunction getItem(key: string): string | null {\n return memory[key];\n}\n\nfunction removeItem(key: string) {\n delete memory[key];\n}\n","import { Store, PersistenceStoreConfig } from './config/persistence-storage-config';\nimport { localStorage } from './storages/local-storage';\nimport { memoryStorage } from './storages/memory-storage';\nimport { Storage } from './types/storage';\nimport { StorageType } from './types/storage-type';\n\nconst MISSING_CUSTOM_STORAGE =\n 'Missing storage for customStorage. Provide a storage object with get, set, and remove methods and try again.';\n\n/**\n * Persistence store for caching data with expiration support\n * Supports localStorage, memoryStorage, and custom storage implementations\n */\nexport class PersistenceStore {\n protected store: Storage = localStorage;\n readonly config: PersistenceStoreConfig;\n protected name: string;\n\n constructor(config?: PersistenceStoreConfig) {\n let defaultConfig: PersistenceStoreConfig = {\n storeType: 'localStorage',\n maxAge: 1000 * 60 * 60 * 24,\n serializer: JSON.stringify,\n deserializer: JSON.parse,\n };\n defaultConfig = {\n ...defaultConfig,\n ...config,\n };\n this.setStore(defaultConfig.storeType, (defaultConfig as unknown as Store).storage);\n this.config = defaultConfig;\n this.name = '';\n }\n\n private setStore(type?: StorageType | 'customStorage', store?: Storage) {\n switch (type) {\n case 'localStorage':\n break;\n case 'memoryStorage':\n this.store = memoryStorage;\n break;\n case 'customStorage':\n if (!store) {\n throw new TypeError(MISSING_CUSTOM_STORAGE);\n } else {\n this.store = store;\n }\n break;\n }\n }\n\n setItem(key: string, value: any, contentTypeUid?: string, maxAge?: number) {\n if (!key) {\n return;\n }\n const generatedKey = this.generateCSKey(key, contentTypeUid);\n\n if (!value) {\n this.store.removeItem(generatedKey);\n return;\n }\n const expiry = this.calculateExpiry(maxAge);\n let content: any = { value, expiry };\n if (this.config.serializer) {\n content = this.config.serializer(content);\n }\n\n this.store.setItem(generatedKey, content);\n }\n\n getItem(key: string, contentTypeUid?: string): any {\n const generatedKey = this.generateCSKey(key, contentTypeUid);\n const content = this.store.getItem(generatedKey);\n\n if (content) {\n if (this.config.deserializer) {\n const item = this.config.deserializer(content);\n if (!this.isExpire(item.expiry)) {\n return item.value;\n } else {\n this.removeItem(key, contentTypeUid);\n }\n }\n }\n }\n\n removeItem(key: string, contentTypeUid?: string) {\n const generatedKey = this.generateCSKey(key, contentTypeUid);\n this.store.removeItem(generatedKey);\n }\n\n clear(contentTypeUid?: string) {\n if (!contentTypeUid) {\n this.store.clear();\n } else {\n this.store.each((_, key) => {\n if (key.match(contentTypeUid)) {\n this.store.removeItem(key);\n }\n });\n }\n }\n\n private generateCSKey(key: string, contentTypeUid?: string): string {\n let keyPrefix = 'cs_store_js';\n if (contentTypeUid) {\n keyPrefix = contentTypeUid + '_' + keyPrefix;\n }\n keyPrefix = this.name + '_' + keyPrefix + '_' + key;\n\n return keyPrefix;\n }\n\n private calculateExpiry(maxAge?: number): number {\n const now = new Date();\n const nowMSec = now.getTime();\n if (maxAge) {\n return nowMSec + maxAge;\n } else if (this.config.maxAge) {\n return nowMSec + this.config.maxAge;\n }\n\n return 0;\n }\n\n private isExpire(dateTime: number): boolean {\n if (dateTime) {\n return dateTime < new Date().getTime();\n }\n\n return true;\n }\n}\n"],"names":["clear","each","getItem","removeItem","setItem"],"mappings":"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"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const iGlobal = typeof window !== "undefined" ? window : global;
|
|
4
|
+
|
|
5
|
+
const localStorage = {
|
|
6
|
+
name: "localStorage",
|
|
7
|
+
clear: clear$1,
|
|
8
|
+
each: each$1,
|
|
9
|
+
getItem: getItem$1,
|
|
10
|
+
removeItem: removeItem$1,
|
|
11
|
+
setItem: setItem$1
|
|
12
|
+
};
|
|
13
|
+
function _localStorage() {
|
|
14
|
+
return iGlobal.localStorage;
|
|
15
|
+
}
|
|
16
|
+
function clear$1() {
|
|
17
|
+
_localStorage().clear();
|
|
18
|
+
}
|
|
19
|
+
function each$1(callback) {
|
|
20
|
+
for (let i = _localStorage().length - 1; i >= 0; i--) {
|
|
21
|
+
const key = _localStorage().key(i);
|
|
22
|
+
if (key && getItem$1(key)) {
|
|
23
|
+
const value = getItem$1(key);
|
|
24
|
+
callback(value, key);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function setItem$1(key, value) {
|
|
29
|
+
if (!key) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
_localStorage().setItem(key, value);
|
|
33
|
+
}
|
|
34
|
+
function getItem$1(key) {
|
|
35
|
+
return _localStorage().getItem(key);
|
|
36
|
+
}
|
|
37
|
+
function removeItem$1(key) {
|
|
38
|
+
_localStorage().removeItem(key);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const memoryStorage = {
|
|
42
|
+
name: "memoryStorage",
|
|
43
|
+
clear,
|
|
44
|
+
each,
|
|
45
|
+
getItem,
|
|
46
|
+
removeItem,
|
|
47
|
+
setItem
|
|
48
|
+
};
|
|
49
|
+
let memory = {};
|
|
50
|
+
function clear() {
|
|
51
|
+
memory = {};
|
|
52
|
+
}
|
|
53
|
+
function each(callback) {
|
|
54
|
+
for (const key in memory) {
|
|
55
|
+
const value = getItem(key);
|
|
56
|
+
callback(value, key);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function setItem(key, value) {
|
|
60
|
+
if (!key) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
memory[key] = value;
|
|
64
|
+
}
|
|
65
|
+
function getItem(key) {
|
|
66
|
+
return memory[key];
|
|
67
|
+
}
|
|
68
|
+
function removeItem(key) {
|
|
69
|
+
delete memory[key];
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const MISSING_CUSTOM_STORAGE = "Missing storage for customStorage. Provide a storage object with get, set, and remove methods and try again.";
|
|
73
|
+
class PersistenceStore {
|
|
74
|
+
constructor(config) {
|
|
75
|
+
this.store = localStorage;
|
|
76
|
+
let defaultConfig = {
|
|
77
|
+
storeType: "localStorage",
|
|
78
|
+
maxAge: 1e3 * 60 * 60 * 24,
|
|
79
|
+
serializer: JSON.stringify,
|
|
80
|
+
deserializer: JSON.parse
|
|
81
|
+
};
|
|
82
|
+
defaultConfig = {
|
|
83
|
+
...defaultConfig,
|
|
84
|
+
...config
|
|
85
|
+
};
|
|
86
|
+
this.setStore(defaultConfig.storeType, defaultConfig.storage);
|
|
87
|
+
this.config = defaultConfig;
|
|
88
|
+
this.name = "";
|
|
89
|
+
}
|
|
90
|
+
setStore(type, store) {
|
|
91
|
+
switch (type) {
|
|
92
|
+
case "localStorage":
|
|
93
|
+
break;
|
|
94
|
+
case "memoryStorage":
|
|
95
|
+
this.store = memoryStorage;
|
|
96
|
+
break;
|
|
97
|
+
case "customStorage":
|
|
98
|
+
if (!store) {
|
|
99
|
+
throw new TypeError(MISSING_CUSTOM_STORAGE);
|
|
100
|
+
} else {
|
|
101
|
+
this.store = store;
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
setItem(key, value, contentTypeUid, maxAge) {
|
|
107
|
+
if (!key) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const generatedKey = this.generateCSKey(key, contentTypeUid);
|
|
111
|
+
if (!value) {
|
|
112
|
+
this.store.removeItem(generatedKey);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
const expiry = this.calculateExpiry(maxAge);
|
|
116
|
+
let content = { value, expiry };
|
|
117
|
+
if (this.config.serializer) {
|
|
118
|
+
content = this.config.serializer(content);
|
|
119
|
+
}
|
|
120
|
+
this.store.setItem(generatedKey, content);
|
|
121
|
+
}
|
|
122
|
+
getItem(key, contentTypeUid) {
|
|
123
|
+
const generatedKey = this.generateCSKey(key, contentTypeUid);
|
|
124
|
+
const content = this.store.getItem(generatedKey);
|
|
125
|
+
if (content) {
|
|
126
|
+
if (this.config.deserializer) {
|
|
127
|
+
const item = this.config.deserializer(content);
|
|
128
|
+
if (!this.isExpire(item.expiry)) {
|
|
129
|
+
return item.value;
|
|
130
|
+
} else {
|
|
131
|
+
this.removeItem(key, contentTypeUid);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
removeItem(key, contentTypeUid) {
|
|
137
|
+
const generatedKey = this.generateCSKey(key, contentTypeUid);
|
|
138
|
+
this.store.removeItem(generatedKey);
|
|
139
|
+
}
|
|
140
|
+
clear(contentTypeUid) {
|
|
141
|
+
if (!contentTypeUid) {
|
|
142
|
+
this.store.clear();
|
|
143
|
+
} else {
|
|
144
|
+
this.store.each((_, key) => {
|
|
145
|
+
if (key.match(contentTypeUid)) {
|
|
146
|
+
this.store.removeItem(key);
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
generateCSKey(key, contentTypeUid) {
|
|
152
|
+
let keyPrefix = "cs_store_js";
|
|
153
|
+
if (contentTypeUid) {
|
|
154
|
+
keyPrefix = contentTypeUid + "_" + keyPrefix;
|
|
155
|
+
}
|
|
156
|
+
keyPrefix = this.name + "_" + keyPrefix + "_" + key;
|
|
157
|
+
return keyPrefix;
|
|
158
|
+
}
|
|
159
|
+
calculateExpiry(maxAge) {
|
|
160
|
+
const now = /* @__PURE__ */ new Date();
|
|
161
|
+
const nowMSec = now.getTime();
|
|
162
|
+
if (maxAge) {
|
|
163
|
+
return nowMSec + maxAge;
|
|
164
|
+
} else if (this.config.maxAge) {
|
|
165
|
+
return nowMSec + this.config.maxAge;
|
|
166
|
+
}
|
|
167
|
+
return 0;
|
|
168
|
+
}
|
|
169
|
+
isExpire(dateTime) {
|
|
170
|
+
if (dateTime) {
|
|
171
|
+
return dateTime < (/* @__PURE__ */ new Date()).getTime();
|
|
172
|
+
}
|
|
173
|
+
return true;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
exports.PersistenceStore = PersistenceStore;
|
|
178
|
+
exports.localStorage = localStorage;
|
|
179
|
+
exports.memoryStorage = memoryStorage;
|
|
180
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../src/helper/utils.ts","../../src/storages/local-storage.ts","../../src/storages/memory-storage.ts","../../src/persistence-store.ts"],"sourcesContent":["export type Callback = (value: string | null, key: string) => void;\n\nexport const iGlobal = typeof window !== 'undefined' ? window : global;\n","import type { Callback } from '../helper/utils';\nimport { iGlobal } from '../helper/utils';\nimport { Storage } from '../types/storage';\n\nexport const localStorage: Storage = {\n name: 'localStorage',\n clear: clear,\n each: each,\n getItem: getItem,\n removeItem: removeItem,\n setItem: setItem,\n};\n\nfunction _localStorage() {\n return (iGlobal as any).localStorage;\n}\n\nfunction clear() {\n _localStorage().clear();\n}\n\nfunction each(callback: Callback) {\n for (let i = _localStorage().length - 1; i >= 0; i--) {\n const key = _localStorage().key(i);\n if (key && getItem(key)) {\n const value = getItem(key);\n callback(value, key);\n }\n }\n}\n\nfunction setItem(key: string, value: string) {\n if (!key) {\n return;\n }\n _localStorage().setItem(key, value);\n}\n\nfunction getItem(key: string): string | null {\n return _localStorage().getItem(key);\n}\n\nfunction removeItem(key: string) {\n _localStorage().removeItem(key);\n}\n","import type { Callback } from '../helper/utils';\nimport { Storage } from '../types/storage';\n\nexport const memoryStorage: Storage = {\n name: 'memoryStorage',\n clear: clear,\n each: each,\n getItem: getItem,\n removeItem: removeItem,\n setItem: setItem,\n};\n\nlet memory: { [key: string]: string | null } = {};\n\nfunction clear() {\n memory = {};\n}\n\nfunction each(callback: Callback) {\n for (const key in memory) {\n const value = getItem(key);\n callback(value, key);\n }\n}\n\nfunction setItem(key: string, value: string) {\n if (!key) {\n return;\n }\n memory[key] = value;\n}\n\nfunction getItem(key: string): string | null {\n return memory[key];\n}\n\nfunction removeItem(key: string) {\n delete memory[key];\n}\n","import { Store, PersistenceStoreConfig } from './config/persistence-storage-config';\nimport { localStorage } from './storages/local-storage';\nimport { memoryStorage } from './storages/memory-storage';\nimport { Storage } from './types/storage';\nimport { StorageType } from './types/storage-type';\n\nconst MISSING_CUSTOM_STORAGE =\n 'Missing storage for customStorage. Provide a storage object with get, set, and remove methods and try again.';\n\n/**\n * Persistence store for caching data with expiration support\n * Supports localStorage, memoryStorage, and custom storage implementations\n */\nexport class PersistenceStore {\n protected store: Storage = localStorage;\n readonly config: PersistenceStoreConfig;\n protected name: string;\n\n constructor(config?: PersistenceStoreConfig) {\n let defaultConfig: PersistenceStoreConfig = {\n storeType: 'localStorage',\n maxAge: 1000 * 60 * 60 * 24,\n serializer: JSON.stringify,\n deserializer: JSON.parse,\n };\n defaultConfig = {\n ...defaultConfig,\n ...config,\n };\n this.setStore(defaultConfig.storeType, (defaultConfig as unknown as Store).storage);\n this.config = defaultConfig;\n this.name = '';\n }\n\n private setStore(type?: StorageType | 'customStorage', store?: Storage) {\n switch (type) {\n case 'localStorage':\n break;\n case 'memoryStorage':\n this.store = memoryStorage;\n break;\n case 'customStorage':\n if (!store) {\n throw new TypeError(MISSING_CUSTOM_STORAGE);\n } else {\n this.store = store;\n }\n break;\n }\n }\n\n setItem(key: string, value: any, contentTypeUid?: string, maxAge?: number) {\n if (!key) {\n return;\n }\n const generatedKey = this.generateCSKey(key, contentTypeUid);\n\n if (!value) {\n this.store.removeItem(generatedKey);\n return;\n }\n const expiry = this.calculateExpiry(maxAge);\n let content: any = { value, expiry };\n if (this.config.serializer) {\n content = this.config.serializer(content);\n }\n\n this.store.setItem(generatedKey, content);\n }\n\n getItem(key: string, contentTypeUid?: string): any {\n const generatedKey = this.generateCSKey(key, contentTypeUid);\n const content = this.store.getItem(generatedKey);\n\n if (content) {\n if (this.config.deserializer) {\n const item = this.config.deserializer(content);\n if (!this.isExpire(item.expiry)) {\n return item.value;\n } else {\n this.removeItem(key, contentTypeUid);\n }\n }\n }\n }\n\n removeItem(key: string, contentTypeUid?: string) {\n const generatedKey = this.generateCSKey(key, contentTypeUid);\n this.store.removeItem(generatedKey);\n }\n\n clear(contentTypeUid?: string) {\n if (!contentTypeUid) {\n this.store.clear();\n } else {\n this.store.each((_, key) => {\n if (key.match(contentTypeUid)) {\n this.store.removeItem(key);\n }\n });\n }\n }\n\n private generateCSKey(key: string, contentTypeUid?: string): string {\n let keyPrefix = 'cs_store_js';\n if (contentTypeUid) {\n keyPrefix = contentTypeUid + '_' + keyPrefix;\n }\n keyPrefix = this.name + '_' + keyPrefix + '_' + key;\n\n return keyPrefix;\n }\n\n private calculateExpiry(maxAge?: number): number {\n const now = new Date();\n const nowMSec = now.getTime();\n if (maxAge) {\n return nowMSec + maxAge;\n } else if (this.config.maxAge) {\n return nowMSec + this.config.maxAge;\n }\n\n return 0;\n }\n\n private isExpire(dateTime: number): boolean {\n if (dateTime) {\n return dateTime < new Date().getTime();\n }\n\n return true;\n }\n}\n"],"names":["clear","each","getItem","removeItem","setItem"],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
type Callback = (value: string | null, key: string) => void;
|
|
2
|
+
|
|
3
|
+
interface Storage {
|
|
4
|
+
name: string;
|
|
5
|
+
getItem: (key: string) => string | null;
|
|
6
|
+
setItem: (key: string, value: string) => void;
|
|
7
|
+
removeItem: (key: string) => void;
|
|
8
|
+
each: (callback: Callback) => void;
|
|
9
|
+
clear: () => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
type StorageType = 'localStorage' | 'memoryStorage';
|
|
13
|
+
|
|
14
|
+
declare const localStorage: Storage;
|
|
15
|
+
|
|
16
|
+
declare const memoryStorage: Storage;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Configuration type for persistence store
|
|
20
|
+
* Can be either a custom storage with Store interface or standard storage with PersistenceStoreOptions
|
|
21
|
+
*/
|
|
22
|
+
type PersistenceStoreConfig = (Store & PersistenceStoreOptions) | ({
|
|
23
|
+
storeType?: StorageType;
|
|
24
|
+
} & PersistenceStoreOptions);
|
|
25
|
+
/**
|
|
26
|
+
* Interface for custom storage configuration
|
|
27
|
+
*/
|
|
28
|
+
interface Store {
|
|
29
|
+
/** Custom storage implementation */
|
|
30
|
+
storage: Storage;
|
|
31
|
+
/** Storage type identifier */
|
|
32
|
+
storeType: 'customStorage';
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Options for persistence store configuration
|
|
36
|
+
*/
|
|
37
|
+
interface PersistenceStoreOptions {
|
|
38
|
+
/** Maximum age for cached items in milliseconds (default: 24 hours) */
|
|
39
|
+
maxAge?: number;
|
|
40
|
+
/** Serializer function for storing data (default: JSON.stringify) */
|
|
41
|
+
serializer?: (content: any) => string;
|
|
42
|
+
/** Deserializer function for retrieving data (default: JSON.parse) */
|
|
43
|
+
deserializer?: (cacheString: string) => any;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Persistence store for caching data with expiration support
|
|
48
|
+
* Supports localStorage, memoryStorage, and custom storage implementations
|
|
49
|
+
*/
|
|
50
|
+
declare class PersistenceStore {
|
|
51
|
+
protected store: Storage;
|
|
52
|
+
readonly config: PersistenceStoreConfig;
|
|
53
|
+
protected name: string;
|
|
54
|
+
constructor(config?: PersistenceStoreConfig);
|
|
55
|
+
private setStore;
|
|
56
|
+
setItem(key: string, value: any, contentTypeUid?: string, maxAge?: number): void;
|
|
57
|
+
getItem(key: string, contentTypeUid?: string): any;
|
|
58
|
+
removeItem(key: string, contentTypeUid?: string): void;
|
|
59
|
+
clear(contentTypeUid?: string): void;
|
|
60
|
+
private generateCSKey;
|
|
61
|
+
private calculateExpiry;
|
|
62
|
+
private isExpire;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export { PersistenceStore, localStorage, memoryStorage };
|
|
66
|
+
export type { Callback, PersistenceStoreConfig, PersistenceStoreOptions, Storage, StorageType, Store };
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
type Callback = (value: string | null, key: string) => void;
|
|
2
|
+
|
|
3
|
+
interface Storage {
|
|
4
|
+
name: string;
|
|
5
|
+
getItem: (key: string) => string | null;
|
|
6
|
+
setItem: (key: string, value: string) => void;
|
|
7
|
+
removeItem: (key: string) => void;
|
|
8
|
+
each: (callback: Callback) => void;
|
|
9
|
+
clear: () => void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
type StorageType = 'localStorage' | 'memoryStorage';
|
|
13
|
+
|
|
14
|
+
declare const localStorage: Storage;
|
|
15
|
+
|
|
16
|
+
declare const memoryStorage: Storage;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Configuration type for persistence store
|
|
20
|
+
* Can be either a custom storage with Store interface or standard storage with PersistenceStoreOptions
|
|
21
|
+
*/
|
|
22
|
+
type PersistenceStoreConfig = (Store & PersistenceStoreOptions) | ({
|
|
23
|
+
storeType?: StorageType;
|
|
24
|
+
} & PersistenceStoreOptions);
|
|
25
|
+
/**
|
|
26
|
+
* Interface for custom storage configuration
|
|
27
|
+
*/
|
|
28
|
+
interface Store {
|
|
29
|
+
/** Custom storage implementation */
|
|
30
|
+
storage: Storage;
|
|
31
|
+
/** Storage type identifier */
|
|
32
|
+
storeType: 'customStorage';
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Options for persistence store configuration
|
|
36
|
+
*/
|
|
37
|
+
interface PersistenceStoreOptions {
|
|
38
|
+
/** Maximum age for cached items in milliseconds (default: 24 hours) */
|
|
39
|
+
maxAge?: number;
|
|
40
|
+
/** Serializer function for storing data (default: JSON.stringify) */
|
|
41
|
+
serializer?: (content: any) => string;
|
|
42
|
+
/** Deserializer function for retrieving data (default: JSON.parse) */
|
|
43
|
+
deserializer?: (cacheString: string) => any;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Persistence store for caching data with expiration support
|
|
48
|
+
* Supports localStorage, memoryStorage, and custom storage implementations
|
|
49
|
+
*/
|
|
50
|
+
declare class PersistenceStore {
|
|
51
|
+
protected store: Storage;
|
|
52
|
+
readonly config: PersistenceStoreConfig;
|
|
53
|
+
protected name: string;
|
|
54
|
+
constructor(config?: PersistenceStoreConfig);
|
|
55
|
+
private setStore;
|
|
56
|
+
setItem(key: string, value: any, contentTypeUid?: string, maxAge?: number): void;
|
|
57
|
+
getItem(key: string, contentTypeUid?: string): any;
|
|
58
|
+
removeItem(key: string, contentTypeUid?: string): void;
|
|
59
|
+
clear(contentTypeUid?: string): void;
|
|
60
|
+
private generateCSKey;
|
|
61
|
+
private calculateExpiry;
|
|
62
|
+
private isExpire;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export { PersistenceStore, localStorage, memoryStorage };
|
|
66
|
+
export type { Callback, PersistenceStoreConfig, PersistenceStoreOptions, Storage, StorageType, Store };
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
const iGlobal = typeof window !== "undefined" ? window : global;
|
|
2
|
+
|
|
3
|
+
const localStorage = {
|
|
4
|
+
name: "localStorage",
|
|
5
|
+
clear: clear$1,
|
|
6
|
+
each: each$1,
|
|
7
|
+
getItem: getItem$1,
|
|
8
|
+
removeItem: removeItem$1,
|
|
9
|
+
setItem: setItem$1
|
|
10
|
+
};
|
|
11
|
+
function _localStorage() {
|
|
12
|
+
return iGlobal.localStorage;
|
|
13
|
+
}
|
|
14
|
+
function clear$1() {
|
|
15
|
+
_localStorage().clear();
|
|
16
|
+
}
|
|
17
|
+
function each$1(callback) {
|
|
18
|
+
for (let i = _localStorage().length - 1; i >= 0; i--) {
|
|
19
|
+
const key = _localStorage().key(i);
|
|
20
|
+
if (key && getItem$1(key)) {
|
|
21
|
+
const value = getItem$1(key);
|
|
22
|
+
callback(value, key);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function setItem$1(key, value) {
|
|
27
|
+
if (!key) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
_localStorage().setItem(key, value);
|
|
31
|
+
}
|
|
32
|
+
function getItem$1(key) {
|
|
33
|
+
return _localStorage().getItem(key);
|
|
34
|
+
}
|
|
35
|
+
function removeItem$1(key) {
|
|
36
|
+
_localStorage().removeItem(key);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const memoryStorage = {
|
|
40
|
+
name: "memoryStorage",
|
|
41
|
+
clear,
|
|
42
|
+
each,
|
|
43
|
+
getItem,
|
|
44
|
+
removeItem,
|
|
45
|
+
setItem
|
|
46
|
+
};
|
|
47
|
+
let memory = {};
|
|
48
|
+
function clear() {
|
|
49
|
+
memory = {};
|
|
50
|
+
}
|
|
51
|
+
function each(callback) {
|
|
52
|
+
for (const key in memory) {
|
|
53
|
+
const value = getItem(key);
|
|
54
|
+
callback(value, key);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function setItem(key, value) {
|
|
58
|
+
if (!key) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
memory[key] = value;
|
|
62
|
+
}
|
|
63
|
+
function getItem(key) {
|
|
64
|
+
return memory[key];
|
|
65
|
+
}
|
|
66
|
+
function removeItem(key) {
|
|
67
|
+
delete memory[key];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const MISSING_CUSTOM_STORAGE = "Missing storage for customStorage. Provide a storage object with get, set, and remove methods and try again.";
|
|
71
|
+
class PersistenceStore {
|
|
72
|
+
constructor(config) {
|
|
73
|
+
this.store = localStorage;
|
|
74
|
+
let defaultConfig = {
|
|
75
|
+
storeType: "localStorage",
|
|
76
|
+
maxAge: 1e3 * 60 * 60 * 24,
|
|
77
|
+
serializer: JSON.stringify,
|
|
78
|
+
deserializer: JSON.parse
|
|
79
|
+
};
|
|
80
|
+
defaultConfig = {
|
|
81
|
+
...defaultConfig,
|
|
82
|
+
...config
|
|
83
|
+
};
|
|
84
|
+
this.setStore(defaultConfig.storeType, defaultConfig.storage);
|
|
85
|
+
this.config = defaultConfig;
|
|
86
|
+
this.name = "";
|
|
87
|
+
}
|
|
88
|
+
setStore(type, store) {
|
|
89
|
+
switch (type) {
|
|
90
|
+
case "localStorage":
|
|
91
|
+
break;
|
|
92
|
+
case "memoryStorage":
|
|
93
|
+
this.store = memoryStorage;
|
|
94
|
+
break;
|
|
95
|
+
case "customStorage":
|
|
96
|
+
if (!store) {
|
|
97
|
+
throw new TypeError(MISSING_CUSTOM_STORAGE);
|
|
98
|
+
} else {
|
|
99
|
+
this.store = store;
|
|
100
|
+
}
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
setItem(key, value, contentTypeUid, maxAge) {
|
|
105
|
+
if (!key) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const generatedKey = this.generateCSKey(key, contentTypeUid);
|
|
109
|
+
if (!value) {
|
|
110
|
+
this.store.removeItem(generatedKey);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const expiry = this.calculateExpiry(maxAge);
|
|
114
|
+
let content = { value, expiry };
|
|
115
|
+
if (this.config.serializer) {
|
|
116
|
+
content = this.config.serializer(content);
|
|
117
|
+
}
|
|
118
|
+
this.store.setItem(generatedKey, content);
|
|
119
|
+
}
|
|
120
|
+
getItem(key, contentTypeUid) {
|
|
121
|
+
const generatedKey = this.generateCSKey(key, contentTypeUid);
|
|
122
|
+
const content = this.store.getItem(generatedKey);
|
|
123
|
+
if (content) {
|
|
124
|
+
if (this.config.deserializer) {
|
|
125
|
+
const item = this.config.deserializer(content);
|
|
126
|
+
if (!this.isExpire(item.expiry)) {
|
|
127
|
+
return item.value;
|
|
128
|
+
} else {
|
|
129
|
+
this.removeItem(key, contentTypeUid);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
removeItem(key, contentTypeUid) {
|
|
135
|
+
const generatedKey = this.generateCSKey(key, contentTypeUid);
|
|
136
|
+
this.store.removeItem(generatedKey);
|
|
137
|
+
}
|
|
138
|
+
clear(contentTypeUid) {
|
|
139
|
+
if (!contentTypeUid) {
|
|
140
|
+
this.store.clear();
|
|
141
|
+
} else {
|
|
142
|
+
this.store.each((_, key) => {
|
|
143
|
+
if (key.match(contentTypeUid)) {
|
|
144
|
+
this.store.removeItem(key);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
generateCSKey(key, contentTypeUid) {
|
|
150
|
+
let keyPrefix = "cs_store_js";
|
|
151
|
+
if (contentTypeUid) {
|
|
152
|
+
keyPrefix = contentTypeUid + "_" + keyPrefix;
|
|
153
|
+
}
|
|
154
|
+
keyPrefix = this.name + "_" + keyPrefix + "_" + key;
|
|
155
|
+
return keyPrefix;
|
|
156
|
+
}
|
|
157
|
+
calculateExpiry(maxAge) {
|
|
158
|
+
const now = /* @__PURE__ */ new Date();
|
|
159
|
+
const nowMSec = now.getTime();
|
|
160
|
+
if (maxAge) {
|
|
161
|
+
return nowMSec + maxAge;
|
|
162
|
+
} else if (this.config.maxAge) {
|
|
163
|
+
return nowMSec + this.config.maxAge;
|
|
164
|
+
}
|
|
165
|
+
return 0;
|
|
166
|
+
}
|
|
167
|
+
isExpire(dateTime) {
|
|
168
|
+
if (dateTime) {
|
|
169
|
+
return dateTime < (/* @__PURE__ */ new Date()).getTime();
|
|
170
|
+
}
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export { PersistenceStore, localStorage, memoryStorage };
|
|
176
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/helper/utils.ts","../../src/storages/local-storage.ts","../../src/storages/memory-storage.ts","../../src/persistence-store.ts"],"sourcesContent":["export type Callback = (value: string | null, key: string) => void;\n\nexport const iGlobal = typeof window !== 'undefined' ? window : global;\n","import type { Callback } from '../helper/utils';\nimport { iGlobal } from '../helper/utils';\nimport { Storage } from '../types/storage';\n\nexport const localStorage: Storage = {\n name: 'localStorage',\n clear: clear,\n each: each,\n getItem: getItem,\n removeItem: removeItem,\n setItem: setItem,\n};\n\nfunction _localStorage() {\n return (iGlobal as any).localStorage;\n}\n\nfunction clear() {\n _localStorage().clear();\n}\n\nfunction each(callback: Callback) {\n for (let i = _localStorage().length - 1; i >= 0; i--) {\n const key = _localStorage().key(i);\n if (key && getItem(key)) {\n const value = getItem(key);\n callback(value, key);\n }\n }\n}\n\nfunction setItem(key: string, value: string) {\n if (!key) {\n return;\n }\n _localStorage().setItem(key, value);\n}\n\nfunction getItem(key: string): string | null {\n return _localStorage().getItem(key);\n}\n\nfunction removeItem(key: string) {\n _localStorage().removeItem(key);\n}\n","import type { Callback } from '../helper/utils';\nimport { Storage } from '../types/storage';\n\nexport const memoryStorage: Storage = {\n name: 'memoryStorage',\n clear: clear,\n each: each,\n getItem: getItem,\n removeItem: removeItem,\n setItem: setItem,\n};\n\nlet memory: { [key: string]: string | null } = {};\n\nfunction clear() {\n memory = {};\n}\n\nfunction each(callback: Callback) {\n for (const key in memory) {\n const value = getItem(key);\n callback(value, key);\n }\n}\n\nfunction setItem(key: string, value: string) {\n if (!key) {\n return;\n }\n memory[key] = value;\n}\n\nfunction getItem(key: string): string | null {\n return memory[key];\n}\n\nfunction removeItem(key: string) {\n delete memory[key];\n}\n","import { Store, PersistenceStoreConfig } from './config/persistence-storage-config';\nimport { localStorage } from './storages/local-storage';\nimport { memoryStorage } from './storages/memory-storage';\nimport { Storage } from './types/storage';\nimport { StorageType } from './types/storage-type';\n\nconst MISSING_CUSTOM_STORAGE =\n 'Missing storage for customStorage. Provide a storage object with get, set, and remove methods and try again.';\n\n/**\n * Persistence store for caching data with expiration support\n * Supports localStorage, memoryStorage, and custom storage implementations\n */\nexport class PersistenceStore {\n protected store: Storage = localStorage;\n readonly config: PersistenceStoreConfig;\n protected name: string;\n\n constructor(config?: PersistenceStoreConfig) {\n let defaultConfig: PersistenceStoreConfig = {\n storeType: 'localStorage',\n maxAge: 1000 * 60 * 60 * 24,\n serializer: JSON.stringify,\n deserializer: JSON.parse,\n };\n defaultConfig = {\n ...defaultConfig,\n ...config,\n };\n this.setStore(defaultConfig.storeType, (defaultConfig as unknown as Store).storage);\n this.config = defaultConfig;\n this.name = '';\n }\n\n private setStore(type?: StorageType | 'customStorage', store?: Storage) {\n switch (type) {\n case 'localStorage':\n break;\n case 'memoryStorage':\n this.store = memoryStorage;\n break;\n case 'customStorage':\n if (!store) {\n throw new TypeError(MISSING_CUSTOM_STORAGE);\n } else {\n this.store = store;\n }\n break;\n }\n }\n\n setItem(key: string, value: any, contentTypeUid?: string, maxAge?: number) {\n if (!key) {\n return;\n }\n const generatedKey = this.generateCSKey(key, contentTypeUid);\n\n if (!value) {\n this.store.removeItem(generatedKey);\n return;\n }\n const expiry = this.calculateExpiry(maxAge);\n let content: any = { value, expiry };\n if (this.config.serializer) {\n content = this.config.serializer(content);\n }\n\n this.store.setItem(generatedKey, content);\n }\n\n getItem(key: string, contentTypeUid?: string): any {\n const generatedKey = this.generateCSKey(key, contentTypeUid);\n const content = this.store.getItem(generatedKey);\n\n if (content) {\n if (this.config.deserializer) {\n const item = this.config.deserializer(content);\n if (!this.isExpire(item.expiry)) {\n return item.value;\n } else {\n this.removeItem(key, contentTypeUid);\n }\n }\n }\n }\n\n removeItem(key: string, contentTypeUid?: string) {\n const generatedKey = this.generateCSKey(key, contentTypeUid);\n this.store.removeItem(generatedKey);\n }\n\n clear(contentTypeUid?: string) {\n if (!contentTypeUid) {\n this.store.clear();\n } else {\n this.store.each((_, key) => {\n if (key.match(contentTypeUid)) {\n this.store.removeItem(key);\n }\n });\n }\n }\n\n private generateCSKey(key: string, contentTypeUid?: string): string {\n let keyPrefix = 'cs_store_js';\n if (contentTypeUid) {\n keyPrefix = contentTypeUid + '_' + keyPrefix;\n }\n keyPrefix = this.name + '_' + keyPrefix + '_' + key;\n\n return keyPrefix;\n }\n\n private calculateExpiry(maxAge?: number): number {\n const now = new Date();\n const nowMSec = now.getTime();\n if (maxAge) {\n return nowMSec + maxAge;\n } else if (this.config.maxAge) {\n return nowMSec + this.config.maxAge;\n }\n\n return 0;\n }\n\n private isExpire(dateTime: number): boolean {\n if (dateTime) {\n return dateTime < new Date().getTime();\n }\n\n return true;\n }\n}\n"],"names":["clear","each","getItem","removeItem","setItem"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@contentstack/persistence-plugin",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Persistence plugin for Contentstack TypeScript Delivery SDK",
|
|
6
|
+
"homepage": "https://www.contentstack.com/",
|
|
7
|
+
"author": {
|
|
8
|
+
"name": "Contentstack",
|
|
9
|
+
"url": "https://www.contentstack.com/"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://github.com/contentstack/contentstack-persistence-typescript"
|
|
14
|
+
},
|
|
15
|
+
"license": "MIT",
|
|
16
|
+
"main": "./dist/legacy/index.cjs",
|
|
17
|
+
"module": "./dist/legacy/index.js",
|
|
18
|
+
"types": "./dist/legacy/index.d.ts",
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"import": {
|
|
22
|
+
"types": "./dist/modern/index.d.ts",
|
|
23
|
+
"default": "./dist/modern/index.js"
|
|
24
|
+
},
|
|
25
|
+
"require": {
|
|
26
|
+
"types": "./dist/modern/index.d.cts",
|
|
27
|
+
"default": "./dist/modern/index.cjs"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
"./package.json": "./package.json"
|
|
31
|
+
},
|
|
32
|
+
"scripts": {
|
|
33
|
+
"prepare": "npm run build",
|
|
34
|
+
"test": "jest ./test/unit",
|
|
35
|
+
"test:unit": "jest ./test/unit",
|
|
36
|
+
"test:build": "node test/build/verify-esm.mjs",
|
|
37
|
+
"test:all": "npm run build && npm run test:unit && npm run test:build",
|
|
38
|
+
"lint": "eslint . -c .eslintrc.json",
|
|
39
|
+
"package": "npm run build && npm pack",
|
|
40
|
+
"build": "npm run build:clean && NODE_OPTIONS='--max-old-space-size=16384' rollup -c rollup.config.cjs && npm run build:cts",
|
|
41
|
+
"build:clean": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
42
|
+
"build:cts": "node -e \"require('fs').copyFileSync('dist/modern/index.d.ts','dist/modern/index.d.cts')\""
|
|
43
|
+
},
|
|
44
|
+
"files": [
|
|
45
|
+
"dist",
|
|
46
|
+
"package.json",
|
|
47
|
+
"README.md"
|
|
48
|
+
],
|
|
49
|
+
"keywords": [],
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@nrwl/jest": "^19.8.4",
|
|
52
|
+
"@rollup/plugin-commonjs": "^26.0.1",
|
|
53
|
+
"@rollup/plugin-node-resolve": "^16.0.0",
|
|
54
|
+
"@rollup/plugin-replace": "^6.0.0",
|
|
55
|
+
"@types/jest": "^30.0.0",
|
|
56
|
+
"jest": "^30.2.0",
|
|
57
|
+
"jest-environment-jsdom": "^30.2.0",
|
|
58
|
+
"jest-html-reporters": "^3.1.7",
|
|
59
|
+
"jest-junit": "^16.0.0",
|
|
60
|
+
"rollup": "^4.18.0",
|
|
61
|
+
"rollup-plugin-dts": "^6.1.1",
|
|
62
|
+
"rollup-plugin-esbuild": "^6.1.1",
|
|
63
|
+
"ts-jest": "^29.4.6",
|
|
64
|
+
"ts-node": "^10.9.2",
|
|
65
|
+
"typescript": "^5.9.3"
|
|
66
|
+
}
|
|
67
|
+
}
|