From d99789c401a29f9b43d405ce13003c1355396386 Mon Sep 17 00:00:00 2001 From: Nilesh Sarupriya Date: Thu, 21 Nov 2024 13:55:02 +0530 Subject: [PATCH 01/10] chore: set datasourceId in executeActionDTO during execution (#37626) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description > Set the correct datasourceId to executeActionDTO when an action is being executed. Fixes https://github.com/appsmithorg/appsmith/issues/37627 ## Automation /ok-to-test tags="@tag.Sanity" ### :mag: Cypress test results > [!TIP] > 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉 > Workflow run: > Commit: 458b5c0d90fa138c57ed7f1dd491d985bfe0b5df > Cypress dashboard. > Tags: `@tag.Sanity` > Spec: >
Thu, 21 Nov 2024 08:22:41 UTC ## Communication Should the DevRel and Marketing teams inform users about this change? - [ ] Yes - [x] No ## Summary by CodeRabbit - **New Features** - Enhanced functionality to set the correct `datasourceId` based on the action's context, improving action execution accuracy. - **Refactor** - Improved code formatting for clarity without altering existing logic. Co-authored-by: Nilesh Sarupriya <20905988+nsarupr@users.noreply.github.com> --- .../ce/ActionExecutionSolutionCEImpl.java | 29 ++++++++++++------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/solutions/ce/ActionExecutionSolutionCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/solutions/ce/ActionExecutionSolutionCEImpl.java index 38c8664141d0..794d24af0b98 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/solutions/ce/ActionExecutionSolutionCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/solutions/ce/ActionExecutionSolutionCEImpl.java @@ -252,17 +252,24 @@ private Mono populateExecuteActionDTO(ExecuteActionDTO execute Mono systemInfoPopulatedExecuteActionDTOMono = actionExecutionSolutionHelper.populateExecuteActionDTOWithSystemInfo(executeActionDTO); - return systemInfoPopulatedExecuteActionDTOMono.flatMap( - populatedExecuteActionDTO -> Mono.zip(instanceIdMono, defaultTenantIdMono) - .map(tuple -> { - String instanceId = tuple.getT1(); - String tenantId = tuple.getT2(); - populatedExecuteActionDTO.setActionId(newAction.getId()); - populatedExecuteActionDTO.setWorkspaceId(newAction.getWorkspaceId()); - populatedExecuteActionDTO.setInstanceId(instanceId); - populatedExecuteActionDTO.setTenantId(tenantId); - return populatedExecuteActionDTO; - })); + return systemInfoPopulatedExecuteActionDTOMono.flatMap(populatedExecuteActionDTO -> Mono.zip( + instanceIdMono, defaultTenantIdMono) + .map(tuple -> { + String instanceId = tuple.getT1(); + String tenantId = tuple.getT2(); + populatedExecuteActionDTO.setActionId(newAction.getId()); + populatedExecuteActionDTO.setWorkspaceId(newAction.getWorkspaceId()); + if (TRUE.equals(executeActionDTO.getViewMode())) { + populatedExecuteActionDTO.setDatasourceId( + newAction.getPublishedAction().getDatasource().getId()); + } else { + populatedExecuteActionDTO.setDatasourceId( + newAction.getUnpublishedAction().getDatasource().getId()); + } + populatedExecuteActionDTO.setInstanceId(instanceId); + populatedExecuteActionDTO.setTenantId(tenantId); + return populatedExecuteActionDTO; + })); } /** From 2099fceffa441fb30a315612c90087cb43511e88 Mon Sep 17 00:00:00 2001 From: Rudraprasad Das Date: Thu, 21 Nov 2024 16:03:05 +0700 Subject: [PATCH 02/10] feat: git mod - package details and redux slice (#36989) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Introduces a new yarn package for git. Includes the yarn package files, redux slice and relevant redux actions Fixes #36808 Fixes #36809 Fixes #36810 This is not integrated into the monolith. So, this doesn't directly impact the product yet ## Automation /ok-to-test tags="@tag.Git" ### :mag: Cypress test results > [!TIP] > 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉 > Workflow run: > Commit: 02c38bff6be96f3572100f348f12c15ea94ae971 > Cypress dashboard. > Tags: `@tag.Git` > Spec: >
Wed, 23 Oct 2024 19:42:30 UTC ## Communication Should the DevRel and Marketing teams inform users about this change? - [ ] Yes - [ ] No ## Summary by CodeRabbit ## Release Notes - **New Features** - Introduced the `@appsmith/git` package for Git-related functionality. - Added a new `GitTest` component for testing purposes. - Implemented multiple actions for managing Git operations, including commit, connection, branch fetching, metadata fetching, status fetching, and pull actions. - Created a Redux slice for managing Git artifact state. - **Documentation** - Added TypeScript types and interfaces for better state management within the Git context. - Introduced ESLint configuration for consistent code quality across the package. These updates enhance the application's Git capabilities and improve state management, providing a more robust user experience. --- app/client/packages/git/.eslintrc.json | 3 + app/client/packages/git/package.json | 15 +++++ .../packages/git/src/actions/commitActions.ts | 26 +++++++ .../git/src/actions/connectActions.ts | 26 +++++++ .../git/src/actions/fetchBranchesActions.ts | 29 ++++++++ .../git/src/actions/fetchMetadataActions.ts | 29 ++++++++ .../git/src/actions/fetchStatusActions.ts | 29 ++++++++ .../helpers/createSingleArtifactAction.ts | 63 +++++++++++++++++ .../packages/git/src/actions/mountActions.ts | 28 ++++++++ .../packages/git/src/actions/pullActions.ts | 26 +++++++ .../git/src/components/connect/GitTest.tsx | 7 ++ .../git/src/store/gitArtifactSlice.ts | 67 +++++++++++++++++++ app/client/packages/git/src/store/index.ts | 0 app/client/packages/git/src/types.ts | 35 ++++++++++ app/client/packages/git/tsconfig.json | 4 ++ app/client/yarn.lock | 64 +++++++++++++++++- 16 files changed, 448 insertions(+), 3 deletions(-) create mode 100644 app/client/packages/git/.eslintrc.json create mode 100644 app/client/packages/git/package.json create mode 100644 app/client/packages/git/src/actions/commitActions.ts create mode 100644 app/client/packages/git/src/actions/connectActions.ts create mode 100644 app/client/packages/git/src/actions/fetchBranchesActions.ts create mode 100644 app/client/packages/git/src/actions/fetchMetadataActions.ts create mode 100644 app/client/packages/git/src/actions/fetchStatusActions.ts create mode 100644 app/client/packages/git/src/actions/helpers/createSingleArtifactAction.ts create mode 100644 app/client/packages/git/src/actions/mountActions.ts create mode 100644 app/client/packages/git/src/actions/pullActions.ts create mode 100644 app/client/packages/git/src/components/connect/GitTest.tsx create mode 100644 app/client/packages/git/src/store/gitArtifactSlice.ts create mode 100644 app/client/packages/git/src/store/index.ts create mode 100644 app/client/packages/git/src/types.ts create mode 100644 app/client/packages/git/tsconfig.json diff --git a/app/client/packages/git/.eslintrc.json b/app/client/packages/git/.eslintrc.json new file mode 100644 index 000000000000..b6652ce70c78 --- /dev/null +++ b/app/client/packages/git/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": ["../../.eslintrc.base.json"] +} diff --git a/app/client/packages/git/package.json b/app/client/packages/git/package.json new file mode 100644 index 000000000000..9bfcf578a72f --- /dev/null +++ b/app/client/packages/git/package.json @@ -0,0 +1,15 @@ +{ + "name": "@appsmith/git", + "description": "This package contains all the git related functionality for Appsmith UI", + "private": true, + "version": "1.0.0", + "main": "src/index.ts", + "scripts": { + "lint": "yarn g:lint", + "prettier": "yarn g:prettier", + "test:unit": "yarn g:jest --passWithNoTests" + }, + "dependencies": { + "@reduxjs/toolkit": "^2.3.0" + } +} diff --git a/app/client/packages/git/src/actions/commitActions.ts b/app/client/packages/git/src/actions/commitActions.ts new file mode 100644 index 000000000000..700866c8303e --- /dev/null +++ b/app/client/packages/git/src/actions/commitActions.ts @@ -0,0 +1,26 @@ +import { createSingleArtifactAction } from "./helpers/createSingleArtifactAction"; +import type { GitArtifactPayloadAction } from "../types"; + +export const commitInitAction = createSingleArtifactAction((state) => { + state.commit.loading = true; + state.commit.error = null; + + return state; +}); + +export const commitSuccessAction = createSingleArtifactAction((state) => { + state.commit.loading = false; + + return state; +}); + +export const commitErrorAction = createSingleArtifactAction( + (state, action: GitArtifactPayloadAction<{ error: string }>) => { + const { error } = action.payload; + + state.commit.loading = false; + state.commit.error = error; + + return state; + }, +); diff --git a/app/client/packages/git/src/actions/connectActions.ts b/app/client/packages/git/src/actions/connectActions.ts new file mode 100644 index 000000000000..6a306cbd034f --- /dev/null +++ b/app/client/packages/git/src/actions/connectActions.ts @@ -0,0 +1,26 @@ +import { createSingleArtifactAction } from "./helpers/createSingleArtifactAction"; +import type { GitArtifactPayloadAction } from "../types"; + +export const connectInitAction = createSingleArtifactAction((state) => { + state.connect.loading = true; + state.connect.error = null; + + return state; +}); + +export const connectSuccessAction = createSingleArtifactAction((state) => { + state.connect.loading = false; + + return state; +}); + +export const connectErrorAction = createSingleArtifactAction( + (state, action: GitArtifactPayloadAction<{ error: string }>) => { + const { error } = action.payload; + + state.connect.loading = false; + state.connect.error = error; + + return state; + }, +); diff --git a/app/client/packages/git/src/actions/fetchBranchesActions.ts b/app/client/packages/git/src/actions/fetchBranchesActions.ts new file mode 100644 index 000000000000..fc073348d55f --- /dev/null +++ b/app/client/packages/git/src/actions/fetchBranchesActions.ts @@ -0,0 +1,29 @@ +import type { GitArtifactPayloadAction, GitBranches } from "../types"; +import { createSingleArtifactAction } from "./helpers/createSingleArtifactAction"; + +export const fetchBranchesInitAction = createSingleArtifactAction((state) => { + state.branches.loading = true; + state.branches.error = null; + + return state; +}); + +export const fetchBranchesSuccessAction = createSingleArtifactAction( + (state, action: GitArtifactPayloadAction<{ branches: GitBranches }>) => { + state.branches.loading = false; + state.branches.value = action.payload.branches; + + return state; + }, +); + +export const fetchBranchesErrorAction = createSingleArtifactAction( + (state, action: GitArtifactPayloadAction<{ error: string }>) => { + const { error } = action.payload; + + state.branches.loading = false; + state.branches.error = error; + + return state; + }, +); diff --git a/app/client/packages/git/src/actions/fetchMetadataActions.ts b/app/client/packages/git/src/actions/fetchMetadataActions.ts new file mode 100644 index 000000000000..d7b46dd25549 --- /dev/null +++ b/app/client/packages/git/src/actions/fetchMetadataActions.ts @@ -0,0 +1,29 @@ +import type { GitArtifactPayloadAction, GitMetadata } from "../types"; +import { createSingleArtifactAction } from "./helpers/createSingleArtifactAction"; + +export const fetchMetadataInitAction = createSingleArtifactAction((state) => { + state.metadata.loading = true; + state.metadata.error = null; + + return state; +}); + +export const fetchMetadataSuccessAction = createSingleArtifactAction( + (state, action: GitArtifactPayloadAction<{ metadata: GitMetadata }>) => { + state.metadata.loading = false; + state.metadata.value = action.payload.metadata; + + return state; + }, +); + +export const fetchMetadataErrorAction = createSingleArtifactAction( + (state, action: GitArtifactPayloadAction<{ error: string }>) => { + const { error } = action.payload; + + state.metadata.loading = false; + state.metadata.error = error; + + return state; + }, +); diff --git a/app/client/packages/git/src/actions/fetchStatusActions.ts b/app/client/packages/git/src/actions/fetchStatusActions.ts new file mode 100644 index 000000000000..dcecbd91c008 --- /dev/null +++ b/app/client/packages/git/src/actions/fetchStatusActions.ts @@ -0,0 +1,29 @@ +import type { GitArtifactPayloadAction, GitStatus } from "../types"; +import { createSingleArtifactAction } from "./helpers/createSingleArtifactAction"; + +export const fetchStatusInitAction = createSingleArtifactAction((state) => { + state.status.loading = true; + state.status.error = null; + + return state; +}); + +export const fetchStatusSuccessAction = createSingleArtifactAction( + (state, action: GitArtifactPayloadAction<{ status: GitStatus }>) => { + state.status.loading = false; + state.status.value = action.payload.status; + + return state; + }, +); + +export const fetchStatusErrorAction = createSingleArtifactAction( + (state, action: GitArtifactPayloadAction<{ error: string }>) => { + const { error } = action.payload; + + state.status.loading = false; + state.status.error = error; + + return state; + }, +); diff --git a/app/client/packages/git/src/actions/helpers/createSingleArtifactAction.ts b/app/client/packages/git/src/actions/helpers/createSingleArtifactAction.ts new file mode 100644 index 000000000000..3ad93734c6fe --- /dev/null +++ b/app/client/packages/git/src/actions/helpers/createSingleArtifactAction.ts @@ -0,0 +1,63 @@ +import type { + GitArtifactPayloadAction, + GitArtifactReduxState, + GitSingleArtifactReduxState, +} from "../../types"; + +type SingleArtifactStateCb = ( + singleArtifactState: GitSingleArtifactReduxState, + action: GitArtifactPayloadAction, +) => GitSingleArtifactReduxState; + +export const gitSingleArtifactInitialState: GitSingleArtifactReduxState = { + metadata: { + value: null, + loading: false, + error: null, + }, + connect: { + loading: false, + error: null, + }, + branches: { + value: null, + loading: false, + error: null, + }, + status: { + value: null, + loading: false, + error: null, + }, + commit: { + loading: false, + error: null, + }, + pull: { + loading: false, + error: null, + }, +}; + +export const createSingleArtifactAction = ( + singleArtifactStateCb: SingleArtifactStateCb, +) => { + return ( + state: GitArtifactReduxState, + action: GitArtifactPayloadAction, + ) => { + const { artifactType, baseArtifactId } = action.payload; + + state[artifactType] ??= {}; + state[artifactType][baseArtifactId] ??= gitSingleArtifactInitialState; + + const singleArtifactState = state[artifactType][baseArtifactId]; + + state[artifactType][baseArtifactId] = singleArtifactStateCb( + singleArtifactState, + action, + ); + + return state; + }; +}; diff --git a/app/client/packages/git/src/actions/mountActions.ts b/app/client/packages/git/src/actions/mountActions.ts new file mode 100644 index 000000000000..a4ee3d372d08 --- /dev/null +++ b/app/client/packages/git/src/actions/mountActions.ts @@ -0,0 +1,28 @@ +import type { PayloadAction } from "@reduxjs/toolkit"; +import type { GitArtifactBasePayload, GitArtifactReduxState } from "../types"; +import { gitSingleArtifactInitialState } from "./helpers/createSingleArtifactAction"; + +// ! This might be removed later + +export const mountAction = ( + state: GitArtifactReduxState, + action: PayloadAction, +) => { + const { artifactType, baseArtifactId } = action.payload; + + state[artifactType] ??= {}; + state[artifactType][baseArtifactId] ??= gitSingleArtifactInitialState; + + return state; +}; + +export const unmountAction = ( + state: GitArtifactReduxState, + action: PayloadAction, +) => { + const { artifactType, baseArtifactId } = action.payload; + + delete state?.[artifactType]?.[baseArtifactId]; + + return state; +}; diff --git a/app/client/packages/git/src/actions/pullActions.ts b/app/client/packages/git/src/actions/pullActions.ts new file mode 100644 index 000000000000..44311e384071 --- /dev/null +++ b/app/client/packages/git/src/actions/pullActions.ts @@ -0,0 +1,26 @@ +import { createSingleArtifactAction } from "./helpers/createSingleArtifactAction"; +import type { GitArtifactPayloadAction } from "../types"; + +export const pullInitAction = createSingleArtifactAction((state) => { + state.pull.loading = true; + state.pull.error = null; + + return state; +}); + +export const pullSuccessAction = createSingleArtifactAction((state) => { + state.pull.loading = false; + + return state; +}); + +export const pullErrorAction = createSingleArtifactAction( + (state, action: GitArtifactPayloadAction<{ error: string }>) => { + const { error } = action.payload; + + state.pull.loading = false; + state.pull.error = error; + + return state; + }, +); diff --git a/app/client/packages/git/src/components/connect/GitTest.tsx b/app/client/packages/git/src/components/connect/GitTest.tsx new file mode 100644 index 000000000000..88e24b56e3e1 --- /dev/null +++ b/app/client/packages/git/src/components/connect/GitTest.tsx @@ -0,0 +1,7 @@ +import React from "react"; + +function GitTest() { + return
GitTest
; +} + +export default GitTest; diff --git a/app/client/packages/git/src/store/gitArtifactSlice.ts b/app/client/packages/git/src/store/gitArtifactSlice.ts new file mode 100644 index 000000000000..73b50f2c19e9 --- /dev/null +++ b/app/client/packages/git/src/store/gitArtifactSlice.ts @@ -0,0 +1,67 @@ +/* eslint-disable padding-line-between-statements */ +import { createSlice } from "@reduxjs/toolkit"; +import type { GitArtifactReduxState } from "../types"; +import { mountAction, unmountAction } from "../actions/mountActions"; +import { + connectErrorAction, + connectInitAction, + connectSuccessAction, +} from "../actions/connectActions"; +import { + fetchMetadataErrorAction, + fetchMetadataInitAction, + fetchMetadataSuccessAction, +} from "../actions/fetchMetadataActions"; +import { + fetchBranchesErrorAction, + fetchBranchesInitAction, + fetchBranchesSuccessAction, +} from "../actions/fetchBranchesActions"; +import { + fetchStatusErrorAction, + fetchStatusInitAction, + fetchStatusSuccessAction, +} from "../actions/fetchStatusActions"; +import { + commitErrorAction, + commitInitAction, + commitSuccessAction, +} from "../actions/commitActions"; +import { + pullErrorAction, + pullInitAction, + pullSuccessAction, +} from "../actions/pullActions"; + +const initialState: GitArtifactReduxState = {}; + +export const gitArtifactSlice = createSlice({ + name: "gitArtifact", + initialState, + reducers: { + mount: mountAction, + unmount: unmountAction, + connectInit: connectInitAction, + connectSuccess: connectSuccessAction, + connectError: connectErrorAction, + fetchMetadataInit: fetchMetadataInitAction, + fetchMetadataSuccess: fetchMetadataSuccessAction, + fetchMetadataError: fetchMetadataErrorAction, + fetchBranchesInit: fetchBranchesInitAction, + fetchBranchesSuccess: fetchBranchesSuccessAction, + fetchBranchesError: fetchBranchesErrorAction, + fetchStatusInit: fetchStatusInitAction, + fetchStatusSuccess: fetchStatusSuccessAction, + fetchStatusError: fetchStatusErrorAction, + commitInit: commitInitAction, + commitSuccess: commitSuccessAction, + commitError: commitErrorAction, + pullInit: pullInitAction, + pullSuccess: pullSuccessAction, + pullError: pullErrorAction, + }, +}); + +export const gitArtifactActions = gitArtifactSlice.actions; + +export default gitArtifactSlice.reducer; diff --git a/app/client/packages/git/src/store/index.ts b/app/client/packages/git/src/store/index.ts new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/app/client/packages/git/src/types.ts b/app/client/packages/git/src/types.ts new file mode 100644 index 000000000000..df64af331290 --- /dev/null +++ b/app/client/packages/git/src/types.ts @@ -0,0 +1,35 @@ +import type { PayloadAction } from "@reduxjs/toolkit"; + +// These will be updated when contracts are finalized +export type GitMetadata = Record; + +export type GitBranches = Record; + +export type GitStatus = Record; + +interface AsyncState { + value: T | null; + loading: boolean; + error: string | null; +} + +export interface GitSingleArtifactReduxState { + metadata: AsyncState; + connect: Omit; + branches: AsyncState; + status: AsyncState; + commit: Omit; + pull: Omit; +} + +export interface GitArtifactReduxState { + [key: string]: Record; +} + +export interface GitArtifactBasePayload { + artifactType: string; + baseArtifactId: string; +} + +export type GitArtifactPayloadAction> = + PayloadAction; diff --git a/app/client/packages/git/tsconfig.json b/app/client/packages/git/tsconfig.json new file mode 100644 index 000000000000..752e48c03ef5 --- /dev/null +++ b/app/client/packages/git/tsconfig.json @@ -0,0 +1,4 @@ +{ + "extends": "../../tsconfig.json", + "include": ["./src/**/*"] +} diff --git a/app/client/yarn.lock b/app/client/yarn.lock index 88c6bbf5d0db..5e70812a01c2 100644 --- a/app/client/yarn.lock +++ b/app/client/yarn.lock @@ -192,6 +192,14 @@ __metadata: languageName: unknown linkType: soft +"@appsmith/git@workspace:packages/git": + version: 0.0.0-use.local + resolution: "@appsmith/git@workspace:packages/git" + dependencies: + "@reduxjs/toolkit": ^2.3.0 + languageName: unknown + linkType: soft + "@appsmith/utils@workspace:^, @appsmith/utils@workspace:packages/utils": version: 0.0.0-use.local resolution: "@appsmith/utils@workspace:packages/utils" @@ -8011,6 +8019,26 @@ __metadata: languageName: node linkType: hard +"@reduxjs/toolkit@npm:^2.3.0": + version: 2.3.0 + resolution: "@reduxjs/toolkit@npm:2.3.0" + dependencies: + immer: ^10.0.3 + redux: ^5.0.1 + redux-thunk: ^3.1.0 + reselect: ^5.1.0 + peerDependencies: + react: ^16.9.0 || ^17.0.0 || ^18 + react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0 + peerDependenciesMeta: + react: + optional: true + react-redux: + optional: true + checksum: 1a0d85978f99a44f7ceabec8623f46cdd2a2dc25d809dfb0d5c9cd13e2aa12cf116cffe34a4ed949169804dc6125ef9cf68143225e9527f861b597ea701e8bb5 + languageName: node + linkType: hard + "@rollup/plugin-babel@npm:^5.2.0": version: 5.3.1 resolution: "@rollup/plugin-babel@npm:5.3.1" @@ -20770,10 +20798,17 @@ __metadata: languageName: node linkType: hard +"immer@npm:^10.0.3": + version: 10.1.1 + resolution: "immer@npm:10.1.1" + checksum: 07c67970b7d22aded73607193d84861bf786f07d47f7d7c98bb10016c7a88f6654ad78ae1e220b3c623695b133aabbf24f5eb8d9e8060cff11e89ccd81c9c10b + languageName: node + linkType: hard + "immer@npm:^9.0.6, immer@npm:^9.0.7": - version: 9.0.14 - resolution: "immer@npm:9.0.14" - checksum: 17f1365c06d653e672a4f609f08e7203e9ab4b4284818332d6ca9b3f3577a0e3c0066ca7933b636fbae560df79a4b3fde70ed717ce3c6e95c39bf3d5861d5be9 + version: 9.0.21 + resolution: "immer@npm:9.0.21" + checksum: 70e3c274165995352f6936695f0ef4723c52c92c92dd0e9afdfe008175af39fa28e76aafb3a2ca9d57d1fb8f796efc4dd1e1cc36f18d33fa5b74f3dfb0375432 languageName: node linkType: hard @@ -29630,6 +29665,15 @@ __metadata: languageName: node linkType: hard +"redux-thunk@npm:^3.1.0": + version: 3.1.0 + resolution: "redux-thunk@npm:3.1.0" + peerDependencies: + redux: ^5.0.0 + checksum: bea96f8233975aad4c9f24ca1ffd08ac7ec91eaefc26e7ba9935544dc55d7f09ba2aa726676dab53dc79d0c91e8071f9729cddfea927f4c41839757d2ade0f50 + languageName: node + linkType: hard + "redux@npm:^3.6.0 || ^4.0.0, redux@npm:^4.0.0, redux@npm:^4.0.1, redux@npm:^4.0.4, redux@npm:^4.0.5": version: 4.0.5 resolution: "redux@npm:4.0.5" @@ -29640,6 +29684,13 @@ __metadata: languageName: node linkType: hard +"redux@npm:^5.0.1": + version: 5.0.1 + resolution: "redux@npm:5.0.1" + checksum: e74affa9009dd5d994878b9a1ce30d6569d986117175056edb003de2651c05b10fe7819d6fa94aea1a94de9a82f252f986547f007a2fbeb35c317a2e5f5ecf2c + languageName: node + linkType: hard + "reflect.getprototypeof@npm:^1.0.4": version: 1.0.4 resolution: "reflect.getprototypeof@npm:1.0.4" @@ -29931,6 +29982,13 @@ __metadata: languageName: node linkType: hard +"reselect@npm:^5.1.0": + version: 5.1.1 + resolution: "reselect@npm:5.1.1" + checksum: 5d32d48be29071ddda21a775945c2210cf4ca3fccde1c4a0e1582ac3bf99c431c6c2330ef7ca34eae4c06feea617e7cb2c275c4b33ccf9a930836dfc98b49b13 + languageName: node + linkType: hard + "resize-observer-polyfill@npm:^1.5.0, resize-observer-polyfill@npm:^1.5.1": version: 1.5.1 resolution: "resize-observer-polyfill@npm:1.5.1" From d6fbaa5372ed507879f56bb2aa99179088e8f25d Mon Sep 17 00:00:00 2001 From: Shrikant Sharat Kandula Date: Thu, 21 Nov 2024 15:37:11 +0530 Subject: [PATCH 03/10] chore: Port `ctl` code to Typescript (#37606) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This PR converts the Javscript code of the `ctl` module, into Typescript, and in the process already fixing two small bugs that went undetected because... of lack of good type checking. The linting exceptions are still there and will be removed in the next PR. Didn't want to change anymore than necessary or Git will detect these changes as "new files" instead of as "renames". ## Automation /test sanity ### :mag: Cypress test results > [!TIP] > 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉 > Workflow run: > Commit: e156dacbc5cb513030052535c3d1f25ce1c7f222 > Cypress dashboard. > Tags: `@tag.Sanity` > Spec: >
Thu, 21 Nov 2024 08:45:48 UTC ## Communication Should the DevRel and Marketing teams inform users about this change? - [ ] Yes - [x] No ## Summary by CodeRabbit ## Release Notes - **New Features** - Introduced TypeScript support by updating entry points and adding type definitions for `nodemailer` and `readline-sync`. - Enhanced logging and error handling functionalities across various modules. - **Improvements** - Transitioned from CommonJS to ES module syntax for better compatibility and maintainability. - Improved clarity and structure in command handling and test files. - **Bug Fixes** - Corrected regex patterns and variable declarations in tests to enhance reliability. - **Chores** - Updated dependencies and refined module exports for better organization. --- app/client/packages/rts/build.js | 2 +- app/client/packages/rts/package.json | 2 + .../ctl/{backup.test.js => backup.test.ts} | 103 +++++++++--------- .../rts/src/ctl/{backup.js => backup.ts} | 66 +++++------ ...ck_replica_set.js => check_replica_set.ts} | 17 ++- app/client/packages/rts/src/ctl/constants.js | 29 ----- app/client/packages/rts/src/ctl/constants.ts | 18 +++ .../src/ctl/{export_db.js => export_db.ts} | 15 +-- .../src/ctl/{import_db.js => import_db.ts} | 19 ++-- .../rts/src/ctl/{index.js => index.ts} | 58 +++++----- .../rts/src/ctl/{logger.js => logger.ts} | 13 +-- .../rts/src/ctl/{mailer.js => mailer.ts} | 16 +-- ...go_shell_utils.js => mongo_shell_utils.ts} | 8 +- .../rts/src/ctl/{restore.js => restore.ts} | 23 ++-- .../src/ctl/{utils.test.js => utils.test.ts} | 5 +- .../rts/src/ctl/{utils.js => utils.ts} | 72 +++++------- .../rts/src/ctl/{version.js => version.ts} | 8 +- app/client/yarn.lock | 18 +++ 18 files changed, 213 insertions(+), 279 deletions(-) rename app/client/packages/rts/src/ctl/{backup.test.js => backup.test.ts} (76%) rename app/client/packages/rts/src/ctl/{backup.js => backup.ts} (85%) rename app/client/packages/rts/src/ctl/{check_replica_set.js => check_replica_set.ts} (83%) delete mode 100644 app/client/packages/rts/src/ctl/constants.js create mode 100644 app/client/packages/rts/src/ctl/constants.ts rename app/client/packages/rts/src/ctl/{export_db.js => export_db.ts} (84%) rename app/client/packages/rts/src/ctl/{import_db.js => import_db.ts} (84%) rename app/client/packages/rts/src/ctl/{index.js => index.ts} (55%) rename app/client/packages/rts/src/ctl/{logger.js => logger.ts} (75%) rename app/client/packages/rts/src/ctl/{mailer.js => mailer.ts} (90%) rename app/client/packages/rts/src/ctl/{mongo_shell_utils.js => mongo_shell_utils.ts} (87%) rename app/client/packages/rts/src/ctl/{restore.js => restore.ts} (96%) rename app/client/packages/rts/src/ctl/{utils.test.js => utils.test.ts} (94%) rename app/client/packages/rts/src/ctl/{utils.js => utils.ts} (78%) rename app/client/packages/rts/src/ctl/{version.js => version.ts} (79%) diff --git a/app/client/packages/rts/build.js b/app/client/packages/rts/build.js index 414147574c65..7743ae0d076f 100644 --- a/app/client/packages/rts/build.js +++ b/app/client/packages/rts/build.js @@ -44,7 +44,7 @@ const getWorkflowDependencies = () => { const bundle = async () => { return esbuild .build({ - entryPoints: ["src/server.ts", "src/ctl/index.js"], + entryPoints: ["src/server.ts", "src/ctl/index.ts"], bundle: true, sourcemap: true, platform: "node", diff --git a/app/client/packages/rts/package.json b/app/client/packages/rts/package.json index 28c80dda5bbe..8f27c36d6bef 100644 --- a/app/client/packages/rts/package.json +++ b/app/client/packages/rts/package.json @@ -36,6 +36,8 @@ "devDependencies": { "@types/express": "^4.17.14", "@types/jest": "^29.2.3", + "@types/nodemailer": "^6.4.17", + "@types/readline-sync": "^1.4.8", "jest": "^29.3.1", "supertest": "^6.3.3", "ts-jest": "29.1.0", diff --git a/app/client/packages/rts/src/ctl/backup.test.js b/app/client/packages/rts/src/ctl/backup.test.ts similarity index 76% rename from app/client/packages/rts/src/ctl/backup.test.js rename to app/client/packages/rts/src/ctl/backup.test.ts index ac5309d0e109..c6ff06dbee9c 100644 --- a/app/client/packages/rts/src/ctl/backup.test.js +++ b/app/client/packages/rts/src/ctl/backup.test.ts @@ -1,15 +1,20 @@ -const backup = require("./backup"); -const Constants = require("./constants"); -const os = require("os"); -const fsPromises = require("fs/promises"); -const utils = require("./utils"); -const readlineSync = require("readline-sync"); +jest.mock("./utils", () => ({ + ...jest.requireActual("./utils"), + execCommand: jest.fn().mockImplementation(async (a) => a.join(" ")), +})); + +import * as backup from "./backup"; +import * as Constants from "./constants"; +import os from "os"; +import fsPromises from "fs/promises"; +import * as utils from "./utils"; +import readlineSync from "readline-sync"; describe("Backup Tests", () => { test("Timestamp string in ISO format", () => { console.log(backup.getTimeStampInISO()); expect(backup.getTimeStampInISO()).toMatch( - /(\d{4})-(\d{2})-(\d{2})T(\d{2})\-(\d{2})\-(\d{2})\.(\d{3})Z/, + /(\d{4})-(\d{2})-(\d{2})T(\d{2})-(\d{2})-(\d{2})\.(\d{3})Z/, ); }); @@ -18,23 +23,23 @@ describe("Backup Tests", () => { res.toBeGreaterThan(1024 * 1024); }); - it("Checkx the constant is 2 GB", () => { - let size = 2 * 1024 * 1024 * 1024; + it("Check the constant is 2 GB", () => { + const size = 2 * 1024 * 1024 * 1024; expect(Constants.MIN_REQUIRED_DISK_SPACE_IN_BYTES).toBe(size); }); it("Should throw Error when the available size is below MIN_REQUIRED_DISK_SPACE_IN_BYTES", () => { - let size = Constants.MIN_REQUIRED_DISK_SPACE_IN_BYTES - 1; + const size = Constants.MIN_REQUIRED_DISK_SPACE_IN_BYTES - 1; expect(() => backup.checkAvailableBackupSpace(size)).toThrow(); }); - it("Should not hould throw Error when the available size is >= MIN_REQUIRED_DISK_SPACE_IN_BYTES", () => { + it("Should not should throw Error when the available size is >= MIN_REQUIRED_DISK_SPACE_IN_BYTES", () => { expect(() => { backup.checkAvailableBackupSpace( Constants.MIN_REQUIRED_DISK_SPACE_IN_BYTES, ); }).not.toThrow( - "Not enough space avaliable at /appsmith-stacks. Please ensure availability of atleast 5GB to backup successfully.", + "Not enough space available at /appsmith-stacks. Please ensure availability of at least 5GB to backup successfully.", ); }); @@ -46,19 +51,18 @@ describe("Backup Tests", () => { }); test("Test backup contents path generation", () => { - var root = "/rootDir"; - var timestamp = "0000-00-0T00-00-00.00Z"; + const root = "/rootDir"; + const timestamp = "0000-00-0T00-00-00.00Z"; expect(backup.getBackupContentsPath(root, timestamp)).toBe( "/rootDir/appsmith-backup-0000-00-0T00-00-00.00Z", ); }); - test("Test mongodump CMD generaton", async () => { - var dest = "/dest"; - var appsmithMongoURI = "mongodb://username:password@host/appsmith"; - var cmd = + test("Test mongodump CMD generation", async () => { + const dest = "/dest"; + const appsmithMongoURI = "mongodb://username:password@host/appsmith"; + const cmd = "mongodump --uri=mongodb://username:password@host/appsmith --archive=/dest/mongodb-data.gz --gzip"; - utils.execCommand = jest.fn().mockImplementation(async (a) => a.join(" ")); const res = await backup.executeMongoDumpCMD(dest, appsmithMongoURI); expect(res).toBe(cmd); console.log(res); @@ -77,10 +81,9 @@ describe("Backup Tests", () => { }); test("Test ln command generation", async () => { - var gitRoot = "/appsmith-stacks/git-storage"; - var dest = "/destdir"; - var cmd = "ln -s /appsmith-stacks/git-storage /destdir/git-storage"; - utils.execCommand = jest.fn().mockImplementation(async (a) => a.join(" ")); + const gitRoot = "/appsmith-stacks/git-storage"; + const dest = "/destdir"; + const cmd = "ln -s /appsmith-stacks/git-storage /destdir/git-storage"; const res = await backup.executeCopyCMD(gitRoot, dest); expect(res).toBe(cmd); console.log(res); @@ -127,8 +130,8 @@ describe("Backup Tests", () => { test("Cleanup Backups when limit is 4 and there are 5 files", async () => { const backupArchivesLimit = 4; fsPromises.rm = jest.fn().mockImplementation(async (a) => console.log(a)); - var backupFiles = ["file1", "file2", "file3", "file4", "file5"]; - var expectedBackupFiles = ["file2", "file3", "file4", "file5"]; + const backupFiles = ["file1", "file2", "file3", "file4", "file5"]; + const expectedBackupFiles = ["file2", "file3", "file4", "file5"]; const res = await backup.removeOldBackups(backupFiles, backupArchivesLimit); console.log(res); @@ -138,8 +141,8 @@ describe("Backup Tests", () => { test("Cleanup Backups when limit is 2 and there are 5 files", async () => { const backupArchivesLimit = 2; fsPromises.rm = jest.fn().mockImplementation(async (a) => console.log(a)); - var backupFiles = ["file1", "file2", "file3", "file4", "file5"]; - var expectedBackupFiles = ["file4", "file5"]; + const backupFiles = ["file1", "file2", "file3", "file4", "file5"]; + const expectedBackupFiles = ["file4", "file5"]; const res = await backup.removeOldBackups(backupFiles, backupArchivesLimit); console.log(res); @@ -149,8 +152,8 @@ describe("Backup Tests", () => { test("Cleanup Backups when limit is 4 and there are 4 files", async () => { const backupArchivesLimit = 4; fsPromises.rm = jest.fn().mockImplementation(async (a) => console.log(a)); - var backupFiles = ["file1", "file2", "file3", "file4"]; - var expectedBackupFiles = ["file1", "file2", "file3", "file4"]; + const backupFiles = ["file1", "file2", "file3", "file4"]; + const expectedBackupFiles = ["file1", "file2", "file3", "file4"]; const res = await backup.removeOldBackups(backupFiles, backupArchivesLimit); console.log(res); @@ -160,8 +163,8 @@ describe("Backup Tests", () => { test("Cleanup Backups when limit is 4 and there are 2 files", async () => { const backupArchivesLimit = 4; fsPromises.rm = jest.fn().mockImplementation(async (a) => console.log(a)); - var backupFiles = ["file1", "file2"]; - var expectedBackupFiles = ["file1", "file2"]; + const backupFiles = ["file1", "file2"]; + const expectedBackupFiles = ["file1", "file2"]; const res = await backup.removeOldBackups(backupFiles, backupArchivesLimit); console.log(res); @@ -171,8 +174,8 @@ describe("Backup Tests", () => { test("Cleanup Backups when limit is 2 and there is 1 file", async () => { const backupArchivesLimit = 4; fsPromises.rm = jest.fn().mockImplementation(async (a) => console.log(a)); - var backupFiles = ["file1"]; - var expectedBackupFiles = ["file1"]; + const backupFiles = ["file1"]; + const expectedBackupFiles = ["file1"]; const res = await backup.removeOldBackups(backupFiles, backupArchivesLimit); console.log(res); expect(res).toEqual(expectedBackupFiles); @@ -181,24 +184,22 @@ describe("Backup Tests", () => { test("Cleanup Backups when limit is 2 and there is no file", async () => { const backupArchivesLimit = 4; fsPromises.rm = jest.fn().mockImplementation(async (a) => console.log(a)); - var backupFiles = []; - var expectedBackupFiles = []; + const backupFiles = []; + const expectedBackupFiles = []; const res = await backup.removeOldBackups(backupFiles, backupArchivesLimit); console.log(res); expect(res).toEqual(expectedBackupFiles); }); - test("Test get encryption password from user prompt whene both passords are the same", async () => { + test("Test get encryption password from user prompt when both passwords are the same", async () => { const password = "password#4321"; - readlineSync.question = jest.fn().mockImplementation((a) => { - return password; - }); + readlineSync.question = jest.fn().mockImplementation(() => password); const password_res = backup.getEncryptionPasswordFromUser(); expect(password_res).toEqual(password); }); - test("Test get encryption password from user prompt when both passords are the different", async () => { + test("Test get encryption password from user prompt when both passwords are the different", async () => { const password = "password#4321"; readlineSync.question = jest.fn().mockImplementation((a) => { if (a == "Enter the above password again: ") { @@ -214,9 +215,6 @@ describe("Backup Tests", () => { test("Get encrypted archive path", async () => { const archivePath = "/rootDir/appsmith-backup-0000-00-0T00-00-00.00Z"; const encryptionPassword = "password#4321"; - utils.execCommand = jest - .fn() - .mockImplementation(async (a) => console.log(a)); const encArchivePath = await backup.encryptBackupArchive( archivePath, encryptionPassword, @@ -228,9 +226,6 @@ describe("Backup Tests", () => { }); test("Test backup encryption function", async () => { - utils.execCommand = jest - .fn() - .mockImplementation(async (a) => console.log(a)); const archivePath = "/rootDir/appsmith-backup-0000-00-0T00-00-00.00Z"; const encryptionPassword = "password#123"; const res = await backup.encryptBackupArchive( @@ -243,32 +238,32 @@ describe("Backup Tests", () => { }); test("Get DB name from Mongo URI 1", async () => { - var mongodb_uri = + const mongodb_uri = "mongodb+srv://admin:password@test.cluster.mongodb.net/my_db_name?retryWrites=true&minPoolSize=1&maxPoolSize=10&maxIdleTimeMS=900000&authSource=admin"; - var expectedDBName = "my_db_name"; + const expectedDBName = "my_db_name"; const dbName = utils.getDatabaseNameFromMongoURI(mongodb_uri); expect(dbName).toEqual(expectedDBName); }); test("Get DB name from Mongo URI 2", async () => { - var mongodb_uri = + const mongodb_uri = "mongodb+srv://admin:password@test.cluster.mongodb.net/test123?retryWrites=true&minPoolSize=1&maxPoolSize=10&maxIdleTimeMS=900000&authSource=admin"; - var expectedDBName = "test123"; + const expectedDBName = "test123"; const dbName = utils.getDatabaseNameFromMongoURI(mongodb_uri); expect(dbName).toEqual(expectedDBName); }); test("Get DB name from Mongo URI 3", async () => { - var mongodb_uri = + const mongodb_uri = "mongodb+srv://admin:password@test.cluster.mongodb.net/test123"; - var expectedDBName = "test123"; + const expectedDBName = "test123"; const dbName = utils.getDatabaseNameFromMongoURI(mongodb_uri); expect(dbName).toEqual(expectedDBName); }); test("Get DB name from Mongo URI 4", async () => { - var mongodb_uri = "mongodb://appsmith:pAssW0rd!@localhost:27017/appsmith"; - var expectedDBName = "appsmith"; + const mongodb_uri = "mongodb://appsmith:pAssW0rd!@localhost:27017/appsmith"; + const expectedDBName = "appsmith"; const dbName = utils.getDatabaseNameFromMongoURI(mongodb_uri); expect(dbName).toEqual(expectedDBName); }); diff --git a/app/client/packages/rts/src/ctl/backup.js b/app/client/packages/rts/src/ctl/backup.ts similarity index 85% rename from app/client/packages/rts/src/ctl/backup.js rename to app/client/packages/rts/src/ctl/backup.ts index a529019aa44b..a8eeaebe8e62 100644 --- a/app/client/packages/rts/src/ctl/backup.js +++ b/app/client/packages/rts/src/ctl/backup.ts @@ -1,16 +1,16 @@ -const fsPromises = require("fs/promises"); -const path = require("path"); -const os = require("os"); -const utils = require("./utils"); -const Constants = require("./constants"); -const logger = require("./logger"); -const mailer = require("./mailer"); -const tty = require("tty"); -const readlineSync = require("readline-sync"); +import fsPromises from "fs/promises"; +import path from "path"; +import os from "os"; +import * as utils from "./utils"; +import * as Constants from "./constants"; +import * as logger from "./logger"; +import * as mailer from "./mailer"; +import tty from "tty"; +import readlineSync from "readline-sync"; const command_args = process.argv.slice(3); -async function run() { +export async function run() { const timestamp = getTimeStampInISO(); let errorCode = 0; let backupRootPath, archivePath, encryptionPassword; @@ -116,7 +116,7 @@ async function run() { } } -async function encryptBackupArchive(archivePath, encryptionPassword) { +export async function encryptBackupArchive(archivePath, encryptionPassword) { const encryptedArchivePath = archivePath + ".enc"; await utils.execCommand([ "openssl", @@ -135,7 +135,7 @@ async function encryptBackupArchive(archivePath, encryptionPassword) { return encryptedArchivePath; } -function getEncryptionPasswordFromUser() { +export function getEncryptionPasswordFromUser() { for (const _ of [1, 2, 3]) { const encryptionPwd1 = readlineSync.question( "Enter a password to encrypt the backup archive: ", @@ -208,7 +208,7 @@ async function exportDockerEnvFile(destFolder, encryptArchive) { console.log("Exporting docker environment file done."); } -async function executeMongoDumpCMD(destFolder, appsmithMongoURI) { +export async function executeMongoDumpCMD(destFolder, appsmithMongoURI) { return await utils.execCommand([ "mongodump", `--uri=${appsmithMongoURI}`, @@ -238,7 +238,7 @@ async function createFinalArchive(destFolder, timestamp) { async function postBackupCleanup() { console.log("Starting the cleanup task after taking a backup."); - let backupArchivesLimit = getBackupArchiveLimit( + const backupArchivesLimit = getBackupArchiveLimit( process.env.APPSMITH_BACKUP_ARCHIVE_LIMIT, ); const backupFiles = await utils.listLocalBackupFiles(); @@ -248,7 +248,8 @@ async function postBackupCleanup() { } console.log("Cleanup task completed."); } -async function executeCopyCMD(srcFolder, destFolder) { + +export async function executeCopyCMD(srcFolder, destFolder) { return await utils.execCommand([ "ln", "-s", @@ -257,22 +258,22 @@ async function executeCopyCMD(srcFolder, destFolder) { ]); } -function getGitRoot(gitRoot) { +export function getGitRoot(gitRoot?) { if (gitRoot == null || gitRoot === "") { gitRoot = "/appsmith-stacks/git-storage"; } return gitRoot; } -function generateBackupRootPath() { +export function generateBackupRootPath() { return fsPromises.mkdtemp(path.join(os.tmpdir(), "appsmithctl-backup-")); } -function getBackupContentsPath(backupRootPath, timestamp) { +export function getBackupContentsPath(backupRootPath, timestamp) { return backupRootPath + "/appsmith-backup-" + timestamp; } -function removeSensitiveEnvData(content) { +export function removeSensitiveEnvData(content) { // Remove encryption and Mongodb data from docker.env const output_lines = []; content.split(/\r?\n/).forEach((line) => { @@ -287,13 +288,13 @@ function removeSensitiveEnvData(content) { return output_lines.join("\n"); } -function getBackupArchiveLimit(backupArchivesLimit) { +export function getBackupArchiveLimit(backupArchivesLimit?) { if (!backupArchivesLimit) backupArchivesLimit = Constants.APPSMITH_DEFAULT_BACKUP_ARCHIVE_LIMIT; return backupArchivesLimit; } -async function removeOldBackups(backupFiles, backupArchivesLimit) { +export async function removeOldBackups(backupFiles, backupArchivesLimit) { while (backupFiles.length > backupArchivesLimit) { const fileName = backupFiles.shift(); await fsPromises.rm(Constants.BACKUP_PATH + "/" + fileName); @@ -301,36 +302,19 @@ async function removeOldBackups(backupFiles, backupArchivesLimit) { return backupFiles; } -function getTimeStampInISO() { +export function getTimeStampInISO() { return new Date().toISOString().replace(/:/g, "-"); } -async function getAvailableBackupSpaceInBytes(path) { +export async function getAvailableBackupSpaceInBytes(path) { const stat = await fsPromises.statfs(path); return stat.bsize * stat.bfree; } -function checkAvailableBackupSpace(availSpaceInBytes) { +export function checkAvailableBackupSpace(availSpaceInBytes) { if (availSpaceInBytes < Constants.MIN_REQUIRED_DISK_SPACE_IN_BYTES) { throw new Error( "Not enough space available at /appsmith-stacks. Please ensure availability of at least 2GB to backup successfully.", ); } } - -module.exports = { - run, - getTimeStampInISO, - getAvailableBackupSpaceInBytes, - checkAvailableBackupSpace, - generateBackupRootPath, - getBackupContentsPath, - executeMongoDumpCMD, - getGitRoot, - executeCopyCMD, - removeSensitiveEnvData, - getBackupArchiveLimit, - removeOldBackups, - getEncryptionPasswordFromUser, - encryptBackupArchive, -}; diff --git a/app/client/packages/rts/src/ctl/check_replica_set.js b/app/client/packages/rts/src/ctl/check_replica_set.ts similarity index 83% rename from app/client/packages/rts/src/ctl/check_replica_set.js rename to app/client/packages/rts/src/ctl/check_replica_set.ts index 0564107094cd..d9b00594357c 100644 --- a/app/client/packages/rts/src/ctl/check_replica_set.js +++ b/app/client/packages/rts/src/ctl/check_replica_set.ts @@ -1,13 +1,14 @@ -const { MongoClient, MongoServerError } = require("mongodb"); -const { preprocessMongoDBURI } = require("./utils"); +import { MongoClient, MongoServerError } from "mongodb"; -async function exec() { +import { preprocessMongoDBURI } from "./utils"; + +export async function exec() { const client = new MongoClient( preprocessMongoDBURI(process.env.APPSMITH_DB_URL), { useNewUrlParser: true, useUnifiedTopology: true, - }, + } as any, ); let isReplicaSetEnabled = false; @@ -23,9 +24,9 @@ async function exec() { process.exit(isReplicaSetEnabled ? 0 : 1); } -async function checkReplicaSet(client) { +async function checkReplicaSet(client: MongoClient) { await client.connect(); - return await new Promise((resolve) => { + return await new Promise((resolve) => { try { const changeStream = client .db() @@ -56,7 +57,3 @@ async function checkReplicaSet(client) { } }); } - -module.exports = { - exec, -}; diff --git a/app/client/packages/rts/src/ctl/constants.js b/app/client/packages/rts/src/ctl/constants.js deleted file mode 100644 index 6c0f920cb569..000000000000 --- a/app/client/packages/rts/src/ctl/constants.js +++ /dev/null @@ -1,29 +0,0 @@ -const BACKUP_PATH = "/appsmith-stacks/data/backup"; - -const RESTORE_PATH = "/appsmith-stacks/data/restore"; - -const DUMP_FILE_NAME = "appsmith-data.archive"; - -const APPSMITHCTL_LOG_PATH = "/appsmith-stacks/logs/appsmithctl"; - -const LAST_ERROR_MAIL_TS = "/appsmith-stacks/data/backup/last-error-mail-ts"; - -const ENV_PATH = "/appsmith-stacks/configuration/docker.env"; - -const MIN_REQUIRED_DISK_SPACE_IN_BYTES = 2_147_483_648; // 2GB - -const DURATION_BETWEEN_BACKUP_ERROR_MAILS_IN_MILLI_SEC = 21_600_000; // 6 hrs - -const APPSMITH_DEFAULT_BACKUP_ARCHIVE_LIMIT = 4; // 4 backup archives - -module.exports = { - BACKUP_PATH, - RESTORE_PATH, - DUMP_FILE_NAME, - LAST_ERROR_MAIL_TS, - APPSMITHCTL_LOG_PATH, - MIN_REQUIRED_DISK_SPACE_IN_BYTES, - DURATION_BETWEEN_BACKUP_ERROR_MAILS_IN_MILLI_SEC, - APPSMITH_DEFAULT_BACKUP_ARCHIVE_LIMIT, - ENV_PATH, -}; diff --git a/app/client/packages/rts/src/ctl/constants.ts b/app/client/packages/rts/src/ctl/constants.ts new file mode 100644 index 000000000000..f47189f5089f --- /dev/null +++ b/app/client/packages/rts/src/ctl/constants.ts @@ -0,0 +1,18 @@ +export const BACKUP_PATH = "/appsmith-stacks/data/backup"; + +export const RESTORE_PATH = "/appsmith-stacks/data/restore"; + +export const DUMP_FILE_NAME = "appsmith-data.archive"; + +export const APPSMITHCTL_LOG_PATH = "/appsmith-stacks/logs/appsmithctl"; + +export const LAST_ERROR_MAIL_TS = + "/appsmith-stacks/data/backup/last-error-mail-ts"; + +export const ENV_PATH = "/appsmith-stacks/configuration/docker.env"; + +export const MIN_REQUIRED_DISK_SPACE_IN_BYTES = 2_147_483_648; // 2GB + +export const DURATION_BETWEEN_BACKUP_ERROR_MAILS_IN_MILLI_SEC = 21_600_000; // 6 hrs + +export const APPSMITH_DEFAULT_BACKUP_ARCHIVE_LIMIT = 4; // 4 backup archives diff --git a/app/client/packages/rts/src/ctl/export_db.js b/app/client/packages/rts/src/ctl/export_db.ts similarity index 84% rename from app/client/packages/rts/src/ctl/export_db.js rename to app/client/packages/rts/src/ctl/export_db.ts index 6518f7074c78..844bd43974e6 100644 --- a/app/client/packages/rts/src/ctl/export_db.js +++ b/app/client/packages/rts/src/ctl/export_db.ts @@ -1,8 +1,8 @@ -const fsPromises = require("fs/promises"); -const Constants = require("./constants"); -const utils = require("./utils"); +import fsPromises from "fs/promises"; +import * as Constants from "./constants"; +import * as utils from "./utils"; -async function exportDatabase() { +export async function exportDatabase() { console.log("export_database ...."); const dbUrl = utils.getDburl(); await fsPromises.mkdir(Constants.BACKUP_PATH, { recursive: true }); @@ -15,7 +15,7 @@ async function exportDatabase() { console.log("export_database done"); } -async function run() { +export async function run() { let errorCode = 0; await utils.ensureSupervisorIsRunning(); @@ -42,8 +42,3 @@ async function run() { process.exit(errorCode); } } - -module.exports = { - run, - exportDatabase, -}; diff --git a/app/client/packages/rts/src/ctl/import_db.js b/app/client/packages/rts/src/ctl/import_db.ts similarity index 84% rename from app/client/packages/rts/src/ctl/import_db.js rename to app/client/packages/rts/src/ctl/import_db.ts index c7c40f903730..d00f16d1885c 100644 --- a/app/client/packages/rts/src/ctl/import_db.js +++ b/app/client/packages/rts/src/ctl/import_db.ts @@ -1,7 +1,7 @@ -const readlineSync = require("readline-sync"); -const process = require("process"); -const Constants = require("./constants"); -const utils = require("./utils"); +import readlineSync from "readline-sync"; +import process from "process"; +import * as Constants from "./constants"; +import * as utils from "./utils"; async function importDatabase() { console.log("Importing the database"); @@ -21,7 +21,7 @@ async function importDatabase() { } // Main application workflow -async function run(forceOption) { +export async function run(forceOption) { let errorCode = 0; await utils.ensureSupervisorIsRunning(); @@ -29,8 +29,9 @@ async function run(forceOption) { try { console.log("stop backend & rts application before import database"); await utils.stop(["backend", "rts"]); + let shellCmdResult: string; try { - const shellCmdResult = await utils.execCommandReturningOutput([ + shellCmdResult = await utils.execCommandReturningOutput([ "mongo", process.env.APPSMITH_DB_URL, "--quiet", @@ -41,7 +42,7 @@ async function run(forceOption) { console.error("Failed to execute mongo command:", error); throw error; } - const collectionsLen = parseInt(shellCmdResult.stdout.toString().trimEnd()); + const collectionsLen = parseInt(shellCmdResult.trimEnd()); if (collectionsLen > 0) { if (forceOption) { await importDatabase(); @@ -79,7 +80,3 @@ async function run(forceOption) { process.exit(errorCode); } } - -module.exports = { - run, -}; diff --git a/app/client/packages/rts/src/ctl/index.js b/app/client/packages/rts/src/ctl/index.ts similarity index 55% rename from app/client/packages/rts/src/ctl/index.js rename to app/client/packages/rts/src/ctl/index.ts index a307792d1cd1..0cec2e5924bb 100755 --- a/app/client/packages/rts/src/ctl/index.js +++ b/app/client/packages/rts/src/ctl/index.ts @@ -1,12 +1,15 @@ #!/usr/bin/env node -const process = require("process"); -const utils = require("./utils"); -const export_db = require("./export_db.js"); -const import_db = require("./import_db.js"); -const check_replica_set = require("./check_replica_set.js"); -const version = require("./version.js"); -const mongo_shell_utils = require("./mongo_shell_utils.js"); +import process from "process"; +import { showHelp } from "./utils"; +import * as export_db from "./export_db"; +import * as import_db from "./import_db"; +import * as backup from "./backup"; +import * as restore from "./restore"; +import * as check_replica_set from "./check_replica_set"; +import * as version from "./version"; +import * as mongo_shell_utils from "./mongo_shell_utils"; +import { config } from "dotenv"; const APPLICATION_CONFIG_PATH = "/appsmith-stacks/configuration/docker.env"; @@ -17,7 +20,7 @@ if (!process.env.APPSMITH_DB_URL) { } // Loading latest application configuration -require("dotenv").config({ path: APPLICATION_CONFIG_PATH }); +config({ path: APPLICATION_CONFIG_PATH }); // AGAIN: Check if APPSMITH_DB_URL is set, if not set, fall back to APPSMITH_MONGODB_URI if (!process.env.APPSMITH_DB_URL) { @@ -31,10 +34,7 @@ if (["export-db", "export_db", "ex"].includes(command)) { console.log("Exporting database"); export_db.run(); console.log("Export database done"); - return; -} - -if (["import-db", "import_db", "im"].includes(command)) { +} else if (["import-db", "import_db", "im"].includes(command)) { console.log("Importing database"); // Get Force option flag to run import DB immediately const forceOption = process.argv[3] === "-f"; @@ -45,26 +45,20 @@ if (["import-db", "import_db", "im"].includes(command)) { console.error("Failed to import database:", error.message); process.exit(1); } - return; -} - -if (["check-replica-set", "check_replica_set", "crs"].includes(command)) { +} else if ( + ["check-replica-set", "check_replica_set", "crs"].includes(command) +) { check_replica_set.exec(); - return; -} - -if (["backup", "restore"].includes(command)) { - require(`./${command}.js`).run(process.argv.slice(3)); - return; -} - -if (["appsmith-version", "appsmith_version", "version"].includes(command)) { +} else if (["backup"].includes(command)) { + backup.run(); +} else if (["restore"].includes(command)) { + restore.run(); +} else if ( + ["appsmith-version", "appsmith_version", "version"].includes(command) +) { version.exec(); - return; +} else if (["mongo-eval", "mongo_eval", "mongoEval"].includes(command)) { + mongo_shell_utils.exec(); +} else { + showHelp(); } -if (["mongo-eval", "mongo_eval", "mongoEval"].includes(command)) { - mongo_shell_utils.exec(process.argv.slice(3)); - return; -} - -utils.showHelp(); diff --git a/app/client/packages/rts/src/ctl/logger.js b/app/client/packages/rts/src/ctl/logger.ts similarity index 75% rename from app/client/packages/rts/src/ctl/logger.js rename to app/client/packages/rts/src/ctl/logger.ts index 6ce5d89ce0b2..742fb6ea6262 100644 --- a/app/client/packages/rts/src/ctl/logger.js +++ b/app/client/packages/rts/src/ctl/logger.ts @@ -1,7 +1,7 @@ -const fsPromises = require("fs/promises"); -const Constants = require("./constants"); +import fsPromises from "fs/promises"; +import * as Constants from "./constants"; -async function backup_error(err) { +export async function backup_error(err) { console.error(err); try { await fsPromises.access(Constants.APPSMITHCTL_LOG_PATH); @@ -14,7 +14,7 @@ async function backup_error(err) { ); } -async function backup_info(msg) { +export async function backup_info(msg) { console.log(msg); try { await fsPromises.access(Constants.APPSMITHCTL_LOG_PATH); @@ -26,8 +26,3 @@ async function backup_info(msg) { new Date().toISOString() + " [ INFO ] " + msg + "\n", ); } - -module.exports = { - backup_error, - backup_info, -}; diff --git a/app/client/packages/rts/src/ctl/mailer.js b/app/client/packages/rts/src/ctl/mailer.ts similarity index 90% rename from app/client/packages/rts/src/ctl/mailer.js rename to app/client/packages/rts/src/ctl/mailer.ts index a794cf6a0869..44fde47d9edb 100644 --- a/app/client/packages/rts/src/ctl/mailer.js +++ b/app/client/packages/rts/src/ctl/mailer.ts @@ -1,7 +1,7 @@ -const nodemailer = require("nodemailer"); -const Constants = require("./constants"); -const utils = require("./utils"); -const logger = require("./logger"); +import nodemailer from "nodemailer"; +import * as Constants from "./constants"; +import * as utils from "./utils"; +import * as logger from "./logger"; const mailEnabled = process.env.APPSMITH_MAIL_ENABLED; const mailFrom = process.env.APPSMITH_MAIL_FROM; @@ -11,7 +11,7 @@ const mailUser = process.env.APPSMITH_MAIL_USERNAME; const mailPass = process.env.APPSMITH_MAIL_PASSWORD; const mailTo = process.env.APPSMITH_ADMIN_EMAILS; -async function sendBackupErrorToAdmins(err, backupTimestamp) { +export async function sendBackupErrorToAdmins(err, backupTimestamp) { console.log("Sending Error mail to admins."); try { if ( @@ -77,7 +77,7 @@ async function sendBackupErrorToAdmins(err, backupTimestamp) { user: mailUser, pass: mailPass, }, - }); + } as any); await transporter.sendMail({ from: mailFrom, @@ -90,7 +90,3 @@ async function sendBackupErrorToAdmins(err, backupTimestamp) { await logger.backup_error(err.stack); } } - -module.exports = { - sendBackupErrorToAdmins, -}; diff --git a/app/client/packages/rts/src/ctl/mongo_shell_utils.js b/app/client/packages/rts/src/ctl/mongo_shell_utils.ts similarity index 87% rename from app/client/packages/rts/src/ctl/mongo_shell_utils.js rename to app/client/packages/rts/src/ctl/mongo_shell_utils.ts index c2b48a3d9a11..b6c44cb2fff5 100644 --- a/app/client/packages/rts/src/ctl/mongo_shell_utils.js +++ b/app/client/packages/rts/src/ctl/mongo_shell_utils.ts @@ -1,8 +1,8 @@ -const utils = require("./utils"); +import * as utils from "./utils"; const command_args = process.argv.slice(3); -async function exec() { +export async function exec() { let errorCode = 0; try { await execMongoEval(command_args[0], process.env.APPSMITH_DB_URL); @@ -25,7 +25,3 @@ async function execMongoEval(queryExpression, appsmithMongoURI) { `--eval=${queryExpression}`, ]); } - -module.exports = { - exec, -}; diff --git a/app/client/packages/rts/src/ctl/restore.js b/app/client/packages/rts/src/ctl/restore.ts similarity index 96% rename from app/client/packages/rts/src/ctl/restore.js rename to app/client/packages/rts/src/ctl/restore.ts index 550386245fb4..fb2f27972c09 100644 --- a/app/client/packages/rts/src/ctl/restore.js +++ b/app/client/packages/rts/src/ctl/restore.ts @@ -1,12 +1,11 @@ -const fsPromises = require("fs/promises"); -const path = require("path"); -const os = require("os"); -const readlineSync = require("readline-sync"); +import fsPromises from "fs/promises"; +import path from "path"; +import os from "os"; +import readlineSync from "readline-sync"; +import * as utils from "./utils"; +import * as Constants from "./constants"; -const utils = require("./utils"); -const Constants = require("./constants"); const command_args = process.argv.slice(3); -const { getCurrentAppsmithVersion } = require("./utils"); async function getBackupFileName() { const backupFiles = await utils.listLocalBackupFiles(); @@ -44,7 +43,7 @@ async function getBackupFileName() { backupFileIndex >= 0 && backupFileIndex < backupFiles.length ) { - return backupFiles[parseInt(backupFileIndex, 10)]; + return backupFiles[backupFileIndex]; } else { console.log( "Invalid input, please try the command again with a valid option", @@ -221,7 +220,7 @@ async function restoreGitStorageArchive(restoreContentsPath, backupName) { } async function checkRestoreVersionCompatability(restoreContentsPath) { - const currentVersion = await getCurrentAppsmithVersion(); + const currentVersion = await utils.getCurrentAppsmithVersion(); const manifest_data = await fsPromises.readFile( restoreContentsPath + "/manifest.json", { encoding: "utf8" }, @@ -280,7 +279,7 @@ async function getBackupDatabaseName(restoreContentsPath) { return db_name; } -async function run() { +export async function run() { let errorCode = 0; let cleanupArchive = false; let overwriteEncryptionKeys = true; @@ -354,7 +353,3 @@ async function run() { function isArchiveEncrypted(backupFilePath) { return backupFilePath.endsWith(".enc"); } - -module.exports = { - run, -}; diff --git a/app/client/packages/rts/src/ctl/utils.test.js b/app/client/packages/rts/src/ctl/utils.test.ts similarity index 94% rename from app/client/packages/rts/src/ctl/utils.test.js rename to app/client/packages/rts/src/ctl/utils.test.ts index d2d67e31f369..fce3dd9cf388 100644 --- a/app/client/packages/rts/src/ctl/utils.test.js +++ b/app/client/packages/rts/src/ctl/utils.test.ts @@ -1,5 +1,6 @@ -const { describe, test, expect } = require("@jest/globals"); -const utils = require("./utils"); +import { describe, expect, test } from "@jest/globals"; + +import * as utils from "./utils"; describe("execCommandReturningOutput", () => { test("Output of echo", async () => { diff --git a/app/client/packages/rts/src/ctl/utils.js b/app/client/packages/rts/src/ctl/utils.ts similarity index 78% rename from app/client/packages/rts/src/ctl/utils.js rename to app/client/packages/rts/src/ctl/utils.ts index 337d2472fdb2..a386eaf1a626 100644 --- a/app/client/packages/rts/src/ctl/utils.js +++ b/app/client/packages/rts/src/ctl/utils.ts @@ -1,10 +1,10 @@ -const fsPromises = require("fs/promises"); -const Constants = require("./constants"); -const childProcess = require("child_process"); -const fs = require("node:fs"); -const { ConnectionString } = require("mongodb-connection-string-url"); +import fsPromises from "fs/promises"; +import * as Constants from "./constants"; +import childProcess from "child_process"; +import fs from "node:fs"; +import { ConnectionString } from "mongodb-connection-string-url"; -function showHelp() { +export function showHelp() { console.log( "\nUsage: appsmith to interact with appsmith utils tool", ); @@ -17,7 +17,7 @@ function showHelp() { console.log("\t--help\t\t\t" + "Show help."); } -async function ensureSupervisorIsRunning() { +export async function ensureSupervisorIsRunning() { try { await execCommandSilent(["/usr/bin/supervisorctl"]); } catch (e) { @@ -26,26 +26,26 @@ async function ensureSupervisorIsRunning() { } } -async function stop(apps) { +export async function stop(apps) { console.log("Stopping", apps); await execCommand(["/usr/bin/supervisorctl", "stop", ...apps]); console.log("Stopped", apps); } -async function start(apps) { +export async function start(apps) { console.log("Starting", apps); await execCommand(["/usr/bin/supervisorctl", "start", ...apps]); console.log("Started", apps); } -function getDburl() { +export function getDburl() { let dbUrl = ""; try { - let env_array = fs + const env_array = fs .readFileSync(Constants.ENV_PATH, "utf8") .toString() .split("\n"); - for (let i in env_array) { + for (const i in env_array) { if ( env_array[i].startsWith("APPSMITH_MONGODB_URI") || env_array[i].startsWith("APPSMITH_DB_URL") @@ -57,7 +57,7 @@ function getDburl() { } catch (err) { console.error("Error reading the environment file:", err); } - let dbEnvUrl = + const dbEnvUrl = process.env.APPSMITH_DB_URL || process.env.APPSMITH_MONGO_DB_URI; // Make sure dbEnvUrl takes precedence over dbUrl if (dbEnvUrl && dbEnvUrl !== "undefined") { @@ -66,8 +66,8 @@ function getDburl() { return dbUrl; } -function execCommand(cmd, options) { - return new Promise((resolve, reject) => { +export function execCommand(cmd: string[], options?) { + return new Promise((resolve, reject) => { let isPromiseDone = false; const p = childProcess.spawn(cmd[0], cmd.slice(1), { @@ -98,8 +98,8 @@ function execCommand(cmd, options) { }); } -function execCommandReturningOutput(cmd, options) { - return new Promise((resolve, reject) => { +export function execCommandReturningOutput(cmd, options?) { + return new Promise((resolve, reject) => { const p = childProcess.spawn(cmd[0], cmd.slice(1), options); p.stdin.end(); @@ -132,13 +132,13 @@ function execCommandReturningOutput(cmd, options) { }); } -async function listLocalBackupFiles() { +export async function listLocalBackupFiles() { // Ascending order const backupFiles = []; await fsPromises .readdir(Constants.BACKUP_PATH) .then((filenames) => { - for (let filename of filenames) { + for (const filename of filenames) { if (filename.match(/^appsmith-backup-.*\.tar\.gz(\.enc)?$/)) { backupFiles.push(filename); } @@ -150,28 +150,28 @@ async function listLocalBackupFiles() { return backupFiles; } -async function updateLastBackupErrorMailSentInMilliSec(ts) { +export async function updateLastBackupErrorMailSentInMilliSec(ts) { await fsPromises.mkdir(Constants.BACKUP_PATH, { recursive: true }); await fsPromises.writeFile(Constants.LAST_ERROR_MAIL_TS, ts.toString()); } -async function getLastBackupErrorMailSentInMilliSec() { +export async function getLastBackupErrorMailSentInMilliSec() { try { - const ts = await fsPromises.readFile(Constants.LAST_ERROR_MAIL_TS); + const ts = await fsPromises.readFile(Constants.LAST_ERROR_MAIL_TS, "utf8"); return parseInt(ts, 10); } catch (error) { return 0; } } -async function getCurrentAppsmithVersion() { +export async function getCurrentAppsmithVersion() { return ( JSON.parse(await fsPromises.readFile("/opt/appsmith/info.json", "utf8")) .version ?? "" ); } -function preprocessMongoDBURI(uri /* string */) { +export function preprocessMongoDBURI(uri /* string */) { // Partially taken from // If we don't add the `directConnection` parameter for non-SRV URIs, we'll see the problem at . const cs = new ConnectionString(uri); @@ -202,8 +202,9 @@ function preprocessMongoDBURI(uri /* string */) { return cs.toString(); } -function execCommandSilent(cmd, options) { - return new Promise((resolve, reject) => { + +export function execCommandSilent(cmd, options?) { + return new Promise((resolve, reject) => { let isPromiseDone = false; const p = childProcess.spawn(cmd[0], cmd.slice(1), { @@ -233,24 +234,7 @@ function execCommandSilent(cmd, options) { }); } -function getDatabaseNameFromMongoURI(uri) { +export function getDatabaseNameFromMongoURI(uri) { const uriParts = uri.split("/"); return uriParts[uriParts.length - 1].split("?")[0]; } - -module.exports = { - showHelp, - ensureSupervisorIsRunning, - start, - stop, - execCommand, - execCommandReturningOutput, - listLocalBackupFiles, - updateLastBackupErrorMailSentInMilliSec, - getLastBackupErrorMailSentInMilliSec, - getCurrentAppsmithVersion, - preprocessMongoDBURI, - execCommandSilent, - getDatabaseNameFromMongoURI, - getDburl, -}; diff --git a/app/client/packages/rts/src/ctl/version.js b/app/client/packages/rts/src/ctl/version.ts similarity index 79% rename from app/client/packages/rts/src/ctl/version.js rename to app/client/packages/rts/src/ctl/version.ts index 144af3282346..79d34be03cbc 100644 --- a/app/client/packages/rts/src/ctl/version.js +++ b/app/client/packages/rts/src/ctl/version.ts @@ -1,6 +1,6 @@ -const utils = require("./utils"); +import * as utils from "./utils"; -async function exec() { +export async function exec() { let version = null; try { version = await utils.getCurrentAppsmithVersion(); @@ -15,7 +15,3 @@ async function exec() { process.exit(1); } } - -module.exports = { - exec, -}; diff --git a/app/client/yarn.lock b/app/client/yarn.lock index 5e70812a01c2..91270d7a599b 100644 --- a/app/client/yarn.lock +++ b/app/client/yarn.lock @@ -10855,6 +10855,15 @@ __metadata: languageName: node linkType: hard +"@types/nodemailer@npm:^6.4.17": + version: 6.4.17 + resolution: "@types/nodemailer@npm:6.4.17" + dependencies: + "@types/node": "*" + checksum: 498b702575111494a42cf9cdd3d399f0308c3b3b0244e7f53008924327955a16b39ba0bf99a5ccf17af9fd2bc50a61a76ae7e8a75498a426ea2f828a05202eab + languageName: node + linkType: hard + "@types/normalize-package-data@npm:^2.4.0": version: 2.4.1 resolution: "@types/normalize-package-data@npm:2.4.1" @@ -11102,6 +11111,13 @@ __metadata: languageName: node linkType: hard +"@types/readline-sync@npm:^1.4.8": + version: 1.4.8 + resolution: "@types/readline-sync@npm:1.4.8" + checksum: 9d69fe944d6a26fb1f6a08d205cb9f6107379570ad0b2081df613ccc7414caa026be9307343afcdd3c93b16939ce2e4a76187c33082301a5c7a2bd5d4a7759ee + languageName: node + linkType: hard + "@types/redux-form@npm:^8.1.9": version: 8.3.0 resolution: "@types/redux-form@npm:8.3.0" @@ -12768,6 +12784,8 @@ __metadata: "@shared/ast": "workspace:^" "@types/express": ^4.17.14 "@types/jest": ^29.2.3 + "@types/nodemailer": ^6.4.17 + "@types/readline-sync": ^1.4.8 axios: ^1.7.4 dotenv: 10.0.0 express: ^4.20.0 From cc83b1667bc51d1d33b81483dfeb7c8f80f9bdd9 Mon Sep 17 00:00:00 2001 From: Ayush Pahwa Date: Thu, 21 Nov 2024 18:35:02 +0800 Subject: [PATCH 04/10] chore: update jest version to 29 (#37587) --- app/client/jest.config.js | 34 +- app/client/package.json | 8 +- .../packages/ast/src/actionCreator/index.ts | 21 +- app/client/packages/ast/src/jsObject/index.ts | 2 +- .../IconSelectControl.test.tsx.snap | 4 +- app/client/test/setup.ts | 11 +- app/client/yarn.lock | 308 ++++++++++++++---- 7 files changed, 290 insertions(+), 98 deletions(-) diff --git a/app/client/jest.config.js b/app/client/jest.config.js index 47dc492327d8..06e46734fe3e 100644 --- a/app/client/jest.config.js +++ b/app/client/jest.config.js @@ -12,7 +12,23 @@ module.exports = { ], roots: ["/src"], transform: { - "^.+\\.(png|js|ts|tsx)$": "ts-jest", + "^.+\\.(png|js|ts|tsx)$": [ + "ts-jest", + { + isolatedModules: true, + diagnostics: { + ignoreCodes: [1343], + }, + astTransformers: { + before: [ + { + path: "node_modules/ts-jest-mock-import-meta", + options: { metaObjectReplacement: { url: "https://www.url.com" } }, + }, + ], + }, + } + ], }, testEnvironment: "jsdom", testTimeout: 9000, @@ -52,22 +68,10 @@ module.exports = { "/node_modules/@blueprintjs/select/lib/esnext", "@appsmith/ads": "/node_modules/@appsmith/ads", "^canvas$": "jest-canvas-mock", + "^entities/(.*)$": "/src/entities/$1", // Match 'entities/*' + }, globals: { - "ts-jest": { - isolatedModules: true, - diagnostics: { - ignoreCodes: [1343], - }, - astTransformers: { - before: [ - { - path: "node_modules/ts-jest-mock-import-meta", - options: { metaObjectReplacement: { url: "https://www.url.com" } }, - }, - ], - }, - }, APPSMITH_FEATURE_CONFIGS: { sentry: { dsn: parseConfig("__APPSMITH_SENTRY_DSN__"), diff --git a/app/client/package.json b/app/client/package.json index dc06ada8d35f..a75c50f541f9 100644 --- a/app/client/package.json +++ b/app/client/package.json @@ -260,7 +260,7 @@ "@types/deep-diff": "^1.0.0", "@types/dom-view-transitions": "^1.0.5", "@types/downloadjs": "^1.4.2", - "@types/jest": "^27.4.1", + "@types/jest": "^29.5.3", "@types/jshint": "^2.12.0", "@types/lodash": "^4.14.120", "@types/mixpanel-browser": "^2.50.1", @@ -329,9 +329,9 @@ "eslint-plugin-testing-library": "^6.2.0", "factory.ts": "^0.5.1", "husky": "^8.0.0", - "jest": "^27.4.1", + "jest": "^29.6.1", "jest-canvas-mock": "^2.3.1", - "jest-environment-jsdom": "^27.4.1", + "jest-environment-jsdom": "^29.6.1", "jest-styled-components": "^7.0.8", "json5": "^2.2.3", "knip": "^5.30.2", @@ -354,7 +354,7 @@ "redux-devtools-extension": "^2.13.8", "redux-mock-store": "^1.5.4", "redux-saga-test-plan": "^4.0.6", - "ts-jest": "29.1.0", + "ts-jest": "^29.1.0", "ts-jest-mock-import-meta": "^0.12.0", "ts-node": "^10.9.1", "xlsx": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz" diff --git a/app/client/packages/ast/src/actionCreator/index.ts b/app/client/packages/ast/src/actionCreator/index.ts index fec4978b44f8..de42fb42b5c5 100644 --- a/app/client/packages/ast/src/actionCreator/index.ts +++ b/app/client/packages/ast/src/actionCreator/index.ts @@ -236,7 +236,7 @@ export const setCallbackFunctionField = ( currentValueAstWithComments, 0, undefined, - (type, node) => isCallExpressionNode(node), + (_type, node) => isCallExpressionNode(node), ); if (found) { @@ -717,7 +717,7 @@ export const replaceActionInQuery = ( }); simple(astWithComments, { - CallExpression(node) { + CallExpression(node: Node) { if ( isCallExpressionNode(node) && isMemberExpressionNode(node.callee) && @@ -800,16 +800,13 @@ export function canTranslateToUI( simple(astWithComments, { ConditionalExpression(node) { if ( - // @ts-expect-error: types not matched isCallExpressionNode(node.consequent) || - // @ts-expect-error: types not matched isCallExpressionNode(node.alternate) ) { canTranslate = false; } }, LogicalExpression(node) { - // @ts-expect-error: types not matched if (isCallExpressionNode(node.left) || isCallExpressionNode(node.right)) { canTranslate = false; } @@ -912,12 +909,10 @@ export function getMainAction( ExpressionStatement(node) { simple(node, { CallExpression(node) { - // @ts-expect-error: types not matched if (node.callee.type === NodeTypes.Identifier) { mainAction = generate(node, { comments: true }).trim(); } else { mainAction = - // @ts-expect-error: types not matched generate(node.callee, { comments: true }).trim() + "()"; } }, @@ -989,7 +984,7 @@ export function getThenCatchBlocksFromQuery( astWithComments, 0, undefined, - function (type, node) { + function (_type, node) { if (isCallExpressionNode(node)) { if (isMemberExpressionNode(node.callee)) { if (node.callee.object === rootCallExpression) { @@ -1020,7 +1015,7 @@ export function getThenCatchBlocksFromQuery( } const secondBlockType = firstBlockType === "then" ? "catch" : "then"; - const secondBlock = findNodeAt(ast, 0, undefined, function (type, node) { + const secondBlock = findNodeAt(ast, 0, undefined, function (_type, node) { if (isCallExpressionNode(node)) { if (isMemberExpressionNode(node.callee)) { if (node.callee.object === firstBlock) { @@ -1073,7 +1068,7 @@ export function setThenBlockInQuery( astWithComments, 0, undefined, - function (type, node) { + function (_type, node) { if (isCallExpressionNode(node)) { if (isMemberExpressionNode(node.callee)) { if (node.callee.object === rootCallExpression) { @@ -1117,7 +1112,7 @@ export function setThenBlockInQuery( astWithComments, 0, undefined, - function (type, node) { + function (_type, node) { if (isCallExpressionNode(node)) { if (isMemberExpressionNode(node.callee)) { if (node.callee.object === rootCallExpression) { @@ -1393,7 +1388,7 @@ function findNodeWithCalleeAndProperty( ) { if (!ast || !callee || !property) return undefined; - return findNodeAt(ast, 0, undefined, function (type, node) { + return findNodeAt(ast, 0, undefined, function (_type, node) { if (isCallExpressionNode(node)) { if (isMemberExpressionNode(node.callee)) { if (node.callee.object === callee) { @@ -1431,7 +1426,7 @@ export function getFunctionParams(code: string, evaluationVersion: number) { export function getQueryParam( code: string, - number: number, + _number: number, evaluationVersion: number, ) { try { diff --git a/app/client/packages/ast/src/jsObject/index.ts b/app/client/packages/ast/src/jsObject/index.ts index 96df9e01659d..71999691a33c 100644 --- a/app/client/packages/ast/src/jsObject/index.ts +++ b/app/client/packages/ast/src/jsObject/index.ts @@ -86,7 +86,7 @@ export const parseJSObject = (code: string) => { let JSObjectProperties: NodeWithLocation[] = []; simple(ast, { - ExportDefaultDeclaration(node) { + ExportDefaultDeclaration(node: Node) { if ( !isExportDefaultDeclarationNode(node) || !isObjectExpression(node.declaration) diff --git a/app/client/src/components/propertyControls/__snapshots__/IconSelectControl.test.tsx.snap b/app/client/src/components/propertyControls/__snapshots__/IconSelectControl.test.tsx.snap index cd8df41fb0b4..3e891f058e76 100644 --- a/app/client/src/components/propertyControls/__snapshots__/IconSelectControl.test.tsx.snap +++ b/app/client/src/components/propertyControls/__snapshots__/IconSelectControl.test.tsx.snap @@ -100,7 +100,7 @@ DOMTokenList { `; exports[` - Keyboard navigation Pressing '{Enter}' or ' ' should select the icon 3`] = ` -Array [ +[ "iconName", "add-row-top", true, @@ -115,7 +115,7 @@ DOMTokenList { `; exports[` - Keyboard navigation Pressing '{Enter}' or ' ' should select the icon 5`] = ` -Array [ +[ "iconName", "add-to-artifact", true, diff --git a/app/client/test/setup.ts b/app/client/test/setup.ts index 2578380198cf..c7f3e4009fdb 100644 --- a/app/client/test/setup.ts +++ b/app/client/test/setup.ts @@ -3,13 +3,16 @@ import { handlers } from "./__mocks__/apiHandlers"; import "../src/polyfills/requestIdleCallback"; import { Crypto } from "@peculiar/webcrypto"; +// since global crypto is immutable, we need to first delete it and then use the +// peculiar crypto lisrc/sagas/helper.test.tsb +delete global['crypto']; global.crypto = new Crypto(); export const server = setupServer(...handlers); jest.mock("api/Api", () => ({ __esModule: true, - default: class Api {}, + default: class Api { }, })); window.scrollTo = jest.fn(); @@ -18,7 +21,7 @@ Element.prototype.scrollBy = jest.fn(); jest.mock("../src/api/Api.ts", () => ({ __esModule: true, - default: class Api {}, + default: class Api { }, })); beforeAll(() => { @@ -83,7 +86,7 @@ document.createRange = () => { }; // jest events doesnt seem to be handling scrollTo -Element.prototype.scrollTo = () => {}; +Element.prototype.scrollTo = () => { }; class WorkerStub { url: string; @@ -91,7 +94,7 @@ class WorkerStub { constructor(stringUrl: string) { this.url = stringUrl; // eslint-disable-next-line @typescript-eslint/no-empty-function - this.onmessage = () => {}; + this.onmessage = () => { }; } postMessage(msg) { diff --git a/app/client/yarn.lock b/app/client/yarn.lock index 91270d7a599b..dc86e9a1ddeb 100644 --- a/app/client/yarn.lock +++ b/app/client/yarn.lock @@ -10665,13 +10665,13 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:*, @types/jest@npm:^29.2.3": - version: 29.5.12 - resolution: "@types/jest@npm:29.5.12" +"@types/jest@npm:*, @types/jest@npm:^29.2.3, @types/jest@npm:^29.5.3": + version: 29.5.14 + resolution: "@types/jest@npm:29.5.14" dependencies: expect: ^29.0.0 pretty-format: ^29.0.0 - checksum: 19b1efdeed9d9a60a81edc8226cdeae5af7479e493eaed273e01243891c9651f7b8b4c08fc633a7d0d1d379b091c4179bbaa0807af62542325fd72f2dd17ce1c + checksum: 18dba4623f26661641d757c63da2db45e9524c9be96a29ef713c703a9a53792df9ecee9f7365a0858ddbd6440d98fe6b65ca67895ca5884b73cbc7ffc11f3838 languageName: node linkType: hard @@ -10685,16 +10685,6 @@ __metadata: languageName: node linkType: hard -"@types/jest@npm:^27.4.1": - version: 27.4.1 - resolution: "@types/jest@npm:27.4.1" - dependencies: - jest-matcher-utils: ^27.0.0 - pretty-format: ^27.0.0 - checksum: 5184f3eef4832d01ee8f59bed15eec45ccc8e29c724a5e6ce37bf74396b37bdf04f557000f45ba4fc38ae6075cf9cfcce3d7a75abc981023c61ceb27230a93e4 - languageName: node - linkType: hard - "@types/js-levenshtein@npm:^1.1.0": version: 1.1.0 resolution: "@types/js-levenshtein@npm:1.1.0" @@ -10702,6 +10692,17 @@ __metadata: languageName: node linkType: hard +"@types/jsdom@npm:^20.0.0": + version: 20.0.1 + resolution: "@types/jsdom@npm:20.0.1" + dependencies: + "@types/node": "*" + "@types/tough-cookie": "*" + parse5: ^7.0.0 + checksum: d55402c5256ef451f93a6e3d3881f98339fe73a5ac2030588df056d6835df8367b5a857b48d27528289057e26dcdd3f502edc00cb877c79174cb3a4c7f2198c1 + languageName: node + linkType: hard + "@types/jshint@npm:^2.12.0": version: 2.12.0 resolution: "@types/jshint@npm:2.12.0" @@ -11314,6 +11315,13 @@ __metadata: languageName: node linkType: hard +"@types/tough-cookie@npm:*": + version: 4.0.5 + resolution: "@types/tough-cookie@npm:4.0.5" + checksum: f19409d0190b179331586365912920d192733112a195e870c7f18d20ac8adb7ad0b0ff69dad430dba8bc2be09593453a719cfea92dc3bda19748fd158fe1498d + languageName: node + linkType: hard + "@types/trusted-types@npm:^2.0.2": version: 2.0.3 resolution: "@types/trusted-types@npm:2.0.3" @@ -12350,7 +12358,7 @@ __metadata: languageName: node linkType: hard -"abab@npm:^2.0.3, abab@npm:^2.0.5": +"abab@npm:^2.0.3, abab@npm:^2.0.5, abab@npm:^2.0.6": version: 2.0.6 resolution: "abab@npm:2.0.6" checksum: 6ffc1af4ff315066c62600123990d87551ceb0aafa01e6539da77b0f5987ac7019466780bf480f1787576d4385e3690c81ccc37cfda12819bf510b8ab47e5a3e @@ -12400,6 +12408,16 @@ __metadata: languageName: node linkType: hard +"acorn-globals@npm:^7.0.0": + version: 7.0.1 + resolution: "acorn-globals@npm:7.0.1" + dependencies: + acorn: ^8.1.0 + acorn-walk: ^8.0.2 + checksum: 2a2998a547af6d0db5f0cdb90acaa7c3cbca6709010e02121fb8b8617c0fbd8bab0b869579903fde358ac78454356a14fadcc1a672ecb97b04b1c2ccba955ce8 + languageName: node + linkType: hard + "acorn-import-assertions@npm:^1.7.6": version: 1.9.0 resolution: "acorn-import-assertions@npm:1.9.0" @@ -12438,7 +12456,7 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:8.2.0, acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": +"acorn-walk@npm:8.2.0": version: 8.2.0 resolution: "acorn-walk@npm:8.2.0" checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 @@ -12452,7 +12470,16 @@ __metadata: languageName: node linkType: hard -"acorn@npm:8.10.0, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.0, acorn@npm:^8.8.2, acorn@npm:^8.9.0": +"acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" + dependencies: + acorn: ^8.11.0 + checksum: 4ff03f42323e7cf90f1683e08606b0f460e1e6ac263d2730e3df91c7665b6f64e696db6ea27ee4bed18c2599569be61f28a8399fa170c611161a348c402ca19c + languageName: node + linkType: hard + +"acorn@npm:8.10.0": version: 8.10.0 resolution: "acorn@npm:8.10.0" bin: @@ -12479,6 +12506,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.0, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" + bin: + acorn: bin/acorn + checksum: 8755074ba55fff94e84e81c72f1013c2d9c78e973c31231c8ae505a5f966859baf654bddd75046bffd73ce816b149298977fff5077a3033dedba0ae2aad152d4 + languageName: node + linkType: hard + "add-px-to-style@npm:1.0.0": version: 1.0.0 resolution: "add-px-to-style@npm:1.0.0" @@ -12870,7 +12906,7 @@ __metadata: "@types/dom-view-transitions": ^1.0.5 "@types/downloadjs": ^1.4.2 "@types/google.maps": ^3.51.0 - "@types/jest": ^27.4.1 + "@types/jest": ^29.5.3 "@types/jshint": ^2.12.0 "@types/lodash": ^4.14.120 "@types/mixpanel-browser": ^2.50.1 @@ -12986,9 +13022,9 @@ __metadata: immer: ^9.0.6 interweave: ^12.7.2 interweave-autolink: ^4.4.2 - jest: ^27.4.1 + jest: ^29.6.1 jest-canvas-mock: ^2.3.1 - jest-environment-jsdom: ^27.4.1 + jest-environment-jsdom: ^29.6.1 jest-styled-components: ^7.0.8 js-regex-pl: ^1.0.1 js-sha256: ^0.9.0 @@ -13094,7 +13130,7 @@ __metadata: tinycolor2: ^1.4.2 tinymce: 6.8.3 toposort: ^2.0.2 - ts-jest: 29.1.0 + ts-jest: ^29.1.0 ts-jest-mock-import-meta: ^0.12.0 ts-node: ^10.9.1 tslib: ^2.3.1 @@ -14394,7 +14430,7 @@ __metadata: languageName: node linkType: hard -"bs-logger@npm:0.x": +"bs-logger@npm:0.x, bs-logger@npm:^0.2.6": version: 0.2.6 resolution: "bs-logger@npm:0.2.6" dependencies: @@ -16430,6 +16466,17 @@ __metadata: languageName: node linkType: hard +"data-urls@npm:^3.0.2": + version: 3.0.2 + resolution: "data-urls@npm:3.0.2" + dependencies: + abab: ^2.0.6 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + checksum: 033fc3dd0fba6d24bc9a024ddcf9923691dd24f90a3d26f6545d6a2f71ec6956f93462f2cdf2183cc46f10dc01ed3bcb36731a8208456eb1a08147e571fe2a76 + languageName: node + linkType: hard + "date-fns@npm:^2.0.1, date-fns@npm:^2.24.0, date-fns@npm:^2.29.3": version: 2.30.0 resolution: "date-fns@npm:2.30.0" @@ -16528,10 +16575,10 @@ __metadata: languageName: node linkType: hard -"decimal.js@npm:^10.2.1": - version: 10.3.1 - resolution: "decimal.js@npm:10.3.1" - checksum: 0351ac9f05fe050f23227aa6a4573bee2d58fa7378fcf28d969a8c789525032effb488a90320fd3fe86a66e17b4bc507d811b15eada5b7f0e7ec5d2af4c24a59 +"decimal.js@npm:^10.2.1, decimal.js@npm:^10.4.2": + version: 10.4.3 + resolution: "decimal.js@npm:10.4.3" + checksum: 796404dcfa9d1dbfdc48870229d57f788b48c21c603c3f6554a1c17c10195fc1024de338b0cf9e1efe0c7c167eeb18f04548979bcc5fdfabebb7cc0ae3287bae languageName: node linkType: hard @@ -17160,6 +17207,15 @@ __metadata: languageName: node linkType: hard +"domexception@npm:^4.0.0": + version: 4.0.0 + resolution: "domexception@npm:4.0.0" + dependencies: + webidl-conversions: ^7.0.0 + checksum: ddbc1268edf33a8ba02ccc596735ede80375ee0cf124b30d2f05df5b464ba78ef4f49889b6391df4a04954e63d42d5631c7fcf8b1c4f12bc531252977a5f13d5 + languageName: node + linkType: hard + "domhandler@npm:2.3": version: 2.3.0 resolution: "domhandler@npm:2.3.0" @@ -17577,10 +17633,10 @@ __metadata: languageName: node linkType: hard -"entities@npm:^4.2.0, entities@npm:^4.3.0, entities@npm:^4.4.0": - version: 4.4.0 - resolution: "entities@npm:4.4.0" - checksum: 84d250329f4b56b40fa93ed067b194db21e8815e4eb9b59f43a086f0ecd342814f6bc483de8a77da5d64e0f626033192b1b4f1792232a7ea6b970ebe0f3187c2 +"entities@npm:^4.2.0, entities@npm:^4.3.0, entities@npm:^4.4.0, entities@npm:^4.5.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 853f8ebd5b425d350bffa97dd6958143179a5938352ccae092c62d1267c4e392a039be1bae7d51b6e4ffad25f51f9617531fedf5237f15df302ccfb452cbf2d7 languageName: node linkType: hard @@ -20449,6 +20505,15 @@ __metadata: languageName: node linkType: hard +"html-encoding-sniffer@npm:^3.0.0": + version: 3.0.0 + resolution: "html-encoding-sniffer@npm:3.0.0" + dependencies: + whatwg-encoding: ^2.0.0 + checksum: 8d806aa00487e279e5ccb573366a951a9f68f65c90298eac9c3a2b440a7ffe46615aff2995a2f61c6746c639234e6179a97e18ca5ccbbf93d3725ef2099a4502 + languageName: node + linkType: hard + "html-entities@npm:^2.1.0, html-entities@npm:^2.3.2": version: 2.3.3 resolution: "html-entities@npm:2.3.3" @@ -20761,7 +20826,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2, iconv-lite@npm:^0.6.3": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -22195,7 +22260,7 @@ __metadata: languageName: node linkType: hard -"jest-environment-jsdom@npm:^27.4.1, jest-environment-jsdom@npm:^27.5.1": +"jest-environment-jsdom@npm:^27.5.1": version: 27.5.1 resolution: "jest-environment-jsdom@npm:27.5.1" dependencies: @@ -22210,6 +22275,27 @@ __metadata: languageName: node linkType: hard +"jest-environment-jsdom@npm:^29.6.1": + version: 29.7.0 + resolution: "jest-environment-jsdom@npm:29.7.0" + dependencies: + "@jest/environment": ^29.7.0 + "@jest/fake-timers": ^29.7.0 + "@jest/types": ^29.6.3 + "@types/jsdom": ^20.0.0 + "@types/node": "*" + jest-mock: ^29.7.0 + jest-util: ^29.7.0 + jsdom: ^20.0.0 + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 559aac134c196fccc1dfc794d8fc87377e9f78e894bb13012b0831d88dec0abd7ece99abec69da564b8073803be4f04a9eb4f4d1bb80e29eec0cb252c254deb8 + languageName: node + linkType: hard + "jest-environment-node@npm:^27.5.1": version: 27.5.1 resolution: "jest-environment-node@npm:27.5.1" @@ -22377,7 +22463,7 @@ __metadata: languageName: node linkType: hard -"jest-matcher-utils@npm:^27.0.0, jest-matcher-utils@npm:^27.5.1": +"jest-matcher-utils@npm:^27.5.1": version: 27.5.1 resolution: "jest-matcher-utils@npm:27.5.1" dependencies: @@ -23009,7 +23095,7 @@ __metadata: languageName: node linkType: hard -"jest@npm:^27.4.1, jest@npm:^27.4.3": +"jest@npm:^27.4.3": version: 27.5.1 resolution: "jest@npm:27.5.1" dependencies: @@ -23027,7 +23113,7 @@ __metadata: languageName: node linkType: hard -"jest@npm:^29.3.1, jest@npm:^29.5.0, jest@npm:^29.6.4": +"jest@npm:^29.3.1, jest@npm:^29.5.0, jest@npm:^29.6.1, jest@npm:^29.6.4": version: 29.7.0 resolution: "jest@npm:29.7.0" dependencies: @@ -23208,6 +23294,45 @@ __metadata: languageName: node linkType: hard +"jsdom@npm:^20.0.0": + version: 20.0.3 + resolution: "jsdom@npm:20.0.3" + dependencies: + abab: ^2.0.6 + acorn: ^8.8.1 + acorn-globals: ^7.0.0 + cssom: ^0.5.0 + cssstyle: ^2.3.0 + data-urls: ^3.0.2 + decimal.js: ^10.4.2 + domexception: ^4.0.0 + escodegen: ^2.0.0 + form-data: ^4.0.0 + html-encoding-sniffer: ^3.0.0 + http-proxy-agent: ^5.0.0 + https-proxy-agent: ^5.0.1 + is-potential-custom-element-name: ^1.0.1 + nwsapi: ^2.2.2 + parse5: ^7.1.1 + saxes: ^6.0.0 + symbol-tree: ^3.2.4 + tough-cookie: ^4.1.2 + w3c-xmlserializer: ^4.0.0 + webidl-conversions: ^7.0.0 + whatwg-encoding: ^2.0.0 + whatwg-mimetype: ^3.0.0 + whatwg-url: ^11.0.0 + ws: ^8.11.0 + xml-name-validator: ^4.0.0 + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 6e2ae21db397133a061b270c26d2dbc0b9051733ea3b896a7ece78d79f475ff0974f766a413c1198a79c793159119169f2335ddb23150348fbfdcfa6f3105536 + languageName: node + linkType: hard + "jsesc@npm:^2.5.1": version: 2.5.2 resolution: "jsesc@npm:2.5.2" @@ -24046,7 +24171,7 @@ __metadata: languageName: node linkType: hard -"make-error@npm:1.x, make-error@npm:^1.1.1": +"make-error@npm:1.x, make-error@npm:^1.1.1, make-error@npm:^1.3.6": version: 1.3.6 resolution: "make-error@npm:1.3.6" checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 @@ -25688,10 +25813,10 @@ __metadata: languageName: node linkType: hard -"nwsapi@npm:^2.2.0": - version: 2.2.0 - resolution: "nwsapi@npm:2.2.0" - checksum: 5ef4a9bc0c1a5b7f2e014aa6a4b359a257503b796618ed1ef0eb852098f77e772305bb0e92856e4bbfa3e6c75da48c0113505c76f144555ff38867229c2400a7 +"nwsapi@npm:^2.2.0, nwsapi@npm:^2.2.2": + version: 2.2.13 + resolution: "nwsapi@npm:2.2.13" + checksum: d34fb7838517c3c7e8cc824e443275b08b57f6a025a860693d18c56ddcfd176e32df9bf0ae7f5a95c7a32981501caa1f9fda31b59f28aa72a4b9d01f573a8e6b languageName: node linkType: hard @@ -26328,6 +26453,15 @@ __metadata: languageName: node linkType: hard +"parse5@npm:^7.0.0, parse5@npm:^7.1.1": + version: 7.2.1 + resolution: "parse5@npm:7.2.1" + dependencies: + entities: ^4.5.0 + checksum: 11253cf8aa2e7fc41c004c64cba6f2c255f809663365db65bd7ad0e8cf7b89e436a563c20059346371cc543a6c1b567032088883ca6a2cbc88276c666b68236d + languageName: node + linkType: hard + "parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -27754,7 +27888,7 @@ __metadata: languageName: node linkType: hard -"pretty-format@npm:^27.0.0, pretty-format@npm:^27.0.2, pretty-format@npm:^27.5.1": +"pretty-format@npm:^27.0.2, pretty-format@npm:^27.5.1": version: 27.5.1 resolution: "pretty-format@npm:27.5.1" dependencies: @@ -30589,6 +30723,15 @@ __metadata: languageName: node linkType: hard +"saxes@npm:^6.0.0": + version: 6.0.0 + resolution: "saxes@npm:6.0.0" + dependencies: + xmlchars: ^2.2.0 + checksum: d3fa3e2aaf6c65ed52ee993aff1891fc47d5e47d515164b5449cbf5da2cbdc396137e55590472e64c5c436c14ae64a8a03c29b9e7389fc6f14035cf4e982ef3b + languageName: node + linkType: hard + "scheduler@npm:^0.19.1": version: 0.19.1 resolution: "scheduler@npm:0.19.1" @@ -30697,7 +30840,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:7.x, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4": +"semver@npm:7.x, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.2, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.3": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -32627,15 +32770,15 @@ __metadata: languageName: node linkType: hard -"tough-cookie@npm:^4.0.0, tough-cookie@npm:^4.1.3": - version: 4.1.3 - resolution: "tough-cookie@npm:4.1.3" +"tough-cookie@npm:^4.0.0, tough-cookie@npm:^4.1.2, tough-cookie@npm:^4.1.3": + version: 4.1.4 + resolution: "tough-cookie@npm:4.1.4" dependencies: psl: ^1.1.33 punycode: ^2.1.1 universalify: ^0.2.0 url-parse: ^1.5.3 - checksum: c9226afff36492a52118432611af083d1d8493a53ff41ec4ea48e5b583aec744b989e4280bcf476c910ec1525a89a4a0f1cae81c08b18fb2ec3a9b3a72b91dcc + checksum: 5815059f014c31179a303c673f753f7899a6fce94ac93712c88ea5f3c26e0c042b5f0c7a599a00f8e0feeca4615dba75c3dffc54f3c1a489978aa8205e09307c languageName: node linkType: hard @@ -32776,18 +32919,18 @@ __metadata: linkType: hard "ts-jest@npm:^29.1.0": - version: 29.2.4 - resolution: "ts-jest@npm:29.2.4" + version: 29.2.5 + resolution: "ts-jest@npm:29.2.5" dependencies: - bs-logger: 0.x + bs-logger: ^0.2.6 ejs: ^3.1.10 - fast-json-stable-stringify: 2.x + fast-json-stable-stringify: ^2.1.0 jest-util: ^29.0.0 json5: ^2.2.3 - lodash.memoize: 4.x - make-error: 1.x - semver: ^7.5.3 - yargs-parser: ^21.0.1 + lodash.memoize: ^4.1.2 + make-error: ^1.3.6 + semver: ^7.6.3 + yargs-parser: ^21.1.1 peerDependencies: "@babel/core": ">=7.0.0-beta.0 <8" "@jest/transform": ^29.0.0 @@ -32808,7 +32951,7 @@ __metadata: optional: true bin: ts-jest: cli.js - checksum: 142246f12bb11d5edbfb5a65e298097667e2c4d390e316e356416ce00d3cd157220dbfb9de2a56b38f30776bc92ba59eff9fd78e9345ba4c6712783f27f5475a + checksum: d60d1e1d80936f6002b1bb27f7e062408bc733141b9d666565503f023c340a3196d506c836a4316c5793af81a5f910ab49bb9c13f66e2dc66de4e0f03851dbca languageName: node linkType: hard @@ -33862,6 +34005,15 @@ __metadata: languageName: node linkType: hard +"w3c-xmlserializer@npm:^4.0.0": + version: 4.0.0 + resolution: "w3c-xmlserializer@npm:4.0.0" + dependencies: + xml-name-validator: ^4.0.0 + checksum: eba070e78deb408ae8defa4d36b429f084b2b47a4741c4a9be3f27a0a3d1845e277e3072b04391a138f7e43776842627d1334e448ff13ff90ad9fb1214ee7091 + languageName: node + linkType: hard + "wait-on@npm:^7.0.0": version: 7.2.0 resolution: "wait-on@npm:7.2.0" @@ -34235,6 +34387,15 @@ __metadata: languageName: node linkType: hard +"whatwg-encoding@npm:^2.0.0": + version: 2.0.0 + resolution: "whatwg-encoding@npm:2.0.0" + dependencies: + iconv-lite: 0.6.3 + checksum: 7087810c410aa9b689cbd6af8773341a53cdc1f3aae2a882c163bd5522ec8ca4cdfc269aef417a5792f411807d5d77d50df4c24e3abb00bb60192858a40cc675 + languageName: node + linkType: hard + "whatwg-fetch@npm:^3.6.2": version: 3.6.2 resolution: "whatwg-fetch@npm:3.6.2" @@ -34249,6 +34410,13 @@ __metadata: languageName: node linkType: hard +"whatwg-mimetype@npm:^3.0.0": + version: 3.0.0 + resolution: "whatwg-mimetype@npm:3.0.0" + checksum: ce08bbb36b6aaf64f3a84da89707e3e6a31e5ab1c1a2379fd68df79ba712a4ab090904f0b50e6693b0dafc8e6343a6157e40bf18fdffd26e513cf95ee2a59824 + languageName: node + linkType: hard + "whatwg-url@npm:^11.0.0": version: 11.0.0 resolution: "whatwg-url@npm:11.0.0" @@ -34746,9 +34914,9 @@ __metadata: languageName: node linkType: hard -"ws@npm:^8.2.3, ws@npm:^8.4.2, ws@npm:~8.17.1": - version: 8.17.1 - resolution: "ws@npm:8.17.1" +"ws@npm:^8.11.0, ws@npm:^8.2.3, ws@npm:^8.4.2": + version: 8.18.0 + resolution: "ws@npm:8.18.0" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -34757,7 +34925,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 442badcce1f1178ec87a0b5372ae2e9771e07c4929a3180321901f226127f252441e8689d765aa5cfba5f50ac60dd830954afc5aeae81609aefa11d3ddf5cecf + checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975 languageName: node linkType: hard @@ -34776,6 +34944,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:~8.17.1": + version: 8.17.1 + resolution: "ws@npm:8.17.1" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 442badcce1f1178ec87a0b5372ae2e9771e07c4929a3180321901f226127f252441e8689d765aa5cfba5f50ac60dd830954afc5aeae81609aefa11d3ddf5cecf + languageName: node + linkType: hard + "ws@npm:~8.2.3": version: 8.2.3 resolution: "ws@npm:8.2.3" @@ -34807,6 +34990,13 @@ __metadata: languageName: node linkType: hard +"xml-name-validator@npm:^4.0.0": + version: 4.0.0 + resolution: "xml-name-validator@npm:4.0.0" + checksum: af100b79c29804f05fa35aa3683e29a321db9b9685d5e5febda3fa1e40f13f85abc40f45a6b2bf7bee33f68a1dc5e8eaef4cec100a304a9db565e6061d4cb5ad + languageName: node + linkType: hard + "xml@npm:^1.0.1": version: 1.0.1 resolution: "xml@npm:1.0.1" From 178bc0d578032908af9469e88731c4467defb827 Mon Sep 17 00:00:00 2001 From: Shrikant Sharat Kandula Date: Thu, 21 Nov 2024 17:59:32 +0530 Subject: [PATCH 05/10] chore: Ignore some type errors to unblock CI --- app/client/packages/rts/src/ctl/backup.test.ts | 1 + app/client/packages/rts/src/ctl/backup.ts | 3 ++- app/client/packages/rts/src/ctl/export_db.ts | 1 + app/client/packages/rts/src/ctl/logger.ts | 1 + app/client/packages/rts/src/ctl/restore.ts | 1 + app/client/packages/rts/src/ctl/utils.ts | 2 ++ 6 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/client/packages/rts/src/ctl/backup.test.ts b/app/client/packages/rts/src/ctl/backup.test.ts index c6ff06dbee9c..30749eea2ce8 100644 --- a/app/client/packages/rts/src/ctl/backup.test.ts +++ b/app/client/packages/rts/src/ctl/backup.test.ts @@ -6,6 +6,7 @@ jest.mock("./utils", () => ({ import * as backup from "./backup"; import * as Constants from "./constants"; import os from "os"; +// @ts-ignore import fsPromises from "fs/promises"; import * as utils from "./utils"; import readlineSync from "readline-sync"; diff --git a/app/client/packages/rts/src/ctl/backup.ts b/app/client/packages/rts/src/ctl/backup.ts index a8eeaebe8e62..4961053f304b 100644 --- a/app/client/packages/rts/src/ctl/backup.ts +++ b/app/client/packages/rts/src/ctl/backup.ts @@ -1,3 +1,4 @@ +// @ts-ignore import fsPromises from "fs/promises"; import path from "path"; import os from "os"; @@ -39,7 +40,7 @@ export async function run() { if ( !command_args.includes("--non-interactive") && - tty.isatty(process.stdout.fd) + tty.isatty((process.stdout as any).fd) ) { encryptionPassword = getEncryptionPasswordFromUser(); if (encryptionPassword == -1) { diff --git a/app/client/packages/rts/src/ctl/export_db.ts b/app/client/packages/rts/src/ctl/export_db.ts index 844bd43974e6..5661c409c2f8 100644 --- a/app/client/packages/rts/src/ctl/export_db.ts +++ b/app/client/packages/rts/src/ctl/export_db.ts @@ -1,3 +1,4 @@ +// @ts-ignore import fsPromises from "fs/promises"; import * as Constants from "./constants"; import * as utils from "./utils"; diff --git a/app/client/packages/rts/src/ctl/logger.ts b/app/client/packages/rts/src/ctl/logger.ts index 742fb6ea6262..0c08a1362042 100644 --- a/app/client/packages/rts/src/ctl/logger.ts +++ b/app/client/packages/rts/src/ctl/logger.ts @@ -1,3 +1,4 @@ +// @ts-ignore import fsPromises from "fs/promises"; import * as Constants from "./constants"; diff --git a/app/client/packages/rts/src/ctl/restore.ts b/app/client/packages/rts/src/ctl/restore.ts index fb2f27972c09..e40c44b4b9b3 100644 --- a/app/client/packages/rts/src/ctl/restore.ts +++ b/app/client/packages/rts/src/ctl/restore.ts @@ -1,3 +1,4 @@ +// @ts-ignore import fsPromises from "fs/promises"; import path from "path"; import os from "os"; diff --git a/app/client/packages/rts/src/ctl/utils.ts b/app/client/packages/rts/src/ctl/utils.ts index a386eaf1a626..e0f9e8c74c9d 100644 --- a/app/client/packages/rts/src/ctl/utils.ts +++ b/app/client/packages/rts/src/ctl/utils.ts @@ -1,6 +1,8 @@ +// @ts-ignore import fsPromises from "fs/promises"; import * as Constants from "./constants"; import childProcess from "child_process"; +// @ts-ignore import fs from "node:fs"; import { ConnectionString } from "mongodb-connection-string-url"; From 576d042919336346089678e80caea240921d6d40 Mon Sep 17 00:00:00 2001 From: Shrikant Sharat Kandula Date: Thu, 21 Nov 2024 18:07:25 +0530 Subject: [PATCH 06/10] chore: Ignore ban-ts-comment for ctl code --- app/client/packages/rts/src/ctl/.eslintrc.json | 1 + 1 file changed, 1 insertion(+) diff --git a/app/client/packages/rts/src/ctl/.eslintrc.json b/app/client/packages/rts/src/ctl/.eslintrc.json index 91a11ef80351..89c79ccd3a38 100644 --- a/app/client/packages/rts/src/ctl/.eslintrc.json +++ b/app/client/packages/rts/src/ctl/.eslintrc.json @@ -1,6 +1,7 @@ { "extends": ["../../../../.eslintrc.base.json"], "rules": { + "@typescript-eslint/ban-ts-comment": "off", "@typescript-eslint/prefer-nullish-coalescing": "off", "@typescript-eslint/strict-boolean-expressions": "off", "@typescript-eslint/no-explicit-any": "off", From 154804dbf7d3b1b47358d5c84067d0655fe1fe54 Mon Sep 17 00:00:00 2001 From: Ayush Pahwa Date: Thu, 21 Nov 2024 21:07:26 +0800 Subject: [PATCH 07/10] chore: restore removed ts expect error comments (#37639) ## Description I removed ts expect error comments while upgrading the jest lib. This was erroneous, the comments are still needed. No change in functionality, just to suppress ts errors. ## Automation /ok-to-test tags="" ### :mag: Cypress test results > [!CAUTION] > If you modify the content in this section, you are likely to disrupt the CI result for your PR. ## Communication Should the DevRel and Marketing teams inform users about this change? - [ ] Yes - [ ] No --- app/client/packages/ast/src/actionCreator/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/client/packages/ast/src/actionCreator/index.ts b/app/client/packages/ast/src/actionCreator/index.ts index de42fb42b5c5..100734a2c02c 100644 --- a/app/client/packages/ast/src/actionCreator/index.ts +++ b/app/client/packages/ast/src/actionCreator/index.ts @@ -800,13 +800,16 @@ export function canTranslateToUI( simple(astWithComments, { ConditionalExpression(node) { if ( + // @ts-expect-error: types not matched isCallExpressionNode(node.consequent) || + // @ts-expect-error: types not matched isCallExpressionNode(node.alternate) ) { canTranslate = false; } }, LogicalExpression(node) { + // @ts-expect-error: types not matched if (isCallExpressionNode(node.left) || isCallExpressionNode(node.right)) { canTranslate = false; } @@ -909,10 +912,12 @@ export function getMainAction( ExpressionStatement(node) { simple(node, { CallExpression(node) { + // @ts-expect-error: types not matched if (node.callee.type === NodeTypes.Identifier) { mainAction = generate(node, { comments: true }).trim(); } else { mainAction = + // @ts-expect-error: types not matched generate(node.callee, { comments: true }).trim() + "()"; } }, From b113cf7bc5cd31b60be855f78fc7ce247d1c5ac6 Mon Sep 17 00:00:00 2001 From: Ankita Kinger Date: Thu, 21 Nov 2024 19:11:44 +0530 Subject: [PATCH 08/10] fix: Updating empty state message when searching items in queries segment (#37636) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description Updating empty state message when searching items in queries segment Fixes [#37635](https://github.com/appsmithorg/appsmith/issues/37635) ## Automation /ok-to-test tags="@tag.Sanity" ### :mag: Cypress test results > [!TIP] > 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉 > Workflow run: > Commit: 7cd8517137aa42ca2c5bfd7ef78fb9daa686647f > Cypress dashboard. > Tags: `@tag.Sanity` > Spec: >
Thu, 21 Nov 2024 13:34:32 UTC ## Communication Should the DevRel and Marketing teams inform users about this change? - [ ] Yes - [ ] No ## Summary by CodeRabbit - **New Features** - Updated messaging in the search results for improved clarity when no queries are found. - **Bug Fixes** - Corrected the context of the empty search result message from JavaScript objects to queries. --- app/client/src/pages/Editor/IDE/EditorPane/Query/List.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/client/src/pages/Editor/IDE/EditorPane/Query/List.tsx b/app/client/src/pages/Editor/IDE/EditorPane/Query/List.tsx index edbbcbd71cbd..00a0c6faba97 100644 --- a/app/client/src/pages/Editor/IDE/EditorPane/Query/List.tsx +++ b/app/client/src/pages/Editor/IDE/EditorPane/Query/List.tsx @@ -98,7 +98,7 @@ const ListQuery = () => { })} {localFiles.length === 0 && searchTerm !== "" ? ( ) : null} From 0dac601979a6266f885cfe196ec2de379598ec7f Mon Sep 17 00:00:00 2001 From: Ayush Pahwa Date: Fri, 22 Nov 2024 04:23:58 +0800 Subject: [PATCH 09/10] chore: upgrade version of acorn and acron walk (#37641) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description acorn and acorn walk did not have a fixed version, this pr fixes the versions to `"acorn": "8.14.0", "acorn-walk": "8.3.4"` respectively. Fixes #`Issue Number` _or_ Fixes `Issue URL` > [!WARNING] > _If no issue exists, please create an issue first, and check with the maintainers if the issue is valid._ ## Automation /test all ### :mag: Cypress test results > [!TIP] > 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉 > Workflow run: > Commit: 518c41104561b6f0df8f546eb5a4e0b3e82c2676 > Cypress dashboard. > Tags: `@tag.All` > Spec: >
Thu, 21 Nov 2024 19:47:19 UTC ## Communication Should the DevRel and Marketing teams inform users about this change? - [ ] Yes - [x] No ## Summary by CodeRabbit - **Chores** - Updated dependency versions for improved performance and security: - `acorn` updated to version `8.14.0` - `acorn-walk` updated to version `8.3.4` - **Bug Fixes** - Enhanced error handling in `canTranslateToUI` function for better conditional and logical expression processing. - Improved logic in `getMainAction` function to ensure accurate function name generation based on call expression structure. --- app/client/packages/ast/package.json | 4 +- .../packages/ast/src/actionCreator/index.ts | 5 --- app/client/yarn.lock | 38 +++++++++---------- 3 files changed, 21 insertions(+), 26 deletions(-) diff --git a/app/client/packages/ast/package.json b/app/client/packages/ast/package.json index e982902dd1b1..351e5b9602a8 100644 --- a/app/client/packages/ast/package.json +++ b/app/client/packages/ast/package.json @@ -16,8 +16,8 @@ "@rollup/plugin-commonjs": "^22.0.0", "@types/escodegen": "^0.0.7", "@types/lodash": "^4.14.120", - "acorn": "^8.8.0", - "acorn-walk": "^8.2.0", + "acorn": "8.14.0", + "acorn-walk": "8.3.4", "astravel": "^0.6.1", "astring": "^1.7.5", "escodegen": "^2.0.0", diff --git a/app/client/packages/ast/src/actionCreator/index.ts b/app/client/packages/ast/src/actionCreator/index.ts index 100734a2c02c..de42fb42b5c5 100644 --- a/app/client/packages/ast/src/actionCreator/index.ts +++ b/app/client/packages/ast/src/actionCreator/index.ts @@ -800,16 +800,13 @@ export function canTranslateToUI( simple(astWithComments, { ConditionalExpression(node) { if ( - // @ts-expect-error: types not matched isCallExpressionNode(node.consequent) || - // @ts-expect-error: types not matched isCallExpressionNode(node.alternate) ) { canTranslate = false; } }, LogicalExpression(node) { - // @ts-expect-error: types not matched if (isCallExpressionNode(node.left) || isCallExpressionNode(node.right)) { canTranslate = false; } @@ -912,12 +909,10 @@ export function getMainAction( ExpressionStatement(node) { simple(node, { CallExpression(node) { - // @ts-expect-error: types not matched if (node.callee.type === NodeTypes.Identifier) { mainAction = generate(node, { comments: true }).trim(); } else { mainAction = - // @ts-expect-error: types not matched generate(node.callee, { comments: true }).trim() + "()"; } }, diff --git a/app/client/yarn.lock b/app/client/yarn.lock index dc86e9a1ddeb..abcbd21fa8b1 100644 --- a/app/client/yarn.lock +++ b/app/client/yarn.lock @@ -8405,8 +8405,8 @@ __metadata: "@types/lodash": ^4.14.120 "@typescript-eslint/eslint-plugin": ^5.25.0 "@typescript-eslint/parser": ^5.25.0 - acorn: ^8.8.0 - acorn-walk: ^8.2.0 + acorn: 8.14.0 + acorn-walk: 8.3.4 astravel: ^0.6.1 astring: ^1.7.5 escodegen: ^2.0.0 @@ -12463,14 +12463,7 @@ __metadata: languageName: node linkType: hard -"acorn-walk@npm:^7.0.0, acorn-walk@npm:^7.1.1, acorn-walk@npm:^7.2.0": - version: 7.2.0 - resolution: "acorn-walk@npm:7.2.0" - checksum: 9252158a79b9d92f1bc0dd6acc0fcfb87a67339e84bcc301bb33d6078936d27e35d606b4d35626d2962cd43c256d6f27717e70cbe15c04fff999ab0b2260b21f - languageName: node - linkType: hard - -"acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": +"acorn-walk@npm:8.3.4, acorn-walk@npm:^8.0.2, acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": version: 8.3.4 resolution: "acorn-walk@npm:8.3.4" dependencies: @@ -12479,6 +12472,13 @@ __metadata: languageName: node linkType: hard +"acorn-walk@npm:^7.0.0, acorn-walk@npm:^7.1.1, acorn-walk@npm:^7.2.0": + version: 7.2.0 + resolution: "acorn-walk@npm:7.2.0" + checksum: 9252158a79b9d92f1bc0dd6acc0fcfb87a67339e84bcc301bb33d6078936d27e35d606b4d35626d2962cd43c256d6f27717e70cbe15c04fff999ab0b2260b21f + languageName: node + linkType: hard + "acorn@npm:8.10.0": version: 8.10.0 resolution: "acorn@npm:8.10.0" @@ -12488,6 +12488,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:8.14.0, acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" + bin: + acorn: bin/acorn + checksum: 8755074ba55fff94e84e81c72f1013c2d9c78e973c31231c8ae505a5f966859baf654bddd75046bffd73ce816b149298977fff5077a3033dedba0ae2aad152d4 + languageName: node + linkType: hard + "acorn@npm:^4.0.9": version: 4.0.13 resolution: "acorn@npm:4.0.13" @@ -12506,15 +12515,6 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.1.0, acorn@npm:^8.11.0, acorn@npm:^8.2.4, acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.0, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.14.0 - resolution: "acorn@npm:8.14.0" - bin: - acorn: bin/acorn - checksum: 8755074ba55fff94e84e81c72f1013c2d9c78e973c31231c8ae505a5f966859baf654bddd75046bffd73ce816b149298977fff5077a3033dedba0ae2aad152d4 - languageName: node - linkType: hard - "add-px-to-style@npm:1.0.0": version: 1.0.0 resolution: "add-px-to-style@npm:1.0.0" From fd24aabbb3c97297fa403edd95a1978eb5ce5971 Mon Sep 17 00:00:00 2001 From: Hetu Nandu Date: Fri, 22 Nov 2024 08:19:31 +0530 Subject: [PATCH 10/10] fix: Min width in certain ADS Button usage (#37624) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Description 1. Remove height override in Workspace add button 2. Remove min width in Debugger trigger button Fixes #37623 ## Automation /ok-to-test tags="@tag.Sanity" ### :mag: Cypress test results > [!TIP] > 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉 > Workflow run: > Commit: 9acd2b982c393841d472bb91576f997cd8a8df3a > Cypress dashboard. > Tags: `@tag.Sanity` > Spec: >
Thu, 21 Nov 2024 13:18:43 UTC ## Communication Should the DevRel and Marketing teams inform users about this change? - [ ] Yes - [ ] No ## Summary by CodeRabbit - **New Features** - Introduced new styled components for enhanced workspace layout: `WorkspaceDropDown`, `WorkspaceSection`, and `ApplicationContainer`. - Added functionality for creating and managing workspaces, including a new button in the `LeftPaneSection`. - Enhanced application display logic based on Anvil feature status. - **Bug Fixes** - Improved error handling and state management for workspace and application fetching. - **Style** - Updated `DebuggerTrigger` to use a new styled button for improved design consistency. - Customized button appearance in the debugger with a new styled component. - **Documentation** - Enhanced overall component structure for better readability and maintainability. --------- Co-authored-by: Shrikant Sharat Kandula --- app/client/src/ce/pages/Applications/index.tsx | 3 --- .../src/components/editorComponents/Debugger/index.tsx | 7 ++++--- .../src/components/editorComponents/Debugger/styles.ts | 10 ++++++++++ .../src/pages/Editor/APIEditor/CommonEditorForm.tsx | 5 ----- 4 files changed, 14 insertions(+), 11 deletions(-) create mode 100644 app/client/src/components/editorComponents/Debugger/styles.ts diff --git a/app/client/src/ce/pages/Applications/index.tsx b/app/client/src/ce/pages/Applications/index.tsx index 5c3e54af7fbd..edd2b60af280 100644 --- a/app/client/src/ce/pages/Applications/index.tsx +++ b/app/client/src/ce/pages/Applications/index.tsx @@ -253,9 +253,6 @@ const LeftPaneDataSection = styled.div<{ isBannerVisible?: boolean }>` height: calc(100vh - ${(props) => 48 + (props.isBannerVisible ? 48 : 0)}px); display: flex; flex-direction: column; - button { - height: 34px !important; - } `; // Tags for some reason take all available space. diff --git a/app/client/src/components/editorComponents/Debugger/index.tsx b/app/client/src/components/editorComponents/Debugger/index.tsx index 036a3d4a4ec2..54dcb5f0f349 100644 --- a/app/client/src/components/editorComponents/Debugger/index.tsx +++ b/app/client/src/components/editorComponents/Debugger/index.tsx @@ -3,8 +3,9 @@ import { useDispatch, useSelector } from "react-redux"; import DebuggerTabs from "./DebuggerTabs"; import { setErrorCount } from "actions/debuggerActions"; import { getMessageCount, showDebuggerFlag } from "selectors/debuggerSelectors"; -import { Button, Tooltip } from "@appsmith/ads"; +import { Tooltip } from "@appsmith/ads"; import useDebuggerTriggerClick from "./hooks/useDebuggerTriggerClick"; +import * as Styled from "./styles"; function Debugger() { // Debugger render flag @@ -33,7 +34,7 @@ export function DebuggerTrigger() { return ( - + ); } diff --git a/app/client/src/components/editorComponents/Debugger/styles.ts b/app/client/src/components/editorComponents/Debugger/styles.ts new file mode 100644 index 000000000000..52721305f4f8 --- /dev/null +++ b/app/client/src/components/editorComponents/Debugger/styles.ts @@ -0,0 +1,10 @@ +import { Button } from "@appsmith/ads"; +import styled from "styled-components"; + +export const DebuggerTriggerButton = styled(Button)` + /* Override the min-width of the button for debugger trigger only */ + + .ads-v2-button__content { + min-width: unset; + } +`; diff --git a/app/client/src/pages/Editor/APIEditor/CommonEditorForm.tsx b/app/client/src/pages/Editor/APIEditor/CommonEditorForm.tsx index a024ab6b386f..20083d77bc2d 100644 --- a/app/client/src/pages/Editor/APIEditor/CommonEditorForm.tsx +++ b/app/client/src/pages/Editor/APIEditor/CommonEditorForm.tsx @@ -65,11 +65,6 @@ const MainConfiguration = styled.div` .api-info-row { padding-top: var(--ads-v2-spaces-5); - - .ads-v2-select > .rc-select-selector { - min-width: 110px; - width: 110px; - } } .form-row-header {