@zintrust/d1-migrator 1.8.2 → 1.8.3
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/dist/cli/DataMigrator.d.ts +1 -0
- package/dist/cli/DataMigrator.d.ts.map +1 -1
- package/dist/cli/DataMigrator.js +31 -2
- package/dist/cli/MigrateToD1Command.d.ts.map +1 -1
- package/dist/cli/MigrateToD1Command.js +27 -8
- package/dist/cli/SchemaAnalyzer.d.ts +3 -1
- package/dist/cli/SchemaAnalyzer.d.ts.map +1 -1
- package/dist/cli/SchemaAnalyzer.js +46 -2
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -9,6 +9,7 @@ import type { MigrationConfig, MigrationProgress } from '../types';
|
|
|
9
9
|
export interface SourceConnection {
|
|
10
10
|
driver: MigrationConfig['sourceDriver'];
|
|
11
11
|
connectionString: string;
|
|
12
|
+
sourceConnectionOrigin?: MigrationConfig['sourceConnectionOrigin'];
|
|
12
13
|
connected: boolean;
|
|
13
14
|
adapter?: DatabaseAdapter;
|
|
14
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataMigrator.d.ts","sourceRoot":"","sources":["../../src/cli/DataMigrator.ts"],"names":[],"mappings":"AACA;;;GAGG;AAWH,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAEnE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,eAAe,CAAC,cAAc,CAAC,CAAC;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,IAAI,GAAG,WAAW,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,kBAAkB,GAAG;IACxB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAChC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,KAAK,eAAe,GAAG;IACrB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACzB,UAAU,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACxE,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;
|
|
1
|
+
{"version":3,"file":"DataMigrator.d.ts","sourceRoot":"","sources":["../../src/cli/DataMigrator.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/DataMigrator.js
CHANGED
|
@@ -10,6 +10,9 @@ import { SQLiteAdapter } from '@zintrust/db-sqlite';
|
|
|
10
10
|
import { SQLServerAdapter } from '@zintrust/db-sqlserver';
|
|
11
11
|
import { SchemaBuilder } from '../schema/SchemaBuilder.js';
|
|
12
12
|
import { SchemaAnalyzer } from './SchemaAnalyzer.js';
|
|
13
|
+
const preserveEncodedMySqlPassword = (origin) => {
|
|
14
|
+
return origin === 'option' || origin === 'env';
|
|
15
|
+
};
|
|
13
16
|
const redactConnectionString = (connectionString) => {
|
|
14
17
|
try {
|
|
15
18
|
const parsed = new URL(connectionString);
|
|
@@ -22,6 +25,25 @@ const redactConnectionString = (connectionString) => {
|
|
|
22
25
|
return connectionString;
|
|
23
26
|
}
|
|
24
27
|
};
|
|
28
|
+
const parseMySqlConnectionDetails = (connectionString, origin) => {
|
|
29
|
+
if (!preserveEncodedMySqlPassword(origin)) {
|
|
30
|
+
return parseConnectionDetails(connectionString, 3306, 'mysql', 'root');
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const parsed = new URL(connectionString);
|
|
34
|
+
const databaseName = decodeURIComponent(parsed.pathname.replace(/^\/+/, ''));
|
|
35
|
+
return {
|
|
36
|
+
host: parsed.hostname || 'localhost',
|
|
37
|
+
port: parsed.port ? Number.parseInt(parsed.port, 10) : 3306,
|
|
38
|
+
database: databaseName || 'mysql',
|
|
39
|
+
username: parsed.username || 'root',
|
|
40
|
+
password: parsed.password || '',
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
throw ErrorFactory.createValidationError('Invalid source connection string format', error);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
25
47
|
const getErrorCause = (error) => {
|
|
26
48
|
if (error === null || typeof error !== 'object') {
|
|
27
49
|
return undefined;
|
|
@@ -95,11 +117,15 @@ const parseSqliteDatabasePath = (connectionString) => {
|
|
|
95
117
|
const createSourceAdapter = (config) => {
|
|
96
118
|
switch (config.sourceDriver) {
|
|
97
119
|
case 'mysql': {
|
|
98
|
-
const connectionDetails =
|
|
120
|
+
const connectionDetails = parseMySqlConnectionDetails(config.sourceConnection, config.sourceConnectionOrigin);
|
|
99
121
|
Logger.info(`[DataMigrator] Source password diagnostics: ${describePasswordForLog(connectionDetails.password)}`);
|
|
100
122
|
return MySQLAdapter.create({
|
|
101
123
|
driver: 'mysql',
|
|
102
|
-
|
|
124
|
+
host: connectionDetails.host,
|
|
125
|
+
port: connectionDetails.port,
|
|
126
|
+
database: connectionDetails.database,
|
|
127
|
+
username: connectionDetails.username,
|
|
128
|
+
password: connectionDetails.password,
|
|
103
129
|
});
|
|
104
130
|
}
|
|
105
131
|
case 'postgresql': {
|
|
@@ -232,6 +258,7 @@ export const DataMigrator = Object.freeze({
|
|
|
232
258
|
const connection = {
|
|
233
259
|
driver: config.sourceDriver,
|
|
234
260
|
connectionString: config.sourceConnection || '',
|
|
261
|
+
sourceConnectionOrigin: config.sourceConnectionOrigin,
|
|
235
262
|
connected: true,
|
|
236
263
|
adapter,
|
|
237
264
|
};
|
|
@@ -280,6 +307,7 @@ export const DataMigrator = Object.freeze({
|
|
|
280
307
|
const sourceSchema = await SchemaAnalyzer.analyzeSchema({
|
|
281
308
|
driver: sourceConnection.driver,
|
|
282
309
|
connectionString: sourceConnection.connectionString,
|
|
310
|
+
sourceConnectionOrigin: sourceConnection.sourceConnectionOrigin,
|
|
283
311
|
});
|
|
284
312
|
const d1Schema = SchemaBuilder.buildD1Schema(sourceSchema.tables, config.sourceDriver);
|
|
285
313
|
SchemaBuilder.assertValidSchema(d1Schema);
|
|
@@ -303,6 +331,7 @@ export const DataMigrator = Object.freeze({
|
|
|
303
331
|
const sourceSchema = await SchemaAnalyzer.analyzeSchema({
|
|
304
332
|
driver: _connection.driver,
|
|
305
333
|
connectionString: _connection.connectionString,
|
|
334
|
+
sourceConnectionOrigin: _connection.sourceConnectionOrigin,
|
|
306
335
|
});
|
|
307
336
|
const tables = sourceSchema.tables.map((table) => ({
|
|
308
337
|
name: table.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MigrateToD1Command.d.ts","sourceRoot":"","sources":["../../src/cli/MigrateToD1Command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,KAAK,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"MigrateToD1Command.d.ts","sourceRoot":"","sources":["../../src/cli/MigrateToD1Command.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAe,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGzC,OAAO,KAAK,EAAE,eAAe,EAA0B,MAAM,UAAU,CAAC;AAOxE,KAAK,iBAAiB,GAAG;IACvB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,IAAI,OAAO,CAAC;IACtB,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CAC/B,CAAC;AAktBF;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAE,iBA6G/B,CAAC;AAEH;;GAEG;AACH,iBAAe,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CActE;AAED;;GAEG;AACH,iBAAe,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAmGxE;AAED;;GAEG;AACH,iBAAe,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkGtE;AAED;;GAEG;AACH,iBAAS,cAAc,CAAC,MAAM,EAAE,eAAe,GAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CA2BrF;AAGD,eAAO,MAAM,iBAAiB;;;;;EAK5B,CAAC"}
|
|
@@ -215,7 +215,10 @@ const parseNetworkConnectionDetails = (connectionString, sourceDriver) => {
|
|
|
215
215
|
return undefined;
|
|
216
216
|
}
|
|
217
217
|
};
|
|
218
|
-
const normalizeSourceConnectionString = (sourceConnection, sourceDriver) => {
|
|
218
|
+
const normalizeSourceConnectionString = (sourceConnection, sourceDriver, origin) => {
|
|
219
|
+
if (origin !== 'db-env') {
|
|
220
|
+
return sourceConnection;
|
|
221
|
+
}
|
|
219
222
|
const details = parseNetworkConnectionDetails(sourceConnection, sourceDriver);
|
|
220
223
|
if (details === undefined) {
|
|
221
224
|
return sourceConnection;
|
|
@@ -234,6 +237,18 @@ const redactConnectionString = (sourceConnection) => {
|
|
|
234
237
|
return sourceConnection;
|
|
235
238
|
}
|
|
236
239
|
};
|
|
240
|
+
const getPasswordForDiagnostics = (sourceConnection, sourceDriver, origin) => {
|
|
241
|
+
if (origin === 'db-env') {
|
|
242
|
+
return parseNetworkConnectionDetails(sourceConnection, sourceDriver)?.password;
|
|
243
|
+
}
|
|
244
|
+
try {
|
|
245
|
+
const parsed = new URL(sourceConnection);
|
|
246
|
+
return parsed.password;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
};
|
|
237
252
|
const describePasswordForLog = (password) => {
|
|
238
253
|
const hasSpecialCharacters = /[^a-zA-Z0-9]/.test(password);
|
|
239
254
|
const containsBang = password.includes('!');
|
|
@@ -267,13 +282,13 @@ const logSourceConnectionDiagnostics = (sourceDriver, sourceConnection, origin,
|
|
|
267
282
|
Logger.info(`[d1-migrator] Source connection origin: ${origin}`);
|
|
268
283
|
Logger.info(`[d1-migrator] Source connection driver: ${sourceDriver}`);
|
|
269
284
|
Logger.info(`[d1-migrator] Source connection (redacted): ${redactConnectionString(sourceConnection)}`);
|
|
270
|
-
const
|
|
271
|
-
const
|
|
272
|
-
if (
|
|
285
|
+
const originalPassword = getPasswordForDiagnostics(originalValue, sourceDriver, origin);
|
|
286
|
+
const finalPassword = getPasswordForDiagnostics(sourceConnection, sourceDriver, origin);
|
|
287
|
+
if (originalPassword === undefined || finalPassword === undefined) {
|
|
273
288
|
Logger.info('[d1-migrator] Source connection diagnostics: non-network source or unable to parse URL');
|
|
274
289
|
return;
|
|
275
290
|
}
|
|
276
|
-
Logger.info(`[d1-migrator] Source password diagnostics: provided(${describePasswordForLog(
|
|
291
|
+
Logger.info(`[d1-migrator] Source password diagnostics: provided(${describePasswordForLog(originalPassword)}), final(${describePasswordForLog(finalPassword)}), matches=${originalPassword === finalPassword}`);
|
|
277
292
|
};
|
|
278
293
|
const normalizeSourceDriver = (value) => {
|
|
279
294
|
if (value === undefined) {
|
|
@@ -391,7 +406,7 @@ const resolveSourceConnection = (options, sourceDriver) => {
|
|
|
391
406
|
const fromOption = readOptionString(options, ['source-connection', 'sourceConnection']);
|
|
392
407
|
if (fromOption !== undefined) {
|
|
393
408
|
return {
|
|
394
|
-
value: normalizeSourceConnectionString(fromOption, sourceDriver),
|
|
409
|
+
value: normalizeSourceConnectionString(fromOption, sourceDriver, 'option'),
|
|
395
410
|
origin: 'option',
|
|
396
411
|
originalValue: fromOption,
|
|
397
412
|
};
|
|
@@ -399,7 +414,7 @@ const resolveSourceConnection = (options, sourceDriver) => {
|
|
|
399
414
|
const fromEnv = readEnvString(SOURCE_CONNECTION_ENV_KEYS);
|
|
400
415
|
if (fromEnv !== undefined) {
|
|
401
416
|
return {
|
|
402
|
-
value: normalizeSourceConnectionString(fromEnv, sourceDriver),
|
|
417
|
+
value: normalizeSourceConnectionString(fromEnv, sourceDriver, 'env'),
|
|
403
418
|
origin: 'env',
|
|
404
419
|
originalValue: fromEnv,
|
|
405
420
|
};
|
|
@@ -407,7 +422,7 @@ const resolveSourceConnection = (options, sourceDriver) => {
|
|
|
407
422
|
const fromDbEnv = buildSourceConnectionFromDbEnv(sourceDriver);
|
|
408
423
|
if (fromDbEnv !== undefined && fromDbEnv.trim().length > 0) {
|
|
409
424
|
return {
|
|
410
|
-
value: normalizeSourceConnectionString(fromDbEnv, sourceDriver),
|
|
425
|
+
value: normalizeSourceConnectionString(fromDbEnv, sourceDriver, 'db-env'),
|
|
411
426
|
origin: 'db-env',
|
|
412
427
|
originalValue: fromDbEnv,
|
|
413
428
|
};
|
|
@@ -459,6 +474,7 @@ const resolveMigrationConfig = (options) => {
|
|
|
459
474
|
return {
|
|
460
475
|
config: {
|
|
461
476
|
sourceConnection: sourceConnectionResolution.value,
|
|
477
|
+
sourceConnectionOrigin: sourceConnectionResolution.origin,
|
|
462
478
|
sourceDriver,
|
|
463
479
|
targetDatabase,
|
|
464
480
|
targetType,
|
|
@@ -514,6 +530,7 @@ export const MigrateToD1Command = BaseCommand.create({
|
|
|
514
530
|
const connection = {
|
|
515
531
|
driver: config.sourceDriver,
|
|
516
532
|
connectionString: config.sourceConnection,
|
|
533
|
+
sourceConnectionOrigin: config.sourceConnectionOrigin,
|
|
517
534
|
};
|
|
518
535
|
// Analyze source schema
|
|
519
536
|
Logger.info('Analyzing source database schema...');
|
|
@@ -599,6 +616,7 @@ async function runInteractiveMode(config) {
|
|
|
599
616
|
const connection = {
|
|
600
617
|
driver: config.sourceDriver,
|
|
601
618
|
connectionString: config.sourceConnection,
|
|
619
|
+
sourceConnectionOrigin: config.sourceConnectionOrigin,
|
|
602
620
|
};
|
|
603
621
|
const sourceSchema = await SchemaAnalyzer.analyzeSchema(connection);
|
|
604
622
|
Logger.info(`Found ${sourceSchema.tables.length} tables to migrate`);
|
|
@@ -675,6 +693,7 @@ async function runAutomatedMode(config) {
|
|
|
675
693
|
const connection = {
|
|
676
694
|
driver: config.sourceDriver,
|
|
677
695
|
connectionString: config.sourceConnection,
|
|
696
|
+
sourceConnectionOrigin: config.sourceConnectionOrigin,
|
|
678
697
|
};
|
|
679
698
|
const sourceSchema = await SchemaAnalyzer.analyzeSchema(connection);
|
|
680
699
|
Logger.info(`✓ Found ${sourceSchema.tables.length} tables to migrate`);
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Schema Analyzer
|
|
3
3
|
* Analyzes database schemas for migration compatibility
|
|
4
4
|
*/
|
|
5
|
-
import type { ColumnSchema, DatabaseSchema, ForeignKeySchema, IndexSchema, TableConstraint, TableRelationship, TableSchema } from '../types';
|
|
5
|
+
import type { ColumnSchema, DatabaseSchema, ForeignKeySchema, IndexSchema, SourceConnectionOrigin, TableConstraint, TableRelationship, TableSchema } from '../types';
|
|
6
6
|
export interface IDatabaseAdapter {
|
|
7
7
|
connect(): Promise<void>;
|
|
8
8
|
disconnect(): Promise<void>;
|
|
@@ -30,6 +30,7 @@ export declare const SchemaAnalyzer: Readonly<{
|
|
|
30
30
|
analyzeSchema(connection: {
|
|
31
31
|
driver: string;
|
|
32
32
|
connectionString: string;
|
|
33
|
+
sourceConnectionOrigin?: SourceConnectionOrigin;
|
|
33
34
|
}): Promise<DatabaseSchema>;
|
|
34
35
|
/**
|
|
35
36
|
* Extract tables from source database
|
|
@@ -37,6 +38,7 @@ export declare const SchemaAnalyzer: Readonly<{
|
|
|
37
38
|
extractTables(connection: {
|
|
38
39
|
driver: string;
|
|
39
40
|
connectionString: string;
|
|
41
|
+
sourceConnectionOrigin?: SourceConnectionOrigin;
|
|
40
42
|
}): Promise<TableSchema[]>;
|
|
41
43
|
/**
|
|
42
44
|
* Extract relationships from source database
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaAnalyzer.d.ts","sourceRoot":"","sources":["../../src/cli/SchemaAnalyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH,OAAO,KAAK,EACV,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,WAAW,EACZ,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"SchemaAnalyzer.d.ts","sourceRoot":"","sources":["../../src/cli/SchemaAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,44 @@ import { MySQLAdapter } from '@zintrust/db-mysql';
|
|
|
7
7
|
import { PostgreSQLAdapter } from '@zintrust/db-postgres';
|
|
8
8
|
import { SQLiteAdapter } from '@zintrust/db-sqlite';
|
|
9
9
|
import { SQLServerAdapter } from '@zintrust/db-sqlserver';
|
|
10
|
+
const preserveEncodedMySqlPassword = (origin) => {
|
|
11
|
+
return origin === 'option' || origin === 'env';
|
|
12
|
+
};
|
|
13
|
+
const parseConnectionDetails = (connectionString, defaultPort, defaultDatabase, defaultUsername) => {
|
|
14
|
+
try {
|
|
15
|
+
const parsed = new URL(connectionString);
|
|
16
|
+
const databaseName = decodeURIComponent(parsed.pathname.replace(/^\/+/, ''));
|
|
17
|
+
return {
|
|
18
|
+
host: parsed.hostname || 'localhost',
|
|
19
|
+
port: parsed.port ? Number.parseInt(parsed.port, 10) : defaultPort,
|
|
20
|
+
database: databaseName || defaultDatabase,
|
|
21
|
+
username: parsed.username ? decodeURIComponent(parsed.username) : defaultUsername,
|
|
22
|
+
password: parsed.password ? decodeURIComponent(parsed.password) : '',
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
throw ErrorFactory.createValidationError('Invalid source connection string format', error);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const parseMySqlConnectionDetails = (connectionString, origin) => {
|
|
30
|
+
if (!preserveEncodedMySqlPassword(origin)) {
|
|
31
|
+
return parseConnectionDetails(connectionString, 3306, 'mysql', 'root');
|
|
32
|
+
}
|
|
33
|
+
try {
|
|
34
|
+
const parsed = new URL(connectionString);
|
|
35
|
+
const databaseName = decodeURIComponent(parsed.pathname.replace(/^\/+/, ''));
|
|
36
|
+
return {
|
|
37
|
+
host: parsed.hostname || 'localhost',
|
|
38
|
+
port: parsed.port ? Number.parseInt(parsed.port, 10) : 3306,
|
|
39
|
+
database: databaseName || 'mysql',
|
|
40
|
+
username: parsed.username || 'root',
|
|
41
|
+
password: parsed.password || '',
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
throw ErrorFactory.createValidationError('Invalid source connection string format', error);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
10
48
|
const redactConnectionString = (connectionString) => {
|
|
11
49
|
try {
|
|
12
50
|
const parsed = new URL(connectionString);
|
|
@@ -81,12 +119,18 @@ export const SchemaAnalyzer = Object.freeze({
|
|
|
81
119
|
// Create appropriate adapter based on driver
|
|
82
120
|
let adapter;
|
|
83
121
|
switch (connection.driver) {
|
|
84
|
-
case 'mysql':
|
|
122
|
+
case 'mysql': {
|
|
123
|
+
const connectionDetails = parseMySqlConnectionDetails(connection.connectionString, connection.sourceConnectionOrigin);
|
|
85
124
|
adapter = MySQLAdapter.create({
|
|
86
125
|
driver: connection.driver,
|
|
87
|
-
|
|
126
|
+
host: connectionDetails.host,
|
|
127
|
+
port: connectionDetails.port,
|
|
128
|
+
database: connectionDetails.database,
|
|
129
|
+
username: connectionDetails.username,
|
|
130
|
+
password: connectionDetails.password,
|
|
88
131
|
});
|
|
89
132
|
break;
|
|
133
|
+
}
|
|
90
134
|
case 'postgresql':
|
|
91
135
|
adapter = PostgreSQLAdapter.create({
|
|
92
136
|
driver: connection.driver,
|
package/dist/types.d.ts
CHANGED
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import type { Command } from 'commander';
|
|
6
6
|
export type SourceDatabaseDriver = 'mysql' | 'postgresql' | 'sqlite' | 'sqlserver';
|
|
7
|
+
export type SourceConnectionOrigin = 'option' | 'env' | 'db-env';
|
|
7
8
|
export interface MigrationConfig {
|
|
8
9
|
sourceConnection: string;
|
|
10
|
+
sourceConnectionOrigin?: SourceConnectionOrigin;
|
|
9
11
|
sourceDriver: SourceDatabaseDriver;
|
|
10
12
|
targetDatabase: string;
|
|
11
13
|
targetType: 'd1' | 'd1-remote';
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|