@logto/browser 1.1.0 → 1.1.2

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/lib/index.d.ts CHANGED
@@ -1,8 +1,7 @@
1
- import BaseClient, { LogtoConfig } from "@logto/client";
1
+ import type { LogtoConfig } from '@logto/client';
2
+ import BaseClient from '@logto/client';
2
3
  export type { IdTokenClaims, LogtoErrorCode, LogtoConfig, LogtoClientErrorCode, UserInfoResponse, InteractionMode, } from '@logto/client';
3
4
  export { LogtoError, OidcError, Prompt, LogtoRequestError, LogtoClientError, ReservedScope, UserScope, } from '@logto/client';
4
5
  export default class LogtoClient extends BaseClient {
5
6
  constructor(config: LogtoConfig);
6
7
  }
7
-
8
- //# sourceMappingURL=index.d.ts.map
package/lib/index.js CHANGED
@@ -1,90 +1,58 @@
1
- var $2FOI4$logtoclient = require("@logto/client");
2
- var $2FOI4$jsbase64 = require("js-base64");
1
+ 'use strict';
3
2
 
4
- function $parcel$interopDefault(a) {
5
- return a && a.__esModule ? a.default : a;
6
- }
7
- function $parcel$defineInteropFlag(a) {
8
- Object.defineProperty(a, '__esModule', {value: true, configurable: true});
9
- }
10
- function $parcel$export(e, n, v, s) {
11
- Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
12
- }
3
+ Object.defineProperty(exports, '__esModule', { value: true });
13
4
 
14
- $parcel$defineInteropFlag(module.exports);
5
+ var BaseClient = require('@logto/client');
6
+ var storage = require('./storage.js');
7
+ var generators = require('./utils/generators.js');
15
8
 
16
- $parcel$export(module.exports, "default", () => $5a30d9203b683831$export$2e2bcd8739ae039);
17
- $parcel$export(module.exports, "LogtoError", () => $5a30d9203b683831$re_export$LogtoError);
18
- $parcel$export(module.exports, "OidcError", () => $5a30d9203b683831$re_export$OidcError);
19
- $parcel$export(module.exports, "Prompt", () => $5a30d9203b683831$re_export$Prompt);
20
- $parcel$export(module.exports, "LogtoRequestError", () => $5a30d9203b683831$re_export$LogtoRequestError);
21
- $parcel$export(module.exports, "LogtoClientError", () => $5a30d9203b683831$re_export$LogtoClientError);
22
- $parcel$export(module.exports, "ReservedScope", () => $5a30d9203b683831$re_export$ReservedScope);
23
- $parcel$export(module.exports, "UserScope", () => $5a30d9203b683831$re_export$UserScope);
9
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
24
10
 
25
- const $5be5fc3fe8f0a1d3$export$9b5c2da5fe7b4b2b = `logto`;
26
- class $5be5fc3fe8f0a1d3$export$2baa60fa09b100be {
27
- constructor(appId){
28
- this.storageKey = `${$5be5fc3fe8f0a1d3$export$9b5c2da5fe7b4b2b}:${appId}`;
29
- }
30
- async getItem(key) {
31
- if (key === "signInSession") return sessionStorage.getItem(this.storageKey);
32
- return localStorage.getItem(`${this.storageKey}:${key}`);
33
- }
34
- async setItem(key, value) {
35
- if (key === "signInSession") {
36
- sessionStorage.setItem(this.storageKey, value);
37
- return;
38
- }
39
- localStorage.setItem(`${this.storageKey}:${key}`, value);
40
- }
41
- async removeItem(key) {
42
- if (key === "signInSession") {
43
- sessionStorage.removeItem(this.storageKey);
44
- return;
45
- }
46
- localStorage.removeItem(`${this.storageKey}:${key}`);
47
- }
48
- }
11
+ var BaseClient__default = /*#__PURE__*/_interopDefault(BaseClient);
49
12
 
50
-
51
- /** @link [Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636) */
52
-
53
- /**
54
- * @param length The length of the raw random data.
55
- */ const $baeb4f3d786047ef$var$generateRandomString = (length = 64)=>(0, $2FOI4$jsbase64.fromUint8Array)(crypto.getRandomValues(new Uint8Array(length)), true);
56
- const $baeb4f3d786047ef$export$9ccd2716e53a229b = ()=>$baeb4f3d786047ef$var$generateRandomString();
57
- const $baeb4f3d786047ef$export$cf1891f923f5943a = ()=>$baeb4f3d786047ef$var$generateRandomString();
58
- const $baeb4f3d786047ef$export$414b01b1f867308a = async (codeVerifier)=>{
59
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
60
- if (crypto.subtle === undefined) /**
61
- * `crypto.subtle` is available only in secure contexts (HTTPS) in some or all supporting browsers,
62
- * https://developer.mozilla.org/en-US/docs/Web/API/Crypto/subtle
63
- * https://www.chromium.org/blink/webcrypto/#accessing-it
64
- */ throw new (0, $2FOI4$logtoclient.LogtoError)("crypto_subtle_unavailable");
65
- const encodedCodeVerifier = new TextEncoder().encode(codeVerifier);
66
- const codeChallenge = new Uint8Array(await crypto.subtle.digest("SHA-256", encodedCodeVerifier));
67
- return (0, $2FOI4$jsbase64.fromUint8Array)(codeChallenge, true);
68
- };
69
-
70
-
71
-
72
- const $5a30d9203b683831$var$navigate = (url)=>{
13
+ const navigate = (url) => {
73
14
  window.location.assign(url);
74
15
  };
75
- class $5a30d9203b683831$export$2e2bcd8739ae039 extends (0, ($parcel$interopDefault($2FOI4$logtoclient))) {
76
- constructor(config){
77
- const requester = (0, $2FOI4$logtoclient.createRequester)(fetch);
16
+ class LogtoClient extends BaseClient__default.default {
17
+ constructor(config) {
18
+ const requester = BaseClient.createRequester(fetch);
78
19
  super(config, {
79
- requester: requester,
80
- navigate: $5a30d9203b683831$var$navigate,
81
- storage: new (0, $5be5fc3fe8f0a1d3$export$2baa60fa09b100be)(config.appId),
82
- generateCodeChallenge: $baeb4f3d786047ef$export$414b01b1f867308a,
83
- generateCodeVerifier: $baeb4f3d786047ef$export$cf1891f923f5943a,
84
- generateState: $baeb4f3d786047ef$export$9ccd2716e53a229b
20
+ requester,
21
+ navigate,
22
+ storage: new storage.BrowserStorage(config.appId),
23
+ generateCodeChallenge: generators.generateCodeChallenge,
24
+ generateCodeVerifier: generators.generateCodeVerifier,
25
+ generateState: generators.generateState,
85
26
  });
86
27
  }
87
28
  }
88
29
 
89
-
90
- //# sourceMappingURL=index.js.map
30
+ Object.defineProperty(exports, 'LogtoClientError', {
31
+ enumerable: true,
32
+ get: function () { return BaseClient.LogtoClientError; }
33
+ });
34
+ Object.defineProperty(exports, 'LogtoError', {
35
+ enumerable: true,
36
+ get: function () { return BaseClient.LogtoError; }
37
+ });
38
+ Object.defineProperty(exports, 'LogtoRequestError', {
39
+ enumerable: true,
40
+ get: function () { return BaseClient.LogtoRequestError; }
41
+ });
42
+ Object.defineProperty(exports, 'OidcError', {
43
+ enumerable: true,
44
+ get: function () { return BaseClient.OidcError; }
45
+ });
46
+ Object.defineProperty(exports, 'Prompt', {
47
+ enumerable: true,
48
+ get: function () { return BaseClient.Prompt; }
49
+ });
50
+ Object.defineProperty(exports, 'ReservedScope', {
51
+ enumerable: true,
52
+ get: function () { return BaseClient.ReservedScope; }
53
+ });
54
+ Object.defineProperty(exports, 'UserScope', {
55
+ enumerable: true,
56
+ get: function () { return BaseClient.UserScope; }
57
+ });
58
+ exports.default = LogtoClient;
package/lib/index.mjs ADDED
@@ -0,0 +1,23 @@
1
+ import BaseClient, { createRequester } from '@logto/client';
2
+ export { LogtoClientError, LogtoError, LogtoRequestError, OidcError, Prompt, ReservedScope, UserScope } from '@logto/client';
3
+ import { BrowserStorage } from './storage.mjs';
4
+ import { generateCodeChallenge, generateCodeVerifier, generateState } from './utils/generators.mjs';
5
+
6
+ const navigate = (url) => {
7
+ window.location.assign(url);
8
+ };
9
+ class LogtoClient extends BaseClient {
10
+ constructor(config) {
11
+ const requester = createRequester(fetch);
12
+ super(config, {
13
+ requester,
14
+ navigate,
15
+ storage: new BrowserStorage(config.appId),
16
+ generateCodeChallenge,
17
+ generateCodeVerifier,
18
+ generateState,
19
+ });
20
+ }
21
+ }
22
+
23
+ export { LogtoClient as default };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ import type { Storage, StorageKey } from '@logto/client';
2
+ import type { Nullable } from '@silverhand/essentials';
3
+ export declare const logtoStorageItemKeyPrefix = "logto";
4
+ export declare class BrowserStorage implements Storage {
5
+ private readonly storageKey;
6
+ constructor(appId: string);
7
+ getItem(key: StorageKey): Promise<Nullable<string>>;
8
+ setItem(key: StorageKey, value: string): Promise<void>;
9
+ removeItem(key: StorageKey): Promise<void>;
10
+ }
package/lib/storage.js ADDED
@@ -0,0 +1,31 @@
1
+ 'use strict';
2
+
3
+ const logtoStorageItemKeyPrefix = `logto`;
4
+ class BrowserStorage {
5
+ constructor(appId) {
6
+ this.storageKey = `${logtoStorageItemKeyPrefix}:${appId}`;
7
+ }
8
+ async getItem(key) {
9
+ if (key === 'signInSession') {
10
+ return sessionStorage.getItem(this.storageKey);
11
+ }
12
+ return localStorage.getItem(`${this.storageKey}:${key}`);
13
+ }
14
+ async setItem(key, value) {
15
+ if (key === 'signInSession') {
16
+ sessionStorage.setItem(this.storageKey, value);
17
+ return;
18
+ }
19
+ localStorage.setItem(`${this.storageKey}:${key}`, value);
20
+ }
21
+ async removeItem(key) {
22
+ if (key === 'signInSession') {
23
+ sessionStorage.removeItem(this.storageKey);
24
+ return;
25
+ }
26
+ localStorage.removeItem(`${this.storageKey}:${key}`);
27
+ }
28
+ }
29
+
30
+ exports.BrowserStorage = BrowserStorage;
31
+ exports.logtoStorageItemKeyPrefix = logtoStorageItemKeyPrefix;
@@ -0,0 +1,28 @@
1
+ const logtoStorageItemKeyPrefix = `logto`;
2
+ class BrowserStorage {
3
+ constructor(appId) {
4
+ this.storageKey = `${logtoStorageItemKeyPrefix}:${appId}`;
5
+ }
6
+ async getItem(key) {
7
+ if (key === 'signInSession') {
8
+ return sessionStorage.getItem(this.storageKey);
9
+ }
10
+ return localStorage.getItem(`${this.storageKey}:${key}`);
11
+ }
12
+ async setItem(key, value) {
13
+ if (key === 'signInSession') {
14
+ sessionStorage.setItem(this.storageKey, value);
15
+ return;
16
+ }
17
+ localStorage.setItem(`${this.storageKey}:${key}`, value);
18
+ }
19
+ async removeItem(key) {
20
+ if (key === 'signInSession') {
21
+ sessionStorage.removeItem(this.storageKey);
22
+ return;
23
+ }
24
+ localStorage.removeItem(`${this.storageKey}:${key}`);
25
+ }
26
+ }
27
+
28
+ export { BrowserStorage, logtoStorageItemKeyPrefix };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,18 @@
1
+ /** @link [Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636) */
2
+ /**
3
+ * Generates random string for state and encodes them in url safe base64
4
+ */
5
+ export declare const generateState: () => string;
6
+ /**
7
+ * Generates code verifier
8
+ *
9
+ * @link [Client Creates a Code Verifier](https://datatracker.ietf.org/doc/html/rfc7636#section-4.1)
10
+ */
11
+ export declare const generateCodeVerifier: () => string;
12
+ /**
13
+ * Calculates the S256 PKCE code challenge for an arbitrary code verifier and encodes it in url safe base64
14
+ *
15
+ * @param {String} codeVerifier Code verifier to calculate the S256 code challenge for
16
+ * @link [Client Creates the Code Challenge](https://datatracker.ietf.org/doc/html/rfc7636#section-4.2)
17
+ */
18
+ export declare const generateCodeChallenge: (codeVerifier: string) => Promise<string>;
@@ -0,0 +1,44 @@
1
+ 'use strict';
2
+
3
+ var BaseClient = require('@logto/client');
4
+ var jsBase64 = require('js-base64');
5
+
6
+ /** @link [Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636) */
7
+ /**
8
+ * @param length The length of the raw random data.
9
+ */
10
+ const generateRandomString = (length = 64) => jsBase64.fromUint8Array(crypto.getRandomValues(new Uint8Array(length)), true);
11
+ /**
12
+ * Generates random string for state and encodes them in url safe base64
13
+ */
14
+ const generateState = () => generateRandomString();
15
+ /**
16
+ * Generates code verifier
17
+ *
18
+ * @link [Client Creates a Code Verifier](https://datatracker.ietf.org/doc/html/rfc7636#section-4.1)
19
+ */
20
+ const generateCodeVerifier = () => generateRandomString();
21
+ /**
22
+ * Calculates the S256 PKCE code challenge for an arbitrary code verifier and encodes it in url safe base64
23
+ *
24
+ * @param {String} codeVerifier Code verifier to calculate the S256 code challenge for
25
+ * @link [Client Creates the Code Challenge](https://datatracker.ietf.org/doc/html/rfc7636#section-4.2)
26
+ */
27
+ const generateCodeChallenge = async (codeVerifier) => {
28
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
29
+ if (crypto.subtle === undefined) {
30
+ /**
31
+ * `crypto.subtle` is available only in secure contexts (HTTPS) in some or all supporting browsers,
32
+ * https://developer.mozilla.org/en-US/docs/Web/API/Crypto/subtle
33
+ * https://www.chromium.org/blink/webcrypto/#accessing-it
34
+ */
35
+ throw new BaseClient.LogtoError('crypto_subtle_unavailable');
36
+ }
37
+ const encodedCodeVerifier = new TextEncoder().encode(codeVerifier);
38
+ const codeChallenge = new Uint8Array(await crypto.subtle.digest('SHA-256', encodedCodeVerifier));
39
+ return jsBase64.fromUint8Array(codeChallenge, true);
40
+ };
41
+
42
+ exports.generateCodeChallenge = generateCodeChallenge;
43
+ exports.generateCodeVerifier = generateCodeVerifier;
44
+ exports.generateState = generateState;
@@ -0,0 +1,40 @@
1
+ import { LogtoError } from '@logto/client';
2
+ import { fromUint8Array } from 'js-base64';
3
+
4
+ /** @link [Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636) */
5
+ /**
6
+ * @param length The length of the raw random data.
7
+ */
8
+ const generateRandomString = (length = 64) => fromUint8Array(crypto.getRandomValues(new Uint8Array(length)), true);
9
+ /**
10
+ * Generates random string for state and encodes them in url safe base64
11
+ */
12
+ const generateState = () => generateRandomString();
13
+ /**
14
+ * Generates code verifier
15
+ *
16
+ * @link [Client Creates a Code Verifier](https://datatracker.ietf.org/doc/html/rfc7636#section-4.1)
17
+ */
18
+ const generateCodeVerifier = () => generateRandomString();
19
+ /**
20
+ * Calculates the S256 PKCE code challenge for an arbitrary code verifier and encodes it in url safe base64
21
+ *
22
+ * @param {String} codeVerifier Code verifier to calculate the S256 code challenge for
23
+ * @link [Client Creates the Code Challenge](https://datatracker.ietf.org/doc/html/rfc7636#section-4.2)
24
+ */
25
+ const generateCodeChallenge = async (codeVerifier) => {
26
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
27
+ if (crypto.subtle === undefined) {
28
+ /**
29
+ * `crypto.subtle` is available only in secure contexts (HTTPS) in some or all supporting browsers,
30
+ * https://developer.mozilla.org/en-US/docs/Web/API/Crypto/subtle
31
+ * https://www.chromium.org/blink/webcrypto/#accessing-it
32
+ */
33
+ throw new LogtoError('crypto_subtle_unavailable');
34
+ }
35
+ const encodedCodeVerifier = new TextEncoder().encode(codeVerifier);
36
+ const codeChallenge = new Uint8Array(await crypto.subtle.digest('SHA-256', encodedCodeVerifier));
37
+ return fromUint8Array(codeChallenge, true);
38
+ };
39
+
40
+ export { generateCodeChallenge, generateCodeVerifier, generateState };
@@ -0,0 +1 @@
1
+ export {};
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@logto/browser",
3
- "version": "1.1.0",
3
+ "version": "1.1.2",
4
4
  "source": "./src/index.ts",
5
5
  "main": "./lib/index.js",
6
6
  "exports": {
7
7
  "require": "./lib/index.js",
8
- "import": "./lib/module.mjs"
8
+ "import": "./lib/index.mjs"
9
9
  },
10
- "module": "./lib/module.mjs",
10
+ "module": "./lib/index.mjs",
11
11
  "types": "./lib/index.d.ts",
12
12
  "files": [
13
13
  "lib"
@@ -22,36 +22,33 @@
22
22
  "dev:tsc": "tsc -p tsconfig.build.json -w --preserveWatchOutput",
23
23
  "precommit": "lint-staged",
24
24
  "check": "tsc --noEmit",
25
- "build": "rm -rf lib/ && pnpm check && parcel build && cp lib/index.d.ts lib/module.d.mts",
25
+ "build": "rm -rf lib/ && tsc -p tsconfig.build.json --noEmit && rollup -c",
26
26
  "lint": "eslint --ext .ts src",
27
27
  "test": "jest",
28
28
  "test:coverage": "jest --silent --coverage",
29
29
  "prepack": "pnpm test"
30
30
  },
31
31
  "dependencies": {
32
- "@logto/client": "^1.1.0",
33
- "@silverhand/essentials": "^1.2.1",
32
+ "@logto/client": "^1.1.2",
33
+ "@silverhand/essentials": "^2.6.1",
34
34
  "js-base64": "^3.7.4"
35
35
  },
36
36
  "devDependencies": {
37
- "@jest/types": "^27.5.1",
38
- "@parcel/core": "^2.8.3",
39
- "@parcel/packager-ts": "^2.8.3",
40
- "@parcel/transformer-typescript-types": "^2.8.3",
37
+ "@jest/types": "^29.5.0",
41
38
  "@silverhand/eslint-config": "^2.0.0",
42
39
  "@silverhand/ts-config": "^1.0.0",
43
- "@types/jest": "^27.4.0",
44
- "eslint": "^8.23.0",
45
- "jest": "^27.5.1",
40
+ "@swc/core": "^1.3.50",
41
+ "@swc/jest": "^0.2.24",
42
+ "@types/jest": "^29.5.0",
43
+ "eslint": "^8.38.0",
44
+ "jest": "^29.5.0",
45
+ "jest-environment-jsdom": "^29.5.0",
46
46
  "jest-location-mock": "^1.0.9",
47
47
  "jest-matcher-specific-error": "^1.0.0",
48
48
  "lint-staged": "^13.0.0",
49
- "node-fetch": "^2.6.7",
50
- "parcel": "^2.8.3",
51
- "prettier": "^2.7.1",
49
+ "prettier": "^2.8.7",
52
50
  "text-encoder": "^0.0.4",
53
- "ts-jest": "^27.0.4",
54
- "typescript": "4.9.5"
51
+ "typescript": "^5.0.0"
55
52
  },
56
53
  "eslintConfig": {
57
54
  "extends": "@silverhand"
@@ -60,5 +57,5 @@
60
57
  "publishConfig": {
61
58
  "access": "public"
62
59
  },
63
- "gitHead": "f24174a6f840b8db968ad3886878d1b6e92b1b9d"
60
+ "gitHead": "9e9a8b0887ef67baa7c3c564590bb06e7801d03e"
64
61
  }
@@ -1 +0,0 @@
1
- {"mappings":";AEMA,YAAY,EACV,aAAa,EACb,cAAc,EACd,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,GAChB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,UAAU,EACV,SAAS,EACT,MAAM,EACN,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,SAAS,GACV,MAAM,eAAe,CAAC;AAMvB,gCAAiC,SAAQ,UAAU;gBACrC,MAAM,EAAE,WAAW;CAWhC","sources":["packages/browser/src/src/storage.ts","packages/browser/src/src/utils/generators.ts","packages/browser/src/src/index.ts","packages/browser/src/index.ts"],"sourcesContent":[null,null,null,"import type { LogtoConfig } from '@logto/client';\nimport BaseClient, { createRequester } from '@logto/client';\n\nimport { BrowserStorage } from './storage';\nimport { generateCodeChallenge, generateCodeVerifier, generateState } from './utils/generators';\n\nexport type {\n IdTokenClaims,\n LogtoErrorCode,\n LogtoConfig,\n LogtoClientErrorCode,\n UserInfoResponse,\n InteractionMode,\n} from '@logto/client';\n\nexport {\n LogtoError,\n OidcError,\n Prompt,\n LogtoRequestError,\n LogtoClientError,\n ReservedScope,\n UserScope,\n} from '@logto/client';\n\nconst navigate = (url: string) => {\n window.location.assign(url);\n};\n\nexport default class LogtoClient extends BaseClient {\n constructor(config: LogtoConfig) {\n const requester = createRequester(fetch);\n super(config, {\n requester,\n navigate,\n storage: new BrowserStorage(config.appId),\n generateCodeChallenge,\n generateCodeVerifier,\n generateState,\n });\n }\n}\n"],"names":[],"version":3,"file":"index.d.ts.map"}
package/lib/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA;ACGO,MAAM,4CAA4B,CAAC,KAAK,CAAC;AAEzC,MAAM;IAGX,YAAY,KAAa,CAAE;QACzB,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,0CAA0B,CAAC,EAAE,MAAM,CAAC;IAC3D;IAEA,MAAM,QAAQ,GAAe,EAA6B;QACxD,IAAI,QAAQ,iBACV,OAAO,eAAe,OAAO,CAAC,IAAI,CAAC,UAAU;QAG/C,OAAO,aAAa,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC;IACzD;IAEA,MAAM,QAAQ,GAAe,EAAE,KAAa,EAAiB;QAC3D,IAAI,QAAQ,iBAAiB;YAC3B,eAAe,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE;YAExC;QACF,CAAC;QACD,aAAa,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;IACpD;IAEA,MAAM,WAAW,GAAe,EAAiB;QAC/C,IAAI,QAAQ,iBAAiB;YAC3B,eAAe,UAAU,CAAC,IAAI,CAAC,UAAU;YAEzC;QACF,CAAC;QACD,aAAa,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC;IACrD;AACF;;;ACrCA,+GAA+G,GAE/G;;AAGA;;CAEC,GACD,MAAM,6CAAuB,CAAC,SAAS,EAAE,GACvC,CAAA,GAAA,8BAAc,AAAD,EAAE,OAAO,eAAe,CAAC,IAAI,WAAW,UAAU,IAAI;AAK9D,MAAM,4CAAgB,IAAM;AAO5B,MAAM,4CAAuB,IAAM;AAQnC,MAAM,4CAAwB,OAAO,eAA0C;IACpF,uEAAuE;IACvE,IAAI,OAAO,MAAM,KAAK,WACpB;;;;KAIC,GACD,MAAM,IAAI,CAAA,GAAA,6BAAS,EAAE,6BAA6B;IAGpD,MAAM,sBAAsB,IAAI,cAAc,MAAM,CAAC;IACrD,MAAM,gBAAgB,IAAI,WAAW,MAAM,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW;IAE3E,OAAO,CAAA,GAAA,8BAAc,AAAD,EAAE,eAAe,IAAI;AAC3C;;;;AFnBA,MAAM,iCAAW,CAAC,MAAgB;IAChC,OAAO,QAAQ,CAAC,MAAM,CAAC;AACzB;AAEe,uDAA0B,CAAA,GAAA,4CAAS;IAChD,YAAY,MAAmB,CAAE;QAC/B,MAAM,YAAY,CAAA,GAAA,kCAAc,EAAE;QAClC,KAAK,CAAC,QAAQ;uBACZ;sBACA;YACA,SAAS,IAAI,CAAA,GAAA,yCAAc,AAAD,EAAE,OAAO,KAAK;mCACxC;kCACA;2BACA;QACF;IACF;AACF","sources":["packages/browser/src/index.ts","packages/browser/src/storage.ts","packages/browser/src/utils/generators.ts"],"sourcesContent":["import type { LogtoConfig } from '@logto/client';\nimport BaseClient, { createRequester } from '@logto/client';\n\nimport { BrowserStorage } from './storage';\nimport { generateCodeChallenge, generateCodeVerifier, generateState } from './utils/generators';\n\nexport type {\n IdTokenClaims,\n LogtoErrorCode,\n LogtoConfig,\n LogtoClientErrorCode,\n UserInfoResponse,\n InteractionMode,\n} from '@logto/client';\n\nexport {\n LogtoError,\n OidcError,\n Prompt,\n LogtoRequestError,\n LogtoClientError,\n ReservedScope,\n UserScope,\n} from '@logto/client';\n\nconst navigate = (url: string) => {\n window.location.assign(url);\n};\n\nexport default class LogtoClient extends BaseClient {\n constructor(config: LogtoConfig) {\n const requester = createRequester(fetch);\n super(config, {\n requester,\n navigate,\n storage: new BrowserStorage(config.appId),\n generateCodeChallenge,\n generateCodeVerifier,\n generateState,\n });\n }\n}\n","import type { Storage, StorageKey } from '@logto/client';\nimport type { Nullable } from '@silverhand/essentials';\n\nexport const logtoStorageItemKeyPrefix = `logto`;\n\nexport class BrowserStorage implements Storage {\n private readonly storageKey: string;\n\n constructor(appId: string) {\n this.storageKey = `${logtoStorageItemKeyPrefix}:${appId}`;\n }\n\n async getItem(key: StorageKey): Promise<Nullable<string>> {\n if (key === 'signInSession') {\n return sessionStorage.getItem(this.storageKey);\n }\n\n return localStorage.getItem(`${this.storageKey}:${key}`);\n }\n\n async setItem(key: StorageKey, value: string): Promise<void> {\n if (key === 'signInSession') {\n sessionStorage.setItem(this.storageKey, value);\n\n return;\n }\n localStorage.setItem(`${this.storageKey}:${key}`, value);\n }\n\n async removeItem(key: StorageKey): Promise<void> {\n if (key === 'signInSession') {\n sessionStorage.removeItem(this.storageKey);\n\n return;\n }\n localStorage.removeItem(`${this.storageKey}:${key}`);\n }\n}\n","/** @link [Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636) */\n\nimport { LogtoError } from '@logto/client';\nimport { fromUint8Array } from 'js-base64';\n\n/**\n * @param length The length of the raw random data.\n */\nconst generateRandomString = (length = 64) =>\n fromUint8Array(crypto.getRandomValues(new Uint8Array(length)), true);\n\n/**\n * Generates random string for state and encodes them in url safe base64\n */\nexport const generateState = () => generateRandomString();\n\n/**\n * Generates code verifier\n *\n * @link [Client Creates a Code Verifier](https://datatracker.ietf.org/doc/html/rfc7636#section-4.1)\n */\nexport const generateCodeVerifier = () => generateRandomString();\n\n/**\n * Calculates the S256 PKCE code challenge for an arbitrary code verifier and encodes it in url safe base64\n *\n * @param {String} codeVerifier Code verifier to calculate the S256 code challenge for\n * @link [Client Creates the Code Challenge](https://datatracker.ietf.org/doc/html/rfc7636#section-4.2)\n */\nexport const generateCodeChallenge = async (codeVerifier: string): Promise<string> => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (crypto.subtle === undefined) {\n /**\n * `crypto.subtle` is available only in secure contexts (HTTPS) in some or all supporting browsers,\n * https://developer.mozilla.org/en-US/docs/Web/API/Crypto/subtle\n * https://www.chromium.org/blink/webcrypto/#accessing-it\n */\n throw new LogtoError('crypto_subtle_unavailable');\n }\n\n const encodedCodeVerifier = new TextEncoder().encode(codeVerifier);\n const codeChallenge = new Uint8Array(await crypto.subtle.digest('SHA-256', encodedCodeVerifier));\n\n return fromUint8Array(codeChallenge, true);\n};\n"],"names":[],"version":3,"file":"index.js.map"}
package/lib/module.d.mts DELETED
@@ -1,8 +0,0 @@
1
- import BaseClient, { LogtoConfig } from "@logto/client";
2
- export type { IdTokenClaims, LogtoErrorCode, LogtoConfig, LogtoClientErrorCode, UserInfoResponse, InteractionMode, } from '@logto/client';
3
- export { LogtoError, OidcError, Prompt, LogtoRequestError, LogtoClientError, ReservedScope, UserScope, } from '@logto/client';
4
- export default class LogtoClient extends BaseClient {
5
- constructor(config: LogtoConfig);
6
- }
7
-
8
- //# sourceMappingURL=index.d.ts.map
package/lib/module.mjs DELETED
@@ -1,71 +0,0 @@
1
- import $ElS14$logtoclient, {createRequester as $ElS14$createRequester, LogtoError as $90df2ab0e44b5eba$re_export$LogtoError, OidcError as $90df2ab0e44b5eba$re_export$OidcError, Prompt as $90df2ab0e44b5eba$re_export$Prompt, LogtoRequestError as $90df2ab0e44b5eba$re_export$LogtoRequestError, LogtoClientError as $90df2ab0e44b5eba$re_export$LogtoClientError, ReservedScope as $90df2ab0e44b5eba$re_export$ReservedScope, UserScope as $90df2ab0e44b5eba$re_export$UserScope} from "@logto/client";
2
- import {fromUint8Array as $ElS14$fromUint8Array} from "js-base64";
3
-
4
-
5
- const $283691d41cf73b69$export$9b5c2da5fe7b4b2b = `logto`;
6
- class $283691d41cf73b69$export$2baa60fa09b100be {
7
- constructor(appId){
8
- this.storageKey = `${$283691d41cf73b69$export$9b5c2da5fe7b4b2b}:${appId}`;
9
- }
10
- async getItem(key) {
11
- if (key === "signInSession") return sessionStorage.getItem(this.storageKey);
12
- return localStorage.getItem(`${this.storageKey}:${key}`);
13
- }
14
- async setItem(key, value) {
15
- if (key === "signInSession") {
16
- sessionStorage.setItem(this.storageKey, value);
17
- return;
18
- }
19
- localStorage.setItem(`${this.storageKey}:${key}`, value);
20
- }
21
- async removeItem(key) {
22
- if (key === "signInSession") {
23
- sessionStorage.removeItem(this.storageKey);
24
- return;
25
- }
26
- localStorage.removeItem(`${this.storageKey}:${key}`);
27
- }
28
- }
29
-
30
-
31
- /** @link [Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636) */
32
-
33
- /**
34
- * @param length The length of the raw random data.
35
- */ const $7faa35338215c9c1$var$generateRandomString = (length = 64)=>(0, $ElS14$fromUint8Array)(crypto.getRandomValues(new Uint8Array(length)), true);
36
- const $7faa35338215c9c1$export$9ccd2716e53a229b = ()=>$7faa35338215c9c1$var$generateRandomString();
37
- const $7faa35338215c9c1$export$cf1891f923f5943a = ()=>$7faa35338215c9c1$var$generateRandomString();
38
- const $7faa35338215c9c1$export$414b01b1f867308a = async (codeVerifier)=>{
39
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
40
- if (crypto.subtle === undefined) /**
41
- * `crypto.subtle` is available only in secure contexts (HTTPS) in some or all supporting browsers,
42
- * https://developer.mozilla.org/en-US/docs/Web/API/Crypto/subtle
43
- * https://www.chromium.org/blink/webcrypto/#accessing-it
44
- */ throw new (0, $90df2ab0e44b5eba$re_export$LogtoError)("crypto_subtle_unavailable");
45
- const encodedCodeVerifier = new TextEncoder().encode(codeVerifier);
46
- const codeChallenge = new Uint8Array(await crypto.subtle.digest("SHA-256", encodedCodeVerifier));
47
- return (0, $ElS14$fromUint8Array)(codeChallenge, true);
48
- };
49
-
50
-
51
-
52
- const $90df2ab0e44b5eba$var$navigate = (url)=>{
53
- window.location.assign(url);
54
- };
55
- class $90df2ab0e44b5eba$export$2e2bcd8739ae039 extends (0, $ElS14$logtoclient) {
56
- constructor(config){
57
- const requester = (0, $ElS14$createRequester)(fetch);
58
- super(config, {
59
- requester: requester,
60
- navigate: $90df2ab0e44b5eba$var$navigate,
61
- storage: new (0, $283691d41cf73b69$export$2baa60fa09b100be)(config.appId),
62
- generateCodeChallenge: $7faa35338215c9c1$export$414b01b1f867308a,
63
- generateCodeVerifier: $7faa35338215c9c1$export$cf1891f923f5943a,
64
- generateState: $7faa35338215c9c1$export$9ccd2716e53a229b
65
- });
66
- }
67
- }
68
-
69
-
70
- export {$90df2ab0e44b5eba$export$2e2bcd8739ae039 as default, $90df2ab0e44b5eba$re_export$LogtoError as LogtoError, $90df2ab0e44b5eba$re_export$OidcError as OidcError, $90df2ab0e44b5eba$re_export$Prompt as Prompt, $90df2ab0e44b5eba$re_export$LogtoRequestError as LogtoRequestError, $90df2ab0e44b5eba$re_export$LogtoClientError as LogtoClientError, $90df2ab0e44b5eba$re_export$ReservedScope as ReservedScope, $90df2ab0e44b5eba$re_export$UserScope as UserScope};
71
- //# sourceMappingURL=module.mjs.map
@@ -1 +0,0 @@
1
- {"mappings":";;;AAAA;ACGO,MAAM,4CAA4B,CAAC,KAAK,CAAC;AAEzC,MAAM;IAGX,YAAY,KAAa,CAAE;QACzB,IAAI,CAAC,UAAU,GAAG,CAAC,EAAE,0CAA0B,CAAC,EAAE,MAAM,CAAC;IAC3D;IAEA,MAAM,QAAQ,GAAe,EAA6B;QACxD,IAAI,QAAQ,iBACV,OAAO,eAAe,OAAO,CAAC,IAAI,CAAC,UAAU;QAG/C,OAAO,aAAa,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC;IACzD;IAEA,MAAM,QAAQ,GAAe,EAAE,KAAa,EAAiB;QAC3D,IAAI,QAAQ,iBAAiB;YAC3B,eAAe,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE;YAExC;QACF,CAAC;QACD,aAAa,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;IACpD;IAEA,MAAM,WAAW,GAAe,EAAiB;QAC/C,IAAI,QAAQ,iBAAiB;YAC3B,eAAe,UAAU,CAAC,IAAI,CAAC,UAAU;YAEzC;QACF,CAAC;QACD,aAAa,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC;IACrD;AACF;;;ACrCA,+GAA+G,GAE/G;;AAGA;;CAEC,GACD,MAAM,6CAAuB,CAAC,SAAS,EAAE,GACvC,CAAA,GAAA,qBAAc,AAAD,EAAE,OAAO,eAAe,CAAC,IAAI,WAAW,UAAU,IAAI;AAK9D,MAAM,4CAAgB,IAAM;AAO5B,MAAM,4CAAuB,IAAM;AAQnC,MAAM,4CAAwB,OAAO,eAA0C;IACpF,uEAAuE;IACvE,IAAI,OAAO,MAAM,KAAK,WACpB;;;;KAIC,GACD,MAAM,IAAI,CAAA,GAAA,sCAAS,EAAE,6BAA6B;IAGpD,MAAM,sBAAsB,IAAI,cAAc,MAAM,CAAC;IACrD,MAAM,gBAAgB,IAAI,WAAW,MAAM,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW;IAE3E,OAAO,CAAA,GAAA,qBAAc,AAAD,EAAE,eAAe,IAAI;AAC3C;;;;AFnBA,MAAM,iCAAW,CAAC,MAAgB;IAChC,OAAO,QAAQ,CAAC,MAAM,CAAC;AACzB;AAEe,uDAA0B,CAAA,GAAA,kBAAS;IAChD,YAAY,MAAmB,CAAE;QAC/B,MAAM,YAAY,CAAA,GAAA,sBAAc,EAAE;QAClC,KAAK,CAAC,QAAQ;uBACZ;sBACA;YACA,SAAS,IAAI,CAAA,GAAA,yCAAc,AAAD,EAAE,OAAO,KAAK;mCACxC;kCACA;2BACA;QACF;IACF;AACF","sources":["packages/browser/src/index.ts","packages/browser/src/storage.ts","packages/browser/src/utils/generators.ts"],"sourcesContent":["import type { LogtoConfig } from '@logto/client';\nimport BaseClient, { createRequester } from '@logto/client';\n\nimport { BrowserStorage } from './storage';\nimport { generateCodeChallenge, generateCodeVerifier, generateState } from './utils/generators';\n\nexport type {\n IdTokenClaims,\n LogtoErrorCode,\n LogtoConfig,\n LogtoClientErrorCode,\n UserInfoResponse,\n InteractionMode,\n} from '@logto/client';\n\nexport {\n LogtoError,\n OidcError,\n Prompt,\n LogtoRequestError,\n LogtoClientError,\n ReservedScope,\n UserScope,\n} from '@logto/client';\n\nconst navigate = (url: string) => {\n window.location.assign(url);\n};\n\nexport default class LogtoClient extends BaseClient {\n constructor(config: LogtoConfig) {\n const requester = createRequester(fetch);\n super(config, {\n requester,\n navigate,\n storage: new BrowserStorage(config.appId),\n generateCodeChallenge,\n generateCodeVerifier,\n generateState,\n });\n }\n}\n","import type { Storage, StorageKey } from '@logto/client';\nimport type { Nullable } from '@silverhand/essentials';\n\nexport const logtoStorageItemKeyPrefix = `logto`;\n\nexport class BrowserStorage implements Storage {\n private readonly storageKey: string;\n\n constructor(appId: string) {\n this.storageKey = `${logtoStorageItemKeyPrefix}:${appId}`;\n }\n\n async getItem(key: StorageKey): Promise<Nullable<string>> {\n if (key === 'signInSession') {\n return sessionStorage.getItem(this.storageKey);\n }\n\n return localStorage.getItem(`${this.storageKey}:${key}`);\n }\n\n async setItem(key: StorageKey, value: string): Promise<void> {\n if (key === 'signInSession') {\n sessionStorage.setItem(this.storageKey, value);\n\n return;\n }\n localStorage.setItem(`${this.storageKey}:${key}`, value);\n }\n\n async removeItem(key: StorageKey): Promise<void> {\n if (key === 'signInSession') {\n sessionStorage.removeItem(this.storageKey);\n\n return;\n }\n localStorage.removeItem(`${this.storageKey}:${key}`);\n }\n}\n","/** @link [Proof Key for Code Exchange by OAuth Public Clients](https://datatracker.ietf.org/doc/html/rfc7636) */\n\nimport { LogtoError } from '@logto/client';\nimport { fromUint8Array } from 'js-base64';\n\n/**\n * @param length The length of the raw random data.\n */\nconst generateRandomString = (length = 64) =>\n fromUint8Array(crypto.getRandomValues(new Uint8Array(length)), true);\n\n/**\n * Generates random string for state and encodes them in url safe base64\n */\nexport const generateState = () => generateRandomString();\n\n/**\n * Generates code verifier\n *\n * @link [Client Creates a Code Verifier](https://datatracker.ietf.org/doc/html/rfc7636#section-4.1)\n */\nexport const generateCodeVerifier = () => generateRandomString();\n\n/**\n * Calculates the S256 PKCE code challenge for an arbitrary code verifier and encodes it in url safe base64\n *\n * @param {String} codeVerifier Code verifier to calculate the S256 code challenge for\n * @link [Client Creates the Code Challenge](https://datatracker.ietf.org/doc/html/rfc7636#section-4.2)\n */\nexport const generateCodeChallenge = async (codeVerifier: string): Promise<string> => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (crypto.subtle === undefined) {\n /**\n * `crypto.subtle` is available only in secure contexts (HTTPS) in some or all supporting browsers,\n * https://developer.mozilla.org/en-US/docs/Web/API/Crypto/subtle\n * https://www.chromium.org/blink/webcrypto/#accessing-it\n */\n throw new LogtoError('crypto_subtle_unavailable');\n }\n\n const encodedCodeVerifier = new TextEncoder().encode(codeVerifier);\n const codeChallenge = new Uint8Array(await crypto.subtle.digest('SHA-256', encodedCodeVerifier));\n\n return fromUint8Array(codeChallenge, true);\n};\n"],"names":[],"version":3,"file":"module.mjs.map"}