@lingxia/cli 0.0.7

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 (163) hide show
  1. package/bin/lingxia.js +91 -0
  2. package/dist/builder/commands/build.d.ts +3 -0
  3. package/dist/builder/commands/build.d.ts.map +1 -0
  4. package/dist/builder/commands/build.js +317 -0
  5. package/dist/builder/commands/build.js.map +1 -0
  6. package/dist/builder/core/builders/logic.d.ts +48 -0
  7. package/dist/builder/core/builders/logic.d.ts.map +1 -0
  8. package/dist/builder/core/builders/logic.js +212 -0
  9. package/dist/builder/core/builders/logic.js.map +1 -0
  10. package/dist/builder/core/builders/page-functions.d.ts +2 -0
  11. package/dist/builder/core/builders/page-functions.d.ts.map +1 -0
  12. package/dist/builder/core/builders/page-functions.js +119 -0
  13. package/dist/builder/core/builders/page-functions.js.map +1 -0
  14. package/dist/builder/core/builders/page-path-injector.d.ts +5 -0
  15. package/dist/builder/core/builders/page-path-injector.d.ts.map +1 -0
  16. package/dist/builder/core/builders/page-path-injector.js +94 -0
  17. package/dist/builder/core/builders/page-path-injector.js.map +1 -0
  18. package/dist/builder/core/builders/page.d.ts +37 -0
  19. package/dist/builder/core/builders/page.d.ts.map +1 -0
  20. package/dist/builder/core/builders/page.js +246 -0
  21. package/dist/builder/core/builders/page.js.map +1 -0
  22. package/dist/builder/core/builders/view.d.ts +23 -0
  23. package/dist/builder/core/builders/view.d.ts.map +1 -0
  24. package/dist/builder/core/builders/view.js +194 -0
  25. package/dist/builder/core/builders/view.js.map +1 -0
  26. package/dist/builder/core/config/alias-config.d.ts +4 -0
  27. package/dist/builder/core/config/alias-config.d.ts.map +1 -0
  28. package/dist/builder/core/config/alias-config.js +29 -0
  29. package/dist/builder/core/config/alias-config.js.map +1 -0
  30. package/dist/builder/core/config/build-config.d.ts +8 -0
  31. package/dist/builder/core/config/build-config.d.ts.map +1 -0
  32. package/dist/builder/core/config/build-config.js +33 -0
  33. package/dist/builder/core/config/build-config.js.map +1 -0
  34. package/dist/builder/core/config/framework.d.ts +3 -0
  35. package/dist/builder/core/config/framework.d.ts.map +1 -0
  36. package/dist/builder/core/config/framework.js +51 -0
  37. package/dist/builder/core/config/framework.js.map +1 -0
  38. package/dist/builder/core/config/lingxia-config.d.ts +55 -0
  39. package/dist/builder/core/config/lingxia-config.d.ts.map +1 -0
  40. package/dist/builder/core/config/lingxia-config.js +174 -0
  41. package/dist/builder/core/config/lingxia-config.js.map +1 -0
  42. package/dist/builder/core/config/view-build-schema.d.ts +17 -0
  43. package/dist/builder/core/config/view-build-schema.d.ts.map +1 -0
  44. package/dist/builder/core/config/view-build-schema.js +2 -0
  45. package/dist/builder/core/config/view-build-schema.js.map +1 -0
  46. package/dist/builder/core/config/view-config.d.ts +11 -0
  47. package/dist/builder/core/config/view-config.d.ts.map +1 -0
  48. package/dist/builder/core/config/view-config.js +79 -0
  49. package/dist/builder/core/config/view-config.js.map +1 -0
  50. package/dist/builder/core/config.d.ts +34 -0
  51. package/dist/builder/core/config.d.ts.map +1 -0
  52. package/dist/builder/core/config.js +73 -0
  53. package/dist/builder/core/config.js.map +1 -0
  54. package/dist/builder/core/constants/source-dirs.d.ts +4 -0
  55. package/dist/builder/core/constants/source-dirs.d.ts.map +1 -0
  56. package/dist/builder/core/constants/source-dirs.js +24 -0
  57. package/dist/builder/core/constants/source-dirs.js.map +1 -0
  58. package/dist/builder/core/constants/static-dirs.d.ts +4 -0
  59. package/dist/builder/core/constants/static-dirs.d.ts.map +1 -0
  60. package/dist/builder/core/constants/static-dirs.js +51 -0
  61. package/dist/builder/core/constants/static-dirs.js.map +1 -0
  62. package/dist/builder/core/frameworks/base.d.ts +49 -0
  63. package/dist/builder/core/frameworks/base.d.ts.map +1 -0
  64. package/dist/builder/core/frameworks/base.js +61 -0
  65. package/dist/builder/core/frameworks/base.js.map +1 -0
  66. package/dist/builder/core/frameworks/factory.d.ts +29 -0
  67. package/dist/builder/core/frameworks/factory.d.ts.map +1 -0
  68. package/dist/builder/core/frameworks/factory.js +59 -0
  69. package/dist/builder/core/frameworks/factory.js.map +1 -0
  70. package/dist/builder/core/frameworks/html.d.ts +30 -0
  71. package/dist/builder/core/frameworks/html.d.ts.map +1 -0
  72. package/dist/builder/core/frameworks/html.js +92 -0
  73. package/dist/builder/core/frameworks/html.js.map +1 -0
  74. package/dist/builder/core/frameworks/react.d.ts +33 -0
  75. package/dist/builder/core/frameworks/react.d.ts.map +1 -0
  76. package/dist/builder/core/frameworks/react.js +161 -0
  77. package/dist/builder/core/frameworks/react.js.map +1 -0
  78. package/dist/builder/core/frameworks/templates.d.ts +2 -0
  79. package/dist/builder/core/frameworks/templates.d.ts.map +1 -0
  80. package/dist/builder/core/frameworks/templates.js +3 -0
  81. package/dist/builder/core/frameworks/templates.js.map +1 -0
  82. package/dist/builder/core/frameworks/vue.d.ts +33 -0
  83. package/dist/builder/core/frameworks/vue.d.ts.map +1 -0
  84. package/dist/builder/core/frameworks/vue.js +161 -0
  85. package/dist/builder/core/frameworks/vue.js.map +1 -0
  86. package/dist/builder/core/registry.d.ts +43 -0
  87. package/dist/builder/core/registry.d.ts.map +1 -0
  88. package/dist/builder/core/registry.js +79 -0
  89. package/dist/builder/core/registry.js.map +1 -0
  90. package/dist/builder/core/template.d.ts +7 -0
  91. package/dist/builder/core/template.d.ts.map +1 -0
  92. package/dist/builder/core/template.js +57 -0
  93. package/dist/builder/core/template.js.map +1 -0
  94. package/dist/builder/core/templates/embedded.d.ts +17 -0
  95. package/dist/builder/core/templates/embedded.d.ts.map +1 -0
  96. package/dist/builder/core/templates/embedded.js +121 -0
  97. package/dist/builder/core/templates/embedded.js.map +1 -0
  98. package/dist/builder/core/utils/file.d.ts +35 -0
  99. package/dist/builder/core/utils/file.d.ts.map +1 -0
  100. package/dist/builder/core/utils/file.js +99 -0
  101. package/dist/builder/core/utils/file.js.map +1 -0
  102. package/dist/builder/core/utils/page.d.ts +14 -0
  103. package/dist/builder/core/utils/page.d.ts.map +1 -0
  104. package/dist/builder/core/utils/page.js +46 -0
  105. package/dist/builder/core/utils/page.js.map +1 -0
  106. package/dist/builder/index.d.ts +2 -0
  107. package/dist/builder/index.d.ts.map +1 -0
  108. package/dist/builder/index.js +2 -0
  109. package/dist/builder/index.js.map +1 -0
  110. package/dist/builder/types/index.d.ts +67 -0
  111. package/dist/builder/types/index.d.ts.map +1 -0
  112. package/dist/builder/types/index.js +2 -0
  113. package/dist/builder/types/index.js.map +1 -0
  114. package/dist/commands/create.d.ts +7 -0
  115. package/dist/commands/create.d.ts.map +1 -0
  116. package/dist/commands/create.js +151 -0
  117. package/dist/commands/create.js.map +1 -0
  118. package/dist/index.d.ts +2 -0
  119. package/dist/index.d.ts.map +1 -0
  120. package/dist/index.js +45 -0
  121. package/dist/index.js.map +1 -0
  122. package/package.json +49 -0
  123. package/scripts/ensure-deps.cjs +54 -0
  124. package/scripts/install.cjs +62 -0
  125. package/scripts/set-version.cjs +34 -0
  126. package/scripts/sync-templates.cjs +36 -0
  127. package/templates/android-native/app/build.gradle.kts +48 -0
  128. package/templates/android-native/app/proguard-rules.pro +21 -0
  129. package/templates/android-native/app/src/main/AndroidManifest.xml +21 -0
  130. package/templates/android-native/app/src/main/java/MainActivity.kt +27 -0
  131. package/templates/android-native/app/src/main/res/values/strings.xml +3 -0
  132. package/templates/android-native/build.gradle.kts +5 -0
  133. package/templates/android-native/gradle/libs.versions.toml +16 -0
  134. package/templates/android-native/gradle/wrapper/gradle-wrapper.jar +0 -0
  135. package/templates/android-native/gradle/wrapper/gradle-wrapper.properties +6 -0
  136. package/templates/android-native/gradle.properties +4 -0
  137. package/templates/android-native/gradlew +185 -0
  138. package/templates/android-native/gradlew.bat +89 -0
  139. package/templates/android-native/settings.gradle.kts +25 -0
  140. package/templates/lxapp-create/react/lxapp.config.json +8 -0
  141. package/templates/lxapp-create/react/lxapp.json +8 -0
  142. package/templates/lxapp-create/react/lxapp.ts +8 -0
  143. package/templates/lxapp-create/react/package.json +26 -0
  144. package/templates/lxapp-create/react/pages/home/index.json +3 -0
  145. package/templates/lxapp-create/react/pages/home/index.ts +14 -0
  146. package/templates/lxapp-create/react/pages/home/index.tsx +60 -0
  147. package/templates/lxapp-create/react/public/.gitkeep +0 -0
  148. package/templates/lxapp-create/react/shared/.gitkeep +0 -0
  149. package/templates/lxapp-create/react/tsconfig.json +20 -0
  150. package/templates/lxapp-create/vue/lxapp.config.json +8 -0
  151. package/templates/lxapp-create/vue/lxapp.json +8 -0
  152. package/templates/lxapp-create/vue/lxapp.ts +8 -0
  153. package/templates/lxapp-create/vue/package.json +24 -0
  154. package/templates/lxapp-create/vue/pages/home/index.json +3 -0
  155. package/templates/lxapp-create/vue/pages/home/index.ts +14 -0
  156. package/templates/lxapp-create/vue/pages/home/index.vue +48 -0
  157. package/templates/lxapp-create/vue/public/.gitkeep +0 -0
  158. package/templates/lxapp-create/vue/shared/.gitkeep +0 -0
  159. package/templates/lxapp-create/vue/tsconfig.json +20 -0
  160. package/templates/rust-lib/Cargo.toml +13 -0
  161. package/templates/rust-lib/README.md +14 -0
  162. package/templates/rust-lib/src/lib.rs +13 -0
  163. package/vendor/.gitkeep +1 -0
@@ -0,0 +1,99 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ export class FileUtils {
4
+ /**
5
+ * Copy directory recursively
6
+ */
7
+ async copyDirectory(sourceDir, destDir) {
8
+ if (!fs.existsSync(destDir)) {
9
+ fs.mkdirSync(destDir, { recursive: true });
10
+ }
11
+ const entries = fs.readdirSync(sourceDir, { withFileTypes: true });
12
+ for (const entry of entries) {
13
+ const sourcePath = path.join(sourceDir, entry.name);
14
+ const destPath = path.join(destDir, entry.name);
15
+ if (entry.isDirectory()) {
16
+ await this.copyDirectory(sourcePath, destPath);
17
+ }
18
+ else {
19
+ fs.copyFileSync(sourcePath, destPath);
20
+ }
21
+ }
22
+ }
23
+ /**
24
+ * Ensure directory exists
25
+ */
26
+ ensureDirectory(dirPath) {
27
+ if (!fs.existsSync(dirPath)) {
28
+ fs.mkdirSync(dirPath, { recursive: true });
29
+ }
30
+ }
31
+ /**
32
+ * Clean directory (remove all contents)
33
+ */
34
+ cleanDirectory(dirPath, excludeDirs = []) {
35
+ if (fs.existsSync(dirPath)) {
36
+ // If no exclusions, remove entire directory
37
+ if (excludeDirs.length === 0) {
38
+ fs.rmSync(dirPath, { recursive: true, force: true });
39
+ this.ensureDirectory(dirPath);
40
+ return;
41
+ }
42
+ // Remove contents except excluded directories
43
+ const entries = fs.readdirSync(dirPath, { withFileTypes: true });
44
+ for (const entry of entries) {
45
+ const entryPath = path.join(dirPath, entry.name);
46
+ if (!excludeDirs.includes(entry.name)) {
47
+ fs.rmSync(entryPath, { recursive: true, force: true });
48
+ }
49
+ }
50
+ }
51
+ else {
52
+ this.ensureDirectory(dirPath);
53
+ }
54
+ }
55
+ /**
56
+ * Get file extension without dot
57
+ */
58
+ getExtension(filePath) {
59
+ return path.extname(filePath).slice(1);
60
+ }
61
+ /**
62
+ * Get base name without extension
63
+ */
64
+ getBaseName(filePath) {
65
+ return path.basename(filePath, path.extname(filePath));
66
+ }
67
+ /**
68
+ * Check if file exists and is readable
69
+ */
70
+ isReadableFile(filePath) {
71
+ try {
72
+ fs.accessSync(filePath, fs.constants.R_OK);
73
+ return fs.statSync(filePath).isFile();
74
+ }
75
+ catch {
76
+ return false;
77
+ }
78
+ }
79
+ /**
80
+ * Read JSON file safely
81
+ */
82
+ readJsonFile(filePath) {
83
+ try {
84
+ const content = fs.readFileSync(filePath, 'utf-8');
85
+ return JSON.parse(content);
86
+ }
87
+ catch {
88
+ return null;
89
+ }
90
+ }
91
+ /**
92
+ * Write JSON file with formatting
93
+ */
94
+ writeJsonFile(filePath, data) {
95
+ const content = JSON.stringify(data, null, 2);
96
+ fs.writeFileSync(filePath, content, 'utf-8');
97
+ }
98
+ }
99
+ //# sourceMappingURL=file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.js","sourceRoot":"","sources":["../../../../src/builder/core/utils/file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Page, PageFiles } from '../../types/index.js';
2
+ /**
3
+ * Get page title from configuration or default
4
+ */
5
+ export declare function getPageTitle(page: Page, pageFiles: PageFiles): string;
6
+ /**
7
+ * Detect page type from file extension
8
+ */
9
+ export declare function detectPageType(filePath: string): 'html' | 'react' | 'vue';
10
+ /**
11
+ * Validate page structure
12
+ */
13
+ export declare function validatePageStructure(page: Page, pageFiles: PageFiles): string[];
14
+ //# sourceMappingURL=page.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.d.ts","sourceRoot":"","sources":["../../../../src/builder/core/utils/page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAK5D;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM,CAWrE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAazE;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM,EAAE,CAYhF"}
@@ -0,0 +1,46 @@
1
+ import { FileUtils } from './file.js';
2
+ const fileUtils = new FileUtils();
3
+ /**
4
+ * Get page title from configuration or default
5
+ */
6
+ export function getPageTitle(page, pageFiles) {
7
+ if (pageFiles.config.exists) {
8
+ const config = fileUtils.readJsonFile(pageFiles.config.path);
9
+ if (config?.navigationBarTitleText) {
10
+ return config.navigationBarTitleText;
11
+ }
12
+ }
13
+ // Fallback to page name
14
+ const pageName = fileUtils.getBaseName(page.path);
15
+ return pageName.charAt(0).toUpperCase() + pageName.slice(1);
16
+ }
17
+ /**
18
+ * Detect page type from file extension
19
+ */
20
+ export function detectPageType(filePath) {
21
+ const ext = fileUtils.getExtension(filePath);
22
+ switch (ext) {
23
+ case 'tsx':
24
+ case 'jsx':
25
+ return 'react';
26
+ case 'vue':
27
+ return 'vue';
28
+ case 'html':
29
+ default:
30
+ return 'html';
31
+ }
32
+ }
33
+ /**
34
+ * Validate page structure
35
+ */
36
+ export function validatePageStructure(page, pageFiles) {
37
+ const errors = [];
38
+ if (!pageFiles.view.exists) {
39
+ errors.push(`View file not found: ${page.path}`);
40
+ }
41
+ if (!pageFiles.config.exists) {
42
+ errors.push(`Configuration file not found for page: ${page.path}`);
43
+ }
44
+ return errors;
45
+ }
46
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page.js","sourceRoot":"","sources":["../../../../src/builder/core/utils/page.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAC;AAElC;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,IAAU,EAAE,SAAoB;IAC3D,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,MAAM,EAAE,sBAAsB,EAAE,CAAC;YACnC,OAAO,MAAM,CAAC,sBAAsB,CAAC;QACvC,CAAC;IACH,CAAC;IAED,wBAAwB;IACxB,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,MAAM,GAAG,GAAG,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAE7C,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,KAAK,CAAC;QACX,KAAK,KAAK;YACR,OAAO,OAAO,CAAC;QACjB,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,MAAM,CAAC;QACZ;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAU,EAAE,SAAoB;IACpE,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,IAAI,CAAC,wBAAwB,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,CAAC,IAAI,CAAC,0CAA0C,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { buildCommand } from './commands/build.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/builder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { buildCommand } from './commands/build.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/builder/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,67 @@
1
+ export interface PageConfig {
2
+ navigationBarTitleText?: string;
3
+ navigationBarBackgroundColor?: string;
4
+ navigationBarTextStyle?: 'black' | 'white';
5
+ backgroundColor?: string;
6
+ enablePullDownRefresh?: boolean;
7
+ onReachBottomDistance?: number;
8
+ }
9
+ export interface PageFiles {
10
+ view: {
11
+ path: string;
12
+ exists: boolean;
13
+ type: 'html' | 'react' | 'vue';
14
+ };
15
+ logic: {
16
+ path: string;
17
+ exists: boolean;
18
+ };
19
+ config: {
20
+ path: string;
21
+ exists: boolean;
22
+ data?: PageConfig;
23
+ };
24
+ style: {
25
+ path: string;
26
+ exists: boolean;
27
+ };
28
+ }
29
+ export interface Page {
30
+ path: string;
31
+ name: string;
32
+ type: 'html' | 'react' | 'vue';
33
+ }
34
+ export interface BuildOptions {
35
+ dev?: boolean;
36
+ prod?: boolean;
37
+ plugin?: boolean;
38
+ target?: string;
39
+ }
40
+ export interface LxPluginConfig {
41
+ lxPluginId: string;
42
+ version: string;
43
+ main?: string;
44
+ pages: Record<string, string>;
45
+ }
46
+ export interface BuildResult {
47
+ distDir: string;
48
+ success: boolean;
49
+ error?: string;
50
+ }
51
+ export interface DependencyConfig {
52
+ react: {
53
+ dependencies: Record<string, string>;
54
+ devDependencies: Record<string, string>;
55
+ };
56
+ vue: {
57
+ dependencies: Record<string, string>;
58
+ devDependencies: Record<string, string>;
59
+ };
60
+ }
61
+ export interface ProjectStructure {
62
+ projectPath: string;
63
+ outputDir: string;
64
+ pages: Page[];
65
+ hasLogicLayer: boolean;
66
+ }
67
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/builder/types/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,sBAAsB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;QAChB,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;KAChC,CAAC;IACF,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;IACF,MAAM,EAAE;QACN,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;QAChB,IAAI,CAAC,EAAE,UAAU,CAAC;KACnB,CAAC;IACF,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,OAAO,CAAC;KACjB,CAAC;CACH;AAED,MAAM,WAAW,IAAI;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE;QACL,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACzC,CAAC;IACF,GAAG,EAAE;QACH,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACrC,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACzC,CAAC;CACH;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,aAAa,EAAE,OAAO,CAAC;CACxB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/builder/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ type Framework = 'react' | 'vue';
2
+ type CreateOptions = {
3
+ framework?: Framework;
4
+ };
5
+ export declare function createCommand(projectNameArg?: string, options?: CreateOptions): Promise<void>;
6
+ export {};
7
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAMA,KAAK,SAAS,GAAG,OAAO,GAAG,KAAK,CAAC;AAEjC,KAAK,aAAa,GAAG;IACnB,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,CAAC;AAoBF,wBAAsB,aAAa,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBvG"}
@@ -0,0 +1,151 @@
1
+ import path from 'path';
2
+ import { fileURLToPath } from 'url';
3
+ import { existsSync, promises as fs } from 'fs';
4
+ import { createInterface } from 'readline/promises';
5
+ import { stdin as input, stdout as output } from 'process';
6
+ const TEMPLATE_ROOT = resolveTemplateRoot();
7
+ function resolveTemplateRoot() {
8
+ // From npm/dist/commands/create.js → ../../templates/lxapp-create
9
+ // Dev fallback → ../../../templates/lxapp-create (repo root templates)
10
+ const candidates = [
11
+ new URL('../../templates/lxapp-create', import.meta.url),
12
+ new URL('../../../templates/lxapp-create', import.meta.url),
13
+ ];
14
+ for (const candidate of candidates) {
15
+ const resolved = fileURLToPath(candidate);
16
+ if (existsSync(resolved))
17
+ return resolved;
18
+ }
19
+ return fileURLToPath(candidates[0]);
20
+ }
21
+ export async function createCommand(projectNameArg, options = {}) {
22
+ const prompts = new PromptManager();
23
+ try {
24
+ const projectName = await resolveProjectName(projectNameArg, prompts);
25
+ const framework = await resolveFramework(options.framework, prompts);
26
+ const targetDir = path.resolve(process.cwd(), projectName);
27
+ await ensureTargetDirectory(targetDir);
28
+ const templateDir = path.join(TEMPLATE_ROOT, framework);
29
+ await copyTemplate(templateDir, targetDir);
30
+ await applyPlaceholders(targetDir, projectName);
31
+ await recordFrameworkMetadata(targetDir, framework);
32
+ console.log('\n✅ Project scaffolded!');
33
+ console.log(`\nNext steps:`);
34
+ console.log(` cd ${path.relative(process.cwd(), targetDir) || '.'}`);
35
+ console.log(` npm install`);
36
+ console.log(` npm run dev # or npm run build`);
37
+ }
38
+ finally {
39
+ prompts.dispose();
40
+ }
41
+ }
42
+ async function resolveProjectName(projectNameArg, prompts) {
43
+ const defaultName = 'lingxia-app';
44
+ if (projectNameArg && projectNameArg.trim().length > 0) {
45
+ return projectNameArg.trim();
46
+ }
47
+ return prompts.input(`Project name (${defaultName}): `, defaultName);
48
+ }
49
+ async function resolveFramework(current, prompts) {
50
+ if (current === 'react' || current === 'vue') {
51
+ return current;
52
+ }
53
+ const answer = await prompts.select('Choose framework', ['react', 'vue']);
54
+ return answer;
55
+ }
56
+ async function ensureTargetDirectory(targetDir) {
57
+ if (existsSync(targetDir)) {
58
+ const entries = await fs.readdir(targetDir);
59
+ if (entries.length > 0) {
60
+ throw new Error(`Target directory "${targetDir}" is not empty. Please choose a different name or empty the folder.`);
61
+ }
62
+ return;
63
+ }
64
+ await fs.mkdir(targetDir, { recursive: true });
65
+ }
66
+ async function copyTemplate(templateDir, targetDir) {
67
+ await fs.cp(templateDir, targetDir, { recursive: true });
68
+ }
69
+ async function applyPlaceholders(targetDir, projectName) {
70
+ const pkgPath = path.join(targetDir, 'package.json');
71
+ const appPath = path.join(targetDir, 'lxapp.json');
72
+ const packageName = slugify(projectName);
73
+ const appId = packageName;
74
+ const displayName = titleCase(projectName);
75
+ const replacements = {
76
+ __APP_PACKAGE_NAME__: packageName,
77
+ __APP_ID__: appId,
78
+ __APP_DISPLAY_NAME__: displayName
79
+ };
80
+ await replacePlaceholders(pkgPath, replacements);
81
+ await replacePlaceholders(appPath, replacements);
82
+ }
83
+ async function recordFrameworkMetadata(targetDir, framework) {
84
+ const pkgPath = path.join(targetDir, 'package.json');
85
+ if (!existsSync(pkgPath))
86
+ return;
87
+ const pkg = JSON.parse(await fs.readFile(pkgPath, 'utf8'));
88
+ pkg.lingxia = { ...(pkg.lingxia ?? {}), framework };
89
+ await fs.writeFile(pkgPath, JSON.stringify(pkg, null, 2));
90
+ }
91
+ async function replacePlaceholders(filePath, replacements) {
92
+ if (!existsSync(filePath))
93
+ return;
94
+ let content = await fs.readFile(filePath, 'utf8');
95
+ for (const [token, value] of Object.entries(replacements)) {
96
+ content = content.replace(new RegExp(token, 'g'), value);
97
+ }
98
+ await fs.writeFile(filePath, content);
99
+ }
100
+ class PromptManager {
101
+ rl = null;
102
+ ensureInterface() {
103
+ if (!this.rl) {
104
+ this.rl = createInterface({ input, output });
105
+ }
106
+ return this.rl;
107
+ }
108
+ async input(message, fallback) {
109
+ const answer = await this.ensureInterface().question(message);
110
+ return answer.trim().length > 0 ? answer.trim() : fallback;
111
+ }
112
+ async select(message, options) {
113
+ const formatted = options.map((option, index) => `${index + 1}) ${option}`).join('\n');
114
+ const prompt = `${message}:\n${formatted}\nEnter choice: `;
115
+ const answer = await this.ensureInterface().question(prompt);
116
+ const index = Number.parseInt(answer, 10);
117
+ if (!Number.isNaN(index) && index >= 1 && index <= options.length) {
118
+ return options[index - 1];
119
+ }
120
+ return options[0];
121
+ }
122
+ async confirm(message, defaultValue) {
123
+ const suffix = defaultValue ? 'Y/n' : 'y/N';
124
+ const answer = (await this.ensureInterface().question(message || `Confirm (${suffix}): `)).trim().toLowerCase();
125
+ if (answer === '') {
126
+ return defaultValue;
127
+ }
128
+ return ['y', 'yes'].includes(answer);
129
+ }
130
+ dispose() {
131
+ this.rl?.close();
132
+ this.rl = null;
133
+ }
134
+ }
135
+ function slugify(value) {
136
+ const slug = value
137
+ .trim()
138
+ .toLowerCase()
139
+ .replace(/[^a-z0-9]+/g, '-')
140
+ .replace(/^-+|-+$/g, '');
141
+ return slug.length > 0 ? slug : 'lingxia-app';
142
+ }
143
+ function titleCase(value) {
144
+ return value
145
+ .trim()
146
+ .split(/[\s\-_.]+/)
147
+ .filter(Boolean)
148
+ .map(word => word.charAt(0).toUpperCase() + word.slice(1))
149
+ .join(' ') || 'LingXia App';
150
+ }
151
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runCLI(argv?: string[]): Promise<void>;
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,wBAAsB,MAAM,CAAC,IAAI,WAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA4B/D"}
package/dist/index.js ADDED
@@ -0,0 +1,45 @@
1
+ import { Command } from 'commander';
2
+ import { createRequire } from 'module';
3
+ import { buildCommand } from './builder/index.js';
4
+ import { createCommand } from './commands/create.js';
5
+ import { fileURLToPath, pathToFileURL } from 'url';
6
+ import path from 'path';
7
+ const { version } = createRequire(import.meta.url)('../package.json');
8
+ export async function runCLI(argv = process.argv) {
9
+ const program = new Command();
10
+ program
11
+ .name('lingxia')
12
+ .description('LingXia LxApp build tools')
13
+ .version(version ?? '0.0.0');
14
+ program
15
+ .command('build')
16
+ .description('Build LingXia project or plugin')
17
+ .option('-d, --dev', 'Development build')
18
+ .option('-p, --prod', 'Production build')
19
+ .option('--plugin', 'Build as plugin package')
20
+ .option('--target <target>', 'JS target (es5, es2015, es2020, esnext). Note: es5 requires @vitejs/plugin-legacy')
21
+ .action(buildCommand);
22
+ program
23
+ .command('create')
24
+ .argument('[projectName]', 'Directory name for the new project')
25
+ .description('Create a new LingXia project from a template')
26
+ .option('-f, --framework <framework>', 'Pick a framework (react|vue)')
27
+ .action((projectName, cmdOptions) => createCommand(projectName, {
28
+ framework: cmdOptions.framework
29
+ }));
30
+ await program.parseAsync(argv);
31
+ }
32
+ const isMain = (() => {
33
+ if (!process.argv[1])
34
+ return false;
35
+ const mainPath = path.resolve(process.argv[1]);
36
+ const modulePath = fileURLToPath(import.meta.url);
37
+ return mainPath === modulePath || pathToFileURL(mainPath).href === import.meta.url;
38
+ })();
39
+ if (isMain) {
40
+ runCLI().catch((err) => {
41
+ console.error(err instanceof Error ? err.message : String(err));
42
+ process.exit(1);
43
+ });
44
+ }
45
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACnD,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC;AAEtE,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI;IAC9C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO;SACJ,IAAI,CAAC,SAAS,CAAC;SACf,WAAW,CAAC,2BAA2B,CAAC;SACxC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,CAAC;IAE/B,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,iCAAiC,CAAC;SAC9C,MAAM,CAAC,WAAW,EAAE,mBAAmB,CAAC;SACxC,MAAM,CAAC,YAAY,EAAE,kBAAkB,CAAC;SACxC,MAAM,CAAC,UAAU,EAAE,yBAAyB,CAAC;SAC7C,MAAM,CAAC,mBAAmB,EAAE,mFAAmF,CAAC;SAChH,MAAM,CAAC,YAAY,CAAC,CAAC;IAExB,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,QAAQ,CAAC,eAAe,EAAE,oCAAoC,CAAC;SAC/D,WAAW,CAAC,8CAA8C,CAAC;SAC3D,MAAM,CAAC,6BAA6B,EAAE,8BAA8B,CAAC;SACrE,MAAM,CAAC,CAAC,WAA+B,EAAE,UAAkC,EAAE,EAAE,CAC9E,aAAa,CAAC,WAAW,EAAE;QACzB,SAAS,EAAE,UAAU,CAAC,SAAgB;KACvC,CAAC,CACH,CAAC;IAEJ,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE;IACnB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClD,OAAO,QAAQ,KAAK,UAAU,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;AACrF,CAAC,CAAC,EAAE,CAAC;AAEL,IAAI,MAAM,EAAE,CAAC;IACX,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACrB,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@lingxia/cli",
3
+ "version": "0.0.7",
4
+ "private": false,
5
+ "description": "LingXia CLI for scaffolding, building, and packaging mini-apps with LingXia templates and builders.",
6
+ "type": "module",
7
+ "bin": {
8
+ "lingxia": "bin/lingxia.js"
9
+ },
10
+ "files": [
11
+ "bin/",
12
+ "dist/",
13
+ "scripts/",
14
+ "templates/",
15
+ "vendor/",
16
+ "README.md"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "dev": "tsc --watch",
21
+ "clean": "rm -rf dist",
22
+ "test": "vitest run",
23
+ "postinstall": "node scripts/install.cjs",
24
+ "prepack": "node scripts/sync-templates.cjs && node scripts/ensure-deps.cjs && npm run build"
25
+ },
26
+ "dependencies": {
27
+ "@babel/generator": "^7.28.5",
28
+ "@babel/parser": "^7.28.5",
29
+ "@vitejs/plugin-react": "^4.6.0",
30
+ "@vitejs/plugin-vue": "^5.2.1",
31
+ "cheerio": "^1.1.2",
32
+ "commander": "^14.0.1",
33
+ "fast-glob": "^3.3.2",
34
+ "typescript": "^5.0.0",
35
+ "vite": "^6.0.7"
36
+ },
37
+ "optionalDependencies": {
38
+ "@lingxia/cli-darwin-arm64": "0.0.7",
39
+ "@lingxia/cli-darwin-x64": "0.0.7",
40
+ "@lingxia/cli-win32-x64": "0.0.7"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^20.19.7",
44
+ "vitest": "^4.0.7"
45
+ },
46
+ "engines": {
47
+ "node": ">=18.0.0"
48
+ }
49
+ }
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+
4
+ const fs = require("node:fs");
5
+ const path = require("node:path");
6
+ const { spawnSync } = require("node:child_process");
7
+
8
+ function hasDependency(pkgRoot, name) {
9
+ return fs.existsSync(path.join(pkgRoot, "node_modules", name));
10
+ }
11
+
12
+ function runNpmCi(pkgRoot) {
13
+ const nodeExec = process.env.npm_node_execpath || process.execPath;
14
+ const npmExecPath = process.env.npm_execpath;
15
+
16
+ let result;
17
+ if (npmExecPath) {
18
+ result = spawnSync(nodeExec, [npmExecPath, "ci"], {
19
+ cwd: pkgRoot,
20
+ stdio: "inherit",
21
+ env: process.env,
22
+ });
23
+ } else {
24
+ const npmCmd = process.platform === "win32" ? "npm.cmd" : "npm";
25
+ result = spawnSync(npmCmd, ["ci"], {
26
+ cwd: pkgRoot,
27
+ stdio: "inherit",
28
+ env: process.env,
29
+ });
30
+ }
31
+
32
+ if (result.status !== 0) {
33
+ throw new Error("Failed to install dependencies (npm ci)");
34
+ }
35
+ }
36
+
37
+ function main() {
38
+ const pkgRoot = path.resolve(__dirname, "..");
39
+ const needTypescript = !hasDependency(pkgRoot, "typescript");
40
+ const needNodeTypes = !hasDependency(pkgRoot, "@types/node");
41
+
42
+ if (!needTypescript && !needNodeTypes) return;
43
+
44
+ console.log("@lingxia/cli: dependencies missing, running npm ci...");
45
+ runNpmCi(pkgRoot);
46
+ }
47
+
48
+ try {
49
+ main();
50
+ } catch (err) {
51
+ const message = err && typeof err === "object" && "message" in err ? err.message : String(err);
52
+ console.error(`\n@lingxia/cli: ensure deps failed: ${message}\n`);
53
+ process.exit(1);
54
+ }