@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.
- package/.eslintrc.json +6 -0
- package/README.md +124 -0
- package/dist/build/builder.d.ts +57 -0
- package/dist/build/builder.d.ts.map +1 -0
- package/dist/build/builder.js +151 -0
- package/dist/build/builder.js.map +1 -0
- package/dist/build/cache.d.ts +51 -0
- package/dist/build/cache.d.ts.map +1 -0
- package/dist/build/cache.js +152 -0
- package/dist/build/cache.js.map +1 -0
- package/dist/build/dsl-parser.d.ts +54 -0
- package/dist/build/dsl-parser.d.ts.map +1 -0
- package/dist/build/dsl-parser.js +373 -0
- package/dist/build/dsl-parser.js.map +1 -0
- package/dist/build/dsl-types.d.ts +47 -0
- package/dist/build/dsl-types.d.ts.map +1 -0
- package/dist/build/dsl-types.js +7 -0
- package/dist/build/dsl-types.js.map +1 -0
- package/dist/build/gradle-injector.d.ts +14 -0
- package/dist/build/gradle-injector.d.ts.map +1 -0
- package/dist/build/gradle-injector.js +77 -0
- package/dist/build/gradle-injector.js.map +1 -0
- package/dist/build/gradle.d.ts +43 -0
- package/dist/build/gradle.d.ts.map +1 -0
- package/dist/build/gradle.js +281 -0
- package/dist/build/gradle.js.map +1 -0
- package/dist/build/index.d.ts +10 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +26 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/parser.d.ts +12 -0
- package/dist/build/parser.d.ts.map +1 -0
- package/dist/build/parser.js +71 -0
- package/dist/build/parser.js.map +1 -0
- package/dist/build/watcher.d.ts +30 -0
- package/dist/build/watcher.d.ts.map +1 -0
- package/dist/build/watcher.js +120 -0
- package/dist/build/watcher.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/server/http.d.ts +12 -0
- package/dist/server/http.d.ts.map +1 -0
- package/dist/server/http.js +32 -0
- package/dist/server/http.js.map +1 -0
- package/dist/server/index.d.ts +35 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +262 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware.d.ts +7 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/middleware.js +42 -0
- package/dist/server/middleware.js.map +1 -0
- package/dist/server/routes.d.ts +7 -0
- package/dist/server/routes.d.ts.map +1 -0
- package/dist/server/routes.js +104 -0
- package/dist/server/routes.js.map +1 -0
- package/dist/types/index.d.ts +20 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +6 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +23 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +10 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +33 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/qr.d.ts +8 -0
- package/dist/utils/qr.d.ts.map +1 -0
- package/dist/utils/qr.js +48 -0
- package/dist/utils/qr.js.map +1 -0
- package/dist/utils/session.d.ts +18 -0
- package/dist/utils/session.d.ts.map +1 -0
- package/dist/utils/session.js +49 -0
- package/dist/utils/session.js.map +1 -0
- package/dist/websocket/handler.d.ts +25 -0
- package/dist/websocket/handler.d.ts.map +1 -0
- package/dist/websocket/handler.js +126 -0
- package/dist/websocket/handler.js.map +1 -0
- package/dist/websocket/index.d.ts +18 -0
- package/dist/websocket/index.d.ts.map +1 -0
- package/dist/websocket/index.js +40 -0
- package/dist/websocket/index.js.map +1 -0
- package/dist/websocket/manager.d.ts +16 -0
- package/dist/websocket/manager.d.ts.map +1 -0
- package/dist/websocket/manager.js +58 -0
- package/dist/websocket/manager.js.map +1 -0
- package/package.json +78 -0
- package/src/build/builder.ts +192 -0
- package/src/build/cache.ts +144 -0
- package/src/build/dsl-parser.ts +382 -0
- package/src/build/dsl-types.ts +50 -0
- package/src/build/gradle-injector.ts +64 -0
- package/src/build/gradle.ts +305 -0
- package/src/build/index.ts +10 -0
- package/src/build/parser.ts +75 -0
- package/src/build/watcher.ts +103 -0
- package/src/index.ts +20 -0
- package/src/server/http.ts +38 -0
- package/src/server/index.ts +272 -0
- package/src/server/middleware.ts +43 -0
- package/src/server/routes.ts +116 -0
- package/src/types/index.ts +21 -0
- package/src/utils/index.ts +7 -0
- package/src/utils/logger.ts +28 -0
- package/src/utils/qr.ts +46 -0
- package/src/utils/session.ts +58 -0
- package/src/websocket/handler.ts +150 -0
- package/src/websocket/index.ts +56 -0
- package/src/websocket/manager.ts +63 -0
- package/tests/build.test.ts +13 -0
- package/tests/server.test.ts +13 -0
- package/tsconfig.json +25 -0
package/.eslintrc.json
ADDED
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"}
|