diff --git a/apps/storefront/package.json b/apps/storefront/package.json index 04a9dbe9..c2a14c25 100644 --- a/apps/storefront/package.json +++ b/apps/storefront/package.json @@ -8,7 +8,8 @@ "lint": "eslint \"**/*.{ts,tsx}\"", "preview": "vite preview", "test": "vitest", - "coverage": "vitest --coverage" + "coverage": "vitest --coverage", + "start": "http-server ./dist --cors" }, "dependencies": { "@b3/global-b3": "*", @@ -23,6 +24,7 @@ "@rollup/plugin-graphql": "^1.1.0", "@types/babel__core": "^7.1.19", "date-fns": "^2.28.0", + "http-server": "^14.1.1", "react": "^18.0.0", "react-dom": "^18.0.0", "react-hook-form": "^7.33.1", diff --git a/apps/storefront/src/App.tsx b/apps/storefront/src/App.tsx index 93a488de..81968b7d 100644 --- a/apps/storefront/src/App.tsx +++ b/apps/storefront/src/App.tsx @@ -26,15 +26,10 @@ import { import globalB3 from '@b3/global-b3' import { - getCustomerInfo, -} from '@/shared/service/bc' - -import { - getB2BCompanyUserInfo, -} from '@/shared/service/b2b' - -import { - B3SStorage, + // B3SStorage, + getChannelId, + loginInfo, + getCurrentCustomerInfo, } from '@/utils' import { @@ -92,8 +87,8 @@ export default function App() { const { state: { isB2BUser, - isLogin, customerId, + BcToken, }, dispatch, } = useContext(GlobaledContext) @@ -116,55 +111,6 @@ export default function App() { } }, [isOpen]) - const getCurrentCustomerInfo = async () => { - try { - const { - data: { - customer: { - entityId: customerId, - phone: phoneNumber, - firstName, - lastName, - email: emailAddress = '', - }, - }, - } = await getCustomerInfo() - - const { - companyUserInfo: { - userType, - userInfo: { - role, - }, - }, - } = await getB2BCompanyUserInfo(emailAddress) - - if (customerId) { - B3SStorage.set('emailAddress', emailAddress) - - dispatch({ - type: 'common', - payload: { - isB2BUser: userType === 3, - role, - isLogin: true, - customerId, - customer: { - phoneNumber, - firstName, - lastName, - emailAddress, - }, - emailAddress, - }, - }) - } - } catch (error) { - // eslint-disable-next-line no-console - console.log(error) - } - } - useEffect(() => { const { pathname, @@ -201,7 +147,18 @@ export default function App() { }) } - getCurrentCustomerInfo() + const init = async () => { + // bc token + if (!BcToken) { + await getChannelId() + await loginInfo() + } + if (!customerId) { + getCurrentCustomerInfo(dispatch) + } + } + + init() }, []) const createConvertB2BNavNode = () => { @@ -216,7 +173,7 @@ export default function App() { } useEffect(() => { - if (isLogin && !isB2BUser && customerId) { + if (!isB2BUser && customerId) { // already exist if (document.querySelector('.navUser-item.navUser-convert-b2b')) { return @@ -238,7 +195,7 @@ export default function App() { } else { document.querySelector('.navUser-item.navUser-convert-b2b')?.remove() } - }, [isB2BUser, isLogin, customerId]) + }, [isB2BUser, customerId]) return ( diff --git a/apps/storefront/src/pages/login/Login.tsx b/apps/storefront/src/pages/login/Login.tsx index 56869bcb..b074e3e1 100644 --- a/apps/storefront/src/pages/login/Login.tsx +++ b/apps/storefront/src/pages/login/Login.tsx @@ -22,21 +22,17 @@ import { import { getB2BRegisterLogo, - getBCToken, getBCForcePasswordReset, getB2BLoginPageConfig, - getBCStoreChannelId, - getB2BCompanyUserInfo, } from '@/shared/service/b2b' import { bcLogin, bcLogoutLogin, - getCustomerInfo, } from '@/shared/service/bc' import { - B3SStorage, + getCurrentCustomerInfo, } from '@/utils' import { @@ -55,11 +51,8 @@ import { getLogo, LoginInfoInit, LoginConfig, - getloginTokenInfo, loginCheckout, getLoginFlag, - getBCChannelId, - ChannelstoreSites, } from './config' import LoginWidget from './component/LoginWidget' @@ -88,7 +81,6 @@ export default function Login() { const [logo, setLogo] = useState('') const [flag, setLoginFlag] = useState('') - const [channelId, setChannelId] = useState(1) const [loginAccount, setLoginAccount] = useState({ emailAddress: '', }) @@ -103,7 +95,6 @@ export default function Login() { const { state: { isCheckout, - BcToken, }, dispatch, } = useContext(GlobaledContext) @@ -132,11 +123,6 @@ export default function Login() { }, } = await getB2BLoginPageConfig() - const { - storeBasicInfo, - }: any = await getBCStoreChannelId() - - const getChannelId = getBCChannelId((storeBasicInfo as ChannelstoreSites)?.storeSites || []) const Info = { loginTitle: pageTitle, loginBtn: signInButtonText, @@ -161,21 +147,6 @@ export default function Login() { if (loginFlag) setLoginFlag(loginFlag) if (loginFlag === '3') { - if (!BcToken) { - const loginTokenInfo = getloginTokenInfo(channelId) - const { - data: { - token, - }, - } = await getBCToken(loginTokenInfo) - B3SStorage.set('BcToken', token) - dispatch({ - type: 'common', - payload: { - BcToken: token, - }, - }) - } await bcLogoutLogin() dispatch({ @@ -186,7 +157,7 @@ export default function Login() { }) } - setChannelId(getChannelId) + // setChannelId(getChannelId) setLoginInfo(Info) setLogo(registerLogo) setLoading(false) @@ -255,21 +226,6 @@ export default function Login() { } } else { try { - const loginTokenInfo = getloginTokenInfo(channelId) - const { - data: { - token, - }, - } = await getBCToken(loginTokenInfo) - dispatch({ - type: 'common', - payload: { - BcToken: token, - }, - }) - B3SStorage.set('BcToken', token) - B3SStorage.set('emailAddress', data.emailAddress) - const getBCFieldsValue = { email: data.emailAddress, pass: data.password, @@ -281,46 +237,9 @@ export default function Login() { if (errors?.length || !bcData) { getforcePasswordReset(data.emailAddress) } else { - const { - companyUserInfo: { - userType, - userInfo: { - role, - }, - }, - } = await getB2BCompanyUserInfo(data.emailAddress) - - const { - data: { - customer: { - entityId: customerId, - phone: phoneNumber, - firstName, - lastName, - email: emailAddress, - }, - }, - } = await getCustomerInfo() - - // 2 bc , 3 b2b - dispatch({ - type: 'common', - payload: { - isB2BUser: userType === 3, - role, - isLogin: true, - customerId, - customer: { - phoneNumber, - firstName, - lastName, - emailAddress, - }, - emailAddress: data.emailAddress, - }, - }) + const info = await getCurrentCustomerInfo(dispatch) - if (userType === 3 && role === 3) { + if (info?.userType === 3 && info?.role === 3) { navigate('/dashboard') } else { navigate('/order') diff --git a/apps/storefront/src/pages/registered/Registered.tsx b/apps/storefront/src/pages/registered/Registered.tsx index 68805cf8..3b1061e6 100644 --- a/apps/storefront/src/pages/registered/Registered.tsx +++ b/apps/storefront/src/pages/registered/Registered.tsx @@ -23,21 +23,17 @@ import { getB2BCountries, storeB2BBasicInfo, getB2BAccountFormFields, - getBCToken, - getBCStoreChannelId, - getB2BCompanyUserInfo, } from '@/shared/service/b2b' -import { - B3SStorage, -} from '@/utils' - import { getBCRegisterCustomFields, bcLogin, - getCustomerInfo, } from '@/shared/service/bc' +import { + getCurrentCustomerInfo, +} from '@/utils' + import RegisteredStep from './RegisteredStep' import RegisterContent from './RegisterContent' @@ -62,10 +58,7 @@ import { } from './config' import { - getloginTokenInfo, loginCheckout, - getBCChannelId, - ChannelstoreSites, LoginConfig, } from '../login/config' @@ -268,28 +261,6 @@ export default function Registered(props: RegisteredProps) { } } else { try { - const { - storeBasicInfo, - }: any = await getBCStoreChannelId() - - const channelId = getBCChannelId((storeBasicInfo as ChannelstoreSites)?.storeSites || []) - - const loginTokenInfo = getloginTokenInfo(channelId) - const { - data: { - token, - }, - } = await getBCToken(loginTokenInfo) - - globalDispatch({ - type: 'common', - payload: { - BcToken: token, - }, - }) - B3SStorage.set('BcToken', token) - B3SStorage.set('emailAddress', data.emailAddress) - const getBCFieldsValue = { email: data.emailAddress, pass: data.password, @@ -297,44 +268,7 @@ export default function Registered(props: RegisteredProps) { await bcLogin(getBCFieldsValue) - const { - companyUserInfo: { - userType, - userInfo: { - role, - }, - }, - } = await getB2BCompanyUserInfo(data.emailAddress) - - const { - data: { - customer: { - entityId: customerId, - phone: phoneNumber, - firstName, - lastName, - email: emailAddress, - }, - }, - } = await getCustomerInfo() - - // 2 bc , 3 b2b - globalDispatch({ - type: 'common', - payload: { - isB2BUser: userType === 3, - role, - isLogin: true, - customerId, - customer: { - phoneNumber, - firstName, - lastName, - emailAddress, - }, - emailAddress: data.emailAddress, - }, - }) + await getCurrentCustomerInfo(globalDispatch) if (isCloseGotoBCHome) { window.location.href = '/' diff --git a/apps/storefront/src/shared/global/context/config.ts b/apps/storefront/src/shared/global/context/config.ts index ce12aa4e..1d58cac7 100644 --- a/apps/storefront/src/shared/global/context/config.ts +++ b/apps/storefront/src/shared/global/context/config.ts @@ -23,27 +23,30 @@ export interface GlobalState { customerId: number | string, customer?: CustomerInfo, emailAddress: string, - role: number, + role: number | string, } export const initState = { isCheckout: false, isCloseGotoBCHome: false, BcToken: B3SStorage.get('BcToken') || '', - isB2BUser: false, - isLogin: true, - customerId: '', - emailAddress: '', - role: 0, + isB2BUser: B3SStorage.get('isB2BUser') || false, + isLogin: false, + customerId: B3SStorage.get('B3CustomerId') || '', + emailAddress: B3SStorage.get('B3EmailAddress') || '', + role: B3SStorage.get('B3Role') || '', + customer: B3SStorage.get('B3CustomerInfo') || {}, } export interface GlobalAction { type: string, payload: Partial } + +export type DispatchProps = Dispatch> export interface GlobalContext { state: GlobalState, - dispatch: Dispatch>, + dispatch: DispatchProps, } export interface GlobaledProviderProps { diff --git a/apps/storefront/src/utils/index.ts b/apps/storefront/src/utils/index.ts index 4fda399a..7b859aa6 100644 --- a/apps/storefront/src/utils/index.ts +++ b/apps/storefront/src/utils/index.ts @@ -17,6 +17,12 @@ import { B3SStorage, } from './b3Storage' +import { + getChannelId, + loginInfo, + getCurrentCustomerInfo, +} from './loginInfo' + export { convertArrayToGraphql, convertObjectToGraphql, @@ -25,4 +31,7 @@ export { validatorRules, B3LStorage, B3SStorage, + loginInfo, + getChannelId, + getCurrentCustomerInfo, } diff --git a/apps/storefront/src/utils/loginInfo.ts b/apps/storefront/src/utils/loginInfo.ts new file mode 100644 index 00000000..4cd86543 --- /dev/null +++ b/apps/storefront/src/utils/loginInfo.ts @@ -0,0 +1,158 @@ +import { + getBCStoreChannelId, + getBCToken, + getB2BCompanyUserInfo, +} from '@/shared/service/b2b' + +import { + getCustomerInfo, +} from '@/shared/service/bc' + +import { + B3SStorage, + storeHash, +} from '@/utils' + +import { + DispatchProps, +} from '@/shared/global/context/config' + +interface ChannelIdProps { + channelId: number, + urls: Array, +} + +export interface ChannelstoreSites { + storeSites?: Array | [], +} + +export const getBCChannelId = (storeSitesany: Array) => { + if (storeSitesany.length === 1) { + return storeSitesany[0].channelId + } + + let channelId: number = 1 + + const { + origin, + } = window.location + + storeSitesany.forEach((item: ChannelIdProps) => { + if (item.urls.includes(origin)) { + channelId = item.channelId + } + }) + + return channelId +} + +export const getChannelId = async () => { + const { + storeBasicInfo, + }: any = await getBCStoreChannelId() + + const channelId = getBCChannelId((storeBasicInfo as ChannelstoreSites)?.storeSites || []) + + B3SStorage.set('B3channelId', channelId) +} + +export const getloginTokenInfo = (channelId: number) => { + const { + origin, + } = window.location + const data = { + storeHash, + method: 'post', + url: '/v3/storefront/api-token', + params: {}, + data: { + channel_id: channelId || 1, + expires_at: 1866896353, + allowed_cors_origins: [ + `${origin}`, + ], + }, + } + + return data +} + +export const loginInfo = async () => { + const channelId = B3SStorage.get('B3channelId') + const loginTokenInfo = getloginTokenInfo(channelId) + const { + data: { + token, + }, + } = await getBCToken(loginTokenInfo) + + B3SStorage.set('BcToken', token) +} + +export const getCurrentCustomerInfo = async (dispatch: DispatchProps) => { + try { + const { + data: { + customer, + }, + } = await getCustomerInfo() + + if (!customer) return + + const { + entityId: customerId, + phone: phoneNumber, + firstName, + lastName, + email: emailAddress = '', + } = customer + + const { + companyUserInfo: { + userType, + userInfo: { + role, + }, + }, + } = await getB2BCompanyUserInfo(emailAddress) + + if (customerId) { + const customerInfo = { + phoneNumber, + firstName, + lastName, + emailAddress, + } + // B3SStorage.set('emailAddress', emailAddress) + B3SStorage.set('B3CustomerInfo', customerInfo) + B3SStorage.set('B3CustomerId', customerId) + B3SStorage.set('B3EmailAddress', emailAddress) + B3SStorage.set('B3Role', role) + B3SStorage.set('isB2BUser', userType === 3) + + dispatch({ + type: 'common', + payload: { + isB2BUser: userType === 3, + role, + customerId, + customer: { + phoneNumber, + firstName, + lastName, + emailAddress, + }, + emailAddress, + }, + }) + } + + return { + role, + userType, + } + } catch (error) { + // eslint-disable-next-line no-console + console.log(error) + } +} diff --git a/yarn.lock b/yarn.lock index faf65c74..37552baf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1413,6 +1413,13 @@ astral-regex@^2.0.0: resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== +async@^2.6.4: + version "2.6.4" + resolved "https://registry.yarnpkg.com/async/-/async-2.6.4.tgz#706b7ff6084664cd7eae713f6f965433b5504221" + integrity sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA== + dependencies: + lodash "^4.17.14" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -1447,6 +1454,13 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +basic-auth@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg== + dependencies: + safe-buffer "5.1.2" + binary-extensions@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" @@ -1571,7 +1585,7 @@ chalk@^2.0.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^4.0.0, chalk@^4.1.0: +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -1756,6 +1770,11 @@ core-js@^3.24.1: resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.24.1.tgz#cf7724d41724154010a6576b7b57d94c5d66e64f" integrity sha512-0QTBSYSUZ6Gq21utGzkfITDylE8jWC9Ne1D2MrhvlsZBI1x39OdDIVbzSqtgMndIy6BlHxBXpMGqzZmnztg2rg== +corser@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" + integrity sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ== + cosmiconfig-typescript-loader@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-2.0.2.tgz#7e7ce6064af041c910e1e43fb0fd9625cee56e93" @@ -2419,6 +2438,11 @@ esutils@^2.0.2: resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + execa@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" @@ -2537,6 +2561,11 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.6.tgz#022e9218c637f9f3fc9c35ab9c9193f05add60b2" integrity sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ== +follow-redirects@^1.0.0: + version "1.15.1" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.1.tgz#0ca6a452306c9b276e4d3127483e29575e207ad5" + integrity sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA== + foreground-child@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" @@ -2778,6 +2807,11 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + history@^5.2.0: version "5.3.0" resolved "https://registry.yarnpkg.com/history/-/history-5.3.0.tgz#1548abaa245ba47992f063a0783db91ef201c73b" @@ -2825,6 +2859,34 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +http-server@^14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/http-server/-/http-server-14.1.1.tgz#d60fbb37d7c2fdff0f0fbff0d0ee6670bd285e2e" + integrity sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A== + dependencies: + basic-auth "^2.0.1" + chalk "^4.1.2" + corser "^2.0.1" + he "^1.2.0" + html-encoding-sniffer "^3.0.0" + http-proxy "^1.18.1" + mime "^1.6.0" + minimist "^1.2.6" + opener "^1.5.1" + portfinder "^1.0.28" + secure-compare "3.0.1" + union "~0.5.0" + url-join "^4.0.1" + https-proxy-agent@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" @@ -3399,7 +3461,7 @@ lodash.sortby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== -lodash@^4.17.15, lodash@^4.17.19: +lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3516,6 +3578,11 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" +mime@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" @@ -3552,6 +3619,13 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== +mkdirp@^0.5.6: + version "0.5.6" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" @@ -3716,6 +3790,11 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" +opener@^1.5.1: + version "1.5.2" + resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -3859,6 +3938,15 @@ pirates@^4.0.1: resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== +portfinder@^1.0.28: + version "1.0.32" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.32.tgz#2fe1b9e58389712429dc2bea5beb2146146c7f81" + integrity sha512-on2ZJVVDXRADWE6jnQaX0ioEylzgBpQk8r55NE4wjXW1ZxO+BgDlY6DXwj20i0V8eB4SenDQ00WEaxfiIQPcxg== + dependencies: + async "^2.6.4" + debug "^3.2.7" + mkdirp "^0.5.6" + postcss-load-config@^3.0.1: version "3.1.4" resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz#1ab2571faf84bb078877e1d07905eabe9ebda855" @@ -3919,6 +4007,13 @@ q@^1.5.1: resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== +qs@^6.4.0: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -4100,6 +4195,11 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + resolve-from@5.0.0, resolve-from@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" @@ -4186,7 +4286,7 @@ rxjs@^7.5.5: dependencies: tslib "^2.1.0" -safe-buffer@~5.1.1: +safe-buffer@5.1.2, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -4215,6 +4315,11 @@ scheduler@^0.23.0: dependencies: loose-envify "^1.1.0" +secure-compare@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/secure-compare/-/secure-compare-3.0.1.tgz#f1a0329b308b221fae37b9974f3d578d0ca999e3" + integrity sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw== + "semver@2 || 3 || 4 || 5": version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" @@ -4841,6 +4946,13 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +union@~0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/union/-/union-0.5.0.tgz#b2c11be84f60538537b846edb9ba266ba0090075" + integrity sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA== + dependencies: + qs "^6.4.0" + universalify@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -4866,6 +4978,11 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" +url-join@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" + integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== + util-deprecate@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"