@logto/client
Advanced tools
Comparing version 1.1.2 to 2.0.0
@@ -1,11 +0,8 @@ | ||
import type { NormalizeKeyPaths } from '@silverhand/essentials'; | ||
declare const logtoClientErrorCodes: Readonly<{ | ||
sign_in_session: { | ||
invalid: string; | ||
not_found: string; | ||
}; | ||
'sign_in_session.invalid': "Invalid sign-in session."; | ||
'sign_in_session.not_found': "Sign-in session not found."; | ||
not_authenticated: "Not authenticated."; | ||
fetch_user_info_failed: "Unable to fetch user info. The access token may be invalid."; | ||
}>; | ||
export type LogtoClientErrorCode = NormalizeKeyPaths<typeof logtoClientErrorCodes>; | ||
export type LogtoClientErrorCode = keyof typeof logtoClientErrorCodes; | ||
export declare class LogtoClientError extends Error { | ||
@@ -12,0 +9,0 @@ code: LogtoClientErrorCode; |
@@ -1,28 +0,10 @@ | ||
'use strict'; | ||
var get = require('lodash.get'); | ||
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } | ||
var get__default = /*#__PURE__*/_interopDefault(get); | ||
const logtoClientErrorCodes = Object.freeze({ | ||
sign_in_session: { | ||
invalid: 'Invalid sign-in session.', | ||
not_found: 'Sign-in session not found.', | ||
}, | ||
'sign_in_session.invalid': 'Invalid sign-in session.', | ||
'sign_in_session.not_found': 'Sign-in session not found.', | ||
not_authenticated: 'Not authenticated.', | ||
fetch_user_info_failed: 'Unable to fetch user info. The access token may be invalid.', | ||
}); | ||
const getMessageByErrorCode = (errorCode) => { | ||
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment | ||
const message = get__default.default(logtoClientErrorCodes, errorCode); | ||
if (typeof message === 'string') { | ||
return message; | ||
} | ||
return errorCode; | ||
}; | ||
class LogtoClientError extends Error { | ||
constructor(code, data) { | ||
super(getMessageByErrorCode(code)); | ||
super(logtoClientErrorCodes[code]); | ||
this.code = code; | ||
@@ -33,2 +15,2 @@ this.data = data; | ||
exports.LogtoClientError = LogtoClientError; | ||
export { LogtoClientError }; |
import type { IdTokenClaims, UserInfoResponse, InteractionMode } from '@logto/js'; | ||
import type { Nullable } from '@silverhand/essentials'; | ||
import type { ClientAdapter } from './adapter'; | ||
import type { AccessToken, LogtoConfig, LogtoSignInSessionItem } from './types'; | ||
import type { ClientAdapter } from './adapter.js'; | ||
import type { AccessToken, LogtoConfig, LogtoSignInSessionItem } from './types/index.js'; | ||
export type { IdTokenClaims, LogtoErrorCode, UserInfoResponse, InteractionMode } from '@logto/js'; | ||
export { LogtoError, OidcError, Prompt, LogtoRequestError, ReservedScope, UserScope, } from '@logto/js'; | ||
export * from './errors'; | ||
export type { Storage, StorageKey, ClientAdapter } from './adapter'; | ||
export { createRequester } from './utils'; | ||
export * from './types'; | ||
export * from './errors.js'; | ||
export type { Storage, StorageKey, ClientAdapter } from './adapter.js'; | ||
export { createRequester } from './utils/index.js'; | ||
export * from './types/index.js'; | ||
export default class LogtoClient { | ||
protected readonly logtoConfig: LogtoConfig; | ||
protected readonly getOidcConfig: () => Promise<import("@silverhand/essentials").KeysToCamelCase<{ | ||
authorization_endpoint: string; | ||
token_endpoint: string; | ||
userinfo_endpoint: string; | ||
end_session_endpoint: string; | ||
revocation_endpoint: string; | ||
jwks_uri: string; | ||
issuer: string; | ||
}>>; | ||
protected readonly getJwtVerifyGetKey: () => Promise<(protectedHeader?: import("jose").JWSHeaderParameters | undefined, token?: import("jose").FlattenedJWSInput | undefined) => Promise<import("jose").KeyLike>>; | ||
protected readonly getOidcConfig: typeof this._getOidcConfig; | ||
protected readonly getJwtVerifyGetKey: (...args: unknown[]) => Promise<(protectedHeader?: import("jose").JWSHeaderParameters | undefined, token?: import("jose").FlattenedJWSInput | undefined) => Promise<import("jose").KeyLike>>; | ||
protected readonly adapter: ClientAdapter; | ||
@@ -24,0 +16,0 @@ protected readonly accessTokenMap: Map<string, AccessToken>; |
107
lib/index.js
@@ -1,26 +0,19 @@ | ||
'use strict'; | ||
import { Prompt, withDefaultScopes, decodeIdToken, fetchUserInfo, generateSignInUri, verifyAndParseCodeFromCallbackUri, fetchTokenByAuthorizationCode, revoke, generateSignOutUri, fetchTokenByRefreshToken, fetchOidcConfig, verifyIdToken } from '@logto/js'; | ||
export { LogtoError, LogtoRequestError, OidcError, Prompt, ReservedScope, UserScope } from '@logto/js'; | ||
import { createRemoteJWKSet } from 'jose'; | ||
import { LogtoClientError } from './errors.js'; | ||
import { isLogtoSignInSessionItem, isLogtoAccessTokenMap } from './types/index.js'; | ||
import { buildAccessTokenKey, getDiscoveryEndpoint } from './utils/index.js'; | ||
import { once } from './utils/once.js'; | ||
export { createRequester } from './utils/requester.js'; | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
var js = require('@logto/js'); | ||
var jose = require('jose'); | ||
var once = require('lodash.once'); | ||
var errors = require('./errors.js'); | ||
var index = require('./types/index.js'); | ||
var index$1 = require('./utils/index.js'); | ||
var requester = require('./utils/requester.js'); | ||
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; } | ||
var once__default = /*#__PURE__*/_interopDefault(once); | ||
class LogtoClient { | ||
constructor(logtoConfig, adapter) { | ||
this.getOidcConfig = once__default.default(this._getOidcConfig); | ||
this.getJwtVerifyGetKey = once__default.default(this._getJwtVerifyGetKey); | ||
this.getOidcConfig = once(this._getOidcConfig); | ||
this.getJwtVerifyGetKey = once(this._getJwtVerifyGetKey); | ||
this.accessTokenMap = new Map(); | ||
this.logtoConfig = { | ||
...logtoConfig, | ||
prompt: logtoConfig.prompt ?? js.Prompt.Consent, | ||
scopes: js.withDefaultScopes(logtoConfig.scopes).split(' '), | ||
prompt: logtoConfig.prompt ?? Prompt.Consent, | ||
scopes: withDefaultScopes(logtoConfig.scopes).split(' '), | ||
}; | ||
@@ -41,5 +34,5 @@ this.adapter = adapter; | ||
if (!(await this.getIdToken())) { | ||
throw new errors.LogtoClientError('not_authenticated'); | ||
throw new LogtoClientError('not_authenticated'); | ||
} | ||
const accessTokenKey = index$1.buildAccessTokenKey(resource); | ||
const accessTokenKey = buildAccessTokenKey(resource); | ||
const accessToken = this.accessTokenMap.get(accessTokenKey); | ||
@@ -61,5 +54,5 @@ if (accessToken && accessToken.expiresAt > Date.now() / 1000) { | ||
if (!idToken) { | ||
throw new errors.LogtoClientError('not_authenticated'); | ||
throw new LogtoClientError('not_authenticated'); | ||
} | ||
return js.decodeIdToken(idToken); | ||
return decodeIdToken(idToken); | ||
} | ||
@@ -70,5 +63,5 @@ async fetchUserInfo() { | ||
if (!accessToken) { | ||
throw new errors.LogtoClientError('fetch_user_info_failed'); | ||
throw new LogtoClientError('fetch_user_info_failed'); | ||
} | ||
return js.fetchUserInfo(userinfoEndpoint, accessToken, this.adapter.requester); | ||
return fetchUserInfo(userinfoEndpoint, accessToken, this.adapter.requester); | ||
} | ||
@@ -81,3 +74,3 @@ async signIn(redirectUri, interactionMode) { | ||
const state = this.adapter.generateState(); | ||
const signInUri = js.generateSignInUri({ | ||
const signInUri = generateSignInUri({ | ||
authorizationEndpoint, | ||
@@ -112,9 +105,9 @@ clientId, | ||
if (!signInSession) { | ||
throw new errors.LogtoClientError('sign_in_session.not_found'); | ||
throw new LogtoClientError('sign_in_session.not_found'); | ||
} | ||
const { redirectUri, state, codeVerifier } = signInSession; | ||
const code = js.verifyAndParseCodeFromCallbackUri(callbackUri, redirectUri, state); | ||
const code = verifyAndParseCodeFromCallbackUri(callbackUri, redirectUri, state); | ||
const { appId: clientId } = logtoConfig; | ||
const { tokenEndpoint } = await this.getOidcConfig(); | ||
const codeTokenResponse = await js.fetchTokenByAuthorizationCode({ | ||
const codeTokenResponse = await fetchTokenByAuthorizationCode({ | ||
clientId, | ||
@@ -136,3 +129,3 @@ tokenEndpoint, | ||
try { | ||
await js.revoke(revocationEndpoint, clientId, refreshToken, this.adapter.requester); | ||
await revoke(revocationEndpoint, clientId, refreshToken, this.adapter.requester); | ||
} | ||
@@ -143,3 +136,3 @@ catch { | ||
} | ||
const url = js.generateSignOutUri({ | ||
const url = generateSignOutUri({ | ||
endSessionEndpoint, | ||
@@ -161,4 +154,4 @@ postLogoutRedirectUri, | ||
const item = JSON.parse(jsonItem); | ||
if (!index.isLogtoSignInSessionItem(item)) { | ||
throw new errors.LogtoClientError('sign_in_session.invalid'); | ||
if (!isLogtoSignInSessionItem(item)) { | ||
throw new LogtoClientError('sign_in_session.invalid'); | ||
} | ||
@@ -192,8 +185,8 @@ return item; | ||
if (!currentRefreshToken) { | ||
throw new errors.LogtoClientError('not_authenticated'); | ||
throw new LogtoClientError('not_authenticated'); | ||
} | ||
const accessTokenKey = index$1.buildAccessTokenKey(resource); | ||
const accessTokenKey = buildAccessTokenKey(resource); | ||
const { appId: clientId } = this.logtoConfig; | ||
const { tokenEndpoint } = await this.getOidcConfig(); | ||
const { accessToken, refreshToken, idToken, scope, expiresIn } = await js.fetchTokenByRefreshToken({ | ||
const { accessToken, refreshToken, idToken, scope, expiresIn } = await fetchTokenByRefreshToken({ | ||
clientId, | ||
@@ -219,8 +212,8 @@ tokenEndpoint, | ||
const { endpoint } = this.logtoConfig; | ||
const discoveryEndpoint = index$1.getDiscoveryEndpoint(endpoint); | ||
return js.fetchOidcConfig(discoveryEndpoint, this.adapter.requester); | ||
const discoveryEndpoint = getDiscoveryEndpoint(endpoint); | ||
return fetchOidcConfig(discoveryEndpoint, this.adapter.requester); | ||
} | ||
async _getJwtVerifyGetKey() { | ||
const { jwksUri } = await this.getOidcConfig(); | ||
return jose.createRemoteJWKSet(new URL(jwksUri)); | ||
return createRemoteJWKSet(new URL(jwksUri)); | ||
} | ||
@@ -231,3 +224,3 @@ async verifyIdToken(idToken) { | ||
const jwtVerifyGetKey = await this.getJwtVerifyGetKey(); | ||
await js.verifyIdToken(idToken, appId, issuer, jwtVerifyGetKey); | ||
await verifyIdToken(idToken, appId, issuer, jwtVerifyGetKey); | ||
} | ||
@@ -238,3 +231,3 @@ async saveCodeToken({ refreshToken, idToken, scope, accessToken, expiresIn, }) { | ||
// NOTE: Will add scope to accessTokenKey when needed. (Linear issue LOG-1589) | ||
const accessTokenKey = index$1.buildAccessTokenKey(); | ||
const accessTokenKey = buildAccessTokenKey(); | ||
const expiresAt = Date.now() / 1000 + expiresIn; | ||
@@ -259,3 +252,3 @@ this.accessTokenMap.set(accessTokenKey, { token: accessToken, scope, expiresAt }); | ||
const json = JSON.parse(raw); | ||
if (!index.isLogtoAccessTokenMap(json)) { | ||
if (!isLogtoAccessTokenMap(json)) { | ||
return; | ||
@@ -274,30 +267,2 @@ } | ||
Object.defineProperty(exports, 'LogtoError', { | ||
enumerable: true, | ||
get: function () { return js.LogtoError; } | ||
}); | ||
Object.defineProperty(exports, 'LogtoRequestError', { | ||
enumerable: true, | ||
get: function () { return js.LogtoRequestError; } | ||
}); | ||
Object.defineProperty(exports, 'OidcError', { | ||
enumerable: true, | ||
get: function () { return js.OidcError; } | ||
}); | ||
Object.defineProperty(exports, 'Prompt', { | ||
enumerable: true, | ||
get: function () { return js.Prompt; } | ||
}); | ||
Object.defineProperty(exports, 'ReservedScope', { | ||
enumerable: true, | ||
get: function () { return js.ReservedScope; } | ||
}); | ||
Object.defineProperty(exports, 'UserScope', { | ||
enumerable: true, | ||
get: function () { return js.UserScope; } | ||
}); | ||
exports.LogtoClientError = errors.LogtoClientError; | ||
exports.isLogtoAccessTokenMap = index.isLogtoAccessTokenMap; | ||
exports.isLogtoSignInSessionItem = index.isLogtoSignInSessionItem; | ||
exports.createRequester = requester.createRequester; | ||
exports.default = LogtoClient; | ||
export { LogtoClientError, LogtoClient as default, isLogtoAccessTokenMap, isLogtoSignInSessionItem }; |
/// <reference types="jest" /> | ||
import { Prompt } from '@logto/js'; | ||
import type { Nullable } from '@silverhand/essentials'; | ||
import type { AccessToken, LogtoConfig, LogtoSignInSessionItem } from '.'; | ||
import LogtoClient from '.'; | ||
import type { Storage } from './adapter'; | ||
import type { Storage } from './adapter.js'; | ||
import type { AccessToken, LogtoConfig, LogtoSignInSessionItem } from './index.js'; | ||
import LogtoClient from './index.js'; | ||
export declare const appId = "app_id_value"; | ||
@@ -8,0 +8,0 @@ export declare const endpoint = "https://logto.dev"; |
@@ -1,7 +0,5 @@ | ||
'use strict'; | ||
import { isArbitraryObject } from '@logto/js'; | ||
var js = require('@logto/js'); | ||
const isLogtoSignInSessionItem = (data) => { | ||
if (!js.isArbitraryObject(data)) { | ||
if (!isArbitraryObject(data)) { | ||
return false; | ||
@@ -12,7 +10,7 @@ } | ||
const isLogtoAccessTokenMap = (data) => { | ||
if (!js.isArbitraryObject(data)) { | ||
if (!isArbitraryObject(data)) { | ||
return false; | ||
} | ||
return Object.values(data).every((value) => { | ||
if (!js.isArbitraryObject(value)) { | ||
if (!isArbitraryObject(value)) { | ||
return false; | ||
@@ -26,3 +24,2 @@ } | ||
exports.isLogtoAccessTokenMap = isLogtoAccessTokenMap; | ||
exports.isLogtoSignInSessionItem = isLogtoSignInSessionItem; | ||
export { isLogtoAccessTokenMap, isLogtoSignInSessionItem }; |
@@ -1,3 +0,3 @@ | ||
export * from './requester'; | ||
export * from './requester.js'; | ||
export declare const buildAccessTokenKey: (resource?: string, scopes?: string[]) => string; | ||
export declare const getDiscoveryEndpoint: (endpoint: string) => string; |
@@ -1,9 +0,6 @@ | ||
'use strict'; | ||
import { discoveryPath } from '@logto/js'; | ||
var js = require('@logto/js'); | ||
const buildAccessTokenKey = (resource = '', scopes = []) => `${scopes.slice().sort().join(' ')}@${resource}`; | ||
const getDiscoveryEndpoint = (endpoint) => new URL(js.discoveryPath, endpoint).toString(); | ||
const getDiscoveryEndpoint = (endpoint) => new URL(discoveryPath, endpoint).toString(); | ||
exports.buildAccessTokenKey = buildAccessTokenKey; | ||
exports.getDiscoveryEndpoint = getDiscoveryEndpoint; | ||
export { buildAccessTokenKey, getDiscoveryEndpoint }; |
@@ -1,5 +0,3 @@ | ||
'use strict'; | ||
import { isLogtoRequestError, LogtoError, LogtoRequestError } from '@logto/js'; | ||
var js = require('@logto/js'); | ||
const createRequester = (fetchFunction) => { | ||
@@ -10,8 +8,8 @@ return async (...args) => { | ||
const responseJson = await response.json(); | ||
if (!js.isLogtoRequestError(responseJson)) { | ||
throw new js.LogtoError('unexpected_response_error', responseJson); | ||
if (!isLogtoRequestError(responseJson)) { | ||
throw new LogtoError('unexpected_response_error', responseJson); | ||
} | ||
// Expected request error from server | ||
const { code, message } = responseJson; | ||
throw new js.LogtoRequestError(code, message); | ||
throw new LogtoRequestError(code, message); | ||
} | ||
@@ -22,2 +20,2 @@ return response.json(); | ||
exports.createRequester = createRequester; | ||
export { createRequester }; |
{ | ||
"name": "@logto/client", | ||
"version": "1.1.2", | ||
"source": "./src/index.ts", | ||
"main": "./lib/index.js", | ||
"version": "2.0.0", | ||
"type": "module", | ||
"main": "./lib/index.cjs", | ||
"module": "./lib/index.js", | ||
"types": "./lib/index.d.ts", | ||
"exports": { | ||
"require": "./lib/index.js", | ||
"import": "./lib/index.mjs" | ||
"types": "./lib/index.d.ts", | ||
"require": "./lib/index.cjs", | ||
"import": "./lib/index.js", | ||
"default": "./lib/index.js" | ||
}, | ||
"module": "./lib/index.mjs", | ||
"types": "./lib/index.d.ts", | ||
"files": [ | ||
@@ -21,29 +23,14 @@ "lib" | ||
}, | ||
"scripts": { | ||
"dev:tsc": "tsc -p tsconfig.build.json -w --preserveWatchOutput", | ||
"precommit": "lint-staged", | ||
"check": "tsc --noEmit", | ||
"build": "rm -rf lib/ && tsc -p tsconfig.build.json --noEmit && rollup -c", | ||
"lint": "eslint --ext .ts src", | ||
"test": "jest", | ||
"test:coverage": "jest --silent --env=jsdom && jest --silent --coverage", | ||
"prepack": "pnpm test" | ||
}, | ||
"dependencies": { | ||
"@logto/js": "^1.1.2", | ||
"@silverhand/essentials": "^2.6.1", | ||
"@logto/js": "^2.0.0", | ||
"@silverhand/essentials": "^2.6.2", | ||
"camelcase-keys": "^7.0.1", | ||
"jose": "^4.13.2", | ||
"lodash.get": "^4.4.2", | ||
"lodash.once": "^4.1.1" | ||
"jose": "^4.13.2" | ||
}, | ||
"devDependencies": { | ||
"@jest/types": "^29.5.0", | ||
"@silverhand/eslint-config": "^2.0.0", | ||
"@silverhand/ts-config": "^1.0.0", | ||
"@silverhand/eslint-config": "^3.0.1", | ||
"@silverhand/ts-config": "^3.0.0", | ||
"@swc/core": "^1.3.50", | ||
"@swc/jest": "^0.2.24", | ||
"@types/jest": "^29.5.0", | ||
"@types/lodash.get": "^4.4.6", | ||
"@types/lodash.once": "^4.1.7", | ||
"@types/node": "^18.0.0", | ||
@@ -67,3 +54,11 @@ "eslint": "^8.38.0", | ||
}, | ||
"gitHead": "9e9a8b0887ef67baa7c3c564590bb06e7801d03e" | ||
} | ||
"scripts": { | ||
"dev:tsc": "tsc -p tsconfig.build.json -w --preserveWatchOutput", | ||
"precommit": "lint-staged", | ||
"check": "tsc --noEmit", | ||
"build": "rm -rf lib/ && tsc -p tsconfig.build.json --noEmit && rollup -c", | ||
"lint": "eslint --ext .ts src", | ||
"test": "jest", | ||
"test:coverage": "jest --silent --env=jsdom && jest --silent --coverage" | ||
} | ||
} |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
50438
4
15
27
1136
Yes
+ Added@logto/js@2.1.3(transitive)
- Removedlodash.get@^4.4.2
- Removedlodash.once@^4.1.1
- Removed@logto/js@1.1.2(transitive)
- Removedlodash.get@4.4.2(transitive)
- Removedlodash.once@4.1.1(transitive)
Updated@logto/js@^2.0.0