Skip to content

Commit 73287f9

Browse files
committed
feat: add-oidc-client-and-token-store
1 parent 30fe3c1 commit 73287f9

22 files changed

Lines changed: 315 additions & 37 deletions
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@forgerock/oidc-client': patch
3+
---
4+
5+
adds token-store module to newly created oidc-client for generic oidc interactions.

nx.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
},
7171
"test": {
7272
"inputs": ["default", "^default", "noMarkdown", "^noMarkdown"],
73-
"dependsOn": ["^test", "^build"],
73+
"dependsOn": ["^test", "^build", "^build"],
7474
"outputs": ["{projectRoot}/coverage"],
7575
"cache": true
7676
},

packages/oidc-client/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# oidc-client
2+
3+
A generic OpenID Connect (OIDC) client library for JavaScript and TypeScript, designed to work with any OIDC-compliant identity provider.
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import baseConfig from '../../eslint.config.mjs';
2+
3+
export default [
4+
...baseConfig,
5+
{
6+
files: ['**/*.json'],
7+
rules: {
8+
'@nx/dependency-checks': [
9+
'error',
10+
{
11+
ignoredFiles: [
12+
'{projectRoot}/eslint.config.{js,cjs,mjs}',
13+
'{projectRoot}/vite.config.{js,ts,mjs,mts}',
14+
],
15+
},
16+
],
17+
},
18+
languageOptions: {
19+
parser: await import('jsonc-eslint-parser'),
20+
},
21+
},
22+
];

packages/oidc-client/package.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"name": "@forgerock/oidc-client",
3+
"version": "0.0.1",
4+
"sideEffects": false,
5+
"type": "module",
6+
"exports": {
7+
".": {
8+
"types": "./dist/src/index.d.ts",
9+
"import": "./dist/src/index.js",
10+
"default": "./dist/src/index.js"
11+
},
12+
"./package.json": "./package.json"
13+
},
14+
"main": "./dist/src/index.js",
15+
"module": "./dist/src/index.js",
16+
"types": "./dist/src/index.d.ts",
17+
"scripts": {
18+
"lint": "pnpm nx nxLint",
19+
"test": "pnpm nx nxTest",
20+
"test:watch": "pnpm nx nxTest --watch"
21+
},
22+
"dependencies": {
23+
"@forgerock/sdk-types": "workspace:*",
24+
"@forgerock/storage": "workspace:*"
25+
},
26+
"nx": {
27+
"tags": ["scope:package"]
28+
}
29+
}

packages/oidc-client/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from './lib/token-store.js';
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { describe, expectTypeOf, it } from 'vitest';
2+
import { CustomStorageObject, Tokens } from '@forgerock/sdk-types';
3+
import { GenericError, StorageConfig } from '@forgerock/storage';
4+
import { tokenStore } from './token-store.js';
5+
6+
describe('tokenStore type tests', () => {
7+
const mockTokens: Tokens = {
8+
accessToken: 'test_access_token',
9+
idToken: 'test_id_token',
10+
refreshToken: 'test_refresh',
11+
tokenExpiry: 3600,
12+
};
13+
it('should return a storage object with Tokens type when customStore is not provided', () => {
14+
const storageConfig: StorageConfig = {
15+
storeType: 'sessionStorage',
16+
};
17+
const store = tokenStore(storageConfig);
18+
expectTypeOf<Promise<void | { code: string; message: string; type: string }>>(
19+
store.set(mockTokens),
20+
);
21+
22+
expectTypeOf<Promise<void>>(store.remove());
23+
expectTypeOf<Promise<Tokens | GenericError | null>>(store.get());
24+
const tokens = store.get();
25+
if ('accessToken' in tokens) {
26+
expectTypeOf<Promise<Tokens>>();
27+
}
28+
});
29+
30+
it('should return a storage object with Tokens type when customStore is provided', () => {
31+
const storageConfig: StorageConfig = {
32+
storeType: 'sessionStorage',
33+
};
34+
const customStore: CustomStorageObject = {
35+
get: async (key: string) => {
36+
return key;
37+
},
38+
set: async (key: string, value: any) => {
39+
console.log(key, value);
40+
},
41+
remove: async (key: string) => {
42+
console.log(key);
43+
},
44+
};
45+
const store = tokenStore(storageConfig, customStore);
46+
expectTypeOf<Promise<Tokens | GenericError | null>>(store.get());
47+
expectTypeOf<Promise<void | { code: string; message: string; type: string }>>(
48+
store.set(mockTokens),
49+
);
50+
expectTypeOf<Promise<void>>(store.remove());
51+
});
52+
});
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { vi } from 'vitest';
2+
import { tokenStore } from './token-store.js';
3+
import { createStorage, StorageConfig } from '@forgerock/storage';
4+
5+
vi.mock('@forgerock/storage', () => {
6+
const mockStorage = {
7+
getItem: vi.fn(),
8+
setItem: vi.fn(),
9+
removeItem: vi.fn(),
10+
clear: vi.fn(),
11+
};
12+
13+
return {
14+
createStorage: vi.fn(() => mockStorage),
15+
};
16+
});
17+
18+
describe('tokenStore', () => {
19+
const storageConfig = {
20+
storeType: 'sessionStorage',
21+
} as StorageConfig;
22+
23+
it('should call createStorage with the correct arguments when customStore is not provided', () => {
24+
tokenStore(storageConfig);
25+
expect(createStorage).toHaveBeenCalledWith(storageConfig, 'tokenStore');
26+
});
27+
28+
it('should call createStorage with the correct arguments when customStore is provided', () => {
29+
const customStore = {
30+
get: vi.fn(),
31+
set: vi.fn(),
32+
remove: vi.fn(),
33+
};
34+
35+
tokenStore(storageConfig, customStore);
36+
expect(createStorage).toHaveBeenCalledWith(storageConfig, 'tokenStore', customStore);
37+
});
38+
});
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { CustomStorageObject, Tokens } from '@forgerock/sdk-types';
2+
import { createStorage, StorageConfig } from '@forgerock/storage';
3+
4+
export const tokenStore = (storage: StorageConfig, customStore?: CustomStorageObject) => {
5+
if (customStore) {
6+
return createStorage<Tokens>(storage, 'tokenStore', customStore);
7+
} else {
8+
return createStorage<Tokens>(storage, 'tokenStore');
9+
}
10+
};

packages/oidc-client/tsconfig.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
{
2+
"extends": "../../tsconfig.base.json",
3+
"files": [],
4+
"include": [],
5+
"references": [
6+
{
7+
"path": "../sdk-effects/storage"
8+
},
9+
{
10+
"path": "../sdk-types"
11+
},
12+
{
13+
"path": "./tsconfig.lib.json"
14+
},
15+
{
16+
"path": "./tsconfig.spec.json"
17+
}
18+
],
19+
"nx": {
20+
"addTypecheckTarget": false
21+
}
22+
}

0 commit comments

Comments
 (0)