@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
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HTTP Server
|
|
4
|
+
* Serves APKs, handles REST endpoints
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createHttpServer = createHttpServer;
|
|
11
|
+
const express_1 = __importDefault(require("express"));
|
|
12
|
+
const middleware_1 = require("./middleware");
|
|
13
|
+
const routes_1 = require("./routes");
|
|
14
|
+
const logger_1 = require("../utils/logger");
|
|
15
|
+
async function createHttpServer(config) {
|
|
16
|
+
const app = (0, express_1.default)();
|
|
17
|
+
// Setup middleware
|
|
18
|
+
(0, middleware_1.setupMiddleware)(app);
|
|
19
|
+
// Setup routes
|
|
20
|
+
(0, routes_1.setupRoutes)(app, config.getLatestApk);
|
|
21
|
+
// Start server
|
|
22
|
+
return new Promise((resolve, reject) => {
|
|
23
|
+
const server = app.listen(config.port, config.host, () => {
|
|
24
|
+
(0, logger_1.log)(`HTTP server listening on ${config.host}:${config.port}`);
|
|
25
|
+
resolve(server);
|
|
26
|
+
});
|
|
27
|
+
server.on('error', (err) => {
|
|
28
|
+
reject(err);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/server/http.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAcH,4CAoBC;AAhCD,sDAA2C;AAE3C,6CAA+C;AAC/C,qCAAuC;AACvC,4CAAsC;AAQ/B,KAAK,UAAU,gBAAgB,CAAC,MAAwB;IAC7D,MAAM,GAAG,GAAY,IAAA,iBAAO,GAAE,CAAC;IAE/B,mBAAmB;IACnB,IAAA,4BAAe,EAAC,GAAG,CAAC,CAAC;IAErB,eAAe;IACf,IAAA,oBAAW,EAAC,GAAG,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAEtC,eAAe;IACf,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACvD,IAAA,YAAG,EAAC,4BAA4B,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9D,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAU,EAAE,EAAE;YAChC,MAAM,CAAC,GAAG,CAAC,CAAC;QACd,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Main Server Entry Point
|
|
3
|
+
* Starts HTTP and WebSocket servers
|
|
4
|
+
*/
|
|
5
|
+
import { ServerSession } from '../types';
|
|
6
|
+
export interface ServerConfig {
|
|
7
|
+
httpPort?: number;
|
|
8
|
+
wsPort?: number;
|
|
9
|
+
host?: string;
|
|
10
|
+
displayHost?: string;
|
|
11
|
+
projectPath?: string;
|
|
12
|
+
projectName?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare class JetStartServer {
|
|
15
|
+
private httpServer;
|
|
16
|
+
private wsServer;
|
|
17
|
+
private wsHandler;
|
|
18
|
+
private config;
|
|
19
|
+
private sessionManager;
|
|
20
|
+
private buildService;
|
|
21
|
+
private currentSession;
|
|
22
|
+
private buildMutex;
|
|
23
|
+
private latestApkPath;
|
|
24
|
+
constructor(config?: ServerConfig);
|
|
25
|
+
start(): Promise<ServerSession>;
|
|
26
|
+
stop(): Promise<void>;
|
|
27
|
+
getSession(): ServerSession | null;
|
|
28
|
+
private setupBuildListeners;
|
|
29
|
+
private handleRebuild;
|
|
30
|
+
/**
|
|
31
|
+
* Handle UI file updates using DSL hot reload (FAST)
|
|
32
|
+
*/
|
|
33
|
+
private handleUIUpdate;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAIzC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAM;IACxB,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,SAAS,CAAiC;IAClD,OAAO,CAAC,MAAM,CAAmD;IACjE,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,cAAc,CAA8B;IACpD,OAAO,CAAC,UAAU,CAAkB;IACpC,OAAO,CAAC,aAAa,CAAuB;gBAEhC,MAAM,GAAE,YAAiB;IAqB/B,KAAK,IAAI,OAAO,CAAC,aAAa,CAAC;IAiF/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B,UAAU,IAAI,aAAa,GAAG,IAAI;IAIlC,OAAO,CAAC,mBAAmB;YAgCb,aAAa;IAwC3B;;OAEG;IACH,OAAO,CAAC,cAAc;CAiCvB"}
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Main Server Entry Point
|
|
4
|
+
* Starts HTTP and WebSocket servers
|
|
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.JetStartServer = void 0;
|
|
41
|
+
const path = __importStar(require("path"));
|
|
42
|
+
const os = __importStar(require("os"));
|
|
43
|
+
const http_1 = require("./http");
|
|
44
|
+
const websocket_1 = require("../websocket");
|
|
45
|
+
const logger_1 = require("../utils/logger");
|
|
46
|
+
const shared_1 = require("@jetstart/shared");
|
|
47
|
+
const session_1 = require("../utils/session");
|
|
48
|
+
const build_1 = require("../build");
|
|
49
|
+
const dsl_parser_1 = require("../build/dsl-parser");
|
|
50
|
+
const gradle_injector_1 = require("../build/gradle-injector");
|
|
51
|
+
class JetStartServer {
|
|
52
|
+
httpServer;
|
|
53
|
+
wsServer;
|
|
54
|
+
wsHandler = null;
|
|
55
|
+
config;
|
|
56
|
+
sessionManager;
|
|
57
|
+
buildService;
|
|
58
|
+
currentSession = null;
|
|
59
|
+
buildMutex = false; // Prevent concurrent builds
|
|
60
|
+
latestApkPath = null; // Store latest built APK path
|
|
61
|
+
constructor(config = {}) {
|
|
62
|
+
const bindHost = config.host || '0.0.0.0';
|
|
63
|
+
const displayHost = config.displayHost || bindHost;
|
|
64
|
+
this.config = {
|
|
65
|
+
httpPort: config.httpPort || shared_1.DEFAULT_CORE_PORT,
|
|
66
|
+
wsPort: config.wsPort || shared_1.DEFAULT_WS_PORT,
|
|
67
|
+
host: bindHost,
|
|
68
|
+
displayHost: displayHost,
|
|
69
|
+
projectPath: config.projectPath || process.cwd(),
|
|
70
|
+
projectName: config.projectName || path.basename(config.projectPath || process.cwd()),
|
|
71
|
+
};
|
|
72
|
+
this.sessionManager = new session_1.SessionManager();
|
|
73
|
+
this.buildService = new build_1.BuildService({
|
|
74
|
+
cacheEnabled: true,
|
|
75
|
+
cachePath: path.join(os.tmpdir(), 'jetstart-cache'),
|
|
76
|
+
watchEnabled: true,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
async start() {
|
|
80
|
+
try {
|
|
81
|
+
(0, logger_1.log)('Starting JetStart Core server...');
|
|
82
|
+
// Create development session
|
|
83
|
+
this.currentSession = await this.sessionManager.createSession({
|
|
84
|
+
projectName: this.config.projectName,
|
|
85
|
+
projectPath: this.config.projectPath,
|
|
86
|
+
});
|
|
87
|
+
// Inject server URL into build.gradle for hot reload
|
|
88
|
+
const serverUrl = `ws://${this.config.displayHost}:${this.config.wsPort}`;
|
|
89
|
+
await (0, gradle_injector_1.injectBuildConfigFields)(this.config.projectPath, [
|
|
90
|
+
{ type: 'String', name: 'JETSTART_SERVER_URL', value: serverUrl },
|
|
91
|
+
{ type: 'String', name: 'JETSTART_SESSION_ID', value: this.currentSession.id }
|
|
92
|
+
]);
|
|
93
|
+
(0, logger_1.log)(`Injected server URL: ${serverUrl}`);
|
|
94
|
+
// Start HTTP server
|
|
95
|
+
this.httpServer = await (0, http_1.createHttpServer)({
|
|
96
|
+
port: this.config.httpPort,
|
|
97
|
+
host: this.config.host,
|
|
98
|
+
getLatestApk: () => this.latestApkPath,
|
|
99
|
+
});
|
|
100
|
+
// Start WebSocket server
|
|
101
|
+
const wsResult = await (0, websocket_1.createWebSocketServer)({
|
|
102
|
+
port: this.config.wsPort,
|
|
103
|
+
onClientConnected: async (sessionId) => {
|
|
104
|
+
// Trigger initial build when client connects
|
|
105
|
+
(0, logger_1.log)(`Triggering initial build for connected client (session: ${sessionId})`);
|
|
106
|
+
await this.handleRebuild();
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
this.wsServer = wsResult.server;
|
|
110
|
+
this.wsHandler = wsResult.handler;
|
|
111
|
+
// Setup build service event listeners
|
|
112
|
+
this.setupBuildListeners();
|
|
113
|
+
// Start watching for file changes
|
|
114
|
+
this.buildService.startWatching(this.config.projectPath, async (files) => {
|
|
115
|
+
(0, logger_1.log)(`Files changed: ${files.map(f => path.basename(f)).join(', ')}`);
|
|
116
|
+
// Check if only UI files changed (MainActivity.kt, screens/, components/)
|
|
117
|
+
const uiFiles = files.filter(f => f.includes('MainActivity.kt') ||
|
|
118
|
+
f.includes('/screens/') ||
|
|
119
|
+
f.includes('\\screens\\') ||
|
|
120
|
+
f.includes('/components/') ||
|
|
121
|
+
f.includes('\\components\\'));
|
|
122
|
+
// If ALL changed files are UI files, use DSL hot reload (FAST)
|
|
123
|
+
if (uiFiles.length > 0 && uiFiles.length === files.length) {
|
|
124
|
+
(0, logger_1.log)('🚀 UI-only changes detected, using DSL hot reload');
|
|
125
|
+
this.handleUIUpdate(uiFiles[0]);
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
// Otherwise, full Gradle build
|
|
129
|
+
(0, logger_1.log)('📦 Non-UI changes detected, triggering full Gradle build');
|
|
130
|
+
this.buildService.clearCache();
|
|
131
|
+
await this.handleRebuild();
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
console.log();
|
|
135
|
+
(0, logger_1.success)('JetStart Core is running!');
|
|
136
|
+
(0, logger_1.log)(`HTTP Server: http://${this.config.displayHost}:${this.config.httpPort}`);
|
|
137
|
+
(0, logger_1.log)(`WebSocket Server: ws://${this.config.displayHost}:${this.config.wsPort}`);
|
|
138
|
+
(0, logger_1.log)(`Session ID: ${this.currentSession.id}`);
|
|
139
|
+
(0, logger_1.log)(`Session Token: ${this.currentSession.token}`);
|
|
140
|
+
console.log();
|
|
141
|
+
return this.currentSession;
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
(0, logger_1.error)(`Failed to start server: ${err.message}`);
|
|
145
|
+
throw err;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async stop() {
|
|
149
|
+
(0, logger_1.log)('Stopping JetStart Core server...');
|
|
150
|
+
// Stop file watching
|
|
151
|
+
this.buildService.stopWatching();
|
|
152
|
+
if (this.wsServer) {
|
|
153
|
+
await this.wsServer.close();
|
|
154
|
+
}
|
|
155
|
+
if (this.httpServer) {
|
|
156
|
+
await new Promise((resolve) => {
|
|
157
|
+
this.httpServer.close(() => resolve());
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
(0, logger_1.success)('Server stopped');
|
|
161
|
+
}
|
|
162
|
+
getSession() {
|
|
163
|
+
return this.currentSession;
|
|
164
|
+
}
|
|
165
|
+
setupBuildListeners() {
|
|
166
|
+
this.buildService.on('build:start', () => {
|
|
167
|
+
(0, logger_1.log)('Build started');
|
|
168
|
+
if (this.wsHandler && this.currentSession) {
|
|
169
|
+
this.wsHandler.sendBuildStart(this.currentSession.id);
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
this.buildService.on('build:complete', (result) => {
|
|
173
|
+
(0, logger_1.success)(`Build completed in ${result.buildTime}ms`);
|
|
174
|
+
if (this.wsHandler && this.currentSession) {
|
|
175
|
+
// Store the APK path
|
|
176
|
+
this.latestApkPath = result.apkPath || null;
|
|
177
|
+
// Send full download URL to client (not just relative path)
|
|
178
|
+
const downloadUrl = `http://${this.config.displayHost}:${this.config.httpPort}/download/app.apk`;
|
|
179
|
+
this.wsHandler.sendBuildComplete(this.currentSession.id, downloadUrl);
|
|
180
|
+
(0, logger_1.log)(`APK download URL: ${downloadUrl}`);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
this.buildService.on('build:error', (errorMsg, details) => {
|
|
184
|
+
(0, logger_1.error)(`Build failed: ${errorMsg}`);
|
|
185
|
+
// TODO: Send build-error message via WebSocket
|
|
186
|
+
});
|
|
187
|
+
this.buildService.on('watch:change', (files) => {
|
|
188
|
+
// This event is just for logging/monitoring
|
|
189
|
+
// Actual build logic is handled in startWatching callback
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
async handleRebuild() {
|
|
193
|
+
if (!this.currentSession) {
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
// Atomic mutex check - prevents race condition
|
|
197
|
+
if (this.buildMutex) {
|
|
198
|
+
(0, logger_1.log)('Build already in progress, skipping duplicate build request');
|
|
199
|
+
return;
|
|
200
|
+
}
|
|
201
|
+
// Set mutex immediately before any async operations
|
|
202
|
+
this.buildMutex = true;
|
|
203
|
+
try {
|
|
204
|
+
// Trigger actual build using BuildService
|
|
205
|
+
const result = await this.buildService.build({
|
|
206
|
+
projectPath: this.config.projectPath,
|
|
207
|
+
outputPath: path.join(this.config.projectPath, 'build/outputs/apk'),
|
|
208
|
+
buildType: 'debug', // BuildType.DEBUG
|
|
209
|
+
minifyEnabled: false,
|
|
210
|
+
debuggable: true,
|
|
211
|
+
versionCode: 1,
|
|
212
|
+
versionName: '1.0.0',
|
|
213
|
+
applicationId: 'com.example.app',
|
|
214
|
+
});
|
|
215
|
+
if (result.success) {
|
|
216
|
+
(0, logger_1.success)(`Build completed successfully: ${result.apkPath || 'APK path not found'}`);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
(0, logger_1.error)(`Build failed: ${result.errors?.[0]?.message || 'Unknown error'}`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
catch (err) {
|
|
223
|
+
(0, logger_1.error)(`Build failed: ${err.message}`);
|
|
224
|
+
}
|
|
225
|
+
finally {
|
|
226
|
+
// Always release mutex
|
|
227
|
+
this.buildMutex = false;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Handle UI file updates using DSL hot reload (FAST)
|
|
232
|
+
*/
|
|
233
|
+
handleUIUpdate(filePath) {
|
|
234
|
+
if (!this.currentSession || !this.wsHandler) {
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
try {
|
|
238
|
+
(0, logger_1.log)(`Parsing UI file: ${path.basename(filePath)}`);
|
|
239
|
+
const parseResult = dsl_parser_1.DSLParser.parseFile(filePath);
|
|
240
|
+
if (parseResult.success && parseResult.dsl) {
|
|
241
|
+
const dslContent = JSON.stringify(parseResult.dsl);
|
|
242
|
+
(0, logger_1.log)(`DSL generated: ${dslContent.length} bytes`);
|
|
243
|
+
// Send DSL update via WebSocket (instant hot reload!)
|
|
244
|
+
this.wsHandler.sendUIUpdate(this.currentSession.id, dslContent, [path.basename(filePath)]);
|
|
245
|
+
(0, logger_1.success)(`UI hot reload sent in <100ms ⚡`);
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
(0, logger_1.error)(`Failed to parse UI file: ${parseResult.errors?.join(', ')}`);
|
|
249
|
+
// Fallback to full build
|
|
250
|
+
(0, logger_1.log)('Falling back to full Gradle build...');
|
|
251
|
+
this.handleRebuild();
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
catch (err) {
|
|
255
|
+
(0, logger_1.error)(`UI update failed: ${err.message}`);
|
|
256
|
+
// Fallback to full build
|
|
257
|
+
this.handleRebuild();
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
exports.JetStartServer = JetStartServer;
|
|
262
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAmC,MAAM,SAAS,CAAC;AAKnE,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAgClD"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Express Middleware
|
|
4
|
+
* CORS, body parsing, error handling
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.setupMiddleware = setupMiddleware;
|
|
11
|
+
const express_1 = __importDefault(require("express"));
|
|
12
|
+
const cors_1 = __importDefault(require("cors"));
|
|
13
|
+
const logger_1 = require("../utils/logger");
|
|
14
|
+
function setupMiddleware(app) {
|
|
15
|
+
// CORS
|
|
16
|
+
app.use((0, cors_1.default)({
|
|
17
|
+
origin: '*',
|
|
18
|
+
methods: ['GET', 'POST', 'PUT', 'DELETE'],
|
|
19
|
+
allowedHeaders: ['Content-Type', 'Authorization'],
|
|
20
|
+
}));
|
|
21
|
+
// Body parsing
|
|
22
|
+
app.use(express_1.default.json());
|
|
23
|
+
app.use(express_1.default.urlencoded({ extended: true }));
|
|
24
|
+
// Request logging
|
|
25
|
+
app.use((req, res, next) => {
|
|
26
|
+
const start = Date.now();
|
|
27
|
+
res.on('finish', () => {
|
|
28
|
+
const duration = Date.now() - start;
|
|
29
|
+
console.log(`${req.method} ${req.path} - ${res.statusCode} (${duration}ms)`);
|
|
30
|
+
});
|
|
31
|
+
next();
|
|
32
|
+
});
|
|
33
|
+
// Error handling
|
|
34
|
+
app.use((err, req, res, _next) => {
|
|
35
|
+
(0, logger_1.error)(`Server error: ${err.message}`);
|
|
36
|
+
res.status(500).json({
|
|
37
|
+
error: 'Internal server error',
|
|
38
|
+
message: err.message,
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/server/middleware.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAOH,0CAgCC;AApCD,sDAA8B;AAC9B,gDAAwB;AACxB,4CAAoD;AAEpD,SAAgB,eAAe,CAAC,GAAY;IAC1C,OAAO;IACP,GAAG,CAAC,GAAG,CAAC,IAAA,cAAI,EAAC;QACX,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QACzC,cAAc,EAAE,CAAC,cAAc,EAAE,eAAe,CAAC;KAClD,CAAC,CAAC,CAAC;IAEJ,eAAe;IACf,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACxB,GAAG,CAAC,GAAG,CAAC,iBAAO,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAEhD,kBAAkB;IAClB,GAAG,CAAC,GAAG,CAAC,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAC1D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAEzB,GAAG,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,UAAU,KAAK,QAAQ,KAAK,CAAC,CAAC;QAC/E,CAAC,CAAC,CAAC;QAEH,IAAI,EAAE,CAAC;IACT,CAAC,CAAC,CAAC;IAEH,iBAAiB;IACjB,GAAG,CAAC,GAAG,CAAC,CAAC,GAAU,EAAE,GAAY,EAAE,GAAa,EAAE,KAAmB,EAAE,EAAE;QACvE,IAAA,cAAQ,EAAC,iBAAiB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACzC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,uBAAuB;YAC9B,OAAO,EAAE,GAAG,CAAC,OAAO;SACrB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/server/routes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAqB,MAAM,SAAS,CAAC;AASrD,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,IAAI,CAqGlF"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* HTTP Routes
|
|
4
|
+
* REST API endpoints
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.setupRoutes = setupRoutes;
|
|
11
|
+
const fs_1 = __importDefault(require("fs"));
|
|
12
|
+
const session_1 = require("../utils/session");
|
|
13
|
+
const qr_1 = require("../utils/qr");
|
|
14
|
+
const shared_1 = require("@jetstart/shared");
|
|
15
|
+
const sessionManager = new session_1.SessionManager();
|
|
16
|
+
function setupRoutes(app, getLatestApk) {
|
|
17
|
+
// Health check
|
|
18
|
+
app.get('/health', (req, res) => {
|
|
19
|
+
res.json({
|
|
20
|
+
status: 'ok',
|
|
21
|
+
version: shared_1.JETSTART_VERSION,
|
|
22
|
+
uptime: process.uptime(),
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
// Get version
|
|
26
|
+
app.get('/version', (req, res) => {
|
|
27
|
+
res.json({
|
|
28
|
+
version: shared_1.JETSTART_VERSION,
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
// Create new session
|
|
32
|
+
app.post('/session/create', async (req, res) => {
|
|
33
|
+
try {
|
|
34
|
+
const { projectName, projectPath } = req.body;
|
|
35
|
+
if (!projectName || !projectPath) {
|
|
36
|
+
return res.status(400).json({
|
|
37
|
+
error: 'Missing required fields: projectName, projectPath',
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
const session = await sessionManager.createSession({
|
|
41
|
+
projectName,
|
|
42
|
+
projectPath,
|
|
43
|
+
});
|
|
44
|
+
// Generate QR code
|
|
45
|
+
const qrCode = await (0, qr_1.generateQRCode)({
|
|
46
|
+
sessionId: session.id,
|
|
47
|
+
serverUrl: `http://${req.hostname}:${req.socket.localPort}`,
|
|
48
|
+
wsUrl: `ws://${req.hostname}:${req.socket.localPort}`,
|
|
49
|
+
token: session.token,
|
|
50
|
+
projectName,
|
|
51
|
+
version: shared_1.JETSTART_VERSION,
|
|
52
|
+
});
|
|
53
|
+
res.json({
|
|
54
|
+
session,
|
|
55
|
+
qrCode,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
res.status(500).json({
|
|
60
|
+
error: 'Failed to create session',
|
|
61
|
+
message: err.message,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
// Get session
|
|
66
|
+
app.get('/session/:sessionId', (req, res) => {
|
|
67
|
+
const session = sessionManager.getSession(req.params.sessionId);
|
|
68
|
+
if (!session) {
|
|
69
|
+
return res.status(404).json({
|
|
70
|
+
error: 'Session not found',
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
res.json(session);
|
|
74
|
+
});
|
|
75
|
+
// Download APK
|
|
76
|
+
app.get('/download/:filename', async (req, res) => {
|
|
77
|
+
// Get latest built APK path
|
|
78
|
+
const apkPath = getLatestApk?.();
|
|
79
|
+
if (!apkPath) {
|
|
80
|
+
return res.status(404).json({ error: 'No APK available. Build the app first.' });
|
|
81
|
+
}
|
|
82
|
+
// Check if file exists
|
|
83
|
+
if (!fs_1.default.existsSync(apkPath)) {
|
|
84
|
+
return res.status(404).json({ error: 'APK file not found at expected location' });
|
|
85
|
+
}
|
|
86
|
+
// Send the APK file
|
|
87
|
+
res.download(apkPath, req.params.filename || 'app-debug.apk', (err) => {
|
|
88
|
+
if (err) {
|
|
89
|
+
console.error(`Failed to send APK: ${err.message}`);
|
|
90
|
+
if (!res.headersSent) {
|
|
91
|
+
res.status(500).json({ error: 'Failed to send APK file' });
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
// 404 handler
|
|
97
|
+
app.use((req, res) => {
|
|
98
|
+
res.status(404).json({
|
|
99
|
+
error: 'Not found',
|
|
100
|
+
path: req.path,
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/server/routes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core-specific types
|
|
3
|
+
*/
|
|
4
|
+
export interface ServerSession {
|
|
5
|
+
id: string;
|
|
6
|
+
token: string;
|
|
7
|
+
projectName: string;
|
|
8
|
+
projectPath: string;
|
|
9
|
+
createdAt: number;
|
|
10
|
+
lastActivity: number;
|
|
11
|
+
}
|
|
12
|
+
export interface QRCodeOptions {
|
|
13
|
+
sessionId: string;
|
|
14
|
+
serverUrl: string;
|
|
15
|
+
wsUrl: string;
|
|
16
|
+
token: string;
|
|
17
|
+
projectName: string;
|
|
18
|
+
version: string;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":";AAAA;;GAEG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,UAAU,CAAC;AACzB,cAAc,MAAM,CAAC;AACrB,cAAc,WAAW,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Export all utilities
|
|
4
|
+
*/
|
|
5
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
8
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
9
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
10
|
+
}
|
|
11
|
+
Object.defineProperty(o, k2, desc);
|
|
12
|
+
}) : (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
o[k2] = m[k];
|
|
15
|
+
}));
|
|
16
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
17
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
|
+
};
|
|
19
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
+
__exportStar(require("./logger"), exports);
|
|
21
|
+
__exportStar(require("./qr"), exports);
|
|
22
|
+
__exportStar(require("./session"), exports);
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,2CAAyB;AACzB,uCAAqB;AACrB,4CAA0B"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger Utility
|
|
3
|
+
* Colored logging for Core
|
|
4
|
+
*/
|
|
5
|
+
export declare function log(message: string): void;
|
|
6
|
+
export declare function success(message: string): void;
|
|
7
|
+
export declare function error(message: string): void;
|
|
8
|
+
export declare function warn(message: string): void;
|
|
9
|
+
export declare function debug(message: string): void;
|
|
10
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,wBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,QAElC;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,QAEtC;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,QAEpC;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,QAEnC;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,QAIpC"}
|