Rebased and refixed

This commit is contained in:
49lf
2024-12-12 10:43:09 -05:00
parent c440bbc0fe
commit ff64367729
12 changed files with 149 additions and 131 deletions

View File

@ -297,13 +297,12 @@ test(
const pointOnModel = { x: 630, y: 280 } const pointOnModel = { x: 630, y: 280 }
await test.step('Opening the bracket project should load the stream', async () => { await test.step('Opening the bracket project should load the stream', async () => {
// expect to see the text bracket // expect to see the text bracket
await expect(page.getByText('bracket')).toBeVisible() await expect(page.getByText('bracket')).toBeVisible()
await page.getByText('bracket').click() await page.getByText('bracket').click()
await expect( await expect(
page.getByRole('button', { name: 'Start Sketch' }) page.getByRole('button', { name: 'Start Sketch' })
).toBeEnabled({ ).toBeEnabled({

View File

@ -388,7 +388,7 @@ test.describe('Sketch tests', () => {
const dragPX = 40 const dragPX = 40
await page await page
.getByText('circle({ center: [4.61, -5.01], radius: 8 }, %)') .getByText('circle({ center = [4.61, -5.01], radius = 8 }, %)')
.click() .click()
await expect( await expect(
page.getByRole('button', { name: 'Edit Sketch' }) page.getByRole('button', { name: 'Edit Sketch' })

View File

@ -30,103 +30,126 @@ import { reportRejection } from 'lib/trap'
// The below is copied from playwright-core because it exports none of them :( // The below is copied from playwright-core because it exports none of them :(
import { Env, BrowserContextOptions } from 'playwright-core' import { Env, BrowserContextOptions } from 'playwright-core'
import type * as channels from '@protocol/channels'; import type * as channels from '@protocol/channels'
// Copied from playwright-core // Copied from playwright-core
function envObjectToArray(env: Env): { name: string, value: string }[] { function envObjectToArray(env: Env): { name: string; value: string }[] {
const result: { name: string, value: string }[] = []; const result: { name: string; value: string }[] = []
for (const name in env) { for (const name in env) {
if (!Object.is(env[name], undefined)) if (!Object.is(env[name], undefined))
result.push({ name, value: String(env[name]) }); result.push({ name, value: String(env[name]) })
} }
return result; return result
} }
// Copied from playwright-core // Copied from playwright-core
export async function toClientCertificatesProtocol(certs?: BrowserContextOptions['clientCertificates']): Promise<channels.PlaywrightNewRequestParams['clientCertificates']> { export async function toClientCertificatesProtocol(
if (!certs) certs?: BrowserContextOptions['clientCertificates']
return undefined; ): Promise<channels.PlaywrightNewRequestParams['clientCertificates']> {
if (!certs) return undefined
const bufferizeContent = async (value?: Buffer, path?: string): Promise<Buffer | undefined> => { const bufferizeContent = async (
if (value) value?: Buffer,
return value; path?: string
if (path) ): Promise<Buffer | undefined> => {
return await fs.promises.readFile(path); if (value) return value
}; if (path) return await fs.promises.readFile(path)
}
return await Promise.all(certs.map(async cert => ({ return await Promise.all(
origin: cert.origin, certs.map(async (cert) => ({
cert: await bufferizeContent(cert.cert, cert.certPath), origin: cert.origin,
key: await bufferizeContent(cert.key, cert.keyPath), cert: await bufferizeContent(cert.cert, cert.certPath),
pfx: await bufferizeContent(cert.pfx, cert.pfxPath), key: await bufferizeContent(cert.key, cert.keyPath),
passphrase: cert.passphrase, pfx: await bufferizeContent(cert.pfx, cert.pfxPath),
}))); passphrase: cert.passphrase,
}))
)
} }
// Copied from playwright-core // Copied from playwright-core
function toAcceptDownloadsProtocol(acceptDownloads?: boolean) { function toAcceptDownloadsProtocol(acceptDownloads?: boolean) {
if (acceptDownloads === undefined) if (acceptDownloads === undefined) return undefined
return undefined; if (acceptDownloads) return 'accept'
if (acceptDownloads) return 'deny'
return 'accept';
return 'deny';
} }
// Copied from playwright-core // Copied from playwright-core
function prepareRecordHarOptions(options: BrowserContextOptions['recordHar']): channels.RecordHarOptions | undefined { function prepareRecordHarOptions(
if (!options) options: BrowserContextOptions['recordHar']
return; ): channels.RecordHarOptions | undefined {
if (!options) return
return { return {
path: options.path, path: options.path,
content: options.content || (options.omitContent ? 'omit' : undefined), content: options.content || (options.omitContent ? 'omit' : undefined),
urlGlob: isString(options.urlFilter) ? options.urlFilter : undefined, urlGlob: isString(options.urlFilter) ? options.urlFilter : undefined,
urlRegexSource: isRegExp(options.urlFilter) ? options.urlFilter.source : undefined, urlRegexSource: isRegExp(options.urlFilter)
urlRegexFlags: isRegExp(options.urlFilter) ? options.urlFilter.flags : undefined, ? options.urlFilter.source
mode: options.mode : undefined,
}; urlRegexFlags: isRegExp(options.urlFilter)
} ? options.urlFilter.flags
: undefined,
// Copied from playwright-core mode: options.mode,
async function prepareStorageState(options: BrowserContextOptions): Promise<channels.BrowserNewContextParams['storageState']> {
if (typeof options.storageState !== 'string')
return options.storageState;
try {
return JSON.parse(await fs.promises.readFile(options.storageState, 'utf8'));
} catch (e) {
rewriteErrorMessage(e, `Error reading storage state from ${options.storageState}:\n` + e.message);
throw e;
} }
} }
// Copied from playwright-core // Copied from playwright-core
async function prepareBrowserContextParams(options: BrowserContextOptions): Promise<channels.BrowserNewContextParams> { async function prepareStorageState(
options: BrowserContextOptions
): Promise<channels.BrowserNewContextParams['storageState']> {
if (typeof options.storageState !== 'string') return options.storageState
try {
return JSON.parse(await fs.promises.readFile(options.storageState, 'utf8'))
} catch (e) {
rewriteErrorMessage(
e,
`Error reading storage state from ${options.storageState}:\n` + e.message
)
throw e
}
}
// Copied from playwright-core
async function prepareBrowserContextParams(
options: BrowserContextOptions
): Promise<channels.BrowserNewContextParams> {
if (options.videoSize && !options.videosPath) if (options.videoSize && !options.videosPath)
throw new Error(`"videoSize" option requires "videosPath" to be specified`); throw new Error(`"videoSize" option requires "videosPath" to be specified`)
if (options.extraHTTPHeaders) if (options.extraHTTPHeaders)
network.validateHeaders(options.extraHTTPHeaders); network.validateHeaders(options.extraHTTPHeaders)
const contextParams: channels.BrowserNewContextParams = { const contextParams: channels.BrowserNewContextParams = {
...options, ...options,
viewport: options.viewport === null ? undefined : options.viewport, viewport: options.viewport === null ? undefined : options.viewport,
noDefaultViewport: options.viewport === null, noDefaultViewport: options.viewport === null,
extraHTTPHeaders: options.extraHTTPHeaders ? headersObjectToArray(options.extraHTTPHeaders) : undefined, extraHTTPHeaders: options.extraHTTPHeaders
? headersObjectToArray(options.extraHTTPHeaders)
: undefined,
storageState: await prepareStorageState(options), storageState: await prepareStorageState(options),
serviceWorkers: options.serviceWorkers, serviceWorkers: options.serviceWorkers,
recordHar: prepareRecordHarOptions(options.recordHar), recordHar: prepareRecordHarOptions(options.recordHar),
colorScheme: options.colorScheme === null ? 'no-override' : options.colorScheme, colorScheme:
reducedMotion: options.reducedMotion === null ? 'no-override' : options.reducedMotion, options.colorScheme === null ? 'no-override' : options.colorScheme,
forcedColors: options.forcedColors === null ? 'no-override' : options.forcedColors, reducedMotion:
options.reducedMotion === null ? 'no-override' : options.reducedMotion,
forcedColors:
options.forcedColors === null ? 'no-override' : options.forcedColors,
acceptDownloads: toAcceptDownloadsProtocol(options.acceptDownloads), acceptDownloads: toAcceptDownloadsProtocol(options.acceptDownloads),
clientCertificates: await toClientCertificatesProtocol(options.clientCertificates), clientCertificates: await toClientCertificatesProtocol(
}; options.clientCertificates
),
}
if (!contextParams.recordVideo && options.videosPath) { if (!contextParams.recordVideo && options.videosPath) {
contextParams.recordVideo = { contextParams.recordVideo = {
dir: options.videosPath, dir: options.videosPath,
size: options.videoSize size: options.videoSize,
}; }
} }
if (contextParams.recordVideo && contextParams.recordVideo.dir) if (contextParams.recordVideo && contextParams.recordVideo.dir)
contextParams.recordVideo.dir = path.resolve(process.cwd(), contextParams.recordVideo.dir); contextParams.recordVideo.dir = path.resolve(
return contextParams; process.cwd(),
contextParams.recordVideo.dir
)
return contextParams
} }
const toNormalizedCode = (text: string) => { const toNormalizedCode = (text: string) => {
@ -973,7 +996,10 @@ export async function setup(
localStorage.clear() localStorage.clear()
localStorage.setItem('TOKEN_PERSIST_KEY', token) localStorage.setItem('TOKEN_PERSIST_KEY', token)
localStorage.setItem('persistCode', ``) localStorage.setItem('persistCode', ``)
localStorage.setItem(PERSIST_MODELING_CONTEXT, JSON.stringify({openPanes: ['code']})) localStorage.setItem(
PERSIST_MODELING_CONTEXT,
JSON.stringify({ openPanes: ['code'] })
)
localStorage.setItem(settingsKey, settings) localStorage.setItem(settingsKey, settings)
localStorage.setItem(IS_PLAYWRIGHT_KEY, 'true') localStorage.setItem(IS_PLAYWRIGHT_KEY, 'true')
localStorage.setItem('PLAYWRIGHT_TEST_DIR', PLAYWRIGHT_TEST_DIR) localStorage.setItem('PLAYWRIGHT_TEST_DIR', PLAYWRIGHT_TEST_DIR)

View File

@ -95,7 +95,9 @@ test.describe('Testing segment overlays', () => {
}) })
.click() .click()
await expect(page.locator('.cm-content')).toContainText(expectFinal) await expect(page.locator('.cm-content')).toContainText(expectFinal)
await editor.expectEditor.toContain(expectFinal, { shouldNormalise: true }) await editor.expectEditor.toContain(expectFinal, {
shouldNormalise: true,
})
await editor.expectEditor.toContain(expectFinal, { await editor.expectEditor.toContain(expectFinal, {
shouldNormalise: true, shouldNormalise: true,
}) })

View File

@ -223,15 +223,15 @@ export const test = (
if (tronApp instanceof AuthenticatedTronApp) { if (tronApp instanceof AuthenticatedTronApp) {
tronApp.context.folderSetupFn = async function (fn) { tronApp.context.folderSetupFn = async function (fn) {
return fn(tronApp.dir) return fn(tronApp.dir)
.then(() => tronApp.page.reload()) .then(() => tronApp.page.reload())
.then(() => ({ .then(() => ({
dir: tronApp.dir, dir: tronApp.dir,
})) }))
} }
} }
if (!firstUrl) { if (!firstUrl) {
await tronApp.page.getByText('Your Projects').count(); await tronApp.page.getByText('Your Projects').count()
firstUrl = tronApp.page.url() firstUrl = tronApp.page.url()
} }
@ -243,7 +243,7 @@ export const test = (
// }); // });
await tronApp.electronApp.evaluate(({ app }, projectDirName) => { await tronApp.electronApp.evaluate(({ app }, projectDirName) => {
console.log("ABCDEFGHI", app.testProperty['TEST_SETTINGS_FILE_KEY']) console.log('ABCDEFGHI', app.testProperty['TEST_SETTINGS_FILE_KEY'])
app.testProperty['TEST_SETTINGS_FILE_KEY'] = projectDirName app.testProperty['TEST_SETTINGS_FILE_KEY'] = projectDirName
}, tronApp.dir) }, tronApp.dir)

View File

@ -152,7 +152,7 @@
"@iarna/toml": "^2.2.5", "@iarna/toml": "^2.2.5",
"@lezer/generator": "^1.7.1", "@lezer/generator": "^1.7.1",
"@nabla/vite-plugin-eslint": "^2.0.5", "@nabla/vite-plugin-eslint": "^2.0.5",
"@playwright/test": "^1.46.1", "@playwright/test": "^1.49.0",
"@testing-library/jest-dom": "^5.14.1", "@testing-library/jest-dom": "^5.14.1",
"@testing-library/react": "^15.0.2", "@testing-library/react": "^15.0.2",
"@types/d3-force": "^3.0.10", "@types/d3-force": "^3.0.10",

View File

@ -119,6 +119,11 @@
"title": "Pipe and Flange Assembly", "title": "Pipe and Flange Assembly",
"description": "A crucial component in various piping systems, designed to facilitate the connection, disconnection, and access to piping for inspection, cleaning, and modifications. This assembly combines pipes (long cylindrical conduits) with flanges (plate-like fittings) to create a secure yet detachable joint." "description": "A crucial component in various piping systems, designed to facilitate the connection, disconnection, and access to piping for inspection, cleaning, and modifications. This assembly combines pipes (long cylindrical conduits) with flanges (plate-like fittings) to create a secure yet detachable joint."
}, },
{
"file": "pipe-with-bend.kcl",
"title": "Pipe with bend",
"description": "A tubular section or hollow cylinder, usually but not necessarily of circular cross-section, used mainly to convey substances that can flow."
},
{ {
"file": "poopy-shoe.kcl", "file": "poopy-shoe.kcl",
"title": "Poopy Shoe", "title": "Poopy Shoe",

View File

@ -391,7 +391,9 @@ const getAppFolderName = () => {
export const getAppSettingsFilePath = async () => { export const getAppSettingsFilePath = async () => {
const isTestEnv = window.electron.process.env.IS_PLAYWRIGHT === 'true' const isTestEnv = window.electron.process.env.IS_PLAYWRIGHT === 'true'
const testSettingsPath = await window.electron.getAppTestProperty('TEST_SETTINGS_FILE_KEY') const testSettingsPath = await window.electron.getAppTestProperty(
'TEST_SETTINGS_FILE_KEY'
)
const appConfig = await window.electron.getPath('appData') const appConfig = await window.electron.getPath('appData')
const fullPath = isTestEnv const fullPath = isTestEnv
? testSettingsPath ? testSettingsPath
@ -408,7 +410,9 @@ export const getAppSettingsFilePath = async () => {
} }
const getTokenFilePath = async () => { const getTokenFilePath = async () => {
const isTestEnv = window.electron.process.env.IS_PLAYWRIGHT === 'true' const isTestEnv = window.electron.process.env.IS_PLAYWRIGHT === 'true'
const testSettingsPath = await window.electron.getAppTestProperty('TEST_SETTINGS_FILE_KEY') const testSettingsPath = await window.electron.getAppTestProperty(
'TEST_SETTINGS_FILE_KEY'
)
const appConfig = await window.electron.getPath('appData') const appConfig = await window.electron.getPath('appData')
const fullPath = isTestEnv const fullPath = isTestEnv
? testSettingsPath ? testSettingsPath

View File

@ -18,7 +18,9 @@ const save_ = async (file: ModelingAppFile, toastId: string) => {
if (window.electron.process.env.IS_PLAYWRIGHT) { if (window.electron.process.env.IS_PLAYWRIGHT) {
// Skip file picker, save to the test dir downloads directory // Skip file picker, save to the test dir downloads directory
const testSettingsPath = await window.electron.getAppTestProperty('TEST_SETTINGS_FILE_KEY') const testSettingsPath = await window.electron.getAppTestProperty(
'TEST_SETTINGS_FILE_KEY'
)
const downloadDir = window.electron.join( const downloadDir = window.electron.join(
testSettingsPath, testSettingsPath,
'downloads-during-playwright' 'downloads-during-playwright'

View File

@ -62,22 +62,26 @@ if (process.defaultApp) {
registerStartupListeners() registerStartupListeners()
const createWindow = (filePath?: string, reuse?: boolean): BrowserWindow => { const createWindow = (filePath?: string, reuse?: boolean): BrowserWindow => {
const newWindow = reuse ? mainWindow : new BrowserWindow({ const newWindow = reuse
autoHideMenuBar: true, ? mainWindow
show: false, : new BrowserWindow({
width: 1800, autoHideMenuBar: true,
height: 1200, show: false,
webPreferences: { width: 1800,
nodeIntegration: false, // do not give the application implicit system access height: 1200,
contextIsolation: true, // expose system functions in preload webPreferences: {
sandbox: false, // expose nodejs in preload nodeIntegration: false, // do not give the application implicit system access
preload: path.join(__dirname, './preload.js'), contextIsolation: true, // expose system functions in preload
}, sandbox: false, // expose nodejs in preload
icon: path.resolve(process.cwd(), 'assets', 'icon.png'), preload: path.join(__dirname, './preload.js'),
frame: os.platform() !== 'darwin', },
titleBarStyle: 'hiddenInset', icon: path.resolve(process.cwd(), 'assets', 'icon.png'),
backgroundColor: nativeTheme.shouldUseDarkColors ? '#1C1C1C' : '#FCFCFC', frame: os.platform() !== 'darwin',
}) titleBarStyle: 'hiddenInset',
backgroundColor: nativeTheme.shouldUseDarkColors
? '#1C1C1C'
: '#FCFCFC',
})
// and load the index.html of the app. // and load the index.html of the app.
if (MAIN_WINDOW_VITE_DEV_SERVER_URL) { if (MAIN_WINDOW_VITE_DEV_SERVER_URL) {

View File

@ -31,7 +31,8 @@ const onUpdateDownloadStart = (
const onUpdateError = (callback: (value: Error) => void) => const onUpdateError = (callback: (value: Error) => void) =>
ipcRenderer.on('update-error', (_event: any, value) => callback(value)) ipcRenderer.on('update-error', (_event: any, value) => callback(value))
const appRestart = () => ipcRenderer.invoke('app.restart') const appRestart = () => ipcRenderer.invoke('app.restart')
const getAppTestProperty = (propertyName: string) => ipcRenderer.invoke('app.testProperty', propertyName) const getAppTestProperty = (propertyName: string) =>
ipcRenderer.invoke('app.testProperty', propertyName)
const isMac = os.platform() === 'darwin' const isMac = os.platform() === 'darwin'
const isWindows = os.platform() === 'win32' const isWindows = os.platform() === 'win32'

View File

@ -2131,12 +2131,12 @@
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
"@playwright/test@^1.46.1": "@playwright/test@^1.49.0":
version "1.46.1" version "1.49.1"
resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.46.1.tgz#a8dfdcd623c4c23bb1b7ea588058aad41055c188" resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.49.1.tgz#55fa360658b3187bfb6371e2f8a64f50ef80c827"
integrity sha512-Fq6SwLujA/DOIvNC2EL/SojJnkKf/rAwJ//APpJJHRyMi1PdKrY3Az+4XNQ51N4RTbItbIByQ0jgd1tayq1aeA== integrity sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==
dependencies: dependencies:
playwright "1.46.1" playwright "1.49.1"
"@react-hook/latest@^1.0.2": "@react-hook/latest@^1.0.2":
version "1.0.3" version "1.0.3"
@ -7506,17 +7506,17 @@ pkg-types@^1.0.3, pkg-types@^1.1.1:
mlly "^1.7.1" mlly "^1.7.1"
pathe "^1.1.2" pathe "^1.1.2"
playwright-core@1.46.1: playwright-core@1.49.1:
version "1.46.1" version "1.49.1"
resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.46.1.tgz#28f3ab35312135dda75b0c92a3e5c0e7edb9cc8b" resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.49.1.tgz#32c62f046e950f586ff9e35ed490a424f2248015"
integrity sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A== integrity sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==
playwright@1.46.1: playwright@1.49.1:
version "1.46.1" version "1.49.1"
resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.46.1.tgz#ea562bc48373648e10420a10c16842f0b227c218" resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.49.1.tgz#830266dbca3008022afa7b4783565db9944ded7c"
integrity sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng== integrity sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==
dependencies: dependencies:
playwright-core "1.46.1" playwright-core "1.49.1"
optionalDependencies: optionalDependencies:
fsevents "2.3.2" fsevents "2.3.2"
@ -8533,16 +8533,7 @@ string-natural-compare@^3.0.1:
resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4" resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4"
integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==
"string-width-cjs@npm:string-width@^4.2.0": "string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
dependencies:
emoji-regex "^8.0.0"
is-fullwidth-code-point "^3.0.0"
strip-ansi "^6.0.1"
"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
version "4.2.3" version "4.2.3"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
@ -8636,14 +8627,7 @@ string_decoder@~1.1.1:
dependencies: dependencies:
safe-buffer "~5.1.0" safe-buffer "~5.1.0"
"strip-ansi-cjs@npm:strip-ansi@^6.0.1": "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
dependencies:
ansi-regex "^5.0.1"
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
version "6.0.1" version "6.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
@ -9500,16 +9484,7 @@ word-wrap@^1.2.5:
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
dependencies:
ansi-styles "^4.0.0"
string-width "^4.1.0"
strip-ansi "^6.0.0"
wrap-ansi@^7.0.0:
version "7.0.0" version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==