@onroad/core 4.0.0-alpha.2 → 4.0.0-alpha.21
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/README.md +409 -7
- package/dist/OnRoadExpress.d.ts.map +1 -1
- package/dist/OnRoadExpress.js +19 -6
- package/dist/OnRoadExpress.js.map +1 -1
- package/dist/container/Container.d.ts +1 -1
- package/dist/container/Container.d.ts.map +1 -1
- package/dist/container/Container.js +15 -6
- package/dist/container/Container.js.map +1 -1
- package/dist/core/AbstractController.d.ts +11 -0
- package/dist/core/AbstractController.d.ts.map +1 -1
- package/dist/core/AbstractController.js +65 -1
- package/dist/core/AbstractController.js.map +1 -1
- package/dist/core/AbstractService.d.ts +17 -0
- package/dist/core/AbstractService.d.ts.map +1 -1
- package/dist/core/AbstractService.js +50 -0
- package/dist/core/AbstractService.js.map +1 -1
- package/dist/core/SequelizeRepository.d.ts +4 -1
- package/dist/core/SequelizeRepository.d.ts.map +1 -1
- package/dist/core/SequelizeRepository.js +22 -1
- package/dist/core/SequelizeRepository.js.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.d.ts.map +1 -1
- package/dist/database/ConnectionManager.d.ts +2 -0
- package/dist/database/ConnectionManager.d.ts.map +1 -1
- package/dist/database/ConnectionManager.js +12 -1
- package/dist/database/ConnectionManager.js.map +1 -1
- package/dist/dev/DevServer.d.ts +67 -0
- package/dist/dev/DevServer.d.ts.map +1 -0
- package/dist/dev/DevServer.js +496 -0
- package/dist/dev/DevServer.js.map +1 -0
- package/dist/dev/MigrationCLI.d.ts +19 -0
- package/dist/dev/MigrationCLI.d.ts.map +1 -0
- package/dist/dev/MigrationCLI.js +140 -0
- package/dist/dev/MigrationCLI.js.map +1 -0
- package/dist/dev/index.d.ts +5 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/index.js +3 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/entity/EntityRegistry.d.ts +26 -0
- package/dist/entity/EntityRegistry.d.ts.map +1 -1
- package/dist/entity/EntityRegistry.js +140 -4
- package/dist/entity/EntityRegistry.js.map +1 -1
- package/dist/entity/decorators.d.ts +1 -0
- package/dist/entity/decorators.d.ts.map +1 -1
- package/dist/entity/decorators.js.map +1 -1
- package/dist/filters/builtins/JwtFilter.d.ts +6 -3
- package/dist/filters/builtins/JwtFilter.d.ts.map +1 -1
- package/dist/filters/builtins/JwtFilter.js +29 -4
- package/dist/filters/builtins/JwtFilter.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -1
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
import { execSync } from "child_process";
|
|
2
|
+
import { existsSync, writeFileSync } from "fs";
|
|
3
|
+
import { resolve } from "path";
|
|
4
|
+
// --- Main Class ---
|
|
5
|
+
export class DevServer {
|
|
6
|
+
app;
|
|
7
|
+
logger;
|
|
8
|
+
databases;
|
|
9
|
+
frontendVars;
|
|
10
|
+
migrationsPath;
|
|
11
|
+
projectRoot;
|
|
12
|
+
autoMigrate;
|
|
13
|
+
composeFile;
|
|
14
|
+
tenants;
|
|
15
|
+
gcpRestore;
|
|
16
|
+
containers = [];
|
|
17
|
+
composeCmd = null;
|
|
18
|
+
constructor(config) {
|
|
19
|
+
this.app = config.app;
|
|
20
|
+
this.logger = config.app.logger;
|
|
21
|
+
this.databases = config.databases ?? [{ engine: "postgres" }];
|
|
22
|
+
this.frontendVars = config.frontendVars ?? {};
|
|
23
|
+
this.migrationsPath = config.migrationsPath;
|
|
24
|
+
this.projectRoot = config.projectRoot ?? process.cwd();
|
|
25
|
+
this.autoMigrate = config.autoMigrate ?? true;
|
|
26
|
+
this.composeFile = config.composeFile ?? "docker-compose.dev.yml";
|
|
27
|
+
this.tenants = config.tenants ?? ["default"];
|
|
28
|
+
this.gcpRestore = config.gcpRestore;
|
|
29
|
+
}
|
|
30
|
+
// --- Public API ---
|
|
31
|
+
async start(buildConfig = {}) {
|
|
32
|
+
this.printBanner();
|
|
33
|
+
// 1. Generate docker-compose if not exists
|
|
34
|
+
this.ensureComposeFile();
|
|
35
|
+
// 2. Start database containers
|
|
36
|
+
await this.startContainers();
|
|
37
|
+
// 3. Wait for database readiness
|
|
38
|
+
await this.waitForDatabases();
|
|
39
|
+
// 3.5 Restore GCP backup if configured
|
|
40
|
+
if (this.gcpRestore) {
|
|
41
|
+
await this.restoreFromGcp();
|
|
42
|
+
}
|
|
43
|
+
// 4. Run migrations (if configured)
|
|
44
|
+
if (this.autoMigrate && this.migrationsPath) {
|
|
45
|
+
await this.runMigrations();
|
|
46
|
+
}
|
|
47
|
+
// 5. Build and start the OnRoadExpress server
|
|
48
|
+
const port = buildConfig.port ?? 3000;
|
|
49
|
+
await this.app.buildServer({
|
|
50
|
+
...buildConfig,
|
|
51
|
+
port,
|
|
52
|
+
});
|
|
53
|
+
// 6. Log frontend env vars
|
|
54
|
+
this.printFrontendEnvVars(port);
|
|
55
|
+
// 7. Log summary
|
|
56
|
+
this.printSummary(port);
|
|
57
|
+
}
|
|
58
|
+
async stop() {
|
|
59
|
+
this.logger.info("Stopping DevServer...");
|
|
60
|
+
await this.app.shutdown();
|
|
61
|
+
this.stopContainers();
|
|
62
|
+
this.logger.info("DevServer stopped");
|
|
63
|
+
}
|
|
64
|
+
// --- Docker Compose ---
|
|
65
|
+
ensureComposeFile() {
|
|
66
|
+
const composePath = resolve(this.projectRoot, this.composeFile);
|
|
67
|
+
if (existsSync(composePath)) {
|
|
68
|
+
this.logger.debug("Docker Compose file already exists", { path: composePath });
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const content = this.generateComposeContent();
|
|
72
|
+
writeFileSync(composePath, content, "utf-8");
|
|
73
|
+
this.logger.info("Generated docker-compose.dev.yml", { path: composePath });
|
|
74
|
+
}
|
|
75
|
+
generateComposeContent() {
|
|
76
|
+
const services = [];
|
|
77
|
+
const volumes = [];
|
|
78
|
+
for (const db of this.databases) {
|
|
79
|
+
const defaults = DB_DEFAULTS[db.engine];
|
|
80
|
+
const containerName = db.containerName ?? `typeroad-dev-${db.engine}`;
|
|
81
|
+
const port = db.port ?? defaults.port;
|
|
82
|
+
const user = db.user ?? defaults.user;
|
|
83
|
+
const password = db.password ?? defaults.password;
|
|
84
|
+
const database = db.database ?? defaults.database;
|
|
85
|
+
const image = db.image ?? defaults.image;
|
|
86
|
+
const volumeName = `${containerName}-data`;
|
|
87
|
+
this.containers.push({
|
|
88
|
+
name: containerName,
|
|
89
|
+
port,
|
|
90
|
+
engine: db.engine,
|
|
91
|
+
host: "localhost",
|
|
92
|
+
user,
|
|
93
|
+
password,
|
|
94
|
+
database,
|
|
95
|
+
});
|
|
96
|
+
if (db.engine === "postgres") {
|
|
97
|
+
services.push(` ${containerName}:
|
|
98
|
+
image: ${image}
|
|
99
|
+
container_name: ${containerName}
|
|
100
|
+
restart: unless-stopped
|
|
101
|
+
ports:
|
|
102
|
+
- "${port}:5432"
|
|
103
|
+
environment:
|
|
104
|
+
POSTGRES_USER: ${user}
|
|
105
|
+
POSTGRES_PASSWORD: ${password}
|
|
106
|
+
POSTGRES_DB: ${database}
|
|
107
|
+
volumes:
|
|
108
|
+
- ${volumeName}:/var/lib/postgresql/data
|
|
109
|
+
healthcheck:
|
|
110
|
+
test: ["CMD-SHELL", "pg_isready -U ${user} -d ${database}"]
|
|
111
|
+
interval: 2s
|
|
112
|
+
timeout: 5s
|
|
113
|
+
retries: 15`);
|
|
114
|
+
}
|
|
115
|
+
else if (db.engine === "mysql") {
|
|
116
|
+
services.push(` ${containerName}:
|
|
117
|
+
image: ${image}
|
|
118
|
+
container_name: ${containerName}
|
|
119
|
+
restart: unless-stopped
|
|
120
|
+
ports:
|
|
121
|
+
- "${port}:3306"
|
|
122
|
+
environment:
|
|
123
|
+
MYSQL_ROOT_PASSWORD: ${password}
|
|
124
|
+
MYSQL_USER: ${user}
|
|
125
|
+
MYSQL_PASSWORD: ${password}
|
|
126
|
+
MYSQL_DATABASE: ${database}
|
|
127
|
+
volumes:
|
|
128
|
+
- ${volumeName}:/var/lib/mysql
|
|
129
|
+
healthcheck:
|
|
130
|
+
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "${user}", "-p${password}"]
|
|
131
|
+
interval: 2s
|
|
132
|
+
timeout: 5s
|
|
133
|
+
retries: 15`);
|
|
134
|
+
}
|
|
135
|
+
volumes.push(` ${volumeName}:`);
|
|
136
|
+
}
|
|
137
|
+
return `# Auto-generated by TypeRoad DevServer
|
|
138
|
+
# Do not commit — add to .gitignore
|
|
139
|
+
|
|
140
|
+
services:
|
|
141
|
+
${services.join("\n\n")}
|
|
142
|
+
|
|
143
|
+
volumes:
|
|
144
|
+
${volumes.join("\n")}
|
|
145
|
+
`;
|
|
146
|
+
}
|
|
147
|
+
// --- Container Management ---
|
|
148
|
+
getComposeCommand() {
|
|
149
|
+
if (this.composeCmd)
|
|
150
|
+
return this.composeCmd;
|
|
151
|
+
// Try docker compose v2 (plugin) first, then docker-compose v1 (standalone)
|
|
152
|
+
try {
|
|
153
|
+
execSync("docker compose version", { stdio: "pipe" });
|
|
154
|
+
this.composeCmd = "docker compose";
|
|
155
|
+
return this.composeCmd;
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// v2 not available
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
execSync("docker-compose --version", { stdio: "pipe" });
|
|
162
|
+
this.composeCmd = "docker-compose";
|
|
163
|
+
return this.composeCmd;
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
166
|
+
// v1 not available
|
|
167
|
+
}
|
|
168
|
+
throw new Error("[TypeRoad DevServer] Neither 'docker compose' (v2) nor 'docker-compose' (v1) found. Install Docker Desktop or Docker Compose.");
|
|
169
|
+
}
|
|
170
|
+
async startContainers() {
|
|
171
|
+
const composePath = resolve(this.projectRoot, this.composeFile);
|
|
172
|
+
if (!this.isDockerAvailable()) {
|
|
173
|
+
throw new Error("[TypeRoad DevServer] Docker is not available. Install Docker Desktop or Docker Engine to use DevServer.");
|
|
174
|
+
}
|
|
175
|
+
const cmd = this.getComposeCommand();
|
|
176
|
+
this.logger.info(`Starting database containers... (using: ${cmd})`);
|
|
177
|
+
const maxRetries = 3;
|
|
178
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
179
|
+
try {
|
|
180
|
+
execSync(`${cmd} -f "${composePath}" up -d`, {
|
|
181
|
+
cwd: this.projectRoot,
|
|
182
|
+
stdio: "pipe",
|
|
183
|
+
});
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
188
|
+
// Transient Docker errors (closed pipe, daemon restart) — retry
|
|
189
|
+
if (attempt < maxRetries && (msg.includes("closed pipe") || msg.includes("connection refused"))) {
|
|
190
|
+
this.logger.warn(`Docker transient error (attempt ${attempt}/${maxRetries}), retrying in 3s...`);
|
|
191
|
+
execSync("sleep 3");
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
throw new Error(`[TypeRoad DevServer] Failed to start containers: ${msg}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
stopContainers() {
|
|
199
|
+
const composePath = resolve(this.projectRoot, this.composeFile);
|
|
200
|
+
try {
|
|
201
|
+
const cmd = this.getComposeCommand();
|
|
202
|
+
execSync(`${cmd} -f "${composePath}" down`, {
|
|
203
|
+
cwd: this.projectRoot,
|
|
204
|
+
stdio: "pipe",
|
|
205
|
+
});
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
this.logger.warn("Failed to stop containers — stop them manually");
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
isDockerAvailable() {
|
|
212
|
+
try {
|
|
213
|
+
execSync("docker info", { stdio: "pipe" });
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
// --- DB Readiness ---
|
|
221
|
+
async waitForDatabases() {
|
|
222
|
+
// Re-read containers info from compose if not already populated
|
|
223
|
+
if (this.containers.length === 0) {
|
|
224
|
+
this.populateContainersFromConfig();
|
|
225
|
+
}
|
|
226
|
+
for (const container of this.containers) {
|
|
227
|
+
this.logger.info(`Waiting for ${container.engine} (${container.name}) to be ready...`);
|
|
228
|
+
await this.waitForContainer(container);
|
|
229
|
+
this.logger.info(`${container.engine} (${container.name}) is ready`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
async waitForContainer(container, maxRetries = 30) {
|
|
233
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
234
|
+
try {
|
|
235
|
+
if (container.engine === "postgres") {
|
|
236
|
+
execSync(`docker exec ${container.name} pg_isready -U ${container.user} -d ${container.database}`, { stdio: "pipe" });
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
else if (container.engine === "mysql") {
|
|
240
|
+
execSync(`docker exec ${container.name} mysqladmin ping -h localhost -u ${container.user} -p${container.password}`, { stdio: "pipe" });
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
// Not ready yet
|
|
246
|
+
}
|
|
247
|
+
await sleep(1000);
|
|
248
|
+
}
|
|
249
|
+
throw new Error(`[TypeRoad DevServer] Database ${container.name} failed to start within ${maxRetries}s`);
|
|
250
|
+
}
|
|
251
|
+
populateContainersFromConfig() {
|
|
252
|
+
for (const db of this.databases) {
|
|
253
|
+
const defaults = DB_DEFAULTS[db.engine];
|
|
254
|
+
this.containers.push({
|
|
255
|
+
name: db.containerName ?? `typeroad-dev-${db.engine}`,
|
|
256
|
+
port: db.port ?? defaults.port,
|
|
257
|
+
engine: db.engine,
|
|
258
|
+
host: "localhost",
|
|
259
|
+
user: db.user ?? defaults.user,
|
|
260
|
+
password: db.password ?? defaults.password,
|
|
261
|
+
database: db.database ?? defaults.database,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
// --- Migrations ---
|
|
266
|
+
async waitForSequelizeConnection(maxRetries = 15) {
|
|
267
|
+
// Use a raw Sequelize connection to verify readiness
|
|
268
|
+
// without going through getConnection() which triggers runOnConnect migrations
|
|
269
|
+
if (this.containers.length === 0)
|
|
270
|
+
return;
|
|
271
|
+
const container = this.containers[0];
|
|
272
|
+
const { Sequelize } = await import("sequelize");
|
|
273
|
+
for (let i = 0; i < maxRetries; i++) {
|
|
274
|
+
let probe = null;
|
|
275
|
+
try {
|
|
276
|
+
probe = new Sequelize(container.database, container.user, container.password, {
|
|
277
|
+
host: container.host,
|
|
278
|
+
port: container.port,
|
|
279
|
+
dialect: container.engine,
|
|
280
|
+
logging: false,
|
|
281
|
+
});
|
|
282
|
+
await probe.authenticate();
|
|
283
|
+
await probe.close();
|
|
284
|
+
this.logger.info("Database connection verified");
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
if (probe)
|
|
289
|
+
try {
|
|
290
|
+
await probe.close();
|
|
291
|
+
}
|
|
292
|
+
catch { /* ignore */ }
|
|
293
|
+
if (i < maxRetries - 1) {
|
|
294
|
+
await sleep(2000);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
this.logger.warn("Could not verify Sequelize connection — proceeding anyway");
|
|
299
|
+
}
|
|
300
|
+
async runMigrations() {
|
|
301
|
+
// Wait for the actual Sequelize connection to be stable
|
|
302
|
+
await this.waitForSequelizeConnection();
|
|
303
|
+
this.logger.info("Running database migrations...");
|
|
304
|
+
const connections = this.app.getConnections();
|
|
305
|
+
for (const conn of connections) {
|
|
306
|
+
if (conn.engine !== "sequelize")
|
|
307
|
+
continue;
|
|
308
|
+
const seqConn = conn;
|
|
309
|
+
for (const tenant of this.tenants) {
|
|
310
|
+
try {
|
|
311
|
+
const runner = await seqConn.getMigrationRunner(tenant);
|
|
312
|
+
const applied = await runner.up();
|
|
313
|
+
if (applied.length > 0) {
|
|
314
|
+
this.logger.info(`Migrations applied for tenant "${tenant}"`, {
|
|
315
|
+
count: applied.length,
|
|
316
|
+
migrations: applied,
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
this.logger.info(`No pending migrations for tenant "${tenant}"`);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
catch (err) {
|
|
324
|
+
this.logger.warn(`Migration failed for tenant "${tenant}" — continuing`, {
|
|
325
|
+
error: err instanceof Error ? err.message : String(err),
|
|
326
|
+
});
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
// --- Frontend Env Var Logging ---
|
|
332
|
+
printFrontendEnvVars(port) {
|
|
333
|
+
const baseUrl = `http://localhost:${port}`;
|
|
334
|
+
const vars = {
|
|
335
|
+
REACT_APP_API_URL: baseUrl,
|
|
336
|
+
NEXT_PUBLIC_API_URL: baseUrl,
|
|
337
|
+
VITE_API_URL: baseUrl,
|
|
338
|
+
API_BASE_URL: baseUrl,
|
|
339
|
+
...this.frontendVars,
|
|
340
|
+
};
|
|
341
|
+
// Add database connection vars
|
|
342
|
+
for (const container of this.containers) {
|
|
343
|
+
const prefix = container.engine.toUpperCase();
|
|
344
|
+
vars[`${prefix}_HOST`] = container.host;
|
|
345
|
+
vars[`${prefix}_PORT`] = String(container.port);
|
|
346
|
+
vars[`${prefix}_USER`] = container.user;
|
|
347
|
+
vars[`${prefix}_PASSWORD`] = container.password;
|
|
348
|
+
vars[`${prefix}_DATABASE`] = container.database;
|
|
349
|
+
if (container.engine === "postgres") {
|
|
350
|
+
vars.DATABASE_URL = `postgresql://${container.user}:${container.password}@${container.host}:${container.port}/${container.database}`;
|
|
351
|
+
}
|
|
352
|
+
else if (container.engine === "mysql") {
|
|
353
|
+
vars.DATABASE_URL = `mysql://${container.user}:${container.password}@${container.host}:${container.port}/${container.database}`;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
console.log("");
|
|
357
|
+
console.log("┌──────────────────────────────────────────────────────────────┐");
|
|
358
|
+
console.log("│ FRONTEND ENVIRONMENT VARIABLES │");
|
|
359
|
+
console.log("├──────────────────────────────────────────────────────────────┤");
|
|
360
|
+
const envFileLines = [];
|
|
361
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
362
|
+
console.log(`│ ${key}=${value}`);
|
|
363
|
+
envFileLines.push(`${key}=${value}`);
|
|
364
|
+
}
|
|
365
|
+
console.log("├──────────────────────────────────────────────────────────────┤");
|
|
366
|
+
console.log("│ Copy the above to your frontend .env file │");
|
|
367
|
+
console.log("└──────────────────────────────────────────────────────────────┘");
|
|
368
|
+
console.log("");
|
|
369
|
+
// Write .env.local for convenience
|
|
370
|
+
const envPath = resolve(this.projectRoot, ".env.dev");
|
|
371
|
+
writeFileSync(envPath, envFileLines.join("\n") + "\n", "utf-8");
|
|
372
|
+
this.logger.info("Environment variables written to .env.dev", { path: envPath });
|
|
373
|
+
}
|
|
374
|
+
// --- Banner & Summary ---
|
|
375
|
+
printBanner() {
|
|
376
|
+
console.log("");
|
|
377
|
+
console.log(" ╔══════════════════════════════════════╗");
|
|
378
|
+
console.log(" ║ TypeRoad DevServer v1.0 ║");
|
|
379
|
+
console.log(" ║ Local Development Environment ║");
|
|
380
|
+
console.log(" ╚══════════════════════════════════════╝");
|
|
381
|
+
console.log("");
|
|
382
|
+
}
|
|
383
|
+
printSummary(port) {
|
|
384
|
+
console.log("");
|
|
385
|
+
console.log("┌──────────────────────────────────────────────────────────────┐");
|
|
386
|
+
console.log("│ SERVER READY │");
|
|
387
|
+
console.log("├──────────────────────────────────────────────────────────────┤");
|
|
388
|
+
console.log(`│ API: http://localhost:${port}`);
|
|
389
|
+
console.log(`│ Health: http://localhost:${port}/health`);
|
|
390
|
+
for (const container of this.containers) {
|
|
391
|
+
console.log(`│ ${container.engine.toUpperCase()}: ${container.host}:${container.port} (${container.name})`);
|
|
392
|
+
}
|
|
393
|
+
if (this.migrationsPath) {
|
|
394
|
+
console.log(`│ Migrations: ${this.migrationsPath}`);
|
|
395
|
+
}
|
|
396
|
+
console.log("├──────────────────────────────────────────────────────────────┤");
|
|
397
|
+
console.log("│ Press Ctrl+C to stop │");
|
|
398
|
+
console.log("└──────────────────────────────────────────────────────────────┘");
|
|
399
|
+
console.log("");
|
|
400
|
+
}
|
|
401
|
+
// --- GCP Backup Restore ---
|
|
402
|
+
async restoreFromGcp() {
|
|
403
|
+
const cfg = this.gcpRestore;
|
|
404
|
+
const container = this.containers[0];
|
|
405
|
+
if (!container || container.engine !== "postgres") {
|
|
406
|
+
this.logger.warn("GCP restore only supports PostgreSQL containers — skipping");
|
|
407
|
+
return;
|
|
408
|
+
}
|
|
409
|
+
// Check if local DB already has data (skip restore if so)
|
|
410
|
+
if (await this.localDbHasData(container)) {
|
|
411
|
+
this.logger.info("Local database already has data — skipping GCP restore. Delete the Docker volume to force a fresh restore.");
|
|
412
|
+
return;
|
|
413
|
+
}
|
|
414
|
+
this.logger.info("Restoring latest backup from GCP Cloud SQL...");
|
|
415
|
+
// Verify gcloud is available and authenticated
|
|
416
|
+
try {
|
|
417
|
+
execSync("gcloud auth print-access-token", { stdio: "pipe" });
|
|
418
|
+
}
|
|
419
|
+
catch {
|
|
420
|
+
this.logger.warn("gcloud not authenticated — skipping GCP restore. Run: gcloud auth application-default login");
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
const sqlUser = cfg.sqlUser ?? "postgres";
|
|
424
|
+
const dumpFile = resolve(this.projectRoot, ".dev-dump.sql");
|
|
425
|
+
const bucket = cfg.gcsBucket;
|
|
426
|
+
const gcsUri = bucket ? `gs://${bucket}/dev-dump-${Date.now()}.sql` : null;
|
|
427
|
+
try {
|
|
428
|
+
if (gcsUri) {
|
|
429
|
+
// Method 1: gcloud sql export → GCS → download → pg_restore
|
|
430
|
+
this.logger.info(`Exporting ${cfg.sourceDatabase} from Cloud SQL to ${gcsUri}...`);
|
|
431
|
+
execSync(`gcloud sql export sql ${cfg.instance.split(":").pop()} ${gcsUri} --database=${cfg.sourceDatabase} --quiet`, { stdio: "pipe", timeout: 300_000 });
|
|
432
|
+
this.logger.info("Downloading dump from GCS...");
|
|
433
|
+
execSync(`gsutil cp ${gcsUri} ${dumpFile}`, { stdio: "pipe", timeout: 120_000 });
|
|
434
|
+
// Cleanup GCS
|
|
435
|
+
try {
|
|
436
|
+
execSync(`gsutil rm ${gcsUri}`, { stdio: "pipe" });
|
|
437
|
+
}
|
|
438
|
+
catch { /* ignore */ }
|
|
439
|
+
}
|
|
440
|
+
else {
|
|
441
|
+
// Method 2: cloud-sql-proxy + pg_dump (requires proxy running)
|
|
442
|
+
this.logger.info(`Dumping ${cfg.sourceDatabase} via cloud-sql-proxy...`);
|
|
443
|
+
// Try connecting via proxy on port 5432 or use instance connection
|
|
444
|
+
const proxyPort = 5432;
|
|
445
|
+
execSync(`pg_dump "host=localhost port=${proxyPort} user=${sqlUser} dbname=${cfg.sourceDatabase}" --no-owner --no-acl --format=plain > ${dumpFile}`, { stdio: "pipe", shell: "/bin/sh", timeout: 300_000 });
|
|
446
|
+
}
|
|
447
|
+
// Restore into local container
|
|
448
|
+
this.logger.info("Restoring dump into local database...");
|
|
449
|
+
execSync(`docker exec -i ${container.name} psql -U ${container.user} -d ${container.database} < ${dumpFile}`, { stdio: "pipe", shell: "/bin/sh", timeout: 300_000 });
|
|
450
|
+
this.logger.info("GCP backup restored successfully");
|
|
451
|
+
}
|
|
452
|
+
catch (err) {
|
|
453
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
454
|
+
this.logger.warn(`GCP restore failed — continuing without data: ${msg}`);
|
|
455
|
+
}
|
|
456
|
+
finally {
|
|
457
|
+
// Cleanup local dump file
|
|
458
|
+
try {
|
|
459
|
+
const { unlinkSync } = await import("fs");
|
|
460
|
+
unlinkSync(dumpFile);
|
|
461
|
+
}
|
|
462
|
+
catch { /* ignore */ }
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
async localDbHasData(container) {
|
|
466
|
+
try {
|
|
467
|
+
const result = execSync(`docker exec ${container.name} psql -U ${container.user} -d ${container.database} -t -c "SELECT count(*) FROM information_schema.tables WHERE table_schema = 'public'"`, { stdio: "pipe" }).toString().trim();
|
|
468
|
+
return parseInt(result, 10) > 0;
|
|
469
|
+
}
|
|
470
|
+
catch {
|
|
471
|
+
return false;
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
// --- Defaults ---
|
|
476
|
+
const DB_DEFAULTS = {
|
|
477
|
+
postgres: {
|
|
478
|
+
port: 5432,
|
|
479
|
+
user: "typeroad",
|
|
480
|
+
password: "typeroad_dev",
|
|
481
|
+
database: "typeroad_dev",
|
|
482
|
+
image: "postgres:16-alpine",
|
|
483
|
+
},
|
|
484
|
+
mysql: {
|
|
485
|
+
port: 3306,
|
|
486
|
+
user: "typeroad",
|
|
487
|
+
password: "typeroad_dev",
|
|
488
|
+
database: "typeroad_dev",
|
|
489
|
+
image: "mysql:8.0",
|
|
490
|
+
},
|
|
491
|
+
};
|
|
492
|
+
// --- Helpers ---
|
|
493
|
+
function sleep(ms) {
|
|
494
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
495
|
+
}
|
|
496
|
+
//# sourceMappingURL=DevServer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DevServer.js","sourceRoot":"","sources":["../../src/dev/DevServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { SequelizeConnectionManager } from "../database/SequelizeConnectionManager.js";
|
|
2
|
+
export interface MigrationCLIConfig {
|
|
3
|
+
migrationsPath: string;
|
|
4
|
+
connection: SequelizeConnectionManager;
|
|
5
|
+
tenant?: string;
|
|
6
|
+
}
|
|
7
|
+
export declare class MigrationCLI {
|
|
8
|
+
private readonly migrationsPath;
|
|
9
|
+
private readonly connection;
|
|
10
|
+
private readonly tenant;
|
|
11
|
+
constructor(config: MigrationCLIConfig);
|
|
12
|
+
run(args?: string[]): Promise<void>;
|
|
13
|
+
create(name: string): void;
|
|
14
|
+
up(steps?: number): Promise<void>;
|
|
15
|
+
down(steps?: number): Promise<void>;
|
|
16
|
+
status(): Promise<void>;
|
|
17
|
+
private getRunner;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=MigrationCLI.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MigrationCLI.d.ts","sourceRoot":"","sources":["../../src/dev/MigrationCLI.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,2CAA2C,CAAA;AAI3F,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,0BAA0B,CAAA;IACtC,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAID,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4B;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAEnB,MAAM,EAAE,kBAAkB;IAMhC,GAAG,CAAC,IAAI,GAAE,MAAM,EAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IAuChE,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAgBpB,EAAE,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcjC,IAAI,CAAC,KAAK,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAc9B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;YA8Bf,SAAS;CAGxB"}
|