0
Fork 0
mirror of https://github.com/logto-io/logto.git synced 2025-02-17 22:04:19 -05:00

refactor(core): use name attribute as the default connector name (#4984)

use name attribute as the default connector name
This commit is contained in:
simeng-li 2023-11-29 12:59:00 +08:00 committed by GitHub
parent 4be339d4bf
commit 5105830e2f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 18 deletions

View file

@ -146,7 +146,8 @@ describe('getFullSignInExperience()', () => {
wellConfiguredSsoConnector, wellConfiguredSsoConnector,
]); ]);
const fullSignInExperience = await getFullSignInExperience(); const fullSignInExperience = await getFullSignInExperience('en');
const connectorFactory = ssoConnectorFactories[wellConfiguredSsoConnector.providerName];
expect(fullSignInExperience).toStrictEqual({ expect(fullSignInExperience).toStrictEqual({
...mockSignInExperience, ...mockSignInExperience,
@ -159,9 +160,9 @@ describe('getFullSignInExperience()', () => {
ssoConnectors: [ ssoConnectors: [
{ {
id: wellConfiguredSsoConnector.id, id: wellConfiguredSsoConnector.id,
connectorName: wellConfiguredSsoConnector.providerName, connectorName: connectorFactory.name.en,
logo: ssoConnectorFactories[wellConfiguredSsoConnector.providerName].logo, logo: connectorFactory.logo,
darkLogo: ssoConnectorFactories[wellConfiguredSsoConnector.providerName].logoDark, darkLogo: connectorFactory.logoDark,
}, },
], ],
isDevelopmentTenant: false, isDevelopmentTenant: false,
@ -178,14 +179,16 @@ describe('get sso connectors', () => {
wellConfiguredSsoConnector, wellConfiguredSsoConnector,
]); ]);
const { ssoConnectors } = await getFullSignInExperience(); const { ssoConnectors } = await getFullSignInExperience('jp');
const connectorFactory = ssoConnectorFactories[wellConfiguredSsoConnector.providerName];
expect(ssoConnectors).toEqual([ expect(ssoConnectors).toEqual([
{ {
id: wellConfiguredSsoConnector.id, id: wellConfiguredSsoConnector.id,
connectorName: wellConfiguredSsoConnector.providerName, connectorName: connectorFactory.name.en,
logo: ssoConnectorFactories[wellConfiguredSsoConnector.providerName].logo, logo: connectorFactory.logo,
darkLogo: ssoConnectorFactories[wellConfiguredSsoConnector.providerName].logoDark, darkLogo: connectorFactory.logoDark,
}, },
]); ]);
}); });
@ -205,14 +208,16 @@ describe('get sso connectors', () => {
}, },
]); ]);
const { ssoConnectors } = await getFullSignInExperience(); const connectorFactory = ssoConnectorFactories[wellConfiguredSsoConnector.providerName];
const { ssoConnectors } = await getFullSignInExperience('en');
expect(ssoConnectors).toEqual([ expect(ssoConnectors).toEqual([
{ {
id: wellConfiguredSsoConnector.id, id: wellConfiguredSsoConnector.id,
connectorName: displayName, connectorName: displayName,
logo: ssoConnectorFactories[wellConfiguredSsoConnector.providerName].logo, logo: connectorFactory.logo,
darkLogo: ssoConnectorFactories[wellConfiguredSsoConnector.providerName].logoDark, darkLogo: connectorFactory.logoDark,
}, },
]); ]);
}); });

View file

@ -11,6 +11,7 @@ import { ssoConnectorFactories } from '#src/sso/index.js';
import type Queries from '#src/tenants/Queries.js'; import type Queries from '#src/tenants/Queries.js';
import assertThat from '#src/utils/assert-that.js'; import assertThat from '#src/utils/assert-that.js';
import { getTenantSubscriptionPlan } from '#src/utils/subscription/index.js'; import { getTenantSubscriptionPlan } from '#src/utils/subscription/index.js';
import { isKeyOfI18nPhrases } from '#src/utils/translation.js';
import { type CloudConnectionLibrary } from '../cloud-connection.js'; import { type CloudConnectionLibrary } from '../cloud-connection.js';
@ -63,7 +64,7 @@ export const createSignInExperienceLibrary = (
}); });
}; };
const getActiveSsoConnectors = async (): Promise<SsoConnectorMetadata[]> => { const getActiveSsoConnectors = async (locale: string): Promise<SsoConnectorMetadata[]> => {
// TODO: @simeng-li Remove the dev feature check once SSO is fully released // TODO: @simeng-li Remove the dev feature check once SSO is fully released
if (!EnvSet.values.isDevFeaturesEnabled) { if (!EnvSet.values.isDevFeaturesEnabled) {
return []; return [];
@ -73,13 +74,17 @@ export const createSignInExperienceLibrary = (
return ssoConnectors.map(({ providerName, id, branding }): SsoConnectorMetadata => { return ssoConnectors.map(({ providerName, id, branding }): SsoConnectorMetadata => {
const factory = ssoConnectorFactories[providerName]; const factory = ssoConnectorFactories[providerName];
const { name, logo, logoDark } = factory;
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing -- empty string is not a valid locale
const providerNameInLocale = (isKeyOfI18nPhrases(locale, name) && name[locale]) || name.en;
return { return {
id, id,
// Use the provider name as the connector name if the branding displayName is not provided // Use the provider name as the connector name if the branding displayName is not provided
connectorName: branding.displayName ?? providerName, connectorName: branding.displayName ?? providerNameInLocale,
logo: branding.logo ?? factory.logo, logo: branding.logo ?? logo,
darkLogo: branding.darkLogo ?? factory.logoDark, darkLogo: branding.darkLogo ?? logoDark,
}; };
}); });
}; };
@ -105,12 +110,12 @@ export const createSignInExperienceLibrary = (
return plan.id === developmentTenantPlanId; return plan.id === developmentTenantPlanId;
}; };
const getFullSignInExperience = async (): Promise<FullSignInExperience> => { const getFullSignInExperience = async (locale: string): Promise<FullSignInExperience> => {
const [signInExperience, logtoConnectors, ssoConnectors, isDevelopmentTenant] = const [signInExperience, logtoConnectors, ssoConnectors, isDevelopmentTenant] =
await Promise.all([ await Promise.all([
findDefaultSignInExperience(), findDefaultSignInExperience(),
getLogtoConnectors(), getLogtoConnectors(),
getActiveSsoConnectors(), getActiveSsoConnectors(locale),
getIsDevelopmentTenant(), getIsDevelopmentTenant(),
]); ]);

View file

@ -44,7 +44,7 @@ export default function wellKnownRoutes<T extends AnonymousRouter>(
'/.well-known/sign-in-exp', '/.well-known/sign-in-exp',
koaGuard({ response: guardFullSignInExperience, status: 200 }), koaGuard({ response: guardFullSignInExperience, status: 200 }),
async (ctx, next) => { async (ctx, next) => {
ctx.body = await getFullSignInExperience(); ctx.body = await getFullSignInExperience(ctx.locale);
return next(); return next();
} }

View file

@ -1,3 +1,4 @@
import { type I18nPhrases } from '@logto/connector-kit';
import type { Translation } from '@logto/schemas'; import type { Translation } from '@logto/schemas';
/** /**
@ -23,3 +24,6 @@ export const isStrictlyPartial = (
return typeof fullValue === typeof value; return typeof fullValue === typeof value;
}); });
}; };
export const isKeyOfI18nPhrases = (key: string, phrases: I18nPhrases): key is keyof I18nPhrases =>
key in phrases;