benjycui/bisheng

config of plugin need support complex object

Opened this issue · 4 comments

suck as

const config = {
  base: {
    exclude: ['children'],
  },
  i18n: {
    'en-US': {
      columnNames: [
        {
          label: 'Property',
          key: 'name',
        },
        {
          label: 'Description',
          key: 'description',
        },
        {
          label: 'Type',
          key: 'types',
        },
        {
          label: 'Default',
          key: 'default',
        },
      ],
    },
  },
};

although we can use trick,such as base64

有比较好的 API 设计形式吗?我这边希望的是:

  • 能够比较清晰的在 themeConfig 中知道是哪个 plugin 的 config,作用域明确;
  • 现在的 plugin 是基于 path 去拿的,相当于没有 id,这个可能是区分 config 作用域会遇到的一个阻力;
  • 另一点就是,新的设计如何不 break,是不是能够只做一个语法糖类型的东西。

有比较好的 API 设计形式吗?我这边希望的是:

  • 能够比较清晰的在 themeConfig 中知道是哪个 plugin 的 config,作用域明确;
  • 现在的 plugin 是基于 path 去拿的,相当于没有 id,这个可能是区分 config 作用域会遇到的一个阻力;
  • 另一点就是,新的设计如何不 break。

我随便举一个例子。

const plugins = [
  {
    config: {},
    use: "bisheng-plugin-xxx"
  }
];

因为 bisheng 的配置是用 js 文件写的,config 里面用户可以随便怎么写,怎么传都可以。
如果不要 break,只需要解析的时候用 typeof 判断一下 config 是否是一个对象。如果是字符串则用原来的方法,如果是对象则用新的方法。
我现在使用的方法很 trick

配置的时候

`bisheng-plugin-typescript-interface?encodeConfig=${Buffer.from(
      JSON.stringify(bishengPluginTypescriptInterfaceConfig),
    ).toString('base64')}`

解析的时候

const pluginTableConfig = JSON.parse(
        Buffer.from(encodeConfig, 'base64').toString()
      );

你关联的 antd 的 pr 我看到了,我反而觉得现在 trick 的实现也不错。
按你的这个设计走的话,如果这么写的话,算非法行为吧。

const plugins = [
  {
    config: {a: 'b'},
    use: "bisheng-plugin-xxx?a=b"
  }
];