@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,58 @@
1
+ import { relative, resolve } from 'path';
2
+ import chokidar from 'chokidar';
3
+ import fse from 'fs-extra';
4
+ import { createServer } from 'vite';
5
+ import { buildSiteEntry } from '../compiler/compileSiteEntry.js';
6
+ import { getMapleConfig } from '../config/maple.config.js';
7
+ import { getDevConfig } from '../config/vite.config.js';
8
+ import { COMPONENT_REUSE_JSON, MAPLE_CONFIG, SITE, SITE_DIR, SRC_DIR } from '../shared/constant.js';
9
+ import logger from '../shared/logger.js';
10
+ import { createSerialTask } from '../shared/serial-task.js';
11
+ const { ensureDirSync, pathExistsSync } = fse;
12
+ let server;
13
+ let watcher;
14
+ let siteWatcher;
15
+ const scheduleRestart = createSerialTask();
16
+ async function startServer(options) {
17
+ const mapleConfig = await getMapleConfig();
18
+ const isRestart = Boolean(server);
19
+ logger.info(`${isRestart ? 'Res' : 'S'}tarting server...`);
20
+ // close all instance
21
+ server && (await server.close());
22
+ watcher && (await watcher.close());
23
+ siteWatcher && (await siteWatcher.close());
24
+ // Dev resolves components and styles from src; never rewrite published es/lib artifacts.
25
+ // build all config
26
+ await buildSiteEntry(options.draft ?? false);
27
+ const devConfig = getDevConfig(mapleConfig);
28
+ const inlineConfig = {
29
+ ...devConfig,
30
+ ...(options.force ? { optimizeDeps: { force: true } } : {}),
31
+ };
32
+ // create all instance
33
+ server = await createServer(inlineConfig);
34
+ await server.listen();
35
+ server.printUrls();
36
+ const watchFiles = [MAPLE_CONFIG, COMPONENT_REUSE_JSON].filter((file) => pathExistsSync(file));
37
+ if (watchFiles.length) {
38
+ watcher = chokidar.watch(watchFiles);
39
+ watcher.on('change', () => scheduleRestart(() => startServer(options)).catch((error) => logger.error(String(error))));
40
+ }
41
+ // Vite serves the generated .maple/site copy, so edits to the CLI's site
42
+ // source must be mirrored into that copy for normal HMR to observe them.
43
+ siteWatcher = chokidar.watch(SITE, { ignoreInitial: true });
44
+ siteWatcher.on('add', syncSiteFile);
45
+ siteWatcher.on('change', syncSiteFile);
46
+ logger.success(`\n${isRestart ? 'Res' : 'S'}tart successfully!!!`);
47
+ if (options.draft) {
48
+ logger.title('Server in draft mode!!!');
49
+ }
50
+ }
51
+ async function syncSiteFile(source) {
52
+ await fse.copy(source, resolve(SITE_DIR, relative(SITE, source)));
53
+ }
54
+ export async function dev(options) {
55
+ process.env.NODE_ENV = 'development';
56
+ ensureDirSync(SRC_DIR);
57
+ await scheduleRestart(() => startServer(options));
58
+ }
@@ -0,0 +1,3 @@
1
+ import { type ExtensionMode } from '../config/vite.config.js';
2
+ export type ExtensionCommandMode = ExtensionMode;
3
+ export declare function extension(mode: ExtensionCommandMode): Promise<void>;
@@ -0,0 +1,5 @@
1
+ import { build } from 'vite';
2
+ import { getExtensionConfig } from '../config/vite.config.js';
3
+ export async function extension(mode) {
4
+ await build(getExtensionConfig(mode));
5
+ }
@@ -0,0 +1,24 @@
1
+ export interface GenCommandOptions {
2
+ name?: string;
3
+ locale?: boolean;
4
+ sfc?: boolean;
5
+ tsx?: boolean;
6
+ }
7
+ interface GeneratedManifest {
8
+ name: string;
9
+ devDependencies: Record<string, string>;
10
+ dependencies?: Record<string, string>;
11
+ peerDependencies?: Record<string, string>;
12
+ optionalDependencies?: Record<string, string>;
13
+ [key: string]: unknown;
14
+ }
15
+ export declare function createGeneratedManifest(pkg: GeneratedManifest, name: string, cliVersion: string): {
16
+ name: string;
17
+ files: string[];
18
+ devDependencies: Record<string, string>;
19
+ dependencies?: Record<string, string> | undefined;
20
+ peerDependencies?: Record<string, string> | undefined;
21
+ optionalDependencies?: Record<string, string> | undefined;
22
+ };
23
+ export declare function gen(options: GenCommandOptions): Promise<void>;
24
+ export {};
@@ -0,0 +1,91 @@
1
+ import { resolve } from 'path';
2
+ import { confirm, input, select } from '@inquirer/prompts';
3
+ import fse from 'fs-extra';
4
+ import { CLI_PACKAGE_JSON, CWD, GENERATORS_DIR } from '../shared/constant.js';
5
+ import logger from '../shared/logger.js';
6
+ const { copy, pathExistsSync, readFileSync, writeFileSync, rename } = fse;
7
+ export function createGeneratedManifest(pkg, name, cliVersion) {
8
+ if (!/^(?:@[a-z0-9][a-z0-9._-]*\/)?[a-z0-9][a-z0-9._-]*$/.test(name)) {
9
+ throw new Error(`Invalid npm project name: ${name}`);
10
+ }
11
+ const fields = ['dependencies', 'devDependencies', 'peerDependencies', 'optionalDependencies'];
12
+ for (const field of fields) {
13
+ if (Object.hasOwn(pkg[field] ?? {}, name)) {
14
+ throw new Error(`Project name conflicts with a template dependency: ${name}`);
15
+ }
16
+ }
17
+ const generated = { ...pkg, name, files: ['es', 'lib', 'umd', 'highlight', 'types', 'types-generated'] };
18
+ for (const field of fields) {
19
+ const dependencies = pkg[field];
20
+ if (dependencies) {
21
+ generated[field] = Object.fromEntries(Object.entries(dependencies).map(([key, version]) => [
22
+ key,
23
+ key.startsWith('@maple-design/') ? `^${cliVersion}` : version,
24
+ ]));
25
+ }
26
+ }
27
+ return generated;
28
+ }
29
+ function syncVersion(name) {
30
+ const file = resolve(CWD, name, 'package.json');
31
+ const pkg = JSON.parse(readFileSync(file, 'utf-8'));
32
+ const cliPkg = JSON.parse(readFileSync(CLI_PACKAGE_JSON, 'utf-8'));
33
+ writeFileSync(file, `${JSON.stringify(createGeneratedManifest(pkg, name, cliPkg.version), null, 2)}\n`);
34
+ }
35
+ export async function gen(options) {
36
+ logger.title('\n📦📦 Generate cli application ! \n');
37
+ const name = options.name
38
+ ? options.name
39
+ : await input({
40
+ message: 'Name of the generate application: ',
41
+ default: 'my-ui-vue',
42
+ });
43
+ const dest = resolve(CWD, name);
44
+ if (pathExistsSync(dest)) {
45
+ logger.error(`${name} already exists and cannot be recreated...`);
46
+ return;
47
+ }
48
+ let codeStyle;
49
+ // Determine whether the parameter carries a coding style
50
+ if (options.sfc || options.tsx) {
51
+ codeStyle = options.sfc ? 'sfc' : 'tsx';
52
+ }
53
+ else {
54
+ const style = await select({
55
+ message: 'Please select your component library programming format',
56
+ choices: [
57
+ { name: 'sfc', value: 'sfc' },
58
+ { name: 'tsx', value: 'tsx' },
59
+ ],
60
+ });
61
+ codeStyle = style;
62
+ }
63
+ const i18n = options.locale ??
64
+ (await confirm({
65
+ message: 'Whether to use i18n?',
66
+ default: false,
67
+ }));
68
+ const dirName = i18n ? 'i18n' : 'default';
69
+ const base = resolve(GENERATORS_DIR, 'base');
70
+ const configBase = resolve(GENERATORS_DIR, 'config', dirName, 'base');
71
+ const code = resolve(GENERATORS_DIR, 'config', dirName, codeStyle);
72
+ const template = JSON.parse(readFileSync(resolve(base, 'package.json'), 'utf-8'));
73
+ const cliPkg = JSON.parse(readFileSync(CLI_PACKAGE_JSON, 'utf-8'));
74
+ createGeneratedManifest(template, name, cliPkg.version);
75
+ await copy(base, dest);
76
+ await copy(configBase, dest);
77
+ await copy(code, dest);
78
+ await rename(resolve(dest, '_gitignore'), resolve(dest, '.gitignore'));
79
+ syncVersion(name);
80
+ logger.success('✨ Application generated successfully!');
81
+ logger.info(`\
82
+ cd ${name}
83
+ git init (Generating .git folder to init git hooks)
84
+ pnpm install
85
+ pnpm dev`);
86
+ logger.success(`\
87
+ =======================
88
+ Good luck have fun
89
+ =======================\
90
+ `);
91
+ }
@@ -0,0 +1,4 @@
1
+ export interface IconsCommandOptions {
2
+ watch?: boolean;
3
+ }
4
+ export declare function icons({ watch }?: IconsCommandOptions): Promise<void>;
@@ -0,0 +1,15 @@
1
+ import { spawn } from 'node:child_process';
2
+ import { resolve } from 'node:path';
3
+ import logger from '../shared/logger.js';
4
+ function run(command, args, cwd) {
5
+ return new Promise((done, fail) => {
6
+ const child = spawn(command, args, { cwd, stdio: 'inherit', shell: process.platform === 'win32' });
7
+ child.on('error', fail);
8
+ child.on('exit', (code) => (code === 0 ? done() : fail(new Error(`${command} exited with code ${code}`))));
9
+ });
10
+ }
11
+ export async function icons({ watch = false } = {}) {
12
+ const packageRoot = resolve(process.cwd(), 'packages/icons');
13
+ logger.info(`${watch ? 'Watching' : 'Building'} @maple-design/icons-vue...`);
14
+ await run('pnpm', ['--dir', packageRoot, watch ? 'dev' : 'build'], process.cwd());
15
+ }
@@ -0,0 +1,4 @@
1
+ export type PreviewCommandOptions = {
2
+ port?: string;
3
+ };
4
+ export declare function preview(options: PreviewCommandOptions): Promise<void>;
@@ -0,0 +1,18 @@
1
+ import fse from 'fs-extra';
2
+ import { x } from 'tinyexec';
3
+ import { SITE_OUTPUT_PATH } from '../shared/constant.js';
4
+ import logger from '../shared/logger.js';
5
+ const { pathExistsSync } = fse;
6
+ export async function preview(options) {
7
+ const { port = 5500 } = options;
8
+ if (!pathExistsSync(SITE_OUTPUT_PATH)) {
9
+ logger.warning('Cannot find the site folder, you must first run the build command to build the document site');
10
+ return;
11
+ }
12
+ try {
13
+ await x('live-server', [`--port=${Number(port)}`], { nodeOptions: { cwd: SITE_OUTPUT_PATH, stdio: 'inherit' } });
14
+ }
15
+ catch (e) {
16
+ logger.error(e.toString());
17
+ }
18
+ }
@@ -0,0 +1 @@
1
+ export declare function styleVars(): void;
@@ -0,0 +1,6 @@
1
+ import { compileStyleVars } from '../compiler/compileStyleVars.js';
2
+ import logger from '../shared/logger.js';
3
+ export function styleVars() {
4
+ compileStyleVars();
5
+ logger.success('style vars compilation success!');
6
+ }
@@ -0,0 +1,7 @@
1
+ interface TestCommandOptions {
2
+ watch?: boolean;
3
+ component?: string;
4
+ coverage?: boolean;
5
+ }
6
+ export declare function test({ component, watch, coverage }: TestCommandOptions): Promise<void>;
7
+ export {};
@@ -0,0 +1,16 @@
1
+ import { x } from 'tinyexec';
2
+ import { VITEST_CONFIG } from '../shared/constant.js';
3
+ export async function test({ component, watch, coverage }) {
4
+ process.env.NODE_ENV = 'test';
5
+ const args = ['--config', VITEST_CONFIG];
6
+ if (!watch) {
7
+ args.unshift('run');
8
+ }
9
+ if (coverage) {
10
+ args.push('--coverage');
11
+ }
12
+ if (component) {
13
+ args.push('--dir', `src/${component.trim()}`);
14
+ }
15
+ await x('vitest', args, { nodeOptions: { stdio: 'inherit' }, throwOnError: true });
16
+ }
@@ -0,0 +1,2 @@
1
+ export type ViteCommandMode = 'dev' | 'build';
2
+ export declare function vite(mode: ViteCommandMode): Promise<void>;
@@ -0,0 +1,14 @@
1
+ import vue from '@vitejs/plugin-vue';
2
+ import jsx from '@vitejs/plugin-vue-jsx';
3
+ import { build, createServer } from 'vite';
4
+ export async function vite(mode) {
5
+ process.env.NODE_ENV = mode === 'dev' ? 'development' : 'production';
6
+ const run = mode === 'build' ? build : createServer;
7
+ const result = await run({
8
+ plugins: [vue(), jsx()],
9
+ });
10
+ if (mode === 'dev') {
11
+ await result.listen();
12
+ result.printUrls();
13
+ }
14
+ }
@@ -0,0 +1,4 @@
1
+ export declare function compileBundle(): Promise<void>;
2
+ export declare function compileDir(dir: string): Promise<void>;
3
+ export declare function compileFile(file: string): Promise<void>;
4
+ export declare function compileModule(): Promise<void>;
@@ -0,0 +1,78 @@
1
+ import { resolve } from 'path';
2
+ import { kebabCase } from '@maple-design/shared-vue';
3
+ import fse from 'fs-extra';
4
+ import { build } from 'vite';
5
+ import { getMapleConfig } from '../config/maple.config.js';
6
+ import { getBundleConfig } from '../config/vite.config.js';
7
+ import { DOCS_DIR_NAME, ES_DIR, EXAMPLE_DIR_NAME, LIB_DIR, SRC_DIR, STYLE_DIR_NAME, TESTS_DIR_NAME, UMD_DIR, } from '../shared/constant.js';
8
+ import { getPublicDirs, isDir, isDTS, isLess, isScript, isScss, isSFC } from '../shared/fsUtils.js';
9
+ import { compileESEntry, compileScriptFile, getScriptExtname } from './compileScript.js';
10
+ import { compileSFC } from './compileSFC.js';
11
+ import { clearLessFiles, clearScssFiles, compileLess, compileScss } from './compileStyle.js';
12
+ import { generateReference } from './compileTypes.js';
13
+ const { copy, ensureFileSync, readdir, removeSync } = fse;
14
+ export async function compileBundle() {
15
+ const mapleConfig = await getMapleConfig();
16
+ const name = kebabCase(mapleConfig?.name || '');
17
+ const buildOptions = [
18
+ {
19
+ format: 'es',
20
+ fileName: `${name}.esm.js`,
21
+ cssFileName: name,
22
+ output: ES_DIR,
23
+ emptyOutDir: false,
24
+ removeEnv: true,
25
+ },
26
+ {
27
+ format: 'cjs',
28
+ fileName: `${name}.cjs.js`,
29
+ cssFileName: name,
30
+ output: LIB_DIR,
31
+ emptyOutDir: false,
32
+ removeEnv: false,
33
+ },
34
+ {
35
+ format: 'umd',
36
+ fileName: `${name}.js`,
37
+ cssFileName: name,
38
+ output: UMD_DIR,
39
+ emptyOutDir: true,
40
+ removeEnv: true,
41
+ },
42
+ ];
43
+ const tasks = buildOptions.map((options) => build(getBundleConfig(mapleConfig, options)));
44
+ await Promise.all(tasks);
45
+ }
46
+ export async function compileDir(dir) {
47
+ const dirs = await readdir(dir);
48
+ await Promise.all(dirs.map((filename) => {
49
+ const file = resolve(dir, filename);
50
+ [TESTS_DIR_NAME, EXAMPLE_DIR_NAME, DOCS_DIR_NAME].includes(filename) && removeSync(file);
51
+ if (isDTS(file) || filename === STYLE_DIR_NAME) {
52
+ return Promise.resolve();
53
+ }
54
+ return compileFile(file);
55
+ }));
56
+ }
57
+ export async function compileFile(file) {
58
+ isSFC(file) && (await compileSFC(file));
59
+ isScript(file) && (await compileScriptFile(file));
60
+ isLess(file) && (await compileLess(file));
61
+ isScss(file) && compileScss(file);
62
+ isDir(file) && (await compileDir(file));
63
+ }
64
+ export async function compileModule() {
65
+ const dest = ES_DIR;
66
+ await copy(SRC_DIR, dest);
67
+ const moduleDir = await readdir(dest);
68
+ await Promise.all(moduleDir.map((filename) => {
69
+ const file = resolve(dest, filename);
70
+ isDir(file) && ensureFileSync(resolve(file, `./style/index${getScriptExtname()}`));
71
+ return isDir(file) ? compileDir(file) : null;
72
+ }));
73
+ const publicDirs = await getPublicDirs();
74
+ await compileESEntry(dest, publicDirs);
75
+ clearLessFiles(dest);
76
+ clearScssFiles(dest);
77
+ generateReference(dest);
78
+ }
@@ -0,0 +1,6 @@
1
+ export declare function declareEmptySFC(): string;
2
+ export declare function replaceExportToDeclare(script: string): string;
3
+ export declare function injectExport(script: string): string;
4
+ export declare function injectScopeId(script: string, scopeId: string): string;
5
+ export declare function injectRender(script: string, render: string): string;
6
+ export declare function compileSFC(sfc: string): Promise<void>;
@@ -0,0 +1,119 @@
1
+ import { parse, resolve } from 'path';
2
+ import { compileScript as compileScriptSFC, compileStyle, compileTemplate, parse as parseSFC, registerTS, } from '@vue/compiler-sfc';
3
+ import fse from 'fs-extra';
4
+ import hash from 'hash-sum';
5
+ import ts from 'typescript';
6
+ import { ES_DIR, SRC_DIR } from '../shared/constant.js';
7
+ import { replaceExt, smartAppendFileSync } from '../shared/fsUtils.js';
8
+ import { compileScript, getScriptExtname } from './compileScript.js';
9
+ import { compileLess, compileScss, compressCss, extractStyleDependencies, normalizeStyleDependency, STYLE_IMPORT_RE, } from './compileStyle.js';
10
+ const { readFile, existsSync, readFileSync, writeFileSync, ensureFileSync } = fse;
11
+ registerTS(() => ts);
12
+ const EXPORT = 'export default';
13
+ const SFC = '__sfc__';
14
+ const SFC_DECLARE = `const ${SFC} = `;
15
+ const RENDER = '__render__';
16
+ const BASE_CSS_VARIABLES_IMPORT = `import '../../style/theme/css-variables.css'\n`;
17
+ function ensureBaseCssVariablesImport(cssFile) {
18
+ ensureFileSync(cssFile);
19
+ const content = readFileSync(cssFile, 'utf-8');
20
+ if (!content.includes('style/theme/css-variables.css')) {
21
+ writeFileSync(cssFile, `${BASE_CSS_VARIABLES_IMPORT}${content}`);
22
+ }
23
+ }
24
+ export function declareEmptySFC() {
25
+ return `${SFC_DECLARE}{}\n`;
26
+ }
27
+ export function replaceExportToDeclare(script) {
28
+ return script.replace(EXPORT, SFC_DECLARE);
29
+ }
30
+ export function injectExport(script) {
31
+ script += `\n${EXPORT} ${SFC}`;
32
+ return script;
33
+ }
34
+ export function injectScopeId(script, scopeId) {
35
+ script += `\n${SFC}.__scopeId = '${scopeId}'`;
36
+ return script;
37
+ }
38
+ export function injectRender(script, render) {
39
+ script = script.trim();
40
+ render = render.replace('export function render', `function ${RENDER}`);
41
+ script = script.replace(SFC_DECLARE, `${render}\n${SFC_DECLARE}`);
42
+ script += `\n${SFC}.render = ${RENDER}`;
43
+ return script;
44
+ }
45
+ export async function compileSFC(sfc) {
46
+ const sources = await readFile(sfc, 'utf-8');
47
+ const id = hash(sources);
48
+ const { descriptor } = parseSFC(sources, { filename: sfc, sourceMap: false });
49
+ const { script, scriptSetup, template, styles } = descriptor;
50
+ let scriptContent;
51
+ let bindingMetadata;
52
+ if (script || scriptSetup) {
53
+ if (scriptSetup) {
54
+ const { content, bindings } = compileScriptSFC(descriptor, {
55
+ id,
56
+ // issue https://xxx/pe.frontend/materials/maplejs/maple-design-mobile/-/issues/1458
57
+ fs: {
58
+ fileExists: (file) => existsSync(file.replace(ES_DIR, SRC_DIR)),
59
+ readFile: (file) => readFileSync(file.replace(ES_DIR, SRC_DIR), 'utf-8'),
60
+ },
61
+ });
62
+ scriptContent = content;
63
+ bindingMetadata = bindings;
64
+ }
65
+ else {
66
+ // script only
67
+ scriptContent = script.content;
68
+ }
69
+ scriptContent = replaceExportToDeclare(scriptContent);
70
+ }
71
+ if (!scriptContent) {
72
+ scriptContent = declareEmptySFC();
73
+ }
74
+ // scoped
75
+ const hasScope = styles.some((style) => style.scoped);
76
+ const scopeId = hasScope ? `data-v-${id}` : '';
77
+ if (template) {
78
+ const render = compileTemplate({
79
+ id,
80
+ source: template.content,
81
+ filename: sfc,
82
+ compilerOptions: {
83
+ expressionPlugins: descriptor.script?.lang === 'ts' ? ['typescript'] : undefined,
84
+ scopeId,
85
+ bindingMetadata,
86
+ },
87
+ }).code;
88
+ scriptContent = injectRender(scriptContent, render);
89
+ }
90
+ if (scopeId) {
91
+ scriptContent = injectScopeId(scriptContent, scopeId);
92
+ }
93
+ scriptContent = injectExport(scriptContent);
94
+ await compileScript(scriptContent, sfc);
95
+ // style
96
+ for (let index = 0; index < styles.length; index++) {
97
+ const style = styles[index];
98
+ const file = replaceExt(sfc, `Sfc${index || ''}.${style.lang || 'css'}`);
99
+ const { base, dir } = parse(file);
100
+ const dependencyPath = normalizeStyleDependency(base, STYLE_IMPORT_RE);
101
+ const cssFile = resolve(dir, `./style/index${getScriptExtname()}`);
102
+ ensureBaseCssVariablesImport(cssFile);
103
+ let { code } = compileStyle({
104
+ source: style.content,
105
+ filename: file,
106
+ id: scopeId,
107
+ scoped: style.scoped,
108
+ });
109
+ code = extractStyleDependencies(file, code, STYLE_IMPORT_RE);
110
+ writeFileSync(file, compressCss(code), 'utf-8');
111
+ smartAppendFileSync(cssFile, `import '${dependencyPath}.css'\n`);
112
+ if (style.lang === 'less') {
113
+ await compileLess(file);
114
+ }
115
+ if (style.lang === 'scss') {
116
+ compileScss(file);
117
+ }
118
+ }
119
+ }
@@ -0,0 +1,27 @@
1
+ import { MapleConfig } from '../config/maple.config.js';
2
+ export declare const IMPORT_FROM_DEPENDENCE_RE: RegExp;
3
+ export declare const EXPORT_FROM_DEPENDENCE_RE: RegExp;
4
+ export declare const IMPORT_DEPENDENCE_RE: RegExp;
5
+ export declare const scriptExtNames: string[];
6
+ export declare const styleExtNames: string[];
7
+ export declare const scriptIndexes: string[];
8
+ export declare const styleIndexes: string[];
9
+ export declare const tryMatchExtname: (file: string, extname: string[]) => string | undefined;
10
+ export declare const resolveAlias: (dependence: string, file: string, alias?: MapleConfig['alias']) => string;
11
+ export declare const resolveDependence: (file: string, script: string, alias?: MapleConfig['alias']) => string;
12
+ export declare function compileScriptByBabel(script: string, file: string): Promise<string>;
13
+ export declare function compileScriptByEsbuild(script: string): Promise<string>;
14
+ export declare function compileScript(script: string, file: string): Promise<void>;
15
+ export declare function compileScriptFile(file: string): Promise<void>;
16
+ export declare function getScriptExtname(): string;
17
+ export interface GenerateEsEntryTemplateOptions {
18
+ publicDirs: string[];
19
+ scriptExtname?: string;
20
+ root?: string;
21
+ }
22
+ export declare function generateEsEntryTemplate(options: GenerateEsEntryTemplateOptions): {
23
+ indexTemplate: string;
24
+ styleTemplate: string;
25
+ bundleTemplate: string;
26
+ };
27
+ export declare function compileESEntry(dir: string, publicDirs: string[]): Promise<void>;