Merge branch 'master' into typing/stores-grid-ui

This commit is contained in:
Adria Navarro 2024-12-30 14:57:33 +01:00 committed by GitHub
commit 3a6e0406cf
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
25 changed files with 778 additions and 537 deletions

View File

@ -51,6 +51,7 @@
} }
input.hide-arrows { input.hide-arrows {
-moz-appearance: textfield; -moz-appearance: textfield;
appearance: textfield;
} }
input[type="time"]::-webkit-calendar-picker-indicator { input[type="time"]::-webkit-calendar-picker-indicator {
display: none; display: none;

View File

@ -39,6 +39,7 @@
padding: 0; padding: 0;
margin: 0; margin: 0;
-webkit-appearance: none; -webkit-appearance: none;
appearance: none;
background: transparent; background: transparent;
} }
input::-webkit-slider-thumb { input::-webkit-slider-thumb {

View File

@ -124,8 +124,6 @@
.spectrum-Tabs-selectionIndicator.emphasized { .spectrum-Tabs-selectionIndicator.emphasized {
background-color: var(--spectrum-global-color-blue-400); background-color: var(--spectrum-global-color-blue-400);
} }
.spectrum-Tabs--horizontal .spectrum-Tabs-selectionIndicator {
}
.noHorizPadding { .noHorizPadding {
padding: 0; padding: 0;
} }

View File

@ -134,6 +134,7 @@
.spectrum-Tooltip-label { .spectrum-Tooltip-label {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: 3; -webkit-line-clamp: 3;
line-clamp: 3;
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
overflow: hidden; overflow: hidden;
font-size: 12px; font-size: 12px;

View File

@ -94,6 +94,7 @@
"@sveltejs/vite-plugin-svelte": "1.4.0", "@sveltejs/vite-plugin-svelte": "1.4.0",
"@testing-library/jest-dom": "6.4.2", "@testing-library/jest-dom": "6.4.2",
"@testing-library/svelte": "^4.1.0", "@testing-library/svelte": "^4.1.0",
"@types/shortid": "^2.2.0",
"babel-jest": "^29.6.2", "babel-jest": "^29.6.2",
"identity-obj-proxy": "^3.0.0", "identity-obj-proxy": "^3.0.0",
"jest": "29.7.0", "jest": "29.7.0",

View File

@ -1507,7 +1507,12 @@ export const updateReferencesInObject = ({
// Migrate references // Migrate references
// Switch all bindings to reference their ids // Switch all bindings to reference their ids
export const migrateReferencesInObject = ({ obj, label = "steps", steps }) => { export const migrateReferencesInObject = ({
obj,
label = "steps",
steps,
originalIndex,
}) => {
const stepIndexRegex = new RegExp(`{{\\s*${label}\\.(\\d+)\\.`, "g") const stepIndexRegex = new RegExp(`{{\\s*${label}\\.(\\d+)\\.`, "g")
const updateActionStep = (str, index, replaceWith) => const updateActionStep = (str, index, replaceWith) =>
str.replace(`{{ ${label}.${index}.`, `{{ ${label}.${replaceWith}.`) str.replace(`{{ ${label}.${index}.`, `{{ ${label}.${replaceWith}.`)
@ -1528,6 +1533,7 @@ export const migrateReferencesInObject = ({ obj, label = "steps", steps }) => {
migrateReferencesInObject({ migrateReferencesInObject({
obj: obj[key], obj: obj[key],
steps, steps,
originalIndex,
}) })
} }
} }

View File

@ -1,7 +1,54 @@
import { API } from "api" import { API } from "api"
import { BudiStore } from "../BudiStore" import { BudiStore } from "../BudiStore"
import {
App,
AppFeatures,
AppIcon,
AutomationSettings,
Plugin,
} from "@budibase/types"
export const INITIAL_APP_META_STATE = { interface ClientFeatures {
spectrumThemes: boolean
intelligentLoading: boolean
deviceAwareness: boolean
state: boolean
rowSelection: boolean
customThemes: boolean
devicePreview: boolean
messagePassing: boolean
continueIfAction: boolean
showNotificationAction: boolean
sidePanel: boolean
}
interface TypeSupportPresets {
[key: string]: any
}
interface AppMetaState {
appId: string
name: string
url: string
libraries: string[]
clientFeatures: ClientFeatures
typeSupportPresets: TypeSupportPresets
features: AppFeatures
clientLibPath: string
hasLock: boolean
appInstance: { _id: string } | null
initialised: boolean
hasAppPackage: boolean
usedPlugins: Plugin[] | null
automations: AutomationSettings
routes: { [key: string]: any }
version?: string
revertableVersion?: string
upgradableVersion?: string
icon?: AppIcon
}
export const INITIAL_APP_META_STATE: AppMetaState = {
appId: "", appId: "",
name: "", name: "",
url: "", url: "",
@ -34,23 +81,27 @@ export const INITIAL_APP_META_STATE = {
routes: {}, routes: {},
} }
export class AppMetaStore extends BudiStore { export class AppMetaStore extends BudiStore<AppMetaState> {
constructor() { constructor() {
super(INITIAL_APP_META_STATE) super(INITIAL_APP_META_STATE)
} }
reset() { reset(): void {
this.store.set({ ...INITIAL_APP_META_STATE }) this.store.set({ ...INITIAL_APP_META_STATE })
} }
syncAppPackage(pkg) { syncAppPackage(pkg: {
application: App
clientLibPath: string
hasLock: boolean
}): void {
const { application: app, clientLibPath, hasLock } = pkg const { application: app, clientLibPath, hasLock } = pkg
this.update(state => ({ this.update(state => ({
...state, ...state,
name: app.name, name: app.name,
appId: app.appId, appId: app.appId,
url: app.url, url: app.url || "",
hasLock, hasLock,
clientLibPath, clientLibPath,
libraries: app.componentLibraries, libraries: app.componentLibraries,
@ -58,8 +109,8 @@ export class AppMetaStore extends BudiStore {
appInstance: app.instance, appInstance: app.instance,
revertableVersion: app.revertableVersion, revertableVersion: app.revertableVersion,
upgradableVersion: app.upgradableVersion, upgradableVersion: app.upgradableVersion,
usedPlugins: app.usedPlugins, usedPlugins: app.usedPlugins || null,
icon: app.icon || {}, icon: app.icon,
features: { features: {
...INITIAL_APP_META_STATE.features, ...INITIAL_APP_META_STATE.features,
...app.features, ...app.features,
@ -70,7 +121,7 @@ export class AppMetaStore extends BudiStore {
})) }))
} }
syncClientFeatures(features) { syncClientFeatures(features: Partial<ClientFeatures>): void {
this.update(state => ({ this.update(state => ({
...state, ...state,
clientFeatures: { clientFeatures: {
@ -80,14 +131,14 @@ export class AppMetaStore extends BudiStore {
})) }))
} }
syncClientTypeSupportPresets(typeSupportPresets) { syncClientTypeSupportPresets(typeSupportPresets: TypeSupportPresets): void {
this.update(state => ({ this.update(state => ({
...state, ...state,
typeSupportPresets, typeSupportPresets,
})) }))
} }
async syncAppRoutes() { async syncAppRoutes(): Promise<void> {
const resp = await API.fetchAppRoutes() const resp = await API.fetchAppRoutes()
this.update(state => ({ this.update(state => ({
...state, ...state,
@ -96,7 +147,7 @@ export class AppMetaStore extends BudiStore {
} }
// Returned from socket // Returned from socket
syncMetadata(metadata) { syncMetadata(metadata: { name: string; url: string; icon?: AppIcon }): void {
const { name, url, icon } = metadata const { name, url, icon } = metadata
this.update(state => ({ this.update(state => ({
...state, ...state,

View File

@ -1,10 +1,28 @@
import { get } from "svelte/store" import { get } from "svelte/store"
import { createBuilderWebsocket } from "./websocket.js" import { createBuilderWebsocket } from "./websocket.js"
import { Socket } from "socket.io-client"
import { BuilderSocketEvent } from "@budibase/shared-core" import { BuilderSocketEvent } from "@budibase/shared-core"
import { BudiStore } from "../BudiStore.js" import { BudiStore } from "../BudiStore.js"
import { TOUR_KEYS } from "components/portal/onboarding/tours.js" import { TOUR_KEYS } from "components/portal/onboarding/tours.js"
import { App } from "@budibase/types"
export const INITIAL_BUILDER_STATE = { interface BuilderState {
previousTopNavPath: Record<string, string>
highlightedSetting: {
key: string
type: "info" | string
} | null
propertyFocus: string | null
builderSidePanel: boolean
onboarding: boolean
tourNodes: Record<string, HTMLElement> | null
tourKey: string | null
tourStepKey: string | null
hoveredComponentId: string | null
websocket?: Socket
}
export const INITIAL_BUILDER_STATE: BuilderState = {
previousTopNavPath: {}, previousTopNavPath: {},
highlightedSetting: null, highlightedSetting: null,
propertyFocus: null, propertyFocus: null,
@ -16,7 +34,9 @@ export const INITIAL_BUILDER_STATE = {
hoveredComponentId: null, hoveredComponentId: null,
} }
export class BuilderStore extends BudiStore { export class BuilderStore extends BudiStore<BuilderState> {
websocket?: Socket
constructor() { constructor() {
super({ ...INITIAL_BUILDER_STATE }) super({ ...INITIAL_BUILDER_STATE })
@ -32,11 +52,9 @@ export class BuilderStore extends BudiStore {
this.registerTourNode = this.registerTourNode.bind(this) this.registerTourNode = this.registerTourNode.bind(this)
this.destroyTourNode = this.destroyTourNode.bind(this) this.destroyTourNode = this.destroyTourNode.bind(this)
this.startBuilderOnboarding = this.startBuilderOnboarding.bind(this) this.startBuilderOnboarding = this.startBuilderOnboarding.bind(this)
this.websocket
} }
init(app) { init(app: App): void {
if (!app?.appId) { if (!app?.appId) {
console.error("BuilderStore: No appId supplied for websocket") console.error("BuilderStore: No appId supplied for websocket")
return return
@ -46,45 +64,46 @@ export class BuilderStore extends BudiStore {
} }
} }
refresh() { refresh(): void {
this.store.set(this.store.get()) const currentState = get(this.store)
this.store.set(currentState)
} }
reset() { reset(): void {
this.store.set({ ...INITIAL_BUILDER_STATE }) this.store.set({ ...INITIAL_BUILDER_STATE })
this.websocket?.disconnect() this.websocket?.disconnect()
this.websocket = null this.websocket = undefined
} }
highlightSetting(key, type) { highlightSetting(key?: string, type?: string): void {
this.update(state => ({ this.update(state => ({
...state, ...state,
highlightedSetting: key ? { key, type: type || "info" } : null, highlightedSetting: key ? { key, type: type || "info" } : null,
})) }))
} }
propertyFocus(key) { propertyFocus(key: string | null): void {
this.update(state => ({ this.update(state => ({
...state, ...state,
propertyFocus: key, propertyFocus: key,
})) }))
} }
showBuilderSidePanel() { showBuilderSidePanel(): void {
this.update(state => ({ this.update(state => ({
...state, ...state,
builderSidePanel: true, builderSidePanel: true,
})) }))
} }
hideBuilderSidePanel() { hideBuilderSidePanel(): void {
this.update(state => ({ this.update(state => ({
...state, ...state,
builderSidePanel: false, builderSidePanel: false,
})) }))
} }
setPreviousTopNavPath(route, url) { setPreviousTopNavPath(route: string, url: string): void {
this.update(state => ({ this.update(state => ({
...state, ...state,
previousTopNavPath: { previousTopNavPath: {
@ -94,13 +113,13 @@ export class BuilderStore extends BudiStore {
})) }))
} }
selectResource(id) { selectResource(id: string): void {
this.websocket.emit(BuilderSocketEvent.SelectResource, { this.websocket?.emit(BuilderSocketEvent.SelectResource, {
resourceId: id, resourceId: id,
}) })
} }
registerTourNode(tourStepKey, node) { registerTourNode(tourStepKey: string, node: HTMLElement): void {
this.update(state => { this.update(state => {
const update = { const update = {
...state, ...state,
@ -113,7 +132,7 @@ export class BuilderStore extends BudiStore {
}) })
} }
destroyTourNode(tourStepKey) { destroyTourNode(tourStepKey: string): void {
const store = get(this.store) const store = get(this.store)
if (store.tourNodes?.[tourStepKey]) { if (store.tourNodes?.[tourStepKey]) {
const nodes = { ...store.tourNodes } const nodes = { ...store.tourNodes }
@ -125,7 +144,7 @@ export class BuilderStore extends BudiStore {
} }
} }
startBuilderOnboarding() { startBuilderOnboarding(): void {
this.update(state => ({ this.update(state => ({
...state, ...state,
onboarding: true, onboarding: true,
@ -133,19 +152,19 @@ export class BuilderStore extends BudiStore {
})) }))
} }
endBuilderOnboarding() { endBuilderOnboarding(): void {
this.update(state => ({ this.update(state => ({
...state, ...state,
onboarding: false, onboarding: false,
})) }))
} }
setTour(tourKey) { setTour(tourKey?: string | null): void {
this.update(state => ({ this.update(state => ({
...state, ...state,
tourStepKey: null, tourStepKey: null,
tourNodes: null, tourNodes: null,
tourKey: tourKey, tourKey: tourKey || null,
})) }))
} }
} }

View File

@ -1,28 +0,0 @@
import { writable } from "svelte/store"
export const INITIAL_CONTEXT_MENU_STATE = {
id: null,
items: [],
position: { x: 0, y: 0 },
visible: false,
}
export function createViewsStore() {
const store = writable({ ...INITIAL_CONTEXT_MENU_STATE })
const open = (id, items, position) => {
store.set({ id, items, position, visible: true })
}
const close = () => {
store.set({ ...INITIAL_CONTEXT_MENU_STATE })
}
return {
subscribe: store.subscribe,
open,
close,
}
}
export const contextMenuStore = createViewsStore()

View File

@ -0,0 +1,46 @@
import { writable } from "svelte/store"
interface Position {
x: number
y: number
}
interface MenuItem {
label: string
icon?: string
action: () => void
}
interface ContextMenuState {
id: string | null
items: MenuItem[]
position: Position
visible: boolean
}
export const INITIAL_CONTEXT_MENU_STATE: ContextMenuState = {
id: null,
items: [],
position: { x: 0, y: 0 },
visible: false,
}
export function createViewsStore() {
const store = writable<ContextMenuState>({ ...INITIAL_CONTEXT_MENU_STATE })
const open = (id: string, items: MenuItem[], position: Position): void => {
store.set({ id, items, position, visible: true })
}
const close = (): void => {
store.set({ ...INITIAL_CONTEXT_MENU_STATE })
}
return {
subscribe: store.subscribe,
open,
close,
}
}
export const contextMenuStore = createViewsStore()

View File

@ -1,11 +1,12 @@
import { writable } from "svelte/store" import { writable, type Writable } from "svelte/store"
import { API } from "api" import { API } from "api"
import { notifications } from "@budibase/bbui" import { notifications } from "@budibase/bbui"
import { DeploymentProgressResponse } from "@budibase/types"
export const createDeploymentStore = () => { export const createDeploymentStore = () => {
let store = writable([]) let store: Writable<DeploymentProgressResponse[]> = writable([])
const load = async () => { const load = async (): Promise<void> => {
try { try {
store.set(await API.getAppDeployments()) store.set(await API.getAppDeployments())
} catch (err) { } catch (err) {

View File

@ -65,7 +65,7 @@ describe("Builder store", () => {
ctx.test.builderStore.reset() ctx.test.builderStore.reset()
expect(disconnected).toBe(true) expect(disconnected).toBe(true)
expect(ctx.test.store).toStrictEqual(INITIAL_BUILDER_STATE) expect(ctx.test.store).toStrictEqual(INITIAL_BUILDER_STATE)
expect(ctx.test.builderStore.websocket).toBeNull() expect(ctx.test.builderStore.websocket).toBeUndefined()
}) })
it("Attempt to emit a resource select event to the websocket on select", ctx => { it("Attempt to emit a resource select event to the websocket on select", ctx => {

View File

@ -22,6 +22,7 @@ export const createLicensingStore = () => {
backupsEnabled: false, backupsEnabled: false,
brandingEnabled: false, brandingEnabled: false,
scimEnabled: false, scimEnabled: false,
environmentVariablesEnabled: false,
budibaseAIEnabled: false, budibaseAIEnabled: false,
customAIConfigsEnabled: false, customAIConfigsEnabled: false,
auditLogsEnabled: false, auditLogsEnabled: false,

View File

@ -73,6 +73,7 @@
.value { .value {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: var(--content-lines); -webkit-line-clamp: var(--content-lines);
line-clamp: var(--content-lines);
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
overflow: hidden; overflow: hidden;
line-height: 20px; line-height: 20px;

View File

@ -93,6 +93,7 @@
.value { .value {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: var(--content-lines); -webkit-line-clamp: var(--content-lines);
line-clamp: var(--content-lines);
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
overflow: hidden; overflow: hidden;
line-height: 20px; line-height: 20px;

View File

@ -74,12 +74,14 @@
.value { .value {
display: -webkit-box; display: -webkit-box;
-webkit-line-clamp: var(--content-lines); -webkit-line-clamp: var(--content-lines);
line-clamp: var(--content-lines);
-webkit-box-orient: vertical; -webkit-box-orient: vertical;
overflow: hidden; overflow: hidden;
line-height: 20px; line-height: 20px;
} }
.number .value { .number .value {
-webkit-line-clamp: 1; -webkit-line-clamp: 1;
line-clamp: 1;
} }
input { input {
flex: 1 1 auto; flex: 1 1 auto;
@ -110,5 +112,6 @@
} }
input[type="number"] { input[type="number"] {
-moz-appearance: textfield; -moz-appearance: textfield;
appearance: textfield;
} }
</style> </style>

View File

@ -133,11 +133,7 @@ export const deriveStores = (context: StoreContext): DerivedDatasourceStore => {
type = ($datasource as any).value?.datasource?.type type = ($datasource as any).value?.datasource?.type
} }
// Handle calculation views // Handle calculation views
if ( if (type === "viewV2" && $definition?.type === ViewV2Type.CALCULATION) {
type === "viewV2" &&
"type" in $definition &&
$definition?.type === ViewV2Type.CALCULATION
) {
return false return false
} }
return ["table", "viewV2", "link"].includes(type) return ["table", "viewV2", "link"].includes(type)

View File

@ -3,6 +3,11 @@ import { helpers } from "@budibase/shared-core"
import { Store as StoreContext } from "." import { Store as StoreContext } from "."
import { UIUser } from "@budibase/types" import { UIUser } from "@budibase/types"
interface UIEnrichedUser extends UIUser {
color: string
label: string
}
interface UsersStore { interface UsersStore {
users: Writable<UIUser[]> users: Writable<UIUser[]>
} }
@ -12,21 +17,22 @@ interface DerivedUsersStore {
} }
interface ActionUserStore { interface ActionUserStore {
users: UsersStore["users"] & { users: UsersStore["users"] &
actions: { Readable<UIEnrichedUser[]> & {
updateUser: (user: UIUser) => void actions: {
removeUser: (sessionId: string) => void updateUser: (user: UIUser) => void
removeUser: (sessionId: string) => void
}
} }
}
} }
export type Store = UsersStore & DerivedUsersStore export type Store = DerivedUsersStore & ActionUserStore
export const createStores = (): UsersStore => { export const createStores = (): UsersStore => {
const users = writable<UIUser[]>([]) const users = writable<UIUser[]>([])
const enrichedUsers = derived(users, $users => { const enrichedUsers = derived(users, $users => {
return $users.map(user => ({ return $users.map<UIEnrichedUser>(user => ({
...user, ...user,
color: helpers.getUserColor(user), color: helpers.getUserColor(user),
label: helpers.getUserLabel(user), label: helpers.getUserLabel(user),

View File

@ -456,7 +456,7 @@ export function filterAutomation(appId: string, tableId?: string): Automation {
icon: "Icon", icon: "Icon",
id: "a", id: "a",
type: AutomationStepType.TRIGGER, type: AutomationStepType.TRIGGER,
event: "row:save", event: AutomationEventType.ROW_SAVE,
stepId: AutomationTriggerStepId.ROW_SAVED, stepId: AutomationTriggerStepId.ROW_SAVED,
inputs: { inputs: {
tableId: tableId!, tableId: tableId!,
@ -498,7 +498,7 @@ export function updateRowAutomationWithFilters(
icon: "Icon", icon: "Icon",
id: "a", id: "a",
type: AutomationStepType.TRIGGER, type: AutomationStepType.TRIGGER,
event: "row:update", event: AutomationEventType.ROW_UPDATE,
stepId: AutomationTriggerStepId.ROW_UPDATED, stepId: AutomationTriggerStepId.ROW_UPDATED,
inputs: { tableId }, inputs: { tableId },
schema: TRIGGER_DEFINITIONS.ROW_UPDATED.schema, schema: TRIGGER_DEFINITIONS.ROW_UPDATED.schema,
@ -513,7 +513,7 @@ export function basicAutomationResults(
return { return {
automationId, automationId,
status: AutomationStatus.SUCCESS, status: AutomationStatus.SUCCESS,
trigger: "trigger", trigger: "trigger" as any,
steps: [ steps: [
{ {
stepId: AutomationActionStepId.SERVER_LOG, stepId: AutomationActionStepId.SERVER_LOG,

View File

@ -148,6 +148,7 @@ export interface Automation extends Document {
interface BaseIOStructure { interface BaseIOStructure {
type?: AutomationIOType type?: AutomationIOType
subtype?: AutomationIOType
customType?: AutomationCustomIOType customType?: AutomationCustomIOType
title?: string title?: string
description?: string description?: string
@ -192,7 +193,7 @@ export enum AutomationStoppedReason {
export interface AutomationResults { export interface AutomationResults {
automationId?: string automationId?: string
status?: AutomationStatus status?: AutomationStatus
trigger?: any trigger?: AutomationTrigger
steps: { steps: {
stepId: AutomationTriggerStepId | AutomationActionStepId stepId: AutomationTriggerStepId | AutomationActionStepId
inputs: { inputs: {

View File

@ -6,6 +6,7 @@ import {
AutomationFeature, AutomationFeature,
InputOutputBlock, InputOutputBlock,
AutomationTriggerStepId, AutomationTriggerStepId,
AutomationEventType,
} from "./automation" } from "./automation"
import { import {
CollectStepInputs, CollectStepInputs,
@ -142,6 +143,7 @@ export type ActionImplementations<T extends Hosting> = {
export interface AutomationStepSchemaBase { export interface AutomationStepSchemaBase {
name: string name: string
stepTitle?: string stepTitle?: string
event?: AutomationEventType
tagline: string tagline: string
icon: string icon: string
description: string description: string
@ -344,7 +346,7 @@ export interface AutomationTriggerSchema<
> extends AutomationStepSchemaBase { > extends AutomationStepSchemaBase {
id: string id: string
type: AutomationStepType.TRIGGER type: AutomationStepType.TRIGGER
event?: string event?: AutomationEventType
cronJobId?: string cronJobId?: string
stepId: TTrigger stepId: TTrigger
inputs: AutomationTriggerInputs<TTrigger> & Record<string, any> // The record union to be removed once the types are fixed inputs: AutomationTriggerInputs<TTrigger> & Record<string, any> // The record union to be removed once the types are fixed

View File

@ -0,0 +1,12 @@
export interface BranchPath {
stepIdx: number
branchIdx: number
branchStepId: string
id: string
}
export interface BlockDefinitions {
TRIGGER: Record<string, any>
CREATABLE_TRIGGER: Record<string, any>
ACTION: Record<string, any>
}

View File

@ -1,2 +1,3 @@
export * from "./integration" export * from "./integration"
export * from "./automations"
export * from "./grid" export * from "./grid"

View File

@ -5946,6 +5946,11 @@
dependencies: dependencies:
"@types/node" "*" "@types/node" "*"
"@types/shortid@^2.2.0":
version "2.2.0"
resolved "https://registry.yarnpkg.com/@types/shortid/-/shortid-2.2.0.tgz#905990fc4275f77e60ab0cd9f791b91a3d4bff04"
integrity sha512-jBG2FgBxcaSf0h662YloTGA32M8UtNbnTPekUr/eCmWXq0JWQXgNEQ/P5Gf05Cv66QZtE1Ttr83I1AJBPdzCBg==
"@types/ssh2-streams@*": "@types/ssh2-streams@*":
version "0.1.12" version "0.1.12"
resolved "https://registry.yarnpkg.com/@types/ssh2-streams/-/ssh2-streams-0.1.12.tgz#e68795ba2bf01c76b93f9c9809e1f42f0eaaec5f" resolved "https://registry.yarnpkg.com/@types/ssh2-streams/-/ssh2-streams-0.1.12.tgz#e68795ba2bf01c76b93f9c9809e1f42f0eaaec5f"
@ -18639,16 +18644,7 @@ string-length@^4.0.1:
char-regex "^1.0.2" char-regex "^1.0.2"
strip-ansi "^6.0.0" strip-ansi "^6.0.0"
"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.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==
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" 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==
@ -18740,7 +18736,7 @@ stringify-object@^3.2.1:
is-obj "^1.0.1" is-obj "^1.0.1"
is-regexp "^1.0.0" is-regexp "^1.0.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" 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==
@ -18754,13 +18750,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
dependencies: dependencies:
ansi-regex "^4.1.0" 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: strip-ansi@^7.0.1:
version "7.0.1" version "7.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2"
@ -20508,7 +20497,7 @@ worker-farm@1.7.0:
dependencies: dependencies:
errno "~0.1.7" errno "~0.1.7"
"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" 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==
@ -20526,15 +20515,6 @@ wrap-ansi@^5.1.0:
string-width "^3.0.0" string-width "^3.0.0"
strip-ansi "^5.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: wrap-ansi@^8.1.0:
version "8.1.0" version "8.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"