From 5840b40d960949b020724792a840d41d60db4077 Mon Sep 17 00:00:00 2001 From: Aaryan Khandelwal <65252264+aaryan610@users.noreply.github.com> Date: Tue, 3 Sep 2024 17:03:50 +0530 Subject: [PATCH] [WEB-1116] chore: live server code splitting (#5508) * chore: live server code splitting * chore: update import paths * chore: update bebel path alias * fix: document types type * chore: updated error messages --- live/.babelrc | 23 ++++++++ live/package.json | 7 ++- live/src/ce/lib/authentication.ts | 17 ++++++ live/src/ce/lib/fetch-document.ts | 14 +++++ live/src/ce/lib/update-document.ts | 17 ++++++ live/src/core/lib/authentication.ts | 12 +++-- live/src/core/lib/page.ts | 4 +- live/src/core/services/page.service.ts | 2 +- live/src/core/services/user.service.ts | 2 +- live/src/core/types/common.d.ts | 3 +- live/src/ee/lib/authentication.ts | 1 + live/src/ee/lib/fetch-document.ts | 1 + live/src/ee/lib/update-document.ts | 1 + live/src/server.ts | 31 ++++++++--- live/tsconfig.json | 2 +- yarn.lock | 75 +++++++++++++++++++++++--- 16 files changed, 189 insertions(+), 23 deletions(-) create mode 100644 live/.babelrc create mode 100644 live/src/ce/lib/authentication.ts create mode 100644 live/src/ce/lib/fetch-document.ts create mode 100644 live/src/ce/lib/update-document.ts create mode 100644 live/src/ee/lib/authentication.ts create mode 100644 live/src/ee/lib/fetch-document.ts create mode 100644 live/src/ee/lib/update-document.ts diff --git a/live/.babelrc b/live/.babelrc new file mode 100644 index 000000000..fa0ee452a --- /dev/null +++ b/live/.babelrc @@ -0,0 +1,23 @@ +{ + "presets": [ + [ + "@babel/preset-env", + { + "modules": false + } + ], + "@babel/preset-typescript" + ], + "plugins": [ + [ + "module-resolver", + { + "root": ["./src"], + "alias": { + "@/core": "./src/core", + "@/plane-live": "./src/ce" + } + } + ] + ] +} diff --git a/live/package.json b/live/package.json index 7c4b3956a..31e5add1e 100644 --- a/live/package.json +++ b/live/package.json @@ -6,7 +6,7 @@ "private": true, "type": "module", "scripts": { - "build": "tsc", + "build": "babel src --out-dir dist --extensions \".ts,.js\"", "start": "node dist/server.js", "dev": "PORT=3003 nodemon --exec \"node -r esbuild-register ./src/server.ts\" -e .ts" }, @@ -32,10 +32,15 @@ "yjs": "^13.6.14" }, "devDependencies": { + "@babel/cli": "^7.25.6", + "@babel/core": "^7.25.2", + "@babel/preset-env": "^7.25.4", + "@babel/preset-typescript": "^7.24.7", "@types/dotenv": "^8.2.0", "@types/express": "^4.17.21", "@types/express-ws": "^3.0.4", "@types/node": "^20.14.9", + "babel-plugin-module-resolver": "^5.0.2", "nodemon": "^3.1.0", "ts-node": "^10.9.2", "tsup": "^7.2.0", diff --git a/live/src/ce/lib/authentication.ts b/live/src/ce/lib/authentication.ts new file mode 100644 index 000000000..291085e94 --- /dev/null +++ b/live/src/ce/lib/authentication.ts @@ -0,0 +1,17 @@ +import { ConnectionConfiguration } from "@hocuspocus/server"; +// types +import { TDocumentTypes } from "@/core/types/common.js"; + +type TArgs = { + connection: ConnectionConfiguration + cookie: string | undefined; + params: URLSearchParams; +} + +export const authenticateUser = (args: TArgs): Promise => { + const { params } = args; + const documentType = params.get("documentType")?.toString() as + | TDocumentTypes + | undefined; + throw Error(`Authentication failed: Invalid document type ${documentType} provided.`); +} \ No newline at end of file diff --git a/live/src/ce/lib/fetch-document.ts b/live/src/ce/lib/fetch-document.ts new file mode 100644 index 000000000..5a27c2179 --- /dev/null +++ b/live/src/ce/lib/fetch-document.ts @@ -0,0 +1,14 @@ +// types +import { TDocumentTypes } from "@/core/types/common.js"; + +type TArgs = { + cookie: string | undefined; + documentType: TDocumentTypes | undefined; + pageId: string; + params: URLSearchParams; +} + +export const fetchDocument = async (args: TArgs): Promise => { + const { documentType } = args; + throw Error(`Fetch failed: Invalid document type ${documentType} provided.`); +} \ No newline at end of file diff --git a/live/src/ce/lib/update-document.ts b/live/src/ce/lib/update-document.ts new file mode 100644 index 000000000..f784785dd --- /dev/null +++ b/live/src/ce/lib/update-document.ts @@ -0,0 +1,17 @@ +// types +import { TDocumentTypes } from "@/core/types/common.js"; + +type TArgs = { + params: URLSearchParams; + pageId: string; + updatedDescription: Uint8Array; + cookie: string | undefined; +} + +export const updateDocument = (args: TArgs): Promise => { + const { params } = args; + const documentType = params.get("documentType")?.toString() as + | TDocumentTypes + | undefined; + throw Error(`Update failed: Invalid document type ${documentType} provided.`); +} \ No newline at end of file diff --git a/live/src/core/lib/authentication.ts b/live/src/core/lib/authentication.ts index 222871238..6403b065e 100644 --- a/live/src/core/lib/authentication.ts +++ b/live/src/core/lib/authentication.ts @@ -1,8 +1,10 @@ import { ConnectionConfiguration } from "@hocuspocus/server"; // services -import { UserService } from "../services/user.service.js"; +import { UserService } from "@/core/services/user.service.js"; // types -import { TDocumentTypes } from "../types/common.js"; +import { TDocumentTypes } from "@/core/types/common.js"; +// plane live lib +import { authenticateUser } from "@/plane-live/lib/authentication.js"; const userService = new UserService(); @@ -51,7 +53,11 @@ export const handleAuthentication = async (props: Props) => { connection.readOnly = true; } } else { - throw Error("Authentication failed: Invalid document type provided."); + await authenticateUser({ + connection, + cookie, + params + }); } return { diff --git a/live/src/core/lib/page.ts b/live/src/core/lib/page.ts index 30cf10f41..013240fe5 100644 --- a/live/src/core/lib/page.ts +++ b/live/src/core/lib/page.ts @@ -1,7 +1,7 @@ // helpers -import { getAllDocumentFormatsFromBinaryData, getBinaryDataFromHTMLString } from "../../core/helpers/page.js"; +import { getAllDocumentFormatsFromBinaryData, getBinaryDataFromHTMLString } from "@/core/helpers/page.js"; // services -import { PageService } from "../services/page.service.js"; +import { PageService } from "@/core/services/page.service.js"; const pageService = new PageService(); export const updatePageDescription = async ( diff --git a/live/src/core/services/page.service.ts b/live/src/core/services/page.service.ts index 77b343376..7218ee003 100644 --- a/live/src/core/services/page.service.ts +++ b/live/src/core/services/page.service.ts @@ -1,7 +1,7 @@ // types import { TPage } from "@plane/types"; // services -import { API_BASE_URL, APIService } from "./api.service.js"; +import { API_BASE_URL, APIService } from "@/core/services/api.service.js"; export class PageService extends APIService { constructor() { diff --git a/live/src/core/services/user.service.ts b/live/src/core/services/user.service.ts index 9afc447d2..09412aa53 100644 --- a/live/src/core/services/user.service.ts +++ b/live/src/core/services/user.service.ts @@ -1,7 +1,7 @@ // types import type { IProjectMember, IUser } from "@plane/types"; // services -import { API_BASE_URL, APIService } from "./api.service.js"; +import { API_BASE_URL, APIService } from "@/core/services/api.service.js"; export class UserService extends APIService { constructor() { diff --git a/live/src/core/types/common.d.ts b/live/src/core/types/common.d.ts index 217d9d4b0..3b9dff8e1 100644 --- a/live/src/core/types/common.d.ts +++ b/live/src/core/types/common.d.ts @@ -1,3 +1,4 @@ +// types import { TAdditionalDocumentTypes } from "@/plane-live/types/common.js"; -export type TDocumentTypes = "project_page" & TAdditionalDocumentTypes; +export type TDocumentTypes = "project_page" | TAdditionalDocumentTypes; diff --git a/live/src/ee/lib/authentication.ts b/live/src/ee/lib/authentication.ts new file mode 100644 index 000000000..16a4fb11e --- /dev/null +++ b/live/src/ee/lib/authentication.ts @@ -0,0 +1 @@ +export * from "../../ce/lib/authentication.js" \ No newline at end of file diff --git a/live/src/ee/lib/fetch-document.ts b/live/src/ee/lib/fetch-document.ts new file mode 100644 index 000000000..9c9516937 --- /dev/null +++ b/live/src/ee/lib/fetch-document.ts @@ -0,0 +1 @@ +export * from "../../ce/lib/fetch-document.js" \ No newline at end of file diff --git a/live/src/ee/lib/update-document.ts b/live/src/ee/lib/update-document.ts new file mode 100644 index 000000000..20aed8fd8 --- /dev/null +++ b/live/src/ee/lib/update-document.ts @@ -0,0 +1 @@ +export * from "../../ce/lib/update-document.js" \ No newline at end of file diff --git a/live/src/server.ts b/live/src/server.ts index 516679662..b1c53b225 100644 --- a/live/src/server.ts +++ b/live/src/server.ts @@ -5,15 +5,17 @@ import { Database } from "@hocuspocus/extension-database"; import { Logger } from "@hocuspocus/extension-logger"; import express from "express"; import expressWs, { Application } from "express-ws"; -// page actions +// lib +import { handleAuthentication } from "@/core/lib/authentication.js"; import { fetchPageDescriptionBinary, updatePageDescription, -} from "./core/lib/page.js"; +} from "@/core/lib/page.js"; // types -import { TDocumentTypes } from "./core/types/common.js"; -// helpers -import { handleAuthentication } from "./core/lib/authentication.js"; +import { TDocumentTypes } from "@/core/types/common.js"; +// plane live lib +import { fetchDocument } from "@/plane-live/lib/fetch-document.js"; +import { updateDocument } from "@/plane-live/lib/update-document.js"; const server = Server.configure({ onAuthenticate: async ({ @@ -65,14 +67,22 @@ const server = Server.configure({ return new Promise(async (resolve) => { try { + let fetchedData = null; if (documentType === "project_page") { - const fetchedData = await fetchPageDescriptionBinary( + fetchedData = await fetchPageDescriptionBinary( params, pageId, cookie, ); - resolve(fetchedData); + } else { + fetchedData = await fetchDocument({ + cookie, + documentType, + pageId, + params, + }); } + resolve(fetchedData); } catch (error) { console.error("Error in fetching document", error); } @@ -96,6 +106,13 @@ const server = Server.configure({ try { if (documentType === "project_page") { await updatePageDescription(params, pageId, state, cookie); + } else { + await updateDocument({ + params, + pageId, + updatedDescription: state, + cookie, + }) } } catch (error) { console.error("Error in updating document", error); diff --git a/live/tsconfig.json b/live/tsconfig.json index 67c15a892..a9f2b6f7b 100644 --- a/live/tsconfig.json +++ b/live/tsconfig.json @@ -8,7 +8,7 @@ "rootDir": "./src", "baseUrl": ".", "paths": { - "@/*": ["./src/core/*"], + "@/core/*": ["./src/core/*"], "@/plane-live/*": ["./src/ce/*"] }, "removeComments": true, diff --git a/yarn.lock b/yarn.lock index 7cfe1a734..0015a0cbd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -45,6 +45,22 @@ bind-event-listener "^3.0.0" raf-schd "^4.0.3" +"@babel/cli@^7.25.6": + version "7.25.6" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.25.6.tgz#bc35561adc78ade43ac9c09a690768493ab9ed95" + integrity sha512-Z+Doemr4VtvSD2SNHTrkiFZ1LX+JI6tyRXAAOb4N9khIuPyoEPmTPJarPm8ljJV1D6bnMQjyHMWTT9NeKbQuXA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + commander "^6.2.0" + convert-source-map "^2.0.0" + fs-readdir-recursive "^1.1.0" + glob "^7.2.0" + make-dir "^2.1.0" + slash "^2.0.0" + optionalDependencies: + "@nicolo-ribaudo/chokidar-2" "2.1.8-no-fsevents.3" + chokidar "^3.6.0" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465" @@ -58,7 +74,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.4.tgz#7d2a80ce229890edcf4cc259d4d696cb4dae2fcb" integrity sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ== -"@babel/core@^7.18.5", "@babel/core@^7.18.9", "@babel/core@^7.23.0", "@babel/core@^7.24.4": +"@babel/core@^7.18.5", "@babel/core@^7.18.9", "@babel/core@^7.23.0", "@babel/core@^7.24.4", "@babel/core@^7.25.2": version "7.25.2" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.2.tgz#ed8eec275118d7613e77a352894cd12ded8eba77" integrity sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA== @@ -873,7 +889,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.2" "@babel/helper-plugin-utils" "^7.24.8" -"@babel/preset-env@^7.24.4": +"@babel/preset-env@^7.24.4", "@babel/preset-env@^7.25.4": version "7.25.4" resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.4.tgz#be23043d43a34a2721cd0f676c7ba6f1481f6af6" integrity sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw== @@ -980,7 +996,7 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-typescript@^7.23.0": +"@babel/preset-typescript@^7.23.0", "@babel/preset-typescript@^7.24.7": version "7.24.7" resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1" integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ== @@ -1867,6 +1883,11 @@ resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.2.7.tgz#75e1d90758cb10a547e1cdfb878871da28123682" integrity sha512-pxsI23gKWRt/SPHFkDEsP+w+Nd7gK37Hpv0ngc5HpWy2e7cKx9zR/+Q2ptAUqICNTecAaGWvmhway7pj/JLEWA== +"@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3": + version "2.1.8-no-fsevents.3" + resolved "https://registry.yarnpkg.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz#323d72dd25103d0c4fbdce89dadf574a787b1f9b" + integrity sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ== + "@nivo/annotations@0.80.0": version "0.80.0" resolved "https://registry.yarnpkg.com/@nivo/annotations/-/annotations-0.80.0.tgz#127e4801fff7370dcfb9acfe1e335781dd65cfd5" @@ -4884,6 +4905,17 @@ babel-plugin-macros@^3.1.0: cosmiconfig "^7.0.0" resolve "^1.19.0" +babel-plugin-module-resolver@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-5.0.2.tgz#cdeac5d4aaa3b08dd1ac23ddbf516660ed2d293e" + integrity sha512-9KtaCazHee2xc0ibfqsDeamwDps6FZNo5S0Q81dUqEuFzVwPhcT4J5jOqIVvgCA3Q/wO9hKYxN/Ds3tIsp5ygg== + dependencies: + find-babel-config "^2.1.1" + glob "^9.3.3" + pkg-up "^3.1.0" + reselect "^4.1.7" + resolve "^1.22.8" + babel-plugin-polyfill-corejs2@^0.4.10: version "0.4.11" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz#30320dfe3ffe1a336c15afdcdafd6fd615b25e33" @@ -5414,7 +5446,7 @@ commander@^4.0.0: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@^6.2.1: +commander@^6.2.0, commander@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== @@ -6869,6 +6901,13 @@ finalhandler@1.2.0: statuses "2.0.1" unpipe "~1.0.0" +find-babel-config@^2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-2.1.2.tgz#2841b1bfbbbcdb971e1e39df8cbc43dafa901716" + integrity sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg== + dependencies: + json5 "^2.2.3" + find-cache-dir@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz#8d0f94cd13fe43c6c7c261a0d86115ca918c05f7" @@ -7051,6 +7090,11 @@ fs-monkey@^1.0.4: resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.6.tgz#8ead082953e88d992cf3ff844faa907b26756da2" integrity sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg== +fs-readdir-recursive@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" + integrity sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA== + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -7222,7 +7266,7 @@ glob@^10.3.10, glob@^10.4.1: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^7.1.3: +glob@^7.1.3, glob@^7.2.0: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -7234,7 +7278,7 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^9.3.2: +glob@^9.3.2, glob@^9.3.3: version "9.3.5" resolved "https://registry.yarnpkg.com/glob/-/glob-9.3.5.tgz#ca2ed8ca452781a3009685607fdf025a899dfe21" integrity sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== @@ -9609,6 +9653,13 @@ pkg-types@^1.1.1, pkg-types@^1.2.0: mlly "^1.7.1" pathe "^1.1.2" +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + polished@^4.2.2: version "4.3.1" resolved "https://registry.yarnpkg.com/polished/-/polished-4.3.1.tgz#5a00ae32715609f83d89f6f31d0f0261c6170548" @@ -10658,6 +10709,11 @@ requires-port@^1.0.0: resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== +reselect@^4.1.7: + version "4.1.8" + resolved "https://registry.yarnpkg.com/reselect/-/reselect-4.1.8.tgz#3f5dc671ea168dccdeb3e141236f69f02eaec524" + integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -11055,6 +11111,11 @@ sisteransi@^1.0.5: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -11216,6 +11277,7 @@ string-argv@~0.3.2: integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + name string-width-cjs 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== @@ -12581,6 +12643,7 @@ word-wrap@^1.2.5: integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: + name wrap-ansi-cjs version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==