-
Notifications
You must be signed in to change notification settings - Fork 4.9k
feat(taro-plugin-generator): 新增配置生成器插件 #17886
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
Conversation
Walkthrough本次更新主要引入了全新的 Changes
Sequence Diagram(s)sequenceDiagram
participant 用户
participant CLI
participant @tarojs/plugin-generator
participant 项目文件系统
用户->>CLI: 运行 "taro new"
CLI->>@tarojs/plugin-generator: 调用插件 "new" 命令
@tarojs/plugin-generator->>用户: 交互式选择(Tailwind CSS / ES5)
用户-->>@tarojs/plugin-generator: 选择功能
alt 选择 Tailwind CSS
@tarojs/plugin-generator->>项目文件系统: 修改配置、写入依赖、注入入口
else 选择 ES5
@tarojs/plugin-generator->>项目文件系统: 修改配置、写入依赖
end
@tarojs/plugin-generator->>CLI: 输出成功信息
Suggested reviewers
Poem
✨ Finishing Touches
🧪 Generate Unit Tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. 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 (
|
33c63cc
to
2ac92ff
Compare
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: 9
🧹 Nitpick comments (13)
packages/taro-plugin-generator/src/index.ts (1)
17-20
: 简化选择项对象的定义当前的
choices
对象定义略显冗余,可以直接使用字符串字面量来提高代码简洁性。- const choices = { - tailwindcss: 'tailwindcss', - es5: 'es5', - } + const choices = ['tailwindcss', 'es5'] as const然后相应更新使用方式:
- case choices.tailwindcss: { + case 'tailwindcss': { - case choices.es5: { + case 'es5': {packages/taro-plugin-generator/src/generators/tailwindcss/deps.ts (1)
10-10
: 考虑将版本号提取为常量硬编码的版本号可能需要频繁更新,建议提取为常量以便维护。
+const TAILWINDCSS_VERSIONS = { + '3x': '3.4.17', + '4x': '^4.1.7' +} as const + +const WEAPP_TAILWINDCSS_VERSION = '^4.1.7' +const TAILWINDCSS_POSTCSS_VERSION = '^4.1.7' const getDeps = (version: TailwindCSSVersion): Deps => { const deps: Deps = { devDependencies: { - tailwindcss: version === '4x' ? '^4.1.7' : '3.4.17', + tailwindcss: TAILWINDCSS_VERSIONS[version], - 'weapp-tailwindcss': '^4.1.7', + 'weapp-tailwindcss': WEAPP_TAILWINDCSS_VERSION, - '@tailwindcss/postcss': '^4.1.7', + '@tailwindcss/postcss': TAILWINDCSS_POSTCSS_VERSION, }, } return deps }packages/taro-plugin-generator/src/utils/ast.ts (1)
15-17
: 类型断言可以更加安全当前的类型断言假设找到的属性一定是
ObjectProperty
,建议添加更严格的类型检查。- const prop = current.properties.find((p) => t.isObjectProperty(p) && t.isIdentifier(p.key, { name: key })) as - | t.ObjectProperty - | undefined + const prop = current.properties.find((p) => + t.isObjectProperty(p) && t.isIdentifier(p.key, { name: key }) + ) as t.ObjectProperty | undefinedpackages/taro-plugin-generator/src/generators/es5/index.ts (1)
15-32
: 函数实现逻辑正确但可以优化
updateBrowserList
函数的实现逻辑正确,但可以考虑以下改进:
- 将浏览器目标配置提取为常量
- 添加更详细的错误处理
+const BROWSER_TARGETS = { + BROWSERSLISTRC_CONTENT: 'last 3 versions\nAndroid >= 4.1\nios >= 8\n', + DEVELOPMENT: ['defaults and fully supports es6-module', 'maintained node versions'], + PRODUCTION: ['last 3 versions', 'Android >= 4.1', 'ios >= 8'] +} as const async function updateBrowserList(ctx: IPluginContext) { const { fs } = ctx.helper const browserslistrc = `${ctx.paths.appPath}/.browserslistrc` if (await fs.pathExists(browserslistrc)) { - await fs.writeFile(browserslistrc, 'last 3 versions\nAndroid >= 4.1\nios >= 8\n', { encoding: 'utf-8', flag: 'w' }) + await fs.writeFile(browserslistrc, BROWSER_TARGETS.BROWSERSLISTRC_CONTENT, { encoding: 'utf-8', flag: 'w' }) return } const pkgJson = readPkgJson(ctx) pkgJson.browserslist = { - development: ['defaults and fully supports es6-module', 'maintained node versions'], + development: BROWSER_TARGETS.DEVELOPMENT, - production: ['last 3 versions', 'Android >= 4.1', 'ios >= 8'], + production: BROWSER_TARGETS.PRODUCTION, } // ... rest of the function }packages/taro-plugin-generator/package.json (2)
16-16
: 建议填写 homepage 字段homepage 字段当前为空字符串,建议填写为项目的 GitHub 页面或文档地址。
- "homepage": "", + "homepage": "https://github.com/NervJS/taro#readme",
35-38
: 考虑使用版本范围而非固定版本Babel 相关依赖使用了固定版本(如 "7.24.4"),这可能导致与其他包的版本兼容性问题。建议使用 caret 范围(如 "^7.24.4")以允许兼容的补丁更新。
- "@babel/generator": "7.24.4", - "@babel/parser": "7.24.4", - "@babel/traverse": "7.24.1", - "@babel/types": "7.24.0", + "@babel/generator": "^7.24.4", + "@babel/parser": "^7.24.4", + "@babel/traverse": "^7.24.1", + "@babel/types": "^7.24.0",packages/taro-plugin-generator/src/generators/es5/config.ts (1)
77-90
: 考虑提取正则表达式为常量以提高可维护性正则表达式较为复杂,建议提取为命名常量以提高代码可读性和维护性。
+const NODE_MODULES_INCLUDE_PATTERN = String.raw`node_modules\/(?!(.pnpm|@babel|core-js|style-loader|css-loader|react|react-dom))(@?[^/]+)`; + const include = t.arrowFunctionExpression( [t.identifier('filename')], t.callExpression( t.memberExpression( - t.regExpLiteral( - String.raw`node_modules\/(?!(.pnpm|@babel|core-js|style-loader|css-loader|react|react-dom))(@?[^/]+)`, - '' - ), + t.regExpLiteral(NODE_MODULES_INCLUDE_PATTERN, ''), t.identifier('test') ), [t.identifier('filename')] ) )packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts (1)
144-146
: 考虑国际化支持错误消息使用了中文,这可能会影响国际用户的使用体验。建议使用英文或支持多语言。
if (!entryPath) { - throw new Error('❌ 找不到入口文件') + throw new Error('Entry file not found (app.ts/tsx/js/jsx)') }packages/taro-plugin-generator/src/generators/tailwindcss/config.ts (5)
28-28
: 统一日志语言以支持国际化控制台输出使用了中文,建议使用英文或提供多语言支持。
- console.log('✅ 更新配置文件成功\n') + console.log('✅ Config file updated successfully\n')
215-242
: 错误消息需要国际化支持错误消息中包含大量中文注释和说明,这会影响非中文用户的使用体验。建议提供英文版本或支持多语言。
考虑将错误消息提取到单独的语言文件中,或至少提供英文版本:
message: dedent(` import { UnifiedWebpackPluginV5 } from 'weapp-tailwindcss/webpack' { - // 找到 mini 这个配置 + // Find the 'mini' configuration mini: { // postcss: { /*...*/ }, - // 中的 webpackChain, 通常紧挨着 postcss + // Add webpackChain, usually next to postcss webpackChain(chain, webpack) { - // 复制这块区域到你的配置代码中 + // Copy this section to your config chain.merge({ plugin: { install: { plugin: UnifiedWebpackPluginV5, args: [{ - // 这里可以传参数 + // Configuration options rem2rpx: true, }] } } }) } } } `),
260-268
: 代码模板中的注释需要国际化生成的代码包含中文注释,这可能会让非中文用户困惑。
function createUnifiedVitePluginNode() { const code = ` ${alias.get(importPluginName) ?? importPluginName}({ - // rem转rpx + // Convert rem to rpx rem2rpx: true, - // 除了小程序这些,其他平台都 disable + // Disable for non-miniapp platforms disabled: process.env.TARO_ENV === 'h5' || process.env.TARO_ENV === 'harmony' || process.env.TARO_ENV === 'rn', - // 由于 taro vite 默认会移除所有的 tailwindcss css 变量,所以一定要开启这个配置,进行css 变量的重新注入 + // Enable CSS variable injection as Taro Vite removes Tailwind CSS variables by default injectAdditionalCssVarScope: true, }) ` return parser.parseExpression(code) as t.CallExpression }
274-281
: PostCSS 插件加载器的注释也需要国际化function createPostcssPluginNode(): t.ObjectExpression { const code = ` { name: 'postcss-config-loader-plugin', config(config) { - // 加载 tailwindcss + // Load tailwindcss if (typeof config.css?.postcss === 'object') { config.css?.postcss.plugins?.unshift(tailwindcss()) } }, } ` return parser.parseExpression(code) as t.ObjectExpression }
379-409
: Vite 配置错误消息需要英文版本与 webpack5 配置类似,错误消息应该提供英文版本。
message: dedent(` import tailwindcss from 'tailwindcss'; import { UnifiedViteWeappTailwindcssPlugin } from 'weapp-tailwindcss/vite' { - // ... 其他配置 + // ... other configurations compiler: { type: 'vite', vitePlugins: [ { name: 'postcss-config-loader-plugin', config(config) { if (typeof config.css?.postcss === 'object') { config.css?.postcss.plugins?.unshift(tailwindcss()) } }, }, UnifiedViteWeappTailwindcssPlugin({ rem2rpx: true, disabled: process.env.TARO_ENV === 'h5' || process.env.TARO_ENV === 'harmony' || process.env.TARO_ENV === 'rn', injectAdditionalCssVarScope: true, }) ] - // ... 其他配置 + // ... other configurations } } `),
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
pnpm-lock.yaml
is excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (17)
packages/taro-cli/templates/default/config/index.js
(1 hunks)packages/taro-cli/templates/default/package.json.tmpl
(2 hunks)packages/taro-cli/tsconfig.json
(1 hunks)packages/taro-plugin-generator/package.json
(1 hunks)packages/taro-plugin-generator/src/generators/es5/babel.ts
(1 hunks)packages/taro-plugin-generator/src/generators/es5/config.ts
(1 hunks)packages/taro-plugin-generator/src/generators/es5/index.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/config.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/deps.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/index.ts
(1 hunks)packages/taro-plugin-generator/src/index.ts
(1 hunks)packages/taro-plugin-generator/src/types/define.d.ts
(1 hunks)packages/taro-plugin-generator/src/utils/ast.ts
(1 hunks)packages/taro-plugin-generator/src/utils/error.ts
(1 hunks)packages/taro-plugin-generator/src/utils/index.ts
(1 hunks)packages/taro-plugin-generator/tsconfig.json
(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (1)
- GitHub Check: Build Rust Binding / stable - aarch64-apple-darwin
🔇 Additional comments (16)
packages/taro-cli/templates/default/config/index.js (1)
20-22
: 插件集成正确!将
@tarojs/plugin-generator
添加到插件数组中的实现是正确的,这使得新创建的 Taro 项目能够使用插件生成器功能。packages/taro-cli/tsconfig.json (1)
10-10
: 验证类型声明限制的影响添加
"types": []
会阻止 TypeScript 自动包含任何 @types 包。请确认这不会破坏现有代码中对常用类型声明包的依赖。运行以下脚本验证是否有代码依赖于自动包含的类型声明:
#!/bin/bash # 描述:检查 taro-cli 源码中是否使用了需要 @types 包的代码 # 预期:找出可能受 types: [] 配置影响的代码 # 搜索可能需要类型声明的 Node.js 相关代码 rg -A 3 "process\.|Buffer\.|__dirname|__filename" packages/taro-cli/src/ # 检查是否有导入 Node.js 内置模块但可能需要类型声明的代码 rg -A 2 "import.*from ['\"]fs['\"]|import.*from ['\"]path['\"]|import.*from ['\"]os['\"]" packages/taro-cli/src/packages/taro-cli/templates/default/package.json.tmpl (2)
13-13
: 新增脚本命令正确!添加
"new": "taro new"
脚本为用户提供了便捷的方式来使用插件生成器功能。
85-85
: 条件依赖添加合理!仅在 Webpack5 编译器下添加
@tarojs/plugin-generator
依赖的条件逻辑是合理的,这表明该插件可能专门针对 Webpack5 编译器设计。packages/taro-plugin-generator/tsconfig.json (1)
1-20
: TypeScript 配置符合最佳实践!新增的 TypeScript 配置文件设置合理,使用了现代的编译目标 (ESNext)、适当的模块系统 (CommonJS),并正确配置了输出、源码映射和类型声明文件的生成。包含和排除规则也设置得当。
packages/taro-plugin-generator/src/generators/tailwindcss/index.ts (1)
12-31
: 生成器函数逻辑清晰!整体的生成器函数结构合理,用户交互设计良好,操作序列(配置更新 -> 文件生成 -> 依赖更新)逻辑清晰。中文用户界面也很友好。
packages/taro-plugin-generator/src/index.ts (1)
34-38
: 异步错误处理实现良好正确使用了
safely
包装器来处理生成器函数的异步错误,这是一个良好的错误处理实践。packages/taro-plugin-generator/src/utils/ast.ts (1)
3-8
: 文档注释完善且清晰JSDoc 文档清晰地描述了函数的用途、参数和返回值,有助于其他开发者理解和使用。
packages/taro-plugin-generator/src/generators/es5/index.ts (1)
8-13
: 生成器函数结构清晰函数按照逻辑顺序执行三个主要步骤,并在完成后提供用户反馈,这是一个良好的实现模式。
packages/taro-plugin-generator/src/generators/es5/config.ts (1)
38-65
: 实现逻辑正确且错误处理完善updateConfig 函数的实现逻辑清晰,正确处理了配置文件的 AST 解析和更新。错误处理机制完善,能够在配置更新失败时提供有用的错误信息。
packages/taro-plugin-generator/src/utils/error.ts (2)
10-20
: 错误类设计合理GeneratorError 类的设计很好,扩展了原生 Error 并添加了类型和目标文件信息,便于错误处理和用户提示。
26-64
: 安全执行函数实现完善safely 函数提供了优雅的错误处理机制,支持自定义错误处理和回退值。错误信息的中文提示对用户友好,有助于快速定位和解决问题。
packages/taro-plugin-generator/src/generators/es5/babel.ts (1)
165-241
: 预设处理逻辑实现完善handlePresets 函数很好地处理了各种 Babel 预设配置模式,包括字符串、数组和变量引用等情况。代码逻辑清晰,覆盖了常见的配置场景。
packages/taro-plugin-generator/src/utils/index.ts (2)
69-84
: 包管理器检测逻辑实现良好installDeps 函数正确检测了 pnpm、yarn 和 npm,优先级设置合理。这种自动检测方式提升了用户体验。
48-53
: ```shell
#!/bin/bash查看 PackageJson 类型定义
sed -n '1,200p' packages/taro-plugin-generator/src/types/define.d.ts
查看 utils/index.ts 文件头部是否有导入 PackageJson
sed -n '1,200p' packages/taro-plugin-generator/src/utils/index.ts
</details> <details> <summary>packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts (1)</summary> `14-16`: **代码实现合理** 使用 `Promise.all` 并发执行三个独立任务是正确的做法,可以提高执行效率。 </details> </blockquote></details> </details> <!-- This is an auto-generated comment by CodeRabbit for review status -->
await updateConfig({ ctx, compilerType }) | ||
await emit(ctx) | ||
await updateDeps({ ctx, tailwindcssVersion }) |
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.
🛠️ Refactor suggestion
建议增强错误处理
虽然对编译器类型进行了错误处理,但 updateConfig
、emit
和 updateDeps
这些异步操作缺少错误处理。建议添加 try-catch 块以提供更好的用户体验。
await updateConfig({ ctx, compilerType })
-await emit(ctx)
-await updateDeps({ ctx, tailwindcssVersion })
-console.log('✅ 启用「Tailwind CSS」成功')
+try {
+ await emit(ctx)
+ await updateDeps({ ctx, tailwindcssVersion })
+ console.log('✅ 启用「Tailwind CSS」成功')
+} catch (error) {
+ console.error('❌ 启用 Tailwind CSS 失败:', error.message)
+ throw error
+}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
await updateConfig({ ctx, compilerType }) | |
await emit(ctx) | |
await updateDeps({ ctx, tailwindcssVersion }) | |
await updateConfig({ ctx, compilerType }) | |
try { | |
await emit(ctx) | |
await updateDeps({ ctx, tailwindcssVersion }) | |
console.log('✅ 启用「Tailwind CSS」成功') | |
} catch (error) { | |
console.error('❌ 启用 Tailwind CSS 失败:', error.message) | |
throw error | |
} |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/tailwindcss/index.ts around
lines 27 to 29, the asynchronous calls to updateConfig, emit, and updateDeps
lack error handling. Wrap these calls in a try-catch block to catch any errors
thrown during their execution and handle them appropriately, such as logging the
error or providing user-friendly feedback, to improve robustness and user
experience.
{ name: '4.x', value: '4x' }, | ||
], | ||
}) | ||
const tailwindcssVersion = answer.version as TailwindCSSVersion |
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.
缺少类型导入!
代码中使用了 TailwindCSSVersion
类型,但没有导入该类型定义。这会导致 TypeScript 编译错误。
请添加对应的类型导入:
+import type { TailwindCSSVersion } from '../../types/define'
import type { IPluginContext } from '@tarojs/service'
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
const tailwindcssVersion = answer.version as TailwindCSSVersion | |
import type { TailwindCSSVersion } from '../../types/define' | |
import type { IPluginContext } from '@tarojs/service' | |
const tailwindcssVersion = answer.version as TailwindCSSVersion | |
// …rest of the code unchanged |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/tailwindcss/index.ts at line
22, the type TailwindCSSVersion is used but not imported, causing a TypeScript
compilation error. Fix this by adding an import statement for TailwindCSSVersion
from its appropriate module at the top of the file.
const getDeps = (version: TailwindCSSVersion): Deps => { | ||
const deps: Deps = { | ||
devDependencies: { | ||
tailwindcss: version === '4x' ? '^4.1.7' : '3.4.17', | ||
'weapp-tailwindcss': '^4.1.7', | ||
'@tailwindcss/postcss': '^4.1.7', | ||
}, | ||
} | ||
|
||
return deps | ||
} |
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.
缺少类型定义的导入声明
代码中使用了 TailwindCSSVersion
、Deps
和 PackageJson
类型,但没有导入相关的类型定义。
+import type { TailwindCSSVersion, Deps, PackageJson } from '../../types/define'
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
const getDeps = (version: TailwindCSSVersion): Deps => { | |
const deps: Deps = { | |
devDependencies: { | |
tailwindcss: version === '4x' ? '^4.1.7' : '3.4.17', | |
'weapp-tailwindcss': '^4.1.7', | |
'@tailwindcss/postcss': '^4.1.7', | |
}, | |
} | |
return deps | |
} | |
import type { TailwindCSSVersion, Deps, PackageJson } from '../../types/define' | |
const getDeps = (version: TailwindCSSVersion): Deps => { | |
const deps: Deps = { | |
devDependencies: { | |
tailwindcss: version === '4x' ? '^4.1.7' : '3.4.17', | |
'weapp-tailwindcss': '^4.1.7', | |
'@tailwindcss/postcss': '^4.1.7', | |
}, | |
} | |
return deps | |
} |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/tailwindcss/deps.ts around
lines 7 to 17, the types TailwindCSSVersion, Deps, and PackageJson are used but
not imported. Add appropriate import statements at the top of the file to import
these type definitions from their respective modules to ensure proper type
checking and avoid TypeScript errors.
interface Deps { | ||
dependencies?: Record<string, string> | ||
devDependencies?: Record<string, string> | ||
peerDependencies?: Record<string, string> | ||
} | ||
|
||
interface PackageJson extends Deps { | ||
scripts?: Record<string, string> | ||
} | ||
|
||
type TailwindCSSVersion = '3x' | '4x' | ||
|
||
type CompilerType = 'webpack5' | 'vite' |
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.
类型定义需要导出以供其他模块使用
所有类型定义都缺少 export
关键字,这会导致其他文件无法导入使用这些类型。
-interface Deps {
+export interface Deps {
dependencies?: Record<string, string>
devDependencies?: Record<string, string>
peerDependencies?: Record<string, string>
}
-interface PackageJson extends Deps {
+export interface PackageJson extends Deps {
scripts?: Record<string, string>
}
-type TailwindCSSVersion = '3x' | '4x'
+export type TailwindCSSVersion = '3x' | '4x'
-type CompilerType = 'webpack5' | 'vite'
+export type CompilerType = 'webpack5' | 'vite'
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
interface Deps { | |
dependencies?: Record<string, string> | |
devDependencies?: Record<string, string> | |
peerDependencies?: Record<string, string> | |
} | |
interface PackageJson extends Deps { | |
scripts?: Record<string, string> | |
} | |
type TailwindCSSVersion = '3x' | '4x' | |
type CompilerType = 'webpack5' | 'vite' | |
export interface Deps { | |
dependencies?: Record<string, string> | |
devDependencies?: Record<string, string> | |
peerDependencies?: Record<string, string> | |
} | |
export interface PackageJson extends Deps { | |
scripts?: Record<string, string> | |
} | |
export type TailwindCSSVersion = '3x' | '4x' | |
export type CompilerType = 'webpack5' | 'vite' |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/types/define.d.ts lines 1 to 13, the
interfaces and types are missing the export keyword, preventing them from being
imported in other modules. Add the export keyword before each interface and type
declaration to make them available for import elsewhere.
export function readPkgJson(ctx: IPluginContext) { | ||
const { appPath } = ctx.paths | ||
const pkgPath = path.join(appPath, 'package.json') | ||
const pkgJson = require(pkgPath) | ||
return pkgJson | ||
} |
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.
🛠️ Refactor suggestion
建议使用 fs.readJSON 替代 require
使用 require()
读取 JSON 文件可能会导致缓存问题,且缺少错误处理。建议使用 fs.readJSON
以获得更好的错误处理和类型安全。
-export function readPkgJson(ctx: IPluginContext) {
+export async function readPkgJson(ctx: IPluginContext) {
const { appPath } = ctx.paths
const pkgPath = path.join(appPath, 'package.json')
- const pkgJson = require(pkgPath)
+ const pkgJson = await ctx.helper.fs.readJSON(pkgPath)
return pkgJson
}
注意:此更改需要更新所有调用 readPkgJson
的地方以处理返回的 Promise。
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/utils/index.ts lines 41 to 46, replace the
synchronous require call for reading package.json with fs.readJSON to avoid
caching issues and improve error handling. Modify readPkgJson to be an async
function that returns a Promise resolving to the JSON content. Also, update all
call sites of readPkgJson to handle the returned Promise appropriately using
async/await or then.
} catch { | ||
throw new GeneratorError({ | ||
type: GeneratorErrorType.emitFile, | ||
targetFile: configPath ?? 'postcss.config.mjs', | ||
message: code, | ||
}) | ||
} |
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.
🛠️ Refactor suggestion
改进错误处理以提供更好的调试信息
当前的 catch 块捕获所有错误但没有区分错误类型。建议记录原始错误信息以便调试。
- } catch {
+ } catch (error) {
throw new GeneratorError({
type: GeneratorErrorType.emitFile,
targetFile: configPath ?? 'postcss.config.mjs',
- message: code,
+ message: `Failed to update PostCSS config: ${error instanceof Error ? error.message : String(error)}`,
})
}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
} catch { | |
throw new GeneratorError({ | |
type: GeneratorErrorType.emitFile, | |
targetFile: configPath ?? 'postcss.config.mjs', | |
message: code, | |
}) | |
} | |
} catch (error) { | |
throw new GeneratorError({ | |
type: GeneratorErrorType.emitFile, | |
targetFile: configPath ?? 'postcss.config.mjs', | |
message: `Failed to update PostCSS config: ${error instanceof Error ? error.message : String(error)}`, | |
}) | |
} |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts between
lines 95 and 101, the catch block throws a GeneratorError without including the
original error details. Modify the catch block to capture the caught error
object and include its message or stack trace in the GeneratorError, so that the
error handling provides more informative debugging information.
} catch { | ||
throw new GeneratorError({ | ||
type: GeneratorErrorType.emitFile, | ||
targetFile: outputPath, | ||
message: `@import "weapp-tailwindcss";`, | ||
}) | ||
} |
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.
🛠️ Refactor suggestion
统一错误处理模式
与上面的函数类似,建议改进错误处理以提供更好的调试信息。
- } catch {
+ } catch (error) {
throw new GeneratorError({
type: GeneratorErrorType.emitFile,
targetFile: outputPath,
- message: `@import "weapp-tailwindcss";`,
+ message: `Failed to emit Tailwind CSS file: ${error instanceof Error ? error.message : String(error)}`,
})
}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
} catch { | |
throw new GeneratorError({ | |
type: GeneratorErrorType.emitFile, | |
targetFile: outputPath, | |
message: `@import "weapp-tailwindcss";`, | |
}) | |
} | |
} catch (error) { | |
throw new GeneratorError({ | |
type: GeneratorErrorType.emitFile, | |
targetFile: outputPath, | |
message: `Failed to emit Tailwind CSS file: ${error instanceof Error ? error.message : String(error)}`, | |
}) | |
} |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts between
lines 119 and 125, the catch block throws a GeneratorError without capturing the
original error details. Modify the catch block to catch the error object and
include its message or stack trace in the GeneratorError message to provide
better debugging information, following the error handling pattern used in the
other functions.
try { | ||
await fs.writeFile(entryPath, updatedContent, { encoding: 'utf-8' }) | ||
} catch { | ||
throw new GeneratorError({ | ||
type: GeneratorErrorType.emitFile, | ||
targetFile: entryPath, | ||
message: importStatement, | ||
}) | ||
} |
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.
🛠️ Refactor suggestion
保持错误处理的一致性
建议与其他函数保持一致的错误处理模式。
try {
await fs.writeFile(entryPath, updatedContent, { encoding: 'utf-8' })
- } catch {
+ } catch (error) {
throw new GeneratorError({
type: GeneratorErrorType.emitFile,
targetFile: entryPath,
- message: importStatement,
+ message: `Failed to inject Tailwind CSS import: ${error instanceof Error ? error.message : String(error)}`,
})
}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
try { | |
await fs.writeFile(entryPath, updatedContent, { encoding: 'utf-8' }) | |
} catch { | |
throw new GeneratorError({ | |
type: GeneratorErrorType.emitFile, | |
targetFile: entryPath, | |
message: importStatement, | |
}) | |
} | |
try { | |
await fs.writeFile(entryPath, updatedContent, { encoding: 'utf-8' }) | |
} catch (error) { | |
throw new GeneratorError({ | |
type: GeneratorErrorType.emitFile, | |
targetFile: entryPath, | |
message: `Failed to inject Tailwind CSS import: ${error instanceof Error ? error.message : String(error)}`, | |
}) | |
} |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts around
lines 157 to 165, the catch block for the writeFile operation lacks an error
parameter and does not follow the consistent error handling pattern used in
other functions. Modify the catch block to accept the error object, then pass
this error information into the GeneratorError to maintain consistent error
handling and improve debugging.
2ac92ff
to
904c136
Compare
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: 9
♻️ Duplicate comments (1)
packages/taro-plugin-generator/src/generators/es5/babel.ts (1)
80-101
: 修复 Babel 配置模板中的语法错误在创建新的 babel.config.js 文件时,模板中存在语法错误:
module.exports
对象内部多了一层花括号。await fs.writeFile( babelConfigPath, dedent(` module.exports = { - { - presets: [ - [ - 'taro', - { - framework: 'react', - ts: true, - compiler: 'vite', - ${USE_BUILT_INS}: process.env.TARO_ENV === 'h5' ? 'usage' : false - } - ] - ] - } + presets: [ + [ + 'taro', + { + framework: 'react', + ts: true, + compiler: 'vite', + ${USE_BUILT_INS}: process.env.TARO_ENV === 'h5' ? 'usage' : false + } + ] + ] } `), { encoding: 'utf-8', flag: 'w' } )
🧹 Nitpick comments (10)
packages/taro-plugin-generator/src/generators/tailwindcss/config.ts (5)
49-49
: 使用标准的 delete 操作符更简洁- Reflect.deleteProperty(importNames, 'defaultImport') + delete importNames.defaultImport
76-77
: 不必要的可选链操作符
importDecl
已经通过importedModule.get(moduleName)
确认存在,不需要使用可选链。const importDecl = importedModule.get(moduleName) - importDecl?.specifiers.unshift(t.importDefaultSpecifier(t.identifier(defaultImport))) + importDecl.specifiers.unshift(t.importDefaultSpecifier(t.identifier(defaultImport)))
133-145
: 使用模板字符串改善可读性当前的多行字符串拼接可以使用模板字符串简化。
- const installPluginCode = dedent(` + const pluginName = alias.get(importName) ?? importName + const installPluginCode = dedent(` chain.merge({ plugin: { install: { - plugin: UnifiedWebpackPluginV5, + plugin: ${pluginName}, args: [{ // 这里可以传参数 rem2rpx: true, }] } } }) `)
245-245
: 导出方式不一致其他函数使用
export async function
,这里使用export function
,建议保持一致性。虽然这个函数不是异步的,但为了保持代码风格一致,建议调整导出方式。
264-264
: 复杂的条件判断可以提取为常量环境变量判断逻辑较长,影响可读性。
+ const isDisabledPlatform = ['h5', 'harmony', 'rn'].includes(process.env.TARO_ENV) ${alias.get(importPluginName) ?? importPluginName}({ // rem转rpx rem2rpx: true, // 除了小程序这些,其他平台都 disable - disabled: process.env.TARO_ENV === 'h5' || process.env.TARO_ENV === 'harmony' || process.env.TARO_ENV === 'rn', + disabled: isDisabledPlatform, // 由于 taro vite 默认会移除所有的 tailwindcss css 变量,所以一定要开启这个配置,进行css 变量的重新注入 injectAdditionalCssVarScope: true, })packages/taro-plugin-generator/src/generators/es5/config.ts (3)
13-33
: 正则表达式过于复杂,建议提取为常量并添加注释错误消息中的正则表达式
/node_modules\\/(?!(.pnpm|@babel|core-js|style-loader|css-loader|react|react-dom))(@?[^/]+)/
较为复杂,建议:
- 提取为命名常量,提高可读性
- 添加详细注释说明匹配规则和排除的包
+// 匹配 node_modules 中需要编译的包,排除特定的包 +const NODE_MODULES_INCLUDE_REGEX = String.raw`node_modules\/(?!(.pnpm|@babel|core-js|style-loader|css-loader|react|react-dom))(@?[^/]+)` const modifiedConfigError = new GeneratorError({ type: GeneratorErrorType.modifyConfig, message: dedent(` { mini: { compile: { include: [ - filename => /node_modules\\/(?!(.pnpm|@babel|core-js|style-loader|css-loader|react|react-dom))(@?[^/]+)/.test(filename) + filename => new RegExp('${NODE_MODULES_INCLUDE_REGEX}').test(filename) ] } },
106-149
: 函数命名有拼写错误函数名
insertBrowerlistEnv
中的 "Browerslist" 拼写错误,应该是 "Browserslist"。-function insertBrowerlistEnv(ast: t.Node) { +function insertBrowserslistEnv(ast: t.Node) {同时需要在调用处也进行相应修改:
const ast = parser.parse(sourceCode, { sourceType: 'module', plugins: ['typescript'] }) - insertBrowerlistEnv(ast) + insertBrowserslistEnv(ast)
112-131
: AST 节点类型检查可以简化手动检查 AST 节点类型的代码过于冗长,可以使用 Babel 提供的辅助函数或抽取为独立的工具函数来提高可读性。
+ // 简化的类型检查函数 + const isMemberExpression = (node: any, objName: string, propName: string): boolean => { + return t.isMemberExpression(node) && + t.isIdentifier(node.object) && node.object.name === objName && + t.isIdentifier(node.property) && node.property.name === propName + } + + const isProcessEnvAccess = (node: any, envVar: string): boolean => { + return isMemberExpression(node, 'process', 'env') && + t.isMemberExpression(node) && + t.isIdentifier(node.property) && node.property.name === envVar + } // 判断左侧是 process.env.BROWSERSLIST_ENV - const isLeftMatch = - node.left.type === 'MemberExpression' && - node.left.object.type === 'MemberExpression' && - node.left.object.object.type === 'Identifier' && - node.left.object.object.name === 'process' && - node.left.object.property.type === 'Identifier' && - node.left.object.property.name === 'env' && - node.left.property.type === 'Identifier' && - node.left.property.name === 'BROWSERSLIST_ENV' + const isLeftMatch = isProcessEnvAccess(node.left, 'BROWSERSLIST_ENV')packages/taro-plugin-generator/src/generators/es5/babel.ts (2)
202-205
: 提前退出循环的逻辑可以优化在循环开始时检查
modified
状态来提前退出,这种模式可以改为使用for...of
循环配合早期返回,或者将检查移到循环条件中。// 扫描 presets 数组每一项,presets 每一项可能是字符串、元组、变量 - for (let i = 0; i < elements.length; i += 1) { - if (modified) { - break - } + for (let i = 0; i < elements.length && !modified; i += 1) { const el = elements[i]
243-256
:insertUseBuiltInsProp
函数可以提取重复的表达式函数中多次调用
parser.parseExpression
,可以将结果提取为常量,同时变量名命名可以更准确。function insertUseBuiltInsProp(obj: t.ObjectExpression) { const useBuiltInProp = obj.properties.find( (p) => t.isObjectProperty(p) && t.isIdentifier(p.key) && p.key.name === USE_BUILT_INS ) as t.ObjectProperty - const builtInValue = parser.parseExpression("process.env.TARO_ENV === 'h5' ? 'usage' : false") + + // 提取为模块级常量,避免重复解析 + const USE_BUILT_INS_VALUE_EXPRESSION = parser.parseExpression("process.env.TARO_ENV === 'h5' ? 'usage' : false") + // 如果有 useBuiltIns 属性,直接替换值 if (useBuiltInProp) { - useBuiltInProp.value = builtInValue + useBuiltInProp.value = USE_BUILT_INS_VALUE_EXPRESSION } // 没有 useBuiltIns 属性,直接添加 else { - obj.properties.push(t.objectProperty(t.identifier(USE_BUILT_INS), builtInValue)) + obj.properties.push(t.objectProperty(t.identifier(USE_BUILT_INS), USE_BUILT_INS_VALUE_EXPRESSION)) } }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
pnpm-lock.yaml
is excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (17)
packages/taro-cli/templates/default/config/index.js
(1 hunks)packages/taro-cli/templates/default/package.json.tmpl
(2 hunks)packages/taro-cli/tsconfig.json
(1 hunks)packages/taro-plugin-generator/package.json
(1 hunks)packages/taro-plugin-generator/src/generators/es5/babel.ts
(1 hunks)packages/taro-plugin-generator/src/generators/es5/config.ts
(1 hunks)packages/taro-plugin-generator/src/generators/es5/index.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/config.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/deps.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/index.ts
(1 hunks)packages/taro-plugin-generator/src/index.ts
(1 hunks)packages/taro-plugin-generator/src/types/define.d.ts
(1 hunks)packages/taro-plugin-generator/src/utils/ast.ts
(1 hunks)packages/taro-plugin-generator/src/utils/error.ts
(1 hunks)packages/taro-plugin-generator/src/utils/index.ts
(1 hunks)packages/taro-plugin-generator/tsconfig.json
(1 hunks)
✅ Files skipped from review due to trivial changes (3)
- packages/taro-cli/templates/default/config/index.js
- packages/taro-plugin-generator/package.json
- packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts
🚧 Files skipped from review as they are similar to previous changes (11)
- packages/taro-cli/tsconfig.json
- packages/taro-plugin-generator/tsconfig.json
- packages/taro-plugin-generator/src/index.ts
- packages/taro-plugin-generator/src/generators/tailwindcss/deps.ts
- packages/taro-cli/templates/default/package.json.tmpl
- packages/taro-plugin-generator/src/types/define.d.ts
- packages/taro-plugin-generator/src/utils/ast.ts
- packages/taro-plugin-generator/src/generators/tailwindcss/index.ts
- packages/taro-plugin-generator/src/generators/es5/index.ts
- packages/taro-plugin-generator/src/utils/error.ts
- packages/taro-plugin-generator/src/utils/index.ts
⏰ Context from checks skipped due to timeout of 90000ms (9)
- GitHub Check: Build Rust Binding / stable - x86_64-unknown-linux-gnu
- GitHub Check: Build Rust Binding / stable - x86_64-unknown-linux-musl
- GitHub Check: Build Rust Binding / stable - aarch64-apple-darwin
- GitHub Check: Build Rust Binding / stable - x86_64-pc-windows-msvc
- GitHub Check: Build Rust Binding / stable - x86_64-unknown-linux-musl
- GitHub Check: Build Rust Binding / stable - x86_64-apple-darwin
- GitHub Check: Build Rust Binding / stable - aarch64-apple-darwin
- GitHub Check: Build Rust Binding / stable - x86_64-unknown-linux-gnu
- GitHub Check: Build Rust Binding / stable - x86_64-pc-windows-msvc
🔇 Additional comments (1)
packages/taro-plugin-generator/src/generators/es5/babel.ts (1)
184-197
: 变量绑定检查缺少空值检查在处理
binding?.path.isVariableDeclarator()
时,应该添加更严格的空值检查,避免潜在的运行时错误。if (t.isIdentifier(options)) { const variable = options.name const binding = nodePath.scope.getBinding(variable) - if (binding?.path.isVariableDeclarator()) { + if (binding && binding.path.isVariableDeclarator()) { // const options = init {} const init = binding.path.node.init - if (t.isObjectExpression(init)) { + if (init && t.isObjectExpression(init)) { insertUseBuiltInsProp(init) modified = true return } } throw modifyConfigError }Likely an incorrect or invalid review comment.
return parser.parseExpression(code) as t.CallExpression | ||
} |
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.
多处不安全的类型断言
parser.parseExpression
的结果被强制转换,可能导致运行时错误。
建议添加类型验证:
- return parser.parseExpression(code) as t.CallExpression
+ const expr = parser.parseExpression(code)
+ if (!t.isCallExpression(expr)) {
+ throw new Error('解析插件代码失败')
+ }
+ return expr
同样的问题也出现在 createPostcssPluginNode
函数中。
Also applies to: 284-285
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/tailwindcss/config.ts at lines
269-270 and 284-285, the code uses unsafe type assertions on the result of
parser.parseExpression, which can cause runtime errors. To fix this, add proper
type checks to verify the result is indeed a t.CallExpression before casting. If
the type is incorrect, handle the error or return a safe fallback instead of
forcing the cast.
if (importedModule.get(moduleName)) { | ||
const importDecl = importedModule.get(moduleName) | ||
for (const importName of namedImport) { | ||
importDecl?.specifiers.push(t.importSpecifier(t.identifier(importName), t.identifier(importName))) | ||
} | ||
} else { |
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.
可能导致重复导入
在向现有导入语句添加命名导入时,没有检查该导入是否已经存在。
建议在添加前检查是否已存在:
if (importedModule.get(moduleName)) {
const importDecl = importedModule.get(moduleName)
for (const importName of namedImport) {
+ const alreadyImported = importDecl.specifiers.some(
+ spec => t.isImportSpecifier(spec) &&
+ t.isIdentifier(spec.imported) &&
+ spec.imported.name === importName
+ )
+ if (!alreadyImported) {
importDecl?.specifiers.push(t.importSpecifier(t.identifier(importName), t.identifier(importName)))
+ }
}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
if (importedModule.get(moduleName)) { | |
const importDecl = importedModule.get(moduleName) | |
for (const importName of namedImport) { | |
importDecl?.specifiers.push(t.importSpecifier(t.identifier(importName), t.identifier(importName))) | |
} | |
} else { | |
if (importedModule.get(moduleName)) { | |
const importDecl = importedModule.get(moduleName) | |
for (const importName of namedImport) { | |
const alreadyImported = importDecl.specifiers.some( | |
spec => | |
t.isImportSpecifier(spec) && | |
t.isIdentifier(spec.imported) && | |
spec.imported.name === importName | |
) | |
if (!alreadyImported) { | |
importDecl.specifiers.push( | |
t.importSpecifier(t.identifier(importName), t.identifier(importName)) | |
) | |
} | |
} | |
} else { |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/tailwindcss/config.ts around
lines 89 to 94, the code adds named imports to an existing import declaration
without checking for duplicates. To fix this, before pushing a new import
specifier, check if the specifier for that importName already exists in
importDecl.specifiers to avoid duplicate imports.
export async function updateConfig(options: { ctx: IPluginContext, compilerType: 'webpack5' | 'vite' }) { | ||
const { ctx, compilerType } = options | ||
const { fs } = ctx.helper | ||
const sourceCode = await fs.readFile(ctx.paths.configPath, { encoding: 'utf-8' }) | ||
const ast = parser.parse(sourceCode, { | ||
sourceType: 'module', | ||
plugins: ['typescript'], | ||
}) | ||
|
||
if (compilerType === 'webpack5') { | ||
processWebpack5Config(ast) | ||
} else if (compilerType === 'vite') { | ||
processViteConfig(ast) | ||
} | ||
const { code: latestConfig } = generator(ast) | ||
await fs.writeFile(ctx.paths.configPath, latestConfig, { encoding: 'utf-8' }) | ||
console.log('✅ 更新配置文件成功\n') | ||
} |
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.
缺少错误处理和参数验证
该函数存在以下问题:
- 文件读写操作缺少 try-catch 错误处理
compilerType
参数未验证,如果传入非预期值会静默执行
建议添加错误处理:
export async function updateConfig(options: { ctx: IPluginContext, compilerType: 'webpack5' | 'vite' }) {
const { ctx, compilerType } = options
const { fs } = ctx.helper
- const sourceCode = await fs.readFile(ctx.paths.configPath, { encoding: 'utf-8' })
- const ast = parser.parse(sourceCode, {
- sourceType: 'module',
- plugins: ['typescript'],
- })
-
- if (compilerType === 'webpack5') {
- processWebpack5Config(ast)
- } else if (compilerType === 'vite') {
- processViteConfig(ast)
+ try {
+ const sourceCode = await fs.readFile(ctx.paths.configPath, { encoding: 'utf-8' })
+ const ast = parser.parse(sourceCode, {
+ sourceType: 'module',
+ plugins: ['typescript'],
+ })
+
+ if (compilerType === 'webpack5') {
+ processWebpack5Config(ast)
+ } else if (compilerType === 'vite') {
+ processViteConfig(ast)
+ } else {
+ throw new Error(`不支持的编译器类型: ${compilerType}`)
+ }
+ const { code: latestConfig } = generator(ast)
+ await fs.writeFile(ctx.paths.configPath, latestConfig, { encoding: 'utf-8' })
+ console.log('✅ 更新配置文件成功\n')
+ } catch (error) {
+ console.error(`❌ 更新配置文件失败: ${error.message}`)
+ throw error
}
- const { code: latestConfig } = generator(ast)
- await fs.writeFile(ctx.paths.configPath, latestConfig, { encoding: 'utf-8' })
- console.log('✅ 更新配置文件成功\n')
}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
export async function updateConfig(options: { ctx: IPluginContext, compilerType: 'webpack5' | 'vite' }) { | |
const { ctx, compilerType } = options | |
const { fs } = ctx.helper | |
const sourceCode = await fs.readFile(ctx.paths.configPath, { encoding: 'utf-8' }) | |
const ast = parser.parse(sourceCode, { | |
sourceType: 'module', | |
plugins: ['typescript'], | |
}) | |
if (compilerType === 'webpack5') { | |
processWebpack5Config(ast) | |
} else if (compilerType === 'vite') { | |
processViteConfig(ast) | |
} | |
const { code: latestConfig } = generator(ast) | |
await fs.writeFile(ctx.paths.configPath, latestConfig, { encoding: 'utf-8' }) | |
console.log('✅ 更新配置文件成功\n') | |
} | |
export async function updateConfig(options: { ctx: IPluginContext, compilerType: 'webpack5' | 'vite' }) { | |
const { ctx, compilerType } = options | |
const { fs } = ctx.helper | |
try { | |
const sourceCode = await fs.readFile(ctx.paths.configPath, { encoding: 'utf-8' }) | |
const ast = parser.parse(sourceCode, { | |
sourceType: 'module', | |
plugins: ['typescript'], | |
}) | |
if (compilerType === 'webpack5') { | |
processWebpack5Config(ast) | |
} else if (compilerType === 'vite') { | |
processViteConfig(ast) | |
} else { | |
throw new Error(`不支持的编译器类型: ${compilerType}`) | |
} | |
const { code: latestConfig } = generator(ast) | |
await fs.writeFile(ctx.paths.configPath, latestConfig, { encoding: 'utf-8' }) | |
console.log('✅ 更新配置文件成功\n') | |
} catch (error) { | |
console.error(`❌ 更新配置文件失败: ${error.message}`) | |
throw error | |
} | |
} |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/tailwindcss/config.ts around
lines 12 to 29, the updateConfig function lacks error handling for file
read/write operations and does not validate the compilerType parameter. To fix
this, wrap the entire function body in a try-catch block to catch and handle any
errors during file operations or parsing. Also, add a validation check for
compilerType to ensure it is either 'webpack5' or 'vite'; if not, throw an error
or handle it appropriately to prevent silent failures.
packages/taro-plugin-generator/src/generators/tailwindcss/config.ts
Outdated
Show resolved
Hide resolved
config(config) { | ||
// 加载 tailwindcss | ||
if (typeof config.css?.postcss === 'object') { | ||
config.css?.postcss.plugins?.unshift(tailwindcss()) |
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.
可选链操作可能导致运行时错误
在配置对象中使用可选链时,如果 config.css
为 undefined
,unshift
操作会失败。
建议添加更完善的检查:
- if (typeof config.css?.postcss === 'object') {
- config.css?.postcss.plugins?.unshift(tailwindcss())
+ if (typeof config.css?.postcss === 'object' && Array.isArray(config.css.postcss.plugins)) {
+ config.css.postcss.plugins.unshift(tailwindcss())
}
Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/tailwindcss/config.ts at line
279, the use of optional chaining on
config.css?.postcss.plugins?.unshift(tailwindcss()) can cause a runtime error if
config.css or config.css.postcss or config.css.postcss.plugins is undefined. To
fix this, add explicit checks to ensure config.css, config.css.postcss, and
config.css.postcss.plugins are all defined before calling unshift, preventing
errors when any part of the chain is missing.
} | ||
}) | ||
`) | ||
const installPluginStmt = parser.parseExpression(installPluginCode) as unknown as t.CallExpression |
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.
不安全的类型断言
将 parser.parseExpression
的结果强制转换为 t.CallExpression
可能导致运行时错误。
建议添加类型验证:
- const installPluginStmt = parser.parseExpression(installPluginCode) as unknown as t.CallExpression
+ const installPluginStmt = parser.parseExpression(installPluginCode)
+ if (!t.isCallExpression(installPluginStmt)) {
+ throw new Error('解析插件代码失败')
+ }
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
const installPluginStmt = parser.parseExpression(installPluginCode) as unknown as t.CallExpression | |
const installPluginStmt = parser.parseExpression(installPluginCode) | |
if (!t.isCallExpression(installPluginStmt)) { | |
throw new Error('解析插件代码失败') | |
} |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/tailwindcss/config.ts at line
146, the code unsafely asserts the result of parser.parseExpression as
t.CallExpression, which can cause runtime errors. To fix this, add a type check
after parsing to verify the expression is indeed a CallExpression before using
it, and handle the case where it is not to avoid unsafe assumptions.
if (!miniUpdated || !h5Updated) { | ||
throw modifiedConfigError | ||
} |
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.
🛠️ Refactor suggestion
错误处理逻辑可能过于严格
当 mini
或 h5
配置不存在时直接抛出错误,这可能过于严格。考虑是否应该:
- 自动创建缺失的配置节点
- 提供更友好的错误提示,指导用户如何修复
if (!miniUpdated || !h5Updated) {
- throw modifiedConfigError
+ // 可以考虑自动创建缺失的配置节点,而不是直接抛出错误
+ console.warn('⚠️ 检测到配置文件中缺少 mini 或 h5 配置节点')
+ throw modifiedConfigError
}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
if (!miniUpdated || !h5Updated) { | |
throw modifiedConfigError | |
} | |
if (!miniUpdated || !h5Updated) { | |
// 可以考虑自动创建缺失的配置节点,而不是直接抛出错误 | |
console.warn('⚠️ 检测到配置文件中缺少 mini 或 h5 配置节点') | |
throw modifiedConfigError | |
} |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/es5/config.ts around lines 59
to 61, the current error handling throws an error immediately if either the mini
or h5 configuration is missing, which may be too strict. Modify the code to
check if these configurations exist, and if not, automatically create the
missing configuration nodes with default values. Additionally, update the error
handling to provide a clearer, user-friendly message guiding how to fix the
issue instead of throwing a generic error.
t.regExpLiteral( | ||
String.raw`node_modules\/(?!(.pnpm|@babel|core-js|style-loader|css-loader|react|react-dom))(@?[^/]+)`, | ||
'' | ||
), |
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.
🛠️ Refactor suggestion
正则表达式字符串转义存在问题
在构建正则表达式时使用了 String.raw
模板字符串,但反斜杠转义可能仍有问题。建议直接使用字符串字面量或确保转义正确。
t.memberExpression(
t.regExpLiteral(
- String.raw`node_modules\/(?!(.pnpm|@babel|core-js|style-loader|css-loader|react|react-dom))(@?[^/]+)`,
+ 'node_modules\\/(?!(.pnpm|@babel|core-js|style-loader|css-loader|react|react-dom))(@?[^/]+)',
''
),
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
t.regExpLiteral( | |
String.raw`node_modules\/(?!(.pnpm|@babel|core-js|style-loader|css-loader|react|react-dom))(@?[^/]+)`, | |
'' | |
), | |
t.regExpLiteral( | |
'node_modules\\/(?!(.pnpm|@babel|core-js|style-loader|css-loader|react|react-dom))(@?[^/]+)', | |
'' | |
), |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/es5/config.ts around lines 81
to 84, the use of String.raw with the regex string causes incorrect escaping of
backslashes. Replace the String.raw template literal with a properly escaped
regular string literal or a RegExp object to ensure the backslashes are
correctly interpreted in the regex pattern.
function handlePresets(presets: t.ArrayExpression, nodePath: NodePath) { | ||
const { elements } = presets | ||
let modified = false | ||
|
||
/** | ||
* 处理 presets 里的 taro preset | ||
* - 元组第一项必须是 'taro' | ||
* - 元组第二项是对象或者变量 | ||
* - - 对象的情况,插入 useBuiltIns 属性。 | ||
* - - 变量的情况,找到变量定义的地方,如果值是对象,插入 useBuiltIns 属性 | ||
*/ | ||
const handleTaroPreset = (preset: t.ArrayExpression) => { | ||
const first = preset.elements[0] | ||
if (t.isStringLiteral(first) && first.value === 'taro') { | ||
const options = preset.elements[1] | ||
if (t.isObjectExpression(options)) { | ||
insertUseBuiltInsProp(options) | ||
modified = true | ||
} | ||
if (t.isIdentifier(options)) { | ||
const variable = options.name | ||
const binding = nodePath.scope.getBinding(variable) | ||
if (binding?.path.isVariableDeclarator()) { | ||
// const options = init {} | ||
const init = binding.path.node.init | ||
if (t.isObjectExpression(init)) { | ||
insertUseBuiltInsProp(init) | ||
modified = true | ||
return | ||
} | ||
} | ||
throw modifyConfigError | ||
} | ||
} | ||
} | ||
|
||
// 扫描 presets 数组每一项,presets 每一项可能是字符串、元组、变量 | ||
for (let i = 0; i < elements.length; i += 1) { | ||
if (modified) { | ||
break | ||
} | ||
const el = elements[i] | ||
// ["taro", ...] -> presets: [['taro', {...}], ...] | ||
if (t.isStringLiteral(el)) { | ||
if (el.value === 'taro') { | ||
elements[i] = parser.parseExpression(config) | ||
modified = true | ||
} | ||
} | ||
// [["taro", {...}], ...] | ||
if (t.isArrayExpression(el)) { | ||
handleTaroPreset(el) | ||
} | ||
/** | ||
* const taroPreset = ['taro', {}]; | ||
* presets: [taroPreset, ...] | ||
*/ | ||
if (t.isIdentifier(el)) { | ||
const variable = el.name | ||
const binding = nodePath.scope.getBinding(variable) | ||
if (binding?.path.isVariableDeclarator()) { | ||
const init = binding.path.node.init | ||
// const taroPreset = 'taro'; | ||
if (t.isStringLiteral(init) && init.value === 'taro') { | ||
binding.path.node.init = parser.parseExpression(config) | ||
} | ||
// const taroPreset = ['taro', {...}]; | ||
if (t.isArrayExpression(init)) { | ||
handleTaroPreset(init) | ||
} | ||
} | ||
} | ||
} | ||
if (!modified) { | ||
elements.push(parser.parseExpression(config)) | ||
} | ||
} |
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.
🛠️ Refactor suggestion
handlePresets
函数逻辑复杂,建议重构
该函数处理多种 presets 配置模式,逻辑较为复杂,建议:
- 将不同处理模式拆分为独立的小函数
- 减少嵌套层级,提高可读性
- 添加更多注释说明各种情况
+// 处理字符串类型的 taro preset
+function handleStringPreset(element: t.StringLiteral, index: number, elements: Array<t.Expression | t.SpreadElement | null>) {
+ if (element.value === 'taro') {
+ elements[index] = parser.parseExpression(config)
+ return true
+ }
+ return false
+}
+
+// 处理数组类型的 taro preset
+function handleArrayPreset(preset: t.ArrayExpression): boolean {
+ const first = preset.elements[0]
+ if (t.isStringLiteral(first) && first.value === 'taro') {
+ const options = preset.elements[1]
+ if (t.isObjectExpression(options)) {
+ insertUseBuiltInsProp(options)
+ return true
+ }
+ // 处理变量引用的情况...
+ }
+ return false
+}
function handlePresets(presets: t.ArrayExpression, nodePath: NodePath) {
const { elements } = presets
let modified = false
- // 原有的复杂逻辑
+ // 简化后的主循环
+ for (let i = 0; i < elements.length && !modified; i += 1) {
+ const el = elements[i]
+
+ if (t.isStringLiteral(el)) {
+ modified = handleStringPreset(el, i, elements)
+ } else if (t.isArrayExpression(el)) {
+ modified = handleArrayPreset(el)
+ } else if (t.isIdentifier(el)) {
+ modified = handleIdentifierPreset(el, nodePath)
+ }
+ }
Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/es5/babel.ts between lines 165
and 241, the handlePresets function is complex with multiple nested conditions
handling different preset formats. Refactor by extracting each preset handling
mode (string literal, array expression, identifier) into separate smaller
functions to reduce nesting and improve readability. Add clear comments to each
helper function explaining the specific case it handles. This modular approach
will make the code easier to understand and maintain.
904c136
to
724420b
Compare
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
♻️ Duplicate comments (9)
packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts (3)
95-101
: 改进错误处理以提供更好的调试信息当前的 catch 块捕获所有错误但没有区分错误类型。建议记录原始错误信息以便调试。
119-125
: 统一错误处理模式与上面的函数类似,建议改进错误处理以提供更好的调试信息。
157-165
: 保持错误处理的一致性建议与其他函数保持一致的错误处理模式。
packages/taro-plugin-generator/src/generators/tailwindcss/config.ts (5)
12-29
: 缺少错误处理和参数验证该函数存在以下问题:
- 文件读写操作缺少 try-catch 错误处理
compilerType
参数未验证,如果传入非预期值会静默执行
54-57
: 循环中的 early return 可能导致逻辑错误当
namedImport.size === 0
时,函数会提前返回,导致后续的 specifier 无法被处理。
89-94
: 可能导致重复导入在向现有导入语句添加命名导入时,没有检查该导入是否已经存在。
146-146
: 不安全的类型断言将
parser.parseExpression
的结果强制转换为t.CallExpression
可能导致运行时错误。
269-270
: 多处不安全的类型断言
parser.parseExpression
的结果被强制转换,可能导致运行时错误。Also applies to: 284-285
packages/taro-plugin-generator/src/generators/es5/babel.ts (1)
163-239
: handlePresets 函数逻辑复杂,建议重构该函数与之前审查意见中提到的复杂度问题相同,包含多层嵌套和重复逻辑。
🧹 Nitpick comments (2)
packages/taro-plugin-generator/src/generators/es5/babel.ts (2)
23-23
: 提取重复的表达式到常量
process.env.TARO_ENV === 'h5' ? 'usage' : false
表达式在多处重复,应提取为常量以提高可维护性。+const USE_BUILT_INS_VALUE = "process.env.TARO_ENV === 'h5' ? 'usage' : false" const config = dedent(` [ 'taro', { framework: 'react', ts: true, compiler: 'vite', - ${USE_BUILT_INS}: process.env.TARO_ENV === 'h5' ? 'usage' : false + ${USE_BUILT_INS}: ${USE_BUILT_INS_VALUE} } ] `)然后在其他位置也使用该常量。
Also applies to: 38-38, 91-91, 245-245
194-194
: 改进错误处理的上下文信息当配置结构不符合预期时,抛出的错误缺少具体的上下文信息,不利于用户调试。
-throw modifyConfigError +throw new GeneratorError({ + ...modifyConfigError, + message: `${modifyConfigError.message}\n当前遇到的配置结构不符合预期,变量: ${variable}` +})Also applies to: 143-143
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
pnpm-lock.yaml
is excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (17)
packages/taro-cli/templates/default/config/index.js
(1 hunks)packages/taro-cli/templates/default/package.json.tmpl
(2 hunks)packages/taro-cli/tsconfig.json
(1 hunks)packages/taro-plugin-generator/package.json
(1 hunks)packages/taro-plugin-generator/src/generators/es5/babel.ts
(1 hunks)packages/taro-plugin-generator/src/generators/es5/config.ts
(1 hunks)packages/taro-plugin-generator/src/generators/es5/index.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/config.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/deps.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/index.ts
(1 hunks)packages/taro-plugin-generator/src/index.ts
(1 hunks)packages/taro-plugin-generator/src/types/define.d.ts
(1 hunks)packages/taro-plugin-generator/src/utils/ast.ts
(1 hunks)packages/taro-plugin-generator/src/utils/error.ts
(1 hunks)packages/taro-plugin-generator/src/utils/index.ts
(1 hunks)packages/taro-plugin-generator/tsconfig.json
(1 hunks)
✅ Files skipped from review due to trivial changes (1)
- packages/taro-plugin-generator/src/types/define.d.ts
🚧 Files skipped from review as they are similar to previous changes (13)
- packages/taro-cli/templates/default/config/index.js
- packages/taro-cli/tsconfig.json
- packages/taro-plugin-generator/tsconfig.json
- packages/taro-cli/templates/default/package.json.tmpl
- packages/taro-plugin-generator/src/index.ts
- packages/taro-plugin-generator/src/generators/tailwindcss/index.ts
- packages/taro-plugin-generator/src/utils/ast.ts
- packages/taro-plugin-generator/src/generators/tailwindcss/deps.ts
- packages/taro-plugin-generator/package.json
- packages/taro-plugin-generator/src/generators/es5/index.ts
- packages/taro-plugin-generator/src/generators/es5/config.ts
- packages/taro-plugin-generator/src/utils/error.ts
- packages/taro-plugin-generator/src/utils/index.ts
⏰ Context from checks skipped due to timeout of 90000ms (7)
- GitHub Check: Build Rust Binding / stable - x86_64-unknown-linux-gnu
- GitHub Check: Build Rust Binding / stable - aarch64-apple-darwin
- GitHub Check: Build Rust Binding / stable - x86_64-pc-windows-msvc
- GitHub Check: Build Rust Binding / stable - x86_64-apple-darwin
- GitHub Check: Build Rust Binding / stable - x86_64-apple-darwin
- GitHub Check: Build Rust Binding / stable - aarch64-apple-darwin
- GitHub Check: Build Rust Binding / stable - x86_64-pc-windows-msvc
🔇 Additional comments (2)
packages/taro-plugin-generator/src/generators/es5/babel.ts (2)
76-100
: 优化文件创建逻辑当 babel.config.js 不存在时创建新文件的逻辑正确,模板格式也已修复(相比之前的审查意见)。
241-254
: insertUseBuiltInsProp 函数实现合理该函数正确处理了属性存在和不存在的两种情况,逻辑清晰。
const ast = parser.parse(sourceCode, { | ||
sourceType: 'module', | ||
plugins: ['typescript'], | ||
}) |
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.
🛠️ Refactor suggestion
修复 AST 解析配置不一致问题
sourceType: 'module'
与 babel.config.js
的 CommonJS 模块格式不匹配,可能导致解析错误。
const ast = parser.parse(sourceCode, {
- sourceType: 'module',
+ sourceType: 'script',
plugins: ['typescript'],
})
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
const ast = parser.parse(sourceCode, { | |
sourceType: 'module', | |
plugins: ['typescript'], | |
}) | |
const ast = parser.parse(sourceCode, { | |
sourceType: 'script', | |
plugins: ['typescript'], | |
}) |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/es5/babel.ts around lines 102
to 105, the AST parsing configuration uses sourceType: 'module', which conflicts
with the CommonJS module format specified in babel.config.js. To fix this,
change the sourceType option from 'module' to 'script' to align with the
CommonJS format and prevent parsing errors.
traverse(ast, { | ||
AssignmentExpression: (expr) => { | ||
const { node } = expr | ||
// module.exports = {} | ||
if ( | ||
t.isMemberExpression(node.left) && | ||
t.isIdentifier(node.left.object) && | ||
node.left.object.name === 'module' && | ||
t.isIdentifier(node.left.property) && | ||
node.left.property.name === 'exports' | ||
) { | ||
if (t.isObjectExpression(node.right)) { | ||
const presetsProp = node.right.properties.find( | ||
(p) => t.isObjectProperty(p) && t.isIdentifier(p.key) && p.key.name === 'presets' | ||
) as t.ObjectProperty | ||
// 没有 presets 属性,直接创建 | ||
if (!presetsProp) { | ||
node.right.properties.push( | ||
t.objectProperty(t.identifier('presets'), t.arrayExpression([parser.parseExpression(config)])) | ||
) | ||
} | ||
// presets: [...] | ||
else if (t.isArrayExpression(presetsProp.value)) { | ||
handlePresets(presetsProp.value, expr) | ||
} | ||
// presets是变量的情况:presets: presets | ||
else if (t.isIdentifier(presetsProp.value)) { | ||
const variable = presetsProp.value.name | ||
const binding = expr.scope.getBinding(variable) | ||
// const presets = [...] | ||
if (binding?.path.isVariableDeclarator()) { | ||
const init = binding.path.node.init | ||
if (t.isArrayExpression(init)) { | ||
handlePresets(init, expr) | ||
} else { | ||
// 不是合法的 presets | ||
throw modifyConfigError | ||
} | ||
} | ||
} | ||
} | ||
} | ||
}, | ||
}) |
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.
🛠️ Refactor suggestion
增强 AST 遍历的错误处理和覆盖性
当前 AST 遍历存在以下问题:
- 只处理
module.exports = {}
模式,未处理exports.xxx
或其他导出模式 - 缺少对意外 AST 结构的错误处理
考虑添加对其他导出模式的支持:
traverse(ast, {
AssignmentExpression: (expr) => {
// 现有的 module.exports = {} 处理逻辑
},
+ // 处理 exports.presets = [] 等情况
+ MemberExpression: (expr) => {
+ // 添加对其他导出模式的处理
+ }
})
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
traverse(ast, { | |
AssignmentExpression: (expr) => { | |
const { node } = expr | |
// module.exports = {} | |
if ( | |
t.isMemberExpression(node.left) && | |
t.isIdentifier(node.left.object) && | |
node.left.object.name === 'module' && | |
t.isIdentifier(node.left.property) && | |
node.left.property.name === 'exports' | |
) { | |
if (t.isObjectExpression(node.right)) { | |
const presetsProp = node.right.properties.find( | |
(p) => t.isObjectProperty(p) && t.isIdentifier(p.key) && p.key.name === 'presets' | |
) as t.ObjectProperty | |
// 没有 presets 属性,直接创建 | |
if (!presetsProp) { | |
node.right.properties.push( | |
t.objectProperty(t.identifier('presets'), t.arrayExpression([parser.parseExpression(config)])) | |
) | |
} | |
// presets: [...] | |
else if (t.isArrayExpression(presetsProp.value)) { | |
handlePresets(presetsProp.value, expr) | |
} | |
// presets是变量的情况:presets: presets | |
else if (t.isIdentifier(presetsProp.value)) { | |
const variable = presetsProp.value.name | |
const binding = expr.scope.getBinding(variable) | |
// const presets = [...] | |
if (binding?.path.isVariableDeclarator()) { | |
const init = binding.path.node.init | |
if (t.isArrayExpression(init)) { | |
handlePresets(init, expr) | |
} else { | |
// 不是合法的 presets | |
throw modifyConfigError | |
} | |
} | |
} | |
} | |
} | |
}, | |
}) | |
traverse(ast, { | |
AssignmentExpression: (expr) => { | |
const { node } = expr | |
// module.exports = {} | |
if ( | |
t.isMemberExpression(node.left) && | |
t.isIdentifier(node.left.object) && | |
node.left.object.name === 'module' && | |
t.isIdentifier(node.left.property) && | |
node.left.property.name === 'exports' | |
) { | |
if (t.isObjectExpression(node.right)) { | |
const presetsProp = node.right.properties.find( | |
(p) => t.isObjectProperty(p) && t.isIdentifier(p.key) && p.key.name === 'presets' | |
) as t.ObjectProperty | |
// 没有 presets 属性,直接创建 | |
if (!presetsProp) { | |
node.right.properties.push( | |
t.objectProperty( | |
t.identifier('presets'), | |
t.arrayExpression([parser.parseExpression(config)]) | |
) | |
) | |
} | |
// presets: [...] | |
else if (t.isArrayExpression(presetsProp.value)) { | |
handlePresets(presetsProp.value, expr) | |
} | |
// presets是变量的情况:presets: presets | |
else if (t.isIdentifier(presetsProp.value)) { | |
const variable = presetsProp.value.name | |
const binding = expr.scope.getBinding(variable) | |
// const presets = [...] | |
if (binding?.path.isVariableDeclarator()) { | |
const init = binding.path.node.init | |
if (t.isArrayExpression(init)) { | |
handlePresets(init, expr) | |
} else { | |
// 不是合法的 presets | |
throw modifyConfigError | |
} | |
} | |
} | |
} | |
} | |
}, | |
// 处理 exports.presets = [] 等情况 | |
MemberExpression: (expr) => { | |
// 添加对其他导出模式的处理 | |
} | |
}) |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/es5/babel.ts between lines 107
and 150, the AST traversal currently only handles the pattern module.exports =
{} and lacks error handling for unexpected AST structures. To fix this, extend
the traversal to also detect and process exports.xxx assignments and other
common export patterns. Additionally, add error handling to catch and handle
unexpected or unsupported AST node structures gracefully, throwing meaningful
errors or warnings as needed to improve robustness.
3d01223
to
fa14b1d
Compare
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: 1
♻️ Duplicate comments (3)
packages/taro-plugin-generator/src/generators/es5/babel.ts (3)
102-105
: AST 解析配置不一致问题仍然存在
sourceType: 'module'
与babel.config.js
的 CommonJS 模块格式不匹配,可能导致解析错误。const ast = parser.parse(sourceCode, { - sourceType: 'module', + sourceType: 'script', plugins: ['typescript'], })
107-150
: AST 遍历缺乏完整的错误处理和导出模式支持当前 AST 遍历仍然存在以下限制:
- 只处理
module.exports = {}
模式,未处理exports.xxx
或其他导出模式- 缺少对意外 AST 结构的错误处理
考虑添加对其他导出模式的支持:
traverse(ast, { AssignmentExpression: (expr) => { // 现有的 module.exports = {} 处理逻辑 }, + // 处理 exports.presets = [] 等情况 + MemberExpression: (expr) => { + // 添加对其他导出模式的处理 + } })
163-239
:handlePresets
函数逻辑仍然复杂,建议重构该函数处理多种 presets 配置模式,逻辑较为复杂,建议:
- 将不同处理模式拆分为独立的小函数
- 减少嵌套层级,提高可读性
- 添加更多注释说明各种情况
+// 处理字符串类型的 taro preset +function handleStringPreset(element: t.StringLiteral, index: number, elements: Array<t.Expression | t.SpreadElement | null>) { + if (element.value === 'taro') { + elements[index] = parser.parseExpression(config) + return true + } + return false +} + +// 处理数组类型的 taro preset +function handleArrayPreset(preset: t.ArrayExpression): boolean { + const first = preset.elements[0] + if (t.isStringLiteral(first) && first.value === 'taro') { + const options = preset.elements[1] + if (t.isObjectExpression(options)) { + insertUseBuiltInsProp(options) + return true + } + // 处理变量引用的情况... + } + return false +} function handlePresets(presets: t.ArrayExpression, nodePath: NodePath) { const { elements } = presets let modified = false - // 原有的复杂逻辑 + // 简化后的主循环 + for (let i = 0; i < elements.length && !modified; i += 1) { + const el = elements[i] + + if (t.isStringLiteral(el)) { + modified = handleStringPreset(el, i, elements) + } else if (t.isArrayExpression(el)) { + modified = handleArrayPreset(el) + } else if (t.isIdentifier(el)) { + modified = handleIdentifierPreset(el, nodePath) + } + }
🧹 Nitpick comments (1)
packages/taro-plugin-generator/src/generators/es5/babel.ts (1)
245-245
: 硬编码的表达式字符串存在语法风险直接使用字符串解析复杂的条件表达式容易出错,建议使用 AST 构建器方法。
- const builtInValue = parser.parseExpression("process.env.TARO_ENV === 'h5' ? 'usage' : false") + const builtInValue = t.conditionalExpression( + t.binaryExpression( + '===', + t.memberExpression( + t.memberExpression(t.identifier('process'), t.identifier('env')), + t.identifier('TARO_ENV') + ), + t.stringLiteral('h5') + ), + t.stringLiteral('usage'), + t.booleanLiteral(false) + )
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (86)
crates/native_binding/package.json
(1 hunks)npm/darwin-arm64/package.json
(1 hunks)npm/darwin-x64/package.json
(1 hunks)npm/linux-x64-gnu/package.json
(1 hunks)npm/linux-x64-musl/package.json
(1 hunks)npm/win32-x64-msvc/package.json
(1 hunks)package.json
(1 hunks)packages/babel-plugin-transform-react-jsx-to-rn-stylesheet/package.json
(1 hunks)packages/babel-plugin-transform-solid-jsx/package.json
(1 hunks)packages/babel-plugin-transform-taroapi/package.json
(1 hunks)packages/babel-preset-taro/package.json
(1 hunks)packages/create-app/package.json
(1 hunks)packages/css-to-react-native/package.json
(1 hunks)packages/eslint-config-taro/package.json
(1 hunks)packages/eslint-plugin-taro/package.json
(1 hunks)packages/jest-helper/package.json
(1 hunks)packages/postcss-html-transform/package.json
(1 hunks)packages/postcss-plugin-constparse/package.json
(1 hunks)packages/postcss-pxtransform/package.json
(1 hunks)packages/postcss-unit-transform/package.json
(1 hunks)packages/rollup-plugin-copy/package.json
(1 hunks)packages/shared/package.json
(1 hunks)packages/stylelint-config-taro-rn/package.json
(1 hunks)packages/stylelint-taro-rn/package.json
(1 hunks)packages/stylelint-taro/package.json
(1 hunks)packages/taro-api/package.json
(1 hunks)packages/taro-cli-convertor/package.json
(1 hunks)packages/taro-cli/package.json
(1 hunks)packages/taro-components-advanced/package.json
(1 hunks)packages/taro-components-library-react/package.json
(1 hunks)packages/taro-components-library-solid/package.json
(1 hunks)packages/taro-components-library-vue3/package.json
(1 hunks)packages/taro-components-react/package.json
(1 hunks)packages/taro-components-rn/package.json
(1 hunks)packages/taro-components/package.json
(1 hunks)packages/taro-extend/package.json
(1 hunks)packages/taro-framework-react/package.json
(1 hunks)packages/taro-framework-solid/package.json
(1 hunks)packages/taro-framework-vue3/package.json
(1 hunks)packages/taro-h5/package.json
(1 hunks)packages/taro-helper/package.json
(1 hunks)packages/taro-loader/package.json
(1 hunks)packages/taro-platform-alipay/package.json
(1 hunks)packages/taro-platform-ascf/package.json
(1 hunks)packages/taro-platform-h5/package.json
(1 hunks)packages/taro-platform-harmony-cpp/package.json
(1 hunks)packages/taro-platform-harmony-hybrid/package.json
(1 hunks)packages/taro-platform-harmony/package.json
(1 hunks)packages/taro-platform-jd/package.json
(1 hunks)packages/taro-platform-qq/package.json
(1 hunks)packages/taro-platform-swan/package.json
(1 hunks)packages/taro-platform-tt/package.json
(1 hunks)packages/taro-platform-weapp/package.json
(1 hunks)packages/taro-plugin-generator/package.json
(1 hunks)packages/taro-plugin-generator/src/generators/es5/babel.ts
(1 hunks)packages/taro-plugin-generator/src/generators/es5/config.ts
(1 hunks)packages/taro-plugin-generator/src/generators/es5/index.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/index.ts
(1 hunks)packages/taro-plugin-generator/src/index.ts
(1 hunks)packages/taro-plugin-generator/src/utils/ast.ts
(1 hunks)packages/taro-plugin-generator/src/utils/error.ts
(1 hunks)packages/taro-plugin-html/package.json
(1 hunks)packages/taro-plugin-http/package.json
(1 hunks)packages/taro-plugin-inject/package.json
(1 hunks)packages/taro-plugin-mini-ci/package.json
(1 hunks)packages/taro-plugin-react-devtools/package.json
(1 hunks)packages/taro-plugin-vue-devtools/package.json
(1 hunks)packages/taro-react/package.json
(1 hunks)packages/taro-rn-runner/package.json
(1 hunks)packages/taro-rn-style-transformer/package.json
(1 hunks)packages/taro-rn-supporter/package.json
(1 hunks)packages/taro-rn-transformer/package.json
(1 hunks)packages/taro-rn/package.json
(1 hunks)packages/taro-router-rn/package.json
(1 hunks)packages/taro-router/package.json
(1 hunks)packages/taro-runner-utils/package.json
(1 hunks)packages/taro-runtime-rn/package.json
(1 hunks)packages/taro-runtime/package.json
(1 hunks)packages/taro-service/package.json
(1 hunks)packages/taro-transformer-wx/package.json
(1 hunks)packages/taro-vite-runner/package.json
(1 hunks)packages/taro-webpack5-prebundle/package.json
(1 hunks)packages/taro-webpack5-runner/package.json
(1 hunks)packages/taro-with-weapp/package.json
(1 hunks)packages/taro/package.json
(1 hunks)packages/taroize/package.json
(1 hunks)
✅ Files skipped from review due to trivial changes (19)
- packages/postcss-plugin-constparse/package.json
- packages/rollup-plugin-copy/package.json
- packages/taro-platform-alipay/package.json
- packages/taro-cli-convertor/package.json
- packages/taro-router-rn/package.json
- packages/taro-transformer-wx/package.json
- packages/stylelint-taro-rn/package.json
- packages/taro-helper/package.json
- packages/taro-platform-h5/package.json
- packages/babel-plugin-transform-solid-jsx/package.json
- npm/linux-x64-gnu/package.json
- packages/taro-platform-jd/package.json
- packages/taro-rn-style-transformer/package.json
- packages/taro-router/package.json
- packages/stylelint-taro/package.json
- packages/taro-rn-transformer/package.json
- packages/taroize/package.json
- packages/taro-runner-utils/package.json
- packages/taro-plugin-generator/package.json
🚧 Files skipped from review as they are similar to previous changes (66)
- npm/linux-x64-musl/package.json
- packages/taro-components-advanced/package.json
- packages/taro-rn-supporter/package.json
- packages/taro-platform-weapp/package.json
- packages/taro-components-library-solid/package.json
- packages/babel-preset-taro/package.json
- packages/taro-framework-solid/package.json
- crates/native_binding/package.json
- packages/postcss-unit-transform/package.json
- npm/darwin-arm64/package.json
- packages/babel-plugin-transform-react-jsx-to-rn-stylesheet/package.json
- packages/css-to-react-native/package.json
- packages/jest-helper/package.json
- packages/postcss-pxtransform/package.json
- npm/darwin-x64/package.json
- packages/taro-plugin-html/package.json
- packages/taro-framework-vue3/package.json
- packages/postcss-html-transform/package.json
- packages/taro-platform-qq/package.json
- package.json
- packages/shared/package.json
- packages/taro-components-react/package.json
- packages/taro-plugin-inject/package.json
- packages/eslint-plugin-taro/package.json
- packages/babel-plugin-transform-taroapi/package.json
- packages/taro-api/package.json
- packages/taro-cli/package.json
- packages/taro-platform-harmony-hybrid/package.json
- packages/taro-h5/package.json
- packages/taro-components/package.json
- packages/eslint-config-taro/package.json
- packages/taro-platform-tt/package.json
- packages/taro-platform-swan/package.json
- packages/taro-vite-runner/package.json
- packages/taro-rn/package.json
- packages/taro-platform-harmony/package.json
- packages/create-app/package.json
- packages/taro-service/package.json
- packages/taro-framework-react/package.json
- packages/taro-loader/package.json
- packages/taro-plugin-http/package.json
- packages/taro-plugin-react-devtools/package.json
- packages/taro-extend/package.json
- packages/taro-components-library-vue3/package.json
- packages/taro-components-rn/package.json
- packages/taro-platform-harmony-cpp/package.json
- packages/taro-react/package.json
- packages/taro-rn-runner/package.json
- packages/stylelint-config-taro-rn/package.json
- packages/taro-components-library-react/package.json
- packages/taro-webpack5-runner/package.json
- packages/taro-plugin-mini-ci/package.json
- packages/taro-runtime/package.json
- packages/taro-platform-ascf/package.json
- packages/taro-with-weapp/package.json
- packages/taro-runtime-rn/package.json
- packages/taro-plugin-vue-devtools/package.json
- packages/taro-webpack5-prebundle/package.json
- packages/taro-plugin-generator/src/generators/es5/config.ts
- packages/taro/package.json
- packages/taro-plugin-generator/src/generators/tailwindcss/index.ts
- npm/win32-x64-msvc/package.json
- packages/taro-plugin-generator/src/index.ts
- packages/taro-plugin-generator/src/utils/ast.ts
- packages/taro-plugin-generator/src/generators/es5/index.ts
- packages/taro-plugin-generator/src/utils/error.ts
⏰ Context from checks skipped due to timeout of 90000ms (9)
- GitHub Check: Build Rust Binding / stable - x86_64-pc-windows-msvc
- GitHub Check: Build Rust Binding / stable - aarch64-apple-darwin
- GitHub Check: Build Rust Binding / stable - x86_64-unknown-linux-musl
- GitHub Check: Build Rust Binding / stable - x86_64-apple-darwin
- GitHub Check: Build Rust Binding / stable - aarch64-apple-darwin
- GitHub Check: Build Rust Binding / stable - x86_64-pc-windows-msvc
- GitHub Check: Build Rust Binding / stable - aarch64-apple-darwin
- GitHub Check: Build Rust Binding / stable - x86_64-apple-darwin
- GitHub Check: Build Rust Binding / stable - x86_64-pc-windows-msvc
modified = true | ||
return | ||
} | ||
} | ||
throw modifyConfigError | ||
} |
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.
🛠️ Refactor suggestion
嵌套函数中的异常处理可能影响外层逻辑
在 handleTaroPreset
嵌套函数内部抛出 modifyConfigError
异常,但外层循环可能还有其他元素未处理完成。建议将异常处理移到更合适的位置,或者使用返回值来标识错误状态。
- throw modifyConfigError
+ return false // 或者设置错误标识,在外层处理
Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/es5/babel.ts around lines 190
to 195, the nested function handleTaroPreset throws modifyConfigError directly,
which can prematurely exit the outer loop and skip processing remaining
elements. Refactor the code to avoid throwing the error inside the nested
function; instead, use a return value or flag to indicate an error state and
handle the exception after the outer loop completes to ensure all elements are
processed properly.
4711049
to
4b59e62
Compare
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: 3
♻️ Duplicate comments (11)
packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts (3)
95-101
: 改进错误处理以提供更好的调试信息当前的 catch 块捕获所有错误但没有区分错误类型。建议记录原始错误信息以便调试。
119-125
: 统一错误处理模式与上面的函数类似,建议改进错误处理以提供更好的调试信息。
157-165
: 保持错误处理的一致性建议与其他函数保持一致的错误处理模式。
packages/taro-plugin-generator/src/generators/tailwindcss/config.ts (6)
12-29
: 缺少错误处理和参数验证该函数存在以下问题:
- 文件读写操作缺少 try-catch 错误处理
compilerType
参数未验证,如果传入非预期值会静默执行
54-57
: 循环中的 early return 可能导致逻辑错误当
namedImport.size === 0
时,函数会提前返回,导致后续的 specifier 无法被处理。
89-94
: 可能导致重复导入在向现有导入语句添加命名导入时,没有检查该导入是否已经存在。
146-146
: 不安全的类型断言将
parser.parseExpression
的结果强制转换为t.CallExpression
可能导致运行时错误。
269-270
: 多处不安全的类型断言
parser.parseExpression
的结果被强制转换,可能导致运行时错误。
284-285
: 不安全的类型断言需要验证与第269-270行类似,这里也存在不安全的类型断言问题。
建议添加类型验证:
- return parser.parseExpression(code) as t.ObjectExpression + const expr = parser.parseExpression(code) + if (!t.isObjectExpression(expr)) { + throw new Error('解析 PostCSS 插件代码失败') + } + return exprpackages/taro-plugin-generator/src/generators/es5/config.ts (2)
59-61
: 错误处理逻辑过于严格当
mini
或h5
配置不存在时直接抛出错误可能过于严格。建议考虑自动创建缺失的配置节点,或提供更友好的错误提示。
81-84
: 正则表达式字符串转义问题使用
String.raw
模板字符串构建正则表达式时,反斜杠转义可能仍有问题。建议使用字符串字面量确保转义正确。- String.raw`node_modules\/(?!(.pnpm|@babel|core-js|style-loader|css-loader|react|react-dom))(@?[^/]+)`, + 'node_modules\\/(?!(.pnpm|@babel|core-js|style-loader|css-loader|react|react-dom))(@?[^/]+)',
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
pnpm-lock.yaml
is excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (95)
crates/native_binding/package.json
(1 hunks)npm/darwin-arm64/package.json
(1 hunks)npm/darwin-x64/package.json
(1 hunks)npm/linux-x64-gnu/package.json
(1 hunks)npm/linux-x64-musl/package.json
(1 hunks)npm/win32-x64-msvc/package.json
(1 hunks)package.json
(1 hunks)packages/babel-plugin-transform-react-jsx-to-rn-stylesheet/package.json
(1 hunks)packages/babel-plugin-transform-solid-jsx/package.json
(1 hunks)packages/babel-plugin-transform-taroapi/package.json
(1 hunks)packages/babel-preset-taro/package.json
(1 hunks)packages/create-app/package.json
(1 hunks)packages/css-to-react-native/package.json
(1 hunks)packages/eslint-config-taro/package.json
(1 hunks)packages/eslint-plugin-taro/package.json
(1 hunks)packages/jest-helper/package.json
(1 hunks)packages/postcss-html-transform/package.json
(1 hunks)packages/postcss-plugin-constparse/package.json
(1 hunks)packages/postcss-pxtransform/package.json
(1 hunks)packages/postcss-unit-transform/package.json
(1 hunks)packages/rollup-plugin-copy/package.json
(1 hunks)packages/shared/package.json
(1 hunks)packages/stylelint-config-taro-rn/package.json
(1 hunks)packages/stylelint-taro-rn/package.json
(1 hunks)packages/stylelint-taro/package.json
(1 hunks)packages/taro-api/package.json
(1 hunks)packages/taro-cli-convertor/package.json
(1 hunks)packages/taro-cli/package.json
(1 hunks)packages/taro-cli/templates/default/config/index.js
(1 hunks)packages/taro-cli/templates/default/package.json.tmpl
(2 hunks)packages/taro-cli/tsconfig.json
(1 hunks)packages/taro-components-advanced/package.json
(1 hunks)packages/taro-components-library-react/package.json
(1 hunks)packages/taro-components-library-solid/package.json
(1 hunks)packages/taro-components-library-vue3/package.json
(1 hunks)packages/taro-components-react/package.json
(1 hunks)packages/taro-components-rn/package.json
(1 hunks)packages/taro-components/package.json
(1 hunks)packages/taro-extend/package.json
(1 hunks)packages/taro-framework-react/package.json
(1 hunks)packages/taro-framework-solid/package.json
(1 hunks)packages/taro-framework-vue3/package.json
(1 hunks)packages/taro-h5/package.json
(1 hunks)packages/taro-helper/package.json
(1 hunks)packages/taro-loader/package.json
(1 hunks)packages/taro-platform-alipay/package.json
(1 hunks)packages/taro-platform-ascf/package.json
(1 hunks)packages/taro-platform-h5/package.json
(1 hunks)packages/taro-platform-harmony-cpp/package.json
(1 hunks)packages/taro-platform-harmony-hybrid/package.json
(1 hunks)packages/taro-platform-harmony/package.json
(1 hunks)packages/taro-platform-jd/package.json
(1 hunks)packages/taro-platform-qq/package.json
(1 hunks)packages/taro-platform-swan/package.json
(1 hunks)packages/taro-platform-tt/package.json
(1 hunks)packages/taro-platform-weapp/package.json
(1 hunks)packages/taro-plugin-generator/package.json
(1 hunks)packages/taro-plugin-generator/src/generators/es5/babel.ts
(1 hunks)packages/taro-plugin-generator/src/generators/es5/config.ts
(1 hunks)packages/taro-plugin-generator/src/generators/es5/index.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/config.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/deps.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/index.ts
(1 hunks)packages/taro-plugin-generator/src/index.ts
(1 hunks)packages/taro-plugin-generator/src/types/define.d.ts
(1 hunks)packages/taro-plugin-generator/src/utils/ast.ts
(1 hunks)packages/taro-plugin-generator/src/utils/error.ts
(1 hunks)packages/taro-plugin-generator/src/utils/index.ts
(1 hunks)packages/taro-plugin-generator/tsconfig.json
(1 hunks)packages/taro-plugin-html/package.json
(1 hunks)packages/taro-plugin-http/package.json
(1 hunks)packages/taro-plugin-inject/package.json
(1 hunks)packages/taro-plugin-mini-ci/package.json
(1 hunks)packages/taro-plugin-react-devtools/package.json
(1 hunks)packages/taro-plugin-vue-devtools/package.json
(1 hunks)packages/taro-react/package.json
(1 hunks)packages/taro-rn-runner/package.json
(1 hunks)packages/taro-rn-style-transformer/package.json
(1 hunks)packages/taro-rn-supporter/package.json
(1 hunks)packages/taro-rn-transformer/package.json
(1 hunks)packages/taro-rn/package.json
(1 hunks)packages/taro-router-rn/package.json
(1 hunks)packages/taro-router/package.json
(1 hunks)packages/taro-runner-utils/package.json
(1 hunks)packages/taro-runtime-rn/package.json
(1 hunks)packages/taro-runtime/package.json
(1 hunks)packages/taro-service/package.json
(1 hunks)packages/taro-transformer-wx/package.json
(1 hunks)packages/taro-vite-runner/package.json
(1 hunks)packages/taro-webpack5-prebundle/package.json
(1 hunks)packages/taro-webpack5-runner/package.json
(1 hunks)packages/taro-with-weapp/package.json
(1 hunks)packages/taro/package.json
(1 hunks)packages/taroize/package.json
(1 hunks)
✅ Files skipped from review due to trivial changes (10)
- packages/babel-plugin-transform-react-jsx-to-rn-stylesheet/package.json
- packages/stylelint-taro-rn/package.json
- packages/taro-router-rn/package.json
- packages/css-to-react-native/package.json
- packages/taro-plugin-html/package.json
- packages/taro/package.json
- packages/taro-vite-runner/package.json
- packages/taro-helper/package.json
- packages/taroize/package.json
- packages/taro-plugin-generator/src/index.ts
🚧 Files skipped from review as they are similar to previous changes (82)
- packages/postcss-pxtransform/package.json
- packages/postcss-unit-transform/package.json
- packages/create-app/package.json
- packages/taro-runner-utils/package.json
- packages/taro-platform-h5/package.json
- packages/eslint-config-taro/package.json
- packages/shared/package.json
- packages/taro-rn-runner/package.json
- packages/rollup-plugin-copy/package.json
- packages/taro-cli-convertor/package.json
- packages/taro-components/package.json
- npm/linux-x64-gnu/package.json
- packages/taro-loader/package.json
- packages/taro-rn/package.json
- packages/postcss-plugin-constparse/package.json
- packages/taro-api/package.json
- package.json
- packages/babel-plugin-transform-taroapi/package.json
- crates/native_binding/package.json
- packages/taro-rn-supporter/package.json
- packages/babel-plugin-transform-solid-jsx/package.json
- packages/stylelint-config-taro-rn/package.json
- packages/taro-components-rn/package.json
- packages/babel-preset-taro/package.json
- packages/taro-cli/package.json
- packages/taro-react/package.json
- packages/taro-components-advanced/package.json
- packages/taro-platform-alipay/package.json
- packages/taro-platform-swan/package.json
- packages/taro-service/package.json
- packages/taro-platform-harmony-cpp/package.json
- npm/linux-x64-musl/package.json
- packages/taro-platform-harmony/package.json
- packages/jest-helper/package.json
- packages/taro-components-library-solid/package.json
- packages/taro-plugin-vue-devtools/package.json
- packages/taro-components-library-vue3/package.json
- packages/taro-cli/templates/default/config/index.js
- npm/win32-x64-msvc/package.json
- packages/taro-platform-ascf/package.json
- packages/postcss-html-transform/package.json
- packages/taro-webpack5-prebundle/package.json
- npm/darwin-x64/package.json
- packages/taro-runtime/package.json
- packages/taro-components-react/package.json
- packages/taro-platform-qq/package.json
- packages/taro-transformer-wx/package.json
- packages/taro-framework-vue3/package.json
- packages/stylelint-taro/package.json
- packages/taro-extend/package.json
- packages/taro-h5/package.json
- packages/taro-plugin-react-devtools/package.json
- packages/taro-runtime-rn/package.json
- packages/taro-router/package.json
- packages/eslint-plugin-taro/package.json
- packages/taro-platform-jd/package.json
- packages/taro-platform-tt/package.json
- packages/taro-plugin-inject/package.json
- packages/taro-framework-solid/package.json
- packages/taro-rn-transformer/package.json
- packages/taro-rn-style-transformer/package.json
- packages/taro-plugin-http/package.json
- packages/taro-platform-weapp/package.json
- packages/taro-cli/tsconfig.json
- packages/taro-plugin-mini-ci/package.json
- packages/taro-components-library-react/package.json
- packages/taro-webpack5-runner/package.json
- packages/taro-platform-harmony-hybrid/package.json
- packages/taro-framework-react/package.json
- npm/darwin-arm64/package.json
- packages/taro-with-weapp/package.json
- packages/taro-plugin-generator/tsconfig.json
- packages/taro-cli/templates/default/package.json.tmpl
- packages/taro-plugin-generator/src/generators/tailwindcss/index.ts
- packages/taro-plugin-generator/src/utils/ast.ts
- packages/taro-plugin-generator/package.json
- packages/taro-plugin-generator/src/types/define.d.ts
- packages/taro-plugin-generator/src/generators/es5/index.ts
- packages/taro-plugin-generator/src/generators/tailwindcss/deps.ts
- packages/taro-plugin-generator/src/utils/error.ts
- packages/taro-plugin-generator/src/utils/index.ts
- packages/taro-plugin-generator/src/generators/es5/babel.ts
🧰 Additional context used
🧬 Code Graph Analysis (1)
packages/taro-plugin-generator/src/generators/es5/config.ts (3)
packages/taro-plugin-generator/src/utils/error.ts (2)
GeneratorError
(10-20)GeneratorErrorType
(3-6)packages/taro-rn/script/getApiList.js (2)
ast
(9-9)parser
(3-3)packages/taro-plugin-generator/src/utils/ast.ts (1)
ensureNestedObjectProperty
(9-33)
⏰ Context from checks skipped due to timeout of 90000ms (10)
- GitHub Check: Build Rust Binding / stable - x86_64-pc-windows-msvc
- GitHub Check: Build Rust WASM / stable - wasm32-wasi
- GitHub Check: Build Rust WASM / stable - wasm32-wasi
- GitHub Check: Build Rust Binding / stable - x86_64-unknown-linux-musl
- GitHub Check: Build Rust Binding / stable - x86_64-unknown-linux-gnu
- GitHub Check: Build Rust Binding / stable - x86_64-pc-windows-msvc
- GitHub Check: Build Rust Binding / stable - aarch64-apple-darwin
- GitHub Check: Build Rust Binding / stable - aarch64-apple-darwin
- GitHub Check: Build Rust Binding / stable - x86_64-apple-darwin
- GitHub Check: Build Rust Binding / stable - x86_64-pc-windows-msvc
🔇 Additional comments (2)
packages/taro-plugin-generator/src/generators/es5/config.ts (2)
1-12
: 导入声明规范导入声明结构清晰,依赖项合理。使用了标准的 Babel 工具链进行 AST 操作。
67-100
: 函数职责单一性良好
modifyCompileConfig
函数逻辑清晰,正确使用了ensureNestedObjectProperty
工具函数来确保嵌套属性存在,并妥善处理了 include 数组的添加和更新。
const injectIndex = program.node.body.findIndex((stmt) => !t.isImportDeclaration(stmt)) | ||
program.node.body.splice(injectIndex, 0, env) |
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.
插入位置逻辑可能导致错误
当所有语句都是 import 声明时,findIndex
会返回 -1,导致 splice
在错误位置插入代码。需要处理这种边界情况。
- const injectIndex = program.node.body.findIndex((stmt) => !t.isImportDeclaration(stmt))
- program.node.body.splice(injectIndex, 0, env)
+ const injectIndex = program.node.body.findIndex((stmt) => !t.isImportDeclaration(stmt))
+ const targetIndex = injectIndex === -1 ? program.node.body.length : injectIndex
+ program.node.body.splice(targetIndex, 0, env)
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
const injectIndex = program.node.body.findIndex((stmt) => !t.isImportDeclaration(stmt)) | |
program.node.body.splice(injectIndex, 0, env) | |
const injectIndex = program.node.body.findIndex((stmt) => !t.isImportDeclaration(stmt)) | |
const targetIndex = injectIndex === -1 ? program.node.body.length : injectIndex | |
program.node.body.splice(targetIndex, 0, env) |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/es5/config.ts at lines 143-144,
the code uses findIndex to locate the insertion point for env but does not
handle the case when all statements are import declarations, causing findIndex
to return -1 and splice to insert at the wrong position. Fix this by checking if
findIndex returns -1 and, if so, set the insertion index to the end of the body
array before calling splice.
const env = parser.parseExpression( | ||
'process.env.BROWSERSLIST_ENV = process.env.NODE_ENV' | ||
) as unknown as t.ExpressionStatement | ||
const injectIndex = program.node.body.findIndex((stmt) => !t.isImportDeclaration(stmt)) | ||
program.node.body.splice(injectIndex, 0, env) |
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.
类型转换不正确且存在潜在错误
parseExpression
返回的是 Expression
类型,但被强制转换为 ExpressionStatement
,这在类型上是不正确的。应该创建一个表达式语句包装器。
- const env = parser.parseExpression(
- 'process.env.BROWSERSLIST_ENV = process.env.NODE_ENV'
- ) as unknown as t.ExpressionStatement
+ const envExpression = parser.parseExpression(
+ 'process.env.BROWSERSLIST_ENV = process.env.NODE_ENV'
+ )
+ const env = t.expressionStatement(envExpression)
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
const env = parser.parseExpression( | |
'process.env.BROWSERSLIST_ENV = process.env.NODE_ENV' | |
) as unknown as t.ExpressionStatement | |
const injectIndex = program.node.body.findIndex((stmt) => !t.isImportDeclaration(stmt)) | |
program.node.body.splice(injectIndex, 0, env) | |
const envExpression = parser.parseExpression( | |
'process.env.BROWSERSLIST_ENV = process.env.NODE_ENV' | |
) | |
const env = t.expressionStatement(envExpression) | |
const injectIndex = program.node.body.findIndex((stmt) => !t.isImportDeclaration(stmt)) | |
program.node.body.splice(injectIndex, 0, env) |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/es5/config.ts around lines 140
to 144, the code incorrectly casts the result of parseExpression (which returns
an Expression) directly to an ExpressionStatement. To fix this, wrap the parsed
expression inside an ExpressionStatement node instead of forcing the type cast,
ensuring proper AST node structure and correct typing.
AssignmentExpression(path) { | ||
const { node } = path | ||
// 判断左侧是 process.env.BROWSERSLIST_ENV | ||
const isLeftMatch = | ||
node.left.type === 'MemberExpression' && | ||
node.left.object.type === 'MemberExpression' && | ||
node.left.object.object.type === 'Identifier' && | ||
node.left.object.object.name === 'process' && | ||
node.left.object.property.type === 'Identifier' && | ||
node.left.object.property.name === 'env' && | ||
node.left.property.type === 'Identifier' && | ||
node.left.property.name === 'BROWSERSLIST_ENV' | ||
// 判断右侧是 process.env.NODE_ENV | ||
const isRightMatch = | ||
node.right.type === 'MemberExpression' && | ||
node.right.object.type === 'MemberExpression' && | ||
node.right.object.object.type === 'Identifier' && | ||
node.right.object.object.name === 'process' && | ||
node.right.object.property.type === 'Identifier' && | ||
node.right.object.property.name === 'env' && | ||
node.right.property.type === 'Identifier' && | ||
node.right.property.name === 'NODE_ENV' | ||
|
||
if (isLeftMatch && isRightMatch) { | ||
hasEnv = true | ||
path.stop() | ||
} | ||
}, |
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.
🛠️ Refactor suggestion
AST 类型检查逻辑冗长且易出错
手动检查 AST 节点类型的逻辑过于冗长,可能导致维护困难和潜在错误。建议使用 Babel 的 t.is*
辅助函数简化类型检查。
- // 判断左侧是 process.env.BROWSERSLIST_ENV
- const isLeftMatch =
- node.left.type === 'MemberExpression' &&
- node.left.object.type === 'MemberExpression' &&
- node.left.object.object.type === 'Identifier' &&
- node.left.object.object.name === 'process' &&
- node.left.object.property.type === 'Identifier' &&
- node.left.object.property.name === 'env' &&
- node.left.property.type === 'Identifier' &&
- node.left.property.name === 'BROWSERSLIST_ENV'
- // 判断右侧是 process.env.NODE_ENV
- const isRightMatch =
- node.right.type === 'MemberExpression' &&
- node.right.object.type === 'MemberExpression' &&
- node.right.object.object.type === 'Identifier' &&
- node.right.object.object.name === 'process' &&
- node.right.object.property.type === 'Identifier' &&
- node.right.object.property.name === 'env' &&
- node.right.property.type === 'Identifier' &&
- node.right.property.name === 'NODE_ENV'
+ // 判断是否为 process.env.BROWSERSLIST_ENV = process.env.NODE_ENV
+ const isLeftMatch = t.isMemberExpression(node.left) &&
+ t.isMemberExpression(node.left.object) &&
+ t.isIdentifier(node.left.object.object, { name: 'process' }) &&
+ t.isIdentifier(node.left.object.property, { name: 'env' }) &&
+ t.isIdentifier(node.left.property, { name: 'BROWSERSLIST_ENV' })
+
+ const isRightMatch = t.isMemberExpression(node.right) &&
+ t.isMemberExpression(node.right.object) &&
+ t.isIdentifier(node.right.object.object, { name: 'process' }) &&
+ t.isIdentifier(node.right.object.property, { name: 'env' }) &&
+ t.isIdentifier(node.right.property, { name: 'NODE_ENV' })
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
AssignmentExpression(path) { | |
const { node } = path | |
// 判断左侧是 process.env.BROWSERSLIST_ENV | |
const isLeftMatch = | |
node.left.type === 'MemberExpression' && | |
node.left.object.type === 'MemberExpression' && | |
node.left.object.object.type === 'Identifier' && | |
node.left.object.object.name === 'process' && | |
node.left.object.property.type === 'Identifier' && | |
node.left.object.property.name === 'env' && | |
node.left.property.type === 'Identifier' && | |
node.left.property.name === 'BROWSERSLIST_ENV' | |
// 判断右侧是 process.env.NODE_ENV | |
const isRightMatch = | |
node.right.type === 'MemberExpression' && | |
node.right.object.type === 'MemberExpression' && | |
node.right.object.object.type === 'Identifier' && | |
node.right.object.object.name === 'process' && | |
node.right.object.property.type === 'Identifier' && | |
node.right.object.property.name === 'env' && | |
node.right.property.type === 'Identifier' && | |
node.right.property.name === 'NODE_ENV' | |
if (isLeftMatch && isRightMatch) { | |
hasEnv = true | |
path.stop() | |
} | |
}, | |
AssignmentExpression(path) { | |
const { node } = path | |
// 判断是否为 process.env.BROWSERSLIST_ENV = process.env.NODE_ENV | |
const isLeftMatch = t.isMemberExpression(node.left) && | |
t.isMemberExpression(node.left.object) && | |
t.isIdentifier(node.left.object.object, { name: 'process' }) && | |
t.isIdentifier(node.left.object.property, { name: 'env' }) && | |
t.isIdentifier(node.left.property, { name: 'BROWSERSLIST_ENV' }) | |
const isRightMatch = t.isMemberExpression(node.right) && | |
t.isMemberExpression(node.right.object) && | |
t.isIdentifier(node.right.object.object, { name: 'process' }) && | |
t.isIdentifier(node.right.object.property, { name: 'env' }) && | |
t.isIdentifier(node.right.property, { name: 'NODE_ENV' }) | |
if (isLeftMatch && isRightMatch) { | |
hasEnv = true | |
path.stop() | |
} | |
}, |
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/es5/config.ts between lines 109
and 136, the current AST node type checks are verbose and error-prone due to
manual property inspections. Refactor the code to use Babel's t.is* helper
functions for type checking, which will simplify the logic, improve readability,
and reduce maintenance risks. Replace all manual type and property checks with
appropriate t.isMemberExpression, t.isIdentifier, and similar helper calls.
fa6af69
to
d6fe23d
Compare
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
♻️ Duplicate comments (11)
packages/taro-plugin-generator/src/generators/tailwindcss/config.ts (7)
12-29
: 缺少错误处理和参数验证该函数存在以下问题:
- 文件读写操作缺少 try-catch 错误处理
compilerType
参数未验证,如果传入非预期值会静默执行
54-57
: 循环中的 early return 可能导致逻辑错误当
namedImport.size === 0
时,函数会提前返回,导致后续的 specifier 无法被处理。应该使用continue
而不是return
。
89-94
: 可能导致重复导入在向现有导入语句添加命名导入时,没有检查该导入是否已经存在。
146-146
: 不安全的类型断言将
parser.parseExpression
的结果强制转换为t.CallExpression
可能导致运行时错误。
269-270
: 多处不安全的类型断言
parser.parseExpression
的结果被强制转换,可能导致运行时错误。
279-279
: 可选链操作可能导致运行时错误在配置对象中使用可选链时,如果
config.css
为undefined
,unshift
操作会失败。
284-285
: 不安全的类型断言
parser.parseExpression
的结果被强制转换为t.ObjectExpression
,可能导致运行时错误。packages/taro-plugin-generator/src/generators/es5/babel.ts (4)
102-105
: 修复 AST 解析配置不一致问题
sourceType: 'module'
与babel.config.js
的 CommonJS 模块格式不匹配,可能导致解析错误。const ast = parser.parse(sourceCode, { - sourceType: 'module', + sourceType: 'script', plugins: ['typescript'], })
107-150
: 增强 AST 遍历的错误处理和覆盖性当前 AST 遍历存在以下问题:
- 只处理
module.exports = {}
模式,未处理exports.xxx
或其他导出模式- 缺少对意外 AST 结构的错误处理
考虑添加对其他导出模式的支持:
traverse(ast, { AssignmentExpression: (expr) => { // 现有的 module.exports = {} 处理逻辑 }, + // 处理 exports.presets = [] 等情况 + MemberExpression: (expr) => { + // 添加对其他导出模式的处理 + } })
163-239
:handlePresets
函数逻辑复杂,建议重构该函数处理多种 presets 配置模式,逻辑较为复杂,建议:
- 将不同处理模式拆分为独立的小函数
- 减少嵌套层级,提高可读性
- 添加更多注释说明各种情况
+// 处理字符串类型的 taro preset +function handleStringPreset(element: t.StringLiteral, index: number, elements: Array<t.Expression | t.SpreadElement | null>) { + if (element.value === 'taro') { + elements[index] = parser.parseExpression(config) + return true + } + return false +} + +// 处理数组类型的 taro preset +function handleArrayPreset(preset: t.ArrayExpression): boolean { + const first = preset.elements[0] + if (t.isStringLiteral(first) && first.value === 'taro') { + const options = preset.elements[1] + if (t.isObjectExpression(options)) { + insertUseBuiltInsProp(options) + return true + } + // 处理变量引用的情况... + } + return false +} function handlePresets(presets: t.ArrayExpression, nodePath: NodePath) { const { elements } = presets let modified = false - // 原有的复杂逻辑 + // 简化后的主循环 + for (let i = 0; i < elements.length && !modified; i += 1) { + const el = elements[i] + + if (t.isStringLiteral(el)) { + modified = handleStringPreset(el, i, elements) + } else if (t.isArrayExpression(el)) { + modified = handleArrayPreset(el) + } else if (t.isIdentifier(el)) { + modified = handleIdentifierPreset(el, nodePath) + } + }
190-195
: 嵌套函数中的异常处理可能影响外层逻辑在
handleTaroPreset
嵌套函数内部抛出modifyConfigError
异常,但外层循环可能还有其他元素未处理完成。建议将异常处理移到更合适的位置,或者使用返回值来标识错误状态。- throw modifyConfigError + return false // 或者设置错误标识,在外层处理
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
pnpm-lock.yaml
is excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (96)
crates/native_binding/package.json
(1 hunks)npm/darwin-arm64/package.json
(1 hunks)npm/darwin-x64/package.json
(1 hunks)npm/linux-x64-gnu/package.json
(1 hunks)npm/linux-x64-musl/package.json
(1 hunks)npm/win32-x64-msvc/package.json
(1 hunks)package.json
(1 hunks)packages/babel-plugin-transform-react-jsx-to-rn-stylesheet/package.json
(1 hunks)packages/babel-plugin-transform-solid-jsx/package.json
(1 hunks)packages/babel-plugin-transform-taroapi/package.json
(1 hunks)packages/babel-preset-taro/package.json
(1 hunks)packages/create-app/package.json
(1 hunks)packages/css-to-react-native/package.json
(1 hunks)packages/eslint-config-taro/package.json
(1 hunks)packages/eslint-plugin-taro/package.json
(1 hunks)packages/jest-helper/package.json
(1 hunks)packages/postcss-html-transform/package.json
(1 hunks)packages/postcss-plugin-constparse/package.json
(1 hunks)packages/postcss-pxtransform/package.json
(1 hunks)packages/postcss-unit-transform/package.json
(1 hunks)packages/rollup-plugin-copy/package.json
(1 hunks)packages/shared/package.json
(1 hunks)packages/stylelint-config-taro-rn/package.json
(1 hunks)packages/stylelint-taro-rn/package.json
(1 hunks)packages/stylelint-taro/package.json
(1 hunks)packages/taro-api/package.json
(1 hunks)packages/taro-cli-convertor/package.json
(1 hunks)packages/taro-cli/package.json
(1 hunks)packages/taro-cli/templates/default/config/index.js
(1 hunks)packages/taro-cli/templates/default/package.json.tmpl
(2 hunks)packages/taro-cli/tsconfig.json
(1 hunks)packages/taro-components-advanced/package.json
(1 hunks)packages/taro-components-library-react/package.json
(1 hunks)packages/taro-components-library-solid/package.json
(1 hunks)packages/taro-components-library-vue3/package.json
(1 hunks)packages/taro-components-react/package.json
(1 hunks)packages/taro-components-rn/package.json
(1 hunks)packages/taro-components/package.json
(1 hunks)packages/taro-extend/package.json
(1 hunks)packages/taro-framework-react/package.json
(1 hunks)packages/taro-framework-solid/package.json
(1 hunks)packages/taro-framework-vue3/package.json
(1 hunks)packages/taro-h5/package.json
(1 hunks)packages/taro-helper/package.json
(1 hunks)packages/taro-loader/package.json
(1 hunks)packages/taro-platform-alipay/package.json
(1 hunks)packages/taro-platform-ascf/package.json
(1 hunks)packages/taro-platform-h5/package.json
(1 hunks)packages/taro-platform-harmony-cpp/package.json
(1 hunks)packages/taro-platform-harmony-hybrid/package.json
(1 hunks)packages/taro-platform-harmony/package.json
(1 hunks)packages/taro-platform-jd/package.json
(1 hunks)packages/taro-platform-qq/package.json
(1 hunks)packages/taro-platform-swan/package.json
(1 hunks)packages/taro-platform-tt/package.json
(1 hunks)packages/taro-platform-weapp/package.json
(1 hunks)packages/taro-plugin-generator/README.md
(1 hunks)packages/taro-plugin-generator/package.json
(1 hunks)packages/taro-plugin-generator/src/generators/es5/babel.ts
(1 hunks)packages/taro-plugin-generator/src/generators/es5/config.ts
(1 hunks)packages/taro-plugin-generator/src/generators/es5/index.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/config.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/deps.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/index.ts
(1 hunks)packages/taro-plugin-generator/src/index.ts
(1 hunks)packages/taro-plugin-generator/src/types/define.d.ts
(1 hunks)packages/taro-plugin-generator/src/utils/ast.ts
(1 hunks)packages/taro-plugin-generator/src/utils/error.ts
(1 hunks)packages/taro-plugin-generator/src/utils/index.ts
(1 hunks)packages/taro-plugin-generator/tsconfig.json
(1 hunks)packages/taro-plugin-html/package.json
(1 hunks)packages/taro-plugin-http/package.json
(1 hunks)packages/taro-plugin-inject/package.json
(1 hunks)packages/taro-plugin-mini-ci/package.json
(1 hunks)packages/taro-plugin-react-devtools/package.json
(1 hunks)packages/taro-plugin-vue-devtools/package.json
(1 hunks)packages/taro-react/package.json
(1 hunks)packages/taro-rn-runner/package.json
(1 hunks)packages/taro-rn-style-transformer/package.json
(1 hunks)packages/taro-rn-supporter/package.json
(1 hunks)packages/taro-rn-transformer/package.json
(1 hunks)packages/taro-rn/package.json
(1 hunks)packages/taro-router-rn/package.json
(1 hunks)packages/taro-router/package.json
(1 hunks)packages/taro-runner-utils/package.json
(1 hunks)packages/taro-runtime-rn/package.json
(1 hunks)packages/taro-runtime/package.json
(1 hunks)packages/taro-service/package.json
(1 hunks)packages/taro-transformer-wx/package.json
(1 hunks)packages/taro-vite-runner/package.json
(1 hunks)packages/taro-webpack5-prebundle/package.json
(1 hunks)packages/taro-webpack5-runner/package.json
(1 hunks)packages/taro-with-weapp/package.json
(1 hunks)packages/taro/package.json
(1 hunks)packages/taroize/package.json
(1 hunks)
✅ Files skipped from review due to trivial changes (6)
- packages/taro-plugin-generator/README.md
- packages/taroize/package.json
- packages/taro-cli-convertor/package.json
- packages/stylelint-taro-rn/package.json
- packages/taro/package.json
- packages/taro-plugin-generator/src/utils/index.ts
🚧 Files skipped from review as they are similar to previous changes (87)
- packages/taro-components-advanced/package.json
- packages/taro-platform-swan/package.json
- package.json
- npm/darwin-x64/package.json
- packages/taro-loader/package.json
- packages/jest-helper/package.json
- packages/babel-preset-taro/package.json
- packages/taro-platform-jd/package.json
- packages/taro-cli/templates/default/config/index.js
- packages/taro-webpack5-runner/package.json
- packages/postcss-plugin-constparse/package.json
- packages/rollup-plugin-copy/package.json
- packages/stylelint-taro/package.json
- packages/taro-h5/package.json
- packages/taro-extend/package.json
- packages/postcss-unit-transform/package.json
- packages/taro-platform-weapp/package.json
- packages/stylelint-config-taro-rn/package.json
- packages/taro-platform-h5/package.json
- npm/linux-x64-gnu/package.json
- packages/taro-plugin-vue-devtools/package.json
- packages/create-app/package.json
- packages/taro-with-weapp/package.json
- packages/eslint-config-taro/package.json
- packages/taro-components-react/package.json
- packages/babel-plugin-transform-solid-jsx/package.json
- packages/taro-components-library-react/package.json
- packages/taro-platform-tt/package.json
- packages/taro-platform-alipay/package.json
- packages/taro-rn-style-transformer/package.json
- packages/taro-platform-harmony-cpp/package.json
- packages/taro-rn-runner/package.json
- packages/shared/package.json
- crates/native_binding/package.json
- packages/babel-plugin-transform-react-jsx-to-rn-stylesheet/package.json
- packages/taro-rn-supporter/package.json
- packages/taro-react/package.json
- packages/taro-plugin-react-devtools/package.json
- packages/taro-helper/package.json
- packages/eslint-plugin-taro/package.json
- packages/taro-plugin-mini-ci/package.json
- npm/win32-x64-msvc/package.json
- packages/taro-runner-utils/package.json
- packages/taro-webpack5-prebundle/package.json
- packages/taro-framework-react/package.json
- packages/taro-platform-ascf/package.json
- packages/taro-rn/package.json
- packages/taro-platform-harmony-hybrid/package.json
- packages/taro-plugin-html/package.json
- packages/taro-router/package.json
- packages/taro-components-library-solid/package.json
- packages/taro-router-rn/package.json
- packages/taro-rn-transformer/package.json
- packages/taro-platform-qq/package.json
- packages/babel-plugin-transform-taroapi/package.json
- packages/taro-framework-vue3/package.json
- packages/taro-transformer-wx/package.json
- packages/taro-plugin-inject/package.json
- packages/postcss-html-transform/package.json
- packages/taro-cli/tsconfig.json
- packages/css-to-react-native/package.json
- packages/taro-api/package.json
- packages/taro-components-library-vue3/package.json
- packages/taro-service/package.json
- packages/taro-components/package.json
- npm/linux-x64-musl/package.json
- packages/taro-plugin-http/package.json
- npm/darwin-arm64/package.json
- packages/taro-platform-harmony/package.json
- packages/taro-runtime-rn/package.json
- packages/taro-runtime/package.json
- packages/taro-vite-runner/package.json
- packages/taro-plugin-generator/tsconfig.json
- packages/taro-framework-solid/package.json
- packages/taro-cli/package.json
- packages/taro-plugin-generator/src/index.ts
- packages/taro-plugin-generator/src/generators/tailwindcss/index.ts
- packages/taro-plugin-generator/src/generators/tailwindcss/deps.ts
- packages/taro-plugin-generator/src/utils/ast.ts
- packages/taro-cli/templates/default/package.json.tmpl
- packages/taro-plugin-generator/src/generators/es5/index.ts
- packages/taro-plugin-generator/src/types/define.d.ts
- packages/taro-plugin-generator/src/utils/error.ts
- packages/taro-plugin-generator/package.json
- packages/taro-components-rn/package.json
- packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts
- packages/postcss-pxtransform/package.json
🧰 Additional context used
🧬 Code Graph Analysis (2)
packages/taro-plugin-generator/src/generators/es5/config.ts (3)
packages/taro-plugin-generator/src/utils/error.ts (2)
GeneratorError
(10-20)GeneratorErrorType
(3-6)packages/taro-rn/script/getApiList.js (2)
ast
(9-9)parser
(3-3)packages/taro-plugin-generator/src/utils/ast.ts (1)
ensureNestedObjectProperty
(9-33)
packages/taro-plugin-generator/src/generators/tailwindcss/config.ts (2)
packages/taro-plugin-generator/src/utils/error.ts (2)
GeneratorError
(10-20)GeneratorErrorType
(3-6)packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts (1)
ObjectExpression
(60-88)
⏰ Context from checks skipped due to timeout of 90000ms (6)
- GitHub Check: Build Rust Binding / stable - aarch64-apple-darwin
- GitHub Check: Build Rust Binding / stable - x86_64-apple-darwin
- GitHub Check: Build Rust Binding / stable - x86_64-pc-windows-msvc
- GitHub Check: Build Rust Binding / stable - x86_64-pc-windows-msvc
- GitHub Check: Build Rust Binding / stable - x86_64-apple-darwin
- GitHub Check: Build Rust Binding / stable - aarch64-apple-darwin
🔇 Additional comments (7)
packages/taro-plugin-generator/src/generators/tailwindcss/config.ts (2)
112-243
: webpack5 配置处理逻辑清晰函数正确处理了 webpack5 配置的 AST 遍历和插件安装逻辑,包括检查现有插件避免重复安装。
245-411
: vite 配置处理逻辑完善函数很好地处理了 vite 配置的多种情况,包括字符串形式和对象形式的 compiler 配置,以及插件重复检查机制。
packages/taro-plugin-generator/src/generators/es5/babel.ts (2)
76-100
: 函数实现逻辑清晰
updateBabelConfig
函数的主要逻辑实现合理:
- 先检查文件是否存在,不存在则创建默认配置
- 存在则解析并修改现有配置
- 错误处理和日志输出完善
241-254
:insertUseBuiltInsProp
函数实现简洁高效该辅助函数处理
useBuiltIns
属性的插入和更新逻辑清晰:
- 正确查找现有属性
- 适当处理存在和不存在两种情况
- 使用了统一的值表达式解析
packages/taro-plugin-generator/src/generators/es5/config.ts (3)
1-11
: 导入配置合理且完整所有必要的 Babel 工具和项目内部工具都已正确导入,为 AST 操作提供了完整的支持。
13-33
: 错误定义结构清晰且具有指导性错误消息提供了清晰的配置结构示例,帮助开发者理解期望的配置格式。使用
dedent
保持了代码的可读性。
38-65
: 主函数逻辑结构合理使用 AST 解析和遍历的方式来修改配置文件是合适的技术选择,代码结构清晰且易于理解。
* 往配置文件中插入: | ||
* process.env.BROWSERSLIST_ENV = process.env.NODE_ENV | ||
*/ | ||
function insertBrowerlistEnv(ast: t.Node) { |
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.
注释中的拼写错误
注释中的 "Browerlist" 应为 "Browserlist",与函数名保持一致。
- * 往配置文件中插入:
+ * 往配置文件中插入 browserlist 环境变量:
Committable suggestion skipped: line range outside the PR's diff.
🤖 Prompt for AI Agents
In packages/taro-plugin-generator/src/generators/es5/config.ts at line 106,
correct the spelling of "Browerlist" to "Browserlist" in the comment to match
the function name insertBrowserlistEnv.
d838766
to
0c1ffe9
Compare
de61a5b
to
0066af0
Compare
219a2f1
to
17d8b9f
Compare
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
♻️ Duplicate comments (10)
packages/taro-plugin-generator/src/generators/tailwindcss/config.ts (6)
12-29
: 缺少错误处理和参数验证该函数存在以下问题:
- 文件读写操作缺少 try-catch 错误处理
compilerType
参数未验证,如果传入非预期值会静默执行建议添加错误处理:
export async function updateConfig(options: { ctx: IPluginContext, compilerType: 'webpack5' | 'vite' }) { const { ctx, compilerType } = options const { fs } = ctx.helper - const sourceCode = await fs.readFile(ctx.paths.configPath, { encoding: 'utf-8' }) - const ast = parser.parse(sourceCode, { - sourceType: 'module', - plugins: ['typescript'], - }) - - if (compilerType === 'webpack5') { - processWebpack5Config(ast) - } else if (compilerType === 'vite') { - processViteConfig(ast) + try { + const sourceCode = await fs.readFile(ctx.paths.configPath, { encoding: 'utf-8' }) + const ast = parser.parse(sourceCode, { + sourceType: 'module', + plugins: ['typescript'], + }) + + if (compilerType === 'webpack5') { + processWebpack5Config(ast) + } else if (compilerType === 'vite') { + processViteConfig(ast) + } else { + throw new Error(`不支持的编译器类型: ${compilerType}`) + } + const { code: latestConfig } = generator(ast) + await fs.writeFile(ctx.paths.configPath, latestConfig, { encoding: 'utf-8' }) + console.log('✅ 更新配置文件成功\n') + } catch (error) { + console.error(`❌ 更新配置文件失败: ${error.message}`) + throw error } - const { code: latestConfig } = generator(ast) - await fs.writeFile(ctx.paths.configPath, latestConfig, { encoding: 'utf-8' }) - console.log('✅ 更新配置文件成功\n') }
89-94
: 可能导致重复导入在向现有导入语句添加命名导入时,没有检查该导入是否已经存在。
建议在添加前检查是否已存在:
if (importedModule.get(moduleName)) { const importDecl = importedModule.get(moduleName) for (const importName of namedImport) { + const alreadyImported = importDecl.specifiers.some( + spec => t.isImportSpecifier(spec) && + t.isIdentifier(spec.imported) && + spec.imported.name === importName + ) + if (!alreadyImported) { importDecl?.specifiers.push(t.importSpecifier(t.identifier(importName), t.identifier(importName))) + } }
146-146
: 不安全的类型断言将
parser.parseExpression
的结果强制转换为t.CallExpression
可能导致运行时错误。建议添加类型验证:
- const installPluginStmt = parser.parseExpression(installPluginCode) as unknown as t.CallExpression + const installPluginStmt = parser.parseExpression(installPluginCode) + if (!t.isCallExpression(installPluginStmt)) { + throw new Error('解析插件代码失败') + }
269-270
: 多处不安全的类型断言
parser.parseExpression
的结果被强制转换,可能导致运行时错误。建议添加类型验证:
- return parser.parseExpression(code) as t.CallExpression + const expr = parser.parseExpression(code) + if (!t.isCallExpression(expr)) { + throw new Error('解析插件代码失败') + } + return expr同样的问题也出现在
createPostcssPluginNode
函数中。
284-285
: 不安全的类型断言与第269-270行相同的问题,
parser.parseExpression
的结果被强制转换为t.ObjectExpression
。建议添加类型验证:
- return parser.parseExpression(code) as t.ObjectExpression + const expr = parser.parseExpression(code) + if (!t.isObjectExpression(expr)) { + throw new Error('解析PostCSS插件代码失败') + } + return expr
279-279
: 可选链操作可能导致运行时错误在配置对象中使用可选链时,如果
config.css
为undefined
,unshift
操作会失败。建议添加更完善的检查:
- if (typeof config.css?.postcss === 'object') { - config.css?.postcss.plugins?.unshift(tailwindcss()) + if (typeof config.css?.postcss === 'object' && Array.isArray(config.css.postcss.plugins)) { + config.css.postcss.plugins.unshift(tailwindcss()) }packages/taro-plugin-generator/src/generators/es5/babel.ts (4)
102-105
: 修复 AST 解析配置不一致问题
sourceType: 'module'
与babel.config.js
的 CommonJS 模块格式不匹配,可能导致解析错误。const ast = parser.parse(sourceCode, { - sourceType: 'module', + sourceType: 'script', plugins: ['typescript'], })
107-150
: 增强 AST 遍历的错误处理和覆盖性当前 AST 遍历存在以下问题:
- 只处理
module.exports = {}
模式,未处理exports.xxx
或其他导出模式- 缺少对意外 AST 结构的错误处理
考虑添加对其他导出模式的支持:
traverse(ast, { AssignmentExpression: (expr) => { // 现有的 module.exports = {} 处理逻辑 }, + // 处理 exports.presets = [] 等情况 + MemberExpression: (expr) => { + // 添加对其他导出模式的处理 + } })
163-239
:handlePresets
函数逻辑复杂,建议重构该函数处理多种 presets 配置模式,逻辑较为复杂,建议:
- 将不同处理模式拆分为独立的小函数
- 减少嵌套层级,提高可读性
- 添加更多注释说明各种情况
+// 处理字符串类型的 taro preset +function handleStringPreset(element: t.StringLiteral, index: number, elements: Array<t.Expression | t.SpreadElement | null>) { + if (element.value === 'taro') { + elements[index] = parser.parseExpression(config) + return true + } + return false +} + +// 处理数组类型的 taro preset +function handleArrayPreset(preset: t.ArrayExpression): boolean { + const first = preset.elements[0] + if (t.isStringLiteral(first) && first.value === 'taro') { + const options = preset.elements[1] + if (t.isObjectExpression(options)) { + insertUseBuiltInsProp(options) + return true + } + // 处理变量引用的情况... + } + return false +} function handlePresets(presets: t.ArrayExpression, nodePath: NodePath) { const { elements } = presets let modified = false - // 原有的复杂逻辑 + // 简化后的主循环 + for (let i = 0; i < elements.length && !modified; i += 1) { + const el = elements[i] + + if (t.isStringLiteral(el)) { + modified = handleStringPreset(el, i, elements) + } else if (t.isArrayExpression(el)) { + modified = handleArrayPreset(el) + } else if (t.isIdentifier(el)) { + modified = handleIdentifierPreset(el, nodePath) + } + }
190-195
: 嵌套函数中的异常处理可能影响外层逻辑在
handleTaroPreset
嵌套函数内部抛出modifyConfigError
异常,但外层循环可能还有其他元素未处理完成。建议将异常处理移到更合适的位置,或者使用返回值来标识错误状态。- throw modifyConfigError + return false // 或者设置错误标识,在外层处理
🧹 Nitpick comments (1)
packages/taro-plugin-generator/src/generators/es5/babel.ts (1)
245-245
: 考虑使用更健壮的 AST 节点构造方式当前使用硬编码字符串解析来创建条件表达式,虽然可行但可能不够健壮。
- const builtInValue = parser.parseExpression("process.env.TARO_ENV === 'h5' ? 'usage' : false") + const builtInValue = t.conditionalExpression( + t.binaryExpression( + '===', + t.memberExpression( + t.memberExpression(t.identifier('process'), t.identifier('env')), + t.identifier('TARO_ENV') + ), + t.stringLiteral('h5') + ), + t.stringLiteral('usage'), + t.booleanLiteral(false) + )
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
pnpm-lock.yaml
is excluded by!**/pnpm-lock.yaml
📒 Files selected for processing (96)
crates/native_binding/package.json
(1 hunks)npm/darwin-arm64/package.json
(1 hunks)npm/darwin-x64/package.json
(1 hunks)npm/linux-x64-gnu/package.json
(1 hunks)npm/linux-x64-musl/package.json
(1 hunks)npm/win32-x64-msvc/package.json
(1 hunks)package.json
(1 hunks)packages/babel-plugin-transform-react-jsx-to-rn-stylesheet/package.json
(1 hunks)packages/babel-plugin-transform-solid-jsx/package.json
(1 hunks)packages/babel-plugin-transform-taroapi/package.json
(1 hunks)packages/babel-preset-taro/package.json
(1 hunks)packages/create-app/package.json
(1 hunks)packages/css-to-react-native/package.json
(1 hunks)packages/eslint-config-taro/package.json
(1 hunks)packages/eslint-plugin-taro/package.json
(1 hunks)packages/jest-helper/package.json
(1 hunks)packages/postcss-html-transform/package.json
(1 hunks)packages/postcss-plugin-constparse/package.json
(1 hunks)packages/postcss-pxtransform/package.json
(1 hunks)packages/postcss-unit-transform/package.json
(1 hunks)packages/rollup-plugin-copy/package.json
(1 hunks)packages/shared/package.json
(1 hunks)packages/stylelint-config-taro-rn/package.json
(1 hunks)packages/stylelint-taro-rn/package.json
(1 hunks)packages/stylelint-taro/package.json
(1 hunks)packages/taro-api/package.json
(1 hunks)packages/taro-cli-convertor/package.json
(1 hunks)packages/taro-cli/package.json
(1 hunks)packages/taro-cli/templates/default/config/index.js
(1 hunks)packages/taro-cli/templates/default/package.json.tmpl
(2 hunks)packages/taro-cli/tsconfig.json
(1 hunks)packages/taro-components-advanced/package.json
(1 hunks)packages/taro-components-library-react/package.json
(1 hunks)packages/taro-components-library-solid/package.json
(1 hunks)packages/taro-components-library-vue3/package.json
(1 hunks)packages/taro-components-react/package.json
(1 hunks)packages/taro-components-rn/package.json
(1 hunks)packages/taro-components/package.json
(1 hunks)packages/taro-extend/package.json
(1 hunks)packages/taro-framework-react/package.json
(1 hunks)packages/taro-framework-solid/package.json
(1 hunks)packages/taro-framework-vue3/package.json
(1 hunks)packages/taro-h5/package.json
(1 hunks)packages/taro-helper/package.json
(1 hunks)packages/taro-loader/package.json
(1 hunks)packages/taro-platform-alipay/package.json
(1 hunks)packages/taro-platform-ascf/package.json
(1 hunks)packages/taro-platform-h5/package.json
(1 hunks)packages/taro-platform-harmony-cpp/package.json
(1 hunks)packages/taro-platform-harmony-hybrid/package.json
(1 hunks)packages/taro-platform-harmony/package.json
(1 hunks)packages/taro-platform-jd/package.json
(1 hunks)packages/taro-platform-qq/package.json
(1 hunks)packages/taro-platform-swan/package.json
(1 hunks)packages/taro-platform-tt/package.json
(1 hunks)packages/taro-platform-weapp/package.json
(1 hunks)packages/taro-plugin-generator/README.md
(1 hunks)packages/taro-plugin-generator/package.json
(1 hunks)packages/taro-plugin-generator/src/generators/es5/babel.ts
(1 hunks)packages/taro-plugin-generator/src/generators/es5/config.ts
(1 hunks)packages/taro-plugin-generator/src/generators/es5/index.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/config.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/deps.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts
(1 hunks)packages/taro-plugin-generator/src/generators/tailwindcss/index.ts
(1 hunks)packages/taro-plugin-generator/src/index.ts
(1 hunks)packages/taro-plugin-generator/src/types/define.d.ts
(1 hunks)packages/taro-plugin-generator/src/utils/ast.ts
(1 hunks)packages/taro-plugin-generator/src/utils/error.ts
(1 hunks)packages/taro-plugin-generator/src/utils/index.ts
(1 hunks)packages/taro-plugin-generator/tsconfig.json
(1 hunks)packages/taro-plugin-html/package.json
(1 hunks)packages/taro-plugin-http/package.json
(1 hunks)packages/taro-plugin-inject/package.json
(1 hunks)packages/taro-plugin-mini-ci/package.json
(1 hunks)packages/taro-plugin-react-devtools/package.json
(1 hunks)packages/taro-plugin-vue-devtools/package.json
(1 hunks)packages/taro-react/package.json
(1 hunks)packages/taro-rn-runner/package.json
(1 hunks)packages/taro-rn-style-transformer/package.json
(1 hunks)packages/taro-rn-supporter/package.json
(1 hunks)packages/taro-rn-transformer/package.json
(1 hunks)packages/taro-rn/package.json
(1 hunks)packages/taro-router-rn/package.json
(1 hunks)packages/taro-router/package.json
(1 hunks)packages/taro-runner-utils/package.json
(1 hunks)packages/taro-runtime-rn/package.json
(1 hunks)packages/taro-runtime/package.json
(1 hunks)packages/taro-service/package.json
(1 hunks)packages/taro-transformer-wx/package.json
(1 hunks)packages/taro-vite-runner/package.json
(1 hunks)packages/taro-webpack5-prebundle/package.json
(1 hunks)packages/taro-webpack5-runner/package.json
(1 hunks)packages/taro-with-weapp/package.json
(1 hunks)packages/taro/package.json
(1 hunks)packages/taroize/package.json
(1 hunks)
✅ Files skipped from review due to trivial changes (5)
- npm/linux-x64-musl/package.json
- packages/taro-platform-jd/package.json
- packages/taro-components-react/package.json
- packages/taro-router/package.json
- packages/stylelint-taro-rn/package.json
🚧 Files skipped from review as they are similar to previous changes (89)
- packages/taro-rn-runner/package.json
- packages/taro-react/package.json
- packages/taro-plugin-mini-ci/package.json
- packages/taro/package.json
- packages/css-to-react-native/package.json
- packages/taro-rn-supporter/package.json
- packages/create-app/package.json
- packages/taro-plugin-http/package.json
- packages/taro-webpack5-prebundle/package.json
- npm/darwin-x64/package.json
- packages/taro-rn-transformer/package.json
- packages/taro-components-library-solid/package.json
- packages/taro-platform-weapp/package.json
- packages/stylelint-taro/package.json
- packages/taro-components-library-react/package.json
- packages/taro-runner-utils/package.json
- packages/eslint-plugin-taro/package.json
- npm/darwin-arm64/package.json
- packages/taro-components-library-vue3/package.json
- packages/taro-rn/package.json
- packages/taro-plugin-html/package.json
- packages/taro-webpack5-runner/package.json
- packages/taro-vite-runner/package.json
- packages/taro-framework-react/package.json
- packages/taro-h5/package.json
- packages/taro-platform-harmony-hybrid/package.json
- packages/shared/package.json
- packages/postcss-plugin-constparse/package.json
- packages/postcss-pxtransform/package.json
- package.json
- packages/taro-platform-swan/package.json
- packages/babel-plugin-transform-taroapi/package.json
- packages/postcss-html-transform/package.json
- packages/postcss-unit-transform/package.json
- packages/rollup-plugin-copy/package.json
- packages/taro-api/package.json
- packages/taro-cli/package.json
- packages/taro-components-advanced/package.json
- packages/taro-service/package.json
- crates/native_binding/package.json
- npm/linux-x64-gnu/package.json
- packages/taro-runtime/package.json
- packages/taro-plugin-vue-devtools/package.json
- packages/jest-helper/package.json
- npm/win32-x64-msvc/package.json
- packages/taro-platform-alipay/package.json
- packages/taro-platform-ascf/package.json
- packages/taro-loader/package.json
- packages/taro-plugin-generator/README.md
- packages/taro-platform-h5/package.json
- packages/taro-components/package.json
- packages/taro-plugin-inject/package.json
- packages/stylelint-config-taro-rn/package.json
- packages/taro-runtime-rn/package.json
- packages/taro-router-rn/package.json
- packages/taro-plugin-react-devtools/package.json
- packages/taro-transformer-wx/package.json
- packages/taro-platform-tt/package.json
- packages/taro-platform-harmony-cpp/package.json
- packages/taro-framework-solid/package.json
- packages/taro-platform-harmony/package.json
- packages/eslint-config-taro/package.json
- packages/taro-cli-convertor/package.json
- packages/babel-plugin-transform-solid-jsx/package.json
- packages/babel-preset-taro/package.json
- packages/taro-cli/templates/default/config/index.js
- packages/babel-plugin-transform-react-jsx-to-rn-stylesheet/package.json
- packages/taro-helper/package.json
- packages/taroize/package.json
- packages/taro-plugin-generator/tsconfig.json
- packages/taro-rn-style-transformer/package.json
- packages/taro-plugin-generator/src/generators/tailwindcss/deps.ts
- packages/taro-with-weapp/package.json
- packages/taro-components-rn/package.json
- packages/taro-extend/package.json
- packages/taro-framework-vue3/package.json
- packages/taro-platform-qq/package.json
- packages/taro-cli/tsconfig.json
- packages/taro-plugin-generator/src/index.ts
- packages/taro-plugin-generator/src/generators/es5/index.ts
- packages/taro-plugin-generator/src/utils/ast.ts
- packages/taro-cli/templates/default/package.json.tmpl
- packages/taro-plugin-generator/src/generators/tailwindcss/index.ts
- packages/taro-plugin-generator/package.json
- packages/taro-plugin-generator/src/generators/es5/config.ts
- packages/taro-plugin-generator/src/types/define.d.ts
- packages/taro-plugin-generator/src/utils/index.ts
- packages/taro-plugin-generator/src/utils/error.ts
- packages/taro-plugin-generator/src/generators/tailwindcss/emit.ts
🧰 Additional context used
🧠 Learnings (2)
packages/taro-plugin-generator/src/generators/es5/babel.ts (5)
Learnt from: ianzone
PR: NervJS/taro#17746
File: packages/taro-runtime/tsdown.config.ts:10-16
Timestamp: 2025-05-25T18:02:31.387Z
Learning: 在 taro-runtime 包的 tsdown 配置中,必须禁用 treeshake 来保留 dom-external/index.js 文件。
Learnt from: ianzone
PR: NervJS/taro#17842
File: packages/jest-helper/tsconfig.json:9-9
Timestamp: 2025-06-23T00:09:31.186Z
Learning: 在 jest-helper 包中,src 目录下没有 __tests__ 测试目录,只包含 resolver.ts、sequencer.ts 和 snapshot 目录。不要假设包中存在测试目录结构。
Learnt from: Single-Dancer
PR: NervJS/taro#17653
File: packages/taro-components-advanced/src/components/water-flow/node.ts:83-95
Timestamp: 2025-05-06T06:55:44.077Z
Learning: 在 Taro 的 water-flow 组件中,getRectSizeSync 函数如果找不到指定的节点,会一直处于 pending 状态而不是抛出错误。在这种情况下,应该使用 Promise.race 添加超时机制,而不是仅依赖 try/catch 来处理错误。
Learnt from: Single-Dancer
PR: NervJS/taro#17653
File: packages/taro-components-advanced/src/components/water-flow/node.ts:83-95
Timestamp: 2025-05-06T06:55:44.077Z
Learning: 在 Taro 的 water-flow 组件中,getRectSizeSync 函数如果找不到指定的节点并且重试次数用尽,会一直处于 pending 状态而不是抛出错误,因为它在 retryTimes <= 0 时直接返回而不 resolve 或 reject Promise。应该使用 Promise.race 添加超时机制来解决这个问题。
Learnt from: Single-Dancer
PR: NervJS/taro#17653
File: packages/taro-components-advanced/src/components/water-flow/node.ts:83-95
Timestamp: 2025-05-06T06:55:44.077Z
Learning: 在 Taro 的 getRectSizeSync 函数中,如果找不到指定的节点,函数会一直处于 pending 状态而不是抛出错误。在这种情况下,使用 try/catch 处理不够充分,需要添加超时处理如 Promise.race 来避免无限等待。
packages/taro-plugin-generator/src/generators/tailwindcss/config.ts (2)
Learnt from: Single-Dancer
PR: NervJS/taro#17653
File: packages/taro-components-advanced/src/components/water-flow/node.ts:83-95
Timestamp: 2025-05-06T06:55:44.077Z
Learning: 在 Taro 的 getRectSizeSync 函数中,如果找不到指定的节点,函数会一直处于 pending 状态而不是抛出错误。在这种情况下,使用 try/catch 处理不够充分,需要添加超时处理如 Promise.race 来避免无限等待。
Learnt from: ianzone
PR: NervJS/taro#17746
File: packages/taro-runtime/tsdown.config.ts:10-16
Timestamp: 2025-05-25T18:02:31.387Z
Learning: 在 taro-runtime 包的 tsdown 配置中,必须禁用 treeshake 来保留 dom-external/index.js 文件。
⏰ Context from checks skipped due to timeout of 90000ms (6)
- GitHub Check: Build Rust Binding / stable - x86_64-apple-darwin
- GitHub Check: Build Rust Binding / stable - aarch64-apple-darwin
- GitHub Check: Build Rust Binding / stable - x86_64-pc-windows-msvc
- GitHub Check: Build Rust Binding / stable - aarch64-apple-darwin
- GitHub Check: Build Rust Binding / stable - x86_64-pc-windows-msvc
- GitHub Check: Build Rust Binding / stable - x86_64-apple-darwin
🔇 Additional comments (1)
packages/taro-plugin-generator/src/generators/es5/babel.ts (1)
1-45
: 常量定义和导入设置良好导入语句和常量定义结构清晰,错误消息模板详细且有助于用户理解配置格式。
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## main #17886 +/- ##
=======================================
Coverage 55.90% 55.90%
=======================================
Files 417 417
Lines 21693 21693
Branches 5381 5357 -24
=======================================
Hits 12127 12127
+ Misses 7961 7956 -5
- Partials 1605 1610 +5
Flags with carried forward coverage won't be shown. Click here to find out more. 🚀 New features to boost your workflow:
|
这个 PR 做了什么? (简要描述所做更改)
这个 PR 是什么类型? (至少选择一个)
这个 PR 涉及以下平台:
Summary by CodeRabbit
新功能
taro new
进入功能选择。文档
其他