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/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 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/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/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/.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", 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..30749eea2ce8 100644 --- a/app/client/packages/rts/src/ctl/backup.test.js +++ b/app/client/packages/rts/src/ctl/backup.test.ts @@ -1,15 +1,21 @@ -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"; +// @ts-ignore +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 +24,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 +52,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 +82,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 +131,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 +142,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 +153,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 +164,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 +175,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 +185,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 +216,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 +227,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 +239,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..4961053f304b 100644 --- a/app/client/packages/rts/src/ctl/backup.js +++ b/app/client/packages/rts/src/ctl/backup.ts @@ -1,16 +1,17 @@ -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"); +// @ts-ignore +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; @@ -39,7 +40,7 @@ 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) { @@ -116,7 +117,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 +136,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 +209,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 +239,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 +249,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 +259,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 +289,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 +303,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..5661c409c2f8 100644 --- a/app/client/packages/rts/src/ctl/export_db.js +++ b/app/client/packages/rts/src/ctl/export_db.ts @@ -1,8 +1,9 @@ -const fsPromises = require("fs/promises"); -const Constants = require("./constants"); -const utils = require("./utils"); +// @ts-ignore +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 +16,7 @@ async function exportDatabase() { console.log("export_database done"); } -async function run() { +export async function run() { let errorCode = 0; await utils.ensureSupervisorIsRunning(); @@ -42,8 +43,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..0c08a1362042 100644 --- a/app/client/packages/rts/src/ctl/logger.js +++ b/app/client/packages/rts/src/ctl/logger.ts @@ -1,7 +1,8 @@ -const fsPromises = require("fs/promises"); -const Constants = require("./constants"); +// @ts-ignore +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 +15,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 +27,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..e40c44b4b9b3 100644 --- a/app/client/packages/rts/src/ctl/restore.js +++ b/app/client/packages/rts/src/ctl/restore.ts @@ -1,12 +1,12 @@ -const fsPromises = require("fs/promises"); -const path = require("path"); -const os = require("os"); -const readlineSync = require("readline-sync"); +// @ts-ignore +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 +44,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 +221,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 +280,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 +354,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..e0f9e8c74c9d 100644 --- a/app/client/packages/rts/src/ctl/utils.js +++ b/app/client/packages/rts/src/ctl/utils.ts @@ -1,10 +1,12 @@ -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"); - -function showHelp() { +// @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"; + +export function showHelp() { console.log( "\nUsage: appsmith to interact with appsmith utils tool", ); @@ -17,7 +19,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 +28,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 +59,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 +68,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 +100,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 +134,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 +152,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 +204,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 +236,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/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/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/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 { 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} 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 88c6bbf5d0db..abcbd21fa8b1 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" @@ -8377,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 @@ -10637,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 @@ -10657,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" @@ -10674,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" @@ -10827,6 +10856,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" @@ -11074,6 +11112,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" @@ -11270,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" @@ -12306,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 @@ -12356,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" @@ -12394,13 +12456,22 @@ __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 languageName: node linkType: hard +"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: + acorn: ^8.11.0 + checksum: 4ff03f42323e7cf90f1683e08606b0f460e1e6ac263d2730e3df91c7665b6f64e696db6ea27ee4bed18c2599569be61f28a8399fa170c611161a348c402ca19c + 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" @@ -12408,7 +12479,7 @@ __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@npm:8.10.0": version: 8.10.0 resolution: "acorn@npm:8.10.0" bin: @@ -12417,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" @@ -12740,6 +12820,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 @@ -12824,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 @@ -12940,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 @@ -13048,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 @@ -14348,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: @@ -16384,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" @@ -16482,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 @@ -17114,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" @@ -17531,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 @@ -20403,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" @@ -20715,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: @@ -20770,10 +20881,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 @@ -22142,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: @@ -22157,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" @@ -22324,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: @@ -22956,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: @@ -22974,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: @@ -23155,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" @@ -23993,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 @@ -25635,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 @@ -26275,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" @@ -27701,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: @@ -29630,6 +29817,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 +29836,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 +30134,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" @@ -30513,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" @@ -30621,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: @@ -32551,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 @@ -32700,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 @@ -32732,7 +32951,7 @@ __metadata: optional: true bin: ts-jest: cli.js - checksum: 142246f12bb11d5edbfb5a65e298097667e2c4d390e316e356416ce00d3cd157220dbfb9de2a56b38f30776bc92ba59eff9fd78e9345ba4c6712783f27f5475a + checksum: d60d1e1d80936f6002b1bb27f7e062408bc733141b9d666565503f023c340a3196d506c836a4316c5793af81a5f910ab49bb9c13f66e2dc66de4e0f03851dbca languageName: node linkType: hard @@ -33786,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" @@ -34159,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" @@ -34173,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" @@ -34670,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" @@ -34681,7 +34925,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 442badcce1f1178ec87a0b5372ae2e9771e07c4929a3180321901f226127f252441e8689d765aa5cfba5f50ac60dd830954afc5aeae81609aefa11d3ddf5cecf + checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975 languageName: node linkType: hard @@ -34700,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" @@ -34731,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" 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; + })); } /**