mirror of
https://github.com/logto-io/logto.git
synced 2025-02-17 22:04:19 -05:00
chore(connector): fix connector validator type (#1667)
This commit is contained in:
parent
3773701fc9
commit
fe5a10e92e
14 changed files with 48 additions and 39 deletions
|
@ -9,6 +9,7 @@ import nock from 'nock';
|
|||
import AlipayNativeConnector from '.';
|
||||
import { alipayEndpoint } from './constant';
|
||||
import { mockedAlipayNativeConfig, mockedAlipayNativeConfigWithValidPrivateKey } from './mock';
|
||||
import { AlipayNativeConfig } from './types';
|
||||
|
||||
const getConnectorConfig = jest.fn() as GetConnectorConfig;
|
||||
|
||||
|
@ -25,21 +26,21 @@ describe('validateConfig', () => {
|
|||
*/
|
||||
|
||||
it('should pass on valid config', async () => {
|
||||
const validator: ValidateConfig = alipayNativeMethods.validateConfig;
|
||||
const validator: ValidateConfig<AlipayNativeConfig> = alipayNativeMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator(mockedAlipayNativeConfig);
|
||||
}).not.toThrow();
|
||||
});
|
||||
|
||||
it('should fail on empty config', async () => {
|
||||
const validator: ValidateConfig = alipayNativeMethods.validateConfig;
|
||||
const validator: ValidateConfig<AlipayNativeConfig> = alipayNativeMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({});
|
||||
}).toThrow();
|
||||
});
|
||||
|
||||
it('should fail when missing required properties', async () => {
|
||||
const validator: ValidateConfig = alipayNativeMethods.validateConfig;
|
||||
const validator: ValidateConfig<AlipayNativeConfig> = alipayNativeMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({ appId: 'appId' });
|
||||
}).toThrow();
|
||||
|
|
|
@ -9,6 +9,7 @@ import nock from 'nock';
|
|||
import AlipayConnector from '.';
|
||||
import { alipayEndpoint, authorizationEndpoint } from './constant';
|
||||
import { mockedAlipayConfig, mockedAlipayConfigWithValidPrivateKey } from './mock';
|
||||
import { AlipayConfig } from './types';
|
||||
|
||||
const getConnectorConfig = jest.fn() as GetConnectorConfig;
|
||||
|
||||
|
@ -25,7 +26,7 @@ describe('validateConfig', () => {
|
|||
*/
|
||||
|
||||
it('should pass on valid config', async () => {
|
||||
const validator: ValidateConfig = alipayMethods.validateConfig;
|
||||
const validator: ValidateConfig<AlipayConfig> = alipayMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({
|
||||
appId: 'appId',
|
||||
|
@ -36,14 +37,14 @@ describe('validateConfig', () => {
|
|||
});
|
||||
|
||||
it('should fail on empty config', async () => {
|
||||
const validator: ValidateConfig = alipayMethods.validateConfig;
|
||||
const validator: ValidateConfig<AlipayConfig> = alipayMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({});
|
||||
}).toThrow();
|
||||
});
|
||||
|
||||
it('should fail when missing required properties', async () => {
|
||||
const validator: ValidateConfig = alipayMethods.validateConfig;
|
||||
const validator: ValidateConfig<AlipayConfig> = alipayMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({ appId: 'appId' });
|
||||
}).toThrow();
|
||||
|
|
|
@ -3,6 +3,7 @@ import { GetConnectorConfig, ValidateConfig } from '@logto/connector-types';
|
|||
import AliyunDmConnector from '.';
|
||||
import { mockedConfig } from './mock';
|
||||
import { singleSendMail } from './single-send-mail';
|
||||
import { AliyunDmConfig } from './types';
|
||||
|
||||
const getConnectorConfig = jest.fn() as GetConnectorConfig;
|
||||
|
||||
|
@ -34,7 +35,7 @@ describe('validateConfig()', () => {
|
|||
*/
|
||||
|
||||
it('should pass on valid config', async () => {
|
||||
const validator: ValidateConfig = aliyunDmMethods.validateConfig;
|
||||
const validator: ValidateConfig<AliyunDmConfig> = aliyunDmMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({
|
||||
accessKeyId: 'accessKeyId',
|
||||
|
@ -46,7 +47,7 @@ describe('validateConfig()', () => {
|
|||
});
|
||||
|
||||
it('should fail if config is invalid', async () => {
|
||||
const validator: ValidateConfig = aliyunDmMethods.validateConfig;
|
||||
const validator: ValidateConfig<AliyunDmConfig> = aliyunDmMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({});
|
||||
}).toThrow();
|
||||
|
|
|
@ -3,6 +3,7 @@ import { GetConnectorConfig, ValidateConfig } from '@logto/connector-types';
|
|||
import AliyunSmsConnector from '.';
|
||||
import { mockedConnectorConfig, mockedValidConnectorConfig, phoneTest, codeTest } from './mock';
|
||||
import { sendSms } from './single-send-text';
|
||||
import { AliyunSmsConfig } from './types';
|
||||
|
||||
const getConnectorConfig = jest.fn() as GetConnectorConfig;
|
||||
|
||||
|
@ -30,14 +31,14 @@ describe('validateConfig()', () => {
|
|||
*/
|
||||
|
||||
it('should pass on valid config', async () => {
|
||||
const validator: ValidateConfig = aliyunSmsMethods.validateConfig;
|
||||
const validator: ValidateConfig<AliyunSmsConfig> = aliyunSmsMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator(mockedValidConnectorConfig);
|
||||
}).not.toThrow();
|
||||
});
|
||||
|
||||
it('should fail if config is invalid', async () => {
|
||||
const validator: ValidateConfig = aliyunSmsMethods.validateConfig;
|
||||
const validator: ValidateConfig<AliyunSmsConfig> = aliyunSmsMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({});
|
||||
}).toThrow();
|
||||
|
|
|
@ -9,6 +9,7 @@ import { jwtVerify } from 'jose';
|
|||
import AppleConnector from '.';
|
||||
import { authorizationEndpoint } from './constant';
|
||||
import { mockedConfig } from './mock';
|
||||
import { AppleConfig } from './types';
|
||||
|
||||
const getConnectorConfig = jest.fn() as GetConnectorConfig;
|
||||
|
||||
|
@ -50,14 +51,14 @@ describe('validateConfig', () => {
|
|||
*/
|
||||
|
||||
it('should be true on valid config', async () => {
|
||||
const validator: ValidateConfig = appleMethods.validateConfig;
|
||||
const validator: ValidateConfig<AppleConfig> = appleMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({ clientId: 'clientId' });
|
||||
}).not.toThrow();
|
||||
});
|
||||
|
||||
it('should be false on empty config', async () => {
|
||||
const validator: ValidateConfig = appleMethods.validateConfig;
|
||||
const validator: ValidateConfig<AppleConfig> = appleMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({});
|
||||
}).toThrow();
|
||||
|
|
|
@ -9,6 +9,7 @@ import nock from 'nock';
|
|||
import FacebookConnector from '.';
|
||||
import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './constant';
|
||||
import { clientId, clientSecret, code, dummyRedirectUri, fields, mockedConfig } from './mock';
|
||||
import { FacebookConfig } from './types';
|
||||
|
||||
const getConnectorConfig = jest.fn() as GetConnectorConfig;
|
||||
|
||||
|
@ -30,14 +31,14 @@ describe('facebook connector', () => {
|
|||
*/
|
||||
|
||||
it('should pass on valid config', async () => {
|
||||
const validator: ValidateConfig = facebookMethods.validateConfig;
|
||||
const validator: ValidateConfig<FacebookConfig> = facebookMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({ clientId, clientSecret });
|
||||
}).not.toThrow();
|
||||
});
|
||||
|
||||
it('should fail on invalid config', async () => {
|
||||
const validator: ValidateConfig = facebookMethods.validateConfig;
|
||||
const validator: ValidateConfig<FacebookConfig> = facebookMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({});
|
||||
}).toThrow();
|
||||
|
|
|
@ -10,6 +10,7 @@ import * as qs from 'query-string';
|
|||
import GithubConnector from '.';
|
||||
import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './constant';
|
||||
import { mockedConfig } from './mock';
|
||||
import { GithubConfig } from './types';
|
||||
|
||||
const getConnectorConfig = jest.fn() as GetConnectorConfig;
|
||||
|
||||
|
@ -77,21 +78,21 @@ describe('validateConfig', () => {
|
|||
*/
|
||||
|
||||
it('should pass on valid config', async () => {
|
||||
const validator: ValidateConfig = githubMethods.validateConfig;
|
||||
const validator: ValidateConfig<GithubConfig> = githubMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({ clientId: 'clientId', clientSecret: 'clientSecret' });
|
||||
}).not.toThrow();
|
||||
});
|
||||
|
||||
it('should fail on empty config', async () => {
|
||||
const validator: ValidateConfig = githubMethods.validateConfig;
|
||||
const validator: ValidateConfig<GithubConfig> = githubMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({});
|
||||
}).toThrow();
|
||||
});
|
||||
|
||||
it('should fail when missing clientSecret', async () => {
|
||||
const validator: ValidateConfig = githubMethods.validateConfig;
|
||||
const validator: ValidateConfig<GithubConfig> = githubMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({ clientId: 'clientId' });
|
||||
}).toThrow();
|
||||
|
|
|
@ -9,6 +9,7 @@ import nock from 'nock';
|
|||
import GoogleConnector from '.';
|
||||
import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './constant';
|
||||
import { mockedConfig } from './mock';
|
||||
import { GoogleConfig } from './types';
|
||||
|
||||
const getConnectorConfig = jest.fn() as GetConnectorConfig;
|
||||
|
||||
|
@ -30,14 +31,14 @@ describe('google connector', () => {
|
|||
*/
|
||||
|
||||
it('should pass on valid config', async () => {
|
||||
const validator: ValidateConfig = googleMethods.validateConfig;
|
||||
const validator: ValidateConfig<GoogleConfig> = googleMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({ clientId: 'clientId', clientSecret: 'clientSecret' });
|
||||
}).not.toThrow();
|
||||
});
|
||||
|
||||
it('should fail on invalid config', async () => {
|
||||
const validator: ValidateConfig = googleMethods.validateConfig;
|
||||
const validator: ValidateConfig<GoogleConfig> = googleMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({});
|
||||
}).toThrow();
|
||||
|
|
|
@ -2,7 +2,7 @@ import { GetConnectorConfig, ValidateConfig } from '@logto/connector-types';
|
|||
|
||||
import SendGridMailConnector from '.';
|
||||
import { mockedConfig } from './mock';
|
||||
import { ContextType } from './types';
|
||||
import { ContextType, SendGridMailConfig } from './types';
|
||||
|
||||
const getConnectorConfig = jest.fn() as GetConnectorConfig;
|
||||
|
||||
|
@ -25,7 +25,7 @@ describe('validateConfig()', () => {
|
|||
*/
|
||||
|
||||
it('should pass on valid config', async () => {
|
||||
const validator: ValidateConfig = sendGridMailMethods.validateConfig;
|
||||
const validator: ValidateConfig<SendGridMailConfig> = sendGridMailMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({
|
||||
apiKey: 'apiKey',
|
||||
|
@ -44,7 +44,7 @@ describe('validateConfig()', () => {
|
|||
});
|
||||
|
||||
it('should be false if config is invalid', async () => {
|
||||
const validator: ValidateConfig = sendGridMailMethods.validateConfig;
|
||||
const validator: ValidateConfig<SendGridMailConfig> = sendGridMailMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({});
|
||||
}).toThrow();
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
import { GetConnectorConfig, ValidateConfig } from '@logto/connector-types';
|
||||
|
||||
import SmtpConnector from '.';
|
||||
import { SmtpConfig } from './types';
|
||||
|
||||
const getConnectorConfig = jest.fn() as GetConnectorConfig;
|
||||
|
||||
|
@ -17,7 +18,7 @@ describe('validateConfig()', () => {
|
|||
*/
|
||||
|
||||
it('should pass on valid config', async () => {
|
||||
const validator: ValidateConfig = smtpMethods.validateConfig;
|
||||
const validator: ValidateConfig<SmtpConfig> = smtpMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({
|
||||
host: 'smtp.testing.com',
|
||||
|
@ -56,7 +57,7 @@ describe('validateConfig()', () => {
|
|||
});
|
||||
|
||||
it('should be false if config is invalid', async () => {
|
||||
const validator: ValidateConfig = smtpMethods.validateConfig;
|
||||
const validator: ValidateConfig<SmtpConfig> = smtpMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({});
|
||||
}).toThrow();
|
||||
|
|
|
@ -2,6 +2,7 @@ import { GetConnectorConfig, ValidateConfig } from '@logto/connector-types';
|
|||
|
||||
import TwilioSmsConnector from '.';
|
||||
import { mockedConfig } from './mock';
|
||||
import { TwilioSmsConfig } from './types';
|
||||
|
||||
const getConnectorConfig = jest.fn() as GetConnectorConfig;
|
||||
|
||||
|
@ -18,14 +19,14 @@ describe('validateConfig()', () => {
|
|||
*/
|
||||
|
||||
it('should pass on valid config', async () => {
|
||||
const validator: ValidateConfig = twilioSmsMethods.validateConfig;
|
||||
const validator: ValidateConfig<TwilioSmsConfig> = twilioSmsMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator(mockedConfig);
|
||||
}).not.toThrow();
|
||||
});
|
||||
|
||||
it('throws if config is invalid', async () => {
|
||||
const validator: ValidateConfig = twilioSmsMethods.validateConfig;
|
||||
const validator: ValidateConfig<TwilioSmsConfig> = twilioSmsMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({});
|
||||
}).toThrow();
|
||||
|
|
|
@ -9,6 +9,7 @@ import nock from 'nock';
|
|||
import WechatNativeConnector from '.';
|
||||
import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './constant';
|
||||
import { mockedConfig } from './mock';
|
||||
import { WechatNativeConfig } from './types';
|
||||
|
||||
const getConnectorConfig = jest.fn() as GetConnectorConfig;
|
||||
|
||||
|
@ -102,21 +103,21 @@ describe('validateConfig', () => {
|
|||
*/
|
||||
|
||||
it('should pass on valid config', async () => {
|
||||
const validator: ValidateConfig = wechatNativeMethods.validateConfig;
|
||||
const validator: ValidateConfig<WechatNativeConfig> = wechatNativeMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({ appId: 'appId', appSecret: 'appSecret' });
|
||||
}).not.toThrow();
|
||||
});
|
||||
|
||||
it('should fail on empty config', async () => {
|
||||
const validator: ValidateConfig = wechatNativeMethods.validateConfig;
|
||||
const validator: ValidateConfig<WechatNativeConfig> = wechatNativeMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({});
|
||||
}).toThrow();
|
||||
});
|
||||
|
||||
it('should fail when missing appSecret', async () => {
|
||||
const validator: ValidateConfig = wechatNativeMethods.validateConfig;
|
||||
const validator: ValidateConfig<WechatNativeConfig> = wechatNativeMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({ appId: 'appId' });
|
||||
}).toThrow();
|
||||
|
|
|
@ -9,6 +9,7 @@ import nock from 'nock';
|
|||
import WechatConnector from '.';
|
||||
import { accessTokenEndpoint, authorizationEndpoint, userInfoEndpoint } from './constant';
|
||||
import { mockedConfig } from './mock';
|
||||
import { WechatConfig } from './types';
|
||||
|
||||
const getConnectorConfig = jest.fn() as GetConnectorConfig;
|
||||
|
||||
|
@ -102,21 +103,21 @@ describe('validateConfig', () => {
|
|||
*/
|
||||
|
||||
it('should pass on valid config', async () => {
|
||||
const validator: ValidateConfig = wechatMethods.validateConfig;
|
||||
const validator: ValidateConfig<WechatConfig> = wechatMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({ appId: 'appId', appSecret: 'appSecret' });
|
||||
}).not.toThrow();
|
||||
});
|
||||
|
||||
it('should fail on empty config', async () => {
|
||||
const validator: ValidateConfig = wechatMethods.validateConfig;
|
||||
const validator: ValidateConfig<WechatConfig> = wechatMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({});
|
||||
}).toThrow();
|
||||
});
|
||||
|
||||
it('should fail when missing appSecret', async () => {
|
||||
const validator: ValidateConfig = wechatMethods.validateConfig;
|
||||
const validator: ValidateConfig<WechatConfig> = wechatMethods.validateConfig;
|
||||
expect(() => {
|
||||
validator({ appId: 'appId' });
|
||||
}).toThrow();
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
import {
|
||||
ValidateConfig,
|
||||
ConnectorInstance,
|
||||
EmailConnectorInstance,
|
||||
SmsConnectorInstance,
|
||||
|
@ -89,6 +88,7 @@ export default function connectorRoutes<T extends AuthedRouter>(router: T) {
|
|||
const connectorInstance = await getConnectorInstanceById(id);
|
||||
const {
|
||||
connector: { config },
|
||||
validateConfig,
|
||||
metadata,
|
||||
} = connectorInstance;
|
||||
|
||||
|
@ -96,8 +96,7 @@ export default function connectorRoutes<T extends AuthedRouter>(router: T) {
|
|||
* Assertion functions always need explicit annotations.
|
||||
* See https://github.com/microsoft/TypeScript/issues/36931#issuecomment-589753014
|
||||
*/
|
||||
// eslint-disable-next-line unicorn/consistent-destructuring
|
||||
const validator: ValidateConfig = connectorInstance.validateConfig;
|
||||
const validator: typeof validateConfig = validateConfig;
|
||||
|
||||
if (enabled) {
|
||||
validator(config);
|
||||
|
@ -145,15 +144,13 @@ export default function connectorRoutes<T extends AuthedRouter>(router: T) {
|
|||
body,
|
||||
} = ctx.guard;
|
||||
|
||||
const connectorInstance = await getConnectorInstanceById(id);
|
||||
const { metadata } = connectorInstance;
|
||||
const { metadata, validateConfig } = await getConnectorInstanceById(id);
|
||||
|
||||
/**
|
||||
* Assertion functions always need explicit annotations.
|
||||
* See https://github.com/microsoft/TypeScript/issues/36931#issuecomment-589753014
|
||||
*/
|
||||
// eslint-disable-next-line unicorn/consistent-destructuring
|
||||
const validator: ValidateConfig = connectorInstance.validateConfig;
|
||||
const validator: typeof validateConfig = validateConfig;
|
||||
|
||||
if (body.config) {
|
||||
validator(body.config);
|
||||
|
|
Loading…
Add table
Reference in a new issue