diff --git a/clientConfig/rollup.config.js b/clientConfig/rollup.config.js index 809145b..38b5bb6 100644 --- a/clientConfig/rollup.config.js +++ b/clientConfig/rollup.config.js @@ -2,9 +2,10 @@ const packageJson = require('./package.json'); import babel from '@rollup/plugin-babel'; import {terser} from 'rollup-plugin-terser'; +import tsPlugin from '@rollup/plugin-typescript'; export default { - plugins: [babel({babelHelpers: 'bundled'}), terser()], + plugins: [babel({babelHelpers: 'bundled'}), terser(), tsPlugin()], input: './src/index.js', output: [ { diff --git a/componentConfig/rollup.config.js b/componentConfig/rollup.config.js index a308e3f..f01d7d0 100644 --- a/componentConfig/rollup.config.js +++ b/componentConfig/rollup.config.js @@ -1,8 +1,9 @@ import babel from '@rollup/plugin-babel'; import {terser} from 'rollup-plugin-terser'; +import tsPlugin from '@rollup/plugin-typescript'; export default { - plugins: [babel({babelHelpers: 'bundled'}), terser()], + plugins: [babel({babelHelpers: 'bundled'}), terser(), tsPlugin()], input: 'src/components/index.js', output: [ { diff --git a/middlewareConfig/rollup.config.js b/middlewareConfig/rollup.config.js index b1c8366..5e4fd15 100644 --- a/middlewareConfig/rollup.config.js +++ b/middlewareConfig/rollup.config.js @@ -1,8 +1,9 @@ import babel from '@rollup/plugin-babel'; import {terser} from 'rollup-plugin-terser'; +import tsPlugin from '@rollup/plugin-typescript'; export default { - plugins: [babel({babelHelpers: 'bundled'}), terser()], + plugins: [babel({babelHelpers: 'bundled'}), terser(), tsPlugin()], input: 'src/middleware/index.js', output: [ { diff --git a/package.json b/package.json index b6a940f..3c65c94 100644 --- a/package.json +++ b/package.json @@ -79,7 +79,7 @@ "@babel/preset-react": "^7.17.12", "@babel/preset-typescript": "^7.23.3", "@rollup/plugin-babel": "^5.3.1", - "@rollup/plugin-typescript": "^11.1.5", + "@rollup/plugin-typescript": "^11.1.6", "@testing-library/react": "^14.2.1", "@types/cookie": "^0.5.3", "@types/jest": "^29.5.12", diff --git a/serverConfig/rollup.config.js b/serverConfig/rollup.config.js index f892285..3ad18f7 100644 --- a/serverConfig/rollup.config.js +++ b/serverConfig/rollup.config.js @@ -1,8 +1,9 @@ import babel from '@rollup/plugin-babel'; import {terser} from 'rollup-plugin-terser'; +import tsPlugin from '@rollup/plugin-typescript'; export default { - plugins: [babel({babelHelpers: 'bundled'}), terser()], + plugins: [babel({babelHelpers: 'bundled'}), terser(), tsPlugin()], input: 'src/server/index.js', output: [ { diff --git a/src/server/index.js b/src/server/index.js index 414233e..6d0ef33 100644 --- a/src/server/index.js +++ b/src/server/index.js @@ -1,4 +1,4 @@ -export {default as getKindeServerSession} from '../session/index'; +export {default as getKindeServerSession} from '../session/index.ts'; export {authMiddleware, withAuth} from '../authMiddleware/authMiddleware'; export { LoginLink, diff --git a/src/session/getUser.ts b/src/session/getUser.ts index 840b835..1219d3e 100644 --- a/src/session/getUser.ts +++ b/src/session/getUser.ts @@ -1,10 +1,9 @@ -import {sessionManager} from './sessionManager'; -import {kindeClient} from './kindeServerClient'; -import {config} from '../config/index'; -import {generateUserObject} from '../utils/generateUserObject'; +import jwtDecode from 'jwt-decode'; import {NextApiRequest, NextApiResponse} from 'next'; import {KindeIdToken, KindeUser} from '../../types'; -import jwtDecode from 'jwt-decode'; +import {config} from '../config/index'; +import {generateUserObject} from '../utils/generateUserObject'; +import {sessionManager} from './sessionManager'; export const getUserFactory = (req: NextApiRequest, res: NextApiResponse) => @@ -12,26 +11,8 @@ export const getUserFactory = try { const idToken = jwtDecode( (await sessionManager(req, res).getSessionItem('id_token')) as string - ) as KindeIdToken; - - return generateUserObject(idToken); - - const user = await kindeClient.getUser(sessionManager(req, res)); - const userProperties = await kindeClient.getClaimValue( - sessionManager(req, res), - 'user_properties' - ); - const phone_number = await kindeClient.getClaimValue( - sessionManager(req, res), - 'phone_number', - 'id_token' - ); - const username = await kindeClient.getClaimValue( - sessionManager(req, res), - 'preferred_username', - 'id_token' - ); - return generateUserObject(user, userProperties, phone_number, username); + ) as KindeIdToken; + return generateUserObject(idToken) as KindeUser; } catch (error) { if (config.isDebugMode) { console.debug('getUser', error); diff --git a/src/session/index.ts b/src/session/index.ts index 3908b48..1f61d72 100644 --- a/src/session/index.ts +++ b/src/session/index.ts @@ -19,7 +19,7 @@ import {getClaimFactory} from './getClaim'; import {config} from '../config/index'; import {NextApiRequest, NextApiResponse} from 'next'; -export default function (req: NextApiRequest, res: NextApiResponse) { +export default function (req?: NextApiRequest, res?: NextApiResponse) { return { refreshTokens: async () => { try { diff --git a/src/utils/generateUserObject.ts b/src/utils/generateUserObject.ts index af6d1eb..9858828 100644 --- a/src/utils/generateUserObject.ts +++ b/src/utils/generateUserObject.ts @@ -1,72 +1,25 @@ -import { - KindeAccessToken, - KindeIdToken, - KindeUser, - KindeUserProperties -} from '../../types'; +import {KindeIdToken, KindeUser} from '../../types'; -const getUserProperties = ( - properties: Record -): KindeUserProperties< - T, - { - kp_usr_city: 'city'; - kp_usr_industry: 'industry'; - kp_usr_job_title: 'job_title'; - kp_usr_middle_name: 'middle_name'; - kp_usr_postcode: 'postcode'; - kp_usr_salutation: 'salutation'; - kp_usr_state_region: 'state_region'; - kp_usr_street_address: 'street_address'; - kp_usr_street_address_2: 'street_address_2'; - } -> => { - const userProperties: KindeUserProperties< - T, - { - kp_usr_city: 'city'; - kp_usr_industry: 'industry'; - kp_usr_job_title: 'job_title'; - kp_usr_middle_name: 'middle_name'; - kp_usr_postcode: 'postcode'; - kp_usr_salutation: 'salutation'; - kp_usr_state_region: 'state_region'; - kp_usr_street_address: 'street_address'; - kp_usr_street_address_2: 'street_address_2'; - } - > = Object.keys(properties).reduce((acc, key) => { - if (key.startsWith('kp_usr_')) { - acc[key.substring(7)] = properties[key]?.v; - } - acc[key] = properties[key]?.v; - return acc; - }, {}); - - return userProperties; -}; - -export const generateUserObject = (idToken: KindeIdToken): KindeUser => { - const user = { +type CustomPropertyType = Record; +export const generateUserObject = (idToken: KindeIdToken) => { + const user: KindeUser = { id: idToken.sub, email: idToken.email, family_name: idToken.family_name, given_name: idToken.given_name, - name: idToken.name, picture: idToken.picture, username: idToken.preferred_username, phone_number: idToken.phone_number }; + let res = user; - const properties = idToken.properties; + const properties = idToken.user_properties; if (properties) { - } - - let res = user; - if (userProperties) { const { kp_usr_city: cityObj, kp_usr_industry: industryObj, + kp_usr_is_marketing_opt_in: isMarketingOptInObj, kp_usr_job_title: jobTitleObj, kp_usr_middle_name: middleNameObj, kp_usr_postcode: postcodeObj, @@ -75,18 +28,21 @@ export const generateUserObject = (idToken: KindeIdToken): KindeUser => { kp_usr_street_address: streetAddressObj, kp_usr_street_address_2: streetAddress2Obj, ...rest - } = userProperties; - - const sanitizedRest = Object.keys(rest).reduce((acc, key) => { - acc[key] = rest[key]?.v; - return acc; - }, {}); - + } = properties; + + const sanitizedRest: Record = Object.keys(rest).reduce( + (acc, key) => { + acc[key] = rest[key]?.v; + return acc; + }, + {} + ); res = { - ...res, + ...user, properties: { city: cityObj?.v, industry: industryObj?.v, + is_marketing_opt_in: isMarketingOptInObj?.v, job_title: jobTitleObj?.v, middle_name: middleNameObj?.v, postcode: postcodeObj?.v, @@ -98,14 +54,5 @@ export const generateUserObject = (idToken: KindeIdToken): KindeUser => { } }; } - - if (phone_number || username) { - res = { - ...res, - ...(phone_number && {phone_number}), - ...(username && {username}) - }; - } - return res; }; diff --git a/types.d.ts b/types.d.ts index e6e7cd0..7dd3ff4 100644 --- a/types.d.ts +++ b/types.d.ts @@ -103,17 +103,26 @@ export type KindeIdToken = { picture: string; phone_number?: string; preferred_username?: string; - properties?: KindeTokenUserProperties; + user_properties?: KindeTokenUserProperties; rat: number; sub: string; updated_at: number; }; -type KindeUserProperties> = { - [K in keyof T as K extends keyof Mapping ? Mapping[K] : K]: T[K]; -}; +type KindeUserProperties> = { + city?: string; + industry?: string; + is_marketing_opt_in?: string; + job_title?: string; + middle_name?: string; + postcode?: string; + salutation?: string; + state_region?: string; + street_address?: string; + street_address_2?: string; +} & T; -export type KindeUser = { +export type KindeUserBase = { id: string; email: string | null; given_name: string | null; @@ -121,9 +130,12 @@ export type KindeUser = { picture: string | null; username?: string | null; phone_number?: string | null; - properties?: KindeUserProperties; }; +export interface KindeUser extends KindeUserBase { + properties?: KindeUserProperties; +} + export type KindePermissions = { permissions: string[]; orgCode: string | null;