diff --git a/lerna.json b/lerna.json index 8d7179dbae..d033c24518 100644 --- a/lerna.json +++ b/lerna.json @@ -1,6 +1,6 @@ { "$schema": "node_modules/lerna/schemas/lerna-schema.json", - "version": "3.2.44", + "version": "3.2.46", "npmClient": "yarn", "concurrency": 20, "command": { diff --git a/packages/bbui/package.json b/packages/bbui/package.json index 89f72bc46d..2caad20bf6 100644 --- a/packages/bbui/package.json +++ b/packages/bbui/package.json @@ -3,7 +3,7 @@ "description": "A UI solution used in the different Budibase projects.", "version": "0.0.0", "license": "MPL-2.0", - "svelte": "src/index.js", + "svelte": "src/index.ts", "module": "dist/bbui.mjs", "exports": { ".": { @@ -14,7 +14,8 @@ "./spectrum-icons-vite.js": "./src/spectrum-icons-vite.js" }, "scripts": { - "build": "vite build" + "build": "vite build", + "dev": "vite build --watch --mode=dev" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "1.4.0", diff --git a/packages/bbui/src/Icon/Icon.svelte b/packages/bbui/src/Icon/Icon.svelte index 73ad8edd10..c22bb3f918 100644 --- a/packages/bbui/src/Icon/Icon.svelte +++ b/packages/bbui/src/Icon/Icon.svelte @@ -10,12 +10,12 @@ export let size = "M" export let hoverable = false export let disabled = false - export let color - export let hoverColor - export let tooltip + export let color = undefined + export let hoverColor = undefined + export let tooltip = undefined export let tooltipPosition = TooltipPosition.Bottom export let tooltipType = TooltipType.Default - export let tooltipColor + export let tooltipColor = undefined export let tooltipWrap = true export let newStyles = false diff --git a/packages/bbui/src/Label/Label.svelte b/packages/bbui/src/Label/Label.svelte index 71b0967d99..41e1ccf794 100644 --- a/packages/bbui/src/Label/Label.svelte +++ b/packages/bbui/src/Label/Label.svelte @@ -4,7 +4,7 @@ export let size = "M" export let tooltip = "" - export let muted + export let muted = undefined diff --git a/packages/bbui/src/Typography/Heading.svelte b/packages/bbui/src/Typography/Heading.svelte index 90d53fb208..f48d5d958e 100644 --- a/packages/bbui/src/Typography/Heading.svelte +++ b/packages/bbui/src/Typography/Heading.svelte @@ -2,10 +2,10 @@ import "@spectrum-css/typography/dist/index-vars.css" // Sizes - export let size = "M" - export let textAlign = undefined - export let noPadding = false - export let weight = "default" // light, heavy, default + export let size: "XS" | "S" | "M" | "L" = "M" + export let textAlign: string | undefined = undefined + export let noPadding: boolean = false + export let weight: "light" | "heavy" | "default" = "default"

(obj: T) => T -} diff --git a/packages/bbui/src/helpers.js b/packages/bbui/src/helpers.ts similarity index 86% rename from packages/bbui/src/helpers.js rename to packages/bbui/src/helpers.ts index 246587af44..330f381d53 100644 --- a/packages/bbui/src/helpers.js +++ b/packages/bbui/src/helpers.ts @@ -6,9 +6,8 @@ export const deepGet = helpers.deepGet /** * Generates a DOM safe UUID. * Starting with a letter is important to make it DOM safe. - * @return {string} a random DOM safe UUID */ -export function uuid() { +export function uuid(): string { return "cxxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g, c => { const r = (Math.random() * 16) | 0 const v = c === "x" ? r : (r & 0x3) | 0x8 @@ -18,22 +17,18 @@ export function uuid() { /** * Capitalises a string - * @param string the string to capitalise - * @return {string} the capitalised string */ -export const capitalise = string => { +export const capitalise = (string?: string | null): string => { if (!string) { - return string + return "" } return string.substring(0, 1).toUpperCase() + string.substring(1) } /** * Computes a short hash of a string - * @param string the string to compute a hash of - * @return {string} the hash string */ -export const hashString = string => { +export const hashString = (string?: string | null): string => { if (!string) { return "0" } @@ -54,11 +49,12 @@ export const hashString = string => { * will override the value "foo" rather than "bar". * If a deep path is specified and the parent keys don't exist then these will * be created. - * @param obj the object - * @param key the key - * @param value the value */ -export const deepSet = (obj, key, value) => { +export const deepSet = ( + obj: Record | null, + key: string | null, + value: any +): void => { if (!obj || !key) { return } @@ -82,9 +78,8 @@ export const deepSet = (obj, key, value) => { /** * Deeply clones an object. Functions are not supported. - * @param obj the object to clone */ -export const cloneDeep = obj => { +export const cloneDeep = (obj: T): T => { if (!obj) { return obj } @@ -93,9 +88,8 @@ export const cloneDeep = obj => { /** * Copies a value to the clipboard - * @param value the value to copy */ -export const copyToClipboard = value => { +export const copyToClipboard = (value: any): Promise => { return new Promise(res => { if (navigator.clipboard && window.isSecureContext) { // Try using the clipboard API first @@ -117,9 +111,12 @@ export const copyToClipboard = value => { }) } -// Parsed a date value. This is usually an ISO string, but can be a +// Parse a date value. This is usually an ISO string, but can be a // bunch of different formats and shapes depending on schema flags. -export const parseDate = (value, { enableTime = true }) => { +export const parseDate = ( + value: string | dayjs.Dayjs | null, + { enableTime = true } +): dayjs.Dayjs | null => { // If empty then invalid if (!value) { return null @@ -128,7 +125,7 @@ export const parseDate = (value, { enableTime = true }) => { // Certain string values need transformed if (typeof value === "string") { // Check for time only values - if (!isNaN(new Date(`0-${value}`))) { + if (!isNaN(new Date(`0-${value}`).valueOf())) { value = `0-${value}` } @@ -153,9 +150,9 @@ export const parseDate = (value, { enableTime = true }) => { // Stringifies a dayjs object to create an ISO string that respects the various // schema flags export const stringifyDate = ( - value, + value: null | dayjs.Dayjs, { enableTime = true, timeOnly = false, ignoreTimezones = false } = {} -) => { +): string | null => { if (!value) { return null } @@ -192,7 +189,7 @@ export const stringifyDate = ( } // Determine the dayjs-compatible format of the browser's default locale -const getPatternForPart = part => { +const getPatternForPart = (part: Intl.DateTimeFormatPart): string => { switch (part.type) { case "day": return "D".repeat(part.value.length) @@ -214,9 +211,9 @@ const localeDateFormat = new Intl.DateTimeFormat() // Formats a dayjs date according to schema flags export const getDateDisplayValue = ( - value, + value: dayjs.Dayjs | null, { enableTime = true, timeOnly = false } = {} -) => { +): string => { if (!value?.isValid()) { return "" } @@ -229,7 +226,7 @@ export const getDateDisplayValue = ( } } -export const hexToRGBA = (color, opacity) => { +export const hexToRGBA = (color: string, opacity: number): string => { if (color.includes("#")) { color = color.replace("#", "") } diff --git a/packages/bbui/src/index.js b/packages/bbui/src/index.ts similarity index 100% rename from packages/bbui/src/index.js rename to packages/bbui/src/index.ts diff --git a/packages/bbui/svelte.config.js b/packages/bbui/svelte.config.js new file mode 100644 index 0000000000..7d908c15d5 --- /dev/null +++ b/packages/bbui/svelte.config.js @@ -0,0 +1,7 @@ +const { vitePreprocess } = require("@sveltejs/vite-plugin-svelte") + +const config = { + preprocess: vitePreprocess(), +} + +module.exports = config diff --git a/packages/bbui/tsconfig.json b/packages/bbui/tsconfig.json new file mode 100644 index 0000000000..2fe17da42e --- /dev/null +++ b/packages/bbui/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../tsconfig.build.json", + "compilerOptions": { + "allowJs": true, + "outDir": "./dist", + "lib": ["ESNext"], + "baseUrl": ".", + "paths": { + "@budibase/*": [ + "../*/src/index.ts", + "../*/src/index.js", + "../*", + "../../node_modules/@budibase/*" + ] + } + }, + "include": ["./src/**/*"], + "exclude": ["node_modules", "**/*.json", "**/*.spec.ts", "**/*.spec.js"] +} \ No newline at end of file diff --git a/packages/bbui/vite.config.js b/packages/bbui/vite.config.js index bf0f9fc26d..bccca20e43 100644 --- a/packages/bbui/vite.config.js +++ b/packages/bbui/vite.config.js @@ -9,7 +9,7 @@ export default defineConfig(({ mode }) => { build: { sourcemap: !isProduction, lib: { - entry: "src/index.js", + entry: "src/index.ts", formats: ["es"], }, }, diff --git a/packages/builder/package.json b/packages/builder/package.json index 71d1c32008..6fcf72c5fb 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -74,7 +74,6 @@ "dayjs": "^1.10.8", "downloadjs": "1.4.7", "fast-json-patch": "^3.1.1", - "json-format-highlight": "^1.0.4", "lodash": "4.17.21", "posthog-js": "^1.118.0", "remixicon": "2.5.0", @@ -94,6 +93,7 @@ "@sveltejs/vite-plugin-svelte": "1.4.0", "@testing-library/jest-dom": "6.4.2", "@testing-library/svelte": "^4.1.0", + "@types/sanitize-html": "^2.13.0", "@types/shortid": "^2.2.0", "babel-jest": "^29.6.2", "identity-obj-proxy": "^3.0.0", diff --git a/packages/builder/src/components/automation/SetupPanel/CronBuilder.svelte b/packages/builder/src/components/automation/SetupPanel/CronBuilder.svelte index f04c5454ea..1490baa602 100644 --- a/packages/builder/src/components/automation/SetupPanel/CronBuilder.svelte +++ b/packages/builder/src/components/automation/SetupPanel/CronBuilder.svelte @@ -9,7 +9,7 @@ } from "@budibase/bbui" import { onMount, createEventDispatcher } from "svelte" import { flags } from "@/stores/builder" - import { featureFlags, licensing } from "@/stores/portal" + import { licensing } from "@/stores/portal" import { API } from "@/api" import MagicWand from "../../../../assets/MagicWand.svelte" @@ -27,8 +27,7 @@ let loadingAICronExpression = false $: aiEnabled = - ($featureFlags.AI_CUSTOM_CONFIGS && $licensing.customAIConfigsEnabled) || - ($featureFlags.BUDIBASE_AI && $licensing.budibaseAIEnabled) + $licensing.customAIConfigsEnabled || $licensing.budibaseAIEnabled $: { if (cronExpression) { try { diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte index 55ac8474a6..4af1dcc0ee 100644 --- a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte +++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte @@ -26,7 +26,7 @@ import { createEventDispatcher, getContext, onMount } from "svelte" import { cloneDeep } from "lodash/fp" import { tables, datasources } from "@/stores/builder" - import { featureFlags } from "@/stores/portal" + import { licensing } from "@/stores/portal" import { TableNames, UNEDITABLE_USER_FIELDS } from "@/constants" import { FIELDS, @@ -100,7 +100,8 @@ let optionsValid = true $: rowGoldenSample = RowUtils.generateGoldenSample($rows) - $: aiEnabled = $featureFlags.BUDIBASE_AI || $featureFlags.AI_CUSTOM_CONFIGS + $: aiEnabled = + $licensing.customAIConfigsEnabled || $licensing.budibaseAiEnabled $: if (primaryDisplay) { editableColumn.constraints.presence = { allowEmpty: false } } diff --git a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte index f94d26603d..bc88f0f981 100644 --- a/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte +++ b/packages/builder/src/components/common/CodeEditor/CodeEditor.svelte @@ -1,4 +1,4 @@ - diff --git a/packages/builder/src/pages/builder/app/[application]/data/table/[tableId]/[viewId]/index.svelte b/packages/builder/src/pages/builder/app/[application]/data/table/[tableId]/[viewId]/index.svelte index 9ac7ccd715..4d42c0d5d6 100644 --- a/packages/builder/src/pages/builder/app/[application]/data/table/[tableId]/[viewId]/index.svelte +++ b/packages/builder/src/pages/builder/app/[application]/data/table/[tableId]/[viewId]/index.svelte @@ -1,6 +1,6 @@ diff --git a/packages/frontend-core/src/utils/index.ts b/packages/frontend-core/src/utils/index.ts index cc44eec74c..efc694d268 100644 --- a/packages/frontend-core/src/utils/index.ts +++ b/packages/frontend-core/src/utils/index.ts @@ -8,6 +8,7 @@ export * as search from "./searchFields" export * as SchemaUtils from "./schema" export { memo, derivedMemo } from "./memo" export { createWebsocket } from "./websocket" +export * as JsonFormatter from "./jsonFormatter" export * from "./download" export * from "./settings" export * from "./relatedColumns" diff --git a/packages/frontend-core/src/utils/jsonFormatter.ts b/packages/frontend-core/src/utils/jsonFormatter.ts new file mode 100644 index 0000000000..9f9af3a3c0 --- /dev/null +++ b/packages/frontend-core/src/utils/jsonFormatter.ts @@ -0,0 +1,71 @@ +import { JSONValue } from "@budibase/types" + +export type ColorsOptions = { + keyColor?: string + numberColor?: string + stringColor?: string + trueColor?: string + falseColor?: string + nullColor?: string +} + +const defaultColors: ColorsOptions = { + keyColor: "dimgray", + numberColor: "lightskyblue", + stringColor: "lightcoral", + trueColor: "lightseagreen", + falseColor: "#f66578", + nullColor: "cornflowerblue", +} + +const entityMap = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + "`": "`", + "=": "=", +} + +function escapeHtml(html: string) { + return String(html).replace(/[&<>"'`=]/g, function (s) { + return entityMap[s as keyof typeof entityMap] + }) +} + +export function format(json: JSONValue, colorOptions: ColorsOptions = {}) { + const valueType = typeof json + let jsonString = + typeof json === "string" ? json : JSON.stringify(json, null, 2) || valueType + let colors = Object.assign({}, defaultColors, colorOptions) + jsonString = jsonString + .replace(/&/g, "&") + .replace(//g, ">") + return jsonString.replace( + /("(\\u[a-zA-Z0-9]{4}|\\[^u]|[^\\"])*"(\s*:)?|\b(true|false|null)\b|-?\d+(?:\.\d*)?(?:[eE][+]?\d+)?)/g, + (match: string) => { + let color = colors.numberColor + let style = "" + if (/^"/.test(match)) { + if (/:$/.test(match)) { + color = colors.keyColor + } else { + color = colors.stringColor + match = '"' + escapeHtml(match.substr(1, match.length - 2)) + '"' + style = "word-wrap:break-word;white-space:pre-wrap;" + } + } else { + color = /true/.test(match) + ? colors.trueColor + : /false/.test(match) + ? colors.falseColor + : /null/.test(match) + ? colors.nullColor + : color + } + return `${match}` + } + ) +} diff --git a/packages/frontend-core/src/utils/utils.js b/packages/frontend-core/src/utils/utils.js index 55603b0129..f0635fbeac 100644 --- a/packages/frontend-core/src/utils/utils.js +++ b/packages/frontend-core/src/utils/utils.js @@ -43,7 +43,7 @@ export const sequential = fn => { * invocations is enforced. * @param callback an async function to run * @param minDelay the minimum delay between invocations - * @returns {Promise} a debounced version of the callback + * @returns a debounced version of the callback */ export const debounce = (callback, minDelay = 1000) => { let timeout diff --git a/packages/types/src/core/common.ts b/packages/types/src/core/common.ts new file mode 100644 index 0000000000..c61fc3255d --- /dev/null +++ b/packages/types/src/core/common.ts @@ -0,0 +1,7 @@ +export type JSONValue = + | string + | number + | boolean + | null + | { [key: string]: JSONValue } + | JSONValue[] diff --git a/packages/types/src/core/index.ts b/packages/types/src/core/index.ts index 73cc7d35e0..ba9c1b907c 100644 --- a/packages/types/src/core/index.ts +++ b/packages/types/src/core/index.ts @@ -1,2 +1,3 @@ export * from "./installation" export * from "./events" +export * from "./common" diff --git a/packages/types/src/ui/bindings/binding.ts b/packages/types/src/ui/bindings/binding.ts new file mode 100644 index 0000000000..2cfb23ed2d --- /dev/null +++ b/packages/types/src/ui/bindings/binding.ts @@ -0,0 +1,26 @@ +export interface BindingCompletion { + section: { + name: string + } + label: string +} + +export interface EnrichedBinding { + runtimeBinding: string + readableBinding: string + type?: null | string +} + +export enum BindingMode { + Text = "Text", + JavaScript = "JavaScript", +} + +export type CaretPositionFn = () => { start: number; end: number } + +export type InsertAtPositionFn = (_: { + start: number + end?: number + value: string + cursor?: { anchor: number } +}) => void diff --git a/packages/types/src/ui/bindings/helper.ts b/packages/types/src/ui/bindings/helper.ts new file mode 100644 index 0000000000..5ebd305958 --- /dev/null +++ b/packages/types/src/ui/bindings/helper.ts @@ -0,0 +1,4 @@ +export interface Helper { + example: string + description: string +} diff --git a/packages/types/src/ui/bindings/index.ts b/packages/types/src/ui/bindings/index.ts new file mode 100644 index 0000000000..6c4e6037b4 --- /dev/null +++ b/packages/types/src/ui/bindings/index.ts @@ -0,0 +1,2 @@ +export * from "./binding" +export * from "./helper" diff --git a/packages/types/src/ui/components/codeEditor.ts b/packages/types/src/ui/components/codeEditor.ts new file mode 100644 index 0000000000..ffbea1d643 --- /dev/null +++ b/packages/types/src/ui/components/codeEditor.ts @@ -0,0 +1,26 @@ +interface JSEditorMode { + name: "javascript" + json: boolean + match: RegExp +} + +interface HBSEditorMode { + name: "handlebars" + base: "text/html" + match: RegExp +} + +interface HTMLEditorMode { + name: "text/html" +} + +export type EditorMode = JSEditorMode | HBSEditorMode | HTMLEditorMode + +type EditorModeMapBase = + | (JSEditorMode & { key: "JS" }) + | (HBSEditorMode & { key: "Handlebars" }) + | (HTMLEditorMode & { key: "Text" }) + +export type EditorModesMap = { + [M in EditorModeMapBase as M["key"]]: Omit +} diff --git a/packages/types/src/ui/components/index.ts b/packages/types/src/ui/components/index.ts new file mode 100644 index 0000000000..8dc1638f8c --- /dev/null +++ b/packages/types/src/ui/components/index.ts @@ -0,0 +1,2 @@ +export * from "./sidepanel" +export * from "./codeEditor" diff --git a/packages/types/src/ui/components/sidepanel.ts b/packages/types/src/ui/components/sidepanel.ts new file mode 100644 index 0000000000..f2d62458d6 --- /dev/null +++ b/packages/types/src/ui/components/sidepanel.ts @@ -0,0 +1,5 @@ +export enum SidePanel { + Bindings = "FlashOn", + Evaluation = "Play", + Snippets = "Code", +} diff --git a/packages/types/src/ui/index.ts b/packages/types/src/ui/index.ts index acc5d293f6..907f4ec0b5 100644 --- a/packages/types/src/ui/index.ts +++ b/packages/types/src/ui/index.ts @@ -1,2 +1,4 @@ export * from "./stores" +export * from "./bindings" +export * from "./components" export * from "./dataFetch" diff --git a/yarn.lock b/yarn.lock index c54385478e..453dc45128 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2131,9 +2131,9 @@ through2 "^2.0.0" "@budibase/pro@npm:@budibase/pro@latest": - version "3.2.32" - resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-3.2.32.tgz#f6abcd5a5524e7f33d958acb6e610e29995427bb" - integrity sha512-bF0pd17IjYugjll2yKYmb0RM+tfKZcCmRBc4XG2NZ4f/I47QaOovm9RqSw6tfqCFuzRewxR3SWmtmSseUc/e0w== + version "3.2.44" + resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-3.2.44.tgz#90367bb2167aafd8c809e000a57d349e5dc4bb78" + integrity sha512-Zv2PBVUZUS6/psOpIRIDlW3jrOHWWPhpQXzCk00kIQJaqjkdcvuTXSedQ70u537sQmLu8JsSWbui9MdfF8ksVw== dependencies: "@anthropic-ai/sdk" "^0.27.3" "@budibase/backend-core" "*" @@ -5926,6 +5926,13 @@ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.5.tgz#f090ff4bd8d2e5b940ff270ab39fd5ca1834a07e" integrity sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw== +"@types/sanitize-html@^2.13.0": + version "2.13.0" + resolved "https://registry.yarnpkg.com/@types/sanitize-html/-/sanitize-html-2.13.0.tgz#ac3620e867b7c68deab79c72bd117e2049cdd98e" + integrity sha512-X31WxbvW9TjIhZZNyNBZ/p5ax4ti7qsNDBDEnH4zAgmEh35YnFD1UiS6z9Cd34kKm0LslFW0KPmTQzu/oGtsqQ== + dependencies: + htmlparser2 "^8.0.0" + "@types/semver@7.3.7": version "7.3.7" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.7.tgz#b9eb89d7dfa70d5d1ce525bc1411a35347f533a3" @@ -13272,11 +13279,6 @@ json-buffer@3.0.1: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== -json-format-highlight@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/json-format-highlight/-/json-format-highlight-1.0.4.tgz#2e44277edabcec79a3d2c84e984c62e2258037b9" - integrity sha512-RqenIjKr1I99XfXPAml9G7YlEZg/GnsH7emWyWJh2yuGXqHW8spN7qx6/ME+MoIBb35/fxrMC9Jauj6nvGe4Mg== - json-parse-better-errors@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" @@ -18644,7 +18646,16 @@ string-length@^4.0.1: char-regex "^1.0.2" strip-ansi "^6.0.0" -"string-width-cjs@npm:string-width@^4.2.0", "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": + 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.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, 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== @@ -18736,7 +18747,7 @@ stringify-object@^3.2.1: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm: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== @@ -18750,6 +18761,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +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@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" @@ -20497,7 +20515,7 @@ worker-farm@1.7.0: dependencies: errno "~0.1.7" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm: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== @@ -20515,6 +20533,15 @@ wrap-ansi@^5.1.0: string-width "^3.0.0" strip-ansi "^5.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@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"