-
Notifications
You must be signed in to change notification settings - Fork 321
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix: state accessor defaultValue support expression #977 #997
base: refactor/develop
Are you sure you want to change the base?
fix: state accessor defaultValue support expression #977 #997
Conversation
Warning There were issues while running some tools. Please review the errors and either fix the tool’s configuration or disable the tool if it’s a critical failure. 🔧 eslint
packages/vue-generator/src/generator/vue/sfc/generateAttribute.jsOops! Something went wrong! :( ESLint: 8.57.1 Error: Cannot read config file: /packages/vue-generator/.eslintrc.cjs
WalkthroughThis pull request restructures the logic for state accessors in the Vue component generation process. A new function, Changes
Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
packages/vue-generator/src/generator/vue/sfc/generateAttribute.js
(2 hunks)packages/vue-generator/test/testcases/sfc/accessor/expected/Accessor.vue
(3 hunks)packages/vue-generator/test/testcases/sfc/accessor/schema.json
(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: push-check
🔇 Additional comments (2)
packages/vue-generator/src/generator/vue/sfc/generateAttribute.js (1)
398-422
: ThehandleAccessorBinding
function is well-structured and enhances clarityThe introduction of
handleAccessorBinding
encapsulates the logic for handling state accessors and default values, improving code maintainability and readability.packages/vue-generator/test/testcases/sfc/accessor/schema.json (1)
97-163
:⚠️ Potential issueInconsistencies Between
defaultValue
Types and Accessor Getter AssignmentsThe
state
properties havedefaultValue
types that do not align with the types of values being assigned in their accessor getters:
IconPlusSquare
: Defined with adefaultValue
of typeJSResource
(this.utils.IconPlusSquare()
), but the accessor getter assigns a string tothis.state.IconPlusSquare
.editConfig
: Initialized as an object with multiple properties, but the accessor getter assigns a string tothis.state.editConfig
.status
: Has adefaultValue
as a computedJSExpression
, but the accessor getter assigns a string tothis.state.status
.buttons
: Initialized as an array of objects, but the accessor getter assigns a string tothis.state.buttons
.Assigning a string to these properties may cause type mismatches and runtime errors.
Please verify the intended behavior of these accessor getters. If the goal is to update specific fields within the objects or arrays, consider modifying those fields directly in the getter functions. If overwriting the entire property with a string is intentional, ensure that it aligns with the application's logic and won't cause issues elsewhere.
packages/vue-generator/src/generator/vue/sfc/generateAttribute.js
Outdated
Show resolved
Hide resolved
packages/vue-generator/test/testcases/sfc/accessor/expected/Accessor.vue
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
🧹 Nitpick comments (1)
packages/vue-generator/src/generator/vue/sfc/generateAttribute.js (1)
403-404
: Enhance string sanitization for defaultValue.The current string replacement might not handle all edge cases securely.
Consider using a more robust string sanitization approach:
- result.res = `${renderKey}"${value.defaultValue.replaceAll("'", "\\'").replaceAll(/"/g, "'")}"` + const sanitizedValue = value.defaultValue + .replace(/[&<>"']/g, (char) => ({ + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + })[char]) + result.res = `${renderKey}"${sanitizedValue}"`
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
packages/vue-generator/src/generator/vue/sfc/generateAttribute.js
(2 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: push-check
🔇 Additional comments (3)
packages/vue-generator/src/generator/vue/sfc/generateAttribute.js (3)
382-394
: LGTM! Null checks are properly implemented.The implementation correctly checks for the existence of accessor and its value before generating watchEffect statements. This prevents potential runtime errors from undefined values.
405-413
: LGTM! Special types handling is comprehensive.The implementation properly handles special types through the specialTypeHandler and maintains state binding flags appropriately.
462-465
: LGTM! Clean integration of accessor handling.The changes properly integrate the new accessor handling while maintaining the recursive nature of the transformation.
packages/vue-generator/src/generator/vue/sfc/generateAttribute.js
Outdated
Show resolved
Hide resolved
packages/vue-generator/src/generator/vue/sfc/generateAttribute.js
Outdated
Show resolved
Hide resolved
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (2)
packages/vue-generator/src/generator/vue/sfc/generateAttribute.js (2)
397-446
: Consider adding TypeScript types for better maintainability.The function correctly handles value transformation with proper string escaping and special type handling.
Consider adding TypeScript types for better code maintainability:
interface TransformResult { shouldBindToState: boolean; res: string | null; } interface GlobalHooks { addStatement: (statement: { position: string; value: string }) => void; } const transformObjValue = ( renderKey: string, value: any, globalHooks: GlobalHooks, config: Record<string, any>, transformObjType: (obj: any, globalHooks: GlobalHooks, config: Record<string, any>) => TransformResult ): TransformResult => { // ... existing implementation }
Line range hint
448-496
: Add error handling for malformed objects.The function correctly handles object transformation, but it could benefit from additional error handling.
Consider adding error handling for malformed objects:
export const transformObjType = (obj, globalHooks, config) => { + try { if (!obj || typeof obj !== 'object') { return { res: obj } } let resStr = [] let shouldBindToState = false let shouldRenderKey = !Array.isArray(obj) for (const [key, value] of Object.entries(obj)) { // ... existing implementation } return { shouldBindToState, res: Array.isArray(obj) ? `[${resStr.join(',')}]` : `{ ${resStr.join(',')} }` } + } catch (error) { + console.error('Error transforming object:', error) + return { + shouldBindToState: false, + res: '{}' + } + } }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
packages/vue-generator/src/generator/vue/sfc/generateAttribute.js
(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: push-check
🔇 Additional comments (2)
packages/vue-generator/src/generator/vue/sfc/generateAttribute.js (2)
380-395
:⚠️ Potential issueAdd missing imports for
vue
andwrap
utilities.The function correctly implements watchEffect for state accessors, but it's missing required imports.
Add these imports at the top of the file:
import { JS_EXPRESSION, JS_FUNCTION, JS_I18N, JS_RESOURCE, JS_SLOT, SPECIAL_UTILS_TYPE, INSERT_POSITION, TINY_ICON } from '@/constant' + import { wrap } from '@/utils' + import * as vue from 'vue'Likely invalid or redundant comment.
Line range hint
380-496
: Verify the changes fix the state accessor issue.The implementation aligns with the PR objective to fix state variable's getter and setter when default value is an expression.
Run this script to verify the fix:
✅ Verification successful
State accessor implementation verified successfully
The changes correctly implement watchEffect for state variable's getter and setter when default value is an expression. The implementation:
- Properly generates watchEffect statements for both getters and setters
- Correctly handles default values through transformObjValue()
- Maintains proper state binding through shouldBindToState flag
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash # Description: Check for state accessor usage with expression default values # Search for state accessor patterns ast-grep --pattern 'defaultValue: { type: "JSExpression", $$$ }' # Search for watchEffect usage rg -A 5 'watchEffect'Length of output: 68238
"defaultValue": { | ||
"type": "JSExpression", | ||
"value": "this.statusData", | ||
"computed": true |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
当前插件UI不支持computed吧,是不是只能用JSON方式手动输入进去?
} | ||
}, | ||
"editConfig": { | ||
"defaultValue": { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这属于高阶用法了,后面可以讨论下UI怎么跟随调整,官网文档也需要补充
English | 简体中文
PR
PR Checklist
Please check if your PR fulfills the following requirements:
PR Type
What kind of change does this PR introduce?
Background and solution
修复状态变量 state 有 getter、setter 的场景下,默认值为表达式的出码 bug。
What is the current behavior?
Issue Number: #977
What is the new behavior?
Does this PR introduce a breaking change?
Other information
Summary by CodeRabbit
Summary by CodeRabbit
New Features
IconPlusSquare
,editConfig
,status
, andbuttons
.watchEffect
.Improvements