create-lumal-admin 0.0.5-beta → 0.0.6-beta

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 (194) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +39 -10
  3. package/dist/cli.d.ts +9 -3
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +236 -19
  6. package/dist/cli.js.map +1 -1
  7. package/dist/create.d.ts +10 -1
  8. package/dist/create.d.ts.map +1 -1
  9. package/dist/create.js +18 -5
  10. package/dist/create.js.map +1 -1
  11. package/dist/index.d.ts +2 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +1 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/presets.d.ts +29 -3
  16. package/dist/presets.d.ts.map +1 -1
  17. package/dist/presets.js +38 -10
  18. package/dist/presets.js.map +1 -1
  19. package/dist/project-cli.d.ts +3 -0
  20. package/dist/project-cli.d.ts.map +1 -0
  21. package/dist/project-cli.js +13 -0
  22. package/dist/project-cli.js.map +1 -0
  23. package/dist/projects.d.ts +21 -0
  24. package/dist/projects.d.ts.map +1 -0
  25. package/dist/projects.js +124 -0
  26. package/dist/projects.js.map +1 -0
  27. package/dist/templates.d.ts +2 -0
  28. package/dist/templates.d.ts.map +1 -1
  29. package/dist/templates.js +42 -13
  30. package/dist/templates.js.map +1 -1
  31. package/dist/types.d.ts +39 -0
  32. package/dist/types.d.ts.map +1 -1
  33. package/package.json +11 -3
  34. package/templates/base/API-CONTRACT.md +67 -20
  35. package/templates/base/README.md +20 -3
  36. package/templates/base/src/App.vue +71 -79
  37. package/templates/base/src/app/components/AppHeaderActions.vue +46 -0
  38. package/templates/base/src/{components/app → app/components}/AppSettingsDrawer.vue +15 -15
  39. package/templates/base/src/app/menu-policy.ts +163 -0
  40. package/templates/base/src/app/module.ts +46 -0
  41. package/templates/base/src/app/router/index.ts +107 -0
  42. package/templates/base/src/app/router/views.ts +12 -0
  43. package/templates/base/src/{services → app/services}/access.ts +1 -1
  44. package/templates/base/src/app/services/contracts.ts +54 -0
  45. package/templates/base/src/app/services/local-contracts.ts +18 -0
  46. package/templates/base/src/{services → app/services}/preferences.ts +8 -8
  47. package/templates/base/src/app/services/session-runtime.ts +186 -0
  48. package/templates/base/src/{services → app/services}/session.ts +4 -4
  49. package/templates/base/src/app/stored-menus.ts +72 -0
  50. package/templates/base/src/app/views/SafeIframeView.vue +34 -0
  51. package/templates/base/src/{views → app/views}/auth/LoginView.vue +29 -34
  52. package/templates/base/src/app/views/error/ForbiddenView.vue +20 -0
  53. package/templates/base/src/{views → app/views}/error/NotFoundView.vue +5 -7
  54. package/templates/base/src/main.ts +21 -22
  55. package/templates/base/src/modules/business/README.md +33 -0
  56. package/templates/base/src/{views → modules}/dashboard/DashboardView.vue +3 -3
  57. package/templates/base/src/modules/dashboard/module.ts +14 -0
  58. package/templates/base/src/shared/api.ts +53 -0
  59. package/templates/base/src/shared/components/BaseEntityDialog.vue +39 -0
  60. package/templates/base/src/shared/composables/use-async-data.ts +35 -0
  61. package/templates/base/src/shared/composables/use-entity-editor.ts +77 -0
  62. package/templates/base/src/shared/status.ts +4 -0
  63. package/templates/base/src/shared/tree.ts +41 -0
  64. package/templates/base/src/styles.scss +1 -6
  65. package/templates/base/tests/menu-policy.test.ts.template +89 -0
  66. package/templates/base/tests/session.test.ts.template +38 -27
  67. package/templates/base/vite.config.ts +4 -4
  68. package/templates/blank/README.md +6 -0
  69. package/templates/blank/src/App.vue +11 -0
  70. package/templates/common/AGENTS.md +13 -0
  71. package/templates/common/_editorconfig +15 -0
  72. package/templates/common/_gitattributes +6 -0
  73. package/templates/{base → common}/_gitignore +1 -0
  74. package/templates/common/_prettierignore +6 -0
  75. package/templates/common/docs/DEVELOPMENT.md +26 -0
  76. package/templates/common/eslint.config.mjs +60 -0
  77. package/templates/common/package.json +39 -0
  78. package/templates/common/prettier.config.mjs +8 -0
  79. package/templates/{base → common}/tsconfig.json +2 -5
  80. package/templates/common/vitest.config.ts +3 -0
  81. package/templates/features/examples/src/modules/examples/CrudExampleView.vue +51 -0
  82. package/templates/features/examples/src/{views → modules}/examples/FormExampleView.vue +15 -8
  83. package/templates/features/examples/src/modules/examples/module.ts +27 -0
  84. package/templates/features/system/src/modules/system/config/ConfigView.vue +104 -0
  85. package/templates/features/system/src/modules/system/config/api.ts +38 -0
  86. package/templates/features/system/src/modules/system/config/routes.ts +21 -0
  87. package/templates/features/system/src/modules/system/dictionary/DictionaryItemView.vue +141 -0
  88. package/templates/features/system/src/modules/system/dictionary/DictionaryTypeView.vue +107 -0
  89. package/templates/features/system/src/modules/system/dictionary/api.ts +61 -0
  90. package/templates/features/system/src/modules/system/dictionary/cache.ts +9 -0
  91. package/templates/features/system/src/modules/system/dictionary/routes.ts +32 -0
  92. package/templates/features/system/src/modules/system/dictionary/types.ts +22 -0
  93. package/templates/features/system/src/modules/system/local.ts +348 -0
  94. package/templates/features/system/src/modules/system/menu/MenuView.vue +133 -0
  95. package/templates/features/system/src/modules/system/menu/api.ts +73 -0
  96. package/templates/features/system/src/modules/system/menu/components/MenuEditorDialog.vue +106 -0
  97. package/templates/features/system/src/modules/system/menu/routes.ts +23 -0
  98. package/templates/features/system/src/modules/system/menu/types.ts +18 -0
  99. package/templates/features/system/src/modules/system/module.ts +22 -0
  100. package/templates/features/system/src/modules/system/organization/OrganizationView.vue +134 -0
  101. package/templates/features/system/src/modules/system/organization/api.ts +38 -0
  102. package/templates/features/system/src/modules/system/organization/routes.ts +23 -0
  103. package/templates/features/system/src/modules/system/organization/types.ts +17 -0
  104. package/templates/features/system/src/modules/system/role/RoleView.vue +90 -0
  105. package/templates/features/system/src/modules/system/role/api.ts +40 -0
  106. package/templates/features/system/src/modules/system/role/components/RoleAuthorizationDialog.vue +110 -0
  107. package/templates/features/system/src/modules/system/role/permission-tree.ts +31 -0
  108. package/templates/features/system/src/modules/system/role/routes.ts +24 -0
  109. package/templates/features/system/src/modules/system/role/types.ts +12 -0
  110. package/templates/features/system/src/modules/system/user/UserView.vue +297 -0
  111. package/templates/features/system/src/modules/system/user/api.ts +45 -0
  112. package/templates/features/system/src/modules/system/user/components/UserOrganizationFilter.vue +61 -0
  113. package/templates/features/system/src/modules/system/user/components/UserRoleDialog.vue +93 -0
  114. package/templates/features/system/src/modules/system/user/routes.ts +27 -0
  115. package/templates/features/system/src/modules/system/user/types.ts +28 -0
  116. package/templates/features/system/tests/system.test.ts.template +266 -0
  117. package/templates/modes/http/src/app/services/data-source.ts +124 -0
  118. package/templates/modes/http/src/app/services/http-adapter.ts +128 -0
  119. package/templates/modes/http/tests/http.test.ts.template +186 -133
  120. package/templates/modes/local/src/app/services/data-source.ts +113 -0
  121. package/templates/modes/local/src/app/services/local-database.ts +67 -0
  122. package/templates/modes/local/tests/local.test.ts.template +117 -77
  123. package/templates/presets/standard/src/modules/dashboard/DashboardView.vue +52 -0
  124. package/templates/presets/standard/src/modules/dashboard/components/DashboardSessionStatus.vue +41 -0
  125. package/templates/presets/standard/src/modules/dashboard/components/DashboardShortcuts.vue +51 -0
  126. package/templates/presets/standard/src/modules/profile/ProfileView.vue +109 -0
  127. package/templates/presets/standard/src/modules/profile/api.ts +49 -0
  128. package/templates/presets/standard/src/modules/profile/components/ProfilePasswordForm.vue +68 -0
  129. package/templates/presets/standard/src/modules/profile/local.ts +40 -0
  130. package/templates/presets/standard/src/modules/profile/module.ts +11 -0
  131. package/templates/presets/standard/tests/profile.test.ts.template +72 -0
  132. package/templates/screen/README.md +6 -0
  133. package/templates/screen/src/App.vue +7 -0
  134. package/templates/screen/src/screen/ScreenEntry.vue +18 -0
  135. package/templates/screen/src/screen/ScreenView.vue +48 -0
  136. package/templates/screen/src/screen/components/ScreenMetrics.vue +40 -0
  137. package/templates/screen-auth/src/screen/ScreenEntry.vue +52 -0
  138. package/templates/screen-auth/src/screen/components/ScreenLoginForm.vue +44 -0
  139. package/templates/screen-auth/src/services/session.ts +61 -0
  140. package/templates/screen-auth/tests/session.test.ts.template +54 -0
  141. package/templates/screen-auth-http/src/services/auth-adapter.ts +14 -0
  142. package/templates/screen-auth-http/tests/auth-adapter.test.ts.template +17 -0
  143. package/templates/screen-auth-local-demo/src/services/auth-adapter.ts +15 -0
  144. package/templates/screen-auth-local-demo/tests/auth-adapter.test.ts.template +18 -0
  145. package/templates/screen-data/src/screen/ScreenView.vue +69 -0
  146. package/templates/screen-data/src/services/metrics-types.ts +4 -0
  147. package/templates/screen-data-http/src/services/metrics.ts +20 -0
  148. package/templates/screen-data-http/src/services/request.ts +3 -0
  149. package/templates/screen-data-http/tests/metrics.test.ts.template +21 -0
  150. package/templates/screen-data-local/src/services/metrics.ts +11 -0
  151. package/templates/screen-data-local/tests/metrics.test.ts.template +9 -0
  152. package/templates/screen-http/API-CONTRACT.md +20 -0
  153. package/templates/screen-http/src/services/http.ts +17 -0
  154. package/templates/screen-request-auth/src/services/request.ts +15 -0
  155. package/templates/screen-router/src/App.vue +7 -0
  156. package/templates/screen-router/src/main.ts +13 -0
  157. package/templates/screen-router/src/router.ts +7 -0
  158. package/templates/screen-router/tests/app.test.ts.template +20 -0
  159. package/templates/screen-viewport/src/screen/ScreenViewport.vue +30 -0
  160. package/templates/screen-visualization-charts/src/screen/components/ScreenVisualization.vue +22 -0
  161. package/templates/screen-visualization-cockpit/src/screen/components/ScreenVisualization.vue +33 -0
  162. package/templates/screen-visualization-cockpit/src/screen/components/ScreenWidget.vue +10 -0
  163. package/templates/screen-visualization-datav/src/screen/components/ScreenVisualization.vue +11 -0
  164. package/templates/vben-compatible/MIGRATION.md +2 -0
  165. package/templates/vben-compatible/src/{views/migration → modules/vben-migration}/VbenFormView.vue +2 -1
  166. package/templates/vben-compatible/src/{views/migration → modules/vben-migration}/VbenUsersView.vue +3 -2
  167. package/templates/vben-compatible/src/modules/vben-migration/components/VbenFormExample.vue +64 -0
  168. package/templates/vben-compatible/src/{components/migration → modules/vben-migration/components}/VbenUsers.vue +73 -64
  169. package/templates/vben-compatible/src/modules/vben-migration/local.ts +68 -0
  170. package/templates/vben-compatible/src/modules/vben-migration/module.ts +42 -0
  171. package/templates/vue/index.html +12 -0
  172. package/templates/vue/src/main.ts +5 -0
  173. package/templates/vue/src/styles.css +19 -0
  174. package/templates/vue/tests/app.test.ts.template +10 -0
  175. package/templates/vue/vite.config.ts +9 -0
  176. package/templates/vue/vitest.config.ts +4 -0
  177. package/templates/base/eslint.config.mjs +0 -8
  178. package/templates/base/src/components/app/AppHeaderActions.vue +0 -34
  179. package/templates/base/src/router/index.ts +0 -86
  180. package/templates/base/src/router/views.ts +0 -16
  181. package/templates/base/src/services/contracts.ts +0 -29
  182. package/templates/base/src/services/session-runtime.ts +0 -137
  183. package/templates/base/src/views/error/ForbiddenView.vue +0 -25
  184. package/templates/base/vitest.config.ts +0 -3
  185. package/templates/features/examples/src/modules/examples.ts +0 -10
  186. package/templates/features/examples/src/views/examples/CrudExampleView.vue +0 -30
  187. package/templates/features/system/src/business/system/entities.ts +0 -93
  188. package/templates/features/system/src/modules/system.ts +0 -28
  189. package/templates/features/system/src/views/system/SystemEntityView.vue +0 -85
  190. package/templates/modes/http/src/services/data-source.ts +0 -120
  191. package/templates/modes/http/src/services/http-adapter.ts +0 -124
  192. package/templates/modes/local/src/services/data-source.ts +0 -176
  193. package/templates/vben-compatible/src/components/migration/VbenFormExample.vue +0 -34
  194. package/templates/vben-compatible/src/modules/vben.ts +0 -17
package/dist/presets.d.ts CHANGED
@@ -1,15 +1,41 @@
1
- import type { AdminFeature, CreateLumalAdminProjectOptions } from './types.js';
1
+ import type { AdminFeature, AdminPreset, CreateLumalAdminProjectOptions } from './types.js';
2
2
  export declare const presets: readonly ["minimal", "standard", "vben-compatible"];
3
3
  export declare const apiModes: readonly ["local", "http"];
4
4
  export declare const routerModes: readonly ["hash", "history"];
5
- export declare const features: readonly ["system", "examples"];
5
+ export interface FeatureDefinition {
6
+ label: string;
7
+ hint: string;
8
+ presets: readonly AdminPreset[];
9
+ default: boolean;
10
+ requires?: readonly AdminFeature[];
11
+ conflicts?: readonly AdminFeature[];
12
+ }
13
+ export declare const featureDefinitions: {
14
+ system: {
15
+ label: string;
16
+ hint: string;
17
+ presets: ("standard" | "vben-compatible")[];
18
+ default: true;
19
+ };
20
+ examples: {
21
+ label: string;
22
+ hint: string;
23
+ presets: ("standard" | "vben-compatible")[];
24
+ default: true;
25
+ };
26
+ };
27
+ export declare const features: AdminFeature[];
28
+ export declare function availableFeatures(preset: AdminPreset): AdminFeature[];
29
+ export declare function defaultFeatures(preset: AdminPreset): AdminFeature[];
30
+ export declare function assertFeatures(selected: AdminFeature[], preset: AdminPreset): void;
6
31
  export declare function assertPackageName(name: string): void;
7
32
  export declare function resolveOptions(options: CreateLumalAdminProjectOptions): {
8
- preset: import("./types.js").AdminPreset;
33
+ preset: AdminPreset;
9
34
  apiMode: import("./types.js").ApiMode;
10
35
  routerMode: import("./types.js").RouterMode;
11
36
  features: AdminFeature[];
12
37
  name: string;
13
38
  targetDir: string;
39
+ signal?: AbortSignal;
14
40
  };
15
41
  //# sourceMappingURL=presets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAA;AAG9E,eAAO,MAAM,OAAO,qDAAsD,CAAA;AAC1E,eAAO,MAAM,QAAQ,4BAA6B,CAAA;AAClD,eAAO,MAAM,WAAW,8BAA+B,CAAA;AACvD,eAAO,MAAM,QAAQ,iCAAkC,CAAA;AAEvD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAOpD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,8BAA8B;;;;;;;EAerE"}
1
+ {"version":3,"file":"presets.d.ts","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,8BAA8B,EAAE,MAAM,YAAY,CAAA;AAG3F,eAAO,MAAM,OAAO,qDAAsD,CAAA;AAC1E,eAAO,MAAM,QAAQ,4BAA6B,CAAA;AAClD,eAAO,MAAM,WAAW,8BAA+B,CAAA;AACvD,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,SAAS,WAAW,EAAE,CAAA;IAC/B,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;IAClC,SAAS,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;CACpC;AAGD,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;CAGoB,CAAA;AACnD,eAAO,MAAM,QAAQ,EAAsC,YAAY,EAAE,CAAA;AAEzE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,EAAE,CAErE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,YAAY,EAAE,CAEnE;AAED,wBAAgB,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAgBlF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAUpD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,8BAA8B;;;;;;;;EAYrE"}
package/dist/presets.js CHANGED
@@ -2,27 +2,55 @@ import { builtinModules } from 'node:module';
2
2
  export const presets = ['minimal', 'standard', 'vben-compatible'];
3
3
  export const apiModes = ['local', 'http'];
4
4
  export const routerModes = ['hash', 'history'];
5
- export const features = ['system', 'examples'];
5
+ // 特性选择、默认值和约束共享一份注册表,新增特性无需改写终端流程。
6
+ export const featureDefinitions = {
7
+ system: { label: '系统管理', hint: '用户、授权、菜单、机构、字典与配置', presets: ['standard', 'vben-compatible'], default: true },
8
+ examples: { label: '开发示例', hint: '独立的 Schema Form 与 CRUD Table 示例', presets: ['standard', 'vben-compatible'], default: true },
9
+ };
10
+ export const features = Object.keys(featureDefinitions);
11
+ export function availableFeatures(preset) {
12
+ return features.filter(feature => featureDefinitions[feature].presets.includes(preset));
13
+ }
14
+ export function defaultFeatures(preset) {
15
+ return availableFeatures(preset).filter(feature => featureDefinitions[feature].default);
16
+ }
17
+ export function assertFeatures(selected, preset) {
18
+ for (const feature of selected) {
19
+ if (!Object.hasOwn(featureDefinitions, feature))
20
+ throw new Error(`未知可选能力:${feature}`);
21
+ const definition = featureDefinitions[feature];
22
+ if (!definition.presets.includes(preset))
23
+ throw new Error(`${preset} 预设不包含 ${feature} 业务模块,请选择 standard`);
24
+ for (const dependency of definition.requires ?? []) {
25
+ if (!selected.includes(dependency))
26
+ throw new Error(`${feature} 需要同时启用 ${dependency}`);
27
+ }
28
+ for (const conflict of definition.conflicts ?? []) {
29
+ if (selected.includes(conflict))
30
+ throw new Error(`${feature} 不能与 ${conflict} 同时启用`);
31
+ }
32
+ }
33
+ }
6
34
  export function assertPackageName(name) {
7
35
  // 新建 npm 包不接受前导连字符或 ~;scope 与包名均限制为安全的小写子集。
8
36
  const part = '[a-z0-9][a-z0-9._-]*';
9
- if (name.length > 214 || !new RegExp(`^(?:@${part}/)?${part}$`).test(name)
10
- || ['node_modules', 'favicon.ico', ...builtinModules].includes(name)) {
11
- throw new Error(`非法 npm 项目名称:${name}`);
12
- }
37
+ const invalid = name.length > 214
38
+ ? '长度不能超过 214 个字符'
39
+ : !new RegExp(`^(?:@${part}/)?${part}$`).test(name)
40
+ ? '仅支持小写字母、数字、点、下划线和连字符,且不能以符号开头;scope 使用 @scope/name'
41
+ : ['node_modules', 'favicon.ico', ...builtinModules].includes(name) ? '不能使用 npm 保留名称或 Node 内置模块名' : '';
42
+ if (invalid)
43
+ throw new Error(`非法 npm 项目名称:${name};${invalid}`);
13
44
  }
14
45
  export function resolveOptions(options) {
15
46
  assertPackageName(options.name);
16
47
  const preset = options.preset ?? 'standard';
17
48
  const apiMode = options.apiMode ?? 'local';
18
49
  const routerMode = options.routerMode ?? 'hash';
19
- const selected = [...new Set(options.features ?? (preset === 'minimal' ? [] : features))];
50
+ const selected = [...new Set(options.features ?? defaultFeatures(preset))];
20
51
  if (!presets.includes(preset) || !apiModes.includes(apiMode) || !routerModes.includes(routerMode))
21
52
  throw new Error('预设、数据源或路由模式无效');
22
- if (selected.some(feature => !features.includes(feature)))
23
- throw new Error('可选能力仅支持 system、examples');
24
- if (preset === 'minimal' && selected.length)
25
- throw new Error('minimal 预设不包含业务模块,请选择 standard');
53
+ assertFeatures(selected, preset);
26
54
  if (!options.targetDir?.trim())
27
55
  throw new Error('目标目录不能为空');
28
56
  return { ...options, preset, apiMode, routerMode, features: selected };
@@ -1 +1 @@
1
- {"version":3,"file":"presets.js","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE5C,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,iBAAiB,CAAU,CAAA;AAC1E,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,OAAO,EAAE,MAAM,CAAU,CAAA;AAClD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,SAAS,CAAU,CAAA;AACvD,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAU,CAAA;AAEvD,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,4CAA4C;IAC5C,MAAM,IAAI,GAAG,sBAAsB,CAAA;IACnC,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;WACrE,CAAC,cAAc,EAAE,aAAa,EAAE,GAAG,cAAc,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACvE,MAAM,IAAI,KAAK,CAAC,eAAe,IAAI,EAAE,CAAC,CAAA;IACxC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAuC;IACpE,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,UAAU,CAAA;IAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,OAAO,CAAA;IAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,MAAM,CAAA;IAC/C,MAAM,QAAQ,GAAmB,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IACzG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC/F,MAAM,IAAI,KAAK,CAAC,eAAe,CAAC,CAAA;IAClC,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAA;IAC5C,IAAI,MAAM,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM;QACzC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACnD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE;QAC5B,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAA;IAC7B,OAAO,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;AACxE,CAAC"}
1
+ {"version":3,"file":"presets.js","sourceRoot":"","sources":["../src/presets.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=project-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-cli.d.ts","sourceRoot":"","sources":["../src/project-cli.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import { realpathSync } from 'node:fs';
3
+ import { resolve } from 'node:path';
4
+ import process from 'node:process';
5
+ import { pathToFileURL } from 'node:url';
6
+ import { main } from './cli.js';
7
+ if (process.argv[1] && import.meta.url === pathToFileURL(realpathSync(resolve(process.argv[1]))).href) {
8
+ main(process.argv.slice(2), true).catch((error) => {
9
+ console.error(`创建失败:${error instanceof Error ? error.message : String(error)}`);
10
+ process.exitCode = 1;
11
+ });
12
+ }
13
+ //# sourceMappingURL=project-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project-cli.js","sourceRoot":"","sources":["../src/project-cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,OAAO,MAAM,cAAc,CAAA;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAA;AAE/B,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACtG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACzD,OAAO,CAAC,KAAK,CAAC,QAAQ,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAC/E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IACtB,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { CreateLumalProjectOptions, CreateLumalProjectResult, ResolvedScreenOptions, TemplateFile } from './types.js';
2
+ export declare const projectTemplates: readonly ["admin", "screen", "blank"];
3
+ export declare const screenAuthModes: readonly ["none", "local-demo", "http"];
4
+ export declare const screenDataModes: readonly ["none", "local", "http"];
5
+ export declare const screenVisualizations: readonly ["none", "charts", "datav", "cockpit"];
6
+ export declare const screenViewports: readonly ["disabled", "responsive", "width", "contain", "scale", "vw"];
7
+ export declare const projectRouterModes: readonly ["none", "hash", "history"];
8
+ export declare function resolveProjectOptions(input: CreateLumalProjectOptions): ResolvedScreenOptions | {
9
+ template: "admin";
10
+ preset: import("./types.js").AdminPreset;
11
+ apiMode: import("./types.js").ApiMode;
12
+ routerMode: import("./types.js").RouterMode;
13
+ features: import("./types.js").AdminFeature[];
14
+ name: string;
15
+ targetDir: string;
16
+ signal?: AbortSignal;
17
+ };
18
+ export declare function composeProjectTemplates(options: ResolvedScreenOptions): Promise<TemplateFile[]>;
19
+ /** 新入口不改变旧 createLumalAdminProject 的默认值与返回协议。 */
20
+ export declare function createLumalProject(input: CreateLumalProjectOptions): Promise<CreateLumalProjectResult>;
21
+ //# sourceMappingURL=projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.d.ts","sourceRoot":"","sources":["../src/projects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkC,yBAAyB,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAK1J,eAAO,MAAM,gBAAgB,uCAAwC,CAAA;AACrE,eAAO,MAAM,eAAe,yCAA0C,CAAA;AACtE,eAAO,MAAM,eAAe,oCAAqC,CAAA;AACjE,eAAO,MAAM,oBAAoB,iDAAkD,CAAA;AACnF,eAAO,MAAM,eAAe,wEAAyE,CAAA;AACrG,eAAO,MAAM,kBAAkB,sCAAuC,CAAA;AAEtE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,yBAAyB;;;;;;;;;EAuCrE;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAiErG;AAED,iDAAiD;AACjD,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAM5G"}
@@ -0,0 +1,124 @@
1
+ import { createLumalAdminProject, writeProjectFiles } from './create.js';
2
+ import { assertPackageName, resolveOptions } from './presets.js';
3
+ import { getVersion, readTemplateLayers } from './templates.js';
4
+ export const projectTemplates = ['admin', 'screen', 'blank'];
5
+ export const screenAuthModes = ['none', 'local-demo', 'http'];
6
+ export const screenDataModes = ['none', 'local', 'http'];
7
+ export const screenVisualizations = ['none', 'charts', 'datav', 'cockpit'];
8
+ export const screenViewports = ['disabled', 'responsive', 'width', 'contain', 'scale', 'vw'];
9
+ export const projectRouterModes = ['none', 'hash', 'history'];
10
+ export function resolveProjectOptions(input) {
11
+ const template = input.template ?? 'admin';
12
+ if (!projectTemplates.includes(template))
13
+ throw new Error('项目类型无效');
14
+ if (template === 'admin') {
15
+ if (input.auth !== undefined || input.data !== undefined || input.visualization !== undefined || input.viewport !== undefined)
16
+ throw new Error('Admin 使用 --api-mode 和 --features,不接受 Screen 专属选项');
17
+ if (input.routerMode === 'none')
18
+ throw new Error('Admin 需要 hash 或 history 路由');
19
+ return { ...resolveOptions(input), template: 'admin' };
20
+ }
21
+ assertPackageName(input.name);
22
+ if (!input.targetDir?.trim())
23
+ throw new Error('目标目录不能为空');
24
+ if (input.preset !== undefined || input.features !== undefined)
25
+ throw new Error('非 Admin 项目不能使用 --preset 或 --features');
26
+ if (input.data !== undefined && input.apiMode !== undefined && input.data !== input.apiMode)
27
+ throw new Error('--data 与 --api-mode 冲突');
28
+ const options = {
29
+ template,
30
+ name: input.name,
31
+ targetDir: input.targetDir,
32
+ signal: input.signal,
33
+ auth: input.auth ?? 'none',
34
+ data: input.data ?? input.apiMode ?? 'none',
35
+ routerMode: input.routerMode ?? 'none',
36
+ visualization: input.visualization ?? 'none',
37
+ viewport: input.viewport ?? 'responsive',
38
+ };
39
+ if (!screenAuthModes.includes(options.auth) || !screenDataModes.includes(options.data)
40
+ || !projectRouterModes.includes(options.routerMode) || !screenVisualizations.includes(options.visualization)
41
+ || !screenViewports.includes(options.viewport)) {
42
+ throw new Error('Screen 能力组合无效');
43
+ }
44
+ if (template === 'blank' && (options.auth !== 'none' || options.data !== 'none' || options.routerMode !== 'none'
45
+ || options.visualization !== 'none' || (options.viewport !== 'responsive' && options.viewport !== 'disabled'))) {
46
+ throw new Error('Blank 不包含认证、数据、路由或可视化能力,请选择 Screen');
47
+ }
48
+ return options;
49
+ }
50
+ export async function composeProjectTemplates(options) {
51
+ const layers = ['common', 'vue', options.template];
52
+ const viewport = options.viewport !== 'responsive' && options.viewport !== 'disabled';
53
+ if (options.routerMode !== 'none')
54
+ layers.push('screen-router');
55
+ if (options.data !== 'none')
56
+ layers.push('screen-data', `screen-data-${options.data}`);
57
+ if (options.auth !== 'none')
58
+ layers.push('screen-auth', `screen-auth-${options.auth}`);
59
+ const http = options.auth === 'http' || options.data === 'http';
60
+ if (http)
61
+ layers.push('screen-http');
62
+ if (options.data === 'http' && options.auth !== 'none')
63
+ layers.push('screen-request-auth');
64
+ if (options.visualization !== 'none')
65
+ layers.push(`screen-visualization-${options.visualization}`);
66
+ if (viewport)
67
+ layers.push('screen-viewport');
68
+ const files = await readTemplateLayers(layers);
69
+ const manifest = JSON.parse(files.get('package.json'));
70
+ const version = await getVersion();
71
+ manifest.name = options.name;
72
+ if (options.routerMode !== 'none')
73
+ manifest.dependencies['vue-router'] = '^4.5.0';
74
+ if (options.auth !== 'none' || options.data === 'http')
75
+ manifest.dependencies['@lumal/core'] = version;
76
+ if (viewport)
77
+ manifest.dependencies['@lumal/viewport'] = version;
78
+ if (options.visualization !== 'none')
79
+ manifest.dependencies[`@lumal/${options.visualization}`] = version;
80
+ if (options.visualization === 'charts') {
81
+ manifest.dependencies.echarts = '^6.0.0';
82
+ manifest.dependencies['vue-echarts'] = '^8.0.0';
83
+ }
84
+ if (options.visualization === 'cockpit')
85
+ manifest.dependencies['element-plus'] = '^2.11.0';
86
+ manifest.dependencies = Object.fromEntries(Object.entries(manifest.dependencies).sort(([a], [b]) => a.localeCompare(b)));
87
+ manifest.devDependencies = Object.fromEntries(Object.entries(manifest.devDependencies).sort(([a], [b]) => a.localeCompare(b)));
88
+ files.set('package.json', `${JSON.stringify(manifest, null, 2)}\n`);
89
+ if (options.routerMode !== 'none') {
90
+ files.set('src/router.ts', files.get('src/router.ts').replaceAll('createWebHashHistory', options.routerMode === 'hash' ? 'createWebHashHistory' : 'createWebHistory'));
91
+ }
92
+ if (http) {
93
+ files.set('.env.development', 'VITE_API_BASE_URL=\n');
94
+ files.set('.env.production.example', 'VITE_API_BASE_URL=https://api.example.com\n');
95
+ }
96
+ const screenPath = 'src/screen/ScreenView.vue';
97
+ if (files.has(screenPath)) {
98
+ files.set(screenPath, files.get(screenPath)
99
+ .replace('// SCREEN_VISUALIZATION_IMPORT\n', options.visualization === 'none' ? '' : 'import ScreenVisualization from \'./components/ScreenVisualization.vue\';\n')
100
+ .replace(' <!-- SCREEN_VISUALIZATION -->\n', options.visualization === 'none' ? '' : ' <ScreenVisualization />\n'));
101
+ }
102
+ if (viewport) {
103
+ const entryPath = 'src/screen/ScreenEntry.vue';
104
+ files.set(entryPath, files.get(entryPath)
105
+ .replace('import ScreenView from \'./ScreenView.vue\';', 'import ScreenView from \'./ScreenView.vue\';\nimport ScreenViewport from \'./ScreenViewport.vue\';')
106
+ .replace(' <ScreenView />', ' <ScreenViewport>\n <ScreenView />\n </ScreenViewport>'));
107
+ files.set('src/screen/ScreenViewport.vue', files.get('src/screen/ScreenViewport.vue')
108
+ .replace('/* VIEWPORT_MODE */ \'contain\'', `'${options.viewport === 'scale' ? 'contain' : options.viewport}'`));
109
+ }
110
+ const conventions = options.template === 'blank'
111
+ ? '## Blank\n\n默认只安装 Vue 运行时,不引入 Router、Pinia、Element Plus 或 Lumal Core。按业务需要逐项接入,不预建后台结构。'
112
+ : '## Screen\n\n页面只承担大屏组合,不生成管理菜单、标签和系统模块。普通响应式布局优先,地图按实际容器 resize,不默认 transform 整张地图。';
113
+ files.set('docs/DEVELOPMENT.md', files.get('docs/DEVELOPMENT.md').replace('<!-- PROJECT_CONVENTIONS -->', conventions));
114
+ return [...files].map(([path, content]) => ({ path, content })).sort((a, b) => a.path.localeCompare(b.path));
115
+ }
116
+ /** 新入口不改变旧 createLumalAdminProject 的默认值与返回协议。 */
117
+ export async function createLumalProject(input) {
118
+ const options = resolveProjectOptions(input);
119
+ if (options.template === 'admin')
120
+ return { ...await createLumalAdminProject(options), template: 'admin' };
121
+ const files = await composeProjectTemplates(options);
122
+ return { ...options, ...await writeProjectFiles(options, files) };
123
+ }
124
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../src/projects.ts"],"names":[],"mappings":"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"}
@@ -2,4 +2,6 @@ import type { resolveOptions } from './presets.js';
2
2
  import type { TemplateFile } from './types.js';
3
3
  export declare function getVersion(): Promise<string>;
4
4
  export declare function composeTemplates(options: ReturnType<typeof resolveOptions>): Promise<TemplateFile[]>;
5
+ /** 工程层只读合成,缺失资源在首次写入前失败。 */
6
+ export declare function readTemplateLayers(layers: string[]): Promise<Map<string, string>>;
5
7
  //# sourceMappingURL=templates.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAO9C,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAGlD;AAoBD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAwC1G"}
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAO9C,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAGlD;AAsBD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA6C1G;AAED,4BAA4B;AAC5B,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqBvF"}
package/dist/templates.js CHANGED
@@ -10,13 +10,15 @@ export async function getVersion() {
10
10
  async function readLayer(name, directory = '', result = []) {
11
11
  const entries = await readdir(join(templateRoot, name, directory), { withFileTypes: true });
12
12
  for (const entry of entries) {
13
+ if (entry.isSymbolicLink())
14
+ throw new Error(`模板资源不能是符号链接:${entry.name}`);
13
15
  const path = directory ? `${directory}/${entry.name}` : entry.name;
14
16
  if (entry.isDirectory()) {
15
17
  await readLayer(name, path, result);
16
18
  }
17
19
  else {
18
20
  result.push({
19
- path: path.replace(/\.template$/, '').replace(/^_gitignore$/, '.gitignore'),
21
+ path: path.replace(/\.template$/, '').replace(/^_([^/]+)$/, '.$1'),
20
22
  content: await readFile(join(templateRoot, name, path), 'utf8'),
21
23
  });
22
24
  }
@@ -24,14 +26,12 @@ async function readLayer(name, directory = '', result = []) {
24
26
  return result;
25
27
  }
26
28
  export async function composeTemplates(options) {
27
- const layers = ['base', `modes/${options.apiMode}`, ...options.features.map(feature => `features/${feature}`)];
29
+ const layers = ['base', 'common', `modes/${options.apiMode}`, ...options.features.map(feature => `features/${feature}`)];
30
+ if (options.preset !== 'minimal')
31
+ layers.push('presets/standard');
28
32
  if (options.preset === 'vben-compatible')
29
33
  layers.push('vben-compatible');
30
- const files = new Map();
31
- for (const layer of layers) {
32
- for (const file of await readLayer(layer))
33
- files.set(file.path, file.content);
34
- }
34
+ const files = await readTemplateLayers(layers);
35
35
  const version = await getVersion();
36
36
  const manifest = JSON.parse(files.get('package.json'));
37
37
  manifest.name = options.name;
@@ -40,23 +40,52 @@ export async function composeTemplates(options) {
40
40
  if (options.preset === 'vben-compatible')
41
41
  manifest.dependencies['@lumal/vben-compat'] = version;
42
42
  manifest.dependencies = Object.fromEntries(Object.entries(manifest.dependencies).sort(([left], [right]) => left.localeCompare(right)));
43
+ manifest.devDependencies = Object.fromEntries(Object.entries(manifest.devDependencies).sort(([left], [right]) => left.localeCompare(right)));
43
44
  files.set('package.json', `${JSON.stringify(manifest, null, 2)}\n`);
44
45
  files.set('.env.development', 'VITE_API_BASE_URL=\nVITE_API_ADAPTER=standard\n');
45
46
  files.set('.env.production.example', 'VITE_API_BASE_URL=https://api.example.com\nVITE_API_ADAPTER=standard\n# Local 演示生产构建默认禁止登录;仅演示站点显式启用。\nVITE_ENABLE_LOCAL_DEMO=false\n');
47
+ files.set('docs/DEVELOPMENT.md', files.get('docs/DEVELOPMENT.md').replace('<!-- PROJECT_CONVENTIONS -->', `## Admin
48
+
49
+ 常规查询、分页、标准新增编辑优先使用 Lumal Schema/CRUD;地图、复杂交互和专用表单使用普通 Vue + Element Plus,不强行塞入 Schema。
50
+ 模块通过 module.ts 声明菜单、视图和权限,公共层不依赖业务模块。API 字段转换位于服务 Adapter。
51
+ HTTP 登录失败不得回退 Local。Local 仅供演示,生产默认禁用。修改权限、接口和模块时补充负向测试。
52
+ `.trimEnd()));
46
53
  // 只注入小型配置;完整 SFC、服务和工程文件均保存在模板目录中。
47
54
  files.set('src/app.config.ts', `export const appConfig: {
48
- apiMode: 'http' | 'local'
49
- features: string[]
50
- preset: 'minimal' | 'standard' | 'vben-compatible'
51
- routerMode: 'hash' | 'history'
52
- title: string
55
+ apiMode: 'http' | 'local';
56
+ features: string[];
57
+ preset: 'minimal' | 'standard' | 'vben-compatible';
58
+ routerMode: 'hash' | 'history';
59
+ title: string;
53
60
  } = {
54
61
  apiMode: '${options.apiMode}',
55
62
  features: [${options.features.map(feature => `'${feature}'`).join(', ')}],
56
63
  preset: '${options.preset}',
57
64
  routerMode: '${options.routerMode}',
58
65
  title: '${options.name}',
59
- }\n`);
66
+ };\n`);
60
67
  return [...files].map(([path, content]) => ({ path, content })).sort((a, b) => a.path.localeCompare(b.path));
61
68
  }
69
+ /** 工程层只读合成,缺失资源在首次写入前失败。 */
70
+ export async function readTemplateLayers(layers) {
71
+ const files = new Map();
72
+ for (const layer of layers) {
73
+ for (const file of await readLayer(layer)) {
74
+ if (file.path === 'package.json' && files.has(file.path)) {
75
+ const previous = JSON.parse(files.get(file.path));
76
+ const current = JSON.parse(file.content);
77
+ files.set(file.path, JSON.stringify({
78
+ ...previous,
79
+ ...current,
80
+ dependencies: { ...previous.dependencies, ...current.dependencies },
81
+ devDependencies: { ...previous.devDependencies, ...current.devDependencies },
82
+ }));
83
+ }
84
+ else {
85
+ files.set(file.path, file.content);
86
+ }
87
+ }
88
+ }
89
+ return files;
90
+ }
62
91
  //# sourceMappingURL=templates.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -9,6 +9,8 @@ export interface CreateLumalAdminProjectOptions {
9
9
  preset?: AdminPreset;
10
10
  routerMode?: RouterMode;
11
11
  targetDir: string;
12
+ /** 取消创建时仅回滚本次拥有的文件。 */
13
+ signal?: AbortSignal;
12
14
  }
13
15
  export interface CreateLumalAdminProjectResult {
14
16
  targetDir: string;
@@ -22,4 +24,41 @@ export interface TemplateFile {
22
24
  path: string;
23
25
  content: string;
24
26
  }
27
+ /***********************通用项目生成协议*********************/
28
+ export type ProjectTemplate = 'admin' | 'blank' | 'screen';
29
+ export type ScreenAuth = 'none' | 'local-demo' | 'http';
30
+ export type ScreenData = 'none' | 'local' | 'http';
31
+ export type ScreenVisualization = 'none' | 'charts' | 'datav' | 'cockpit';
32
+ export type ScreenViewport = 'disabled' | 'responsive' | 'width' | 'contain' | 'scale' | 'vw';
33
+ export type ProjectRouterMode = RouterMode | 'none';
34
+ export interface CreateLumalProjectOptions {
35
+ targetDir: string;
36
+ name: string;
37
+ template?: ProjectTemplate;
38
+ preset?: AdminPreset;
39
+ apiMode?: ApiMode;
40
+ features?: AdminFeature[];
41
+ routerMode?: ProjectRouterMode;
42
+ auth?: ScreenAuth;
43
+ data?: ScreenData;
44
+ visualization?: ScreenVisualization;
45
+ viewport?: ScreenViewport;
46
+ signal?: AbortSignal;
47
+ }
48
+ export interface ResolvedScreenOptions {
49
+ template: 'blank' | 'screen';
50
+ name: string;
51
+ targetDir: string;
52
+ auth: ScreenAuth;
53
+ data: ScreenData;
54
+ routerMode: ProjectRouterMode;
55
+ visualization: ScreenVisualization;
56
+ viewport: ScreenViewport;
57
+ signal?: AbortSignal;
58
+ }
59
+ export type CreateLumalProjectResult = (ResolvedScreenOptions | (CreateLumalAdminProjectResult & {
60
+ template: 'admin';
61
+ })) & {
62
+ createdFiles: string[];
63
+ };
25
64
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,iBAAiB,CAAA;AACpE,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;AACtC,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,CAAA;AAC3C,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAA;AAEhD,MAAM,WAAW,8BAA8B;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,UAAU,CAAA;IACtB,QAAQ,EAAE,YAAY,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,iBAAiB,CAAA;AACpE,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;AACtC,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,CAAA;AAC3C,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAA;AAEhD,MAAM,WAAW,8BAA8B;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,UAAU,CAAA;IACtB,QAAQ,EAAE,YAAY,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,sDAAsD;AACtD,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAA;AAC1D,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,CAAA;AACvD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAA;AAClD,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAA;AACzE,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,IAAI,CAAA;AAC7F,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,MAAM,CAAA;AAEnD,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;IACzB,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,aAAa,CAAC,EAAE,mBAAmB,CAAA;IACnC,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE,iBAAiB,CAAA;IAC7B,aAAa,EAAE,mBAAmB,CAAA;IAClC,QAAQ,EAAE,cAAc,CAAA;IACxB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,MAAM,wBAAwB,GAAG,CAAC,qBAAqB,GAAG,CAAC,6BAA6B,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,GAAG;IACzH,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB,CAAA"}
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "create-lumal-admin",
3
3
  "type": "module",
4
- "version": "0.0.5-beta",
5
- "description": "Create a modular Lumal admin application with minimal, standard and Vben 5 presets.",
4
+ "version": "0.0.6-beta",
5
+ "description": "Create lightweight Vue Blank, Screen or Lumal Admin projects with optional capabilities.",
6
6
  "license": "MIT",
7
7
  "keywords": [
8
8
  "lumal",
9
9
  "vue",
10
10
  "admin",
11
+ "screen",
11
12
  "scaffold",
12
13
  "create"
13
14
  ],
@@ -21,6 +22,7 @@
21
22
  }
22
23
  },
23
24
  "bin": {
25
+ "create-lumal": "./dist/project-cli.js",
24
26
  "create-lumal-admin": "./dist/cli.js"
25
27
  },
26
28
  "files": [
@@ -29,9 +31,15 @@
29
31
  "dist",
30
32
  "templates"
31
33
  ],
34
+ "dependencies": {
35
+ "@clack/prompts": "1.8.1"
36
+ },
37
+ "devDependencies": {
38
+ "@lydell/node-pty": "1.2.0-beta.15"
39
+ },
32
40
  "scripts": {
33
41
  "build": "tsc -p tsconfig.json && node ../../scripts/clean-package-dist.mjs dist && node ../../scripts/sync-create-lumal-admin-version.mjs",
34
42
  "typecheck": "tsc --noEmit -p tsconfig.json",
35
- "test": "vitest run --config ../../vitest.config.ts tests"
43
+ "test": "pnpm build && vitest run --config ../../vitest.config.ts tests"
36
44
  }
37
45
  }