@byigitt/wbackup 1.0.0

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.
Files changed (49) hide show
  1. package/dist/index.d.ts +10 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +18 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/manager.d.ts +33 -0
  6. package/dist/manager.d.ts.map +1 -0
  7. package/dist/manager.js +114 -0
  8. package/dist/manager.js.map +1 -0
  9. package/dist/registry.d.ts +16 -0
  10. package/dist/registry.d.ts.map +1 -0
  11. package/dist/registry.js +43 -0
  12. package/dist/registry.js.map +1 -0
  13. package/dist/strategies/backup/index.d.ts +7 -0
  14. package/dist/strategies/backup/index.d.ts.map +1 -0
  15. package/dist/strategies/backup/index.js +5 -0
  16. package/dist/strategies/backup/index.js.map +1 -0
  17. package/dist/strategies/backup/mongodb.d.ts +29 -0
  18. package/dist/strategies/backup/mongodb.d.ts.map +1 -0
  19. package/dist/strategies/backup/mongodb.js +80 -0
  20. package/dist/strategies/backup/mongodb.js.map +1 -0
  21. package/dist/strategies/backup/mysql.d.ts +53 -0
  22. package/dist/strategies/backup/mysql.d.ts.map +1 -0
  23. package/dist/strategies/backup/mysql.js +92 -0
  24. package/dist/strategies/backup/mysql.js.map +1 -0
  25. package/dist/strategies/backup/postgresql.d.ts +46 -0
  26. package/dist/strategies/backup/postgresql.d.ts.map +1 -0
  27. package/dist/strategies/backup/postgresql.js +116 -0
  28. package/dist/strategies/backup/postgresql.js.map +1 -0
  29. package/dist/strategies/delivery/discord.d.ts +29 -0
  30. package/dist/strategies/delivery/discord.d.ts.map +1 -0
  31. package/dist/strategies/delivery/discord.js +110 -0
  32. package/dist/strategies/delivery/discord.js.map +1 -0
  33. package/dist/strategies/delivery/index.d.ts +5 -0
  34. package/dist/strategies/delivery/index.d.ts.map +1 -0
  35. package/dist/strategies/delivery/index.js +4 -0
  36. package/dist/strategies/delivery/index.js.map +1 -0
  37. package/dist/strategies/delivery/telegram.d.ts +54 -0
  38. package/dist/strategies/delivery/telegram.d.ts.map +1 -0
  39. package/dist/strategies/delivery/telegram.js +120 -0
  40. package/dist/strategies/delivery/telegram.js.map +1 -0
  41. package/dist/types.d.ts +61 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +2 -0
  44. package/dist/types.js.map +1 -0
  45. package/dist/utils.d.ts +25 -0
  46. package/dist/utils.d.ts.map +1 -0
  47. package/dist/utils.js +114 -0
  48. package/dist/utils.js.map +1 -0
  49. package/package.json +56 -0
@@ -0,0 +1,10 @@
1
+ export { BackupManager, backup } from './manager.js';
2
+ export type { SimpleBackupOptions } from './manager.js';
3
+ export { registry, registerBackupStrategy, registerDeliveryStrategy } from './registry.js';
4
+ export { BackupError } from './utils.js';
5
+ export type { BackupResult, DeliveryResult, BackupMetadata, BackupStrategy, DeliveryStrategy, BackupManagerConfig, BackupManagerResult, OnSuccessCallback, OnErrorCallback, OnProgressCallback, } from './types.js';
6
+ export { MongoBackupStrategy, createMongoBackupStrategy, PostgresBackupStrategy, createPostgresBackupStrategy, MySQLBackupStrategy, createMySQLBackupStrategy, } from './strategies/backup/index.js';
7
+ export type { MongoConfig, PostgresConfig, MySQLConfig, } from './strategies/backup/index.js';
8
+ export { DiscordDeliveryStrategy, createDiscordDeliveryStrategy, TelegramDeliveryStrategy, createTelegramDeliveryStrategy, } from './strategies/delivery/index.js';
9
+ export type { DiscordConfig, TelegramConfig, } from './strategies/delivery/index.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACrD,YAAY,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAE3F,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,YAAY,EACV,YAAY,EACZ,cAAc,EACd,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,GACnB,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,4BAA4B,EAC5B,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EACV,WAAW,EACX,cAAc,EACd,WAAW,GACZ,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,gCAAgC,CAAC;AAExC,YAAY,EACV,aAAa,EACb,cAAc,GACf,MAAM,gCAAgC,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,18 @@
1
+ // Register default strategies
2
+ import { registerBackupStrategy, registerDeliveryStrategy } from './registry.js';
3
+ import { createMongoBackupStrategy } from './strategies/backup/mongodb.js';
4
+ import { createPostgresBackupStrategy } from './strategies/backup/postgresql.js';
5
+ import { createDiscordDeliveryStrategy } from './strategies/delivery/discord.js';
6
+ registerBackupStrategy('mongodb', createMongoBackupStrategy);
7
+ registerBackupStrategy('postgresql', createPostgresBackupStrategy);
8
+ registerBackupStrategy('postgres', createPostgresBackupStrategy);
9
+ registerDeliveryStrategy('discord', createDiscordDeliveryStrategy);
10
+ // Core exports
11
+ export { BackupManager, backup } from './manager.js';
12
+ export { registry, registerBackupStrategy, registerDeliveryStrategy } from './registry.js';
13
+ export { BackupError } from './utils.js';
14
+ // Backup strategy exports
15
+ export { MongoBackupStrategy, createMongoBackupStrategy, PostgresBackupStrategy, createPostgresBackupStrategy, MySQLBackupStrategy, createMySQLBackupStrategy, } from './strategies/backup/index.js';
16
+ // Delivery strategy exports
17
+ export { DiscordDeliveryStrategy, createDiscordDeliveryStrategy, TelegramDeliveryStrategy, createTelegramDeliveryStrategy, } from './strategies/delivery/index.js';
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAEjF,sBAAsB,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC;AAC7D,sBAAsB,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;AACnE,sBAAsB,CAAC,UAAU,EAAE,4BAA4B,CAAC,CAAC;AAEjE,wBAAwB,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;AAEnE,eAAe;AACf,OAAO,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAGrD,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAE3F,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAgBzC,0BAA0B;AAC1B,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,4BAA4B,EAC5B,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,8BAA8B,CAAC;AAQtC,4BAA4B;AAC5B,OAAO,EACL,uBAAuB,EACvB,6BAA6B,EAC7B,wBAAwB,EACxB,8BAA8B,GAC/B,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { BackupManagerResult, OnSuccessCallback, OnErrorCallback, OnProgressCallback } from './types.js';
2
+ export declare class BackupManager {
3
+ private databaseConfig?;
4
+ private deliveryConfig?;
5
+ private shouldCompress;
6
+ private shouldRetainBackup;
7
+ private onSuccessCallback?;
8
+ private onErrorCallback?;
9
+ private onProgressCallback?;
10
+ database(type: string, config: Record<string, unknown>): this;
11
+ delivery(type: string, config: Record<string, unknown>): this;
12
+ compress(enabled: boolean): this;
13
+ retainBackup(enabled: boolean): this;
14
+ onSuccess(callback: OnSuccessCallback): this;
15
+ onError(callback: OnErrorCallback): this;
16
+ onProgress(callback: OnProgressCallback): this;
17
+ run(): Promise<BackupManagerResult>;
18
+ private progress;
19
+ }
20
+ export interface SimpleBackupOptions {
21
+ database: string;
22
+ connectionString: string;
23
+ databaseName?: string;
24
+ webhook: {
25
+ type: string;
26
+ url: string;
27
+ username?: string;
28
+ };
29
+ compress?: boolean;
30
+ retainBackup?: boolean;
31
+ }
32
+ export declare function backup(options: SimpleBackupOptions): Promise<BackupManagerResult>;
33
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAIpB,qBAAa,aAAa;IACxB,OAAO,CAAC,cAAc,CAAC,CAAoD;IAC3E,OAAO,CAAC,cAAc,CAAC,CAAoD;IAC3E,OAAO,CAAC,cAAc,CAAQ;IAC9B,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,iBAAiB,CAAC,CAAoB;IAC9C,OAAO,CAAC,eAAe,CAAC,CAAkB;IAC1C,OAAO,CAAC,kBAAkB,CAAC,CAAqB;IAEhD,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAK7D,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAK7D,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKhC,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAKpC,SAAS,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI;IAK5C,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,IAAI;IAKxC,UAAU,CAAC,QAAQ,EAAE,kBAAkB,GAAG,IAAI;IAKxC,GAAG,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAoEzC,OAAO,CAAC,QAAQ;CAGjB;AAGD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,MAAM,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAoBjF"}
@@ -0,0 +1,114 @@
1
+ import { registry } from './registry.js';
2
+ import { BackupError } from './utils.js';
3
+ export class BackupManager {
4
+ databaseConfig;
5
+ deliveryConfig;
6
+ shouldCompress = true;
7
+ shouldRetainBackup = false;
8
+ onSuccessCallback;
9
+ onErrorCallback;
10
+ onProgressCallback;
11
+ database(type, config) {
12
+ this.databaseConfig = { type, config };
13
+ return this;
14
+ }
15
+ delivery(type, config) {
16
+ this.deliveryConfig = { type, config };
17
+ return this;
18
+ }
19
+ compress(enabled) {
20
+ this.shouldCompress = enabled;
21
+ return this;
22
+ }
23
+ retainBackup(enabled) {
24
+ this.shouldRetainBackup = enabled;
25
+ return this;
26
+ }
27
+ onSuccess(callback) {
28
+ this.onSuccessCallback = callback;
29
+ return this;
30
+ }
31
+ onError(callback) {
32
+ this.onErrorCallback = callback;
33
+ return this;
34
+ }
35
+ onProgress(callback) {
36
+ this.onProgressCallback = callback;
37
+ return this;
38
+ }
39
+ async run() {
40
+ if (!this.databaseConfig) {
41
+ throw new Error('Database configuration is required. Call .database() first.');
42
+ }
43
+ if (!this.deliveryConfig) {
44
+ throw new Error('Delivery configuration is required. Call .delivery() first.');
45
+ }
46
+ const startTime = Date.now();
47
+ const backupStrategy = registry.getBackupStrategy(this.databaseConfig.type);
48
+ const deliveryStrategy = registry.getDeliveryStrategy(this.deliveryConfig.type);
49
+ let backupResult;
50
+ try {
51
+ // Phase 1: Backup
52
+ this.progress('backup', `Starting ${backupStrategy.name} backup...`);
53
+ const backupConfig = { ...this.databaseConfig.config, compress: this.shouldCompress };
54
+ const validatedBackupConfig = backupStrategy.configSchema.parse(backupConfig);
55
+ backupResult = await backupStrategy.backup(validatedBackupConfig);
56
+ this.progress('backup', `Backup completed: ${backupResult.fileName}`);
57
+ // Phase 2: Delivery
58
+ this.progress('delivery', `Sending to ${deliveryStrategy.name}...`);
59
+ const validatedDeliveryConfig = deliveryStrategy.configSchema.parse(this.deliveryConfig.config);
60
+ const deliveryResult = await deliveryStrategy.deliver(validatedDeliveryConfig, backupResult);
61
+ if (!deliveryResult.success) {
62
+ throw new BackupError(deliveryResult.error ?? 'Delivery failed', 'delivery');
63
+ }
64
+ this.progress('delivery', 'Delivery completed successfully');
65
+ // Phase 3: Cleanup
66
+ if (!this.shouldRetainBackup) {
67
+ this.progress('cleanup', 'Cleaning up temporary files...');
68
+ await backupStrategy.cleanup(backupResult.filePath);
69
+ this.progress('cleanup', 'Cleanup completed');
70
+ }
71
+ const result = {
72
+ backup: backupResult,
73
+ delivery: deliveryResult,
74
+ totalDuration: Date.now() - startTime,
75
+ };
76
+ await this.onSuccessCallback?.(result);
77
+ return result;
78
+ }
79
+ catch (error) {
80
+ const phase = error instanceof BackupError ? error.phase : 'backup';
81
+ // Attempt cleanup on failure
82
+ if (backupResult && !this.shouldRetainBackup) {
83
+ await backupStrategy.cleanup(backupResult.filePath).catch(() => { });
84
+ }
85
+ if (this.onErrorCallback) {
86
+ const err = error instanceof Error ? error : new Error(String(error));
87
+ await this.onErrorCallback(err, phase);
88
+ }
89
+ throw error;
90
+ }
91
+ }
92
+ progress(phase, message) {
93
+ this.onProgressCallback?.(phase, message);
94
+ }
95
+ }
96
+ export function backup(options) {
97
+ const manager = new BackupManager()
98
+ .database(options.database, {
99
+ connectionString: options.connectionString,
100
+ database: options.databaseName,
101
+ })
102
+ .delivery(options.webhook.type, {
103
+ webhookUrl: options.webhook.url,
104
+ username: options.webhook.username,
105
+ });
106
+ if (options.compress !== undefined) {
107
+ manager.compress(options.compress);
108
+ }
109
+ if (options.retainBackup !== undefined) {
110
+ manager.retainBackup(options.retainBackup);
111
+ }
112
+ return manager.run();
113
+ }
114
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../src/manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { BackupStrategy, DeliveryStrategy } from './types.js';
2
+ declare class Registry {
3
+ private readonly backupStrategies;
4
+ private readonly deliveryStrategies;
5
+ registerBackup<TConfig>(name: string, factory: () => BackupStrategy<TConfig>): void;
6
+ registerDelivery<TConfig>(name: string, factory: () => DeliveryStrategy<TConfig>): void;
7
+ getBackupStrategy(name: string): BackupStrategy;
8
+ getDeliveryStrategy(name: string): DeliveryStrategy;
9
+ listBackupStrategies(): string[];
10
+ listDeliveryStrategies(): string[];
11
+ }
12
+ export declare const registry: Registry;
13
+ export declare const registerBackupStrategy: <TConfig>(name: string, factory: () => BackupStrategy<TConfig>) => void;
14
+ export declare const registerDeliveryStrategy: <TConfig>(name: string, factory: () => DeliveryStrategy<TConfig>) => void;
15
+ export {};
16
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAGjB,MAAM,YAAY,CAAC;AAEpB,cAAM,QAAQ;IACZ,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA4C;IAC7E,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAA8C;IAEjF,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC,OAAO,CAAC,GAAG,IAAI;IAOnF,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC,OAAO,CAAC,GAAG,IAAI;IAOvF,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,cAAc;IAS/C,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB;IASnD,oBAAoB,IAAI,MAAM,EAAE;IAIhC,sBAAsB,IAAI,MAAM,EAAE;CAGnC;AAED,eAAO,MAAM,QAAQ,UAAiB,CAAC;AAGvC,eAAO,MAAM,sBAAsB,GA5ClB,OAAO,QAAQ,MAAM,WAAW,MAAM,cAAc,CAAC,OAAO,CAAC,KAAG,IA4CL,CAAC;AAC7E,eAAO,MAAM,wBAAwB,GAtClB,OAAO,QAAQ,MAAM,WAAW,MAAM,gBAAgB,CAAC,OAAO,CAAC,KAAG,IAsCL,CAAC"}
@@ -0,0 +1,43 @@
1
+ class Registry {
2
+ backupStrategies = new Map();
3
+ deliveryStrategies = new Map();
4
+ registerBackup(name, factory) {
5
+ if (this.backupStrategies.has(name)) {
6
+ throw new Error(`Backup strategy "${name}" is already registered`);
7
+ }
8
+ this.backupStrategies.set(name, factory);
9
+ }
10
+ registerDelivery(name, factory) {
11
+ if (this.deliveryStrategies.has(name)) {
12
+ throw new Error(`Delivery strategy "${name}" is already registered`);
13
+ }
14
+ this.deliveryStrategies.set(name, factory);
15
+ }
16
+ getBackupStrategy(name) {
17
+ const factory = this.backupStrategies.get(name);
18
+ if (!factory) {
19
+ const available = Array.from(this.backupStrategies.keys()).join(', ');
20
+ throw new Error(`Unknown backup strategy "${name}". Available: ${available || 'none'}`);
21
+ }
22
+ return factory();
23
+ }
24
+ getDeliveryStrategy(name) {
25
+ const factory = this.deliveryStrategies.get(name);
26
+ if (!factory) {
27
+ const available = Array.from(this.deliveryStrategies.keys()).join(', ');
28
+ throw new Error(`Unknown delivery strategy "${name}". Available: ${available || 'none'}`);
29
+ }
30
+ return factory();
31
+ }
32
+ listBackupStrategies() {
33
+ return Array.from(this.backupStrategies.keys());
34
+ }
35
+ listDeliveryStrategies() {
36
+ return Array.from(this.deliveryStrategies.keys());
37
+ }
38
+ }
39
+ export const registry = new Registry();
40
+ // Convenience functions that delegate to the singleton registry
41
+ export const registerBackupStrategy = registry.registerBackup.bind(registry);
42
+ export const registerDeliveryStrategy = registry.registerDelivery.bind(registry);
43
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAOA,MAAM,QAAQ;IACK,gBAAgB,GAAG,IAAI,GAAG,EAAiC,CAAC;IAC5D,kBAAkB,GAAG,IAAI,GAAG,EAAmC,CAAC;IAEjF,cAAc,CAAU,IAAY,EAAE,OAAsC;QAC1E,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,oBAAoB,IAAI,yBAAyB,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,EAAE,OAAgC,CAAC,CAAC;IACpE,CAAC;IAED,gBAAgB,CAAU,IAAY,EAAE,OAAwC;QAC9E,IAAI,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,yBAAyB,CAAC,CAAC;QACvE,CAAC;QACD,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,EAAE,OAAkC,CAAC,CAAC;IACxE,CAAC;IAED,iBAAiB,CAAC,IAAY;QAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC,4BAA4B,IAAI,iBAAiB,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC;QAC1F,CAAC;QACD,OAAO,OAAO,EAAE,CAAC;IACnB,CAAC;IAED,mBAAmB,CAAC,IAAY;QAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxE,MAAM,IAAI,KAAK,CAAC,8BAA8B,IAAI,iBAAiB,SAAS,IAAI,MAAM,EAAE,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,OAAO,EAAE,CAAC;IACnB,CAAC;IAED,oBAAoB;QAClB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,sBAAsB;QACpB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;AAEvC,gEAAgE;AAChE,MAAM,CAAC,MAAM,sBAAsB,GAAG,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC7E,MAAM,CAAC,MAAM,wBAAwB,GAAG,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { MongoBackupStrategy, createMongoBackupStrategy } from './mongodb.js';
2
+ export type { MongoConfig } from './mongodb.js';
3
+ export { PostgresBackupStrategy, createPostgresBackupStrategy } from './postgresql.js';
4
+ export type { PostgresConfig } from './postgresql.js';
5
+ export { MySQLBackupStrategy, createMySQLBackupStrategy } from './mysql.js';
6
+ export type { MySQLConfig } from './mysql.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/strategies/backup/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAC9E,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AACvF,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGtD,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAC5E,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { MongoBackupStrategy, createMongoBackupStrategy } from './mongodb.js';
2
+ export { PostgresBackupStrategy, createPostgresBackupStrategy } from './postgresql.js';
3
+ // Extension stubs - not registered by default
4
+ export { MySQLBackupStrategy, createMySQLBackupStrategy } from './mysql.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/strategies/backup/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AAG9E,OAAO,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAGvF,8CAA8C;AAC9C,OAAO,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { z } from 'zod';
2
+ import type { BackupResult, BackupStrategy } from '../../types.js';
3
+ declare const MongoConfigSchema: z.ZodObject<{
4
+ connectionString: z.ZodString;
5
+ database: z.ZodOptional<z.ZodString>;
6
+ collection: z.ZodOptional<z.ZodString>;
7
+ compress: z.ZodDefault<z.ZodBoolean>;
8
+ authenticationDatabase: z.ZodOptional<z.ZodString>;
9
+ additionalArgs: z.ZodDefault<z.ZodArray<z.ZodString>>;
10
+ }, z.core.$strip>;
11
+ export type MongoConfig = z.infer<typeof MongoConfigSchema>;
12
+ export declare class MongoBackupStrategy implements BackupStrategy<MongoConfig> {
13
+ readonly name = "mongodb";
14
+ readonly configSchema: z.ZodObject<{
15
+ connectionString: z.ZodString;
16
+ database: z.ZodOptional<z.ZodString>;
17
+ collection: z.ZodOptional<z.ZodString>;
18
+ compress: z.ZodDefault<z.ZodBoolean>;
19
+ authenticationDatabase: z.ZodOptional<z.ZodString>;
20
+ additionalArgs: z.ZodDefault<z.ZodArray<z.ZodString>>;
21
+ }, z.core.$strip>;
22
+ backup(config: MongoConfig): Promise<BackupResult>;
23
+ cleanup(filePath: string): Promise<void>;
24
+ private buildArgs;
25
+ private extractDatabaseName;
26
+ }
27
+ export declare function createMongoBackupStrategy(): BackupStrategy<MongoConfig>;
28
+ export {};
29
+ //# sourceMappingURL=mongodb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongodb.d.ts","sourceRoot":"","sources":["../../../src/strategies/backup/mongodb.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AASnE,QAAA,MAAM,iBAAiB;;;;;;;iBAOrB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,qBAAa,mBAAoB,YAAW,cAAc,CAAC,WAAW,CAAC;IACrE,QAAQ,CAAC,IAAI,aAAa;IAC1B,QAAQ,CAAC,YAAY;;;;;;;sBAAqB;IAEpC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAsClD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,mBAAmB;CAa5B;AAED,wBAAgB,yBAAyB,IAAI,cAAc,CAAC,WAAW,CAAC,CAEvE"}
@@ -0,0 +1,80 @@
1
+ import { basename } from 'node:path';
2
+ import { z } from 'zod';
3
+ import { generateTempPath, compressFile, getFileSize, removeFile, runCommand, } from '../../utils.js';
4
+ const MongoConfigSchema = z.object({
5
+ connectionString: z.string().min(1, 'Connection string is required'),
6
+ database: z.string().optional(),
7
+ collection: z.string().optional(),
8
+ compress: z.boolean().default(true),
9
+ authenticationDatabase: z.string().optional(),
10
+ additionalArgs: z.array(z.string()).default([]),
11
+ });
12
+ export class MongoBackupStrategy {
13
+ name = 'mongodb';
14
+ configSchema = MongoConfigSchema;
15
+ async backup(config) {
16
+ const validatedConfig = this.configSchema.parse(config);
17
+ const startTime = Date.now();
18
+ const archivePath = generateTempPath('mongodb-backup', '.archive');
19
+ const args = this.buildArgs(validatedConfig, archivePath);
20
+ await runCommand({
21
+ command: 'mongodump',
22
+ args,
23
+ notFoundMessage: 'mongodump not found. Please install MongoDB Database Tools.',
24
+ });
25
+ let finalPath = archivePath;
26
+ let compressed = false;
27
+ if (validatedConfig.compress) {
28
+ finalPath = await compressFile(archivePath);
29
+ compressed = true;
30
+ }
31
+ const sizeBytes = await getFileSize(finalPath);
32
+ return {
33
+ filePath: finalPath,
34
+ fileName: basename(finalPath),
35
+ sizeBytes,
36
+ database: this.extractDatabaseName(validatedConfig),
37
+ createdAt: new Date(),
38
+ compressed,
39
+ metadata: {
40
+ type: 'mongodb',
41
+ duration: Date.now() - startTime,
42
+ collection: validatedConfig.collection,
43
+ },
44
+ };
45
+ }
46
+ async cleanup(filePath) {
47
+ await removeFile(filePath);
48
+ }
49
+ buildArgs(config, archivePath) {
50
+ const args = [`--uri=${config.connectionString}`, `--archive=${archivePath}`];
51
+ if (config.database) {
52
+ args.push(`--db=${config.database}`);
53
+ }
54
+ if (config.collection) {
55
+ args.push(`--collection=${config.collection}`);
56
+ }
57
+ if (config.authenticationDatabase) {
58
+ args.push(`--authenticationDatabase=${config.authenticationDatabase}`);
59
+ }
60
+ args.push(...config.additionalArgs);
61
+ return args;
62
+ }
63
+ extractDatabaseName(config) {
64
+ if (config.database) {
65
+ return config.database;
66
+ }
67
+ try {
68
+ const url = new URL(config.connectionString);
69
+ const dbFromPath = url.pathname.slice(1).split('?')[0];
70
+ return dbFromPath || 'all-databases';
71
+ }
72
+ catch {
73
+ return 'mongodb';
74
+ }
75
+ }
76
+ }
77
+ export function createMongoBackupStrategy() {
78
+ return new MongoBackupStrategy();
79
+ }
80
+ //# sourceMappingURL=mongodb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongodb.js","sourceRoot":"","sources":["../../../src/strategies/backup/mongodb.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,UAAU,GACX,MAAM,gBAAgB,CAAC;AAExB,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,+BAA+B,CAAC;IACpE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC/B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IACnC,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7C,cAAc,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAChD,CAAC,CAAC;AAIH,MAAM,OAAO,mBAAmB;IACrB,IAAI,GAAG,SAAS,CAAC;IACjB,YAAY,GAAG,iBAAiB,CAAC;IAE1C,KAAK,CAAC,MAAM,CAAC,MAAmB;QAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,MAAM,WAAW,GAAG,gBAAgB,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC;QACnE,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;QAE1D,MAAM,UAAU,CAAC;YACf,OAAO,EAAE,WAAW;YACpB,IAAI;YACJ,eAAe,EAAE,6DAA6D;SAC/E,CAAC,CAAC;QAEH,IAAI,SAAS,GAAG,WAAW,CAAC;QAC5B,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,IAAI,eAAe,CAAC,QAAQ,EAAE,CAAC;YAC7B,SAAS,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC,CAAC;YAC5C,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,CAAC;QAE/C,OAAO;YACL,QAAQ,EAAE,SAAS;YACnB,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC;YAC7B,SAAS;YACT,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,eAAe,CAAC;YACnD,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,UAAU;YACV,QAAQ,EAAE;gBACR,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;gBAChC,UAAU,EAAE,eAAe,CAAC,UAAU;aACvC;SACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,QAAgB;QAC5B,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;IAEO,SAAS,CAAC,MAAmB,EAAE,WAAmB;QACxD,MAAM,IAAI,GAAa,CAAC,SAAS,MAAM,CAAC,gBAAgB,EAAE,EAAE,aAAa,WAAW,EAAE,CAAC,CAAC;QAExF,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QACvC,CAAC;QACD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,gBAAgB,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,IAAI,MAAM,CAAC,sBAAsB,EAAE,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,4BAA4B,MAAM,CAAC,sBAAsB,EAAE,CAAC,CAAC;QACzE,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;QACpC,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,mBAAmB,CAAC,MAAmB;QAC7C,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC,QAAQ,CAAC;QACzB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;YAC7C,MAAM,UAAU,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,OAAO,UAAU,IAAI,eAAe,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAU,yBAAyB;IACvC,OAAO,IAAI,mBAAmB,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * MySQL Backup Strategy
3
+ *
4
+ * Usage:
5
+ * ```typescript
6
+ * import { registerBackupStrategy, createMySQLBackupStrategy } from 'wbackup';
7
+ *
8
+ * registerBackupStrategy('mysql', createMySQLBackupStrategy);
9
+ *
10
+ * const manager = new BackupManager()
11
+ * .database('mysql', {
12
+ * host: 'localhost',
13
+ * user: 'root',
14
+ * password: 'secret',
15
+ * database: 'mydb',
16
+ * })
17
+ * .delivery('discord', { webhookUrl: '...' });
18
+ *
19
+ * await manager.run();
20
+ * ```
21
+ */
22
+ import { z } from 'zod';
23
+ import type { BackupResult, BackupStrategy } from '../../types.js';
24
+ declare const MySQLConfigSchema: z.ZodObject<{
25
+ host: z.ZodDefault<z.ZodString>;
26
+ port: z.ZodDefault<z.ZodNumber>;
27
+ user: z.ZodString;
28
+ password: z.ZodString;
29
+ database: z.ZodString;
30
+ compress: z.ZodDefault<z.ZodBoolean>;
31
+ singleTransaction: z.ZodDefault<z.ZodBoolean>;
32
+ additionalArgs: z.ZodDefault<z.ZodArray<z.ZodString>>;
33
+ }, z.core.$strip>;
34
+ export type MySQLConfig = z.infer<typeof MySQLConfigSchema>;
35
+ export declare class MySQLBackupStrategy implements BackupStrategy<MySQLConfig> {
36
+ readonly name = "mysql";
37
+ readonly configSchema: z.ZodObject<{
38
+ host: z.ZodDefault<z.ZodString>;
39
+ port: z.ZodDefault<z.ZodNumber>;
40
+ user: z.ZodString;
41
+ password: z.ZodString;
42
+ database: z.ZodString;
43
+ compress: z.ZodDefault<z.ZodBoolean>;
44
+ singleTransaction: z.ZodDefault<z.ZodBoolean>;
45
+ additionalArgs: z.ZodDefault<z.ZodArray<z.ZodString>>;
46
+ }, z.core.$strip>;
47
+ backup(config: MySQLConfig): Promise<BackupResult>;
48
+ cleanup(filePath: string): Promise<void>;
49
+ private buildArgs;
50
+ }
51
+ export declare function createMySQLBackupStrategy(): BackupStrategy<MySQLConfig>;
52
+ export {};
53
+ //# sourceMappingURL=mysql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.d.ts","sourceRoot":"","sources":["../../../src/strategies/backup/mysql.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AASnE,QAAA,MAAM,iBAAiB;;;;;;;;;iBASrB,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAE5D,qBAAa,mBAAoB,YAAW,cAAc,CAAC,WAAW,CAAC;IACrE,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,YAAY;;;;;;;;;sBAAqB;IAEpC,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAwClD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,OAAO,CAAC,SAAS;CAiBlB;AAED,wBAAgB,yBAAyB,IAAI,cAAc,CAAC,WAAW,CAAC,CAEvE"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * MySQL Backup Strategy
3
+ *
4
+ * Usage:
5
+ * ```typescript
6
+ * import { registerBackupStrategy, createMySQLBackupStrategy } from 'wbackup';
7
+ *
8
+ * registerBackupStrategy('mysql', createMySQLBackupStrategy);
9
+ *
10
+ * const manager = new BackupManager()
11
+ * .database('mysql', {
12
+ * host: 'localhost',
13
+ * user: 'root',
14
+ * password: 'secret',
15
+ * database: 'mydb',
16
+ * })
17
+ * .delivery('discord', { webhookUrl: '...' });
18
+ *
19
+ * await manager.run();
20
+ * ```
21
+ */
22
+ import { basename } from 'node:path';
23
+ import { z } from 'zod';
24
+ import { generateTempPath, compressFile, getFileSize, removeFile, runCommand, } from '../../utils.js';
25
+ const MySQLConfigSchema = z.object({
26
+ host: z.string().default('localhost'),
27
+ port: z.number().default(3306),
28
+ user: z.string(),
29
+ password: z.string(),
30
+ database: z.string(),
31
+ compress: z.boolean().default(true),
32
+ singleTransaction: z.boolean().default(true),
33
+ additionalArgs: z.array(z.string()).default([]),
34
+ });
35
+ export class MySQLBackupStrategy {
36
+ name = 'mysql';
37
+ configSchema = MySQLConfigSchema;
38
+ async backup(config) {
39
+ const validatedConfig = this.configSchema.parse(config);
40
+ const startTime = Date.now();
41
+ const outputPath = generateTempPath('mysql-backup', '.sql');
42
+ const args = this.buildArgs(validatedConfig, outputPath);
43
+ await runCommand({
44
+ command: 'mysqldump',
45
+ args,
46
+ env: { ...process.env, MYSQL_PWD: validatedConfig.password },
47
+ notFoundMessage: 'mysqldump not found. Please install MySQL client tools.',
48
+ });
49
+ let finalPath = outputPath;
50
+ let compressed = false;
51
+ if (validatedConfig.compress) {
52
+ finalPath = await compressFile(outputPath);
53
+ compressed = true;
54
+ }
55
+ const sizeBytes = await getFileSize(finalPath);
56
+ return {
57
+ filePath: finalPath,
58
+ fileName: basename(finalPath),
59
+ sizeBytes,
60
+ database: validatedConfig.database,
61
+ createdAt: new Date(),
62
+ compressed,
63
+ metadata: {
64
+ type: 'mysql',
65
+ duration: Date.now() - startTime,
66
+ host: validatedConfig.host,
67
+ port: validatedConfig.port,
68
+ },
69
+ };
70
+ }
71
+ async cleanup(filePath) {
72
+ await removeFile(filePath);
73
+ }
74
+ buildArgs(config, outputPath) {
75
+ const args = [
76
+ `--host=${config.host}`,
77
+ `--port=${config.port}`,
78
+ `--user=${config.user}`,
79
+ `--result-file=${outputPath}`,
80
+ ];
81
+ if (config.singleTransaction) {
82
+ args.push('--single-transaction');
83
+ }
84
+ args.push(...config.additionalArgs);
85
+ args.push(config.database);
86
+ return args;
87
+ }
88
+ }
89
+ export function createMySQLBackupStrategy() {
90
+ return new MySQLBackupStrategy();
91
+ }
92
+ //# sourceMappingURL=mysql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mysql.js","sourceRoot":"","sources":["../../../src/strategies/backup/mysql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import { z } from 'zod';
2
+ import type { BackupResult, BackupStrategy } from '../../types.js';
3
+ declare const PostgresConfigSchema: z.ZodObject<{
4
+ connectionString: z.ZodString;
5
+ format: z.ZodDefault<z.ZodEnum<{
6
+ custom: "custom";
7
+ plain: "plain";
8
+ directory: "directory";
9
+ tar: "tar";
10
+ }>>;
11
+ compress: z.ZodDefault<z.ZodBoolean>;
12
+ schema: z.ZodOptional<z.ZodString>;
13
+ table: z.ZodOptional<z.ZodString>;
14
+ dataOnly: z.ZodDefault<z.ZodBoolean>;
15
+ schemaOnly: z.ZodDefault<z.ZodBoolean>;
16
+ clean: z.ZodDefault<z.ZodBoolean>;
17
+ additionalArgs: z.ZodDefault<z.ZodArray<z.ZodString>>;
18
+ }, z.core.$strip>;
19
+ export type PostgresConfig = z.infer<typeof PostgresConfigSchema>;
20
+ export declare class PostgresBackupStrategy implements BackupStrategy<PostgresConfig> {
21
+ readonly name = "postgresql";
22
+ readonly configSchema: z.ZodObject<{
23
+ connectionString: z.ZodString;
24
+ format: z.ZodDefault<z.ZodEnum<{
25
+ custom: "custom";
26
+ plain: "plain";
27
+ directory: "directory";
28
+ tar: "tar";
29
+ }>>;
30
+ compress: z.ZodDefault<z.ZodBoolean>;
31
+ schema: z.ZodOptional<z.ZodString>;
32
+ table: z.ZodOptional<z.ZodString>;
33
+ dataOnly: z.ZodDefault<z.ZodBoolean>;
34
+ schemaOnly: z.ZodDefault<z.ZodBoolean>;
35
+ clean: z.ZodDefault<z.ZodBoolean>;
36
+ additionalArgs: z.ZodDefault<z.ZodArray<z.ZodString>>;
37
+ }, z.core.$strip>;
38
+ backup(config: PostgresConfig): Promise<BackupResult>;
39
+ cleanup(filePath: string): Promise<void>;
40
+ private buildArgs;
41
+ private buildEnv;
42
+ private extractDatabaseName;
43
+ }
44
+ export declare function createPostgresBackupStrategy(): BackupStrategy<PostgresConfig>;
45
+ export {};
46
+ //# sourceMappingURL=postgresql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"postgresql.d.ts","sourceRoot":"","sources":["../../../src/strategies/backup/postgresql.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AASnE,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;iBAUxB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AASlE,qBAAa,sBAAuB,YAAW,cAAc,CAAC,cAAc,CAAC;IAC3E,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,QAAQ,CAAC,YAAY;;;;;;;;;;;;;;;sBAAwB;IAEvC,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,CAAC;IA4CrD,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9C,OAAO,CAAC,SAAS;IA4BjB,OAAO,CAAC,QAAQ;IAehB,OAAO,CAAC,mBAAmB;CAU5B;AAED,wBAAgB,4BAA4B,IAAI,cAAc,CAAC,cAAc,CAAC,CAE7E"}