Skip to content

Commit

Permalink
Fix openService/openServiceUrl option parameter typing
Browse files Browse the repository at this point in the history
Previous release introduced a bug where mandatory required attributes for a view options became optional.
This commit fixes the typing issue.
  • Loading branch information
mt-max committed Aug 24, 2023
1 parent b66715d commit e48b16e
Show file tree
Hide file tree
Showing 7 changed files with 207 additions and 52 deletions.
6 changes: 3 additions & 3 deletions sample/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import mtLinkSdk, {
OpenServicesConfigsOptions,
ServiceId,
LoginLinkTo,
ServicesListType
VaultViewServiceList
} from '@moneytree/mt-link-javascript-sdk';

import elements from './elements';
Expand Down Expand Up @@ -134,12 +134,12 @@ elements.openServiceBtn.onclick = () => {
view: 'services-list',
type:
(openServiceOptionsElms.type.options[openServiceOptionsElms.type.selectedIndex].value as Pick<
ServicesListType,
VaultViewServiceList,
'type'
>['type']) || undefined,
group:
(openServiceOptionsElms.group.options[openServiceOptionsElms.group.selectedIndex].value as Pick<
ServicesListType,
VaultViewServiceList,
'group'
>['group']) || undefined,
search: openServiceOptionsElms.search.value || undefined
Expand Down
6 changes: 3 additions & 3 deletions src/api/__tests__/open-service-url.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import qs from 'qs';

import { MY_ACCOUNT_DOMAINS, VAULT_DOMAINS, LINK_KIT_DOMAINS } from '../../server-paths';
import { MtLinkSdk, ServiceId } from '../..';
import { MtLinkSdk } from '../..';
import openServiceUrl from '../open-service-url';
import { generateConfigs } from '../../helper';

Expand Down Expand Up @@ -148,8 +148,8 @@ describe('api', () => {
test('invalid service id', () => {
expect(() => {
// force cast invalid value so that we can use it for testing
openServiceUrl(new MtLinkSdk().storedOptions, 'invalid' as ServiceId);
}).toThrow('[mt-link-sdk] Invalid `serviceId` in `openServiceUrl/openService`, got: invalid');
openServiceUrl(new MtLinkSdk().storedOptions, 'invalid' as 'vault');
}).toThrow('[mt-link-sdk] Invalid `serviceId` in `openServiceUrl`, got: invalid');
});

test('saml_subject_id is passed when initialized', () => {
Expand Down
6 changes: 3 additions & 3 deletions src/api/__tests__/open-service.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import qs from 'qs';

import { MY_ACCOUNT_DOMAINS, VAULT_DOMAINS, LINK_KIT_DOMAINS } from '../../server-paths';
import { MtLinkSdk, ServiceId } from '../..';
import { MtLinkSdk } from '../..';
import openService from '../open-service';
import { generateConfigs } from '../../helper';

Expand Down Expand Up @@ -194,8 +194,8 @@ describe('api', () => {
test('invalid service id', () => {
expect(() => {
// force cast invalid value so that we can use it for testing
openService(new MtLinkSdk().storedOptions, 'invalid' as ServiceId);
}).toThrow('[mt-link-sdk] Invalid `serviceId` in `openServiceUrl/openService`, got: invalid');
openService(new MtLinkSdk().storedOptions, 'invalid' as 'myaccount');
}).toThrow('[mt-link-sdk] Invalid `serviceId` in `openService`, got: invalid');
});

test('saml_subject_id is passed when initialized', () => {
Expand Down
75 changes: 59 additions & 16 deletions src/api/open-service-url.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,19 @@ import { generateConfigs, mergeConfigs } from '../helper';
import { MY_ACCOUNT_DOMAINS, VAULT_DOMAINS, LINK_KIT_DOMAINS } from '../server-paths';
import {
StoredOptions,
ServiceId,
ConnectionSettingType,
ServiceConnectionType,
ServicesListType,
VaultViewConnectionSetting,
VaultViewServiceConnection,
VaultViewServiceList,
OpenServiceUrlOptions,
VaultOpenServiceOptions,
MyAccountOpenServiceOptions
VaultServiceTypes,
MyAccountServiceTypes,
LinkKitOpenServiceUrlOptions,
MyAccountOpenServiceUrlOptions,
ConfigsOptionsWithoutIsNewTab,
VaultOpenServiceUrlViewServiceList,
VaultOpenServiceUrlViewServiceConnection,
VaultOpenServiceUrlViewConnectionSetting,
VaultOpenServiceUrlViewCustomerSupport
} from '../typings';

interface QueryData {
Expand All @@ -23,19 +29,53 @@ interface QueryData {

export default function openServiceUrl(
storedOptions: StoredOptions,
serviceId: ServiceId,
serviceId: 'link-kit',
options?: LinkKitOpenServiceUrlOptions
): string;
export default function openServiceUrl(
storedOptions: StoredOptions,
serviceId: 'myaccount',
options?: MyAccountOpenServiceUrlOptions
): string;
export default function openServiceUrl(
storedOptions: StoredOptions,
serviceId: 'vault',
options?: ConfigsOptionsWithoutIsNewTab
): string;
export default function openServiceUrl(
storedOptions: StoredOptions,
serviceId: 'vault',
options?: VaultOpenServiceUrlViewServiceList
): string;
export default function openServiceUrl(
storedOptions: StoredOptions,
serviceId: 'vault',
options?: VaultOpenServiceUrlViewServiceConnection
): string;
export default function openServiceUrl(
storedOptions: StoredOptions,
serviceId: 'vault',
options?: VaultOpenServiceUrlViewConnectionSetting
): string;
export default function openServiceUrl(
storedOptions: StoredOptions,
serviceId: 'vault',
options?: VaultOpenServiceUrlViewCustomerSupport
): string;
export default function openServiceUrl(
storedOptions: StoredOptions,
serviceId: 'myaccount' | 'vault' | 'link-kit',
options: OpenServiceUrlOptions = {}
): string {
const { clientId, mode, cobrandClientId, locale, samlSubjectId } = storedOptions;
const { view = '', ...rest } = options as VaultOpenServiceOptions | MyAccountOpenServiceOptions;

const getQueryValue = (needStringify = true): string | QueryData => {
const query: QueryData = {
client_id: clientId,
cobrand_client_id: cobrandClientId,
locale,
saml_subject_id: samlSubjectId,
configs: generateConfigs(mergeConfigs(storedOptions, rest))
configs: generateConfigs(mergeConfigs(storedOptions, options))
};

if (!needStringify) {
Expand All @@ -47,14 +87,16 @@ export default function openServiceUrl(

switch (serviceId) {
case 'vault':
if (!view) {
let { view: vaultView } = options as VaultServiceTypes;

if (!vaultView) {
return `${VAULT_DOMAINS[mode]}?${getQueryValue()}`;
}

switch (view) {
switch (vaultView) {
case 'services-list':
// eslint-disable-next-line no-case-declarations
const { group, type, search } = options as ServicesListType;
const { group, type, search } = options as VaultViewServiceList;

return `${VAULT_DOMAINS[mode]}/services?${stringify({
...(getQueryValue(false) as QueryData),
Expand All @@ -65,13 +107,13 @@ export default function openServiceUrl(

case 'service-connection':
// eslint-disable-next-line no-case-declarations
const { entityKey } = options as ServiceConnectionType;
const { entityKey } = options as VaultViewServiceConnection;

return `${VAULT_DOMAINS[mode]}/service/${entityKey}?${getQueryValue()}`;

case 'connection-setting':
// eslint-disable-next-line no-case-declarations
const { credentialId } = options as ConnectionSettingType;
const { credentialId } = options as VaultViewConnectionSetting;

return `${VAULT_DOMAINS[mode]}/connection/${credentialId}?${getQueryValue()}`;

Expand All @@ -81,12 +123,13 @@ export default function openServiceUrl(
}

case 'myaccount':
return `${MY_ACCOUNT_DOMAINS[mode]}/${view}?${getQueryValue()}`;
let { view: myAccountView = '' } = options as MyAccountServiceTypes;
return `${MY_ACCOUNT_DOMAINS[mode]}/${myAccountView}?${getQueryValue()}`;

case 'link-kit':
return `${LINK_KIT_DOMAINS[mode]}?${getQueryValue()}`;

default:
throw new Error(`[mt-link-sdk] Invalid \`serviceId\` in \`openServiceUrl/openService\`, got: ${serviceId}`);
throw new Error(`[mt-link-sdk] Invalid \`serviceId\` in \`openServiceUrl\`, got: ${serviceId}`);
}
}
58 changes: 56 additions & 2 deletions src/api/open-service.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,49 @@
import { getIsTabValue, openWindow } from '../helper';
import { StoredOptions, ServiceId, OpenServiceOptions } from '../typings';
import {
StoredOptions,
ServiceId,
OpenServiceOptions,
LinkKitOpenServiceOptions,
MyAccountOpenServiceOptions,
VaultOpenServiceViewServiceList,
VaultOpenServiceViewServiceConnection,
VaultOpenServiceViewConnectionSetting,
VaultOpenServiceViewCustomerSupport,
ConfigsOptions
} from '../typings';
import openServiceUrl from './open-service-url';

export default function openService(
storedOptions: StoredOptions,
serviceId: 'link-kit',
options?: LinkKitOpenServiceOptions
): void;
export default function openService(
storedOptions: StoredOptions,
serviceId: 'myaccount',
options?: MyAccountOpenServiceOptions
): void;
export default function openService(storedOptions: StoredOptions, serviceId: 'vault', options?: ConfigsOptions): void;
export default function openService(
storedOptions: StoredOptions,
serviceId: 'vault',
options?: VaultOpenServiceViewServiceList
): void;
export default function openService(
storedOptions: StoredOptions,
serviceId: 'vault',
options?: VaultOpenServiceViewServiceConnection
): void;
export default function openService(
storedOptions: StoredOptions,
serviceId: 'vault',
options?: VaultOpenServiceViewConnectionSetting
): void;
export default function openService(
storedOptions: StoredOptions,
serviceId: 'vault',
options?: VaultOpenServiceViewCustomerSupport
): void;
export default function openService(
storedOptions: StoredOptions,
serviceId: ServiceId,
Expand All @@ -13,5 +55,17 @@ export default function openService(

const { isNewTab, ...restOptions } = options;

openWindow(openServiceUrl(storedOptions, serviceId, restOptions), getIsTabValue(isNewTab));
switch (serviceId) {
case 'myaccount':
openWindow(openServiceUrl(storedOptions, 'myaccount', restOptions), getIsTabValue(isNewTab));
break;
case 'vault':
openWindow(openServiceUrl(storedOptions, 'vault', restOptions), getIsTabValue(isNewTab));
break;
case 'link-kit':
openWindow(openServiceUrl(storedOptions, 'link-kit', restOptions), getIsTabValue(isNewTab));
break;
default:
throw new Error(`[mt-link-sdk] Invalid \`serviceId\` in \`openService\`, got: ${serviceId}`);
}
}
53 changes: 45 additions & 8 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import onboardUrl from './api/onboard-url';
import logout from './api/logout';
import logoutUrl from './api/logout-url';
import openService from './api/open-service';
import openServiceUrlApi from './api/open-service-url';
import openServiceUrl from './api/open-service-url';
import requestLoginLink from './api/request-login-link';
import exchangeToken from './api/exchange-token';
import tokenInfo from './api/token-info';
Expand All @@ -26,11 +26,19 @@ import {
OpenServiceUrlOptions,
LinkKitOpenServiceUrlOptions,
MyAccountOpenServiceUrlOptions,
VaultOpenServiceUrlOptions,
VaultOpenServiceOptions,
LinkKitOpenServiceOptions,
MyAccountOpenServiceOptions,
OpenServiceOptions
OpenServiceOptions,
ConfigsOptions,
ConfigsOptionsWithoutIsNewTab,
VaultOpenServiceUrlViewServiceList,
VaultOpenServiceUrlViewServiceConnection,
VaultOpenServiceUrlViewConnectionSetting,
VaultOpenServiceUrlViewCustomerSupport,
VaultOpenServiceViewServiceList,
VaultOpenServiceViewServiceConnection,
VaultOpenServiceViewConnectionSetting,
VaultOpenServiceViewCustomerSupport
} from './typings';

export * from './typings';
Expand Down Expand Up @@ -88,16 +96,45 @@ export class MtLinkSdk {

public openService(serviceId: 'link-kit', options?: LinkKitOpenServiceOptions): void;
public openService(serviceId: 'myaccount', options?: MyAccountOpenServiceOptions): void;
public openService(serviceId: 'vault', options?: VaultOpenServiceOptions): void;
public openService(serviceId: 'vault', options?: ConfigsOptions): void;
public openService(serviceId: 'vault', options?: VaultOpenServiceViewServiceList): void;
public openService(serviceId: 'vault', options?: VaultOpenServiceViewServiceConnection): void;
public openService(serviceId: 'vault', options?: VaultOpenServiceViewConnectionSetting): void;
public openService(serviceId: 'vault', options?: VaultOpenServiceViewCustomerSupport): void;
public openService(serviceId: ServiceId, options?: OpenServiceOptions): void {
openService(this.storedOptions, serviceId, options);
switch (serviceId) {
case 'myaccount':
openService(this.storedOptions, 'myaccount', options);
break;
case 'vault':
openService(this.storedOptions, 'vault', options);
break;
case 'link-kit':
openService(this.storedOptions, 'link-kit', options);
break;
default:
throw new Error(`[mt-link-sdk] Invalid \`serviceId\` in \`openService\`, got: ${serviceId}`);
}
}

public openServiceUrl(serviceId: 'link-kit', options?: LinkKitOpenServiceUrlOptions): string;
public openServiceUrl(serviceId: 'myaccount', options?: MyAccountOpenServiceUrlOptions): string;
public openServiceUrl(serviceId: 'vault', options?: VaultOpenServiceUrlOptions): string;
public openServiceUrl(serviceId: 'vault', options?: ConfigsOptionsWithoutIsNewTab): string;
public openServiceUrl(serviceId: 'vault', options?: VaultOpenServiceUrlViewServiceList): string;
public openServiceUrl(serviceId: 'vault', options?: VaultOpenServiceUrlViewServiceConnection): string;
public openServiceUrl(serviceId: 'vault', options?: VaultOpenServiceUrlViewConnectionSetting): string;
public openServiceUrl(serviceId: 'vault', options?: VaultOpenServiceUrlViewCustomerSupport): string;
public openServiceUrl(serviceId: ServiceId, options?: OpenServiceUrlOptions): string {
return openServiceUrlApi(this.storedOptions, serviceId, options);
switch (serviceId) {
case 'myaccount':
return openServiceUrl(this.storedOptions, 'myaccount', options);
case 'vault':
return openServiceUrl(this.storedOptions, 'vault', options);
case 'link-kit':
return openServiceUrl(this.storedOptions, 'link-kit', options);
default:
throw new Error(`[mt-link-sdk] Invalid \`serviceId\` in \`openServiceUrl\`, got: ${serviceId}`);
}
}

public requestLoginLink(options?: RequestLoginLinkOptions): Promise<void> {
Expand Down

0 comments on commit e48b16e

Please sign in to comment.