@logto/browser 2.0.0 → 2.1.1
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/README.md +4 -4
- package/lib/cache.cjs +25 -0
- package/lib/cache.d.ts +10 -0
- package/lib/cache.js +23 -0
- package/lib/cache.test.d.ts +1 -0
- package/lib/index.cjs +20 -1
- package/lib/index.d.ts +9 -2
- package/lib/index.js +11 -3
- package/lib/storage.cjs +15 -9
- package/lib/storage.d.ts +3 -3
- package/lib/storage.js +16 -9
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
# Logto JS
|
|
2
|
-
[](https://www.npmjs.com/package/@logto/browser)
|
|
3
3
|
[](https://github.com/logto-io/js/actions/workflows/main.yml)
|
|
4
4
|
[](https://app.codecov.io/gh/logto-io/js?branch=master)
|
|
5
5
|
|
|
6
|
-
The Logto JavaScript
|
|
6
|
+
The Logto JavaScript Browser SDK written in TypeScript. Check out our [docs](https://docs.logto.io/JavaScript/browser/) for more information.
|
|
7
7
|
|
|
8
8
|
We also provide [文档](https://docs.logto.io/zh-cn/sdk/JavaScript/browser/) in Simplified Chinese.
|
|
9
9
|
|
|
@@ -42,4 +42,4 @@ If Logto does not support your front-end framework and you want to create your o
|
|
|
42
42
|
|
|
43
43
|
[](https://logto.io/)
|
|
44
44
|
[](https://docs.logto.io/sdk/JavaScript/browser/)
|
|
45
|
-
[](https://discord.gg/UEPaF3j5e6)
|
|
45
|
+
[](https://discord.gg/UEPaF3j5e6)
|
package/lib/cache.cjs
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const keyPrefix = `logto_cache`;
|
|
4
|
+
class CacheStorage {
|
|
5
|
+
constructor(appId) {
|
|
6
|
+
this.appId = appId;
|
|
7
|
+
}
|
|
8
|
+
getKey(item) {
|
|
9
|
+
if (item === undefined) {
|
|
10
|
+
return `${keyPrefix}:${this.appId}`;
|
|
11
|
+
}
|
|
12
|
+
return `${keyPrefix}:${this.appId}:${item}`;
|
|
13
|
+
}
|
|
14
|
+
async getItem(key) {
|
|
15
|
+
return sessionStorage.getItem(this.getKey(key));
|
|
16
|
+
}
|
|
17
|
+
async setItem(key, value) {
|
|
18
|
+
sessionStorage.setItem(this.getKey(key), value);
|
|
19
|
+
}
|
|
20
|
+
async removeItem(key) {
|
|
21
|
+
sessionStorage.removeItem(`${this.getKey(key)}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
exports.CacheStorage = CacheStorage;
|
package/lib/cache.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Storage, CacheKey } from '@logto/client';
|
|
2
|
+
import type { Nullable } from '@silverhand/essentials';
|
|
3
|
+
export declare class CacheStorage implements Storage<CacheKey> {
|
|
4
|
+
readonly appId: string;
|
|
5
|
+
constructor(appId: string);
|
|
6
|
+
getKey(item?: string): string;
|
|
7
|
+
getItem(key: CacheKey): Promise<Nullable<string>>;
|
|
8
|
+
setItem(key: CacheKey, value: string): Promise<void>;
|
|
9
|
+
removeItem(key: CacheKey): Promise<void>;
|
|
10
|
+
}
|
package/lib/cache.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
const keyPrefix = `logto_cache`;
|
|
2
|
+
class CacheStorage {
|
|
3
|
+
constructor(appId) {
|
|
4
|
+
this.appId = appId;
|
|
5
|
+
}
|
|
6
|
+
getKey(item) {
|
|
7
|
+
if (item === undefined) {
|
|
8
|
+
return `${keyPrefix}:${this.appId}`;
|
|
9
|
+
}
|
|
10
|
+
return `${keyPrefix}:${this.appId}:${item}`;
|
|
11
|
+
}
|
|
12
|
+
async getItem(key) {
|
|
13
|
+
return sessionStorage.getItem(this.getKey(key));
|
|
14
|
+
}
|
|
15
|
+
async setItem(key, value) {
|
|
16
|
+
sessionStorage.setItem(this.getKey(key), value);
|
|
17
|
+
}
|
|
18
|
+
async removeItem(key) {
|
|
19
|
+
sessionStorage.removeItem(`${this.getKey(key)}`);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export { CacheStorage };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
package/lib/index.cjs
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var BaseClient = require('@logto/client');
|
|
6
|
+
var essentials = require('@silverhand/essentials');
|
|
7
|
+
var cache = require('./cache.cjs');
|
|
6
8
|
var storage = require('./storage.cjs');
|
|
7
9
|
var generators = require('./utils/generators.cjs');
|
|
8
10
|
|
|
@@ -14,12 +16,18 @@ const navigate = (url) => {
|
|
|
14
16
|
window.location.assign(url);
|
|
15
17
|
};
|
|
16
18
|
class LogtoClient extends BaseClient__default.default {
|
|
17
|
-
|
|
19
|
+
/**
|
|
20
|
+
* @param config The configuration object for the client.
|
|
21
|
+
* @param [unstable_enableCache=false] Whether to enable cache for well-known data.
|
|
22
|
+
* Use sessionStorage by default.
|
|
23
|
+
*/
|
|
24
|
+
constructor(config, unstable_enableCache = false) {
|
|
18
25
|
const requester = BaseClient.createRequester(fetch);
|
|
19
26
|
super(config, {
|
|
20
27
|
requester,
|
|
21
28
|
navigate,
|
|
22
29
|
storage: new storage.BrowserStorage(config.appId),
|
|
30
|
+
unstable_cache: essentials.conditional(unstable_enableCache && new cache.CacheStorage(config.appId)),
|
|
23
31
|
generateCodeChallenge: generators.generateCodeChallenge,
|
|
24
32
|
generateCodeVerifier: generators.generateCodeVerifier,
|
|
25
33
|
generateState: generators.generateState,
|
|
@@ -27,6 +35,10 @@ class LogtoClient extends BaseClient__default.default {
|
|
|
27
35
|
}
|
|
28
36
|
}
|
|
29
37
|
|
|
38
|
+
Object.defineProperty(exports, 'BaseClient', {
|
|
39
|
+
enumerable: true,
|
|
40
|
+
get: function () { return BaseClient__default.default; }
|
|
41
|
+
});
|
|
30
42
|
Object.defineProperty(exports, 'LogtoClientError', {
|
|
31
43
|
enumerable: true,
|
|
32
44
|
get: function () { return BaseClient.LogtoClientError; }
|
|
@@ -55,4 +67,11 @@ Object.defineProperty(exports, 'UserScope', {
|
|
|
55
67
|
enumerable: true,
|
|
56
68
|
get: function () { return BaseClient.UserScope; }
|
|
57
69
|
});
|
|
70
|
+
Object.defineProperty(exports, 'createRequester', {
|
|
71
|
+
enumerable: true,
|
|
72
|
+
get: function () { return BaseClient.createRequester; }
|
|
73
|
+
});
|
|
74
|
+
exports.generateCodeChallenge = generators.generateCodeChallenge;
|
|
75
|
+
exports.generateCodeVerifier = generators.generateCodeVerifier;
|
|
76
|
+
exports.generateState = generators.generateState;
|
|
58
77
|
exports.default = LogtoClient;
|
package/lib/index.d.ts
CHANGED
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import type { LogtoConfig } from '@logto/client';
|
|
2
2
|
import BaseClient from '@logto/client';
|
|
3
|
-
export
|
|
3
|
+
export { createRequester, default as BaseClient } from '@logto/client';
|
|
4
|
+
export { generateCodeChallenge, generateCodeVerifier, generateState } from './utils/generators.js';
|
|
5
|
+
export type { IdTokenClaims, LogtoErrorCode, LogtoConfig, LogtoClientErrorCode, UserInfoResponse, InteractionMode, ClientAdapter, } from '@logto/client';
|
|
4
6
|
export { LogtoError, OidcError, Prompt, LogtoRequestError, LogtoClientError, ReservedScope, UserScope, } from '@logto/client';
|
|
5
7
|
export default class LogtoClient extends BaseClient {
|
|
6
|
-
|
|
8
|
+
/**
|
|
9
|
+
* @param config The configuration object for the client.
|
|
10
|
+
* @param [unstable_enableCache=false] Whether to enable cache for well-known data.
|
|
11
|
+
* Use sessionStorage by default.
|
|
12
|
+
*/
|
|
13
|
+
constructor(config: LogtoConfig, unstable_enableCache?: boolean);
|
|
7
14
|
}
|
package/lib/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import BaseClient, { createRequester } from '@logto/client';
|
|
2
|
-
export { LogtoClientError, LogtoError, LogtoRequestError, OidcError, Prompt, ReservedScope, UserScope } from '@logto/client';
|
|
2
|
+
export { default as BaseClient, LogtoClientError, LogtoError, LogtoRequestError, OidcError, Prompt, ReservedScope, UserScope, createRequester } from '@logto/client';
|
|
3
|
+
import { conditional } from '@silverhand/essentials';
|
|
4
|
+
import { CacheStorage } from './cache.js';
|
|
3
5
|
import { BrowserStorage } from './storage.js';
|
|
4
6
|
import { generateCodeChallenge, generateCodeVerifier, generateState } from './utils/generators.js';
|
|
5
7
|
|
|
@@ -7,12 +9,18 @@ const navigate = (url) => {
|
|
|
7
9
|
window.location.assign(url);
|
|
8
10
|
};
|
|
9
11
|
class LogtoClient extends BaseClient {
|
|
10
|
-
|
|
12
|
+
/**
|
|
13
|
+
* @param config The configuration object for the client.
|
|
14
|
+
* @param [unstable_enableCache=false] Whether to enable cache for well-known data.
|
|
15
|
+
* Use sessionStorage by default.
|
|
16
|
+
*/
|
|
17
|
+
constructor(config, unstable_enableCache = false) {
|
|
11
18
|
const requester = createRequester(fetch);
|
|
12
19
|
super(config, {
|
|
13
20
|
requester,
|
|
14
21
|
navigate,
|
|
15
22
|
storage: new BrowserStorage(config.appId),
|
|
23
|
+
unstable_cache: conditional(unstable_enableCache && new CacheStorage(config.appId)),
|
|
16
24
|
generateCodeChallenge,
|
|
17
25
|
generateCodeVerifier,
|
|
18
26
|
generateState,
|
|
@@ -20,4 +28,4 @@ class LogtoClient extends BaseClient {
|
|
|
20
28
|
}
|
|
21
29
|
}
|
|
22
30
|
|
|
23
|
-
export { LogtoClient as default };
|
|
31
|
+
export { LogtoClient as default, generateCodeChallenge, generateCodeVerifier, generateState };
|
package/lib/storage.cjs
CHANGED
|
@@ -1,31 +1,37 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
const
|
|
3
|
+
const keyPrefix = `logto`;
|
|
4
4
|
class BrowserStorage {
|
|
5
5
|
constructor(appId) {
|
|
6
|
-
this.
|
|
6
|
+
this.appId = appId;
|
|
7
|
+
}
|
|
8
|
+
getKey(item) {
|
|
9
|
+
if (item === undefined) {
|
|
10
|
+
return `${keyPrefix}:${this.appId}`;
|
|
11
|
+
}
|
|
12
|
+
return `${keyPrefix}:${this.appId}:${item}`;
|
|
7
13
|
}
|
|
8
14
|
async getItem(key) {
|
|
9
15
|
if (key === 'signInSession') {
|
|
10
|
-
|
|
16
|
+
// The latter `getItem()` is for backward compatibility. Can be removed when major bump.
|
|
17
|
+
return sessionStorage.getItem(this.getKey(key)) ?? sessionStorage.getItem(this.getKey());
|
|
11
18
|
}
|
|
12
|
-
return localStorage.getItem(
|
|
19
|
+
return localStorage.getItem(this.getKey(key));
|
|
13
20
|
}
|
|
14
21
|
async setItem(key, value) {
|
|
15
22
|
if (key === 'signInSession') {
|
|
16
|
-
sessionStorage.setItem(this.
|
|
23
|
+
sessionStorage.setItem(this.getKey(key), value);
|
|
17
24
|
return;
|
|
18
25
|
}
|
|
19
|
-
localStorage.setItem(
|
|
26
|
+
localStorage.setItem(this.getKey(key), value);
|
|
20
27
|
}
|
|
21
28
|
async removeItem(key) {
|
|
22
29
|
if (key === 'signInSession') {
|
|
23
|
-
sessionStorage.removeItem(this.
|
|
30
|
+
sessionStorage.removeItem(this.getKey(key));
|
|
24
31
|
return;
|
|
25
32
|
}
|
|
26
|
-
localStorage.removeItem(
|
|
33
|
+
localStorage.removeItem(this.getKey(key));
|
|
27
34
|
}
|
|
28
35
|
}
|
|
29
36
|
|
|
30
37
|
exports.BrowserStorage = BrowserStorage;
|
|
31
|
-
exports.logtoStorageItemKeyPrefix = logtoStorageItemKeyPrefix;
|
package/lib/storage.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { Storage, StorageKey } from '@logto/client';
|
|
2
2
|
import type { Nullable } from '@silverhand/essentials';
|
|
3
|
-
export declare
|
|
4
|
-
|
|
5
|
-
private readonly storageKey;
|
|
3
|
+
export declare class BrowserStorage implements Storage<StorageKey> {
|
|
4
|
+
readonly appId: string;
|
|
6
5
|
constructor(appId: string);
|
|
6
|
+
getKey(item?: string): string;
|
|
7
7
|
getItem(key: StorageKey): Promise<Nullable<string>>;
|
|
8
8
|
setItem(key: StorageKey, value: string): Promise<void>;
|
|
9
9
|
removeItem(key: StorageKey): Promise<void>;
|
package/lib/storage.js
CHANGED
|
@@ -1,28 +1,35 @@
|
|
|
1
|
-
const
|
|
1
|
+
const keyPrefix = `logto`;
|
|
2
2
|
class BrowserStorage {
|
|
3
3
|
constructor(appId) {
|
|
4
|
-
this.
|
|
4
|
+
this.appId = appId;
|
|
5
|
+
}
|
|
6
|
+
getKey(item) {
|
|
7
|
+
if (item === undefined) {
|
|
8
|
+
return `${keyPrefix}:${this.appId}`;
|
|
9
|
+
}
|
|
10
|
+
return `${keyPrefix}:${this.appId}:${item}`;
|
|
5
11
|
}
|
|
6
12
|
async getItem(key) {
|
|
7
13
|
if (key === 'signInSession') {
|
|
8
|
-
|
|
14
|
+
// The latter `getItem()` is for backward compatibility. Can be removed when major bump.
|
|
15
|
+
return sessionStorage.getItem(this.getKey(key)) ?? sessionStorage.getItem(this.getKey());
|
|
9
16
|
}
|
|
10
|
-
return localStorage.getItem(
|
|
17
|
+
return localStorage.getItem(this.getKey(key));
|
|
11
18
|
}
|
|
12
19
|
async setItem(key, value) {
|
|
13
20
|
if (key === 'signInSession') {
|
|
14
|
-
sessionStorage.setItem(this.
|
|
21
|
+
sessionStorage.setItem(this.getKey(key), value);
|
|
15
22
|
return;
|
|
16
23
|
}
|
|
17
|
-
localStorage.setItem(
|
|
24
|
+
localStorage.setItem(this.getKey(key), value);
|
|
18
25
|
}
|
|
19
26
|
async removeItem(key) {
|
|
20
27
|
if (key === 'signInSession') {
|
|
21
|
-
sessionStorage.removeItem(this.
|
|
28
|
+
sessionStorage.removeItem(this.getKey(key));
|
|
22
29
|
return;
|
|
23
30
|
}
|
|
24
|
-
localStorage.removeItem(
|
|
31
|
+
localStorage.removeItem(this.getKey(key));
|
|
25
32
|
}
|
|
26
33
|
}
|
|
27
34
|
|
|
28
|
-
export { BrowserStorage
|
|
35
|
+
export { BrowserStorage };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@logto/browser",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./lib/index.cjs",
|
|
6
6
|
"module": "./lib/index.js",
|
|
@@ -21,22 +21,22 @@
|
|
|
21
21
|
"directory": "packages/browser"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@logto/client": "^2.
|
|
24
|
+
"@logto/client": "^2.2.2",
|
|
25
25
|
"@silverhand/essentials": "^2.6.2",
|
|
26
26
|
"js-base64": "^3.7.4"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
|
-
"@silverhand/eslint-config": "^
|
|
30
|
-
"@silverhand/ts-config": "^
|
|
29
|
+
"@silverhand/eslint-config": "^4.0.1",
|
|
30
|
+
"@silverhand/ts-config": "^4.0.0",
|
|
31
31
|
"@swc/core": "^1.3.50",
|
|
32
32
|
"@swc/jest": "^0.2.24",
|
|
33
33
|
"@types/jest": "^29.5.0",
|
|
34
|
-
"eslint": "^8.
|
|
34
|
+
"eslint": "^8.44.0",
|
|
35
35
|
"jest": "^29.5.0",
|
|
36
36
|
"jest-environment-jsdom": "^29.5.0",
|
|
37
37
|
"jest-matcher-specific-error": "^1.0.0",
|
|
38
38
|
"lint-staged": "^13.0.0",
|
|
39
|
-
"prettier": "^
|
|
39
|
+
"prettier": "^3.0.0",
|
|
40
40
|
"text-encoder": "^0.0.4",
|
|
41
41
|
"typescript": "^5.0.0"
|
|
42
42
|
},
|