generate-token-meta.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. const TypeDoc = require('typedoc');
  2. const fs = require('fs-extra');
  3. const getTokenList = (list, source) =>
  4. list
  5. .filter(
  6. item =>
  7. !item.comment?.blockTags.some(tag => tag.tag === '@internal' || tag.tag === '@private'),
  8. )
  9. .map(item => ({
  10. source,
  11. token: item.name,
  12. type: item.type.toString(),
  13. desc:
  14. item.comment?.blockTags
  15. ?.find(tag => tag.tag === '@desc')
  16. ?.content.reduce((result, str) => result.concat(str.text), '') || '',
  17. descEn:
  18. item.comment?.blockTags
  19. ?.find(tag => tag.tag === '@descEN')
  20. ?.content.reduce((result, str) => result.concat(str.text), '') || '',
  21. name:
  22. item.comment?.blockTags
  23. ?.find(tag => tag.tag === '@nameZH')
  24. ?.content.reduce((result, str) => result.concat(str.text), '') || '',
  25. nameEn:
  26. item.comment?.blockTags
  27. ?.find(tag => tag.tag === '@nameEN')
  28. ?.content.reduce((result, str) => result.concat(str.text), '') || '',
  29. }));
  30. function main() {
  31. const app = new TypeDoc.Application();
  32. // If you want TypeDoc to load tsconfig.json / typedoc.json files
  33. app.options.addReader(new TypeDoc.TSConfigReader());
  34. app.options.addReader(new TypeDoc.TypeDocReader());
  35. app.bootstrap({
  36. // typedoc options here
  37. entryPoints: ['components/theme/interface/index.ts'],
  38. skipErrorChecking: true,
  39. });
  40. const project = app.convert();
  41. if (project) {
  42. // Project may not have converted correctly
  43. const output = 'components/version/token-meta.json';
  44. const tokenMeta = {};
  45. let presetColors = [];
  46. project.children.forEach(type => {
  47. if (type.name === 'SeedToken') {
  48. tokenMeta.seed = getTokenList(type.children, 'seed');
  49. } else if (type.name === 'MapToken') {
  50. tokenMeta.map = getTokenList(type.children, 'map');
  51. } else if (type.name === 'AliasToken') {
  52. tokenMeta.alias = getTokenList(type.children, 'alias');
  53. } else if (type.name === 'PresetColors') {
  54. presetColors = type.type.target.elements.map(item => item.value);
  55. }
  56. });
  57. // Exclude preset colors
  58. tokenMeta.seed = tokenMeta.seed.filter(
  59. item => !presetColors.some(color => item.token.startsWith(color)),
  60. );
  61. tokenMeta.map = tokenMeta.map.filter(
  62. item => !presetColors.some(color => item.token.startsWith(color)),
  63. );
  64. tokenMeta.alias = tokenMeta.alias.filter(
  65. item => !presetColors.some(color => item.token.startsWith(color)),
  66. );
  67. tokenMeta.alias = tokenMeta.alias.filter(
  68. item => !tokenMeta.map.some(mapItem => mapItem.token === item.token),
  69. );
  70. tokenMeta.map = tokenMeta.map.filter(
  71. item => !tokenMeta.seed.some(seedItem => seedItem.token === item.token),
  72. );
  73. const finalMeta = Object.entries(tokenMeta).reduce((acc, [key, value]) => {
  74. value.forEach(item => {
  75. acc[item.token] = {
  76. name: item.name,
  77. nameEn: item.nameEn,
  78. desc: item.desc,
  79. descEn: item.descEn,
  80. type: item.type,
  81. source: key,
  82. };
  83. });
  84. return acc;
  85. }, {});
  86. fs.writeJsonSync(output, finalMeta, 'utf8');
  87. // eslint-disable-next-line no-console
  88. console.log(`✅ Token Meta has been written to ${output}`);
  89. }
  90. }
  91. main();