wfu-migrate 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.
Files changed (110) hide show
  1. package/README.md +199 -0
  2. package/dist/commands/cleanup.d.ts +10 -0
  3. package/dist/commands/cleanup.d.ts.map +1 -0
  4. package/dist/commands/cleanup.js +231 -0
  5. package/dist/commands/cleanup.js.map +1 -0
  6. package/dist/commands/config.d.ts +15 -0
  7. package/dist/commands/config.d.ts.map +1 -0
  8. package/dist/commands/config.js +285 -0
  9. package/dist/commands/config.js.map +1 -0
  10. package/dist/commands/doctor.d.ts +15 -0
  11. package/dist/commands/doctor.d.ts.map +1 -0
  12. package/dist/commands/doctor.js +234 -0
  13. package/dist/commands/doctor.js.map +1 -0
  14. package/dist/commands/env-migrate.d.ts +37 -0
  15. package/dist/commands/env-migrate.d.ts.map +1 -0
  16. package/dist/commands/env-migrate.js +703 -0
  17. package/dist/commands/env-migrate.js.map +1 -0
  18. package/dist/commands/migrate.d.ts +19 -0
  19. package/dist/commands/migrate.d.ts.map +1 -0
  20. package/dist/commands/migrate.js +374 -0
  21. package/dist/commands/migrate.js.map +1 -0
  22. package/dist/index.d.ts +15 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +31 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/lib/compress.d.ts +86 -0
  27. package/dist/lib/compress.d.ts.map +1 -0
  28. package/dist/lib/compress.js +203 -0
  29. package/dist/lib/compress.js.map +1 -0
  30. package/dist/lib/config-manager.d.ts +34 -0
  31. package/dist/lib/config-manager.d.ts.map +1 -0
  32. package/dist/lib/config-manager.js +332 -0
  33. package/dist/lib/config-manager.js.map +1 -0
  34. package/dist/lib/database.d.ts +460 -0
  35. package/dist/lib/database.d.ts.map +1 -0
  36. package/dist/lib/database.js +1267 -0
  37. package/dist/lib/database.js.map +1 -0
  38. package/dist/lib/docker.d.ts +240 -0
  39. package/dist/lib/docker.d.ts.map +1 -0
  40. package/dist/lib/docker.js +653 -0
  41. package/dist/lib/docker.js.map +1 -0
  42. package/dist/lib/health.d.ts +99 -0
  43. package/dist/lib/health.d.ts.map +1 -0
  44. package/dist/lib/health.js +139 -0
  45. package/dist/lib/health.js.map +1 -0
  46. package/dist/lib/logger.d.ts +105 -0
  47. package/dist/lib/logger.d.ts.map +1 -0
  48. package/dist/lib/logger.js +259 -0
  49. package/dist/lib/logger.js.map +1 -0
  50. package/dist/lib/migration-engine.d.ts +130 -0
  51. package/dist/lib/migration-engine.d.ts.map +1 -0
  52. package/dist/lib/migration-engine.js +1175 -0
  53. package/dist/lib/migration-engine.js.map +1 -0
  54. package/dist/lib/parallel.d.ts +85 -0
  55. package/dist/lib/parallel.d.ts.map +1 -0
  56. package/dist/lib/parallel.js +138 -0
  57. package/dist/lib/parallel.js.map +1 -0
  58. package/dist/lib/progress.d.ts +101 -0
  59. package/dist/lib/progress.d.ts.map +1 -0
  60. package/dist/lib/progress.js +179 -0
  61. package/dist/lib/progress.js.map +1 -0
  62. package/dist/lib/prompt.d.ts +71 -0
  63. package/dist/lib/prompt.d.ts.map +1 -0
  64. package/dist/lib/prompt.js +116 -0
  65. package/dist/lib/prompt.js.map +1 -0
  66. package/dist/lib/retry.d.ts +61 -0
  67. package/dist/lib/retry.d.ts.map +1 -0
  68. package/dist/lib/retry.js +136 -0
  69. package/dist/lib/retry.js.map +1 -0
  70. package/dist/lib/s3.d.ts +238 -0
  71. package/dist/lib/s3.d.ts.map +1 -0
  72. package/dist/lib/s3.js +507 -0
  73. package/dist/lib/s3.js.map +1 -0
  74. package/dist/lib/serialized.d.ts +114 -0
  75. package/dist/lib/serialized.d.ts.map +1 -0
  76. package/dist/lib/serialized.js +236 -0
  77. package/dist/lib/serialized.js.map +1 -0
  78. package/dist/lib/shutdown.d.ts +78 -0
  79. package/dist/lib/shutdown.d.ts.map +1 -0
  80. package/dist/lib/shutdown.js +153 -0
  81. package/dist/lib/shutdown.js.map +1 -0
  82. package/dist/lib/site-filter.d.ts +98 -0
  83. package/dist/lib/site-filter.d.ts.map +1 -0
  84. package/dist/lib/site-filter.js +213 -0
  85. package/dist/lib/site-filter.js.map +1 -0
  86. package/dist/lib/spinner.d.ts +174 -0
  87. package/dist/lib/spinner.d.ts.map +1 -0
  88. package/dist/lib/spinner.js +273 -0
  89. package/dist/lib/spinner.js.map +1 -0
  90. package/dist/lib/state.d.ts +363 -0
  91. package/dist/lib/state.d.ts.map +1 -0
  92. package/dist/lib/state.js +905 -0
  93. package/dist/lib/state.js.map +1 -0
  94. package/dist/lib/system.d.ts +227 -0
  95. package/dist/lib/system.d.ts.map +1 -0
  96. package/dist/lib/system.js +636 -0
  97. package/dist/lib/system.js.map +1 -0
  98. package/dist/lib/url-patterns.d.ts +46 -0
  99. package/dist/lib/url-patterns.d.ts.map +1 -0
  100. package/dist/lib/url-patterns.js +259 -0
  101. package/dist/lib/url-patterns.js.map +1 -0
  102. package/dist/lib/wp-tables.d.ts +139 -0
  103. package/dist/lib/wp-tables.d.ts.map +1 -0
  104. package/dist/lib/wp-tables.js +296 -0
  105. package/dist/lib/wp-tables.js.map +1 -0
  106. package/dist/types/index.d.ts +96 -0
  107. package/dist/types/index.d.ts.map +1 -0
  108. package/dist/types/index.js +46 -0
  109. package/dist/types/index.js.map +1 -0
  110. package/package.json +58 -0
@@ -0,0 +1,213 @@
1
+ /**
2
+ * Site filtering utilities for WFU-Migrate
3
+ *
4
+ * Handles:
5
+ * - Parsing site ID lists from CLI arguments
6
+ * - Combining include and exclude filters
7
+ * - Validating site IDs
8
+ *
9
+ * Filter Precedence:
10
+ * When both --include-sites and --exclude-sites are specified,
11
+ * exclusions take precedence. This means:
12
+ * - If a site is in both lists, it is excluded
13
+ * - The resulting set is: include ∩ ¬exclude
14
+ */
15
+ /**
16
+ * Parse a comma-separated list of site IDs.
17
+ * Supports formats: "1,2,3" or "1, 2, 3"
18
+ * Returns empty array for empty/undefined input.
19
+ */
20
+ export function parseSiteList(input) {
21
+ if (!input || input.trim() === '') {
22
+ return [];
23
+ }
24
+ return input
25
+ .split(',')
26
+ .map(s => s.trim())
27
+ .filter(s => s.length > 0)
28
+ .map(s => parseInt(s, 10))
29
+ .filter(n => !isNaN(n) && n > 0);
30
+ }
31
+ /**
32
+ * Apply site filters to get the final list of sites to migrate.
33
+ *
34
+ * Logic:
35
+ * 1. Start with allSites (or includeSites if allSites not provided)
36
+ * 2. If includeSites is specified, intersect with allSites
37
+ * 3. If activeOnly is true, filter to only active sites
38
+ * 4. Remove any sites in excludeSites
39
+ *
40
+ * Filter precedence (most restrictive wins):
41
+ * - Exclusions always take precedence
42
+ * - activeOnly filters after include
43
+ */
44
+ export function applySiteFilters(options) {
45
+ const { includeSites, excludeSites, allSites, activeSites, activeOnly } = options;
46
+ const excludeSet = new Set(excludeSites || []);
47
+ const activeSet = new Set(activeSites || []);
48
+ let workingSet;
49
+ if (includeSites && includeSites.length > 0) {
50
+ if (allSites && allSites.length > 0) {
51
+ const allSet = new Set(allSites);
52
+ workingSet = includeSites.filter(id => allSet.has(id));
53
+ }
54
+ else {
55
+ workingSet = [...includeSites];
56
+ }
57
+ }
58
+ else if (allSites && allSites.length > 0) {
59
+ workingSet = [...allSites];
60
+ }
61
+ else {
62
+ workingSet = [];
63
+ }
64
+ if (activeOnly && activeSites && activeSites.length > 0) {
65
+ workingSet = workingSet.filter(id => activeSet.has(id));
66
+ }
67
+ const excluded = [];
68
+ const included = [];
69
+ for (const siteId of workingSet) {
70
+ if (excludeSet.has(siteId)) {
71
+ excluded.push(siteId);
72
+ }
73
+ else {
74
+ included.push(siteId);
75
+ }
76
+ }
77
+ return {
78
+ sites: included,
79
+ excluded,
80
+ included,
81
+ };
82
+ }
83
+ /**
84
+ * Filter sites by active status.
85
+ * Used when --active-only flag is specified.
86
+ */
87
+ export function filterActiveSites(siteIds, activeSiteIds) {
88
+ const activeSet = new Set(activeSiteIds);
89
+ return siteIds.filter(id => activeSet.has(id));
90
+ }
91
+ /**
92
+ * Check if a site is active.
93
+ */
94
+ export function isSiteActive(siteId, activeSiteIds) {
95
+ return activeSiteIds.includes(siteId);
96
+ }
97
+ /**
98
+ * Validate that all site IDs in a list are valid (positive integers).
99
+ */
100
+ export function validateSiteIds(siteIds) {
101
+ const invalid = siteIds.filter(id => !Number.isInteger(id) || id < 1);
102
+ return {
103
+ valid: invalid.length === 0,
104
+ invalid,
105
+ };
106
+ }
107
+ /**
108
+ * Format site list for display.
109
+ */
110
+ export function formatSiteList(siteIds) {
111
+ if (siteIds.length === 0) {
112
+ return 'none';
113
+ }
114
+ if (siteIds.length <= 5) {
115
+ return siteIds.join(', ');
116
+ }
117
+ return `${siteIds.slice(0, 5).join(', ')}... (${siteIds.length} total)`;
118
+ }
119
+ /**
120
+ * Check if the site filter result is empty and determine the reason.
121
+ */
122
+ export function checkEmptySiteList(result, options) {
123
+ if (result.sites.length > 0) {
124
+ return { isEmpty: false };
125
+ }
126
+ const { includeSites, excludeSites, allSites, activeSites, activeOnly } = options;
127
+ if (!allSites || allSites.length === 0) {
128
+ return {
129
+ isEmpty: true,
130
+ reason: 'no_sites_in_database',
131
+ message: 'No sites found in the database.',
132
+ };
133
+ }
134
+ if (includeSites && includeSites.length > 0) {
135
+ const allSet = new Set(allSites);
136
+ const matchingInclude = includeSites.filter(id => allSet.has(id));
137
+ if (matchingInclude.length === 0) {
138
+ return {
139
+ isEmpty: true,
140
+ reason: 'include_filter_no_match',
141
+ message: `No sites match the --include-sites filter. ` +
142
+ `Specified: ${formatSiteList(includeSites)}. ` +
143
+ `Available: ${formatSiteList(allSites)}.`,
144
+ };
145
+ }
146
+ }
147
+ if (activeOnly && activeSites && activeSites.length === 0) {
148
+ return {
149
+ isEmpty: true,
150
+ reason: 'active_only_none_active',
151
+ message: 'No active sites found. All sites in the database are inactive.',
152
+ };
153
+ }
154
+ if (excludeSites && excludeSites.length > 0 && result.excluded.length === allSites.length) {
155
+ return {
156
+ isEmpty: true,
157
+ reason: 'exclude_filter_all',
158
+ message: `All sites were excluded by --exclude-sites filter. ` +
159
+ `Excluded: ${formatSiteList(excludeSites)}.`,
160
+ };
161
+ }
162
+ return {
163
+ isEmpty: true,
164
+ reason: 'all_filtered_out',
165
+ message: 'All sites were filtered out by the combination of filters.',
166
+ };
167
+ }
168
+ /**
169
+ * Format a message for empty site list situations.
170
+ */
171
+ export function formatEmptySiteListMessage(result) {
172
+ if (!result.isEmpty || !result.message) {
173
+ return '';
174
+ }
175
+ return `No sites to migrate.\n\n${result.message}\n\n` +
176
+ `Suggestions:\n` +
177
+ ` - Check the --include-sites values match actual site IDs\n` +
178
+ ` - Remove filters to see all available sites\n` +
179
+ ` - Run 'wfu-migrate list-sites' to see available sites`;
180
+ }
181
+ /**
182
+ * Check if there are any sites to migrate after filtering.
183
+ */
184
+ export function hasSitesToMigrate(result) {
185
+ return result.sites.length > 0;
186
+ }
187
+ /**
188
+ * Get count of sites to migrate.
189
+ */
190
+ export function getSiteCount(result) {
191
+ return result.sites.length;
192
+ }
193
+ /**
194
+ * Build a summary of filter application.
195
+ */
196
+ export function buildFilterSummary(result, options) {
197
+ const lines = [];
198
+ const totalAvailable = options.allSites?.length ?? 0;
199
+ const selected = result.sites.length;
200
+ const excluded = result.excluded.length;
201
+ lines.push(`Sites: ${selected}/${totalAvailable} selected`);
202
+ if (options.includeSites && options.includeSites.length > 0) {
203
+ lines.push(` Include filter: ${formatSiteList(options.includeSites)}`);
204
+ }
205
+ if (excluded > 0) {
206
+ lines.push(` Excluded: ${excluded}`);
207
+ }
208
+ if (options.activeOnly) {
209
+ lines.push(` Active only: yes`);
210
+ }
211
+ return lines.join('\n');
212
+ }
213
+ //# sourceMappingURL=site-filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"site-filter.js","sourceRoot":"","sources":["../../src/lib/site-filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Spinner utilities for WFU-Migrate
3
+ *
4
+ * Handles:
5
+ * - Progress spinner during long-running operations
6
+ * - Operation status updates
7
+ * - Success/failure indicators
8
+ *
9
+ * Uses ora for terminal spinner animations.
10
+ */
11
+ import { type Ora } from 'ora';
12
+ /**
13
+ * Operation names for common migration tasks.
14
+ */
15
+ export declare const OPERATION_NAMES: {
16
+ readonly EXPORTING: "Exporting database tables";
17
+ readonly IMPORTING: "Importing into migration database";
18
+ readonly SEARCH_REPLACE: "Running URL replacements";
19
+ readonly BACKUP: "Creating target backup";
20
+ readonly COMPRESSING: "Compressing SQL files";
21
+ readonly UPLOADING: "Uploading to S3";
22
+ readonly SYNCING_FILES: "Syncing WordPress files";
23
+ readonly CONNECTING: "Testing database connection";
24
+ readonly LISTING_TABLES: "Listing site tables";
25
+ readonly CLEANING: "Cleaning up temporary files";
26
+ };
27
+ export type OperationName = typeof OPERATION_NAMES[keyof typeof OPERATION_NAMES];
28
+ /**
29
+ * Spinner options for customization.
30
+ */
31
+ export interface SpinnerOptions {
32
+ color?: 'cyan' | 'green' | 'yellow' | 'red' | 'blue' | 'magenta' | 'white';
33
+ spinner?: 'dots' | 'dots2' | 'dots3' | 'line' | 'pipe' | 'simpleDots' | 'simpleDotsScrolling';
34
+ }
35
+ /**
36
+ * Start a new spinner with the given text.
37
+ * Stops any existing spinner before starting new one.
38
+ */
39
+ export declare function startSpinner(text: string, options?: SpinnerOptions): Ora;
40
+ /**
41
+ * Update the current spinner text.
42
+ * No-op if no spinner is active.
43
+ */
44
+ export declare function updateSpinner(text: string): void;
45
+ /**
46
+ * Mark the current spinner as successful.
47
+ * Displays a checkmark with the success message.
48
+ */
49
+ export declare function succeedSpinner(text?: string): void;
50
+ /**
51
+ * Mark the current spinner as failed.
52
+ * Displays an X with the failure message.
53
+ */
54
+ export declare function failSpinner(text?: string): void;
55
+ /**
56
+ * Mark the current spinner as warning.
57
+ * Displays a warning symbol with the message.
58
+ */
59
+ export declare function warnSpinner(text?: string): void;
60
+ /**
61
+ * Mark the current spinner as info.
62
+ * Displays an info symbol with the message.
63
+ */
64
+ export declare function infoSpinner(text?: string): void;
65
+ /**
66
+ * Stop the current spinner without any symbol.
67
+ */
68
+ export declare function stopSpinner(): void;
69
+ /**
70
+ * Check if a spinner is currently active.
71
+ */
72
+ export declare function isSpinnerActive(): boolean;
73
+ /**
74
+ * Get the current spinner instance.
75
+ * Returns null if no spinner is active.
76
+ */
77
+ export declare function getSpinner(): Ora | null;
78
+ /**
79
+ * Create a spinner wrapper for an operation name.
80
+ */
81
+ export declare function createOperationSpinner(operation: OperationName): Ora;
82
+ /**
83
+ * Run an async operation with a spinner.
84
+ * Shows success on completion, failure on error.
85
+ */
86
+ export declare function withSpinner<T>(text: string, operation: () => Promise<T>, successText?: string, failText?: string): Promise<T>;
87
+ /**
88
+ * Build spinner text with operation and details.
89
+ * Example: "Exporting database tables (15 tables)"
90
+ */
91
+ export declare function buildSpinnerText(operation: string, details?: string): string;
92
+ /**
93
+ * Build spinner text with progress.
94
+ * Example: "Exporting database tables [3/15]"
95
+ */
96
+ export declare function buildProgressText(operation: string, current: number, total: number): string;
97
+ /**
98
+ * Build spinner text with percentage.
99
+ * Example: "Uploading to S3 (75%)"
100
+ */
101
+ export declare function buildPercentageText(operation: string, percent: number): string;
102
+ /**
103
+ * Step indicator symbols for migration workflow.
104
+ */
105
+ export declare const STEP_SYMBOLS: {
106
+ readonly PENDING: "○";
107
+ readonly IN_PROGRESS: "◐";
108
+ readonly COMPLETED: "✓";
109
+ readonly FAILED: "✗";
110
+ readonly SKIPPED: "◌";
111
+ };
112
+ export type StepStatus = keyof typeof STEP_SYMBOLS;
113
+ /**
114
+ * Get the symbol for a step status.
115
+ */
116
+ export declare function getStepSymbol(status: StepStatus): string;
117
+ /**
118
+ * Step definition for tracking workflow progress.
119
+ */
120
+ export interface WorkflowStep {
121
+ name: string;
122
+ status: StepStatus;
123
+ duration?: number;
124
+ error?: string;
125
+ }
126
+ /**
127
+ * Create a new workflow step.
128
+ */
129
+ export declare function createStep(name: string): WorkflowStep;
130
+ /**
131
+ * Update step status.
132
+ */
133
+ export declare function updateStepStatus(step: WorkflowStep, status: StepStatus, options?: {
134
+ duration?: number;
135
+ error?: string;
136
+ }): WorkflowStep;
137
+ /**
138
+ * Format a single step for display.
139
+ * Example: "✓ Exporting database tables (1.5s)"
140
+ */
141
+ export declare function formatStep(step: WorkflowStep): string;
142
+ /**
143
+ * Format multiple steps for display.
144
+ */
145
+ export declare function formatSteps(steps: WorkflowStep[]): string;
146
+ /**
147
+ * Standard migration workflow steps.
148
+ */
149
+ export declare const MIGRATION_STEPS: readonly ["Connecting to source database", "Listing site tables", "Exporting database tables", "Importing into migration database", "Running URL replacements", "Creating target backup", "Importing to target database", "Compressing SQL files", "Uploading to S3 archive", "Cleaning up temporary files"];
150
+ /**
151
+ * Create workflow steps from standard migration steps.
152
+ */
153
+ export declare function createMigrationSteps(): WorkflowStep[];
154
+ /**
155
+ * Find the current step (first pending or in-progress step).
156
+ */
157
+ export declare function findCurrentStep(steps: WorkflowStep[]): WorkflowStep | undefined;
158
+ /**
159
+ * Count completed steps.
160
+ */
161
+ export declare function countCompletedSteps(steps: WorkflowStep[]): number;
162
+ /**
163
+ * Count failed steps.
164
+ */
165
+ export declare function countFailedSteps(steps: WorkflowStep[]): number;
166
+ /**
167
+ * Check if all steps are completed (no failures).
168
+ */
169
+ export declare function areAllStepsCompleted(steps: WorkflowStep[]): boolean;
170
+ /**
171
+ * Check if any step has failed.
172
+ */
173
+ export declare function hasStepFailed(steps: WorkflowStep[]): boolean;
174
+ //# sourceMappingURL=spinner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Spinner utilities for WFU-Migrate
3
+ *
4
+ * Handles:
5
+ * - Progress spinner during long-running operations
6
+ * - Operation status updates
7
+ * - Success/failure indicators
8
+ *
9
+ * Uses ora for terminal spinner animations.
10
+ */
11
+ import ora from 'ora';
12
+ /**
13
+ * Spinner state for tracking current spinner instance.
14
+ */
15
+ let currentSpinner = null;
16
+ /**
17
+ * Operation names for common migration tasks.
18
+ */
19
+ export const OPERATION_NAMES = {
20
+ EXPORTING: 'Exporting database tables',
21
+ IMPORTING: 'Importing into migration database',
22
+ SEARCH_REPLACE: 'Running URL replacements',
23
+ BACKUP: 'Creating target backup',
24
+ COMPRESSING: 'Compressing SQL files',
25
+ UPLOADING: 'Uploading to S3',
26
+ SYNCING_FILES: 'Syncing WordPress files',
27
+ CONNECTING: 'Testing database connection',
28
+ LISTING_TABLES: 'Listing site tables',
29
+ CLEANING: 'Cleaning up temporary files',
30
+ };
31
+ /**
32
+ * Start a new spinner with the given text.
33
+ * Stops any existing spinner before starting new one.
34
+ */
35
+ export function startSpinner(text, options) {
36
+ if (currentSpinner) {
37
+ currentSpinner.stop();
38
+ }
39
+ currentSpinner = ora({
40
+ text,
41
+ color: options?.color ?? 'cyan',
42
+ spinner: options?.spinner ?? 'dots',
43
+ }).start();
44
+ return currentSpinner;
45
+ }
46
+ /**
47
+ * Update the current spinner text.
48
+ * No-op if no spinner is active.
49
+ */
50
+ export function updateSpinner(text) {
51
+ if (currentSpinner) {
52
+ currentSpinner.text = text;
53
+ }
54
+ }
55
+ /**
56
+ * Mark the current spinner as successful.
57
+ * Displays a checkmark with the success message.
58
+ */
59
+ export function succeedSpinner(text) {
60
+ if (currentSpinner) {
61
+ currentSpinner.succeed(text);
62
+ currentSpinner = null;
63
+ }
64
+ }
65
+ /**
66
+ * Mark the current spinner as failed.
67
+ * Displays an X with the failure message.
68
+ */
69
+ export function failSpinner(text) {
70
+ if (currentSpinner) {
71
+ currentSpinner.fail(text);
72
+ currentSpinner = null;
73
+ }
74
+ }
75
+ /**
76
+ * Mark the current spinner as warning.
77
+ * Displays a warning symbol with the message.
78
+ */
79
+ export function warnSpinner(text) {
80
+ if (currentSpinner) {
81
+ currentSpinner.warn(text);
82
+ currentSpinner = null;
83
+ }
84
+ }
85
+ /**
86
+ * Mark the current spinner as info.
87
+ * Displays an info symbol with the message.
88
+ */
89
+ export function infoSpinner(text) {
90
+ if (currentSpinner) {
91
+ currentSpinner.info(text);
92
+ currentSpinner = null;
93
+ }
94
+ }
95
+ /**
96
+ * Stop the current spinner without any symbol.
97
+ */
98
+ export function stopSpinner() {
99
+ if (currentSpinner) {
100
+ currentSpinner.stop();
101
+ currentSpinner = null;
102
+ }
103
+ }
104
+ /**
105
+ * Check if a spinner is currently active.
106
+ */
107
+ export function isSpinnerActive() {
108
+ return currentSpinner !== null && currentSpinner.isSpinning;
109
+ }
110
+ /**
111
+ * Get the current spinner instance.
112
+ * Returns null if no spinner is active.
113
+ */
114
+ export function getSpinner() {
115
+ return currentSpinner;
116
+ }
117
+ /**
118
+ * Create a spinner wrapper for an operation name.
119
+ */
120
+ export function createOperationSpinner(operation) {
121
+ return startSpinner(operation);
122
+ }
123
+ /**
124
+ * Run an async operation with a spinner.
125
+ * Shows success on completion, failure on error.
126
+ */
127
+ export async function withSpinner(text, operation, successText, failText) {
128
+ const spinner = startSpinner(text);
129
+ try {
130
+ const result = await operation();
131
+ spinner.succeed(successText ?? text);
132
+ currentSpinner = null;
133
+ return result;
134
+ }
135
+ catch (error) {
136
+ spinner.fail(failText ?? text);
137
+ currentSpinner = null;
138
+ throw error;
139
+ }
140
+ }
141
+ /**
142
+ * Build spinner text with operation and details.
143
+ * Example: "Exporting database tables (15 tables)"
144
+ */
145
+ export function buildSpinnerText(operation, details) {
146
+ if (details) {
147
+ return `${operation} (${details})`;
148
+ }
149
+ return operation;
150
+ }
151
+ /**
152
+ * Build spinner text with progress.
153
+ * Example: "Exporting database tables [3/15]"
154
+ */
155
+ export function buildProgressText(operation, current, total) {
156
+ return `${operation} [${current}/${total}]`;
157
+ }
158
+ /**
159
+ * Build spinner text with percentage.
160
+ * Example: "Uploading to S3 (75%)"
161
+ */
162
+ export function buildPercentageText(operation, percent) {
163
+ return `${operation} (${Math.round(percent)}%)`;
164
+ }
165
+ /**
166
+ * Step indicator symbols for migration workflow.
167
+ */
168
+ export const STEP_SYMBOLS = {
169
+ PENDING: '○',
170
+ IN_PROGRESS: '◐',
171
+ COMPLETED: '✓',
172
+ FAILED: '✗',
173
+ SKIPPED: '◌',
174
+ };
175
+ /**
176
+ * Get the symbol for a step status.
177
+ */
178
+ export function getStepSymbol(status) {
179
+ return STEP_SYMBOLS[status];
180
+ }
181
+ /**
182
+ * Create a new workflow step.
183
+ */
184
+ export function createStep(name) {
185
+ return {
186
+ name,
187
+ status: 'PENDING',
188
+ };
189
+ }
190
+ /**
191
+ * Update step status.
192
+ */
193
+ export function updateStepStatus(step, status, options) {
194
+ return {
195
+ ...step,
196
+ status,
197
+ duration: options?.duration,
198
+ error: options?.error,
199
+ };
200
+ }
201
+ /**
202
+ * Format a single step for display.
203
+ * Example: "✓ Exporting database tables (1.5s)"
204
+ */
205
+ export function formatStep(step) {
206
+ const symbol = getStepSymbol(step.status);
207
+ let text = `${symbol} ${step.name}`;
208
+ if (step.duration !== undefined) {
209
+ text += ` (${(step.duration / 1000).toFixed(1)}s)`;
210
+ }
211
+ if (step.error) {
212
+ text += ` - ${step.error}`;
213
+ }
214
+ return text;
215
+ }
216
+ /**
217
+ * Format multiple steps for display.
218
+ */
219
+ export function formatSteps(steps) {
220
+ return steps.map(formatStep).join('\n');
221
+ }
222
+ /**
223
+ * Standard migration workflow steps.
224
+ */
225
+ export const MIGRATION_STEPS = [
226
+ 'Connecting to source database',
227
+ 'Listing site tables',
228
+ 'Exporting database tables',
229
+ 'Importing into migration database',
230
+ 'Running URL replacements',
231
+ 'Creating target backup',
232
+ 'Importing to target database',
233
+ 'Compressing SQL files',
234
+ 'Uploading to S3 archive',
235
+ 'Cleaning up temporary files',
236
+ ];
237
+ /**
238
+ * Create workflow steps from standard migration steps.
239
+ */
240
+ export function createMigrationSteps() {
241
+ return MIGRATION_STEPS.map(name => createStep(name));
242
+ }
243
+ /**
244
+ * Find the current step (first pending or in-progress step).
245
+ */
246
+ export function findCurrentStep(steps) {
247
+ return steps.find(s => s.status === 'PENDING' || s.status === 'IN_PROGRESS');
248
+ }
249
+ /**
250
+ * Count completed steps.
251
+ */
252
+ export function countCompletedSteps(steps) {
253
+ return steps.filter(s => s.status === 'COMPLETED').length;
254
+ }
255
+ /**
256
+ * Count failed steps.
257
+ */
258
+ export function countFailedSteps(steps) {
259
+ return steps.filter(s => s.status === 'FAILED').length;
260
+ }
261
+ /**
262
+ * Check if all steps are completed (no failures).
263
+ */
264
+ export function areAllStepsCompleted(steps) {
265
+ return steps.every(s => s.status === 'COMPLETED' || s.status === 'SKIPPED');
266
+ }
267
+ /**
268
+ * Check if any step has failed.
269
+ */
270
+ export function hasStepFailed(steps) {
271
+ return steps.some(s => s.status === 'FAILED');
272
+ }
273
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/lib/spinner.ts"],"names":[],"mappings":"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"}