@datacapy/migrate 0.1.0 → 0.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/README.md +32 -30
- package/dist/cli/command-parser.js +8 -8
- package/dist/index.d.ts +12 -12
- package/dist/index.js +8 -8
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
# @datacapy/migrate
|
|
2
2
|
|
|
3
|
+
Part of the [DataCapy monorepo](https://github.com/datacapy/datacapy).
|
|
4
|
+
|
|
3
5
|
Database migration tool for @datacapy/om applications. Manage schema changes, data transformations, and database versioning across multiple datasources with transaction safety and rollback support.
|
|
4
6
|
|
|
5
7
|
## Features
|
|
6
8
|
|
|
7
|
-
- **Multi-Datasource Support**: Migrate
|
|
9
|
+
- **Multi-Datasource Support**: Migrate main databases, workspace-specific databases, or any custom datasource
|
|
8
10
|
- **Transaction Safety**: Each patch runs in a transaction with automatic rollback on failure
|
|
9
11
|
- **Version Tracking**: Track applied migrations in a metadata table
|
|
10
12
|
- **Dry Run Mode**: Preview changes without applying them
|
|
@@ -66,7 +68,7 @@ export default class AddUsersTable implements DatabasePatchInterface {
|
|
|
66
68
|
### 3. Run Migration
|
|
67
69
|
|
|
68
70
|
```bash
|
|
69
|
-
# Migrate
|
|
71
|
+
# Migrate main database
|
|
70
72
|
pnpm @datacapy/migrate --config ./migrate.config.js --datasource db
|
|
71
73
|
|
|
72
74
|
# Preview changes first
|
|
@@ -87,7 +89,7 @@ pnpm @datacapy/migrate --config ./migrate.config.js --datasource db --verbose
|
|
|
87
89
|
### Required Options
|
|
88
90
|
|
|
89
91
|
- `-c, --config <file>` - Path to migration config file
|
|
90
|
-
- `--datasource <name>` - Target datasource name (e.g., 'db', '
|
|
92
|
+
- `--datasource <name>` - Target datasource name (e.g., 'db', 'workspace')
|
|
91
93
|
|
|
92
94
|
### Optional Options
|
|
93
95
|
|
|
@@ -102,13 +104,13 @@ pnpm @datacapy/migrate --config ./migrate.config.js --datasource db --verbose
|
|
|
102
104
|
### Examples
|
|
103
105
|
|
|
104
106
|
```bash
|
|
105
|
-
# Migrate
|
|
107
|
+
# Migrate main database
|
|
106
108
|
pnpm @datacapy/migrate --config ./migrate.config.js --datasource db
|
|
107
109
|
|
|
108
|
-
# Migrate specific
|
|
110
|
+
# Migrate specific workspace database (dynamic datasource)
|
|
109
111
|
pnpm @datacapy/migrate --config ./migrate.config.js \\
|
|
110
|
-
--datasource
|
|
111
|
-
--context
|
|
112
|
+
--datasource workspace \\
|
|
113
|
+
--context workspaceId=abc123
|
|
112
114
|
|
|
113
115
|
# Dry run to preview changes
|
|
114
116
|
pnpm @datacapy/migrate --config ./migrate.config.js --datasource db --dry-run
|
|
@@ -163,7 +165,7 @@ All patches must implement `DatabasePatchInterface`:
|
|
|
163
165
|
export interface DatabasePatchInterface {
|
|
164
166
|
version: string; // Format: YYYY-MM-DD_HHMM
|
|
165
167
|
description: string; // Human-readable description
|
|
166
|
-
dataSourceName: string; // Target datasource: 'db', '
|
|
168
|
+
dataSourceName: string; // Target datasource: 'db', 'workspace', etc.
|
|
167
169
|
update(modelManager: ModelManager): Promise<void>;
|
|
168
170
|
}
|
|
169
171
|
```
|
|
@@ -272,20 +274,20 @@ export default class SeedDefaultRoles implements DatabasePatchInterface {
|
|
|
272
274
|
}
|
|
273
275
|
```
|
|
274
276
|
|
|
275
|
-
####
|
|
277
|
+
#### Workspace-Specific Migration
|
|
276
278
|
|
|
277
279
|
```typescript
|
|
278
|
-
export default class
|
|
280
|
+
export default class AddWorkspaceStatus implements DatabasePatchInterface {
|
|
279
281
|
version = "2024-02-08_1000";
|
|
280
282
|
description = "Add status field to surveys";
|
|
281
|
-
dataSourceName = "
|
|
283
|
+
dataSourceName = "workspace"; // Targets dynamic workspace datasource
|
|
282
284
|
|
|
283
285
|
async update(modelManager: ModelManager): Promise<void> {
|
|
284
|
-
// Get
|
|
285
|
-
const
|
|
286
|
+
// Get workspace datasource (resolved via CLI --context)
|
|
287
|
+
const workspaceDS = modelManager.getDataSource("workspace");
|
|
286
288
|
|
|
287
|
-
// Update all surveys in this
|
|
288
|
-
await
|
|
289
|
+
// Update all surveys in this workspace
|
|
290
|
+
await workspaceDS.updateMany(
|
|
289
291
|
"surveys",
|
|
290
292
|
{},
|
|
291
293
|
{
|
|
@@ -300,33 +302,33 @@ export default class AddProjectStatus implements DatabasePatchInterface {
|
|
|
300
302
|
|
|
301
303
|
@datacapy/migrate supports migrating multiple datasources independently:
|
|
302
304
|
|
|
303
|
-
###
|
|
305
|
+
### Main-Database Migrations
|
|
304
306
|
|
|
305
|
-
Migrate the main
|
|
307
|
+
Migrate the main database:
|
|
306
308
|
|
|
307
309
|
```bash
|
|
308
310
|
pnpm @datacapy/migrate --config ./migrate.config.js --datasource db
|
|
309
311
|
```
|
|
310
312
|
|
|
311
|
-
###
|
|
313
|
+
### Workspace-Level Migrations
|
|
312
314
|
|
|
313
|
-
Migrate a specific
|
|
315
|
+
Migrate a specific workspace's database:
|
|
314
316
|
|
|
315
317
|
```bash
|
|
316
318
|
pnpm @datacapy/migrate --config ./migrate.config.js \\
|
|
317
|
-
--datasource
|
|
318
|
-
--context
|
|
319
|
+
--datasource workspace \\
|
|
320
|
+
--context workspaceId=abc123
|
|
319
321
|
```
|
|
320
322
|
|
|
321
|
-
### Migrating Multiple
|
|
323
|
+
### Migrating Multiple Workspaces
|
|
322
324
|
|
|
323
325
|
```bash
|
|
324
|
-
# Get all
|
|
325
|
-
for
|
|
326
|
-
echo "Migrating
|
|
326
|
+
# Get all workspace IDs, then migrate each
|
|
327
|
+
for workspaceId in $(get-workspace-ids); do
|
|
328
|
+
echo "Migrating workspace $workspaceId..."
|
|
327
329
|
pnpm @datacapy/migrate --config ./migrate.config.js \\
|
|
328
|
-
--datasource
|
|
329
|
-
--context
|
|
330
|
+
--datasource workspace \\
|
|
331
|
+
--context workspaceId=$workspaceId
|
|
330
332
|
done
|
|
331
333
|
```
|
|
332
334
|
|
|
@@ -562,14 +564,14 @@ export default class SeedData implements DatabasePatchInterface {
|
|
|
562
564
|
|
|
563
565
|
### Migration Fails with "Datasource not found"
|
|
564
566
|
|
|
565
|
-
**Problem:** Cannot find datasource '
|
|
567
|
+
**Problem:** Cannot find datasource 'workspace'
|
|
566
568
|
|
|
567
569
|
**Solution:** Dynamic datasources need context:
|
|
568
570
|
|
|
569
571
|
```bash
|
|
570
572
|
pnpm @datacapy/migrate --config ./migrate.config.js \\
|
|
571
|
-
--datasource
|
|
572
|
-
--context
|
|
573
|
+
--datasource workspace \\
|
|
574
|
+
--context workspaceId=abc123
|
|
573
575
|
```
|
|
574
576
|
|
|
575
577
|
### Patch Throws "Duplicate key error"
|
|
@@ -83,13 +83,13 @@ USAGE:
|
|
|
83
83
|
|
|
84
84
|
REQUIRED OPTIONS:
|
|
85
85
|
-c, --config <file> Path to migration config file
|
|
86
|
-
--datasource <name> Target datasource name (e.g., 'db', '
|
|
86
|
+
--datasource <name> Target datasource name (e.g., 'db', 'workspace')
|
|
87
87
|
|
|
88
88
|
OPTIONAL OPTIONS:
|
|
89
89
|
--context <key=value> Context for dynamic datasources (can be specified multiple times)
|
|
90
|
-
Example: --context
|
|
90
|
+
Example: --context workspaceId=abc123
|
|
91
91
|
--context-lookup <pattern> Lookup pattern for batch migrations across multiple contexts
|
|
92
|
-
Example: --context-lookup "*" (migrate all
|
|
92
|
+
Example: --context-lookup "*" (migrate all workspaces)
|
|
93
93
|
Requires contextResolver to be configured
|
|
94
94
|
-d, --patch-dir <dir> Patch directory (default: ./migrate)
|
|
95
95
|
-t, --target <version> Target version to migrate to (default: latest)
|
|
@@ -100,14 +100,14 @@ OPTIONAL OPTIONS:
|
|
|
100
100
|
--version Show package version
|
|
101
101
|
|
|
102
102
|
EXAMPLES:
|
|
103
|
-
# Migrate
|
|
103
|
+
# Migrate main database
|
|
104
104
|
@datacapy/migrate --config ./migrate.config.js --datasource db
|
|
105
105
|
|
|
106
|
-
# Migrate specific
|
|
107
|
-
@datacapy/migrate --config ./migrate.config.js --datasource
|
|
106
|
+
# Migrate specific workspace database
|
|
107
|
+
@datacapy/migrate --config ./migrate.config.js --datasource workspace --context workspaceId=abc123
|
|
108
108
|
|
|
109
|
-
# Migrate ALL
|
|
110
|
-
@datacapy/migrate --config ./migrate.config.js --datasource
|
|
109
|
+
# Migrate ALL workspace databases (batch migration)
|
|
110
|
+
@datacapy/migrate --config ./migrate.config.js --datasource workspace --context-lookup "*"
|
|
111
111
|
|
|
112
112
|
# Dry run to preview changes
|
|
113
113
|
@datacapy/migrate --config ./migrate.config.js --datasource db --dry-run
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export { MigrationManager } from "./manager/migration-manager
|
|
2
|
-
export { VersionManager } from "./version/version-manager
|
|
3
|
-
export { MetaTable, MetaRecord } from "./meta/meta-table
|
|
4
|
-
export { PatchScanner } from "./scanner/patch-scanner
|
|
5
|
-
export { PatchExecutor } from "./executor/patch-executor
|
|
6
|
-
export { MigrationLogger } from "./logger/migration-logger
|
|
7
|
-
export { DatabasePatchInterface } from "./interface/database-patch
|
|
8
|
-
export { ContextResolver } from "./interface/context-resolver
|
|
9
|
-
export { MigrationConfig, MigrationConfigResolved, } from "./interface/migration-config
|
|
10
|
-
export { MigrationResult, PatchResult, PatchFile, } from "./interface/migration-result
|
|
11
|
-
export { CommandParser, CliArguments } from "./cli/command-parser
|
|
12
|
-
export { CliRunner } from "./cli/runner
|
|
1
|
+
export { MigrationManager } from "./manager/migration-manager";
|
|
2
|
+
export { VersionManager } from "./version/version-manager";
|
|
3
|
+
export { MetaTable, MetaRecord } from "./meta/meta-table";
|
|
4
|
+
export { PatchScanner } from "./scanner/patch-scanner";
|
|
5
|
+
export { PatchExecutor } from "./executor/patch-executor";
|
|
6
|
+
export { MigrationLogger } from "./logger/migration-logger";
|
|
7
|
+
export { DatabasePatchInterface } from "./interface/database-patch";
|
|
8
|
+
export { ContextResolver } from "./interface/context-resolver";
|
|
9
|
+
export { MigrationConfig, MigrationConfigResolved, } from "./interface/migration-config";
|
|
10
|
+
export { MigrationResult, PatchResult, PatchFile, } from "./interface/migration-result";
|
|
11
|
+
export { CommandParser, CliArguments } from "./cli/command-parser";
|
|
12
|
+
export { CliRunner } from "./cli/runner";
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.CliRunner = exports.CommandParser = exports.MigrationLogger = exports.PatchExecutor = exports.PatchScanner = exports.MetaTable = exports.VersionManager = exports.MigrationManager = void 0;
|
|
4
|
-
var migration_manager_1 = require("./manager/migration-manager
|
|
4
|
+
var migration_manager_1 = require("./manager/migration-manager");
|
|
5
5
|
Object.defineProperty(exports, "MigrationManager", { enumerable: true, get: function () { return migration_manager_1.MigrationManager; } });
|
|
6
|
-
var version_manager_1 = require("./version/version-manager
|
|
6
|
+
var version_manager_1 = require("./version/version-manager");
|
|
7
7
|
Object.defineProperty(exports, "VersionManager", { enumerable: true, get: function () { return version_manager_1.VersionManager; } });
|
|
8
|
-
var meta_table_1 = require("./meta/meta-table
|
|
8
|
+
var meta_table_1 = require("./meta/meta-table");
|
|
9
9
|
Object.defineProperty(exports, "MetaTable", { enumerable: true, get: function () { return meta_table_1.MetaTable; } });
|
|
10
|
-
var patch_scanner_1 = require("./scanner/patch-scanner
|
|
10
|
+
var patch_scanner_1 = require("./scanner/patch-scanner");
|
|
11
11
|
Object.defineProperty(exports, "PatchScanner", { enumerable: true, get: function () { return patch_scanner_1.PatchScanner; } });
|
|
12
|
-
var patch_executor_1 = require("./executor/patch-executor
|
|
12
|
+
var patch_executor_1 = require("./executor/patch-executor");
|
|
13
13
|
Object.defineProperty(exports, "PatchExecutor", { enumerable: true, get: function () { return patch_executor_1.PatchExecutor; } });
|
|
14
|
-
var migration_logger_1 = require("./logger/migration-logger
|
|
14
|
+
var migration_logger_1 = require("./logger/migration-logger");
|
|
15
15
|
Object.defineProperty(exports, "MigrationLogger", { enumerable: true, get: function () { return migration_logger_1.MigrationLogger; } });
|
|
16
|
-
var command_parser_1 = require("./cli/command-parser
|
|
16
|
+
var command_parser_1 = require("./cli/command-parser");
|
|
17
17
|
Object.defineProperty(exports, "CommandParser", { enumerable: true, get: function () { return command_parser_1.CommandParser; } });
|
|
18
|
-
var runner_1 = require("./cli/runner
|
|
18
|
+
var runner_1 = require("./cli/runner");
|
|
19
19
|
Object.defineProperty(exports, "CliRunner", { enumerable: true, get: function () { return runner_1.CliRunner; } });
|
|
20
20
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@datacapy/migrate",
|
|
3
3
|
"type": "commonjs",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.1",
|
|
5
5
|
"description": "Datacapy migrate: database migration runner",
|
|
6
6
|
"main": "./dist/index",
|
|
7
7
|
"types": "./dist/index.d.ts",
|
|
@@ -21,16 +21,16 @@
|
|
|
21
21
|
},
|
|
22
22
|
"dependencies": {
|
|
23
23
|
"@datacapy/id": "0.1.0",
|
|
24
|
-
"@datacapy/om": "0.
|
|
24
|
+
"@datacapy/om": "0.2.0"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/jest": "^30.0.0",
|
|
28
|
-
"@types/node": "^
|
|
28
|
+
"@types/node": "^26.6.4",
|
|
29
29
|
"jest": "^30.5.2",
|
|
30
30
|
"prettier": "^3.9.9",
|
|
31
31
|
"ts-jest": "^29.4.14",
|
|
32
32
|
"ts-node": "^10.9.2",
|
|
33
|
-
"tsc-alias": "1.9.
|
|
33
|
+
"tsc-alias": "1.9.1",
|
|
34
34
|
"typescript": "^6.0.3"
|
|
35
35
|
},
|
|
36
36
|
"files": [
|