@jetstart/core 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. package/.eslintrc.json +6 -0
  2. package/README.md +124 -0
  3. package/dist/build/builder.d.ts +57 -0
  4. package/dist/build/builder.d.ts.map +1 -0
  5. package/dist/build/builder.js +151 -0
  6. package/dist/build/builder.js.map +1 -0
  7. package/dist/build/cache.d.ts +51 -0
  8. package/dist/build/cache.d.ts.map +1 -0
  9. package/dist/build/cache.js +152 -0
  10. package/dist/build/cache.js.map +1 -0
  11. package/dist/build/dsl-parser.d.ts +54 -0
  12. package/dist/build/dsl-parser.d.ts.map +1 -0
  13. package/dist/build/dsl-parser.js +373 -0
  14. package/dist/build/dsl-parser.js.map +1 -0
  15. package/dist/build/dsl-types.d.ts +47 -0
  16. package/dist/build/dsl-types.d.ts.map +1 -0
  17. package/dist/build/dsl-types.js +7 -0
  18. package/dist/build/dsl-types.js.map +1 -0
  19. package/dist/build/gradle-injector.d.ts +14 -0
  20. package/dist/build/gradle-injector.d.ts.map +1 -0
  21. package/dist/build/gradle-injector.js +77 -0
  22. package/dist/build/gradle-injector.js.map +1 -0
  23. package/dist/build/gradle.d.ts +43 -0
  24. package/dist/build/gradle.d.ts.map +1 -0
  25. package/dist/build/gradle.js +281 -0
  26. package/dist/build/gradle.js.map +1 -0
  27. package/dist/build/index.d.ts +10 -0
  28. package/dist/build/index.d.ts.map +1 -0
  29. package/dist/build/index.js +26 -0
  30. package/dist/build/index.js.map +1 -0
  31. package/dist/build/parser.d.ts +12 -0
  32. package/dist/build/parser.d.ts.map +1 -0
  33. package/dist/build/parser.js +71 -0
  34. package/dist/build/parser.js.map +1 -0
  35. package/dist/build/watcher.d.ts +30 -0
  36. package/dist/build/watcher.d.ts.map +1 -0
  37. package/dist/build/watcher.js +120 -0
  38. package/dist/build/watcher.js.map +1 -0
  39. package/dist/index.d.ts +11 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +26 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/server/http.d.ts +12 -0
  44. package/dist/server/http.d.ts.map +1 -0
  45. package/dist/server/http.js +32 -0
  46. package/dist/server/http.js.map +1 -0
  47. package/dist/server/index.d.ts +35 -0
  48. package/dist/server/index.d.ts.map +1 -0
  49. package/dist/server/index.js +262 -0
  50. package/dist/server/index.js.map +1 -0
  51. package/dist/server/middleware.d.ts +7 -0
  52. package/dist/server/middleware.d.ts.map +1 -0
  53. package/dist/server/middleware.js +42 -0
  54. package/dist/server/middleware.js.map +1 -0
  55. package/dist/server/routes.d.ts +7 -0
  56. package/dist/server/routes.d.ts.map +1 -0
  57. package/dist/server/routes.js +104 -0
  58. package/dist/server/routes.js.map +1 -0
  59. package/dist/types/index.d.ts +20 -0
  60. package/dist/types/index.d.ts.map +1 -0
  61. package/dist/types/index.js +6 -0
  62. package/dist/types/index.js.map +1 -0
  63. package/dist/utils/index.d.ts +7 -0
  64. package/dist/utils/index.d.ts.map +1 -0
  65. package/dist/utils/index.js +23 -0
  66. package/dist/utils/index.js.map +1 -0
  67. package/dist/utils/logger.d.ts +10 -0
  68. package/dist/utils/logger.d.ts.map +1 -0
  69. package/dist/utils/logger.js +33 -0
  70. package/dist/utils/logger.js.map +1 -0
  71. package/dist/utils/qr.d.ts +8 -0
  72. package/dist/utils/qr.d.ts.map +1 -0
  73. package/dist/utils/qr.js +48 -0
  74. package/dist/utils/qr.js.map +1 -0
  75. package/dist/utils/session.d.ts +18 -0
  76. package/dist/utils/session.d.ts.map +1 -0
  77. package/dist/utils/session.js +49 -0
  78. package/dist/utils/session.js.map +1 -0
  79. package/dist/websocket/handler.d.ts +25 -0
  80. package/dist/websocket/handler.d.ts.map +1 -0
  81. package/dist/websocket/handler.js +126 -0
  82. package/dist/websocket/handler.js.map +1 -0
  83. package/dist/websocket/index.d.ts +18 -0
  84. package/dist/websocket/index.d.ts.map +1 -0
  85. package/dist/websocket/index.js +40 -0
  86. package/dist/websocket/index.js.map +1 -0
  87. package/dist/websocket/manager.d.ts +16 -0
  88. package/dist/websocket/manager.d.ts.map +1 -0
  89. package/dist/websocket/manager.js +58 -0
  90. package/dist/websocket/manager.js.map +1 -0
  91. package/package.json +78 -0
  92. package/src/build/builder.ts +192 -0
  93. package/src/build/cache.ts +144 -0
  94. package/src/build/dsl-parser.ts +382 -0
  95. package/src/build/dsl-types.ts +50 -0
  96. package/src/build/gradle-injector.ts +64 -0
  97. package/src/build/gradle.ts +305 -0
  98. package/src/build/index.ts +10 -0
  99. package/src/build/parser.ts +75 -0
  100. package/src/build/watcher.ts +103 -0
  101. package/src/index.ts +20 -0
  102. package/src/server/http.ts +38 -0
  103. package/src/server/index.ts +272 -0
  104. package/src/server/middleware.ts +43 -0
  105. package/src/server/routes.ts +116 -0
  106. package/src/types/index.ts +21 -0
  107. package/src/utils/index.ts +7 -0
  108. package/src/utils/logger.ts +28 -0
  109. package/src/utils/qr.ts +46 -0
  110. package/src/utils/session.ts +58 -0
  111. package/src/websocket/handler.ts +150 -0
  112. package/src/websocket/index.ts +56 -0
  113. package/src/websocket/manager.ts +63 -0
  114. package/tests/build.test.ts +13 -0
  115. package/tests/server.test.ts +13 -0
  116. package/tsconfig.json +25 -0
package/.eslintrc.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "extends": "../../.eslintrc.json",
3
+ "parserOptions": {
4
+ "project": ["./tsconfig.json", "./tsconfig.tests.json"]
5
+ }
6
+ }
package/README.md ADDED
@@ -0,0 +1,124 @@
1
+ # @jetstart/core
2
+
3
+ Core build server and orchestration for JetStart.
4
+
5
+ ## Overview
6
+
7
+ The Core package is the central hub of JetStart, responsible for:
8
+
9
+ - 🏗️ **Build Management** - Compiling Kotlin/Compose projects
10
+ - 🌐 **HTTP Server** - Serving APKs and REST API
11
+ - 🔌 **WebSocket Server** - Real-time communication with clients
12
+ - 📦 **Build Caching** - Faster incremental builds
13
+ - 👀 **File Watching** - Auto-rebuild on changes
14
+ - 🔐 **Session Management** - Secure device pairing
15
+
16
+ ## Usage
17
+
18
+ ### As a Library
19
+ ```typescript
20
+ import { JetStartServer } from '@jetstart/core';
21
+
22
+ const server = new JetStartServer({
23
+ httpPort: 8765,
24
+ wsPort: 8766,
25
+ host: '0.0.0.0',
26
+ });
27
+
28
+ await server.start();
29
+ ```
30
+
31
+ ### As a Standalone Server
32
+ ```bash
33
+ npm run start
34
+ ```
35
+
36
+ ## API Endpoints
37
+
38
+ ### HTTP REST API
39
+
40
+ **Health Check**
41
+ ```
42
+ GET /health
43
+ Response: { status: 'ok', version: '0.1.0', uptime: 123 }
44
+ ```
45
+
46
+ **Create Session**
47
+ ```
48
+ POST /session/create
49
+ Body: { projectName: 'MyApp', projectPath: '/path/to/project' }
50
+ Response: { session: {...}, qrCode: 'data:image/png;base64,...' }
51
+ ```
52
+
53
+ **Get Session**
54
+ ```
55
+ GET /session/:sessionId
56
+ Response: { id, token, projectName, ... }
57
+ ```
58
+
59
+ **Download APK**
60
+ ```
61
+ GET /download/:sessionId/:filename
62
+ Response: APK file download
63
+ ```
64
+
65
+ ### WebSocket Messages
66
+
67
+ **Client → Core:**
68
+ - `client:connect` - Initial connection with session
69
+ - `client:status` - Status update
70
+ - `client:log` - Log message
71
+ - `client:heartbeat` - Keep-alive ping
72
+
73
+ **Core → Client:**
74
+ - `core:connected` - Connection confirmed
75
+ - `core:build-start` - Build started
76
+ - `core:build-status` - Build progress update
77
+ - `core:build-complete` - Build finished
78
+ - `core:build-error` - Build failed
79
+ - `core:reload` - Trigger app reload
80
+
81
+ ## Build System
82
+ ```typescript
83
+ import { BuildManager } from '@jetstart/core';
84
+
85
+ const buildManager = new BuildManager();
86
+
87
+ const result = await buildManager.build({
88
+ projectPath: '/path/to/project',
89
+ outputPath: './build',
90
+ buildType: 'debug',
91
+ debuggable: true,
92
+ minifyEnabled: false,
93
+ versionCode: 1,
94
+ versionName: '1.0.0',
95
+ applicationId: 'com.example.app',
96
+ });
97
+
98
+ console.log(result.success, result.apkPath);
99
+ ```
100
+
101
+ ## File Watching
102
+ ```typescript
103
+ import { FileWatcher } from '@jetstart/core';
104
+
105
+ const watcher = new FileWatcher('/path/to/project');
106
+
107
+ watcher.start(() => {
108
+ console.log('Files changed, rebuilding...');
109
+ });
110
+
111
+ // Later
112
+ watcher.stop();
113
+ ```
114
+
115
+ ## Environment Variables
116
+
117
+ - `PORT` - HTTP server port (default: 8765)
118
+ - `WS_PORT` - WebSocket server port (default: 8766)
119
+ - `HOST` - Server host (default: 0.0.0.0)
120
+ - `DEBUG` - Enable debug logging
121
+
122
+ ## License
123
+
124
+ Apache-2.0
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Build Service
3
+ * Main orchestrator for build operations, caching, and file watching
4
+ */
5
+ import { BuildConfig, BuildResult, BuildStatus } from '@jetstart/shared';
6
+ import { EventEmitter } from 'events';
7
+ export interface BuildServiceOptions {
8
+ cacheEnabled?: boolean;
9
+ cachePath?: string;
10
+ watchEnabled?: boolean;
11
+ javaHome?: string;
12
+ androidHome?: string;
13
+ }
14
+ export interface BuildServiceEvents {
15
+ 'build:start': () => void;
16
+ 'build:progress': (status: BuildStatus) => void;
17
+ 'build:complete': (result: BuildResult) => void;
18
+ 'build:error': (error: string, details?: any) => void;
19
+ 'watch:change': (files: string[]) => void;
20
+ }
21
+ export declare interface BuildService {
22
+ on<K extends keyof BuildServiceEvents>(event: K, listener: BuildServiceEvents[K]): this;
23
+ emit<K extends keyof BuildServiceEvents>(event: K, ...args: Parameters<BuildServiceEvents[K]>): boolean;
24
+ }
25
+ export declare class BuildService extends EventEmitter {
26
+ private gradle;
27
+ private cache;
28
+ private watcher;
29
+ private watchEnabled;
30
+ private isBuilding;
31
+ constructor(options?: BuildServiceOptions);
32
+ /**
33
+ * Build project
34
+ */
35
+ build(config: BuildConfig): Promise<BuildResult>;
36
+ /**
37
+ * Start watching for file changes
38
+ */
39
+ startWatching(projectPath: string, callback: (files: string[]) => void): void;
40
+ /**
41
+ * Stop watching for file changes
42
+ */
43
+ stopWatching(): void;
44
+ /**
45
+ * Clear build cache
46
+ */
47
+ clearCache(): void;
48
+ /**
49
+ * Check if currently building
50
+ */
51
+ isBuildInProgress(): boolean;
52
+ /**
53
+ * Emit build progress
54
+ */
55
+ private emitProgress;
56
+ }
57
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../src/build/builder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAc,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAIrF,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,gBAAgB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAChD,gBAAgB,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,IAAI,CAAC;IAChD,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;IACtD,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC3C;AAED,MAAM,CAAC,OAAO,WAAW,YAAY;IACnC,EAAE,CAAC,CAAC,SAAS,MAAM,kBAAkB,EACnC,KAAK,EAAE,CAAC,EACR,QAAQ,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC9B,IAAI,CAAC;IACR,IAAI,CAAC,CAAC,SAAS,MAAM,kBAAkB,EACrC,KAAK,EAAE,CAAC,EACR,GAAG,IAAI,EAAE,UAAU,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GACzC,OAAO,CAAC;CACZ;AAED,qBAAa,YAAa,SAAQ,YAAY;IAC5C,OAAO,CAAC,MAAM,CAAiB;IAC/B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,UAAU,CAAkB;gBAExB,OAAO,GAAE,mBAAwB;IAoB7C;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IAgEtD;;OAEG;IACH,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,GAAG,IAAI;IAoB7E;;OAEG;IACH,YAAY,IAAI,IAAI;IAOpB;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,iBAAiB,IAAI,OAAO;IAI5B;;OAEG;IACH,OAAO,CAAC,YAAY;CASrB"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ /**
3
+ * Build Service
4
+ * Main orchestrator for build operations, caching, and file watching
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.BuildService = void 0;
8
+ const shared_1 = require("@jetstart/shared");
9
+ const gradle_1 = require("./gradle");
10
+ const cache_1 = require("./cache");
11
+ const watcher_1 = require("./watcher");
12
+ const events_1 = require("events");
13
+ class BuildService extends events_1.EventEmitter {
14
+ gradle;
15
+ cache;
16
+ watcher = null;
17
+ watchEnabled;
18
+ isBuilding = false;
19
+ constructor(options = {}) {
20
+ super();
21
+ // Initialize Gradle executor
22
+ const gradleOptions = {
23
+ javaHome: options.javaHome,
24
+ androidHome: options.androidHome,
25
+ };
26
+ this.gradle = new gradle_1.GradleExecutor(gradleOptions);
27
+ // Initialize cache
28
+ const cacheOptions = {
29
+ enabled: options.cacheEnabled ?? true,
30
+ cachePath: options.cachePath || require('os').tmpdir() + '/jetstart-cache',
31
+ };
32
+ this.cache = new cache_1.BuildCache(cacheOptions);
33
+ this.watchEnabled = options.watchEnabled ?? true;
34
+ }
35
+ /**
36
+ * Build project
37
+ */
38
+ async build(config) {
39
+ if (this.isBuilding) {
40
+ return {
41
+ success: false,
42
+ buildTime: 0,
43
+ errors: [{
44
+ file: '',
45
+ line: 0,
46
+ column: 0,
47
+ message: 'Build already in progress',
48
+ severity: 'error',
49
+ }],
50
+ };
51
+ }
52
+ this.isBuilding = true;
53
+ try {
54
+ // Check cache
55
+ const cached = this.cache.get(config);
56
+ if (cached) {
57
+ this.emit('build:complete', cached.result);
58
+ return cached.result;
59
+ }
60
+ // Emit build start
61
+ this.emit('build:start');
62
+ this.emitProgress(shared_1.BuildPhase.INITIALIZING, 0, 'Initializing build...');
63
+ // Execute Gradle build
64
+ this.emitProgress(shared_1.BuildPhase.COMPILING, 20, 'Compiling Kotlin sources...');
65
+ const result = await this.gradle.execute(config);
66
+ // Cache successful builds
67
+ if (result.success) {
68
+ this.cache.set(config, result);
69
+ this.emitProgress(shared_1.BuildPhase.COMPLETE, 100, 'Build complete');
70
+ this.emit('build:complete', result);
71
+ }
72
+ else {
73
+ this.emitProgress(shared_1.BuildPhase.FAILED, 0, 'Build failed');
74
+ this.emit('build:error', 'Build failed', result.errors);
75
+ }
76
+ return result;
77
+ }
78
+ catch (err) {
79
+ const errorResult = {
80
+ success: false,
81
+ buildTime: 0,
82
+ errors: [{
83
+ file: '',
84
+ line: 0,
85
+ column: 0,
86
+ message: err.message || 'Unknown build error',
87
+ severity: 'error',
88
+ }],
89
+ };
90
+ this.emit('build:error', err.message, err);
91
+ return errorResult;
92
+ }
93
+ finally {
94
+ this.isBuilding = false;
95
+ }
96
+ }
97
+ /**
98
+ * Start watching for file changes
99
+ */
100
+ startWatching(projectPath, callback) {
101
+ if (!this.watchEnabled) {
102
+ return;
103
+ }
104
+ if (this.watcher) {
105
+ this.stopWatching();
106
+ }
107
+ this.watcher = new watcher_1.FileWatcher({
108
+ projectPath,
109
+ callback: (files) => {
110
+ this.emit('watch:change', files);
111
+ callback(files);
112
+ },
113
+ });
114
+ this.watcher.watch(projectPath);
115
+ }
116
+ /**
117
+ * Stop watching for file changes
118
+ */
119
+ stopWatching() {
120
+ if (this.watcher) {
121
+ this.watcher.stop();
122
+ this.watcher = null;
123
+ }
124
+ }
125
+ /**
126
+ * Clear build cache
127
+ */
128
+ clearCache() {
129
+ this.cache.clear();
130
+ }
131
+ /**
132
+ * Check if currently building
133
+ */
134
+ isBuildInProgress() {
135
+ return this.isBuilding;
136
+ }
137
+ /**
138
+ * Emit build progress
139
+ */
140
+ emitProgress(phase, progress, message) {
141
+ const status = {
142
+ phase,
143
+ progress,
144
+ message,
145
+ timestamp: Date.now(),
146
+ };
147
+ this.emit('build:progress', status);
148
+ }
149
+ }
150
+ exports.BuildService = BuildService;
151
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../src/build/builder.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,6CAAqF;AACrF,qCAAiE;AACjE,mCAAwD;AACxD,uCAAwC;AACxC,mCAAsC;AA6BtC,MAAa,YAAa,SAAQ,qBAAY;IACpC,MAAM,CAAiB;IACvB,KAAK,CAAa;IAClB,OAAO,GAAuB,IAAI,CAAC;IACnC,YAAY,CAAU;IACtB,UAAU,GAAY,KAAK,CAAC;IAEpC,YAAY,UAA+B,EAAE;QAC3C,KAAK,EAAE,CAAC;QAER,6BAA6B;QAC7B,MAAM,aAAa,GAA0B;YAC3C,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,WAAW,EAAE,OAAO,CAAC,WAAW;SACjC,CAAC;QACF,IAAI,CAAC,MAAM,GAAG,IAAI,uBAAc,CAAC,aAAa,CAAC,CAAC;QAEhD,mBAAmB;QACnB,MAAM,YAAY,GAAsB;YACtC,OAAO,EAAE,OAAO,CAAC,YAAY,IAAI,IAAI;YACrC,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,GAAG,iBAAiB;SAC3E,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,IAAI,kBAAU,CAAC,YAAY,CAAC,CAAC;QAE1C,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,MAAmB;QAC7B,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,CAAC;gBACZ,MAAM,EAAE,CAAC;wBACP,IAAI,EAAE,EAAE;wBACR,IAAI,EAAE,CAAC;wBACP,MAAM,EAAE,CAAC;wBACT,OAAO,EAAE,2BAA2B;wBACpC,QAAQ,EAAE,OAAc;qBACzB,CAAC;aACH,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QAEvB,IAAI,CAAC;YACH,cAAc;YACd,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACtC,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC3C,OAAO,MAAM,CAAC,MAAM,CAAC;YACvB,CAAC;YAED,mBAAmB;YACnB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACzB,IAAI,CAAC,YAAY,CAAC,mBAAU,CAAC,YAAY,EAAE,CAAC,EAAE,uBAAuB,CAAC,CAAC;YAEvE,uBAAuB;YACvB,IAAI,CAAC,YAAY,CAAC,mBAAU,CAAC,SAAS,EAAE,EAAE,EAAE,6BAA6B,CAAC,CAAC;YAC3E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEjD,0BAA0B;YAC1B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAC/B,IAAI,CAAC,YAAY,CAAC,mBAAU,CAAC,QAAQ,EAAE,GAAG,EAAE,gBAAgB,CAAC,CAAC;gBAC9D,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;YACtC,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,YAAY,CAAC,mBAAU,CAAC,MAAM,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;gBACxD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC1D,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,MAAM,WAAW,GAAgB;gBAC/B,OAAO,EAAE,KAAK;gBACd,SAAS,EAAE,CAAC;gBACZ,MAAM,EAAE,CAAC;wBACP,IAAI,EAAE,EAAE;wBACR,IAAI,EAAE,CAAC;wBACP,MAAM,EAAE,CAAC;wBACT,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,qBAAqB;wBAC7C,QAAQ,EAAE,OAAc;qBACzB,CAAC;aACH,CAAC;YAEF,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YAC3C,OAAO,WAAW,CAAC;QACrB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAED;;OAEG;IACH,aAAa,CAAC,WAAmB,EAAE,QAAmC;QACpE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,YAAY,EAAE,CAAC;QACtB,CAAC;QAED,IAAI,CAAC,OAAO,GAAG,IAAI,qBAAW,CAAC;YAC7B,WAAW;YACX,QAAQ,EAAE,CAAC,KAAe,EAAE,EAAE;gBAC5B,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;gBACjC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,YAAY;QACV,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACtB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,KAAiB,EAAE,QAAgB,EAAE,OAAe;QACvE,MAAM,MAAM,GAAgB;YAC1B,KAAK;YACL,QAAQ;YACR,OAAO;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;SACtB,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACtC,CAAC;CACF;AAzJD,oCAyJC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Build Cache
3
+ * Simple file-based caching for successful builds
4
+ */
5
+ import { BuildConfig, BuildResult } from '@jetstart/shared';
6
+ export interface CachedBuild {
7
+ config: BuildConfig;
8
+ result: BuildResult;
9
+ timestamp: number;
10
+ }
11
+ export interface BuildCacheOptions {
12
+ enabled: boolean;
13
+ cachePath: string;
14
+ maxAge?: number;
15
+ }
16
+ export declare class BuildCache {
17
+ private enabled;
18
+ private cachePath;
19
+ private maxAge;
20
+ private cache;
21
+ constructor(options: BuildCacheOptions);
22
+ /**
23
+ * Get cached build by config
24
+ */
25
+ get(config: BuildConfig): CachedBuild | null;
26
+ /**
27
+ * Set cached build
28
+ */
29
+ set(config: BuildConfig, result: BuildResult): void;
30
+ /**
31
+ * Clear entire cache
32
+ */
33
+ clear(): void;
34
+ /**
35
+ * Hash build config for cache key
36
+ */
37
+ private hashConfig;
38
+ /**
39
+ * Ensure cache directory exists
40
+ */
41
+ private ensureCacheDir;
42
+ /**
43
+ * Load cache from disk
44
+ */
45
+ private loadCache;
46
+ /**
47
+ * Save cache to disk
48
+ */
49
+ private saveCache;
50
+ }
51
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/build/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAuC;gBAExC,OAAO,EAAE,iBAAiB;IAWtC;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,WAAW,GAAG,WAAW,GAAG,IAAI;IA2B5C;;OAEG;IACH,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI;IAgBnD;;OAEG;IACH,KAAK,IAAI,IAAI;IAKb;;OAEG;IACH,OAAO,CAAC,UAAU;IAWlB;;OAEG;IACH,OAAO,CAAC,cAAc;IAMtB;;OAEG;IACH,OAAO,CAAC,SAAS;IAajB;;OAEG;IACH,OAAO,CAAC,SAAS;CAKlB"}
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ /**
3
+ * Build Cache
4
+ * Simple file-based caching for successful builds
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.BuildCache = void 0;
41
+ const crypto = __importStar(require("crypto"));
42
+ const fs = __importStar(require("fs"));
43
+ const path = __importStar(require("path"));
44
+ class BuildCache {
45
+ enabled;
46
+ cachePath;
47
+ maxAge;
48
+ cache = new Map();
49
+ constructor(options) {
50
+ this.enabled = options.enabled;
51
+ this.cachePath = options.cachePath;
52
+ this.maxAge = options.maxAge || 24 * 60 * 60 * 1000; // 24 hours default
53
+ if (this.enabled) {
54
+ this.ensureCacheDir();
55
+ this.loadCache();
56
+ }
57
+ }
58
+ /**
59
+ * Get cached build by config
60
+ */
61
+ get(config) {
62
+ if (!this.enabled) {
63
+ return null;
64
+ }
65
+ const hash = this.hashConfig(config);
66
+ const cached = this.cache.get(hash);
67
+ if (!cached) {
68
+ return null;
69
+ }
70
+ // Check if cache is stale
71
+ if (Date.now() - cached.timestamp > this.maxAge) {
72
+ this.cache.delete(hash);
73
+ return null;
74
+ }
75
+ // Validate APK still exists
76
+ if (cached.result.apkPath && !fs.existsSync(cached.result.apkPath)) {
77
+ this.cache.delete(hash);
78
+ return null;
79
+ }
80
+ return cached;
81
+ }
82
+ /**
83
+ * Set cached build
84
+ */
85
+ set(config, result) {
86
+ if (!this.enabled || !result.success) {
87
+ return;
88
+ }
89
+ const hash = this.hashConfig(config);
90
+ const cached = {
91
+ config,
92
+ result,
93
+ timestamp: Date.now(),
94
+ };
95
+ this.cache.set(hash, cached);
96
+ this.saveCache();
97
+ }
98
+ /**
99
+ * Clear entire cache
100
+ */
101
+ clear() {
102
+ this.cache.clear();
103
+ this.saveCache();
104
+ }
105
+ /**
106
+ * Hash build config for cache key
107
+ */
108
+ hashConfig(config) {
109
+ const data = JSON.stringify({
110
+ projectPath: config.projectPath,
111
+ buildType: config.buildType,
112
+ minifyEnabled: config.minifyEnabled,
113
+ debuggable: config.debuggable,
114
+ applicationId: config.applicationId,
115
+ });
116
+ return crypto.createHash('md5').update(data).digest('hex');
117
+ }
118
+ /**
119
+ * Ensure cache directory exists
120
+ */
121
+ ensureCacheDir() {
122
+ if (!fs.existsSync(this.cachePath)) {
123
+ fs.mkdirSync(this.cachePath, { recursive: true });
124
+ }
125
+ }
126
+ /**
127
+ * Load cache from disk
128
+ */
129
+ loadCache() {
130
+ const cacheFile = path.join(this.cachePath, 'build-cache.json');
131
+ if (fs.existsSync(cacheFile)) {
132
+ try {
133
+ const data = fs.readFileSync(cacheFile, 'utf-8');
134
+ const cacheData = JSON.parse(data);
135
+ this.cache = new Map(Object.entries(cacheData));
136
+ }
137
+ catch (err) {
138
+ // Ignore corrupted cache
139
+ }
140
+ }
141
+ }
142
+ /**
143
+ * Save cache to disk
144
+ */
145
+ saveCache() {
146
+ const cacheFile = path.join(this.cachePath, 'build-cache.json');
147
+ const cacheData = Object.fromEntries(this.cache);
148
+ fs.writeFileSync(cacheFile, JSON.stringify(cacheData, null, 2));
149
+ }
150
+ }
151
+ exports.BuildCache = BuildCache;
152
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/build/cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import { ParseResult } from './dsl-types';
2
+ /**
3
+ * DSL Parser
4
+ * Converts Kotlin Compose code to JSON DSL for runtime interpretation
5
+ */
6
+ export declare class DSLParser {
7
+ private static readonly TAG;
8
+ /**
9
+ * Parse a Kotlin file and extract UI definition
10
+ */
11
+ static parseFile(filePath: string): ParseResult;
12
+ /**
13
+ * Parse Kotlin content and extract UI definition
14
+ */
15
+ static parseContent(content: string, filePath: string): ParseResult;
16
+ /**
17
+ * Extract DSL JSON from getDefaultDSL() or similar function (legacy support)
18
+ */
19
+ private static extractDSLFromFunction;
20
+ /**
21
+ * Find the main @Composable function in the file
22
+ */
23
+ private static findMainComposable;
24
+ /**
25
+ * Extract function body handling nested braces
26
+ */
27
+ private static extractFunctionBody;
28
+ /**
29
+ * Parse the composable body and extract UI structure
30
+ */
31
+ private static parseComposableBody;
32
+ /**
33
+ * Parse a layout element (Column, Row, Box)
34
+ */
35
+ private static parseLayout;
36
+ /**
37
+ * Parse modifier chain
38
+ */
39
+ private static parseModifier;
40
+ /**
41
+ * Parse children elements (handles multi-line elements)
42
+ * Maintains source code order
43
+ */
44
+ private static parseChildren;
45
+ /**
46
+ * Extract content within parentheses (handles nesting)
47
+ */
48
+ private static extractParenthesesContent;
49
+ /**
50
+ * Generate default DSL when parsing fails
51
+ */
52
+ private static generateDefaultDSL;
53
+ }
54
+ //# sourceMappingURL=dsl-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dsl-parser.d.ts","sourceRoot":"","sources":["../../src/build/dsl-parser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAyC,WAAW,EAAE,MAAM,aAAa,CAAC;AAGjF;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAe;IAE1C;;OAEG;IACH,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW;IAmB/C;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW;IAgDnE;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAcrC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;IA6BjC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAalC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAwClC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,WAAW;IA6B1B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IA8B5B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,aAAa;IAsE5B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB;IAaxC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;CA8BlC"}