Skip to content
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

feat:route code output #937

Merged
merged 7 commits into from
Dec 23, 2024

Conversation

lichunn
Copy link
Contributor

@lichunn lichunn commented Dec 16, 2024

English | 简体中文

PR

PR Checklist

Please check if your PR fulfills the following requirements:

  • The commit message follows our Commit Message Guidelines
  • Tests for the changes have been added (for bug fixes / features)
  • Docs have been added / updated (for bug fixes / features)
  • Built its own designer, fully self-validated

PR Type

What kind of change does this PR introduce?

  • Bugfix
  • Feature
  • Code style update (formatting, local variables)
  • Refactoring (no functional changes, no api changes)
  • Build related changes
  • CI related changes
  • Documentation content changes
  • Other... Please describe:

Background and solution

What is the current behavior?

Issue Number: N/A

What is the new behavior?

Does this PR introduce a breaking change?

  • Yes
  • No

Other information

Summary by CodeRabbit

  • New Features

    • Introduced the CanvasRouterView component for dynamic HTML element rendering.
    • Added a new routing component, RouterView, with a corresponding snippet for easy inclusion.
  • Bug Fixes

    • Enhanced error handling for function execution within the rendering process.
  • Refactor

    • Updated routing logic with new functions for flattening and converting routes.
  • Chores

    • Updated component exports to include the new CanvasRouterView.

Copy link
Contributor

coderabbitai bot commented Dec 16, 2024

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

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

packages/vue-generator/src/plugins/genRouterPlugin.js

Oops! Something went wrong! :(

ESLint: 8.57.1

Error: Cannot read config file: /packages/vue-generator/.eslintrc.cjs
Error: Cannot find module '@rushstack/eslint-patch/modern-module-resolution'
Require stack:

  • /packages/vue-generator/.eslintrc.cjs
  • /node_modules/.pnpm/@eslint+eslintrc@2.1.4/node_modules/@eslint/eslintrc/dist/eslintrc.cjs
  • /node_modules/.pnpm/eslint@8.57.1/node_modules/eslint/lib/cli-engine/cli-engine.js
  • /node_modules/.pnpm/eslint@8.57.1/node_modules/eslint/lib/eslint/eslint.js
  • /node_modules/.pnpm/eslint@8.57.1/node_modules/eslint/lib/eslint/index.js
  • /node_modules/.pnpm/eslint@8.57.1/node_modules/eslint/lib/cli.js
  • /node_modules/.pnpm/eslint@8.57.1/node_modules/eslint/bin/eslint.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:1248:15)
    at Module._load (node:internal/modules/cjs/loader:1074:27)
    at TracingChannel.traceSync (node:diagnostics_channel:315:14)
    at wrapModuleLoad (node:internal/modules/cjs/loader:217:24)
    at Module.require (node:internal/modules/cjs/loader:1339:12)
    at require (node:internal/modules/helpers:135:16)
    at Object. (/packages/vue-generator/.eslintrc.cjs:4:1)
    at Module._compile (node:internal/modules/cjs/loader:1546:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)
    at Module.load (node:internal/modules/cjs/loader:1317:32)

Walkthrough

This pull request introduces a new CanvasRouterView component and updates the routing generation logic across multiple files. The changes focus on enhancing the routing and rendering capabilities of the application, with modifications to the canvas render system and vue generator. The new component provides a flexible way to dynamically render HTML elements with routing functionality, while the routing plugin has been refactored to support more complex route structures and nested routing scenarios.

Changes

File Change Summary
packages/canvas/render/src/builtin/CanvasRouterView.vue Added new Vue component for dynamic HTML tag rendering with placeholder support
packages/canvas/render/src/builtin/builtin.json Added new "RouterView" component and snippet definition
packages/canvas/render/src/builtin/index.js Updated imports and exports to include CanvasRouterView
packages/canvas/render/src/render.js Added CanvasRouterView to component mapping and updated error handling
packages/vue-generator/src/plugins/genRouterPlugin.js Replaced parseSchema with flattenRoutes and convertToNestedRoutes functions for improved routing generation

Sequence Diagram

sequenceDiagram
    participant User
    participant CanvasRouterView
    participant CanvasPlaceholder
    
    User->>CanvasRouterView: Render with tag prop
    CanvasRouterView->>CanvasRouterView: Determine HTML tag
    alt No content in slot
        CanvasRouterView->>CanvasPlaceholder: Display placeholder
    else Content exists
        CanvasRouterView->>User: Render with provided content
    end
Loading

Possibly related PRs

Suggested labels

enhancement, refactor-main

Suggested reviewers

  • rhlin
  • hexqi

Poem

🐰 A router's dance, a Vue delight,
Rendering tags with magical might
Placeholders bloom where content sleeps
Dynamic paths where creativity leaps
Code hops forward, with rabbit's glee! 🌈

Tip

CodeRabbit's docstrings feature is now available as part of our Early Access Program! Simply use the command @coderabbitai generate docstrings to have CodeRabbit automatically generate docstrings for your pull request. We would love to hear your feedback on Discord.


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?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@gene9831
Copy link
Collaborator

@coderabbitai review

Copy link
Contributor

coderabbitai bot commented Dec 20, 2024

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Contributor

@coderabbitai coderabbitai bot left a 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

🔭 Outside diff range comments (2)
packages/vue-generator/src/plugins/genRouterPlugin.js (1)

Line range hint 97-115: Consider adding configurable routing modes.
The TODO comment at line 117 references supporting "hash" vs. "history" modes. Currently, "createWebHashHistory" is hard-coded. Exposing a plugin option to toggle between hash and history modes might be helpful for different deployment contexts.

 const exportSnippet = `
 export default createRouter({
-  history: createWebHashHistory(),
+  history: ${/* e.g., pass in an option or fallback to hash mode */ 'createWebHistory()'},
   routes
 })`
packages/canvas/render/src/render.js (1)

Line range hint 191-234: Enhance error handling robustness

While the current implementation handles both sync and async errors, there are opportunities for improvement:

  1. Error messages could be more specific
  2. The default response structure assumes table data format
  3. The sourceId check logic could be simplified

Consider this improved implementation:

 export const generateFn = (innerFn, context) => {
   return (...args) => {
-    // 如果有数据源标识,则表格的fetchData返回数据源的静态数据
-    const sourceId = collectionMethodsMap[innerFn.realName || innerFn.name]
-    if (sourceId) {
-      return innerFn.call(context, ...args)
-    } else {
-      let result = null
+    const sourceId = collectionMethodsMap[innerFn.realName || innerFn.name];
+    let result = null;
 
-      // 这里是为了兼容用户写法报错导致画布异常,但无法捕获promise内部的异常
-      try {
-        result = innerFn.call(context, ...args)
-      } catch (error) {
-        globalNotify({
-          type: 'warning',
-          title: `函数:${innerFn.name}执行报错`,
-          message: error?.message || `函数:${innerFn.name}执行报错,请检查语法`
-        })
-      }
+    try {
+      result = innerFn.call(context, ...args);
+    } catch (error) {
+      const fnName = innerFn.name || 'Anonymous';
+      globalNotify({
+        type: 'warning',
+        title: `Synchronous Execution Error in ${fnName}`,
+        message: error?.message || 'Syntax error detected'
+      });
+      return sourceId ? null : {};
+    }
 
-      // 这里注意如果innerFn返回的是一个promise则需要捕获异常,重新返回默认一条空数据
-      if (result.then) {
-        result = new Promise((resolve) => {
-          result.then(resolve).catch((error) => {
-            globalNotify({
-              type: 'warning',
-              title: '异步函数执行报错',
-              message: error?.message || '异步函数执行报错,请检查语法'
-            })
-            // 这里需要至少返回一条空数据,方便用户使用表格默认插槽
-            resolve({
-              result: [{}],
-              page: { total: 1 }
-            })
-          })
-        })
-      }
+    if (result?.then) {
+      return result.catch((error) => {
+        const fnName = innerFn.name || 'Anonymous';
+        globalNotify({
+          type: 'warning',
+          title: `Asynchronous Execution Error in ${fnName}`,
+          message: error?.message || 'Promise rejection occurred'
+        });
+        return sourceId ? null : {};
+      });
+    }
 
-      return result
-    }
+    return result;
   }
 }

Key improvements:

  1. More descriptive error messages distinguishing sync vs async errors
  2. Simplified control flow by removing nested conditions
  3. Consistent error response format regardless of source
  4. Added function name to error messages for better debugging
🧹 Nitpick comments (4)
packages/vue-generator/src/plugins/genRouterPlugin.js (1)

42-94: Ensure stable sorting and consistent router usage.
In "convertToNestedRoutes", the array is sorted with a simple comparison on "meta.router.length". This might be acceptable but be aware that JavaScript’s sort is not guaranteed to be stable, and items with the same length could be reordered unpredictably. If the route order is essential, consider using a stable sort or adding tie-break logic.

packages/canvas/render/src/builtin/CanvasRouterView.vue (2)

1-7: Validate prop "tag" usage.
Rendering dynamic tags is flexible but can raise accessibility or SEO concerns if misused (e.g., using headings incorrectly). Consider documenting recommended tag usage or adding a console warning when using unusual tags.

Would you like an example snippet in the docs explaining best practices when selecting an HTML tag?


9-21: Potential enhancement: watch for changes in "$attrs".
Currently, the component binds all attributes to the rendered element, which is great for flexibility, but if $attrs like "placeholder" changes at runtime, you could add watchers to handle side effects or re-renders if necessary.

packages/canvas/render/src/builtin/builtin.json (1)

5-61: Confirm "RouterView" icon usage.
Using the "Box" icon for RouterView could be confusing from a UX standpoint. Consider a more descriptive icon for clarity (e.g., "Router" or "Flow" icon).

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0c3c989 and 6727241.

📒 Files selected for processing (5)
  • packages/canvas/render/src/builtin/CanvasRouterView.vue (1 hunks)
  • packages/canvas/render/src/builtin/builtin.json (2 hunks)
  • packages/canvas/render/src/builtin/index.js (1 hunks)
  • packages/canvas/render/src/render.js (2 hunks)
  • packages/vue-generator/src/plugins/genRouterPlugin.js (2 hunks)
🔇 Additional comments (5)
packages/vue-generator/src/plugins/genRouterPlugin.js (1)

8-40: Check for robust validation of "route" object properties.
The new "flattenRoutes" function relies on "route.path", "route.component", and "route.children". If any of these properties are missing or incorrect, it could lead to errors (e.g., ".find" on undefined). Consider adding validations or safe optional chaining to handle cases where these properties may be missing.

Would you like a script that scans your codebase to find any usage of "flattenRoutes" that might pass in incomplete route objects?

packages/canvas/render/src/builtin/index.js (1)

20-31: Imports and export look correct.
The addition of "CanvasRouterView" is consistent with existing naming and export patterns for built-in components. No issues found.

packages/canvas/render/src/builtin/builtin.json (1)

518-528: Snippet alignment with the new component.
The snippet for "RouterView" references your new component. This looks correct and consistent, ensuring quick insertion. Just remember to add relevant user-facing documentation describing how to configure the newly introduced RouterView component from this snippet.

packages/canvas/render/src/render.js (2)

31-32: LGTM: Component registration is consistent

The new components CanvasPlaceholder and CanvasRouterView are properly registered in both the imports and the Mapper object, following the established pattern.

Also applies to: 73-74


Line range hint 401-405: Verify the special case handling for CanvasPlaceholder

The early return of empty props for CanvasPlaceholder needs verification:

  1. Why does CanvasPlaceholder require special handling?
  2. Could this hide potential issues with prop binding?
  3. Are there any side effects of skipping the standard prop processing?

Let's analyze the usage of CanvasPlaceholder:

✅ Verification successful

Let me gather more information about the CanvasPlaceholder component itself:


Based on the gathered information, I can now provide the final response:

Special case for CanvasPlaceholder is justified and safe

The special case handling of CanvasPlaceholder with empty props is correct because:

  1. CanvasPlaceholder is a simple presentational component that only accepts an optional placeholder prop with a default value
  2. It serves as a drop target container in the canvas system, used by multiple parent components (CanvasBox, CanvasCollection, CanvasSlot, CanvasRouterView)
  3. The empty props return ({}) aligns with its minimal interface, preventing unnecessary prop processing for this utility component
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Find all usages of CanvasPlaceholder to understand its context
echo "Searching for CanvasPlaceholder component definition..."
ast-grep --pattern 'class CanvasPlaceholder {
  $$$
}'

echo "Searching for CanvasPlaceholder usage in templates..."
rg -A 5 'CanvasPlaceholder'

echo "Searching for places where CanvasPlaceholder is injected..."
ast-grep --pattern 'componentName: "CanvasPlaceholder"'

Length of output: 5405


Script:

#!/bin/bash
# Check the CanvasPlaceholder.vue implementation
echo "Content of CanvasPlaceholder.vue:"
cat packages/canvas/render/src/builtin/CanvasPlaceholder.vue

# Find where it's used in templates
echo -e "\nSearching for CanvasPlaceholder template usage:"
rg -l '<CanvasPlaceholder' packages/canvas/render/src/

# Look for any props passed to CanvasPlaceholder
echo -e "\nSearching for props passed to CanvasPlaceholder:"
rg -A 2 '<CanvasPlaceholder.*?>' 

Length of output: 854

@rhlin rhlin merged commit 3ac010b into opentiny:feat/router-page Dec 23, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants