@moluoxixi/create-app 2.0.425 → 2.0.428

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.
@@ -2,6 +2,7 @@
2
2
  * 项目常量定义
3
3
  * 统一管理所有硬编码的字符串和配置值
4
4
  */
5
+ import type { FrameworkType, MicroFrontendEngine, PackageManagerType, RouteModeType, UILibraryType } from '../types/index.ts';
5
6
  /**
6
7
  * 文件系统相关常量
7
8
  */
@@ -15,3 +16,68 @@ export declare const FILE_CONSTANTS: {
15
16
  /** pnpm-workspace.yaml 文件名 */
16
17
  readonly PNPM_WORKSPACE_YAML: "pnpm-workspace.yaml";
17
18
  };
19
+ /**
20
+ * UI 库选项配置(按框架分组,允许部分框架不存在)
21
+ */
22
+ export declare const UI_LIBRARY_OPTIONS: Partial<Record<FrameworkType, Array<{
23
+ name: string;
24
+ value: UILibraryType;
25
+ }>>>;
26
+ /**
27
+ * 框架列表(从 UI_LIBRARY_OPTIONS 的 keys 获取)
28
+ */
29
+ export declare const FRAMEWORKS: readonly FrameworkType[];
30
+ /**
31
+ * 框架选项配置(基于 FRAMEWORKS 生成)
32
+ */
33
+ export declare const FRAMEWORK_OPTIONS: Array<{
34
+ name: string;
35
+ value: FrameworkType;
36
+ }>;
37
+ /**
38
+ * UI 库列表(按框架分组,仅值)
39
+ * 确保所有框架都有对应的数组(缺失的框架使用空数组)
40
+ */
41
+ export declare const UI_LIBRARIES: Record<FrameworkType, readonly UILibraryType[]>;
42
+ /**
43
+ * 路由模式选项配置
44
+ */
45
+ export declare const ROUTE_MODE_OPTIONS: readonly [{
46
+ readonly name: "文件系统路由 (vite-plugin-pages)";
47
+ readonly value: RouteModeType;
48
+ }, {
49
+ readonly name: "手动配置路由";
50
+ readonly value: RouteModeType;
51
+ }];
52
+ /**
53
+ * 路由模式列表(仅值)
54
+ */
55
+ export declare const ROUTE_MODES: readonly RouteModeType[];
56
+ /**
57
+ * 微前端引擎选项配置
58
+ */
59
+ export declare const MICRO_FRONTEND_ENGINE_OPTIONS: readonly [{
60
+ readonly name: "qiankun (阿里开源)";
61
+ readonly value: MicroFrontendEngine;
62
+ }];
63
+ /**
64
+ * 微前端引擎列表(仅值)
65
+ */
66
+ export declare const MICRO_FRONTEND_ENGINES: readonly MicroFrontendEngine[];
67
+ /**
68
+ * 包管理器选项配置
69
+ */
70
+ export declare const PACKAGE_MANAGER_OPTIONS: readonly [{
71
+ readonly name: "pnpm (推荐)";
72
+ readonly value: PackageManagerType;
73
+ }, {
74
+ readonly name: "npm";
75
+ readonly value: PackageManagerType;
76
+ }, {
77
+ readonly name: "yarn";
78
+ readonly value: PackageManagerType;
79
+ }];
80
+ /**
81
+ * 包管理器列表(仅值)
82
+ */
83
+ export declare const PACKAGE_MANAGERS: readonly PackageManagerType[];
@@ -15,3 +15,74 @@ export const FILE_CONSTANTS = {
15
15
  /** pnpm-workspace.yaml 文件名 */
16
16
  PNPM_WORKSPACE_YAML: 'pnpm-workspace.yaml',
17
17
  };
18
+ /**
19
+ * UI 库选项配置(按框架分组,允许部分框架不存在)
20
+ */
21
+ export const UI_LIBRARY_OPTIONS = {
22
+ vue: [
23
+ { name: 'Element Plus', value: 'element-plus' },
24
+ // TODO: 模板还没优化完毕,先不提供
25
+ // { name: 'Ant Design Vue', value: 'ant-design-vue' as UILibraryType },
26
+ ],
27
+ // TODO: 模板还没优化完毕,先不提供
28
+ // react: [
29
+ // { name: 'Ant Design', value: 'ant-design' as UILibraryType },
30
+ // ],
31
+ };
32
+ /**
33
+ * 框架列表(从 UI_LIBRARY_OPTIONS 的 keys 获取)
34
+ */
35
+ export const FRAMEWORKS = Object.keys(UI_LIBRARY_OPTIONS);
36
+ /**
37
+ * 框架选项配置(基于 FRAMEWORKS 生成)
38
+ */
39
+ export const FRAMEWORK_OPTIONS = FRAMEWORKS.map((framework) => {
40
+ const names = {
41
+ vue: 'Vue 3',
42
+ react: 'React',
43
+ };
44
+ return { name: names[framework], value: framework };
45
+ });
46
+ /**
47
+ * UI 库列表(按框架分组,仅值)
48
+ * 确保所有框架都有对应的数组(缺失的框架使用空数组)
49
+ */
50
+ export const UI_LIBRARIES = {
51
+ vue: (UI_LIBRARY_OPTIONS.vue ?? []).map(opt => opt.value),
52
+ react: (UI_LIBRARY_OPTIONS.react ?? []).map(opt => opt.value),
53
+ };
54
+ /**
55
+ * 路由模式选项配置
56
+ */
57
+ export const ROUTE_MODE_OPTIONS = [
58
+ { name: '文件系统路由 (vite-plugin-pages)', value: 'pageRoutes' },
59
+ { name: '手动配置路由', value: 'manualRoutes' },
60
+ ];
61
+ /**
62
+ * 路由模式列表(仅值)
63
+ */
64
+ export const ROUTE_MODES = ROUTE_MODE_OPTIONS.map(opt => opt.value);
65
+ /**
66
+ * 微前端引擎选项配置
67
+ */
68
+ export const MICRO_FRONTEND_ENGINE_OPTIONS = [
69
+ { name: 'qiankun (阿里开源)', value: 'qiankun' },
70
+ // TODO: 还没有,后续可考虑接入
71
+ // { name: 'micro-app (京东开源)', value: 'micro-app' as MicroFrontendEngine },
72
+ ];
73
+ /**
74
+ * 微前端引擎列表(仅值)
75
+ */
76
+ export const MICRO_FRONTEND_ENGINES = MICRO_FRONTEND_ENGINE_OPTIONS.map(opt => opt.value);
77
+ /**
78
+ * 包管理器选项配置
79
+ */
80
+ export const PACKAGE_MANAGER_OPTIONS = [
81
+ { name: 'pnpm (推荐)', value: 'pnpm' },
82
+ { name: 'npm', value: 'npm' },
83
+ { name: 'yarn', value: 'yarn' },
84
+ ];
85
+ /**
86
+ * 包管理器列表(仅值)
87
+ */
88
+ export const PACKAGE_MANAGERS = PACKAGE_MANAGER_OPTIONS.map(opt => opt.value);
@@ -6,7 +6,7 @@ import type { FrameworkType, ProjectConfigType, RouteModeType } from '../types/i
6
6
  /**
7
7
  * 扫描所有 features(框架的 + 公共的)
8
8
  * @param framework 框架类型
9
- * @returns 所有 feature 名称数组(UI 库按优先级排序)
9
+ * @returns 所有 feature 名称数组
10
10
  */
11
11
  export declare function scanAllFeatures(framework: FrameworkType): string[];
12
12
  /**
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import fs from 'fs-extra';
6
6
  import path from 'node:path';
7
+ import { ROUTE_MODES, UI_LIBRARIES } from "../constants/index.js";
7
8
  import { getTemplatesDir } from "../utils/file.js";
8
9
  import { renderTemplate } from "./template.js";
9
10
  // ============================================================================
@@ -55,19 +56,10 @@ function getMicroFrontendEngines(framework) {
55
56
  // ============================================================================
56
57
  // Feature 映射(用于测试用例生成)
57
58
  // ============================================================================
58
- /**
59
- * UI 库优先级顺序(用于排序,确保默认选择)
60
- * TODO: ant-design-vue 和 ant-design (React) 功能暂时关闭
61
- */
62
- const UI_LIBRARY_PRIORITY = {
63
- 'element-plus': 1,
64
- // 'ant-design-vue': 2, // TODO: 暂时关闭
65
- // 'ant-design': 1, // TODO: 暂时关闭 (React)
66
- };
67
59
  /**
68
60
  * 扫描所有 features(框架的 + 公共的)
69
61
  * @param framework 框架类型
70
- * @returns 所有 feature 名称数组(UI 库按优先级排序)
62
+ * @returns 所有 feature 名称数组
71
63
  */
72
64
  export function scanAllFeatures(framework) {
73
65
  const frameworkDir = path.join(getTemplatesDir(), framework, 'features');
@@ -79,16 +71,7 @@ export function scanAllFeatures(framework) {
79
71
  if (fs.existsSync(commonDir)) {
80
72
  features.push(...fs.readdirSync(commonDir).filter(f => fs.statSync(path.join(commonDir, f)).isDirectory()));
81
73
  }
82
- // 对 UI 库进行排序,确保 element-plus 优先(优先级数字越小越靠前)
83
- return features.sort((a, b) => {
84
- const priorityA = UI_LIBRARY_PRIORITY[a] ?? 999;
85
- const priorityB = UI_LIBRARY_PRIORITY[b] ?? 999;
86
- if (priorityA !== priorityB) {
87
- return priorityA - priorityB;
88
- }
89
- // 相同优先级时保持字母顺序
90
- return a.localeCompare(b);
91
- });
74
+ return features;
92
75
  }
93
76
  /**
94
77
  * Feature 名称转换为配置键和值(用于测试用例生成)
@@ -99,14 +82,13 @@ export function scanAllFeatures(framework) {
99
82
  */
100
83
  export function featureToConfig(feature, _framework) {
101
84
  // UI 库:配置键是 uiLibrary,值是 feature 名称
102
- // TODO: ant-design-vue ant-design (React) 功能暂时关闭
103
- // const uiLibraries = ['element-plus', 'ant-design-vue', 'ant-design']
104
- const uiLibraries = ['element-plus'];
105
- if (uiLibraries.includes(feature)) {
85
+ // 从常量中获取所有 UI 库列表(合并所有框架的 UI 库)
86
+ const allUiLibraries = Object.values(UI_LIBRARIES).flat();
87
+ if (allUiLibraries.includes(feature)) {
106
88
  return { key: 'uiLibrary', value: feature };
107
89
  }
108
90
  // 路由模式 features:用于测试分类
109
- if (feature === 'manualRoutes' || feature === 'pageRoutes') {
91
+ if (ROUTE_MODES.includes(feature)) {
110
92
  return { key: 'routeMode', value: feature };
111
93
  }
112
94
  // 布尔类型的 features:配置名 === feature 名
@@ -132,9 +114,11 @@ export function featureToConfig(feature, _framework) {
132
114
  * @returns 包含 manualRoutes 和 pageRoutes 布尔值的对象
133
115
  */
134
116
  export function getRouteModeFeatures(routeMode) {
117
+ const manualRoutesValue = ROUTE_MODES.find(m => m === 'manualRoutes');
118
+ const pageRoutesValue = ROUTE_MODES.find(m => m === 'pageRoutes');
135
119
  return {
136
- manualRoutes: routeMode === 'manualRoutes',
137
- pageRoutes: routeMode === 'pageRoutes',
120
+ manualRoutes: routeMode === manualRoutesValue,
121
+ pageRoutes: routeMode === pageRoutesValue,
138
122
  };
139
123
  }
140
124
  // ============================================================================
@@ -5,6 +5,7 @@
5
5
  import fs from 'node:fs';
6
6
  import process from 'node:process';
7
7
  import inquirer from 'inquirer';
8
+ import { FRAMEWORK_OPTIONS, MICRO_FRONTEND_ENGINE_OPTIONS, PACKAGE_MANAGER_OPTIONS, ROUTE_MODE_OPTIONS, UI_LIBRARY_OPTIONS, } from "../constants/index.js";
8
9
  import { getDefaultAuthor } from "../utils/npmConfig.js";
9
10
  import { getRouteModeFeatures } from "./feature.js";
10
11
  /**
@@ -92,11 +93,7 @@ export async function collectProjectConfig(projectName) {
92
93
  type: 'list',
93
94
  name: 'framework',
94
95
  message: '选择框架:',
95
- choices: [
96
- { name: 'Vue 3', value: 'vue' },
97
- // TODO: React 功能暂时关闭
98
- // { name: 'React', value: 'react' },
99
- ],
96
+ choices: FRAMEWORK_OPTIONS,
100
97
  },
101
98
  // UI 库选择
102
99
  {
@@ -104,18 +101,8 @@ export async function collectProjectConfig(projectName) {
104
101
  name: 'uiLibrary',
105
102
  message: '选择 UI 组件库:',
106
103
  choices: (answers) => {
107
- if (answers.framework === 'vue') {
108
- return [
109
- { name: 'Element Plus', value: 'element-plus' },
110
- // TODO: Ant Design Vue 功能暂时关闭
111
- // { name: 'Ant Design Vue', value: 'ant-design-vue' },
112
- ];
113
- }
114
- else {
115
- // TODO: React 功能暂时关闭
116
- // return [{ name: 'Ant Design', value: 'ant-design' }]
117
- return [];
118
- }
104
+ const framework = answers.framework;
105
+ return UI_LIBRARY_OPTIONS[framework] ?? [];
119
106
  },
120
107
  },
121
108
  // 路由模式(路由已内置,只需选择模式)
@@ -123,10 +110,7 @@ export async function collectProjectConfig(projectName) {
123
110
  type: 'list',
124
111
  name: 'routeMode',
125
112
  message: '选择路由模式:',
126
- choices: [
127
- { name: '文件系统路由 (vite-plugin-pages)', value: 'pageRoutes' },
128
- { name: '手动配置路由', value: 'manualRoutes' },
129
- ],
113
+ choices: ROUTE_MODE_OPTIONS,
130
114
  },
131
115
  // 是否启用国际化
132
116
  {
@@ -147,11 +131,7 @@ export async function collectProjectConfig(projectName) {
147
131
  type: 'list',
148
132
  name: 'microFrontendEngine',
149
133
  message: '选择微前端引擎:',
150
- choices: [
151
- { name: 'qiankun (阿里开源)', value: 'qiankun' },
152
- // TODO: 还没有,后续可考虑接入
153
- // { name: 'micro-app (京东开源)', value: 'micro-app' },
154
- ],
134
+ choices: MICRO_FRONTEND_ENGINE_OPTIONS,
155
135
  when: (answers) => answers.microFrontend === true,
156
136
  },
157
137
  // 是否启用错误监控
@@ -180,11 +160,7 @@ export async function collectProjectConfig(projectName) {
180
160
  type: 'list',
181
161
  name: 'packageManager',
182
162
  message: '选择包管理器:',
183
- choices: [
184
- { name: 'pnpm (推荐)', value: 'pnpm' },
185
- { name: 'npm', value: 'npm' },
186
- { name: 'yarn', value: 'yarn' },
187
- ],
163
+ choices: PACKAGE_MANAGER_OPTIONS,
188
164
  default: 'pnpm',
189
165
  },
190
166
  ]);
@@ -4,7 +4,7 @@
4
4
  * 支持三层嵌套优先级 (L1: common, L2: framework, L3: micro-frontend)
5
5
  */
6
6
  import path from 'node:path';
7
- import { FILE_CONSTANTS } from "../constants/index.js";
7
+ import { FILE_CONSTANTS, FRAMEWORKS } from "../constants/index.js";
8
8
  import { renderCommonFeatures, renderFrameworkFeatures, renderMicroFrontendFeatures, } from "../core/feature.js";
9
9
  import { renderTemplate, updatePackageJsonMetadata } from "../core/template.js";
10
10
  import { emptyDir, getTemplatesDir } from "../utils/file.js";
@@ -59,11 +59,8 @@ function renderAllFeatures(config, targetDir) {
59
59
  * @throws {Error} 如果框架不支持或项目生成失败
60
60
  */
61
61
  export async function generateProject(config) {
62
- // 支持的框架列表
63
- // TODO: React 功能暂时关闭
64
- // const supportedFrameworks = ['vue', 'react']
65
- const supportedFrameworks = ['vue'];
66
- if (!supportedFrameworks.includes(config.framework)) {
62
+ // 验证框架是否支持
63
+ if (!FRAMEWORKS.includes(config.framework)) {
67
64
  throw new Error(`不支持的框架: ${config.framework}`);
68
65
  }
69
66
  const { targetDir, framework, microFrontend, microFrontendEngine } = config;
package/dist/test.js CHANGED
@@ -7,7 +7,7 @@ import process from 'node:process';
7
7
  import { fileURLToPath } from 'node:url';
8
8
  import chalk from 'chalk';
9
9
  import fs from 'fs-extra';
10
- import { FILE_CONSTANTS } from "./constants/index.js";
10
+ import { FILE_CONSTANTS, FRAMEWORKS, MICRO_FRONTEND_ENGINES, PACKAGE_MANAGERS, ROUTE_MODES, UI_LIBRARIES, } from "./constants/index.js";
11
11
  import { featureToConfig, getRouteModeFeatures, scanAllFeatures } from "./core/feature.js";
12
12
  import { generateProject } from "./generators/index.js";
13
13
  const __filename = fileURLToPath(import.meta.url);
@@ -40,25 +40,19 @@ const TEST_CONFIG = {
40
40
  },
41
41
  /** 参与组合测试的选项 */
42
42
  combinations: {
43
- /** 框架列表(空数组表示不启用) */
44
- // TODO: React 功能暂时关闭
45
- // frameworks: ['vue', 'react'] as FrameworkType[],
46
- frameworks: ['vue'],
47
- /** UI 库配置(按框架分组,空数组表示不启用,需要明确配置才启用) */
43
+ /** 框架列表(使用常量) */
44
+ frameworks: FRAMEWORKS,
45
+ /** UI 库配置(直接使用 UI_LIBRARIES) */
48
46
  uiLibraries: {
49
- // TODO: Ant Design Vue 功能暂时关闭
50
- // vue: ['element-plus', 'ant-design-vue'] as string[], // Vue 可用的 UI 库
51
- vue: ['element-plus'], // Vue 框架可用的 UI 库
52
- // TODO: React 功能暂时关闭
53
- // react: ['ant-design'] as string[], // React 可用的 UI 库
54
- react: [], // React 功能暂时关闭
47
+ vue: UI_LIBRARIES.vue,
48
+ react: UI_LIBRARIES.react,
55
49
  },
56
50
  /** 路由模式列表(空数组表示不启用) */
57
- routeModes: ['manualRoutes', 'pageRoutes'],
58
- /** 微前端引擎列表(空数组表示不启用) */
59
- microFrontendEngines: ['qiankun'],
60
- /** 包管理器列表(空数组表示不启用) */
61
- packageManagers: ['pnpm'],
51
+ routeModes: ROUTE_MODES,
52
+ /** 微前端引擎列表(直接使用常量) */
53
+ microFrontendEngines: MICRO_FRONTEND_ENGINES,
54
+ /** 包管理器列表(直接使用常量) */
55
+ packageManagers: PACKAGE_MANAGERS,
62
56
  /** 是否测试 i18n 的组合 */
63
57
  i18n: false,
64
58
  /** 是否测试 sentry 的组合 */
@@ -17,7 +17,9 @@ export declare const MOLUOXIXI_DEPS: {
17
17
  readonly '@moluoxixi/css-module-global-root-plugin': "latest";
18
18
  };
19
19
  /**
20
- * 微前端引擎类型
20
+ * 微前端引擎类型定义
21
+ * 注意:此处的常量仅用于类型推导,实际使用的常量请参考 src/constants/index.ts 中的 MICRO_FRONTEND_ENGINES
22
+ * 如需修改微前端引擎列表,请同时更新 src/constants/index.ts 中的 MICRO_FRONTEND_ENGINE_OPTIONS
21
23
  */
22
24
  export declare const MICRO_FRONTEND_ENGINES: readonly ["qiankun", "micro-app"];
23
25
  export type MicroFrontendEngine = typeof MICRO_FRONTEND_ENGINES[number];
@@ -17,6 +17,8 @@ export const MOLUOXIXI_DEPS = {
17
17
  '@moluoxixi/css-module-global-root-plugin': 'latest',
18
18
  };
19
19
  /**
20
- * 微前端引擎类型
20
+ * 微前端引擎类型定义
21
+ * 注意:此处的常量仅用于类型推导,实际使用的常量请参考 src/constants/index.ts 中的 MICRO_FRONTEND_ENGINES
22
+ * 如需修改微前端引擎列表,请同时更新 src/constants/index.ts 中的 MICRO_FRONTEND_ENGINE_OPTIONS
21
23
  */
22
24
  export const MICRO_FRONTEND_ENGINES = ['qiankun', 'micro-app'];
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import { exec, spawn } from 'node:child_process';
6
6
  import { promisify } from 'node:util';
7
+ import { PACKAGE_MANAGERS } from "../constants/index.js";
7
8
  import { validatePath } from "./file.js";
8
9
  const execAsync = promisify(exec); // exec 用于 initGit 函数
9
10
  /** 重试延迟基数(毫秒) */
@@ -15,9 +16,8 @@ const RETRY_DELAY_BASE_MS = 1000;
15
16
  * @throws {Error} 如果包管理器类型不支持或路径不安全
16
17
  */
17
18
  function validateInstallParams(packageManager, cwd) {
18
- // 验证包管理器类型
19
- const validPackageManagers = ['pnpm', 'npm', 'yarn'];
20
- if (!validPackageManagers.includes(packageManager)) {
19
+ // 验证包管理器类型(从常量中获取)
20
+ if (!PACKAGE_MANAGERS.includes(packageManager)) {
21
21
  throw new Error(`不支持的包管理器: ${packageManager}`);
22
22
  }
23
23
  // 验证工作目录路径(防止路径遍历攻击)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@moluoxixi/create-app",
3
- "version": "2.0.425",
3
+ "version": "2.0.428",
4
4
  "type": "module",
5
5
  "description": "Create Vue/React projects with atomic layered architecture",
6
6
  "main": "dist/index.js",
@@ -8,6 +8,7 @@
8
8
  "create-mox": "./dist/index.js"
9
9
  },
10
10
  "files": [
11
+ "!template/**/node_modules/*",
11
12
  "LICENSE.txt",
12
13
  "README.md",
13
14
  "dist",