diff --git a/examples/children/react16/src/index.js b/examples/children/react16/src/index.js index aa43a4059..dd93cc38d 100644 --- a/examples/children/react16/src/index.js +++ b/examples/children/react16/src/index.js @@ -97,3 +97,8 @@ if (window.__MICRO_APP_ENVIRONMENT__) { // setInterval(() => { // console.log(`子应用${window.__MICRO_APP_NAME__}的setInterval`) // }, 1000) + +// const dynamicScript1 = document.createElement('script') +// dynamicScript1.setAttribute('type', 'module') +// dynamicScript1.textContent = 'console.warn("inline module")' +// document.head.appendChild(dynamicScript1) diff --git a/examples/children/vite/src/main.js b/examples/children/vite/src/main.js index 5ff1fdeaf..5d93bc2ce 100644 --- a/examples/children/vite/src/main.js +++ b/examples/children/vite/src/main.js @@ -14,6 +14,32 @@ const router = VueRouter.createRouter({ routes, }) -const app = createApp(App) -app.use(router) -app.mount('#vite-app') +// const app = createApp(App) +// app.use(router) +// app.mount('#vite-app') + + +let app = null +// 将渲染操作放入 mount 函数 +function mount () { + app = createApp(App) + app.use(router) + app.mount('#vite-app') + + console.log('微应用child-vite渲染了') +} + +// 将卸载操作放入 unmount 函数 +function unmount () { + app.unmount() + app = null + console.log('微应用child-vite卸载了') +} + +// 微前端环境下,注册mount和unmount方法 +if (window.__MICRO_APP_BASE_APPLICATION__) { + window['micro-app-vite'] = { mount, unmount } +} else { + // 非微前端环境直接渲染 + mount() +} diff --git a/src/__tests__/common.ts b/src/__tests__/common/initial.ts similarity index 95% rename from src/__tests__/common.ts rename to src/__tests__/common/initial.ts index 9e1cf1302..b43ab974a 100644 --- a/src/__tests__/common.ts +++ b/src/__tests__/common/initial.ts @@ -1,7 +1,7 @@ /* eslint-disable promise/param-names */ import '@webcomponents/webcomponentsjs/custom-elements-es5-adapter' -import { setCurrentAppName, defer } from '../libs/utils' -const liveServer = require('../../scripts/test_server') +import { setCurrentAppName, defer } from '../../libs/utils' +const liveServer = require('../../../scripts/test_server') global.fetch = require('node-fetch') jest.useRealTimers() diff --git a/src/__tests__/common/set_ssr_env.ts b/src/__tests__/common/set_ssr_env.ts new file mode 100644 index 000000000..70605d9d5 --- /dev/null +++ b/src/__tests__/common/set_ssr_env.ts @@ -0,0 +1,3 @@ +Object.defineProperty(global, 'window', { + value: undefined, +}) diff --git a/src/__tests__/create_app.test.ts b/src/__tests__/create_app.test.ts index 125be3f18..971cb2da8 100644 --- a/src/__tests__/create_app.test.ts +++ b/src/__tests__/create_app.test.ts @@ -1,5 +1,5 @@ /* eslint-disable promise/param-names */ -import { commonStartEffect, releaseAllEffect, ports } from './common' +import { commonStartEffect, releaseAllEffect, ports } from './common/initial' import { appInstanceMap } from '../create_app' import { appStatus } from '../constants' import microApp from '..' diff --git a/src/__tests__/demo/common/index.html b/src/__tests__/demo/common/index.html index b3cadad13..1b99c936f 100644 --- a/src/__tests__/demo/common/index.html +++ b/src/__tests__/demo/common/index.html @@ -24,6 +24,11 @@ + + + common diff --git a/src/__tests__/demo/common/script2.js b/src/__tests__/demo/common/script2.js index 7675df267..25d74f3ef 100644 --- a/src/__tests__/demo/common/script2.js +++ b/src/__tests__/demo/common/script2.js @@ -2,3 +2,10 @@ const pdom = document.createElement('p') pdom.innerText = '22222' document.querySelectorAll('body')[0].append('11111', pdom) + +// 动态创建的 ignore 类型script保留原有特性,不会被处理 +const dynamicIgnoreScript = document.createElement('script') +dynamicIgnoreScript.setAttribute('ignore', 'true') +dynamicIgnoreScript.textContent = 'window.ignoreInjectData = 1' +document.body.appendChild(dynamicIgnoreScript) +expect(((0, eval)('window')).ignoreInjectData).toBe(1) diff --git a/src/__tests__/interact/index.test.ts b/src/__tests__/interact/index.test.ts index 0a4ed4cd4..ec8dde45a 100644 --- a/src/__tests__/interact/index.test.ts +++ b/src/__tests__/interact/index.test.ts @@ -7,7 +7,7 @@ import { rebuildDataCenterSnapshot, } from '../../interact' import { defer } from '../../libs/utils' -import { rewriteConsole, releaseConsole } from '../common' +import { rewriteConsole, releaseConsole } from '../common/initial' import CreateApp, { appInstanceMap } from '../../create_app' describe('data center', () => { diff --git a/src/__tests__/interact/lifecycles_event.test.ts b/src/__tests__/interact/lifecycles_event.test.ts index 5a794b8ca..fd06445a8 100644 --- a/src/__tests__/interact/lifecycles_event.test.ts +++ b/src/__tests__/interact/lifecycles_event.test.ts @@ -1,5 +1,5 @@ /* eslint-disable promise/param-names */ -import { commonStartEffect, releaseAllEffect, ports } from '../common' +import { commonStartEffect, releaseAllEffect, ports } from '../common/initial' import microApp from '../..' describe('lifecycles_event', () => { diff --git a/src/__tests__/libs/additional.test.ts b/src/__tests__/libs/additional.test.ts index 192c660de..54db8d7e6 100644 --- a/src/__tests__/libs/additional.test.ts +++ b/src/__tests__/libs/additional.test.ts @@ -1,8 +1,11 @@ import { listenUmountOfNestedApp, replaseUnmountOfNestedApp } from '../../libs/additional' import CreateApp, { appInstanceMap } from '../../create_app' +import { elementInstanceMap } from '../../micro_app_element' describe('test additional', () => { + // 卸载循环内嵌的子应用 test('unmount app loop build-in', () => { + // test-app1模拟开启shadowRoot的未卸载孙应用 const con1 = document.createElement('micro-app') // @ts-ignore con1.disconnectedCallback = jest.fn @@ -15,7 +18,9 @@ describe('test additional', () => { container: con1.shadowRoot, } appInstanceMap.set('test-app1', app1 as CreateApp) + elementInstanceMap.set(con1, true) + // test-app2模拟正常未卸载孙应用 const con2 = document.createElement('micro-app') // @ts-ignore con2.disconnectedCallback = jest.fn @@ -27,7 +32,9 @@ describe('test additional', () => { container: con2, } appInstanceMap.set('test-app2', app2 as CreateApp) + elementInstanceMap.set(con2, true) + // test-app3模拟已卸载孙应用(没有container) const app3 = { name: 'test-app3', url: 'http://localhost:3000/', @@ -38,12 +45,16 @@ describe('test additional', () => { expect(appInstanceMap.size).toBe(3) + // 模拟非嵌套循环 replaseUnmountOfNestedApp() listenUmountOfNestedApp() + // 模拟嵌套循环 window.__MICRO_APP_ENVIRONMENT__ = true replaseUnmountOfNestedApp() listenUmountOfNestedApp() + + // 模拟当前应用被卸载 const event = new CustomEvent('unmount') window.dispatchEvent(event) @@ -51,4 +62,29 @@ describe('test additional', () => { window.__MICRO_APP_ENVIRONMENT__ = false }) + + // 分支覆盖 + test('coverage of branch', () => { + // test-app4模已卸载孙应用 + const app1 = { + name: 'test-app4', + url: 'http://localhost:3000/', + scopecss: true, + useSandbox: true, + } + appInstanceMap.set('test-app4', app1 as CreateApp) + + // 模拟嵌套循环 + window.__MICRO_APP_ENVIRONMENT__ = true + window.__MICRO_APP_UMD_MODE__ = true // 设置为umd模式 + replaseUnmountOfNestedApp() + listenUmountOfNestedApp() + + // 模拟当前应用被卸载 + const event = new CustomEvent('unmount') + window.dispatchEvent(event) + + // umd模式不清空appInstanceMap + expect(appInstanceMap.size).toBe(1) + }) }) diff --git a/src/__tests__/libs/utils.test.ts b/src/__tests__/libs/utils.test.ts index 67a5e5f9c..b364a3f4e 100644 --- a/src/__tests__/libs/utils.test.ts +++ b/src/__tests__/libs/utils.test.ts @@ -1,6 +1,6 @@ /* eslint-disable promise/param-names */ import * as Utils from '../../libs/utils' -import { rewriteConsole, releaseConsole } from '../common' +import { rewriteConsole, releaseConsole } from '../common/initial' beforeAll(() => { rewriteConsole() @@ -134,7 +134,7 @@ test('polyfill for requestIdleCallback', async () => { // polyfill const mockFn2 = jest.fn() - Utils.requestIdleCallback((param) => { + Utils.requestIdleCallback((param: any) => { mockFn2() expect(param.didTimeout).toBeFalsy() expect(param.timeRemaining()).toBeLessThan(51) diff --git a/src/__tests__/main.test.ts b/src/__tests__/main.test.ts index f233e351d..700be1165 100644 --- a/src/__tests__/main.test.ts +++ b/src/__tests__/main.test.ts @@ -1,5 +1,5 @@ /* eslint-disable promise/param-names, no-console */ -import { commonStartEffect, releaseAllEffect, ports } from './common' +import { commonStartEffect, releaseAllEffect, ports } from './common/initial' import microApp, { preFetch, removeDomScope, version, pureCreateElement } from '..' import { appInstanceMap } from '../create_app' import { getCurrentAppName, defer } from '../libs/utils' diff --git a/src/__tests__/micro_app_element.test.ts b/src/__tests__/micro_app_element.test.ts index 9eea9b50d..f1740b836 100644 --- a/src/__tests__/micro_app_element.test.ts +++ b/src/__tests__/micro_app_element.test.ts @@ -1,5 +1,5 @@ /* eslint-disable promise/param-names */ -import { commonStartEffect, releaseAllEffect, ports } from './common' +import { commonStartEffect, releaseAllEffect, ports } from './common/initial' import { appInstanceMap } from '../create_app' import microApp from '..' import { defer } from '../libs/utils' @@ -246,4 +246,19 @@ describe('micro_app_element', () => { }, false) }) }) + + // 先插入micro-app元素,后设置name、url属性 + test('set name & url after connectedCallback', async () => { + const microappElement15 = document.createElement('micro-app') + appCon.appendChild(microappElement15) + + microappElement15.setAttribute('name', 'test-app15') + microappElement15.setAttribute('url', `http://127.0.0.1:${ports.micro_app_element}/common/`) + + await new Promise((reslove) => { + microappElement15.addEventListener('mounted', () => { + reslove(true) + }, false) + }) + }) }) diff --git a/src/__tests__/prefetch.test.ts b/src/__tests__/prefetch.test.ts index b75046fa6..6816bef61 100644 --- a/src/__tests__/prefetch.test.ts +++ b/src/__tests__/prefetch.test.ts @@ -1,5 +1,5 @@ /* eslint-disable promise/param-names */ -import { commonStartEffect, releaseAllEffect, ports } from './common' +import { commonStartEffect, releaseAllEffect, ports } from './common/initial' import microApp from '..' import preFetch from '../prefetch' import { globalLinks } from '../source/links' diff --git a/src/__tests__/sandbox/effect.test.ts b/src/__tests__/sandbox/effect.test.ts index 608b05859..a27978416 100644 --- a/src/__tests__/sandbox/effect.test.ts +++ b/src/__tests__/sandbox/effect.test.ts @@ -1,5 +1,5 @@ /* eslint-disable promise/param-names */ -import { commonStartEffect, releaseAllEffect, ports } from '../common' +import { commonStartEffect, releaseAllEffect, ports } from '../common/initial' import { appInstanceMap } from '../../create_app' import microApp from '../..' // import { defer } from '../../src/libs/utils' diff --git a/src/__tests__/sandbox/effect2.test.ts b/src/__tests__/sandbox/effect2.test.ts index cbae63931..9c4a5673d 100644 --- a/src/__tests__/sandbox/effect2.test.ts +++ b/src/__tests__/sandbox/effect2.test.ts @@ -1,5 +1,5 @@ /* eslint-disable promise/param-names */ -import { commonStartEffect, releaseAllEffect, ports } from '../common' +import { commonStartEffect, releaseAllEffect, ports } from '../common/initial' import { appInstanceMap } from '../../create_app' import microApp from '../..' diff --git a/src/__tests__/sandbox/index.test.ts b/src/__tests__/sandbox/index.test.ts index 4bc61258a..6eb3deb7f 100644 --- a/src/__tests__/sandbox/index.test.ts +++ b/src/__tests__/sandbox/index.test.ts @@ -1,5 +1,5 @@ /* eslint-disable promise/param-names */ -import { commonStartEffect, releaseAllEffect, ports } from '../common' +import { commonStartEffect, releaseAllEffect, ports } from '../common/initial' import { appInstanceMap } from '../../create_app' import microApp from '../..' import Sandbox from '../../sandbox' diff --git a/src/__tests__/source/index.test.ts b/src/__tests__/source/index.test.ts index ec9f1019b..6c25149d6 100644 --- a/src/__tests__/source/index.test.ts +++ b/src/__tests__/source/index.test.ts @@ -1,5 +1,5 @@ /* eslint-disable promise/param-names */ -import { commonStartEffect, releaseAllEffect, ports } from '../common' +import { commonStartEffect, releaseAllEffect, ports } from '../common/initial' import { appInstanceMap } from '../../create_app' import microApp from '../..' diff --git a/src/__tests__/source/links.test.ts b/src/__tests__/source/links.test.ts index edbbf3491..d31e62647 100644 --- a/src/__tests__/source/links.test.ts +++ b/src/__tests__/source/links.test.ts @@ -1,5 +1,5 @@ /* eslint-disable promise/param-names */ -import { commonStartEffect, releaseAllEffect, ports, setAppName } from '../common' +import { commonStartEffect, releaseAllEffect, ports, setAppName } from '../common/initial' import { appInstanceMap } from '../../create_app' import { globalLinks, formatHTMLStyleAfterUmdInit } from '../../source/links' import microApp from '../..' diff --git a/src/__tests__/source/load_event.test.ts b/src/__tests__/source/load_event.test.ts index 99469ac39..e09a35dde 100644 --- a/src/__tests__/source/load_event.test.ts +++ b/src/__tests__/source/load_event.test.ts @@ -1,5 +1,5 @@ /* eslint-disable promise/param-names */ -import { commonStartEffect, releaseAllEffect, ports, setAppName } from '../common' +import { commonStartEffect, releaseAllEffect, ports, setAppName } from '../common/initial' import microApp from '../..' describe('source load_event', () => { diff --git a/src/__tests__/source/patch.test.ts b/src/__tests__/source/patch.test.ts index c36f18d7e..7fb01fa1b 100644 --- a/src/__tests__/source/patch.test.ts +++ b/src/__tests__/source/patch.test.ts @@ -1,5 +1,5 @@ /* eslint-disable promise/param-names, no-extend-native */ -import { commonStartEffect, releaseAllEffect, ports, setAppName, clearAppName } from '../common' +import { commonStartEffect, releaseAllEffect, ports, setAppName, clearAppName } from '../common/initial' import { appInstanceMap } from '../../create_app' import microApp from '../..' diff --git a/src/__tests__/source/scoped_css.test.ts b/src/__tests__/source/scoped_css.test.ts index 074ced44f..9caac1322 100644 --- a/src/__tests__/source/scoped_css.test.ts +++ b/src/__tests__/source/scoped_css.test.ts @@ -1,5 +1,5 @@ /* eslint-disable promise/param-names, no-extend-native */ -import { commonStartEffect, releaseAllEffect, ports, setAppName } from '../common' +import { commonStartEffect, releaseAllEffect, ports, setAppName } from '../common/initial' import { defer } from '../../libs/utils' import microApp from '../..' diff --git a/src/__tests__/source/scripts.test.ts b/src/__tests__/source/scripts.test.ts index a7fae751f..872cffc29 100644 --- a/src/__tests__/source/scripts.test.ts +++ b/src/__tests__/source/scripts.test.ts @@ -1,5 +1,5 @@ /* eslint-disable promise/param-names */ -import { commonStartEffect, releaseAllEffect, ports, setAppName } from '../common' +import { commonStartEffect, releaseAllEffect, ports, setAppName } from '../common/initial' import { appInstanceMap } from '../../create_app' import { globalScripts } from '../../source/scripts' import microApp from '../..' diff --git a/src/__tests__/source/scripts2.test.ts b/src/__tests__/source/scripts2.test.ts index 8dca13b20..bdab219d0 100644 --- a/src/__tests__/source/scripts2.test.ts +++ b/src/__tests__/source/scripts2.test.ts @@ -1,11 +1,13 @@ /* eslint-disable promise/param-names */ import { rawDocumentCreateElement, rawSetAttribute } from './support_module' -import { commonStartEffect, releaseAllEffect, ports, setAppName } from '../common' +import { commonStartEffect, releaseAllEffect, ports, setAppName } from '../common/initial' import microApp from '../..' describe('source scripts2', () => { let appCon: Element beforeAll(() => { + // URL.createObjectURL is undefined in jest env + global.URL.createObjectURL = jest.fn() commonStartEffect(ports.source_scripts2) microApp.start({ plugins: {} @@ -53,6 +55,7 @@ describe('source scripts2', () => { microappElement2.setAttribute('name', 'test-app2') microappElement2.setAttribute('url', `http://127.0.0.1:${ports.source_scripts2}/dynamic/`) microappElement2.setAttribute('inline', 'true') + microappElement2.setAttribute('disablesandbox', 'true') appCon.appendChild(microappElement2) await new Promise((reslove) => { diff --git a/src/__tests__/ssr_env.test.ts b/src/__tests__/ssr_env.test.ts new file mode 100644 index 000000000..cd2a04591 --- /dev/null +++ b/src/__tests__/ssr_env.test.ts @@ -0,0 +1,22 @@ +import './common/set_ssr_env' +import preFetch from '../prefetch' +import { initGloalEnv } from '../libs/global_env' +import microApp from '../micro_app' + +describe('test ssr environment', () => { + beforeAll(() => { + global.console.error = jest.fn() + }) + // 在非浏览器环境使用prefetch + test('run prefetch in non browser environment', () => { + preFetch([]) + expect(console.error).toBeCalledWith('[micro-app] preFetch is only supported in browser environment') + }) + + // 在非浏览器环境执行start + test('run start in non browser environment', () => { + microApp.start() + initGloalEnv() + expect(console.error).toBeCalledWith('[micro-app] micro-app is not supported in this environment') + }) +}) diff --git a/src/libs/utils.ts b/src/libs/utils.ts index a4731adc1..6b440de66 100644 --- a/src/libs/utils.ts +++ b/src/libs/utils.ts @@ -1,25 +1,19 @@ -/* eslint-disable no-new-func */ +/* eslint-disable no-new-func, indent */ import type { Func } from '@micro-app/types' export const version = '__VERSION__' export const isBrowser = typeof window !== 'undefined' -export const globalThis: Window = (function () { - let gt - if (typeof global !== 'undefined') { - gt = global - } else if (typeof self !== 'undefined') { - gt = self - } else { - try { - gt = Function('return this')() - } catch (e) { - throw new Error('global object is unavailable in this environment') - } - } - return gt -})() +export const globalThis = (typeof global !== 'undefined') + ? global + : ( + (typeof window !== 'undefined') + ? window + : ( + (typeof self !== 'undefined') ? self : Function('return this')() + ) + ) /** * format error log diff --git a/src/source/patch.ts b/src/source/patch.ts index a3c48f19f..cb763245b 100644 --- a/src/source/patch.ts +++ b/src/source/patch.ts @@ -9,7 +9,7 @@ import { } from '../libs/utils' import scopedCSS from './scoped_css' import { extractLinkFromHtml, foramtDynamicLink } from './links' -import { extractScriptElement, runScript, runDynamicScript } from './scripts' +import { extractScriptElement, runScript, runDynamicRemoteScript } from './scripts' import microApp from '../micro_app' import globalEnv from '../libs/global_env' @@ -75,7 +75,7 @@ function handleNewNode (parent: Node, child: Node, app: AppInterface): Node { dynamicElementInMicroAppMap.set(child, replaceElement) return replaceElement } else { // remote script - const replaceElement = runDynamicScript(url, info, app, child) + const replaceElement = runDynamicRemoteScript(url, info, app, child) dynamicElementInMicroAppMap.set(child, replaceElement) return replaceElement } diff --git a/src/source/scripts.ts b/src/source/scripts.ts index 4f9c9b5e6..23fc03865 100644 --- a/src/source/scripts.ts +++ b/src/source/scripts.ts @@ -89,7 +89,7 @@ export function extractScriptElement ( if (isDynamic) { return { replaceComment } - } else if (replaceComment) { + } else { return parent.replaceChild(replaceComment, script) } } @@ -238,7 +238,7 @@ export function runScript ( * @param app app * @param originScript origin script element */ -export function runDynamicScript ( +export function runDynamicRemoteScript ( url: string, info: sourceScriptInfo, app: AppInterface, diff --git a/yarn.lock b/yarn.lock index f1aa798ec..041b7b656 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4773,7 +4773,7 @@ jest@26.6.0: import-local "^3.0.2" jest-cli "^26.6.0" -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: +js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -5142,13 +5142,6 @@ log-update@^4.0.0: slice-ansi "^4.0.0" wrap-ansi "^6.2.0" -loose-envify@^1.1.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" @@ -5554,7 +5547,7 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -object-assign@^4, object-assign@^4.1.1, object-assign@latest: +object-assign@^4, object-assign@latest: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= @@ -6098,14 +6091,6 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== -react@~17.0.2: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" @@ -7391,6 +7376,11 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" +url-polyfill@~1.1.12: + version "1.1.12" + resolved "https://registry.yarnpkg.com/url-polyfill/-/url-polyfill-1.1.12.tgz#6cdaa17f6b022841b3aec0bf8dbd87ac0cd33331" + integrity sha512-mYFmBHCapZjtcNHW0MDq9967t+z4Dmg5CJ0KqysK3+ZbyoNOWQHksGCTWwDhxGXllkWlOc10Xfko6v4a3ucM6A== + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"