web-infra-dev / rsdoctor

A one-stop build analyzer for Rspack and Webpack.
https://rsdoctor.dev/
MIT License
331 stars 20 forks source link

[Feature]: Rule 在report的时候动态指定severity #331

Closed gezhicui closed 1 month ago

gezhicui commented 2 months ago

What problem does this feature solve?

自定义Rule的时候,我想指定超过多少个错误抛出error,否则抛warn,我希望能够在自定义的rule内部自己判断report的错误等级是error还是warn,而不是只能在meta中定义Rule的severity (如果report中没有severity,默认使用meta的severity)

What does the proposed API look like?

const defaultSeverity = 'Error'
export const xxx = defineRule<>(() => ({
  meta: {
    title,
    severity
  },
  check({ packageGraph, ruleConfig, report }) {
    const severity = ''
    if (xxx) {
      severity = 'Error'
    } else {
      severity = 'Warn'
    }

    report({
      severity,
      message: 'xxxx'
    })
  },

是否未来会有这个功能?或有其它满足我的需求的解决方式?希望能够尽快得到回复 谢谢!~

easy1090 commented 1 month ago

自定义Rule的时候,我想指定超过多少个错误抛出error,否则抛warn

你希望 error 和 warn 是按照自定义 Rule 报错个数来定的?这个好像有些奇怪,因为不同 Rule 的重要性可能不同的。感觉应该是每个 Rule 都拥有自己的规则严重性?

我希望能够在自定义的rule内部自己判断report的错误等级是error还是warn,而不是只能在meta中定义Rule的severity

自定义拓展规则文档中虽然没有描述(考虑到自定义规则使用方式可能未来变动,所以暂时没透出,后续会在文档中说明拓展方式),不过确实如你所说在 meta 中定义,不过这个 meta 中的 severity 就是只针对单个自定义规则而设定的。例如下面的 "check-rule-name" 规则,这个规则的 severity 就是 warn, 这个 meta.severity 用户可以自行定义的。

const CheckRule = defineRule(() => ({
  meta: {
    category: "bundle",
    severity: "Warn",
    title: "check-rule-name",
    defaultConfig: {
      config: 1,
    },
  },
  check(ruleContext) {
    // ..
  },
}));

export default {
  plugin: [
    new RsdoctorWebpackPlugin({
      linter: {
        level: "Error",
        extends: [CheckRule],
        rules: {
          "check-rule-name": [
            "on",
            {
              config: 2,
            },
          ],
        },
      },
    }),
  ],
};
/** 规则数据 */
interface RuleData<Config = undefined> {
  meta: RuleMeta<Config>;
  check: CheckCallback<Config>;
}

interface RuleMeta<Config> {
  /** 错误标题 */
  title: string;
  /** 错误等级 */
  severity: Severity;
  /** 详细文档链接 */
  referenceUrl?: string;
  /** 默认配置 */
  defaultConfig?: Config;
}
gezhicui commented 1 month ago

感谢回答,但是可能是因为我的描述不够清楚,我们的理解好像有一点偏差,我想表达的意思是,rule的severity是静态的,一开始就需要定死,而我现在希望能够在运行时修改rule的severity,比如说:

export const xxx = defineRule<>(() => ({
  meta: {
    title,
  },
  check({ packageGraph, ruleConfig, report }) {

    // 在这里我会做一些自定义的产物分析

    report({
      severity:根据自定义产物分析结果自己决定本规则report的是Warn还是Error,
      message: 'xxxx'
    })
  },
easy1090 commented 1 month ago

@gezhicui 我明白你的意思了,这个需求合理的,我会先记到 TODO List 中。另外,请问有兴趣参与共建吗,可以尝试来实现这个特性。

gezhicui commented 1 month ago

感谢 是有兴趣的 直接提pr吗

easy1090 commented 1 month ago

感谢 是有兴趣的 直接提pr吗

是的 🫶🫶