@forgerock/storage 0.0.0-beta-20250506165419

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/CHANGELOG.md ADDED
@@ -0,0 +1,12 @@
1
+ # @forgerock/storage
2
+
3
+ ## 0.0.0-beta-20250506165419
4
+
5
+ ### Minor Changes
6
+
7
+ - [#251](https://github.com/ForgeRock/ping-javascript-sdk/pull/251) [`50fd7fa`](https://github.com/ForgeRock/ping-javascript-sdk/commit/50fd7fab9f0dd893528e85cb15f1ba6fdc1fe3e8) Thanks [@ryanbas21](https://github.com/ryanbas21)! - created sdk-storage module, which includes session,local, and token storage
8
+
9
+ ### Patch Changes
10
+
11
+ - Updated dependencies [[`04b506c`](https://github.com/ForgeRock/ping-javascript-sdk/commit/04b506c2016324dffeba3a473bfc705843ac3e41), [`50fd7fa`](https://github.com/ForgeRock/ping-javascript-sdk/commit/50fd7fab9f0dd893528e85cb15f1ba6fdc1fe3e8)]:
12
+ - @forgerock/sdk-types@0.0.0-beta-20250506165419
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Ping Identity Corporation
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,82 @@
1
+ # ForgeRock SDK Effects - Storage
2
+
3
+ This package provides a storage effect for managing token storage within the ForgeRock JavaScript SDK ecosystem.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @forgerock/sdk-effects-storage
9
+ # or
10
+ yarn add @forgerock/sdk-effects-storage
11
+ ```
12
+
13
+ ## Usage
14
+
15
+ The `storage` effect facilitates getting, setting, and removing items from browser storage (`localStorage` or `sessionStorage`) or a custom token store implementation.
16
+
17
+ ```typescript
18
+ import { storage } from '@forgerock/sdk-effects-storage';
19
+ import { TokenStoreObject } from '@forgerock/sdk-types';
20
+
21
+ // Example using localStorage
22
+ const storageEffect = storage({
23
+ tokenStore: 'localStorage',
24
+ prefix: 'fr-auth',
25
+ clientId: 'my-client-id',
26
+ });
27
+
28
+ const storageApi = storageEffect();
29
+
30
+ async function manageTokens() {
31
+ // Set a token
32
+ await storageApi.set('someTokenValue');
33
+
34
+ // Get a token
35
+ const token = await storageApi.get();
36
+ console.log(token); // Output: 'someTokenValue'
37
+
38
+ // Remove a token
39
+ await storageApi.remove();
40
+
41
+ // Verify removal
42
+ const removedToken = await storageApi.get();
43
+ console.log(removedToken); // Output: null
44
+ }
45
+
46
+ // Example using a custom token store
47
+ const myCustomStore: TokenStoreObject = {
48
+ get: async (key) => {
49
+ /* ... custom logic ... */ return null;
50
+ },
51
+ set: async (key, value) => {
52
+ /* ... custom logic ... */
53
+ },
54
+ remove: async (key) => {
55
+ /* ... custom logic ... */
56
+ },
57
+ };
58
+
59
+ const customStorageEffect = storage(
60
+ {
61
+ tokenStore: 'localStorage', // This is ignored when customTokenStore is provided
62
+ prefix: 'fr-auth',
63
+ clientId: 'my-client-id',
64
+ },
65
+ myCustomStore,
66
+ );
67
+
68
+ const customStorageApi = customStorageEffect();
69
+ // Use customStorageApi.get(), .set(), .remove() as above
70
+ ```
71
+
72
+ ## Configuration
73
+
74
+ The `storage` function accepts a configuration object with the following properties:
75
+
76
+ - `tokenStore`: Specifies the storage mechanism. Can be `'localStorage'`, `'sessionStorage'`, or a custom object conforming to the `TokenStoreObject` interface.
77
+ - `prefix`: A string prefix used in generating the storage key.
78
+ - `clientId`: The client ID, also used in generating the storage key.
79
+
80
+ An optional second argument allows providing a `customTokenStore` object directly, which overrides the `tokenStore` configuration property if provided.
81
+
82
+ The storage key is generated as \`\` `${prefix}-${clientId}`
@@ -0,0 +1,2 @@
1
+ export * from './lib/storage.effects.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,cAAc,0BAA0B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /*
2
+ * Copyright (c) 2025 Ping Identity Corporation. All rights reserved.
3
+ *
4
+ * This software may be modified and distributed under the terms
5
+ * of the MIT license. See the LICENSE file for details.
6
+ */
7
+ export * from './lib/storage.effects.js';
@@ -0,0 +1,21 @@
1
+ import { CustomStorageObject } from '@forgerock/sdk-types';
2
+ export interface StorageConfig {
3
+ storeType: CustomStorageObject | 'localStorage' | 'sessionStorage';
4
+ prefix?: string;
5
+ }
6
+ interface GenericError {
7
+ code?: string | number;
8
+ message: string;
9
+ type: 'argument_error' | 'davinci_error' | 'internal_error' | 'network_error' | 'state_error' | 'unknown_error';
10
+ }
11
+ export declare function createStorage<Value>(config: StorageConfig, storageName: string, customStore?: CustomStorageObject): {
12
+ get: () => Promise<Value | GenericError | null>;
13
+ set: (value: Value) => Promise<void | {
14
+ code: string;
15
+ message: string;
16
+ type: string;
17
+ }>;
18
+ remove: () => Promise<void>;
19
+ };
20
+ export {};
21
+ //# sourceMappingURL=storage.effects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.effects.d.ts","sourceRoot":"","sources":["../../../src/lib/storage.effects.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,mBAAmB,GAAG,cAAc,GAAG,gBAAgB,CAAC;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,YAAY;IACpB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EACA,gBAAgB,GAChB,eAAe,GACf,gBAAgB,GAChB,eAAe,GACf,aAAa,GACb,eAAe,CAAC;CACrB;AAED,wBAAgB,aAAa,CAAC,KAAK,EACjC,MAAM,EAAE,aAAa,EACrB,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,mBAAmB;eAMG,OAAO,CAAC,KAAK,GAAG,YAAY,GAAG,IAAI,CAAC;iBAiDhC,KAAK;;;;;;EA+C9C"}
@@ -0,0 +1,106 @@
1
+ export function createStorage(config, storageName, customStore) {
2
+ const { storeType, prefix = 'pic' } = config;
3
+ const key = `${prefix}-${storageName}`;
4
+ return {
5
+ get: async function storageGet() {
6
+ if (customStore) {
7
+ const value = await customStore.get(key);
8
+ if (value === null) {
9
+ return value;
10
+ }
11
+ try {
12
+ const parsed = JSON.parse(value);
13
+ return parsed;
14
+ }
15
+ catch {
16
+ return {
17
+ code: 'Parse_Error',
18
+ message: 'Eror parsing value from provided storage',
19
+ type: 'unknown_error',
20
+ };
21
+ }
22
+ }
23
+ if (storeType === 'sessionStorage') {
24
+ const value = await sessionStorage.getItem(key);
25
+ if (value === null) {
26
+ return value;
27
+ }
28
+ try {
29
+ const parsed = JSON.parse(value);
30
+ return parsed;
31
+ }
32
+ catch {
33
+ return {
34
+ code: 'Parse_Error',
35
+ message: 'Eror parsing value from session storage',
36
+ type: 'unknown_error',
37
+ };
38
+ }
39
+ }
40
+ const value = await localStorage.getItem(key);
41
+ if (value === null) {
42
+ return value;
43
+ }
44
+ try {
45
+ const parsed = JSON.parse(value);
46
+ return parsed;
47
+ }
48
+ catch {
49
+ return {
50
+ code: 'Parse_Error',
51
+ message: 'Eror parsing value from local storage',
52
+ type: 'unknown_error',
53
+ };
54
+ }
55
+ },
56
+ set: async function storageSet(value) {
57
+ const valueToStore = JSON.stringify(value);
58
+ if (customStore) {
59
+ try {
60
+ await customStore.set(key, valueToStore);
61
+ return Promise.resolve();
62
+ }
63
+ catch {
64
+ return {
65
+ code: 'Storing_Error',
66
+ message: 'Eror storing value in custom storage',
67
+ type: 'unknown_error',
68
+ };
69
+ }
70
+ }
71
+ if (storeType === 'sessionStorage') {
72
+ try {
73
+ await sessionStorage.setItem(key, valueToStore);
74
+ return Promise.resolve();
75
+ }
76
+ catch {
77
+ return {
78
+ code: 'Storing_Error',
79
+ message: 'Eror storing value in session storage',
80
+ type: 'unknown_error',
81
+ };
82
+ }
83
+ }
84
+ try {
85
+ await localStorage.setItem(key, valueToStore);
86
+ return Promise.resolve();
87
+ }
88
+ catch {
89
+ return {
90
+ code: 'Storing_Error',
91
+ message: 'Eror storing value in local storage',
92
+ type: 'unknown_error',
93
+ };
94
+ }
95
+ },
96
+ remove: async function storageSet() {
97
+ if (customStore) {
98
+ return await customStore.remove(key);
99
+ }
100
+ if (storeType === 'sessionStorage') {
101
+ return await sessionStorage.removeItem(key);
102
+ }
103
+ return await localStorage.removeItem(key);
104
+ },
105
+ };
106
+ }
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es5.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.promise.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.string.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.weakref.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2021.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.array.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.error.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.object.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.string.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2022.regexp.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.array.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.collection.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2023.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.arraybuffer.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.collection.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.object.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.promise.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.regexp.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.sharedmemory.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.es2024.string.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.array.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.collection.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.intl.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.disposable.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.decorators.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.iterator.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../../node_modules/.pnpm/typescript@5.7.3/node_modules/typescript/lib/lib.esnext.full.d.ts","../../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/tslib.d.ts","../../../../node_modules/.pnpm/tslib@2.8.1/node_modules/tslib/modules/index.d.ts","../../../sdk-types/dist/src/lib/am-callback.types.d.ts","../../../sdk-types/dist/src/lib/legacy-mware.types.d.ts","../../../sdk-types/dist/src/lib/tokens.types.d.ts","../../../sdk-types/dist/src/lib/legacy-config.types.d.ts","../../../sdk-types/dist/src/lib/branded.types.d.ts","../../../sdk-types/dist/src/lib/config.types.d.ts","../../../sdk-types/dist/src/lib/authorize.types.d.ts","../../../sdk-types/dist/src/index.d.ts","../src/lib/storage.effects.ts","../src/index.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/compatibility/disposable.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/compatibility/indexable.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/compatibility/iterators.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/compatibility/index.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/globals.typedarray.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/buffer.buffer.d.ts","../../../../node_modules/.pnpm/buffer@5.7.1/node_modules/buffer/index.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/header.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/readable.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/file.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/fetch.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/formdata.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/connector.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/client.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/errors.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/dispatcher.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-dispatcher.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/global-origin.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool-stats.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/pool.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/handlers.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/balanced-pool.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/agent.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-interceptor.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-agent.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-client.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-pool.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/mock-errors.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/proxy-agent.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/env-http-proxy-agent.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-handler.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/retry-agent.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/api.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/interceptors.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/util.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cookies.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/patch.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/websocket.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/eventsource.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/filereader.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/diagnostics-channel.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/content-type.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/cache.d.ts","../../../../node_modules/.pnpm/undici-types@6.21.0/node_modules/undici-types/index.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/globals.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/assert.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/assert/strict.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/async_hooks.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/buffer.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/child_process.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/cluster.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/console.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/constants.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/crypto.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/dgram.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/diagnostics_channel.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/dns.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/dns/promises.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/domain.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/dom-events.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/events.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/fs.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/fs/promises.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/http.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/http2.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/https.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/inspector.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/module.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/net.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/os.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/path.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/perf_hooks.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/process.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/punycode.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/querystring.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/readline.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/readline/promises.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/repl.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/sea.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/sqlite.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/stream.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/stream/promises.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/stream/consumers.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/stream/web.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/string_decoder.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/test.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/timers.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/timers/promises.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/tls.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/trace_events.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/tty.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/url.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/util.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/v8.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/vm.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/wasi.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/worker_threads.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/zlib.d.ts","../../../../node_modules/.pnpm/@types+node@22.14.1/node_modules/@types/node/index.d.ts"],"fileIdsList":[[100,140,143],[100,142,143],[143],[100,143,148,178],[100,143,144,149,155,156,163,175,186],[100,143,144,145,155,163],[100,143],[95,96,97,100,143],[100,143,146,187],[100,143,147,148,156,164],[100,143,148,175,183],[100,143,149,151,155,163],[100,142,143,150],[100,143,151,152],[100,143,155],[100,143,153,155],[100,142,143,155],[100,143,155,156,157,175,186],[100,143,155,156,157,170,175,178],[100,138,143,191],[100,138,143,151,155,158,163,175,186],[100,143,155,156,158,159,163,175,183,186],[100,143,158,160,175,183,186],[98,99,100,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192],[100,143,155,161],[100,143,162,186],[100,143,151,155,163,175],[100,143,164],[100,143,165],[100,142,143,166],[100,140,141,142,143,144,145,146,147,148,149,150,151,152,153,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192],[100,143,168],[100,143,169],[100,143,155,170,171],[100,143,170,172,187,189],[100,143,155,175,176,178],[100,143,177,178],[100,143,175,176],[100,143,178],[100,143,179],[100,140,143,175],[100,143,155,181,182],[100,143,181,182],[100,143,148,163,175,183],[100,143,184],[100,143,163,185],[100,143,158,169,186],[100,143,148,187],[100,143,175,188],[100,143,162,189],[100,143,190],[100,143,148,155,157,166,175,186,189,191],[100,143,175,192],[83,100,143],[100,110,114,143,186],[100,110,143,175,186],[100,105,143],[100,107,110,143,183,186],[100,143,163,183],[100,143,193],[100,105,143,193],[100,107,110,143,163,186],[100,102,103,106,109,143,155,175,186],[100,110,117,143],[100,102,108,143],[100,110,131,132,143],[100,106,110,143,178,186,193],[100,131,143,193],[100,104,105,143,193],[100,110,143],[100,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,132,133,134,135,136,137,143],[100,110,125,143],[100,110,117,118,143],[100,108,110,118,119,143],[100,109,143],[100,102,105,110,143],[100,110,114,118,119,143],[100,114,143],[100,108,110,113,143,186],[100,102,107,110,117,143],[100,143,175],[100,105,110,131,143,191,193],[84,93,100,143],[84,92,100,143],[85,86,87,88,89,90,91,100,143],[92,100,143],[87,100,143],[85,86,87,100,143]],"fileInfos":[{"version":"e41c290ef7dd7dab3493e6cbe5909e0148edf4a8dad0271be08edec368a0f7b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"feecb1be483ed332fad555aff858affd90a48ab19ba7272ee084704eb7167569","impliedFormat":1},{"version":"ee7bad0c15b58988daa84371e0b89d313b762ab83cb5b31b8a2d1162e8eb41c2","impliedFormat":1},{"version":"27bdc30a0e32783366a5abeda841bc22757c1797de8681bbe81fbc735eeb1c10","impliedFormat":1},{"version":"8fd575e12870e9944c7e1d62e1f5a73fcf23dd8d3a321f2a2c74c20d022283fe","impliedFormat":1},{"version":"e12a46ce14b817d4c9e6b2b478956452330bf00c9801b79de46f7a1815b5bd40","impliedFormat":1},{"version":"4fd3f3422b2d2a3dfd5cdd0f387b3a8ec45f006c6ea896a4cb41264c2100bb2c","affectsGlobalScope":true,"impliedFormat":1},{"version":"69e65d976bf166ce4a9e6f6c18f94d2424bf116e90837ace179610dbccad9b42","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"62bb211266ee48b2d0edf0d8d1b191f0c24fc379a82bd4c1692a082c540bc6b1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"936e80ad36a2ee83fc3caf008e7c4c5afe45b3cf3d5c24408f039c1d47bdc1df","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"fef8cfad2e2dc5f5b3d97a6f4f2e92848eb1b88e897bb7318cef0e2820bceaab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"f1e2a172204962276504466a6393426d2ca9c54894b1ad0a6c9dad867a65f876","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"af3dd424cf267428f30ccfc376f47a2c0114546b55c44d8c0f1d57d841e28d74","affectsGlobalScope":true,"impliedFormat":1},{"version":"995c005ab91a498455ea8dfb63aa9f83fa2ea793c3d8aa344be4a1678d06d399","affectsGlobalScope":true,"impliedFormat":1},{"version":"959d36cddf5e7d572a65045b876f2956c973a586da58e5d26cde519184fd9b8a","affectsGlobalScope":true,"impliedFormat":1},{"version":"965f36eae237dd74e6cca203a43e9ca801ce38824ead814728a2807b1910117d","affectsGlobalScope":true,"impliedFormat":1},{"version":"3925a6c820dcb1a06506c90b1577db1fdbf7705d65b62b99dce4be75c637e26b","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a3d63ef2b853447ec4f749d3f368ce642264246e02911fcb1590d8c161b8005","affectsGlobalScope":true,"impliedFormat":1},{"version":"b5ce7a470bc3628408429040c4e3a53a27755022a32fd05e2cb694e7015386c7","affectsGlobalScope":true,"impliedFormat":1},{"version":"8444af78980e3b20b49324f4a16ba35024fef3ee069a0eb67616ea6ca821c47a","affectsGlobalScope":true,"impliedFormat":1},{"version":"3287d9d085fbd618c3971944b65b4be57859f5415f495b33a6adc994edd2f004","affectsGlobalScope":true,"impliedFormat":1},{"version":"b4b67b1a91182421f5df999988c690f14d813b9850b40acd06ed44691f6727ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"bab26767638ab3557de12c900f0b91f710c7dc40ee9793d5a27d32c04f0bf646","affectsGlobalScope":true,"impliedFormat":1},{"version":"436aaf437562f276ec2ddbee2f2cdedac7664c1e4c1d2c36839ddd582eeb3d0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e3c06ea092138bf9fa5e874a1fdbc9d54805d074bee1de31b99a11e2fec239d","affectsGlobalScope":true,"impliedFormat":1},{"version":"87dc0f382502f5bbce5129bdc0aea21e19a3abbc19259e0b43ae038a9fc4e326","affectsGlobalScope":true,"impliedFormat":1},{"version":"b1cb28af0c891c8c96b2d6b7be76bd394fddcfdb4709a20ba05a7c1605eea0f9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2fef54945a13095fdb9b84f705f2b5994597640c46afeb2ce78352fab4cb3279","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac77cb3e8c6d3565793eb90a8373ee8033146315a3dbead3bde8db5eaf5e5ec6","affectsGlobalScope":true,"impliedFormat":1},{"version":"56e4ed5aab5f5920980066a9409bfaf53e6d21d3f8d020c17e4de584d29600ad","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ece9f17b3866cc077099c73f4983bddbcb1dc7ddb943227f1ec070f529dedd1","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a6282c8827e4b9a95f4bf4f5c205673ada31b982f50572d27103df8ceb8013c","affectsGlobalScope":true,"impliedFormat":1},{"version":"1c9319a09485199c1f7b0498f2988d6d2249793ef67edda49d1e584746be9032","affectsGlobalScope":true,"impliedFormat":1},{"version":"e3a2a0cee0f03ffdde24d89660eba2685bfbdeae955a6c67e8c4c9fd28928eeb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811c71eee4aa0ac5f7adf713323a5c41b0cf6c4e17367a34fbce379e12bbf0a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"d4b1d2c51d058fc21ec2629fff7a76249dec2e36e12960ea056e3ef89174080f","affectsGlobalScope":true,"impliedFormat":1},{"version":"61d6a2092f48af66dbfb220e31eea8b10bc02b6932d6e529005fd2d7b3281290","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"bde31fd423cd93b0eff97197a3f66df7c93e8c0c335cbeb113b7ff1ac35c23f4","impliedFormat":1},{"version":"a6a5253138c5432c68a1510c70fe78a644fe2e632111ba778e1978010d6edfec","impliedFormat":1},{"version":"b8f34dd1757f68e03262b1ca3ddfa668a855b872f8bdd5224d6f993a7b37dc2c","impliedFormat":99},{"version":"9fa2c1a1e99de9e49bc0f39efd3a6808c332a88e6e634cf5908a69f391459bb5","impliedFormat":99},{"version":"5fc9dce2120281bc3f86115974f4e7f1faaa7403ba04f0cbb2e0f03a780aa65d","impliedFormat":99},{"version":"ed1eb35232e7de2dac290531fcef285755e3b1938e770f493f979895e9b5b400","impliedFormat":99},{"version":"fe99476bdb3ba74a4f118b47e95b8057c0f3e9d7d94c4b5cff650b568ccdccf5","impliedFormat":99},{"version":"257bd65d14490bcfe2c234134e340bae3d6b4556b7fa43e31cb45480dcc92a34","impliedFormat":99},{"version":"bcc3f8bad13edcd33ef55f818d8773c02fcdb5466778cc81b90a82d5848529a6","impliedFormat":99},{"version":"9669f15502f25053d621555f6ab995c8872cd8ed0f742a1d66864e9809e1b6d4","impliedFormat":99},{"version":"40e57f4e6bbb40c1c42752d594f9cc78ba2fbb8f26de2432b3640ae564d86d55","impliedFormat":99},{"version":"19b93ead49e0aedd2a35a66b331b6c65c4a586ba20198714b5a0907cd33a65a4","signature":"0df35554b36179330b1cad391e9a2bfd2a19c26542e8eab19b588d0a5089ac9f","impliedFormat":99},{"version":"9447b9d1d01c58c77c53b644895c5f4c8c6e56c0d03187a48d4c9da61b983ce9","signature":"e271af985e2231b66158f4563a1a8bce4a3c20177b57ad163298255740bc7265","impliedFormat":99},{"version":"70521b6ab0dcba37539e5303104f29b721bfb2940b2776da4cc818c07e1fefc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"030e350db2525514580ed054f712ffb22d273e6bc7eddc1bb7eda1e0ba5d395e","affectsGlobalScope":true,"impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"21d819c173c0cf7cc3ce57c3276e77fd9a8a01d35a06ad87158781515c9a438a","impliedFormat":1},{"version":"a79e62f1e20467e11a904399b8b18b18c0c6eea6b50c1168bf215356d5bebfaf","affectsGlobalScope":true,"impliedFormat":1},{"version":"8fa51737611c21ba3a5ac02c4e1535741d58bec67c9bdf94b1837a31c97a2263","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","impliedFormat":1},{"version":"5929864ce17fba74232584d90cb721a89b7ad277220627cc97054ba15a98ea8f","impliedFormat":1},{"version":"763fe0f42b3d79b440a9b6e51e9ba3f3f91352469c1e4b3b67bfa4ff6352f3f4","impliedFormat":1},{"version":"25c8056edf4314820382a5fdb4bb7816999acdcb929c8f75e3f39473b87e85bc","impliedFormat":1},{"version":"c464d66b20788266e5353b48dc4aa6bc0dc4a707276df1e7152ab0c9ae21fad8","impliedFormat":1},{"version":"78d0d27c130d35c60b5e5566c9f1e5be77caf39804636bc1a40133919a949f21","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"1d6e127068ea8e104a912e42fc0a110e2aa5a66a356a917a163e8cf9a65e4a75","impliedFormat":1},{"version":"5ded6427296cdf3b9542de4471d2aa8d3983671d4cac0f4bf9c637208d1ced43","impliedFormat":1},{"version":"7f182617db458e98fc18dfb272d40aa2fff3a353c44a89b2c0ccb3937709bfb5","impliedFormat":1},{"version":"cadc8aced301244057c4e7e73fbcae534b0f5b12a37b150d80e5a45aa4bebcbd","impliedFormat":1},{"version":"385aab901643aa54e1c36f5ef3107913b10d1b5bb8cbcd933d4263b80a0d7f20","impliedFormat":1},{"version":"9670d44354bab9d9982eca21945686b5c24a3f893db73c0dae0fd74217a4c219","impliedFormat":1},{"version":"0b8a9268adaf4da35e7fa830c8981cfa22adbbe5b3f6f5ab91f6658899e657a7","impliedFormat":1},{"version":"11396ed8a44c02ab9798b7dca436009f866e8dae3c9c25e8c1fbc396880bf1bb","impliedFormat":1},{"version":"ba7bc87d01492633cb5a0e5da8a4a42a1c86270e7b3d2dea5d156828a84e4882","impliedFormat":1},{"version":"4893a895ea92c85345017a04ed427cbd6a1710453338df26881a6019432febdd","impliedFormat":1},{"version":"c21dc52e277bcfc75fac0436ccb75c204f9e1b3fa5e12729670910639f27343e","impliedFormat":1},{"version":"13f6f39e12b1518c6650bbb220c8985999020fe0f21d818e28f512b7771d00f9","impliedFormat":1},{"version":"9b5369969f6e7175740bf51223112ff209f94ba43ecd3bb09eefff9fd675624a","impliedFormat":1},{"version":"4fe9e626e7164748e8769bbf74b538e09607f07ed17c2f20af8d680ee49fc1da","impliedFormat":1},{"version":"24515859bc0b836719105bb6cc3d68255042a9f02a6022b3187948b204946bd2","impliedFormat":1},{"version":"ea0148f897b45a76544ae179784c95af1bd6721b8610af9ffa467a518a086a43","impliedFormat":1},{"version":"24c6a117721e606c9984335f71711877293a9651e44f59f3d21c1ea0856f9cc9","impliedFormat":1},{"version":"dd3273ead9fbde62a72949c97dbec2247ea08e0c6952e701a483d74ef92d6a17","impliedFormat":1},{"version":"405822be75ad3e4d162e07439bac80c6bcc6dbae1929e179cf467ec0b9ee4e2e","impliedFormat":1},{"version":"0db18c6e78ea846316c012478888f33c11ffadab9efd1cc8bcc12daded7a60b6","impliedFormat":1},{"version":"e61be3f894b41b7baa1fbd6a66893f2579bfad01d208b4ff61daef21493ef0a8","impliedFormat":1},{"version":"bd0532fd6556073727d28da0edfd1736417a3f9f394877b6d5ef6ad88fba1d1a","impliedFormat":1},{"version":"89167d696a849fce5ca508032aabfe901c0868f833a8625d5a9c6e861ef935d2","impliedFormat":1},{"version":"615ba88d0128ed16bf83ef8ccbb6aff05c3ee2db1cc0f89ab50a4939bfc1943f","impliedFormat":1},{"version":"a4d551dbf8746780194d550c88f26cf937caf8d56f102969a110cfaed4b06656","impliedFormat":1},{"version":"8bd86b8e8f6a6aa6c49b71e14c4ffe1211a0e97c80f08d2c8cc98838006e4b88","impliedFormat":1},{"version":"317e63deeb21ac07f3992f5b50cdca8338f10acd4fbb7257ebf56735bf52ab00","impliedFormat":1},{"version":"4732aec92b20fb28c5fe9ad99521fb59974289ed1e45aecb282616202184064f","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"bf67d53d168abc1298888693338cb82854bdb2e69ef83f8a0092093c2d562107","impliedFormat":1},{"version":"d2bc987ae352271d0d615a420dcf98cc886aa16b87fb2b569358c1fe0ca0773d","affectsGlobalScope":true,"impliedFormat":1},{"version":"4f0539c58717cbc8b73acb29f9e992ab5ff20adba5f9b57130691c7f9b186a4d","impliedFormat":1},{"version":"7394959e5a741b185456e1ef5d64599c36c60a323207450991e7a42e08911419","impliedFormat":1},{"version":"76103716ba397bbb61f9fa9c9090dca59f39f9047cb1352b2179c5d8e7f4e8d0","impliedFormat":1},{"version":"f9677e434b7a3b14f0a9367f9dfa1227dfe3ee661792d0085523c3191ae6a1a4","affectsGlobalScope":true,"impliedFormat":1},{"version":"4314c7a11517e221f7296b46547dbc4df047115b182f544d072bdccffa57fc72","impliedFormat":1},{"version":"115971d64632ea4742b5b115fb64ed04bcaae2c3c342f13d9ba7e3f9ee39c4e7","impliedFormat":1},{"version":"c2510f124c0293ab80b1777c44d80f812b75612f297b9857406468c0f4dafe29","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"9057f224b79846e3a95baf6dad2c8103278de2b0c5eebda23fc8188171ad2398","affectsGlobalScope":true,"impliedFormat":1},{"version":"19d5f8d3930e9f99aa2c36258bf95abbe5adf7e889e6181872d1cdba7c9a7dd5","impliedFormat":1},{"version":"e6f5a38687bebe43a4cef426b69d34373ef68be9a6b1538ec0a371e69f309354","impliedFormat":1},{"version":"a6bf63d17324010ca1fbf0389cab83f93389bb0b9a01dc8a346d092f65b3605f","impliedFormat":1},{"version":"e009777bef4b023a999b2e5b9a136ff2cde37dc3f77c744a02840f05b18be8ff","impliedFormat":1},{"version":"1e0d1f8b0adfa0b0330e028c7941b5a98c08b600efe7f14d2d2a00854fb2f393","impliedFormat":1},{"version":"ee1ee365d88c4c6c0c0a5a5701d66ebc27ccd0bcfcfaa482c6e2e7fe7b98edf7","affectsGlobalScope":true,"impliedFormat":1},{"version":"88bc59b32d0d5b4e5d9632ac38edea23454057e643684c3c0b94511296f2998c","affectsGlobalScope":true,"impliedFormat":1},{"version":"e0476e6b51a47a8eaf5ee6ecab0d686f066f3081de9a572f1dde3b2a8a7fb055","impliedFormat":1},{"version":"1e289f30a48126935a5d408a91129a13a59c9b0f8c007a816f9f16ef821e144e","impliedFormat":1},{"version":"f96a023e442f02cf551b4cfe435805ccb0a7e13c81619d4da61ec835d03fe512","impliedFormat":1},{"version":"5135bdd72cc05a8192bd2e92f0914d7fc43ee077d1293dc622a049b7035a0afb","impliedFormat":1},{"version":"528b62e4272e3ddfb50e8eed9e359dedea0a4d171c3eb8f337f4892aac37b24b","impliedFormat":1},{"version":"6d386bc0d7f3afa1d401afc3e00ed6b09205a354a9795196caed937494a713e6","impliedFormat":1},{"version":"5b2e73adcb25865d31c21accdc8f82de1eaded23c6f73230e474df156942380e","affectsGlobalScope":true,"impliedFormat":1},{"version":"23459c1915878a7c1e86e8bdb9c187cddd3aea105b8b1dfce512f093c969bc7e","impliedFormat":1},{"version":"b1b6ee0d012aeebe11d776a155d8979730440082797695fc8e2a5c326285678f","impliedFormat":1},{"version":"45875bcae57270aeb3ebc73a5e3fb4c7b9d91d6b045f107c1d8513c28ece71c0","impliedFormat":1},{"version":"1dc73f8854e5c4506131c4d95b3a6c24d0c80336d3758e95110f4c7b5cb16397","affectsGlobalScope":true,"impliedFormat":1},{"version":"64ede330464b9fd5d35327c32dd2770e7474127ed09769655ebce70992af5f44","affectsGlobalScope":true,"impliedFormat":1},{"version":"3f16a7e4deafa527ed9995a772bb380eb7d3c2c0fd4ae178c5263ed18394db2c","impliedFormat":1},{"version":"c6b4e0a02545304935ecbf7de7a8e056a31bb50939b5b321c9d50a405b5a0bba","impliedFormat":1},{"version":"fab29e6d649aa074a6b91e3bdf2bff484934a46067f6ee97a30fcd9762ae2213","impliedFormat":1},{"version":"8145e07aad6da5f23f2fcd8c8e4c5c13fb26ee986a79d03b0829b8fce152d8b2","impliedFormat":1},{"version":"e1120271ebbc9952fdc7b2dd3e145560e52e06956345e6fdf91d70ca4886464f","impliedFormat":1},{"version":"814118df420c4e38fe5ae1b9a3bafb6e9c2aa40838e528cde908381867be6466","impliedFormat":1},{"version":"bcd0418abb8a5c9fe7db36a96ca75fc78455b0efab270ee89b8e49916eac5174","impliedFormat":1},{"version":"c878f74b6d10b267f6075c51ac1d8becd15b4aa6a58f79c0cfe3b24908357f60","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"fbf68fc8057932b1c30107ebc37420f8d8dc4bef1253c4c2f9e141886c0df5ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"2754d8221d77c7b382096651925eb476f1066b3348da4b73fe71ced7801edada","impliedFormat":1},{"version":"7d8b16d7f33d5081beac7a657a6d13f11a72cf094cc5e37cda1b9d8c89371951","affectsGlobalScope":true,"impliedFormat":1},{"version":"f0be1b8078cd549d91f37c30c222c2a187ac1cf981d994fb476a1adc61387b14","affectsGlobalScope":true,"impliedFormat":1},{"version":"0aaed1d72199b01234152f7a60046bc947f1f37d78d182e9ae09c4289e06a592","impliedFormat":1},{"version":"5360a27d3ebca11b224d7d3e38e3e2c63f8290cb1fcf6c3610401898f8e68bc3","impliedFormat":1},{"version":"66ba1b2c3e3a3644a1011cd530fb444a96b1b2dfe2f5e837a002d41a1a799e60","impliedFormat":1},{"version":"7e514f5b852fdbc166b539fdd1f4e9114f29911592a5eb10a94bb3a13ccac3c4","impliedFormat":1},{"version":"7d6ff413e198d25639f9f01f16673e7df4e4bd2875a42455afd4ecc02ef156da","affectsGlobalScope":true,"impliedFormat":1},{"version":"217941ef5c6fd81b77cd0073c94019a98e20777eaac6c4326156bf6b021ed547","affectsGlobalScope":true,"impliedFormat":1},{"version":"f689c4237b70ae6be5f0e4180e8833f34ace40529d1acc0676ab8fb8f70457d7","impliedFormat":1},{"version":"b02784111b3fc9c38590cd4339ff8718f9329a6f4d3fd66e9744a1dcd1d7e191","impliedFormat":1},{"version":"ac5ed35e649cdd8143131964336ab9076937fa91802ec760b3ea63b59175c10a","impliedFormat":1},{"version":"63b05afa6121657f25e99e1519596b0826cda026f09372c9100dfe21417f4bd6","affectsGlobalScope":true,"impliedFormat":1},{"version":"78dc0513cc4f1642906b74dda42146bcbd9df7401717d6e89ea6d72d12ecb539","impliedFormat":1},{"version":"ad90122e1cb599b3bc06a11710eb5489101be678f2920f2322b0ac3e195af78d","impliedFormat":1}],"root":[93,94],"options":{"composite":true,"declaration":true,"declarationMap":true,"emitDeclarationOnly":false,"importHelpers":true,"module":199,"noFallthroughCasesInSwitch":true,"noImplicitOverride":true,"noImplicitReturns":true,"outDir":"./","skipLibCheck":true,"strict":true,"tsBuildInfoFile":"./tsconfig.lib.tsbuildinfo"},"referencedMap":[[140,1],[141,1],[142,2],[100,3],[143,4],[144,5],[145,6],[95,7],[98,8],[96,7],[97,7],[146,9],[147,10],[148,11],[149,12],[150,13],[151,14],[152,14],[154,15],[153,16],[155,17],[156,18],[157,19],[139,20],[99,7],[158,21],[159,22],[160,23],[193,24],[161,25],[162,26],[163,27],[164,28],[165,29],[166,30],[167,31],[168,32],[169,33],[170,34],[171,34],[172,35],[173,7],[174,7],[175,36],[177,37],[176,38],[178,39],[179,40],[180,41],[181,42],[182,43],[183,44],[184,45],[185,46],[186,47],[187,48],[188,49],[189,50],[190,51],[191,52],[192,53],[101,7],[84,54],[83,7],[80,7],[81,7],[15,7],[13,7],[14,7],[19,7],[18,7],[2,7],[20,7],[21,7],[22,7],[23,7],[24,7],[25,7],[26,7],[27,7],[3,7],[28,7],[29,7],[4,7],[30,7],[34,7],[31,7],[32,7],[33,7],[35,7],[36,7],[37,7],[5,7],[38,7],[39,7],[40,7],[41,7],[6,7],[45,7],[42,7],[43,7],[44,7],[46,7],[7,7],[47,7],[52,7],[53,7],[48,7],[49,7],[50,7],[51,7],[8,7],[57,7],[54,7],[55,7],[56,7],[58,7],[9,7],[59,7],[60,7],[61,7],[63,7],[62,7],[64,7],[65,7],[10,7],[66,7],[67,7],[68,7],[11,7],[69,7],[70,7],[71,7],[72,7],[73,7],[1,7],[74,7],[75,7],[12,7],[78,7],[77,7],[82,7],[76,7],[79,7],[17,7],[16,7],[117,55],[127,56],[116,55],[137,57],[108,58],[107,59],[136,60],[130,61],[135,62],[110,63],[124,64],[109,65],[133,66],[105,67],[104,60],[134,68],[106,69],[111,70],[112,7],[115,70],[102,7],[138,71],[128,72],[119,73],[120,74],[122,75],[118,76],[121,77],[131,60],[113,78],[114,79],[123,80],[103,81],[126,72],[125,70],[129,7],[132,82],[94,83],[93,84],[92,85],[85,7],[91,86],[89,7],[90,87],[88,88],[86,7],[87,7]],"latestChangedDtsFile":"./src/index.d.ts","version":"5.7.3"}
@@ -0,0 +1,28 @@
1
+ /*
2
+ * Copyright (c) 2025 Ping Identity Corporation. All rights reserved.
3
+ *
4
+ * This software may be modified and distributed under the terms
5
+ * of the MIT license. See the LICENSE file for details.
6
+ */
7
+ import baseConfig from '../../../eslint.config.mjs';
8
+
9
+ export default [
10
+ ...baseConfig,
11
+ {
12
+ files: ['**/*.json'],
13
+ rules: {
14
+ '@nx/dependency-checks': [
15
+ 'error',
16
+ {
17
+ ignoredFiles: [
18
+ '{projectRoot}/eslint.config.{js,cjs,mjs}',
19
+ '{projectRoot}/vite.config.{js,ts,mjs,mts}',
20
+ ],
21
+ },
22
+ ],
23
+ },
24
+ languageOptions: {
25
+ parser: await import('jsonc-eslint-parser'),
26
+ },
27
+ },
28
+ ];
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@forgerock/storage",
3
+ "version": "0.0.0-beta-20250506165419",
4
+ "private": false,
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/ForgeRock/ping-javascript-sdk.git",
8
+ "directory": "packages/sdk-effects/storage"
9
+ },
10
+ "type": "module",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./dist/src/index.d.ts",
14
+ "import": "./dist/src/index.js",
15
+ "default": "./dist/src/index.js"
16
+ },
17
+ "./package.json": "./package.json"
18
+ },
19
+ "main": "./dist/src/index.js",
20
+ "module": "./dist/src/index.js",
21
+ "types": "./dist/src/index.d.ts",
22
+ "dependencies": {
23
+ "@forgerock/sdk-types": "0.0.0-beta-20250506165419"
24
+ },
25
+ "nx": {
26
+ "tags": [
27
+ "scope:sdk-effects"
28
+ ]
29
+ }
30
+ }
package/src/index.ts ADDED
@@ -0,0 +1,7 @@
1
+ /*
2
+ * Copyright (c) 2025 Ping Identity Corporation. All rights reserved.
3
+ *
4
+ * This software may be modified and distributed under the terms
5
+ * of the MIT license. See the LICENSE file for details.
6
+ */
7
+ export * from './lib/storage.effects.js';
@@ -0,0 +1,302 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ /*
3
+ * Copyright (c) 2025 Ping Identity Corporation. All rights reserved.
4
+ *
5
+ * This software may be modified and distributed under the terms
6
+ * of the MIT license. See the LICENSE file for details.
7
+ */
8
+ import { describe, it, expect, vi, beforeEach, type Mock } from 'vitest';
9
+ import { createStorage, type StorageConfig } from './storage.effects.js';
10
+ import type { CustomStorageObject } from '@forgerock/sdk-types';
11
+
12
+ const localStorageMock = (() => {
13
+ let store: Record<string, string> = {};
14
+ return {
15
+ getItem: vi.fn((key: string) => {
16
+ const value = store[key];
17
+ if (value === undefined || value === null) {
18
+ return Promise.resolve(null);
19
+ }
20
+ return Promise.resolve(value);
21
+ }),
22
+ setItem: vi.fn((key: string, value: any) => {
23
+ const valueIsString = typeof value === 'string';
24
+ store[key] = valueIsString ? value : JSON.stringify(value);
25
+ return Promise.resolve();
26
+ }),
27
+ removeItem: vi.fn((key: string) => {
28
+ delete store[key];
29
+ return Promise.resolve();
30
+ }),
31
+ clear: () => {
32
+ store = {};
33
+ localStorageMock.getItem.mockClear();
34
+ localStorageMock.setItem.mockClear();
35
+ localStorageMock.removeItem.mockClear();
36
+ },
37
+ key: (index: number) => Promise.resolve(Object.keys(store)[index] || null),
38
+ get length() {
39
+ return Object.keys(store).length;
40
+ },
41
+ };
42
+ })();
43
+
44
+ Object.defineProperty(global, 'localStorage', { value: localStorageMock });
45
+
46
+ const sessionStorageMock = (() => {
47
+ let store: Record<string, string> = {};
48
+ return {
49
+ getItem: vi.fn((key: string) => Promise.resolve(store[key] || null)),
50
+ setItem: vi.fn((key: string, value: string) => {
51
+ store[key] = value;
52
+ return Promise.resolve();
53
+ }),
54
+ removeItem: vi.fn((key: string) => {
55
+ delete store[key];
56
+ return Promise.resolve();
57
+ }),
58
+ clear: () => {
59
+ store = {};
60
+ sessionStorageMock.getItem.mockClear();
61
+ sessionStorageMock.setItem.mockClear();
62
+ sessionStorageMock.removeItem.mockClear();
63
+ },
64
+ key: (index: number) => Promise.resolve(Object.keys(store)[index] || null),
65
+ get length() {
66
+ return Object.keys(store).length;
67
+ },
68
+ };
69
+ })();
70
+
71
+ Object.defineProperty(global, 'sessionStorage', { value: sessionStorageMock });
72
+
73
+ const mockCustomStore: CustomStorageObject = {
74
+ get: vi.fn((key: string) => Promise.resolve<string | null>(null)),
75
+ set: vi.fn((key: string, value: unknown) => Promise.resolve()),
76
+ remove: vi.fn((key: string) => Promise.resolve()),
77
+ };
78
+
79
+ describe('storage Effect', () => {
80
+ const storageName = 'MyStorage';
81
+ const baseConfig: Omit<StorageConfig, 'tokenStore'> = {
82
+ storeType: 'localStorage',
83
+ prefix: 'testPrefix',
84
+ };
85
+ const expectedKey = `${baseConfig.prefix}-${storageName}`;
86
+ const testValue = 'testTokenValue';
87
+
88
+ beforeEach(() => {
89
+ localStorageMock.clear();
90
+ sessionStorageMock.clear();
91
+ vi.clearAllMocks();
92
+
93
+ (mockCustomStore.get as Mock).mockResolvedValue(null);
94
+ (mockCustomStore.set as Mock).mockResolvedValue(undefined);
95
+ (mockCustomStore.remove as Mock).mockResolvedValue(undefined);
96
+ });
97
+
98
+ describe('with localStorage', () => {
99
+ const config: StorageConfig = {
100
+ ...baseConfig,
101
+ storeType: 'localStorage',
102
+ };
103
+
104
+ const storageInstance = createStorage(config, storageName);
105
+
106
+ it('should call localStorage.getItem with the correct key and return value', async () => {
107
+ localStorageMock.setItem(expectedKey, JSON.stringify(testValue));
108
+ const result = await storageInstance.get();
109
+ expect(localStorageMock.getItem).toHaveBeenCalledTimes(1);
110
+ expect(localStorageMock.getItem).toHaveBeenCalledWith(expectedKey);
111
+ expect(result).toBe(testValue);
112
+ expect(sessionStorageMock.getItem).not.toHaveBeenCalled();
113
+ expect(mockCustomStore.get).not.toHaveBeenCalled();
114
+ });
115
+
116
+ it('should return null if localStorage.getItem finds no value', async () => {
117
+ const result = await storageInstance.get();
118
+ expect(localStorageMock.getItem).toHaveBeenCalledTimes(1);
119
+ expect(localStorageMock.getItem).toHaveBeenCalledWith(expectedKey);
120
+ expect(result).toBeNull();
121
+ });
122
+
123
+ it('should call localStorage.setItem with the correct key and value', async () => {
124
+ await storageInstance.set(testValue);
125
+ expect(localStorageMock.setItem).toHaveBeenCalledTimes(1);
126
+ expect(localStorageMock.setItem).toHaveBeenCalledWith(expectedKey, JSON.stringify(testValue));
127
+ expect(await localStorageMock.getItem(expectedKey)).toBe(JSON.stringify(testValue));
128
+ expect(sessionStorageMock.setItem).not.toHaveBeenCalled();
129
+ expect(mockCustomStore.set).not.toHaveBeenCalled();
130
+ });
131
+
132
+ it('should stringify objects/arrays when calling localStorage.setItem', async () => {
133
+ const testObject = { a: 1, b: 'test' };
134
+ await storageInstance.set(testObject);
135
+ expect(localStorageMock.setItem).toHaveBeenCalledTimes(1);
136
+ expect(localStorageMock.setItem).toHaveBeenCalledWith(
137
+ expectedKey,
138
+ JSON.stringify(testObject),
139
+ );
140
+ });
141
+
142
+ it('should call localStorage.removeItem with the correct key', async () => {
143
+ localStorageMock.setItem(expectedKey, testValue);
144
+ await storageInstance.remove();
145
+ expect(localStorageMock.removeItem).toHaveBeenCalledTimes(1);
146
+ expect(localStorageMock.removeItem).toHaveBeenCalledWith(expectedKey);
147
+ expect(await localStorageMock.getItem(expectedKey)).toBeNull();
148
+ expect(sessionStorageMock.removeItem).not.toHaveBeenCalled();
149
+ });
150
+
151
+ it('should parse objects/arrays when calling localStorage.getItem', async () => {
152
+ const testObject = { a: 1, b: 'test' };
153
+ storageInstance.set(testObject);
154
+
155
+ const result = await storageInstance.get();
156
+ console.log(result);
157
+
158
+ expect(localStorageMock.getItem).toHaveBeenCalledTimes(1);
159
+ expect(localStorageMock.getItem).toHaveBeenCalledWith(expectedKey);
160
+ // expect(result).toEqual(testObject);
161
+ // expect(mockCustomStore.remove).not.toHaveBeenCalled();
162
+ });
163
+ });
164
+
165
+ describe('with sessionStorage', () => {
166
+ const config: StorageConfig = {
167
+ ...baseConfig,
168
+ storeType: 'sessionStorage',
169
+ };
170
+ const storageName = 'MyStorage';
171
+ const storageInstance = createStorage(config, storageName);
172
+
173
+ it('should call sessionStorage.getItem with the correct key and return value', async () => {
174
+ sessionStorageMock.setItem(expectedKey, JSON.stringify(testValue));
175
+ const result = await storageInstance.get();
176
+ expect(sessionStorageMock.getItem).toHaveBeenCalledTimes(1);
177
+ expect(sessionStorageMock.getItem).toHaveBeenCalledWith(expectedKey);
178
+ expect(result).toEqual(testValue);
179
+ expect(localStorageMock.getItem).not.toHaveBeenCalled();
180
+ expect(mockCustomStore.get).not.toHaveBeenCalled();
181
+ });
182
+
183
+ it('should return null if sessionStorage.getItem finds no value', async () => {
184
+ const result = await storageInstance.get();
185
+ expect(sessionStorageMock.getItem).toHaveBeenCalledTimes(1);
186
+ expect(sessionStorageMock.getItem).toHaveBeenCalledWith(expectedKey);
187
+ expect(result).toBeNull();
188
+ });
189
+ it('should return parsed value if sessionStorage.getItem returns object or array', async () => {
190
+ const obj = { tokens: 123 };
191
+ await storageInstance.set(obj);
192
+ const result = await storageInstance.get();
193
+ if (!result) {
194
+ // we should not hit this expect
195
+ expect(false).toBe(true);
196
+ }
197
+ expect(result).toStrictEqual(obj);
198
+ expect(sessionStorageMock.getItem).toHaveBeenCalledTimes(1);
199
+ expect(sessionStorageMock.getItem).toHaveBeenCalledWith(expectedKey);
200
+ });
201
+ it('should call sessionStorage.setItem with the correct key and value', async () => {
202
+ await storageInstance.set(testValue);
203
+ expect(sessionStorageMock.setItem).toHaveBeenCalledTimes(1);
204
+ expect(sessionStorageMock.setItem).toHaveBeenCalledWith(expectedKey, testValue);
205
+ expect(await sessionStorageMock.getItem(expectedKey)).toBe(testValue);
206
+ expect(localStorageMock.setItem).not.toHaveBeenCalled();
207
+ expect(mockCustomStore.set).not.toHaveBeenCalled();
208
+ });
209
+ it('should call sessionStorage.setItem with the correct key and value', async () => {
210
+ const obj = { tokens: 123 };
211
+ await storageInstance.set(obj);
212
+ expect(sessionStorageMock.setItem).toHaveBeenCalledTimes(1);
213
+ expect(sessionStorageMock.setItem).toHaveBeenCalledWith(expectedKey, JSON.stringify(obj));
214
+ expect(await sessionStorageMock.getItem(expectedKey)).toBe(JSON.stringify(obj));
215
+ expect(localStorageMock.setItem).not.toHaveBeenCalled();
216
+ expect(mockCustomStore.set).not.toHaveBeenCalled();
217
+ });
218
+ it('should call sessionStorage.removeItem with the correct key', async () => {
219
+ await storageInstance.remove();
220
+ expect(sessionStorageMock.removeItem).toHaveBeenCalledTimes(1);
221
+ expect(sessionStorageMock.removeItem).toHaveBeenCalledWith(expectedKey);
222
+ expect(await sessionStorageMock.getItem(expectedKey)).toBeNull();
223
+ expect(localStorageMock.removeItem).not.toHaveBeenCalled();
224
+ expect(mockCustomStore.remove).not.toHaveBeenCalled();
225
+ });
226
+ });
227
+
228
+ describe('with custom TokenStoreObject', () => {
229
+ const config: StorageConfig = {
230
+ ...baseConfig,
231
+ storeType: 'localStorage',
232
+ };
233
+ const myStorage = 'MyStorage';
234
+ const storageInstance = createStorage(config, myStorage, mockCustomStore);
235
+
236
+ it('should call customStore.get with the correct key and return its value', async () => {
237
+ (mockCustomStore.get as Mock).mockResolvedValueOnce(JSON.stringify(testValue));
238
+ const result = await storageInstance.get();
239
+ expect(mockCustomStore.get).toHaveBeenCalledTimes(1);
240
+ expect(mockCustomStore.get).toHaveBeenCalledWith(expectedKey);
241
+ expect(result).toBe(testValue);
242
+ expect(localStorageMock.getItem).not.toHaveBeenCalled();
243
+ expect(sessionStorageMock.getItem).not.toHaveBeenCalled();
244
+ });
245
+
246
+ it('should return null if customStore.get returns null', async () => {
247
+ (mockCustomStore.get as Mock).mockResolvedValueOnce(null);
248
+ const result = await storageInstance.get();
249
+ expect(mockCustomStore.get).toHaveBeenCalledTimes(1);
250
+ expect(mockCustomStore.get).toHaveBeenCalledWith(expectedKey);
251
+ });
252
+
253
+ it('should parse JSON strings returned from customStore.get', async () => {
254
+ const testObject = { token: 'abc', user: 'xyz' };
255
+ const jsonString = JSON.stringify(testObject);
256
+ (mockCustomStore.get as Mock).mockResolvedValueOnce(jsonString); // Mock returns JSON string
257
+
258
+ const result = await storageInstance.get();
259
+
260
+ expect(mockCustomStore.get).toHaveBeenCalledTimes(1);
261
+ expect(mockCustomStore.get).toHaveBeenCalledWith(expectedKey);
262
+ expect(result).toEqual(testObject); // Verify it was parsed
263
+ });
264
+
265
+ it('should call customStore.set with the correct key and value', async () => {
266
+ await storageInstance.set(testValue);
267
+ expect(mockCustomStore.set).toHaveBeenCalledTimes(1);
268
+ expect(mockCustomStore.set).toHaveBeenCalledWith(expectedKey, JSON.stringify(testValue));
269
+ expect(localStorageMock.setItem).not.toHaveBeenCalled();
270
+ expect(sessionStorageMock.setItem).not.toHaveBeenCalled();
271
+ });
272
+ it('should call customStore.set with the correct key and value and stringify objects', async () => {
273
+ await storageInstance.set({ test: { tokens: '123' } });
274
+ expect(mockCustomStore.set).toHaveBeenCalledTimes(1);
275
+ expect(mockCustomStore.set).toHaveBeenCalledWith(
276
+ expectedKey,
277
+ JSON.stringify({ test: { tokens: '123' } }),
278
+ );
279
+ expect(localStorageMock.setItem).not.toHaveBeenCalled();
280
+ expect(sessionStorageMock.setItem).not.toHaveBeenCalled();
281
+ });
282
+ it('should call customStore.remove with the correct key', async () => {
283
+ await storageInstance.remove();
284
+ expect(mockCustomStore.remove).toHaveBeenCalledTimes(1);
285
+ expect(mockCustomStore.remove).toHaveBeenCalledWith(expectedKey);
286
+ expect(localStorageMock.removeItem).not.toHaveBeenCalled();
287
+ expect(sessionStorageMock.removeItem).not.toHaveBeenCalled();
288
+ });
289
+ });
290
+
291
+ it('should return a function that returns the storage interface', () => {
292
+ const config: StorageConfig = { ...baseConfig, storeType: 'localStorage' };
293
+ const myStorage = 'MyStorage';
294
+ const storageInterface = createStorage(config, myStorage);
295
+ expect(storageInterface).toHaveProperty('get');
296
+ expect(storageInterface).toHaveProperty('set');
297
+ expect(storageInterface).toHaveProperty('remove');
298
+ expect(typeof storageInterface.get).toBe('function');
299
+ expect(typeof storageInterface.set).toBe('function');
300
+ expect(typeof storageInterface.remove).toBe('function');
301
+ });
302
+ });
@@ -0,0 +1,131 @@
1
+ /*
2
+ * Copyright (c) 2025 Ping Identity Corporation. All rights reserved.
3
+ *
4
+ * This software may be modified and distributed under the terms
5
+ * of the MIT license. See the LICENSE file for details.
6
+ */
7
+ import { CustomStorageObject } from '@forgerock/sdk-types';
8
+
9
+ export interface StorageConfig {
10
+ storeType: CustomStorageObject | 'localStorage' | 'sessionStorage';
11
+ prefix?: string;
12
+ }
13
+
14
+ interface GenericError {
15
+ code?: string | number;
16
+ message: string;
17
+ type:
18
+ | 'argument_error'
19
+ | 'davinci_error'
20
+ | 'internal_error'
21
+ | 'network_error'
22
+ | 'state_error'
23
+ | 'unknown_error';
24
+ }
25
+
26
+ export function createStorage<Value>(
27
+ config: StorageConfig,
28
+ storageName: string,
29
+ customStore?: CustomStorageObject,
30
+ ) {
31
+ const { storeType, prefix = 'pic' } = config;
32
+
33
+ const key = `${prefix}-${storageName}`;
34
+ return {
35
+ get: async function storageGet(): Promise<Value | GenericError | null> {
36
+ if (customStore) {
37
+ const value = await customStore.get(key);
38
+ if (value === null) {
39
+ return value;
40
+ }
41
+ try {
42
+ const parsed = JSON.parse(value);
43
+ return parsed as Value;
44
+ } catch {
45
+ return {
46
+ code: 'Parse_Error',
47
+ message: 'Eror parsing value from provided storage',
48
+ type: 'unknown_error',
49
+ };
50
+ }
51
+ }
52
+ if (storeType === 'sessionStorage') {
53
+ const value = await sessionStorage.getItem(key);
54
+ if (value === null) {
55
+ return value;
56
+ }
57
+ try {
58
+ const parsed = JSON.parse(value);
59
+ return parsed as Value;
60
+ } catch {
61
+ return {
62
+ code: 'Parse_Error',
63
+ message: 'Eror parsing value from session storage',
64
+ type: 'unknown_error',
65
+ };
66
+ }
67
+ }
68
+ const value = await localStorage.getItem(key);
69
+
70
+ if (value === null) {
71
+ return value;
72
+ }
73
+ try {
74
+ const parsed = JSON.parse(value);
75
+ return parsed as Value;
76
+ } catch {
77
+ return {
78
+ code: 'Parse_Error',
79
+ message: 'Eror parsing value from local storage',
80
+ type: 'unknown_error',
81
+ };
82
+ }
83
+ },
84
+ set: async function storageSet(value: Value) {
85
+ const valueToStore = JSON.stringify(value);
86
+ if (customStore) {
87
+ try {
88
+ await customStore.set(key, valueToStore);
89
+ return Promise.resolve();
90
+ } catch {
91
+ return {
92
+ code: 'Storing_Error',
93
+ message: 'Eror storing value in custom storage',
94
+ type: 'unknown_error',
95
+ };
96
+ }
97
+ }
98
+ if (storeType === 'sessionStorage') {
99
+ try {
100
+ await sessionStorage.setItem(key, valueToStore);
101
+ return Promise.resolve();
102
+ } catch {
103
+ return {
104
+ code: 'Storing_Error',
105
+ message: 'Eror storing value in session storage',
106
+ type: 'unknown_error',
107
+ };
108
+ }
109
+ }
110
+ try {
111
+ await localStorage.setItem(key, valueToStore);
112
+ return Promise.resolve();
113
+ } catch {
114
+ return {
115
+ code: 'Storing_Error',
116
+ message: 'Eror storing value in local storage',
117
+ type: 'unknown_error',
118
+ };
119
+ }
120
+ },
121
+ remove: async function storageSet() {
122
+ if (customStore) {
123
+ return await customStore.remove(key);
124
+ }
125
+ if (storeType === 'sessionStorage') {
126
+ return await sessionStorage.removeItem(key);
127
+ }
128
+ return await localStorage.removeItem(key);
129
+ },
130
+ };
131
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,19 @@
1
+ {
2
+ "extends": "../../../tsconfig.base.json",
3
+ "files": [],
4
+ "include": [],
5
+ "references": [
6
+ {
7
+ "path": "../../sdk-types"
8
+ },
9
+ {
10
+ "path": "./tsconfig.lib.json"
11
+ },
12
+ {
13
+ "path": "./tsconfig.spec.json"
14
+ }
15
+ ],
16
+ "nx": {
17
+ "addTypecheckTarget": false
18
+ }
19
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "extends": "../../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "baseUrl": ".",
5
+ "outDir": "dist",
6
+ "tsBuildInfoFile": "dist/tsconfig.lib.tsbuildinfo",
7
+ "emitDeclarationOnly": false,
8
+ "module": "nodenext",
9
+ "moduleResolution": "nodenext",
10
+ "forceConsistentCasingInFileNames": true,
11
+ "strict": true,
12
+ "importHelpers": true,
13
+ "noImplicitOverride": true,
14
+ "noImplicitReturns": true,
15
+ "noFallthroughCasesInSwitch": true,
16
+ "types": ["node"]
17
+ },
18
+ "include": ["src/**/*.ts"],
19
+ "references": [
20
+ {
21
+ "path": "../../sdk-types/tsconfig.lib.json"
22
+ }
23
+ ],
24
+ "exclude": [
25
+ "vite.config.ts",
26
+ "vite.config.mts",
27
+ "vitest.config.ts",
28
+ "vitest.config.mts",
29
+ "src/**/*.test.ts",
30
+ "src/**/*.spec.ts",
31
+ "src/**/*.test.tsx",
32
+ "src/**/*.spec.tsx",
33
+ "src/**/*.test.js",
34
+ "src/**/*.spec.js",
35
+ "src/**/*.test.jsx",
36
+ "src/**/*.spec.jsx"
37
+ ]
38
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "extends": "../../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "./out-tsc/vitest",
5
+ "types": [
6
+ "vitest/globals",
7
+ "vitest/importMeta",
8
+ "vite/client",
9
+ "node",
10
+ "vitest"
11
+ ],
12
+ "module": "nodenext",
13
+ "moduleResolution": "nodenext",
14
+ "forceConsistentCasingInFileNames": true,
15
+ "strict": true,
16
+ "importHelpers": true,
17
+ "noImplicitOverride": true,
18
+ "noImplicitReturns": true,
19
+ "noFallthroughCasesInSwitch": true
20
+ },
21
+ "include": [
22
+ "vite.config.ts",
23
+ "vite.config.mts",
24
+ "vitest.config.ts",
25
+ "vitest.config.mts",
26
+ "src/**/*.test.ts",
27
+ "src/**/*.spec.ts",
28
+ "src/**/*.test.tsx",
29
+ "src/**/*.spec.tsx",
30
+ "src/**/*.test.js",
31
+ "src/**/*.spec.js",
32
+ "src/**/*.test.jsx",
33
+ "src/**/*.spec.jsx",
34
+ "src/**/*.d.ts"
35
+ ],
36
+ "references": [
37
+ {
38
+ "path": "./tsconfig.lib.json"
39
+ }
40
+ ]
41
+ }
package/typedoc.json ADDED
@@ -0,0 +1,4 @@
1
+ {
2
+ "name": "@forgerock/storage",
3
+ "entryPoints": ["src/index.ts"]
4
+ }
package/vite.config.ts ADDED
@@ -0,0 +1,28 @@
1
+ /*
2
+ * Copyright (c) 2025 Ping Identity Corporation. All rights reserved.
3
+ *
4
+ * This software may be modified and distributed under the terms
5
+ * of the MIT license. See the LICENSE file for details.
6
+ */
7
+ import { defineConfig } from 'vite';
8
+
9
+ export default defineConfig(() => ({
10
+ root: __dirname,
11
+ cacheDir: '../../../node_modules/.vite/packages/effects/storage',
12
+ plugins: [],
13
+ // Uncomment this if you are using workers.
14
+ // worker: {
15
+ // plugins: [ nxViteTsPaths() ],
16
+ // },
17
+ test: {
18
+ watch: false,
19
+ globals: true,
20
+ environment: 'node',
21
+ include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
22
+ reporters: ['default'],
23
+ coverage: {
24
+ reportsDirectory: './test-output/vitest/coverage',
25
+ provider: 'v8' as const,
26
+ },
27
+ },
28
+ }));