PromucFlow_constructor/app/client/packages/ast/index.ts
Anand Srinivasan 9dd015a1e6
feat: peek overlay nested properties + perf improvements (#23414)
Fixes #23057
Fixes #23054

## Description
TL;DR Added support for peeking on nested properties. e.g.
`Api1.data[0].id`.

This won't work when:
-  local variables are involved in the expression. 
e.g. `Api1.data[x].id` won't support peeking at the variable `[x]` or
anything after that.
- library code is involved e.g. `moment`, `_` etc...
- when functions are called. e.g. Api1.data[0].id.toFixed()

Because these cases requires evaluation.

<img width="355" alt="image"
src="https://github.com/appsmithorg/appsmith/assets/66776129/d09d1f0d-1692-46f5-8ec1-592f4fe75f7a">

#### Media (old vs new)
https://www.loom.com/share/dedcf113439c4ee2a19028acca54045e




## Performance improvements:
- Use AST to identify expressions instead marking text manually.
- This reduces the number of markers we process (~ half).

- Before

![image](https://github.com/appsmithorg/appsmith/assets/66776129/bb16ac6b-46dd-4e39-8524-e4f4fa2c3243)

- After

![image](https://github.com/appsmithorg/appsmith/assets/66776129/28f0f209-5437-4718-a74a-f025c576afda)

- AST logs
https://www.loom.com/share/ddde93233cc8470ea04309d8a8332240

#### Type of change
- Bug fix (non-breaking change which fixes an issue)
- New feature (non-breaking change which adds functionality)

## Testing
>
#### How Has This Been Tested?
- [x] Manual
- [x] Jest
- [x] Cypress
>
>
#### Test Plan
https://github.com/appsmithorg/TestSmith/issues/2402

#### Issues raised during DP testing

https://github.com/appsmithorg/appsmith/pull/23414#issuecomment-1553164908

## Checklist:
#### Dev activity
- [x] My code follows the style guidelines of this project
- [x] I have performed a self-review of my own code
- [x] I have commented my code, particularly in hard-to-understand areas
- [ ] I have made corresponding changes to the documentation
- [x] My changes generate no new warnings
- [x] I have added tests that prove my fix is effective or that my
feature works
- [x] New and existing unit tests pass locally with my changes
- [ ] PR is being merged under a feature flag


#### QA activity:
- [x] [Speedbreak
features](https://github.com/appsmithorg/TestSmith/wiki/Test-plan-implementation#speedbreaker-features-to-consider-for-every-change)
have been covered
- [x] Test plan covers all impacted features and [areas of
interest](https://github.com/appsmithorg/TestSmith/wiki/Guidelines-for-test-plans/_edit#areas-of-interest)
- [ ] Test plan has been peer reviewed by project stakeholders and other
QA members
- [x] Manually tested functionality on DP
- [ ] We had an implementation alignment call with stakeholders post QA
Round 2
- [x] Cypress test cases have been added and approved by SDET/manual QA
- [x] Added `Test Plan Approved` label after Cypress tests were reviewed
- [ ] Added `Test Plan Approved` label after JUnit tests were reviewed
2023-05-26 17:12:10 +05:30

128 lines
3.0 KiB
TypeScript

import type {
ObjectExpression,
PropertyNode,
MemberExpressionData,
IdentifierInfo,
} from "./src";
import {
isIdentifierNode,
isVariableDeclarator,
isObjectExpression,
isLiteralNode,
isPropertyNode,
isPropertyAFunctionNode,
isCallExpressionNode,
getAST,
extractIdentifierInfoFromCode,
entityRefactorFromCode,
extractInvalidTopLevelMemberExpressionsFromCode,
getFunctionalParamsFromNode,
isTypeOfFunction,
isFunctionPresent,
} from "./src";
// constants
import { ECMA_VERSION, SourceType, NodeTypes } from "./src/constants";
// JSObjects
import type { TParsedJSProperty, JSPropertyPosition } from "./src/jsObject";
import { parseJSObject, isJSFunctionProperty } from "./src/jsObject";
// action creator
import {
getTextArgumentAtPosition,
setTextArgumentAtPosition,
getEnumArgumentAtPosition,
setEnumArgumentAtPosition,
getModalName,
setModalName,
getFuncExpressionAtPosition,
getFunction,
replaceActionInQuery,
setCallbackFunctionField,
getActionBlocks,
getFunctionBodyStatements,
getMainAction,
getFunctionName,
setObjectAtPosition,
getThenCatchBlocksFromQuery,
setThenBlockInQuery,
setCatchBlockInQuery,
getFunctionArguments,
getFunctionNameFromJsObjectExpression,
getCallExpressions,
canTranslateToUI,
getFunctionParams,
getQueryParam,
setQueryParam,
checkIfCatchBlockExists,
checkIfThenBlockExists,
checkIfArgumentExistAtPosition,
} from "./src/actionCreator";
// peekOverlay
import type { PeekOverlayExpressionIdentifierOptions } from "./src/peekOverlay";
import { PeekOverlayExpressionIdentifier } from "./src/peekOverlay";
// types or interfaces should be exported with type keyword, while enums can be exported like normal functions
export type {
ObjectExpression,
PropertyNode,
MemberExpressionData,
IdentifierInfo,
TParsedJSProperty,
JSPropertyPosition,
PeekOverlayExpressionIdentifierOptions,
};
export {
isIdentifierNode,
isVariableDeclarator,
isObjectExpression,
isLiteralNode,
isPropertyNode,
isPropertyAFunctionNode,
isCallExpressionNode,
getAST,
extractIdentifierInfoFromCode,
entityRefactorFromCode,
extractInvalidTopLevelMemberExpressionsFromCode,
getFunctionalParamsFromNode,
isTypeOfFunction,
parseJSObject,
ECMA_VERSION,
SourceType,
NodeTypes,
getTextArgumentAtPosition,
getEnumArgumentAtPosition,
getModalName,
setModalName,
setTextArgumentAtPosition,
setEnumArgumentAtPosition,
getFuncExpressionAtPosition,
getFunction,
replaceActionInQuery,
setCallbackFunctionField,
getActionBlocks,
getFunctionBodyStatements,
getMainAction,
getFunctionName,
setObjectAtPosition,
getThenCatchBlocksFromQuery,
setThenBlockInQuery,
setCatchBlockInQuery,
getFunctionArguments,
getFunctionNameFromJsObjectExpression,
getCallExpressions,
canTranslateToUI,
getFunctionParams,
getQueryParam,
setQueryParam,
checkIfThenBlockExists,
checkIfCatchBlockExists,
checkIfArgumentExistAtPosition,
isJSFunctionProperty,
isFunctionPresent,
PeekOverlayExpressionIdentifier,
};