@maple-design/cli-vue 0.0.0-stage → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. package/README.md +305 -2
  2. package/README.zh-CN.md +305 -0
  3. package/bin/cli.mjs +5 -0
  4. package/client.d.ts +1 -0
  5. package/client.js +1 -0
  6. package/lib/client/appType.d.ts +4 -0
  7. package/lib/client/appType.js +7 -0
  8. package/lib/client/index.d.ts +29 -0
  9. package/lib/client/index.js +170 -0
  10. package/lib/client/language.d.ts +11 -0
  11. package/lib/client/language.js +52 -0
  12. package/lib/client/theme-state.d.ts +3 -0
  13. package/lib/client/theme-state.js +6 -0
  14. package/lib/node/bin.d.ts +2 -0
  15. package/lib/node/bin.js +154 -0
  16. package/lib/node/commands/build.d.ts +1 -0
  17. package/lib/node/commands/build.js +15 -0
  18. package/lib/node/commands/checklist.d.ts +6 -0
  19. package/lib/node/commands/checklist.js +59 -0
  20. package/lib/node/commands/compile.d.ts +3 -0
  21. package/lib/node/commands/compile.js +41 -0
  22. package/lib/node/commands/create.d.ts +8 -0
  23. package/lib/node/commands/create.js +91 -0
  24. package/lib/node/commands/dev.d.ts +6 -0
  25. package/lib/node/commands/dev.js +58 -0
  26. package/lib/node/commands/extension.d.ts +3 -0
  27. package/lib/node/commands/extension.js +5 -0
  28. package/lib/node/commands/gen.d.ts +24 -0
  29. package/lib/node/commands/gen.js +91 -0
  30. package/lib/node/commands/icons.d.ts +4 -0
  31. package/lib/node/commands/icons.js +15 -0
  32. package/lib/node/commands/preview.d.ts +4 -0
  33. package/lib/node/commands/preview.js +18 -0
  34. package/lib/node/commands/styleVars.d.ts +1 -0
  35. package/lib/node/commands/styleVars.js +6 -0
  36. package/lib/node/commands/test.d.ts +7 -0
  37. package/lib/node/commands/test.js +16 -0
  38. package/lib/node/commands/vite.d.ts +2 -0
  39. package/lib/node/commands/vite.js +14 -0
  40. package/lib/node/compiler/compileModule.d.ts +4 -0
  41. package/lib/node/compiler/compileModule.js +78 -0
  42. package/lib/node/compiler/compileSFC.d.ts +6 -0
  43. package/lib/node/compiler/compileSFC.js +119 -0
  44. package/lib/node/compiler/compileScript.d.ts +27 -0
  45. package/lib/node/compiler/compileScript.js +221 -0
  46. package/lib/node/compiler/compileSiteEntry.d.ts +19 -0
  47. package/lib/node/compiler/compileSiteEntry.js +164 -0
  48. package/lib/node/compiler/compileStyle.d.ts +14 -0
  49. package/lib/node/compiler/compileStyle.js +55 -0
  50. package/lib/node/compiler/compileStyleVars.d.ts +3 -0
  51. package/lib/node/compiler/compileStyleVars.js +46 -0
  52. package/lib/node/compiler/compileTemplateHighlight.d.ts +18 -0
  53. package/lib/node/compiler/compileTemplateHighlight.js +133 -0
  54. package/lib/node/compiler/compileTypes.d.ts +2 -0
  55. package/lib/node/compiler/compileTypes.js +58 -0
  56. package/lib/node/compiler/generateLibraryEntry.d.ts +3 -0
  57. package/lib/node/compiler/generateLibraryEntry.js +152 -0
  58. package/lib/node/compiler/siteRoutes.d.ts +4 -0
  59. package/lib/node/compiler/siteRoutes.js +9 -0
  60. package/lib/node/config/maple.config.d.ts +215 -0
  61. package/lib/node/config/maple.config.js +32 -0
  62. package/lib/node/config/maple.default.config.d.ts +2 -0
  63. package/lib/node/config/maple.default.config.js +386 -0
  64. package/lib/node/config/site-resolver.d.ts +25 -0
  65. package/lib/node/config/site-resolver.js +138 -0
  66. package/lib/node/config/vite.config.d.ts +28 -0
  67. package/lib/node/config/vite.config.js +209 -0
  68. package/lib/node/config/vitest.config.d.ts +2 -0
  69. package/lib/node/config/vitest.config.js +54 -0
  70. package/lib/node/config/vitest.setup.d.ts +1 -0
  71. package/lib/node/config/vitest.setup.js +8 -0
  72. package/lib/node/index.d.ts +13 -0
  73. package/lib/node/index.js +13 -0
  74. package/lib/node/release/index.d.ts +20 -0
  75. package/lib/node/release/index.js +147 -0
  76. package/lib/node/shared/constant.d.ts +47 -0
  77. package/lib/node/shared/constant.js +53 -0
  78. package/lib/node/shared/fsUtils.d.ts +18 -0
  79. package/lib/node/shared/fsUtils.js +57 -0
  80. package/lib/node/shared/logger.d.ts +8 -0
  81. package/lib/node/shared/logger.js +18 -0
  82. package/lib/node/shared/serial-task.d.ts +2 -0
  83. package/lib/node/shared/serial-task.js +9 -0
  84. package/package.json +111 -3
  85. package/site/documentation-sections.spec.ts +45 -0
  86. package/site/documentation-sections.ts +48 -0
  87. package/site/index.html +89 -0
  88. package/site/mobile/App.vue +437 -0
  89. package/site/mobile/AppHome.vue +154 -0
  90. package/site/mobile/main.ts +99 -0
  91. package/site/mobile/route-sync.spec.ts +34 -0
  92. package/site/mobile/route-sync.ts +10 -0
  93. package/site/mobile.html +70 -0
  94. package/site/module.d.ts +5 -0
  95. package/site/pc/App.vue +44 -0
  96. package/site/pc/Layout.vue +641 -0
  97. package/site/pc/components/AppAd.vue +117 -0
  98. package/site/pc/components/AppHeader.vue +459 -0
  99. package/site/pc/components/AppMobile.spec.ts +204 -0
  100. package/site/pc/components/AppMobile.vue +201 -0
  101. package/site/pc/components/AppOutline.spec.ts +89 -0
  102. package/site/pc/components/AppOutline.vue +161 -0
  103. package/site/pc/components/AppSidebar.vue +144 -0
  104. package/site/pc/components/code-example/CodeExample.spec.ts +36 -0
  105. package/site/pc/components/code-example/CodeExample.vue +164 -0
  106. package/site/pc/components/code-example/codeExample.less +88 -0
  107. package/site/pc/components/code-example/index.ts +10 -0
  108. package/site/pc/components/demo-preview/DemoPreview.vue +92 -0
  109. package/site/pc/components/demo-preview/index.ts +8 -0
  110. package/site/pc/components/mobile-preview-url.ts +17 -0
  111. package/site/pc/components/preview-section.spec.ts +24 -0
  112. package/site/pc/components/preview-section.ts +23 -0
  113. package/site/pc/main.ts +108 -0
  114. package/site/pc/pages/index/index.vue +421 -0
  115. package/site/pc/pages/index/locale/en-US.ts +1 -0
  116. package/site/pc/pages/index/locale/zh-CN.ts +1 -0
  117. package/site/pc/responsive-layout.spec.ts +40 -0
  118. package/site/pc/route-state.spec.ts +34 -0
  119. package/site/pc/route-state.ts +25 -0
  120. package/site/pc/scroll-hash.spec.ts +49 -0
  121. package/site/pc/scroll-hash.ts +25 -0
  122. package/site/route-recovery.spec.ts +51 -0
  123. package/site/route-recovery.ts +38 -0
  124. package/site/tsconfig.json +16 -0
  125. package/site/types.ts +6 -0
  126. package/site/utils.ts +45 -0
  127. package/template/create/[ComponentName].tsx.ejs +16 -0
  128. package/template/create/[ComponentName].vue.ejs +21 -0
  129. package/template/create/[componentName].d.ts.ejs +13 -0
  130. package/template/create/__tests__/index.spec.js.ejs +10 -0
  131. package/template/create/docs/en-US.md +0 -0
  132. package/template/create/docs/zh-CN.md +0 -0
  133. package/template/create/example/index.vue.ejs +17 -0
  134. package/template/create/example/locale/_index.ts +17 -0
  135. package/template/create/example/locale/en-US.ts +3 -0
  136. package/template/create/example/locale/index.ts +24 -0
  137. package/template/create/example/locale/zh-CN.ts +3 -0
  138. package/template/create/index.ts.ejs +12 -0
  139. package/template/create/props.ts +1 -0
  140. package/template/create/style/[componentName].less.ejs +5 -0
  141. package/template/create/style/index.less.ejs +1 -0
  142. package/template/create/style/index.ts.ejs +1 -0
  143. package/template/generators/base/.browserslistrc +2 -0
  144. package/template/generators/base/.prettierignore +14 -0
  145. package/template/generators/base/README.md +90 -0
  146. package/template/generators/base/_gitignore +19 -0
  147. package/template/generators/base/eslint.config.js +15 -0
  148. package/template/generators/base/package.json +97 -0
  149. package/template/generators/base/prettier.config.js +3 -0
  150. package/template/generators/base/public/logo.svg +30 -0
  151. package/template/generators/base/shims/shims-md.d.ts +4 -0
  152. package/template/generators/base/shims/shims-vue.d.ts +6 -0
  153. package/template/generators/base/tsconfig.declaration.json +21 -0
  154. package/template/generators/base/tsconfig.json +28 -0
  155. package/template/generators/base/ui-build.config.mjs +16 -0
  156. package/template/generators/config/default/base/docs/home.zh-CN.md +3 -0
  157. package/template/generators/config/default/base/maple.config.mjs +49 -0
  158. package/template/generators/config/default/sfc/src/button/Button.vue +34 -0
  159. package/template/generators/config/default/sfc/src/button/__tests__/index.spec.js +8 -0
  160. package/template/generators/config/default/sfc/src/button/docs/zh-CN.md +39 -0
  161. package/template/generators/config/default/sfc/src/button/example/BasicUse.vue +7 -0
  162. package/template/generators/config/default/sfc/src/button/example/ModifyColor.vue +7 -0
  163. package/template/generators/config/default/sfc/src/button/example/index.vue +12 -0
  164. package/template/generators/config/default/sfc/src/button/index.ts +8 -0
  165. package/template/generators/config/default/sfc/src/button/style/button.less +14 -0
  166. package/template/generators/config/default/sfc/src/button/style/index.less +1 -0
  167. package/template/generators/config/default/sfc/src/button/style/index.ts +1 -0
  168. package/template/generators/config/default/sfc/src/utils/components.ts +20 -0
  169. package/template/generators/config/default/tsx/src/button/Button.tsx +30 -0
  170. package/template/generators/config/default/tsx/src/button/__tests__/index.spec.js +8 -0
  171. package/template/generators/config/default/tsx/src/button/docs/zh-CN.md +39 -0
  172. package/template/generators/config/default/tsx/src/button/example/BasicUse.vue +7 -0
  173. package/template/generators/config/default/tsx/src/button/example/ModifyColor.vue +7 -0
  174. package/template/generators/config/default/tsx/src/button/example/index.vue +12 -0
  175. package/template/generators/config/default/tsx/src/button/index.ts +8 -0
  176. package/template/generators/config/default/tsx/src/button/style/button.less +14 -0
  177. package/template/generators/config/default/tsx/src/button/style/index.less +1 -0
  178. package/template/generators/config/default/tsx/src/button/style/index.ts +1 -0
  179. package/template/generators/config/default/tsx/src/utils/components.ts +20 -0
  180. package/template/generators/config/i18n/base/docs/home.en-US.md +3 -0
  181. package/template/generators/config/i18n/base/docs/home.zh-CN.md +3 -0
  182. package/template/generators/config/i18n/base/maple.config.mjs +51 -0
  183. package/template/generators/config/i18n/sfc/src/button/Button.vue +38 -0
  184. package/template/generators/config/i18n/sfc/src/button/__tests__/index.spec.js +8 -0
  185. package/template/generators/config/i18n/sfc/src/button/docs/en-US.md +39 -0
  186. package/template/generators/config/i18n/sfc/src/button/docs/zh-CN.md +39 -0
  187. package/template/generators/config/i18n/sfc/src/button/example/BasicUse.vue +11 -0
  188. package/template/generators/config/i18n/sfc/src/button/example/ModifyColor.vue +11 -0
  189. package/template/generators/config/i18n/sfc/src/button/example/index.vue +15 -0
  190. package/template/generators/config/i18n/sfc/src/button/example/locale/en-US.ts +5 -0
  191. package/template/generators/config/i18n/sfc/src/button/example/locale/index.ts +23 -0
  192. package/template/generators/config/i18n/sfc/src/button/example/locale/zh-CN.ts +5 -0
  193. package/template/generators/config/i18n/sfc/src/button/index.ts +8 -0
  194. package/template/generators/config/i18n/sfc/src/button/style/button.less +14 -0
  195. package/template/generators/config/i18n/sfc/src/button/style/index.less +1 -0
  196. package/template/generators/config/i18n/sfc/src/button/style/index.ts +1 -0
  197. package/template/generators/config/i18n/sfc/src/locale/__tests__/index.spec.js +52 -0
  198. package/template/generators/config/i18n/sfc/src/locale/docs/en-US.md +26 -0
  199. package/template/generators/config/i18n/sfc/src/locale/docs/zh-CN.md +25 -0
  200. package/template/generators/config/i18n/sfc/src/locale/en-US.d.ts +5 -0
  201. package/template/generators/config/i18n/sfc/src/locale/en-US.ts +7 -0
  202. package/template/generators/config/i18n/sfc/src/locale/index.ts +82 -0
  203. package/template/generators/config/i18n/sfc/src/locale/zh-CN.d.ts +5 -0
  204. package/template/generators/config/i18n/sfc/src/locale/zh-CN.ts +7 -0
  205. package/template/generators/config/i18n/sfc/src/utils/components.ts +20 -0
  206. package/template/generators/config/i18n/tsx/src/button/Button.tsx +35 -0
  207. package/template/generators/config/i18n/tsx/src/button/__tests__/index.spec.js +8 -0
  208. package/template/generators/config/i18n/tsx/src/button/docs/en-US.md +39 -0
  209. package/template/generators/config/i18n/tsx/src/button/docs/zh-CN.md +39 -0
  210. package/template/generators/config/i18n/tsx/src/button/example/BasicUse.vue +11 -0
  211. package/template/generators/config/i18n/tsx/src/button/example/ModifyColor.vue +11 -0
  212. package/template/generators/config/i18n/tsx/src/button/example/index.vue +15 -0
  213. package/template/generators/config/i18n/tsx/src/button/example/locale/en-US.ts +5 -0
  214. package/template/generators/config/i18n/tsx/src/button/example/locale/index.ts +23 -0
  215. package/template/generators/config/i18n/tsx/src/button/example/locale/zh-CN.ts +5 -0
  216. package/template/generators/config/i18n/tsx/src/button/index.ts +8 -0
  217. package/template/generators/config/i18n/tsx/src/button/style/button.less +14 -0
  218. package/template/generators/config/i18n/tsx/src/button/style/index.less +1 -0
  219. package/template/generators/config/i18n/tsx/src/button/style/index.ts +1 -0
  220. package/template/generators/config/i18n/tsx/src/locale/__tests__/index.spec.js +52 -0
  221. package/template/generators/config/i18n/tsx/src/locale/docs/en-US.md +26 -0
  222. package/template/generators/config/i18n/tsx/src/locale/docs/zh-CN.md +25 -0
  223. package/template/generators/config/i18n/tsx/src/locale/en-US.d.ts +5 -0
  224. package/template/generators/config/i18n/tsx/src/locale/en-US.ts +7 -0
  225. package/template/generators/config/i18n/tsx/src/locale/index.ts +82 -0
  226. package/template/generators/config/i18n/tsx/src/locale/zh-CN.d.ts +5 -0
  227. package/template/generators/config/i18n/tsx/src/locale/zh-CN.ts +7 -0
  228. package/template/generators/config/i18n/tsx/src/utils/components.ts +20 -0
@@ -0,0 +1,221 @@
1
+ import { dirname, extname, relative, resolve } from 'path';
2
+ import babel from '@babel/core';
3
+ import { pascalCase } from '@maple-design/shared-vue';
4
+ import jsx from '@vue/babel-plugin-jsx';
5
+ import esbuild from 'esbuild';
6
+ import fse from 'fs-extra';
7
+ import { getMapleConfig } from '../config/maple.config.js';
8
+ import { ES_DIR } from '../shared/constant.js';
9
+ import { getVersion, isDir, isJsx, isTsx, replaceExt } from '../shared/fsUtils.js';
10
+ import { extractStyleDependencies, IMPORT_CSS_RE, IMPORT_LESS_RE, IMPORT_SCSS_RE } from './compileStyle.js';
11
+ const { transformAsync } = babel;
12
+ const { writeFileSync, readdirSync, readFileSync, removeSync, writeFile, pathExistsSync } = fse;
13
+ // https://regexr.com/765a4
14
+ export const IMPORT_FROM_DEPENDENCE_RE = /import\s+?[\w\s{},$*]+\s+from\s+?(".*?"|'.*?')/g;
15
+ // https://regexr.com/767e6
16
+ export const EXPORT_FROM_DEPENDENCE_RE = /export\s+?[\w\s{},$*]+\s+from\s+?(".*?"|'.*?')/g;
17
+ // https://regexr.com/764ve
18
+ export const IMPORT_DEPENDENCE_RE = /import\s+(".*?"|'.*?')/g;
19
+ export const scriptExtNames = ['.vue', '.ts', '.tsx', '.mjs', '.js', '.jsx'];
20
+ export const styleExtNames = ['.less', '.scss', '.css'];
21
+ export const scriptIndexes = ['index.mjs', 'index.vue', 'index.ts', 'index.tsx', 'index.js', 'index.jsx'];
22
+ export const styleIndexes = ['index.less', 'index.scss', 'index.css'];
23
+ export const tryMatchExtname = (file, extname) => {
24
+ for (const ext of extname) {
25
+ const matched = `${file}${ext}`;
26
+ if (pathExistsSync(matched)) {
27
+ return ext;
28
+ }
29
+ }
30
+ };
31
+ export const resolveAlias = (dependence, file, alias = {}) => {
32
+ let matchedAliasKey = Object.keys(alias).find((key) => dependence === key);
33
+ if (!matchedAliasKey) {
34
+ // @/ -> yes
35
+ // @maple-design/ui-vue -> no
36
+ matchedAliasKey = Object.keys(alias).find((key) => dependence.startsWith(`${key}/`));
37
+ }
38
+ if (!matchedAliasKey) {
39
+ return dependence;
40
+ }
41
+ const matchedAliasValue = alias[matchedAliasKey];
42
+ const isRelative = matchedAliasValue.startsWith('.');
43
+ const replacedValue = isRelative ? relative(dirname(file), resolve(ES_DIR, matchedAliasValue)) : matchedAliasValue;
44
+ return dependence.replace(matchedAliasKey, replacedValue);
45
+ };
46
+ export const resolveDependence = (file, script, alias = {}) => {
47
+ const replacer = (source, dependence) => {
48
+ // remove quotes
49
+ dependence = dependence.slice(1, dependence.length - 1);
50
+ const done = (targetDependence) => source.replace(dependence, targetDependence);
51
+ const resolvedDependence = resolveAlias(dependence, file, alias);
52
+ const isNodeModule = !resolvedDependence.startsWith('.');
53
+ if (isNodeModule) {
54
+ // e.g. rattail
55
+ return done(resolvedDependence);
56
+ }
57
+ const ext = extname(resolvedDependence);
58
+ const scriptExtname = getScriptExtname();
59
+ if (ext) {
60
+ if (scriptExtNames.includes(ext)) {
61
+ // e.g. './a.vue' -> './a.mjs'
62
+ return done(dependence.replace(ext, scriptExtname));
63
+ }
64
+ if (styleExtNames.includes(ext)) {
65
+ // e.g. './a.css' -> './a.css' './a.less' -> './a.less'
66
+ return source;
67
+ }
68
+ }
69
+ const targetDependenceFile = resolve(dirname(file), resolvedDependence);
70
+ if (!ext) {
71
+ // e.g. ../button/props -> ../button/props.mjs
72
+ const matchedScript = tryMatchExtname(targetDependenceFile, scriptExtNames);
73
+ if (matchedScript) {
74
+ return done(`${resolvedDependence}${scriptExtname}`);
75
+ }
76
+ const matchedStyle = tryMatchExtname(targetDependenceFile, styleExtNames);
77
+ if (matchedStyle) {
78
+ return done(`${resolvedDependence}${matchedStyle}`);
79
+ }
80
+ }
81
+ if (!ext && isDir(targetDependenceFile)) {
82
+ // e.g. ../button
83
+ const files = readdirSync(targetDependenceFile);
84
+ const hasScriptIndex = files.some((file) => scriptIndexes.some((name) => file.endsWith(name)));
85
+ if (hasScriptIndex) {
86
+ // e.g. -> ../button/index.mjs
87
+ return done(`${resolvedDependence}/index${scriptExtname}`);
88
+ }
89
+ const hasStyleIndex = files.some((file) => styleIndexes.some((name) => file.endsWith(name)));
90
+ if (hasStyleIndex) {
91
+ // e.g. -> ../button/index.css
92
+ return done(`${resolvedDependence}/index.css`);
93
+ }
94
+ }
95
+ return '';
96
+ };
97
+ return script
98
+ .replace(IMPORT_FROM_DEPENDENCE_RE, replacer)
99
+ .replace(EXPORT_FROM_DEPENDENCE_RE, replacer)
100
+ .replace(IMPORT_DEPENDENCE_RE, replacer);
101
+ };
102
+ export async function compileScriptByBabel(script, file) {
103
+ const { code } = (await transformAsync(script, {
104
+ filename: file,
105
+ babelrc: false,
106
+ presets: ['@babel/preset-typescript'],
107
+ plugins: [
108
+ [
109
+ jsx,
110
+ {
111
+ enableObjectSlots: false,
112
+ },
113
+ ],
114
+ ],
115
+ }));
116
+ return code;
117
+ }
118
+ export async function compileScriptByEsbuild(script) {
119
+ const mapleConfig = await getMapleConfig();
120
+ const { code } = await esbuild.transform(script, {
121
+ loader: 'ts',
122
+ target: mapleConfig?.esbuild?.target,
123
+ format: 'esm',
124
+ });
125
+ return code;
126
+ }
127
+ export async function compileScript(script, file) {
128
+ let code = isJsx(file) || isTsx(file) ? await compileScriptByBabel(script, file) : script;
129
+ code = await compileScriptByEsbuild(code);
130
+ const { alias } = await getMapleConfig();
131
+ if (code) {
132
+ code = resolveDependence(file, code, alias);
133
+ code = extractStyleDependencies(file, code, IMPORT_CSS_RE);
134
+ code = extractStyleDependencies(file, code, IMPORT_LESS_RE);
135
+ code = extractStyleDependencies(file, code, IMPORT_SCSS_RE);
136
+ }
137
+ removeSync(file);
138
+ writeFileSync(replaceExt(file, getScriptExtname()), code, 'utf8');
139
+ }
140
+ export async function compileScriptFile(file) {
141
+ const sources = readFileSync(file, 'utf-8');
142
+ await compileScript(sources, file);
143
+ }
144
+ export function getScriptExtname() {
145
+ return '.mjs';
146
+ }
147
+ export function generateEsEntryTemplate(options) {
148
+ const { publicDirs, scriptExtname = getScriptExtname(), root = './' } = options;
149
+ const imports = [];
150
+ const plugins = [];
151
+ const exports = [];
152
+ const cssImports = [];
153
+ const publicComponents = [];
154
+ publicDirs.forEach((dirname) => {
155
+ const publicComponent = pascalCase(dirname);
156
+ const module = `'${root}${dirname}/index${scriptExtname}'`;
157
+ publicComponents.push(publicComponent);
158
+ imports.push(`import ${publicComponent} from ${module}`);
159
+ exports.push(`export * from ${module}`);
160
+ plugins.push(`${publicComponent}.install && app.use(${publicComponent})`);
161
+ cssImports.push(`import '${root}${dirname}/style/index${scriptExtname}'`);
162
+ });
163
+ const install = `
164
+ function install(app) {
165
+ ${plugins.join('\n ')}
166
+ }
167
+ `;
168
+ const version = `const version = '${getVersion()}'`;
169
+ const indexTemplate = `\
170
+ ${imports.join('\n')}\n
171
+ ${exports.join('\n')}\n
172
+ ${version}
173
+ ${install}
174
+ export {
175
+ version,
176
+ install,
177
+ ${publicComponents.join(',\n ')}
178
+ }
179
+
180
+ export default {
181
+ version,
182
+ install,
183
+ ${publicComponents.join(',\n ')}
184
+ }
185
+ `;
186
+ const styleTemplate = `\
187
+ import '${root}style/theme/css-variables.css'
188
+ ${cssImports.join('\n')}
189
+ `;
190
+ const bundleTemplate = `\
191
+ ${imports.join('\n')}\n
192
+ ${exports.join('\n')}\n
193
+ ${cssImports.join('\n')}\n
194
+ ${version}
195
+ ${install}
196
+ export {
197
+ version,
198
+ install,
199
+ ${publicComponents.join(',\n ')}
200
+ }
201
+
202
+ export default {
203
+ version,
204
+ install,
205
+ ${publicComponents.join(',\n ')}
206
+ }
207
+ `;
208
+ return {
209
+ indexTemplate,
210
+ styleTemplate,
211
+ bundleTemplate,
212
+ };
213
+ }
214
+ export async function compileESEntry(dir, publicDirs) {
215
+ const { indexTemplate, bundleTemplate, styleTemplate } = generateEsEntryTemplate({ publicDirs });
216
+ await Promise.all([
217
+ writeFile(resolve(dir, 'index.mjs'), indexTemplate, 'utf-8'),
218
+ writeFile(resolve(dir, 'index.bundle.mjs'), bundleTemplate, 'utf-8'),
219
+ writeFile(resolve(dir, 'style.mjs'), styleTemplate, 'utf-8'),
220
+ ]);
221
+ }
@@ -0,0 +1,19 @@
1
+ export declare function getExampleRoutePath(examplePath: string): string;
2
+ export declare function getComponentDocRoutePath(componentDocsPath: string): string;
3
+ export declare function getRootDocRoutePath(rootDocsPath: string): string;
4
+ export declare function getPageRoutePath(rootLocalePath: string): string;
5
+ export declare function getPageFilePath(rootLocalePath: string): string;
6
+ export declare function isDraftExample(example: string): boolean;
7
+ export declare function hasDraftExample(examples: string[], example: string): boolean;
8
+ export declare function isDraftDoc(doc: string): boolean;
9
+ export declare function hasDraftDoc(docs: string[], doc: string): boolean;
10
+ export declare function findExamples(draftMode: boolean): Promise<string[]>;
11
+ export declare function filterDraftDocs(docs: string[], draftMode: boolean): string[];
12
+ export declare function findComponentDocs(draftMode: boolean): Promise<string[]>;
13
+ export declare function findRootDocs(draftMode: boolean): Promise<string[]>;
14
+ export declare function findPageLocales(): Promise<string[]>;
15
+ export declare function selectMobileDocumentation(documents: string[], allowedNames: string[]): string[];
16
+ export declare function buildMobileSiteRoutes(draftMode: boolean): Promise<void>;
17
+ export declare function buildPcSiteRoutes(draftMode: boolean): Promise<void>;
18
+ export declare function buildSiteSource(): Promise<void>;
19
+ export declare function buildSiteEntry(draftMode: boolean): Promise<void>;
@@ -0,0 +1,164 @@
1
+ import { slash } from '@maple-design/shared-vue';
2
+ import fse from 'fs-extra';
3
+ import { getMapleConfig } from '../config/maple.config.js';
4
+ import { DOCS_DIR_NAME, EXAMPLE_DIR_NAME, LOCALE_DIR_NAME, ROOT_DOCS_DIR, ROOT_PAGES_DIR, SITE, SITE_DIR, SITE_MOBILE_ROUTES, SITE_PC_DIR, SITE_PC_ROUTES, SRC_DIR, } from '../shared/constant.js';
5
+ import { glob, isDir, outputFileSyncOnChange } from '../shared/fsUtils.js';
6
+ import { documentationRedirect, joinSiteRoutes } from './siteRoutes.js';
7
+ const { copy, readFileSync } = fse;
8
+ const ROOT_DOCS_RE = /\/docs\/([-\w]+)\.([-\w]+)(?:.draft)?\.md/;
9
+ const PAGE_LOCALE_RE = /\/pages\/([-\w]+)\/locale\/([-\w]+)\.ts/;
10
+ const EXAMPLE_INDEX_RE = /\/([-\w]+)\/example\/index(?:.draft)?\.vue/;
11
+ const COMPONENT_DOCS_RE = /\/([-\w]+)\/docs\/([-\w]+)(?:.draft)?\.md/;
12
+ export function getExampleRoutePath(examplePath) {
13
+ return '/' + examplePath.match(EXAMPLE_INDEX_RE)?.[1];
14
+ }
15
+ export function getComponentDocRoutePath(componentDocsPath) {
16
+ const [, routePath, language] = componentDocsPath.match(COMPONENT_DOCS_RE) ?? [];
17
+ return `/${language}/${routePath}`;
18
+ }
19
+ export function getRootDocRoutePath(rootDocsPath) {
20
+ const [, routePath, language] = rootDocsPath.match(ROOT_DOCS_RE) ?? [];
21
+ return `/${language}/${routePath}`;
22
+ }
23
+ export function getPageRoutePath(rootLocalePath) {
24
+ const [, routePath, language] = rootLocalePath.match(PAGE_LOCALE_RE) ?? [];
25
+ return `/${language}/${routePath}`;
26
+ }
27
+ export function getPageFilePath(rootLocalePath) {
28
+ return rootLocalePath.replace(/locale\/.+/, 'index.vue');
29
+ }
30
+ export function isDraftExample(example) {
31
+ return example.endsWith('index.draft.vue');
32
+ }
33
+ export function hasDraftExample(examples, example) {
34
+ return examples.includes(example.replace('index.vue', 'index.draft.vue'));
35
+ }
36
+ export function isDraftDoc(doc) {
37
+ return doc.endsWith('.draft.md');
38
+ }
39
+ export function hasDraftDoc(docs, doc) {
40
+ return docs.includes(doc.replace('.md', '.draft.md'));
41
+ }
42
+ export async function findExamples(draftMode) {
43
+ const [examples, draftExamples] = await Promise.all([
44
+ glob(`${SRC_DIR}/**/${EXAMPLE_DIR_NAME}/index.vue`),
45
+ glob(`${SRC_DIR}/**/${EXAMPLE_DIR_NAME}/index.draft.vue`),
46
+ ]);
47
+ const mergedExamples = [...examples, ...draftExamples];
48
+ return mergedExamples.filter((example) => draftMode ? isDraftExample(example) || !hasDraftExample(mergedExamples, example) : !isDraftExample(example));
49
+ }
50
+ export function filterDraftDocs(docs, draftMode) {
51
+ return docs.filter((doc) => (draftMode ? isDraftDoc(doc) || !hasDraftDoc(docs, doc) : !isDraftDoc(doc)));
52
+ }
53
+ export async function findComponentDocs(draftMode) {
54
+ const componentDocs = await glob(`${SRC_DIR}/**/${DOCS_DIR_NAME}/*.md`);
55
+ return filterDraftDocs(componentDocs, draftMode);
56
+ }
57
+ export async function findRootDocs(draftMode) {
58
+ const rootDocs = await glob(`${ROOT_DOCS_DIR}/*.md`);
59
+ return filterDraftDocs(rootDocs, draftMode);
60
+ }
61
+ export async function findPageLocales() {
62
+ const { defaultLanguage } = await getMapleConfig();
63
+ const userPages = await glob(`${ROOT_PAGES_DIR}/*`);
64
+ const baseLocales = await glob(`${SITE}/pc/pages/**/${LOCALE_DIR_NAME}/*.ts`);
65
+ const userLocales = await userPages.reduce(async (userLocales, page) => {
66
+ if (isDir(page)) {
67
+ const locales = await glob(`${page}/${LOCALE_DIR_NAME}/*.ts`);
68
+ if (!locales.length) {
69
+ locales.push(`${page}/${LOCALE_DIR_NAME}/${defaultLanguage}.ts`);
70
+ }
71
+ ;
72
+ (await userLocales).push(...locales);
73
+ }
74
+ return userLocales;
75
+ }, Promise.resolve([]));
76
+ // filter
77
+ const filterMap = new Map();
78
+ baseLocales.forEach((locale) => {
79
+ const [, routePath, language] = locale.match(PAGE_LOCALE_RE) ?? [];
80
+ filterMap.set(routePath + language, slash(`${SITE_PC_DIR}/pages/${routePath}/locale/${language}.ts`));
81
+ });
82
+ userLocales.forEach((locale) => {
83
+ const [, routePath, language] = locale.match(PAGE_LOCALE_RE) ?? [];
84
+ filterMap.set(routePath + language, locale);
85
+ });
86
+ return Promise.resolve(Array.from(filterMap.values()));
87
+ }
88
+ export function selectMobileDocumentation(documents, allowedNames) {
89
+ const allowed = new Set(allowedNames);
90
+ return documents.filter((doc) => allowed.has(getRootDocRoutePath(doc).split('/').at(-1)));
91
+ }
92
+ export async function buildMobileSiteRoutes(draftMode) {
93
+ const examples = await findExamples(draftMode);
94
+ const routes = examples.map((example) => `
95
+ {
96
+ path: '${getExampleRoutePath(example)}',
97
+ // @ts-ignore
98
+ component: () => import('${example}')
99
+ }`);
100
+ const { mobile } = await getMapleConfig();
101
+ const mobileDocs = new Set(mobile?.docs ?? []);
102
+ if (mobileDocs.size) {
103
+ const rootDocs = await findRootDocs(draftMode);
104
+ for (const doc of selectMobileDocumentation(rootDocs, [...mobileDocs])) {
105
+ const route = getRootDocRoutePath(doc);
106
+ routes.push(`{ path: '${route}', component: () => import('${doc}') }`);
107
+ }
108
+ }
109
+ const source = `export default [\
110
+ ${routes.join(',')}
111
+ ]`;
112
+ await outputFileSyncOnChange(SITE_MOBILE_ROUTES, source);
113
+ }
114
+ export async function buildPcSiteRoutes(draftMode) {
115
+ const [componentDocs, rootDocs, rootLocales] = await Promise.all([
116
+ findComponentDocs(draftMode),
117
+ findRootDocs(draftMode),
118
+ findPageLocales(),
119
+ ]);
120
+ const pageRoutes = rootLocales.map((locale) => `
121
+ {
122
+ path: '${getPageRoutePath(locale)}',
123
+ // @ts-ignore
124
+ component: () => import('${getPageFilePath(locale)}')
125
+ }\
126
+ `);
127
+ const componentDocsRoutes = componentDocs.map((componentDoc) => {
128
+ const redirect = documentationRedirect(readFileSync(componentDoc, 'utf8'));
129
+ if (redirect) {
130
+ return `{ path: '${getComponentDocRoutePath(componentDoc)}', redirect: '${redirect}' }`;
131
+ }
132
+ return `
133
+ {
134
+ path: '${getComponentDocRoutePath(componentDoc)}',
135
+ // @ts-ignore
136
+ component: () => import('${componentDoc}')
137
+ }`;
138
+ });
139
+ const rootDocsRoutes = rootDocs.map((rootDoc) => `
140
+ {
141
+ path: '${getRootDocRoutePath(rootDoc)}',
142
+ // @ts-ignore
143
+ component: () => import('${rootDoc}')
144
+ }`);
145
+ const layoutRoutes = `{
146
+ path: '/layout',
147
+ // @ts-ignore
148
+ component:()=> import('${slash(SITE_PC_DIR)}/Layout.vue'),
149
+ children: [
150
+ ${joinSiteRoutes(componentDocsRoutes, rootDocsRoutes)}
151
+ ]
152
+ }`;
153
+ const source = `export default [\
154
+ ${joinSiteRoutes(pageRoutes, [layoutRoutes])}
155
+ ]`;
156
+ outputFileSyncOnChange(SITE_PC_ROUTES, source);
157
+ }
158
+ export function buildSiteSource() {
159
+ return copy(SITE, SITE_DIR);
160
+ }
161
+ export async function buildSiteEntry(draftMode) {
162
+ await getMapleConfig(true);
163
+ await Promise.all([buildMobileSiteRoutes(draftMode), buildPcSiteRoutes(draftMode), buildSiteSource()]);
164
+ }
@@ -0,0 +1,14 @@
1
+ export declare const EMPTY_SPACE_RE: RegExp;
2
+ export declare const EMPTY_LINE_RE: RegExp;
3
+ export declare const IMPORT_CSS_RE: RegExp;
4
+ export declare const IMPORT_LESS_RE: RegExp;
5
+ export declare const IMPORT_SCSS_RE: RegExp;
6
+ export declare const STYLE_EXTNAME_RE: RegExp;
7
+ export declare const STYLE_IMPORT_RE: RegExp;
8
+ export declare const compressCss: (s: string) => string;
9
+ export declare function normalizeStyleDependency(styleImport: string, reg: RegExp): string;
10
+ export declare function extractStyleDependencies(file: string, code: string, styleReg: RegExp): string;
11
+ export declare function compileLess(file: string): Promise<void>;
12
+ export declare function compileScss(file: string): void;
13
+ export declare function clearLessFiles(dir: string): void;
14
+ export declare function clearScssFiles(dir: string): void;
@@ -0,0 +1,55 @@
1
+ import { parse, resolve } from 'path';
2
+ import fse from 'fs-extra';
3
+ import glob from 'glob';
4
+ import less from 'less';
5
+ import * as sass from 'sass';
6
+ import { CWD } from '../shared/constant.js';
7
+ import { replaceExt, smartAppendFileSync } from '../shared/fsUtils.js';
8
+ import { getScriptExtname } from './compileScript.js';
9
+ const { render: renderLess } = less;
10
+ const { readFileSync, writeFileSync, unlinkSync } = fse;
11
+ export const EMPTY_SPACE_RE = /[\s]+/g;
12
+ export const EMPTY_LINE_RE = /[\n\r]*/g;
13
+ export const IMPORT_CSS_RE = /(?<!['"`])import\s+['"](\.{1,2}\/.+\.css)['"]\s*;?(?!\s*['"`])/g;
14
+ export const IMPORT_LESS_RE = /(?<!['"`])import\s+['"](\.{1,2}\/.+\.less)['"]\s*;?(?!\s*['"`])/g;
15
+ export const IMPORT_SCSS_RE = /(?<!['"`])import\s+['"](\.{1,2}\/.+\.scss)['"]\s*;?(?!\s*['"`])/g;
16
+ export const STYLE_EXTNAME_RE = /(\.less)|(\.scss)|(\.css)/;
17
+ export const STYLE_IMPORT_RE = /@import\s+['"](.+)['"]\s*;/g;
18
+ export const compressCss = (s) => s.replace(EMPTY_LINE_RE, '').replace(EMPTY_SPACE_RE, ' ');
19
+ export function normalizeStyleDependency(styleImport, reg) {
20
+ let relativePath = styleImport.replace(reg, '$1');
21
+ relativePath = relativePath.replace(STYLE_EXTNAME_RE, '');
22
+ if (relativePath.startsWith('./')) {
23
+ return '.' + relativePath;
24
+ }
25
+ return '../' + relativePath;
26
+ }
27
+ export function extractStyleDependencies(file, code, styleReg) {
28
+ const styleImports = code.match(styleReg) ?? [];
29
+ const cssFile = resolve(parse(file).dir, `./style/index${getScriptExtname()}`);
30
+ styleImports.forEach((styleImport) => {
31
+ const normalizedPath = normalizeStyleDependency(styleImport, styleReg);
32
+ smartAppendFileSync(cssFile, `import '${normalizedPath}.css'\n`);
33
+ });
34
+ return code.replace(styleReg, '');
35
+ }
36
+ export async function compileLess(file) {
37
+ const source = readFileSync(file, 'utf-8');
38
+ const { css } = await renderLess(source, {
39
+ filename: file,
40
+ paths: [resolve(CWD, 'node_modules')],
41
+ });
42
+ writeFileSync(replaceExt(file, '.css'), compressCss(css), 'utf-8');
43
+ }
44
+ export function compileScss(file) {
45
+ const { css } = sass.compile(file, {
46
+ loadPaths: [resolve(CWD, 'node_modules')],
47
+ });
48
+ writeFileSync(replaceExt(file, '.css'), compressCss(css), 'utf-8');
49
+ }
50
+ export function clearLessFiles(dir) {
51
+ glob.sync(`${dir}/**/*.less`).forEach(unlinkSync);
52
+ }
53
+ export function clearScssFiles(dir) {
54
+ glob.sync(`${dir}/**/*.scss`).forEach(unlinkSync);
55
+ }
@@ -0,0 +1,3 @@
1
+ export declare function compileMD(path: string, keys: Set<string>): void;
2
+ export declare function compileDir(path: string, keys: Set<string>, defaultLanguage: 'zh-CN' | 'en-US'): void;
3
+ export declare function compileStyleVars(): Promise<void>;
@@ -0,0 +1,46 @@
1
+ import { resolve } from 'path';
2
+ import fse from 'fs-extra';
3
+ import { getMapleConfig } from '../config/maple.config.js';
4
+ import { SRC_DIR, TYPES_DIR } from '../shared/constant.js';
5
+ import { isDir, isMD } from '../shared/fsUtils.js';
6
+ const { ensureDirSync, readdirSync, readFileSync, writeFileSync } = fse;
7
+ export function compileMD(path, keys) {
8
+ const content = readFileSync(path, 'utf-8');
9
+ const result = content.match(/`--[\w-]+`/g) ?? [];
10
+ result.forEach((key) => {
11
+ keys.add(key.replace(/`/g, ''));
12
+ });
13
+ }
14
+ export function compileDir(path, keys, defaultLanguage) {
15
+ const dir = readdirSync(path);
16
+ dir.forEach((filename) => {
17
+ const filePath = resolve(path, filename);
18
+ isDir(filePath) && compileDir(filePath, keys, defaultLanguage);
19
+ if (isMD(filePath) && filename.includes(defaultLanguage)) {
20
+ compileMD(filePath, keys);
21
+ }
22
+ });
23
+ }
24
+ export async function compileStyleVars() {
25
+ ensureDirSync(TYPES_DIR);
26
+ const { defaultLanguage } = await getMapleConfig();
27
+ const keys = new Set();
28
+ compileDir(SRC_DIR, keys, defaultLanguage);
29
+ const assistanceType = `type RemoveTwoDashes<T extends string> = T extends \`--$\{infer Rest}\` ? Rest : T
30
+
31
+ type CamelCase<S extends string> =
32
+ S extends \`$\{infer P1}-$\{infer P2}\`
33
+ ? \`$\{P1}$\{CamelCase<Capitalize<P2>>}\`
34
+ : S
35
+
36
+ type FormatStyleVars<T> = {
37
+ [K in keyof T as CamelCase<RemoveTwoDashes<K & string>>]?: T[K];
38
+ } & T`;
39
+ let baseStyleVars = [...keys].reduce((template, key) => {
40
+ template += ` '${key}'?: string\n`;
41
+ return template;
42
+ }, '\n\ninterface BaseStyleVars {\n');
43
+ baseStyleVars += ' [key: PropertyKey]: string\n}\n';
44
+ writeFileSync(resolve(TYPES_DIR, 'styleVars.d.ts'), `${assistanceType}${baseStyleVars}
45
+ export interface StyleVars extends FormatStyleVars<BaseStyleVars> {}`);
46
+ }
@@ -0,0 +1,18 @@
1
+ import { type MapleConfig } from '../config/maple.config.js';
2
+ export interface TemplateHighlightCompilerOptions {
3
+ md: string;
4
+ json: string;
5
+ titleAttributes: RegExp;
6
+ titleEvents: RegExp;
7
+ titleSlots: RegExp;
8
+ }
9
+ export declare const replaceDot: (s: string) => string;
10
+ export declare const replaceVersion: (s: string) => string;
11
+ export declare const replaceUnderline: (s: string) => string;
12
+ export declare function parseTable(table: string): string[][];
13
+ export declare function compileTable(md: string, titleRe: RegExp): string;
14
+ export declare function compileWebTypes(table: Record<string, any>, webTypes: Record<string, any>, componentName: string, mapleConfig: Required<MapleConfig>): void;
15
+ export declare function compileMD(path: string, webTypes: Record<string, any>, mapleConfig: Required<MapleConfig>, options: TemplateHighlightCompilerOptions): void;
16
+ export declare function compileDir(path: string, webTypes: Record<string, any>, mapleConfig: Required<MapleConfig>, options: TemplateHighlightCompilerOptions): void;
17
+ export declare function compileLanguageMD(mapleConfig: Required<MapleConfig>, options: TemplateHighlightCompilerOptions): void;
18
+ export declare function compileTemplateHighlight(): Promise<void>;
@@ -0,0 +1,133 @@
1
+ import { resolve } from 'path';
2
+ import fse from 'fs-extra';
3
+ import { getMapleConfig } from '../config/maple.config.js';
4
+ import { HL_API_RE, HL_COMPONENT_NAME_RE, HL_DIR, HL_EN_MD, HL_EN_TITLE_ATTRIBUTES_RE, HL_EN_TITLE_EVENTS_RE, HL_EN_TITLE_SLOTS_RE, HL_EN_WEB_TYPES_JSON, HL_ZH_MD, HL_ZH_TITLE_ATTRIBUTES_RE, HL_ZH_TITLE_EVENTS_RE, HL_ZH_TITLE_SLOTS_RE, HL_ZH_WEB_TYPES_JSON, SRC_DIR, } from '../shared/constant.js';
5
+ import { getCliVersion, isDir, isMD } from '../shared/fsUtils.js';
6
+ const { ensureDir, readdirSync, readFileSync, writeFileSync } = fse;
7
+ export const replaceDot = (s) => s.replace(/`/g, '');
8
+ export const replaceVersion = (s) => s.replace(/\*\*\*.+\*\*\*/g, '').trim();
9
+ export const replaceUnderline = (s) => s.replace(/_/g, '');
10
+ export function parseTable(table) {
11
+ const rows = table
12
+ .split(/\r?\n/)
13
+ .map((row) => row.trim())
14
+ .filter((row) => row.startsWith('|') && row.endsWith('|'));
15
+ return rows.map((row) => {
16
+ const cols = row.replace(/\\\|/g, '__maple_axis__').split('|');
17
+ cols.shift();
18
+ cols.pop();
19
+ return cols.map((col) => col.replace(/__maple_axis__/g, '|').trim());
20
+ });
21
+ }
22
+ export function compileTable(md, titleRe) {
23
+ const apiMatched = md.match(HL_API_RE);
24
+ if (!apiMatched) {
25
+ return '';
26
+ }
27
+ md = md.slice(apiMatched.index + apiMatched[0].length);
28
+ const titleMatched = md.match(titleRe);
29
+ if (!titleMatched) {
30
+ return '';
31
+ }
32
+ md = md.slice(titleMatched.index + titleMatched[0].length);
33
+ // A header-only Events table is empty. Never scan into the following Slots
34
+ // section or treat its heading as a row (Grid's English docs exposed this).
35
+ const section = md.split(/^\s*#{1,3}\s+/m, 1)[0];
36
+ const lines = section.split(/\r?\n/).map((line) => line.trim());
37
+ const header = lines.findIndex((line, index) => line.startsWith('|') && /^\|(?:\s*:?-+:?\s*\|)+$/.test(lines[index + 1] ?? ''));
38
+ if (header < 0) {
39
+ return '';
40
+ }
41
+ const rows = [];
42
+ for (const line of lines.slice(header + 2)) {
43
+ if (!line.startsWith('|') || !line.endsWith('|')) {
44
+ break;
45
+ }
46
+ rows.push(line);
47
+ }
48
+ return rows.join('\n');
49
+ }
50
+ export function compileWebTypes(table, webTypes, componentName, mapleConfig) {
51
+ const { attributesTable, eventsTable, slotsTable } = table;
52
+ const attributes = attributesTable.map((row) => ({
53
+ name: replaceVersion(replaceDot(row[0])),
54
+ description: row[1],
55
+ default: replaceDot(row[3] ?? ''),
56
+ value: {
57
+ type: replaceUnderline(row[2]),
58
+ kind: 'expression',
59
+ },
60
+ }));
61
+ const events = eventsTable.map((row) => ({
62
+ name: replaceVersion(replaceDot(row[0])),
63
+ description: row[1],
64
+ }));
65
+ const slots = slotsTable.map((row) => ({
66
+ name: replaceVersion(replaceDot(row[0])),
67
+ description: row[1],
68
+ }));
69
+ webTypes.contributions.html.tags.push({
70
+ name: `${mapleConfig?.namespace}-${componentName}`,
71
+ attributes,
72
+ events,
73
+ slots,
74
+ });
75
+ }
76
+ export function compileMD(path, webTypes, mapleConfig, options) {
77
+ if (!path.endsWith(options.md)) {
78
+ return;
79
+ }
80
+ const md = readFileSync(path, 'utf-8');
81
+ const componentName = path.match(HL_COMPONENT_NAME_RE)[2];
82
+ const attributesTable = parseTable(compileTable(md, options.titleAttributes));
83
+ const eventsTable = parseTable(compileTable(md, options.titleEvents));
84
+ const slotsTable = parseTable(compileTable(md, options.titleSlots));
85
+ const table = {
86
+ attributesTable,
87
+ eventsTable,
88
+ slotsTable,
89
+ };
90
+ compileWebTypes(table, webTypes, componentName, mapleConfig);
91
+ }
92
+ export function compileDir(path, webTypes, mapleConfig, options) {
93
+ const dir = readdirSync(path);
94
+ dir.forEach((filename) => {
95
+ const filePath = resolve(path, filename);
96
+ isDir(filePath) && compileDir(filePath, webTypes, mapleConfig, options);
97
+ isMD(filePath) && compileMD(filePath, webTypes, mapleConfig, options);
98
+ });
99
+ }
100
+ export function compileLanguageMD(mapleConfig, options) {
101
+ const webTypes = {
102
+ $schema: 'https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json',
103
+ framework: 'vue',
104
+ version: getCliVersion(),
105
+ name: mapleConfig?.title,
106
+ contributions: {
107
+ html: {
108
+ tags: [],
109
+ 'types-syntax': 'typescript',
110
+ },
111
+ },
112
+ };
113
+ compileDir(SRC_DIR, webTypes, mapleConfig, options);
114
+ writeFileSync(options.json, JSON.stringify(webTypes, null, 2));
115
+ }
116
+ export async function compileTemplateHighlight() {
117
+ await ensureDir(HL_DIR);
118
+ const mapleConfig = await getMapleConfig();
119
+ compileLanguageMD(mapleConfig, {
120
+ md: HL_EN_MD,
121
+ json: HL_EN_WEB_TYPES_JSON,
122
+ titleAttributes: HL_EN_TITLE_ATTRIBUTES_RE,
123
+ titleEvents: HL_EN_TITLE_EVENTS_RE,
124
+ titleSlots: HL_EN_TITLE_SLOTS_RE,
125
+ });
126
+ compileLanguageMD(mapleConfig, {
127
+ md: HL_ZH_MD,
128
+ json: HL_ZH_WEB_TYPES_JSON,
129
+ titleAttributes: HL_ZH_TITLE_ATTRIBUTES_RE,
130
+ titleEvents: HL_ZH_TITLE_EVENTS_RE,
131
+ titleSlots: HL_ZH_TITLE_SLOTS_RE,
132
+ });
133
+ }